数据挖掘-08-基于Python实现时间序列分析建模(ARIMA 模型)(包括数据和代码)

文章目录

    • 0. 数据代码下载
    • 1. 背景描述
    • 2. 预测目的
    • 3. 数据总览
    • 4. 数据预处理
      • 4.1数据描述性统计与清洗
        • a. 导入程序库
        • b. 读取数据
        • c. 查看统计信息和空值
        • d. 查看是否有重复数据以及清理重复数据
        • e. 空值清理
        • f. 针对清洗后的数据进行统计分析
    • 5. 探索性数据分析
      • 5.1 数据分析
    • 6. 构建 ARIMA 时序模型
      • 6.1 ARIMA 模型概念
      • 6.2 序列平稳性检验
      • 6.3 对原始序列进行一阶差分,并进行平稳性和白噪声检验
        • a. 对一阶差分后的序列再次做平稳性判断。
        • b. 对一阶差分后的序列做白噪声检验
      • 6.4 对一阶差分后的序列拟合 ARMA 模型
        • 第一种方法:人为识别
        • 第二种方法:相对最优模型识别。
      • 6.5 ARIMA 模型预测
    • 7. 实际应用
    • 0. 数据代码下载

0. 数据代码下载

关注公众号:『AI学习星球
回复:实现时间序列分析建模 即可获取数据下载。
算法学习4对1辅导论文辅导核心期刊可以通过公众号CSDN滴滴我
在这里插入图片描述


1. 背景描述

当今世界正处于一个数据信息时代,随着后续互联网的发展各行各业都会产 生越来越多的数据,包括不限于商店、超市、便利店、餐厅等等。那么这里面很 多数据都是随着时间产生的,这就形成了时间序列数据,而且很多时间序列数据都是非平稳时间序列数据。目前对非平稳时间序列分析应用最多的模型就是ARIMA 模型.

2. 预测目的

本项目也是通过 Python 程序来进行数据探索性分析、数据预处理、

构建 ARIMA 时序模型以及如何把模型预测的结果应用于日常的实际生活当中。

3. 数据总览

本次建模数据来源于某公司餐厅销售数据,其主要的数据基本统计概况如下:

数据项:2 项(日期、销量),如下图所示
在这里插入图片描述
通过观察数据,发现一些空值和一些重复数据,后续章节进行处理。

4. 数据预处理

真实数据中可能包含了大量的缺失值和噪音数据或人工录入错误导致有异常点存在,非常不利于算法模型的训练。数据清洗的结果是对各种脏数据进行对应方式的处理,得到标准的,干净的、连续的数据,提供给数据统计、数据挖掘等使用。数据预处理通常包含数据
清洗、归约、聚合、转换、抽样等方式,数据预处理质量决定了后续数据分析挖掘及建模
工作的精度和泛化价值。

4.1数据描述性统计与清洗

a. 导入程序库

将所用到的程序库导入到 Python 程序中,如图所示。

import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.tsa.stattools import adfuller as ADF
from statsmodels.graphics.tsaplots import plot_pacf
from statsmodels.stats.diagnostic import acorr_ljungbox
from statsmodels.tsa.arima_model import ARIMA
b. 读取数据

使用 Pandas 库中 read_excel 方法读取 Excel 数据,并转为DataFrame 类型。

读取数据代码如图所示:

# 读取数据,指定日期列为指标,pandas自动将“日期”列识别为Datetime格式
data = pd.read_excel(discfile)
c. 查看统计信息和空值
print(data.describe())
print(data.info())

在这里插入图片描述

从上图可以看到,数据总数据量 40 条(不包括空值),以及未去除重复值的平均

值、标准差、最小值、最大值、分位数。另外可以看到销量有 2 条空值。

d. 查看是否有重复数据以及清理重复数据
print(data.duplicated(subset=['日期', '销量']))
data = data.drop_duplicates(subset=['日期', '销量'], keep='first')

在这里插入图片描述
从上图中的部分展示,可以看到是有重复数据,所以使用 drop_duplicates()函
数进行了重复数据清理。

