【项目实战】基于Python实现时间序列分析建模(ARIMA模型)项目实战

2023-11-02

说明:这是一个机器学习实战项目(附带数据+代码+文档+代码讲解),如需数据+代码+文档+代码讲解可以直接到文章最后获取。

1.项目背景

      当今世界正处于一个数据信息时代,随着后续互联网的发展各行各业都会产生越来越多的数据,包括不限于商店、超市、便利店、餐厅等等。那么这里面很多数据都是随着时间产生的,这就形成了时间序列数据,而且很多时间序列数据都是非平稳时间序列数据。目前对非平稳时间序列分析应用最多的模型就是ARIMA模型,本项目也是通过Python程序来进行数据探索性分析、数据预处理、构建ARIMA时序模型以及如何把模型预测的结果应用于日常的实际生活当中。

2.数据获取

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

数据项:2项(日期、销量),如下图所示

 通过观察数据,发现一些空值和一些重复数据,后续章节进行处理。

3.数据预处理

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

3.1数据描述性统计与清洗

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

(2)读取数据:使用Pandas库中read_excel方法读取Excel数据,并转为DataFrame类型。读取数据代码如图所示:

3)查看统计信息和空值,代码如下:

 

       从上图可以看到,数据总数据量40条(不包括空值),以及未去除重复值的平均值、标准差、最小值、最大值、分位数。另外可以看到销量有2条空值。

(4)查看是否有重复数据以及清理重复数据,代码如下:

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

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

(6)针对清洗后的数据进行统计分析,代码如下:

 从上图可以看出,清洗后数据量为37条,平均值为3542.49、标准差为543.92。

4.探索性数据分析

4.1数据分析

销量时间序列分析:

 

关键代码如下:

5.构建ARIMA时序模型

5.1 ARIMA模型概念

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

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

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

     随机时序分析法的发展就是为了弥补确定性因素分解方法的不足。根据时间序列的不同特点,随机时序分析可以建立的模型有ARIMA模型、残差自回归模型、季节模型、异方差模型等。

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

差分运算:

  1. p阶差分

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

  1. k步差分

相距k期的两个序列值之间的减法运算称为k步差分运算。

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

 5.2序列平稳性检验

图5.2-1 原始序列的时序图

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

 

图5.2-1 原始序列的自相关图

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

表5.2-1 原始序列的单位根检验

adf

cValue

p值

1%

5%

10%

1.8138

-3.7112

-2.9812

-2.6301

0.9985

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

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

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

 

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

 

图5.3-2 一阶差分之后序列的自相关图

表5.3-1 一阶差分之后序列的单位根检验

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

2)对一阶差分后的序列做白噪声检验

表5.3-2 一阶差分之后序列的白噪声检验

stat

p值

11.3040

0.0007734

 此表输出的p值远小于0.05,所以一阶差分之后的序列是平稳非白噪声序列。

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

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

第一种方法:人为识别,根据图5-25进行模型定阶

 

图5.4-1 一阶差分后序列的偏自相关图

一阶差分后自相关图显示出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.参数检验和参数估计见下表:

表5.4-1 模型参数

Parameter

Coef.

Std.Err.

t

const

49.9561

20.1390

2.4806

ma.L1.D.销量

0.6710

0.1648

4.0712

2.模型检验之残差检验:

 

                                        图5.4-2 残差自相关图 

                                      图5.4-3 残差偏自相关图 

                                            图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.说明原假设成立。

5.5 ARIMA模型预测

应用ARIMA(0,1,1)对表某餐厅的销售数据做为期5天的预测,结果如下表所示:

表5.5-1 预测未来5天的销售额

需要说明的是,利用模型向前预测的时期越长,预测误差将会越大,这是时间预测的典型特点。

6.实际应用

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

