当前位置: 首页 > web >正文

【数学建模学习笔记】时间序列分析:ARIMA

零基础看懂 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 行数据是这样的:

年份年度销量
1985100.0
1986101.6
1987103.3
1988111.5
1989116.5

接着做了两个小操作:

  1. 中文列名转英文:因为 Python 对中文支持没那么好,把 “年份” 改成 “Year”,“年度销量” 改成 “Annual_Sales”,方便后续操作。
  2. 把 “年份” 设为时间索引:告诉 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())  # 查看模型详细结果

运行后会输出一大段结果,重点看两个部分:

  1. 参数显著性(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 部分效果不明显,但整体模型还是可用的。
  2. 残差检验(Ljung-Box Q 检验):残差就是 “预测值和实际值的差”。如果残差是 “白噪声”(没有规律的随机波动),说明模型已经把数据里的规律都捕捉到了,模型是好的。文中 Q 检验的 p 值 = 0.69(>0.05),说明残差是白噪声,模型合格

第五步:预测未来(用合格的模型猜未来)

模型合格后,就可以预测未来的销量了。文中预测了未来 5 年(2022-2026)的销量:

# 预测未来5步(5年)的销量
forecast = model_fit.forecast(steps=5)
print('预测值:', forecast)

运行结果是:

时间预测销量
2022-01-01282.80
2023-01-01284.74
2024-01-01285.85
2025-01-01286.49
2026-01-01286.85

然后用画图把 “历史数据” 和 “预测数据” 放一起:

  • 蓝色线:1985-2021 年的实际销量(一直在涨,但涨得越来越慢)。
  • 红色线:2022-2026 年的预测销量(继续涨,但涨幅更小,符合历史规律)。

从图上看,预测趋势和历史趋势一致,说明预测结果靠谱。

四、总结:ARIMA 预测的完整流程(小白也能记)

用 ARIMA 做时间序列预测,其实就 4 步,不管是销量、气温还是工资数据,都可以按这个流程来:

  1. 准备数据:把数据整理成 “时间 + 指标” 的格式,告诉 Python 这是时间序列数据。
  2. 平稳性检验:用 ADF 检验看数据平不平稳,不平稳就用差分处理(确定 d 值)。
  3. 选模型阶数:用 ACF/PACF 图确定 p 和 q 值,得到 ARIMA (p,d,q) 的具体参数。
  4. 建模型 + 预测:用数据训练模型,检验模型是否合格(残差是不是白噪声),合格了就预测未来。

最后:给小白的小提醒

  1. 不用死记公式:文中开头的复杂公式是 ARIMA 的数学原理,小白先会用工具(Python 代码)、能看懂结果就行,原理可以慢慢补。
  2. 关键看结果:判断模型好不好,重点看 p 值(平稳性、参数显著性)和残差检验,这些是 “硬指标”。
  3. 多练才会熟:第一次看可能觉得绕,但跟着代码跑一遍(比如用自己的数据改改),很快就能上手。
http://www.xdnf.cn/news/19871.html

相关文章:

  • Scikit-learn从入门到实践:Scikit-learn入门-安装与基础操作
  • Qwen3-Reranker-0.6B 模型结构
  • Shell脚本一键监控平台到期时间并钉钉告警推送指定人
  • 自动化基本技术原理
  • 嵌入式解谜日志-网络编程
  • Kafka面试精讲 Day 5:Broker集群管理与协调机制
  • 基于SQLite的智能图片压缩存储系统:代码解析与实战应用
  • QuickUp-Ubuntu
  • FPGA AD7606串行驱动与并行驱动
  • 【Flask + Vue3 前后端分离管理系统】
  • 友思特案例 | 食品行业视觉检测案例集锦(三)
  • 利用 Python 获取微店商品关键词搜索 API 接口数据的实战指南
  • 利用飞算Java打造电商系统核心功能模块的设计与实现
  • 硬件开发(1)—单片机(1)
  • atomic常用类方法
  • VR智慧楼宇技术:打造智能办公空间的卓越方案​
  • 深圳外贸峰会究竟藏着啥秘密?能让外贸人收获满满?
  • RHEL9源码编译MySQL8.0.40
  • 图像加密安全传输--设备端视频流加密,手机端视频流解密,使用ChaCha20-Poly1305 进行系统分析
  • 爬虫-----最全的爬虫库介绍(一篇文章让你成为爬虫大佬,爬你想爬)
  • windows系统离线安装Ollama、创建模型(不使用docker)、coze调用
  • Linux为什么不是RTOS
  • 【Vue】前端 vue2项目搭建入门级(一)
  • IoT Power软件 -- 每次开启强制升级解决方法
  • Pandas Python数据处理库:高效处理Excel/CSV数据,支持分组统计与Matplotlib可视化联动
  • 嵌入式C语言之链表冒泡排序
  • 【PlayWright】 自动化测试框架机制详解
  • Python应用——ffmpeg处理音视频的常见场景
  • GitLab,2025最新如何配置中的SSH key步骤
  • 【高等数学】第十一章 曲线积分与曲面积分——第一节 对弧长的曲线积分