e. 空值清理

本项目涉及 2 条空值数据 直接进行丢弃操作。
空值的处理也可以用均值填充、分位数填充、拉格朗日插值填充等等(根据具体数据处理的需要进行即可)。

data = data.dropna()
f. 针对清洗后的数据进行统计分析
print(data.describe())
print(data.info())

在这里插入图片描述
从上图可以看出,清洗后数据量为 37 条,平均值为 3542.49、标准差为 543.92。

5. 探索性数据分析

5.1 数据分析

销量时间序列分析:
在这里插入图片描述
关键代码如下:

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
data.plot(color='green', marker='o', linestyle='dashed', linewidth=1, markersize=6)
plt.ylabel('销量')
plt.title("销量量时间序列分析图")

6. 构建 ARIMA 时序模型

6.1 ARIMA 模型概念

在自然界中绝大部分序列都是非平稳的。因而非平稳时间序列的分析更普遍、更重要,创造出来的分析方法也更多。

非平稳时间序列的分析方法可以分为确定性因素分解的时序分析和随机时序分析两大类。

  • 确定性因素分解的方法把所有序列的变化都归结为 4 个因素(长期趋势、季节变动、循环变动和随机波动)的综合影响,其中长期趋势和季节变动的规律性信息通常比较容易提取,而由随机因素导致的波动则非常难以确定和分析,对随机信息浪费严重会导致模型拟合精度不够理想。

  • 随机时序分析法的发展就是为了弥补确定性因素分解方法的不足。根据时间

序列的不同特点,随机时序分析可以建立的模型有 ARIMA 模型、残差自回归模型、季节模型、异方差模型等。

本项目重点介绍 ARIMA 模型对非平稳时间序列进行建模。

差分运算:

  1. p 阶差分
    相距一期的两个序列值之间的减法运算称为 1 阶差分运算。

  2. k 步差分
    相距 k 期的两个序列值之间的减法运算称为 k 步差分运算。差分运算具有强大的确定性信息提取能力,许多非平稳序列差分后会显示出平稳序列的性质,这时称这个非平稳序列为差分平稳序列。差分平稳序列可以使用 ARMA 模型进行拟合。ARIMA 模型的实质就是差分运算与 ARMA 模型的组合。

6.2 序列平稳性检验

在这里插入图片描述

此图显示该序列具有明显的单调递增趋势,可以判断为非平稳序列。

在这里插入图片描述

此图的自相关图显示自相关系数长期大于零,说明序列间具有很强的长期相关性。

在这里插入图片描述

此表单位根检验统计量对应的 p 值显著大于 0.05,最终将该序列判断为非平稳序列(非平稳序列一定不是白噪声序列)。

6.3 对原始序列进行一阶差分,并进行平稳性和白噪声检验

a. 对一阶差分后的序列再次做平稳性判断。

图 5.3-1 一阶差分之后序列的时序图

在这里插入图片描述
在这里插入图片描述
结果显示,一阶差分之后序列的时序图在均值附近比较平稳地波动、自相关图有很强的短期相关性、单位根检验 p 值小于 0.05,所以一阶差分之后的序列是平稳序列。

b. 对一阶差分后的序列做白噪声检验

在这里插入图片描述
此表输出的 p 值远小于 0.05,所以一阶差分之后的序列是平稳非白噪声序列.

6.4 对一阶差分后的序列拟合 ARMA 模型

下面进行模型定阶。模型定阶就是确定 p 和 q。

第一种方法:人为识别

根据图 5-25 进行模型定阶。
在这里插入图片描述
一阶差分后自相关图显示出 1 阶截尾,偏自相关图显示出拖尾性,所以可以考虑用 MA(1)模型拟合 1 阶差分后的序列,即对原始序列建立 ARIMA(0,1,1)模型。

第二种方法:相对最优模型识别。

计算 ARMA(p,q) 当 p 和 q 均小于等于 3 的所有组合的 BIC 信息量,取其中BIC 信息量达到最小的模型阶数。

