数据挖掘-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.mzph.cn/news/224029.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

猫粮哪个牌子质量好性价比高?盘点十款主食冻干猫粮品牌排行榜!

在过去的100多年里,猫咪主食市场一直被膨化猫粮主导。然而,随着猫咪频频出现猝死、失明、发育不良以及营养不良等问题,猫主人们开始质疑膨化粮是否最适合猫咪。于是,从上世纪90年代开始,出现了生骨肉喂养。生骨肉确实是…

网络安全——基于Snort的入侵检测实验

一、实验目的要求: 二、实验设备与环境: 三、实验原理: 四、实验步骤: 五、实验现象、结果记录及整理: 六、分析讨论与思考题解答: 七、实验截图: 一、实验目的要求: 1、掌握…

一、win10+yolov8+anaconda环境部署

1、安装anaconda (1)打开aonconda下载地址:https://www.anaconda.com/download,点击download下载。 2、下载完成后,双击打开,点击Next,I Agree,选择just me; 3、勾选…

Spring上下文之注解模块ConfigurationMethod

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

飞天使-docker知识点8-docker的资源限制

文章目录 容器资源限制示例 容器资源限制 Docker提供了多种资源限制的方式,可以根据应用程序的需求和系统资源的可用性进行选择。以下是一些常见的Docker资源限制及其使用情况:CPU限制:通过设置CPU的配额(quota)和周期…

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

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

spring mail 邮件发送demo

首先配置号邮件服务器(我用的是126邮箱),获取密钥: 进入下图的【邮箱中心】->点击右侧的齿轮按钮 接着,开启 下图位置 的 POP3/SMTP(我当时点击开启时,需要手机扫码认证下) 最后…

putIfAbsent、computeIfAbsent、computeIfPresent

putIfAbsent 判断是否存在,不存在则设置 hashmap.putIfAbsent(K key, V value) 例子如下: public static void main(String[] args) {//hashmap.putIfAbsent(K key, V value)HashMap hashMap Maps.newHashMap();hashMap.put("aa","on…

ConnectionError怎么解决

文章目录 解决思路lz的具体解决过程 解决思路 这个错误表明在尝试加载评价指标时,代码试图从 huggingface 下载文件,但由于代理错误而无法连接。 为了解决这个问题,你可以尝试以下几个步骤: 1.设置代理: 如果你在使…

Zabbix监控系统部署与管理

zabbix介绍 zabbix是⼀个基于 Web 界面的提供分布式系统监视以及网络监视功能的企业级的免费开源解决⽅案。zabbix能监视各种⽹络参数,保证服务器系统的安全运营;并提供灵活的通知机制以让系统管理员快速定位/解决存在的各种问题。 zabbix构成 zabbix由…

Windows进程机制

进程 进程要做任何事情,必须让一个线程在它的上下文运行。该线程负责执行进程地址空间包含的代码。每个进程至少要有一个线程来执行进程地址空间包含的代码。当系统创建一个进程的时候,会自动为进程创建第一个线程,这称为主线程(…

命令调用先构建hashTable

GPT 代码改 #include <stdio.h> #include <stdlib.h> #include <string.h>#define TABLE_SIZE 256struct Node {char *key;void *value;struct Node *next; };struct HashTable {struct Node *table[TABLE_SIZE]; };void initHashTable(struct HashTable *ha…

GPT-AI导航

1. https://ai-bot.cn/ https://ai-bot.cn/

工业固体废物智能化综合管控平台

工业固体废物智能化综合管控平台&#xff0c;涵盖产废企业、运输企业、固废处置企 业等不同群体应用&#xff0c;根据不同群体设计不同的业务应用子系统功能&#xff0c;以及各个不 同群体的环保物联网平台子系统功能模块&#xff0c;同时具有移动端的应用APP。 建立产废企业端…

C++ stringOJ练习题

目录 把字符串转换成整数 反转字符串 字符串中的第一个唯一字符 字符串最后一个单词的长度 找出字符串中第一个只出现一次的字符 字符串相加 字符串最后一个单词长度 字符串相乘 反转字符串3 反转字符串2 验证回文串 把字符串转换成整数 通过遍历字符串并逐位转换…

phpy 连接 PHP与Python生态 跨界合作 PHPY搭建 已解决

目录 需求介绍 安装 windows版本 文件地址 运行效果 需求介绍 在日常功能开发中&#xff0c;难免会使用python的计算库&#xff0c;同时自己要是一名PHP开发工程师。就在最近有相应的需求&#xff0c;索性使用phpy来进行功能开发 安装 windows版本 phpy 是识沃团队最新推出…

千梦网创:Too Young,to simple

大多数人啊&#xff0c;还是too young&#xff0c;包括我。 网上的评论对我而言并不影响我通过提供价值服务经营生活&#xff0c;但是有时候对于我的思考还是有一些帮助的。 我把很多可以争与不可争的事件看做是一种现象&#xff0c;这种现象往往可以给予我新的能量。 当学员…

双端队列和优先级队列

文章目录 前言dequedeque底层设计迭代器设计 priority仿函数数组中的第k个最大元素优先级队列模拟实现pushpop调整仿函数存储自定义类型 前言 今天要介绍比较特殊的结构&#xff0c;双端队列。 还有一个适配器&#xff0c;优先级队列。 deque 栈的默认容器用了一个deque的东西…

【C语言(十三)】

自定义类型&#xff1a;结构体 一、结构体类型的声明 1.1、结构体回顾 结构是⼀些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.1.1、结构的声明 例如描述⼀个学生&#xff1a; struct Stu {char name[20];//名字int age;//年龄c…