零基礎看懂 ARIMA 模型:從原理到實戰
如果你完全沒接觸過 “時間序列預測”,也不懂復雜公式,這篇會用 “說人話” 的方式幫你搞懂 ARIMA 模型,以及文中代碼到底在做什么。
一、先搞懂:ARIMA 是用來干嘛的?
簡單說,ARIMA 是一種 “用過去猜未來” 的工具—— 比如用 1985-2021 年的年度銷量數據,預測 2022-2026 年的銷量,這就是它的核心用途。
生活中很多數據都是 “按時間排的”(比如每月工資、每天氣溫、每年銷量),這些 “按時間順序排列的數據” 就叫時間序列數據。ARIMA 的作用,就是從這些歷史數據里找到規律(比如銷量每年都漲一點),再用這個規律推未來。
二、ARIMA 模型的 3 個核心字母是什么意思?
模型名字里的 AR、I、MA,對應 3 個關鍵步驟,缺一不可:
- AR(自回歸):“自己和自己相關”。比如今年的銷量,和去年、前年的銷量有關系(去年賣得多,今年大概率也多),AR 就是用過去的銷量數據來預測現在。
- I(差分):“讓數據變平穩”。什么是 “平穩”?簡單說就是數據沒有 “一直漲” 或 “一直跌” 的大趨勢(比如房價年年漲,就是不平穩;每天的氣溫忽高忽低但整體沒大趨勢,就是平穩)。ARIMA 要求數據必須 “平穩” 才能找規律,所以如果數據不平穩(比如文中的銷量一直漲),就用 “差分” 處理(比如用今年銷量減去年銷量,得到 “每年銷量增長額”,這個增長額可能就平穩了)。
- MA(移動平均):“修正誤差”。用 AR 預測時難免有誤差(比如實際銷量比預測多了 50),MA 就是用過去的誤差來修正現在的預測,讓結果更準。
所以 ARIMA 的本質是:先把數據變平穩(I),再用過去數據(AR)+ 過去誤差(MA)一起預測未來。
三、代碼怎么寫?(分步驟拆解)
文中的代碼是用 Python 實現 ARIMA 預測的完整流程,我們一步一步看,每個步驟都對應 “怎么用 ARIMA 解決問題”:
第一步:準備工作(導入工具 + 數據)
就像做飯前要先準備鍋碗瓢盆和食材,這里先 “導入工具”(處理數據、畫圖、建模型的庫)和 “導入數據”(1985-2021 年的銷量數據)。
# 導入工具庫(不用記,用的時候復制就行)
import numpy as np # 處理數字
import pandas as pd # 處理表格數據
import matplotlib.pyplot as plt # 畫圖
from statsmodels.tsa.arima.model import ARIMA # ARIMA模型
from statsmodels.tsa.stattools import adfuller, pacf, acf # 平穩性檢驗、相關性分析工具# 導入數據(從網上獲取銷量表格)
df = pd.read_excel('網上的銷量數據文件地址')
df.head() # 查看前5行數據
運行后看到的前 5 行數據是這樣的:
年份 | 年度銷量 |
---|---|
1985 | 100.0 |
1986 | 101.6 |
1987 | 103.3 |
1988 | 111.5 |
1989 | 116.5 |
接著做了兩個小操作:
- 中文列名轉英文:因為 Python 對中文支持沒那么好,把 “年份” 改成 “Year”,“年度銷量” 改成 “Annual_Sales”,方便后續操作。
- 把 “年份” 設為時間索引:告訴 Python “這是按時間排的數據”,比如 1985 年對應 100.0 的銷量,讓數據有 “時間屬性”。
第二步:平穩性檢驗(判斷數據能不能直接用)
前面說過,ARIMA 要求數據必須 “平穩” 才能找規律。那怎么判斷數據平不平穩?文中用了ADF 檢驗(一種常用的平穩性檢測方法),核心看兩個結果:
- ADF Statistic(ADF 統計量):數值越小越好。
- p-value(p 值):這是關鍵!如果 p 值<0.05,說明數據 “平穩”;如果 p 值≥0.05,說明數據 “不平穩”,需要處理。
文中運行結果是:
ADF Statistic: 1.8137710150945194
p-value: 0.9983759421514264
p 值接近 1(遠大于 0.05),所以原始銷量數據不平穩。這時候就需要用 “差分” 處理(文中建模型時用了 1 階差分,對應 ARIMA 參數里的 “1”,后面會說)。
第三步:確定模型階數(選 “最合適的 ARIMA 版本”)
ARIMA 有 3 個關鍵參數:(p, d, q),要先確定這 3 個數字,才能建模型:
- p:AR 的階數(用過去幾期數據來預測)。
- d:差分的階數(需要做幾次差分讓數據平穩,文中用了 1 次,所以 d=1)。
- q:MA 的階數(用過去幾期誤差來修正)。
用ACF 圖和 PACF 圖來確定 p 和 q(這兩個圖是判斷階數的常用工具):
- ACF 圖(自相關圖):看數據和過去幾期的 “直接相關性”。文中 ACF 圖隨著滯后步數增加慢慢下降,說明數據有持續的相關性。
- PACF 圖(偏自相關圖):看數據和過去幾期的 “間接相關性”(去除中間期的影響后)。文中 PACF 圖在 “滯后 1 步” 后突然降到接近 0,說明用 “過去 1 期數據” 就夠了(p=1)。
結合之前的 “d=1”,再通過其他準則(比如 AIC,越小模型越好),最終確定模型參數是(p=1,d=1,q=1)。
第四步:建模型 + 檢驗(看模型好不好用)
確定參數后,就可以建 ARIMA 模型了,代碼很簡單:
# 建ARIMA(1,1,1)模型,用銷量數據訓練
model = ARIMA(df['Annual_Sales'], order=(1, 1, 1))
model_fit = model.fit() # 訓練模型
print(model_fit.summary()) # 查看模型詳細結果
運行后會輸出一大段結果,重點看兩個部分:
- 參數顯著性(P>|z|):看 ar.L1(AR 的參數)和 ma.L1(MA 的參數)的 p 值:
- ar.L1 的 p 值 = 0.002(<0.05),說明 AR 部分有效。
- ma.L1 的 p 值 = 0.669(>0.05),說明 MA 部分效果不明顯,但整體模型還是可用的。
- 殘差檢驗(Ljung-Box Q 檢驗):殘差就是 “預測值和實際值的差”。如果殘差是 “白噪聲”(沒有規律的隨機波動),說明模型已經把數據里的規律都捕捉到了,模型是好的。文中 Q 檢驗的 p 值 = 0.69(>0.05),說明殘差是白噪聲,模型合格。
第五步:預測未來(用合格的模型猜未來)
模型合格后,就可以預測未來的銷量了。文中預測了未來 5 年(2022-2026)的銷量:
# 預測未來5步(5年)的銷量
forecast = model_fit.forecast(steps=5)
print('預測值:', forecast)
運行結果是:
時間 | 預測銷量 |
---|---|
2022-01-01 | 282.80 |
2023-01-01 | 284.74 |
2024-01-01 | 285.85 |
2025-01-01 | 286.49 |
2026-01-01 | 286.85 |
然后用畫圖把 “歷史數據” 和 “預測數據” 放一起:
- 藍色線:1985-2021 年的實際銷量(一直在漲,但漲得越來越慢)。
- 紅色線:2022-2026 年的預測銷量(繼續漲,但漲幅更小,符合歷史規律)。
從圖上看,預測趨勢和歷史趨勢一致,說明預測結果靠譜。
四、總結:ARIMA 預測的完整流程(小白也能記)
用 ARIMA 做時間序列預測,其實就 4 步,不管是銷量、氣溫還是工資數據,都可以按這個流程來:
- 準備數據:把數據整理成 “時間 + 指標” 的格式,告訴 Python 這是時間序列數據。
- 平穩性檢驗:用 ADF 檢驗看數據平不平穩,不平穩就用差分處理(確定 d 值)。
- 選模型階數:用 ACF/PACF 圖確定 p 和 q 值,得到 ARIMA (p,d,q) 的具體參數。
- 建模型 + 預測:用數據訓練模型,檢驗模型是否合格(殘差是不是白噪聲),合格了就預測未來。
最后:給小白的小提醒
- 不用死記公式:文中開頭的復雜公式是 ARIMA 的數學原理,小白先會用工具(Python 代碼)、能看懂結果就行,原理可以慢慢補。
- 關鍵看結果:判斷模型好不好,重點看 p 值(平穩性、參數顯著性)和殘差檢驗,這些是 “硬指標”。
- 多練才會熟:第一次看可能覺得繞,但跟著代碼跑一遍(比如用自己的數據改改),很快就能上手。