计算完成 BIC 矩阵如下:
在这里插入图片描述
当 p 值为 0、q 值为 1 时,最小 BIC 值为 422.510082。p、q 定阶完成。

用 AR(1)模型拟合一阶差分后的序列,即对原始序列建立 ARIMA(0,1,1)模型。虽然两种方法建立的模型是一样的,但模型是非唯一的。ARIMA(1,1,0)和ARIMA(1,1,1)这两个模型也能通过检验。下面对一阶差分后的序列拟合 AR(1)

模型进行分析:
1)参数检验和参数估计见下表:
在这里插入图片描述
2)模型检验之残差检验:
在这里插入图片描述
在这里插入图片描述
图 5.4-4 残差偏自相关图
D-W 检验:

  • DW 值显著的接近于 0 或4时,则存在自相关性,而接近于2时,则不存在(一阶)自相关性。
  • D-W 检验的结果为:1.9735。因此,模型预测的残差不存在自相关性性,这说明拟合的模型预测效果很好。
  • 残差序列的白噪声检验结 果为: (array([0.00390439]), array([0.95017654])),可以看出 p 值为 0.9502, P>0.05.说明原假设成立。

6.5 ARIMA 模型预测

应用 ARIMA(0,1,1)对表某餐厅的销售数据做为期 5 天的预测,结果如下表所示:
在这里插入图片描述
需要说明的是,利用模型向前预测的时期越长,预测误差将会越大,这是时间预测的典型特点。
代码如下

# 参数初始化
discfile = 'data.xlsx'
forecastnum = 5

# 读取数据,指定日期列为指标,pandas自动将“日期”列识别为Datetime格式
data = pd.read_excel(discfile)
print(data.describe())
print(data.info())

print(data.duplicated(subset=['日期', '销量']))
data = data.drop_duplicates(subset=['日期', '销量'], keep='first')
data = data.dropna()
print(data.describe())
print(data.info())
data = data.set_index('日期')
print(data.head())

# 时序图

plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
data.plot(color='green', marker='o', linestyle='dashed', linewidth=1, markersize=6)
plt.ylabel('销量')
plt.title("销量量时间序列分析图")
plt.show()

# 自相关图

plot_acf(data)
plt.title("原始序列的自相关图")
plt.show()

# 平稳性检测

print(u'原始序列的ADF检验结果为:', ADF(data[u'销量']))
# 返回值依次为adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore

# 差分后的结果
D_data = data.diff().dropna()
D_data.columns = [u'销量差分']
D_data.plot(color='green', marker='o', linestyle='dashed', linewidth=1, markersize=6)  # 时序图
plt.title("一阶差分之后序列的时序图")
plt.ylabel('销量')
plt.show()
plot_acf(D_data)  # 自相关图
plt.title("一阶差分之后序列的自相关图")
plt.show()

print(u'差分序列的ADF检验结果为:', ADF(D_data[u'销量差分']))  # 平稳性检测

# 白噪声检验

print(u'差分序列的白噪声检验结果为:', acorr_ljungbox(D_data, lags=1))  # 返回统计量和p值

plot_pacf(D_data)  # 偏自相关图
plt.title("一阶差分后序列的偏自相关图")
plt.show()

# 定阶
data[u'销量'] = data[u'销量'].astype(float)
pmax = int(len(D_data) / 10)  # 一般阶数不超过length/10
qmax = int(len(D_data) / 10)  # 一般阶数不超过length/10
bic_matrix = []  # BIC矩阵
for p in range(pmax + 1):
    tmp = []
    for q in range(qmax + 1):
        try:  # 存在部分报错,所以用try来跳过报错。
            tmp.append(ARIMA(data, (p, 1, q)).fit().bic)
        except:
            tmp.append(None)
    bic_matrix.append(tmp)

bic_matrix = pd.DataFrame(bic_matrix)  # 从中可以找出最小值
print('BIC矩阵:')
print(bic_matrix)