本次机器学习项目实战所需的资料,项目资源如下: 基于Python实现时间序列分析建模(ARIMA模型)项目实战-Python文档类资源-CSDN下载

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【项目实战】基于Python实现时间序列分析建模(ARIMA模型)项目实战 的相关文章

  • 为什么我不能导入 geopandas?

    我唯一的代码行是 import geopandas 它给了我错误 OSError Could not find libspatialindex c library file 以前有人遇到过这个吗 我的脚本运行得很好 直到出现此错误 请注意
  • 在 Python 中使用 XPath 和 LXML

    我有一个 python 脚本 用于解析 XML 并将某些感兴趣的元素导出到 csv 文件中 我现在尝试更改脚本以允许根据条件过滤 XML 文件 等效的 XPath 查询将是 DC Events Confirmation contains T
  • Python 中的六边形自组织映射

    我在寻找六边形 自组织映射 http en wikipedia org wiki Self organizing map在Python上 准备好模块 如果存在的话 绘制六边形单元格的方法 将六边形单元作为数组或其他方式使用的算法 About
  • 用 Python 编写一个无操作或虚拟类

    假设我有这样的代码 foo fooFactory create 由于种种原因 fooFactory create 可能无法创建实例Foo 如果可以的话我想要fooFactory create 返回一个虚拟 无操作对象 这个对象应该是完全惰性
  • 如何自动替换多个文件的文本内容中的字符?

    我有一个文件夹 myfolder包含许多乳胶表 我需要替换其中每个字符 即替换任何minus sign by an en dash 只是为了确定 我们正在替换连字符INSIDE该文件夹中的所有 tex 文件 我不关心 tex 文件名 手动执
  • 如何将条目中的部分文本加粗并更改其背景颜色?

    我正在创建一个基于 Tkinter 的 GUI 它有一个 Entry 小部件 我想将其文本的一部分加粗并更改其背景颜色 但我不知道我该怎么做 如果我使用文本小部件 我可以只使用标签 但看起来它们不能与条目小部件一起使用 此代码使用文本小部件
  • NLTK、搭配问题:需要解包的值太多(预期为 2)

    我尝试使用 NLTK 检索搭配 但出现错误 我使用内置的古腾堡语料库 I wrote alice nltk corpus gutenberg fileids 7 al nltk corpus gutenberg words alice al
  • 在 python-docx 中搜索和替换

    我有一个包含以下字符串的文档 模板 你好 我的名字是鲍勃 鲍勃是一个很好的名字 我想使用 python docx 打开此文档并使用 查找和替换 方法 如果存在 来更改每个字符串 Bob gt Mark 最后 我想生成一个新文档 其中包含字符
  • python中函数变量的作用域

    假设我们有两个函数 def ftpConnect ftp FTP server ftp login ftp cwd path def getFileList ftpConnect files ftp nlst print files 如果我
  • Python:随时接受用户输入

    我正在创建一个可以做很多事情的单元 其中之一是计算机器的周期 虽然我将把它转移到梯形逻辑 CoDeSys 但我首先将我的想法放入 Python 中 我将进行计数 只需一个简单的操作 counter 1 print counter 跟踪我处于
  • 如何为多组精灵创建随机位置?

    我尝试使用 blit 和 draw 方法进行 for 循环 并为 PlayerSprite 和 Treegroup 使用不同的变量 for PlayerSprite in Treegroup surface blit PlayerSprit
  • Pandas:根据列名进行列的成对乘法

    我有以下数据框 gt gt gt df pd DataFrame ap1 X 1 2 3 4 as1 X 1 2 3 4 ap2 X 2 2 2 2 as2 X 3 3 3 3 gt gt gt df ap1 X as1 X ap2 X a
  • Python While 循环,and (&) 运算符不起作用

    我正在努力寻找最大公因数 我写了一个糟糕的 运算密集型 算法 它将较低的值减一 使用 检查它是否均匀地划分了分子和分母 如果是 则退出程序 但是 我的 while 循环没有使用 and 运算符 因此一旦分子可整除 它就会停止 即使它不是正确
  • 在wxpython中使用wx.TextCtrl并在按钮单击后显示数据的简单示例 - wx新手

    我正在学习 python 并尝试使用 wxpython 进行 UI 开发 也没有 UI exp 我已经能够创建一个带有面板 按钮和文本输入框的框架 我希望能够在文本框中输入文本 并让程序在单击按钮后对输入框中的文本执行操作 我可以获得一些关
  • 字典的嵌套列表

    我正在尝试创建dict通过嵌套list groups Group1 A B Group2 C D L y x 0 for y in x if y x 0 for x in groups d k v for d in L for k v in
  • 在 Mac 上安装 Pygame 到 Enthought 构建中

    关于在 Mac 上安装 Pygame 有许多未解答的问题 但我将在这里提出我的具体问题并希望得到答案 我在 Mac 上安装 Pygame 时遇到了难以置信的困难 我使用 Enthought 版本 EPD 7 3 2 32 位 它是我的默认框
  • 字典中列表中仅有的几个索引的总和

    如果我有这种类型的字典 a dictionary dog white 3 5 black 6 7 Brown 23 1 cat gray 5 6 brown 4 9 bird blue 3 5 green 1 2 yellow 4 9 mo
  • 使用 python 将文本发送到带有逗号分隔符的列

    如何使用分隔符 在 Excel 中将一列分成两列 并使用 python 命名标题 这是我的代码 import openpyxl w openpyxl load workbook DDdata xlsx active w active a a
  • python中的sys.stdin.fileno()是什么

    如果这是非常基本的或之前已经问过的 我很抱歉 我用谷歌搜索但找不到简单且令人满意的解释 我想知道什么sys stdin fileno is 我在代码中看到了它 但不明白它的作用 这是实际的代码块 fileno sys stdin filen
  • Python模块单元测试的最佳文件结构组织?

    遗憾的是 我发现有太多方法可以在 Python 中保存单元测试 而且它们通常没有很好的文档记录 我正在寻找一种 终极 结构 它可以满足以下大部分要求 be discoverable by test frameworks including

随机推荐