零基础看懂 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 值(平稳性、参数显著性)和残差检验,这些是 “硬指标”。
- 多练才会熟:第一次看可能觉得绕,但跟着代码跑一遍(比如用自己的数据改改),很快就能上手。