tmp_data = bic_matrix.values
tmp_data = tmp_data.flatten()
s = pd.DataFrame(tmp_data, columns=['value'])
s = s.dropna()
print('BIC最小值:', s.min())
s.to_excel('tmp.xlsx')

p, q = bic_matrix.stack().idxmin()  # 先用stack展平,然后用idxmin找出最小值位置。
print(u'BIC最小的p值和q值为:%s、%s' % (p, q))

model = ARIMA(data, (p, 1, q)).fit()  # 建立ARIMA(0, 1, 1)模型
print('模型报告为:\n', model.summary2())
print('模型报告为:\n', model.summary())
resid = model.resid
# 自相关图
plot_acf(resid)
plt.title("残差自相关图")
plt.show()
# 偏自相关图
plot_pacf(resid)
plt.title("残差偏自相关图")
plt.show()
# 线性即正态分布
qqplot(resid, line='q', fit=True)
plt.title("残差Q-Q图")
plt.show()
# 解读:残差服从正态分布,均值为零,方差为常数
print('D-W检验的结果为:', sm.stats.durbin_watson(resid.values))
print('残差序列的白噪声检验结果为:', acorr_ljungbox(resid, lags=1))  # 返回统计量、P值

print('预测未来5天,其预测结果、标准误差、置信区间如下:\n', model.forecast(5))

7. 实际应用

通过上面的预测结果分析得到,此模型能够在误差允许的范围内进行预测未来的销量,可以将此模型应用于实际生产中,帮助企业更好地备货。


0. 数据代码下载

关注公众号:『AI学习星球
回复:实现时间序列分析建模 即可获取数据下载。
算法学习4对1辅导论文辅导核心期刊可以通过公众号CSDN滴滴我
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/247502.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【2023年公司智能工具降本增效分享总结】「智能工具的力量」总结分享我司通过AI提升软件开发效率与质量调研报告,问题踩坑之路

调研背景 人工智能(AI)已经成为当今科技发展的主要驱动力之一,AI在多个领域取得了显著的成果,包括软件开发。AI技术的应用可以帮助开发者提高代码质量、减少错误、优化资源和时间管理,从而提高软件开发效率。 调研目…

Knowledge Graph知识图谱—9. Knowledge Modeling

9. Knowledge Modeling & Ontology Engineering How should the knowledge in a KG be modeled? – Which classes of entities do we have? – Which relations connect them? – Which constraints hold for them? → these questions are defined in the ontology …

javacv的视频截图功能

之前做了一个资源库的小项目,因为上传资源文件包含视频等附件,所以就需要时用到这个功能。通过对视频截图,然后作为封面缩略图,达到美观效果。 首先呢,需要准备相关的jar包,之前我用的是低版本的1.4.2&…

速学数据结构 | 树 森林 二叉树 的概念详讲篇

🎬 鸽芷咕:个人主页 🔥 个人专栏:《速学数据结构》 《C语言进阶篇》 ⛺️生活的理想,就是为了理想的生活! 📋 前言 🌈hello! 各位宝子们大家好啊,关于线性表我们已经在前面更新完了…

【C++入门到精通】 线程库 | thread类 C++11 [ C++入门 ]

阅读导航 引言一、thread类的简单介绍二、线程函数详细介绍1. start() 函数(1)头文件(2)函数原型 2. join() 函数(1)头文件(2)函数原型 3. detach() 函数(1)头…

扫描电镜中的信号-噪声比(SNR)参数如何优化

在扫描电镜(SEM)中,信号-噪声比(SNR)的优化对于获得高质量的图像和可靠的数据分析至关重要。以下是一些优化SNR的方法: 选择适当的检测器:SEM通常配备了不同类型的检测器,如二次电子…

紫光展锐T820与飞桨完成I级兼容性测试 助推端侧AI融合创新

近日,紫光展锐高性能5G SoC T820与百度飞桨完成I级兼容性测试(基于Paddle Lite工具)。测试结果显示,双方兼容性表现良好,整体运行稳定。这是紫光展锐加入百度“硬件生态共创计划”后的阶段性成果。 本次I级兼容性测试完…

多域名https证书购买选择

多域名https证书是一种特殊的SSL证书,它允许一个证书同时保护多个域名,并且不限制域名的类型,可以保护多个域名和子域名,确保网站传输信息时不被窃取、篡改。那么我们该怎么选择符合需求的多域名https证书呢?今天就随S…

基于VGG-16+Android+Python的智能车辆驾驶行为分析—深度学习算法应用(含全部工程源码)+数据集+模型(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Pycharm 环境Android环境 相关其它博客工程源代码下载其它资料下载 前言 本项目采用VGG-16网络模型,使用Kaggle开源数据集,旨在提取图片中的用户特征,最终在移…

vue3 使用antd 报错Uncaught TypeError--【已解决】

问题现象 使用最基本的 ant-design-vue 按钮demo 都报错 报错文字如下 Uncaught TypeError: Cannot read properties of undefined (reading value)at ReactiveEffect.fn (ant-design-vue.js?v597f5366:6693:87)at ReactiveEffect.run (chunk-K2VKR2AM.js?v25c381c3:461:…

计算三叉搜索树的高度 - 华为OD统一考试

OD统一考试 分值: 100分 题解: Java / Python / C++ 定义构造三又搜索树规则如下: 每个节点都存有一个数,当插入一个新的数时,从根节点向下寻找,直到找到一个合适的空节点插入查找的规则是: 1.如果数小于节点的数减去500,则将数插入节点的左子树 2.如果数大于节点的数加…

网络(九)CanSM及达芬奇配置

【小猫爪】AUTOSAR学习笔记05-Communication Stack之CanSM模块-CSDN博客 上链接讲的非常好。 CanSM提供的函数。 C CanSM使用的函数:

当你打开终端并输入命令时会发生什么?(下)

哈喽大家好,我是咸鱼 我们先来大致回顾一下文章《当你打开终端并输入命令时会发生什么?(上)》的内容 终端设备是由电传打字机演变过来的,电传打字机通过物理线与大型计算机连接在一块来实现输入输出 如上图,分别是二…

【高效开发工具系列】DataGrip入门

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【回眸】Tessy 单元测试软件使用指南(三)怎么打桩和指针测试

目录 前言 Tessy 如何进行打桩操作 普通桩 高级桩 手写桩 Tessy单元测试之指针相关测试注意事项 有类型的指针(非函数指针): 有类型的函数指针: void 类型的指针: 结语 前言 进行单元测试之后,但凡…

【Proteus仿真】【51单片机】电子门铃设计

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器,使共阴数码管,按键、无源蜂鸣器等。 主要功能: 系统运行后,数码管默认显示第一种门铃音调,可通过K1键切…

对不起,必须放弃SQL!

尽管SQL很受欢迎,也很成功,但它又总是充斥着种种矛盾。 SQL可能笨拙又冗长,但开发人员又经常发现它往往是他们提取所需数据的最简单直接的方法。当查询写入正确时,它可以快如闪电,当查询出错时,它就会慢如…

LeetCode(62)删除排序链表中的重复元素 II【链表】【中等】

目录 1.题目2.答案3.提交结果截图 链接: 删除排序链表中的重复元素 II 1.题目 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 示例 1: 输入:head [1…

像素、分辨率、频率、精度、延迟,关于光学动作捕捉镜头参数的那些事

精准度、分辨率、频率、延迟等参数是影响光学动作捕捉效果和还原度的关键因素。下面逐一介绍NOKOV度量动作捕捉系统的基础参数。 NOKOV度量动作捕捉系统的核心产品是光学动作捕捉镜头,用于捕捉被测物表面反光标记点的三维坐标数据。 从表中可以看到,不同…

Python自动化测试(unittest框架)

一、什么是框架 框架是由大佬开发或者专业的研发团队研发的技术骨架,框架是一个半成品,框架是对常用的功能,基础的代码进行封装的一个工具,这个工具对外提供了一些API,其他的开发者只需要调用框架的接口即可&#xff…
最新文章