利用SARIMA模型对季节周期性的时序案例进行分析(一)

2023-05-16

看过掌柜前几篇关于时序文章:

  • 利用ARIMA模型对时间序列进行分析的经典案例(详细代码)
  • “利用ARIMA模型对时间序列进行分析的经典案例(详细代码)”一文中会遇到的问题总结
  • ARIMA模型预测后出现一条直线的原因

的朋友都知道在最后一篇掌柜遗留了一个问题,就是已确定当前的时序数据具有季节周期性,那么如何解决这类时序数据并进行预测分析呢?本文掌柜将从以下几个方面一一作答:

  • SARIMA模型是什么?
  • 如何使用SARIMA模型进行时序分析的?(SARIMA模型的步骤有哪些?)
  • SARIMA模型的优点以及限制性有哪些?

首先我们来看第一个问题,SARIMA模型是什么?
简单来讲,就是ARIMA的扩展,它明确支持带有季节成分的 单变量时间序列
而多出来的几个参数就是下图大写的PDQ那部分
在这里插入图片描述
其中m 表示时序的周期性,比如 以月为周期monthly,以年为周期yearly等。

下面接着看第二个问题:如何使用SARIMA模型进行时序分析的?(SARIMA模型的步骤有哪些?)

这里有这样一组示例数据:
在这里插入图片描述
上图👆表示的是 从1958年3月到2001年12月,美国夏威夷州空气中二氧化碳含量的时序图。
可以很明显的从时序图看出来,这是一个季节周期性的时序,所以下面我们用SARIMA模型进行一个处理和预测。
PS: 如果你的数据不是一开始就能明显看出季节周期性的,就请用掌柜上一篇博客👉:《ARIMA模型预测后出现一条直线的原因 》中提到的几种方法 来进行季节周期性的确定!!!

  1. SARIMA模型的参数选取
    1.1 网格搜索(Grid Search)
    首先对p、d、q 以及 P、D、Q进行不同参数组合的探索。话不多说,直接上代码:
# 首先定义 p、d、q 的参数值范围,这里取 0 - 2.
p = d = q = range(0, 2)

# 然后用itertools函数生成不同的参数组合
pdq = list(itertools.product(p, d, q))

# 同理处理季节周期性参数,也生成相应的多个组合
seasonal_pdq = [(x[0], x[1], x[2], 12) for x in list(itertools.product(p, d, q))]

print('Examples of parameter combinations for Seasonal ARIMA...')
print('SARIMAX: {} x {}'.format(pdq[1], seasonal_pdq[1]))
print('SARIMAX: {} x {}'.format(pdq[1], seasonal_pdq[2]))
print('SARIMAX: {} x {}'.format(pdq[2], seasonal_pdq[3]))
print('SARIMAX: {} x {}'.format(pdq[2], seasonal_pdq[4]))

然后我们就可以看到每个SARIMA模型对应的参数组合:
在这里插入图片描述
这里的m 我们是以年为周期,即12个月,所以 m = 12
当然如果你还是对如何确定 m的值有疑问?可以画出ACF和PACF图来确定 m的值。下图就是掌柜画出的ACF和PACF图:
在这里插入图片描述
由上图👆可知,ACF和PACF图的12阶以内,自相关系数和偏自相关系数都是拖尾,所以对于非季节性部分可采用ARMA(1,1)模型
然后再以12阶为一个周期来看,可以发现ACF图在 12阶时,自相关系数不为零;但是24阶的时候就落在2倍标准差范围内!同理可知,PACF图在12阶和24阶,甚至36阶的偏自相关系数都不为零!! 所以这是一个 ACF截尾,PACF拖尾的季节性MA模型。季节性这部分的周期性参数 m = 12,模型为MA(1)。
PPS: 但是这种看图的方法带了很多主观因素在里面,所以还是建议大家采用更科学的网格搜索(Grid Search)👇法进行最优参数的查找!!!

下面对SARIMA模型进行参数的网格搜索,找到最优SARIMA模型
那么问题来了,如何判断模型最优???
答:通常都是找寻最小的AIC(Akaike Information Criterion 即 赤池信息准则)值。
不熟悉赤池信息准则的朋友可以看维基百科的解释👉:赤池信息量准则。下图就是掌柜搜索后的结果:
在这里插入图片描述

可以发现 SARIMASX (1, 1, 1)x(1, 1, 1, 12) 就是我们要找的最优模型。

  1. 建立SARIMA模型
    接着用原始数据进行SARIMA模型的拟合:
mod = sm.tsa.statespace.SARIMAX(y,
                                order=(1, 1, 1),
                                seasonal_order=(1, 1, 1, 12),
                                enforce_stationarity=False,
                                enforce_invertibility=False)

results = mod.fit()

print(results.summary().tables[1])

然后我们会得到这样一组表格数据,主要看coef 列 和 P>|z| 列
在这里插入图片描述
coef 列显示每个特征的权重(即重要性)以及每个特征如何影响时间序列。而P>|z|列是对每个特征重要性的检验。上图每个权重的 p 值都低于或接近 0.05,因此在我们的模型中保留所有权重是合理的。

  1. SARIMA模型的验证
    SARIMA模型建立好后我们还需要进行模型的验证,以确保模型所做的假设都是合理的。这里主要采用plot_diagnostics 方法,它可以快速生成模型诊断结果并检查出有无任何异常行为。
    在这里插入图片描述
    这里主要看模型的残差是不相关的且符合正态分布;如果没有满足这些特性,说明模型还需要改善!

上面👆这四个图,先看右上角的直方图:
在右上图中,我们看到红色的KDE线紧跟N(0,1)线(其中N(0,1))是均值0和标准偏差为1的正态分布的标准表示法。这很好地表明了残差是正态分布的
左下方的qq图显示,残差(蓝色点)的有序分布遵循从具有N(0,1)的标准正态分布获取的样本的线性趋势。同样,这也表明残差是正态分布的。
左上图表示随时间推移,残差没有明显的季节性变化,似乎是白噪声。
右下角的自相关(即ACF图)图更确认了这一点,该图表明时间序列残差与自身的滞后值具有较低的相关性。

当然,如果想更确定的检验 残差是否是白噪声序列,可以采用Ljung-Box检验:检验的结果就是看最后一列前十二行的检验概率。掌柜也采用LB检验后得到如下数据:
在这里插入图片描述
计算可知前12阶的P值几乎都是大于0.05,所以在0.05的显著性水平下,不拒绝原假设,即残差为白噪声序列,这说明拟合的模型已经充分提取了时间序列中的信息。

  1. SARIMA模型的预测
    4.1 验证预测模型
    这里主要采用 get_prediction() 和 conf_int() 方法来获取时间序列预测的值和相关的置信区间。选取1998年1月开始的数据,并设置dynamic = False 进行验证预测:
pred = results.get_prediction(start=pd.to_datetime('1998-01-01'), dynamic=False) #预测值
pred_ci = pred.conf_int() #置信区间
 
#画出预测值和真实值的plot图

ax = y['1990':].plot(label='observed')
pred.predicted_mean.plot(ax=ax, label='One-step ahead Forecast', alpha=.7)

ax.fill_between(pred_ci.index,
                pred_ci.iloc[:, 0],
                pred_ci.iloc[:, 1], color='k', alpha=.2)

ax.set_xlabel('Date')
ax.set_ylabel('CO2 Levels')
plt.legend()

plt.show()

在这里插入图片描述

从上图可以看出,模型预测值与真实值几乎重叠,说明模型效果很好。接着再使用MSE(均方误差)和RMSE(均方根误差)来查看模型的准确度。
在这里插入图片描述
可以看到这个MSE和RMSE是非常的小,说明dynamic = False 情况下,模型的预测效果过于完美(太过理想化),这不太符合实际情况,所以打算采用动态预测再次进行验证
即dynamic = True又是怎样的一种情况???

#动态预测
pred2 = results.get_prediction(start=pd.to_datetime('1998-01-01'), dynamic = True, full_results=True)
pred_ci2 = pred2.conf_int()

#预测图
ax = y['1990':].plot(label='Original')
pred2.predicted_mean.plot(ax=ax, label='Dynamic Forecast', alpha=.7)

ax.fill_between(pred_ci2.index,
                pred_ci2.iloc[:, 0],
                pred_ci2.iloc[:, 1], color='k', alpha=.2)

ax.set_xlabel('Date')
ax.set_ylabel('CO2')
plt.legend()

plt.show()

得到如下图形:
在这里插入图片描述

同理可以得到MSE和RMSE值:

y_forecasted2 = pred2.predicted_mean
y_truth2 = y['1998-01-01':]

mse = ((y_forecasted2 - y_truth2) ** 2).mean()
print('The Mean Squared Error of forecasts is {}'.format(round(mse, 2)))
print('The Root Mean Squared Error of forecasts is {}'.format(np.sqrt(sum((y_forecasted2-y_truth2)**2)/len(y_forecasted2))))

在这里插入图片描述
动态预测的MSE和RMSE值都略大于静态预测值,这是因为动态预测依赖于时间序列中较少的历史数据进行预测,而静态预测的每个点都是使用的该点完整历史数据进行预测的。不过这里动态预测出来的MSE和RMSE也不是很大,说明模型确实效果很好。
综上,SARIMA (1,1,1)x(1,1,1)12 模型效果还不错,下面进行最后一步!

4.2.模型预测
这里我们预测未来10年的数据并得到如下图:
在这里插入图片描述
在这里插入图片描述
可知随着时间的推移,二氧化碳的含量还是会在一个稳定的区间里逐步增加!

好了,最后一个问题:SARIMA模型的优点和缺点? 以及本篇中还有待优化的地方。
(请静候下一篇🤝)完整的代码掌柜已经上传Github👉Time Series Learning,请自取谢谢。

参考资料:
A Guide to Time Series Forecasting with ARIMA in Python 3
How to forecast sales with Python using SARIMA model
季节性ARIMA模型
A Gentle Introduction to SARIMA for Time Series Forecasting in Python

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

利用SARIMA模型对季节周期性的时序案例进行分析(一) 的相关文章

  • 在MATLAB中手动安装MinGW64详细教程

    在MATLAB中手动安装MinGW64详细教程 话题背景 针对MATLAB官方License限制附件安装的问题 xff0c 可以尝试线下手动自行安装 部分版本的Matlab由于License到期问题或者破解版限制 xff0c 已无法获得Ma
  • ubuntu18.04部署jenkins,图文并茂,记录一下。

    1 因为Jenkins运行需要jdk的环境 xff0c 所以首先得安装Java xff0c 先下载jdk安装包 xff08 听说用wget下载安装时会有问题 xff0c 说是什么Oracle的安装协议 xff0c 本人用wget亲测 xff
  • 通过hdparm将挂载的硬盘休眠再关机

    hdparm Y dev sda1 root 64 cubietruck plus span class token comment hdparm span hdparm get set hard disk parameters versi
  • 教程 | 简单实用的pandas技巧:如何将内存占用降低90%

    pandas 是一个 Python 软件库 xff0c 可用于数据操作和分析 数据科学博客 Dataquest io 发布了一篇关于如何优化 pandas 内存占用的教程 xff1a 仅需进行简单的数据类型转换 xff0c 就能够将一个棒球
  • 哈佛大学cs50课程笔记_哈佛CS50指南:如何为您选择正确的课程(带有免费证书)

    哈佛大学cs50课程笔记 In January I wrote an article on Class Central about CS50 Harvard s Introduction to Computer Science which
  • 使用Docker快速安装部署mysql

    使用Docker快速安装部署mysql的前提 xff1a 首先需要确保已经安装了Docker环境 如果没有安装Docker的话 xff0c 可以参考上一篇的内容 xff1a Linux上安装Docker 有了Docker环境后 xff0c
  • docker下gitlab安装配置使用(完整版)

    docker 安装gitlab以及使用 一 安装及配置 1 gitlab镜像拉取 gitlab ce为稳定版本 xff0c 后面不填写版本则默认pull最新latest版本 docker pull gitlab gitlab ce 拉取镜像
  • Linux 配置Gradle

    一 下载gradle 如果windows中有可以直接拷贝 xff0c 如果没有可以去官网下载 http www gradle org downloads 二 解压下载得到的gradle unzip gradle 2 2 1 all zip
  • gitlab配置通过smtp发送邮件(QQ exmail腾讯企业为例)

    首先祭出官网文档链接 xff1a https docs gitlab com omnibus settings smtp html 其实官网已经说的很清楚了 xff0c 并且给出了QQ邮箱的范例 xff08 BAT还是屌的 xff09 1
  • 文本编辑器Notepad++使用技巧

    除了语法高亮 xff0c 一般不用操作 还有两点经常使用的 xff1a 正则表达式查找替换和列模式编辑 这些可以在VS Eclipse Word等里也有 xff0c 但是有时打开一个文件就慢了 本来想总结记录一下技巧的 xff0c 却无意中
  • linux系统磁盘block、inode占满处理

    1 磁盘的block占满 xff0c 查看命令 df vh 然后查看占用百分比 2 磁盘inode占满 xff0c 查看命令df ih 同样也是查看占用百分比 block占满处理办法 需要用到的命令如下 LL 列出当前目录下的文件 df v
  • Code::Blocks平台下Fortran的编译

    问题背景 xff1a 因为之前学习数值方法 xff0c 有用到Fortran的地方 xff0c 所以上网查了一些资料 关于Fortran语言的编辑器安装 xff0c 目前本人接触到的支持Fortran的编辑器有VisualStdio和Cod
  • powershell远程连接

    在Linux中 xff0c 我们可以使用安全的SSH方便的进行远程管理 但在Windows下 xff0c 除了不安全的Telnet以外 xff0c 从Windows Server 2008开始提供了另外一种命令行原创管理方式 xff0c 那
  • 2022年学习总结暨2023年规划

    2022年总结 2022年是我在C站的创作元年 xff0c 在第一年也收获了不少成就 xff0c 比如 Java领域新星创作者 发布100篇博文 拿到了C站的书包 吃到了C站的月饼 成功上榜了330 43 截止目前收获粉丝8600 43 在
  • 《Prometheus+Grafana 实践派》专栏介绍

    专栏名称 Prometheus 43 Grafana 实践派 专栏介绍 本专栏根据本公司统一监控落地实践编写 在该专栏您将学到 企业级监控的选型Prometheus的基础知识Grafana的基础知识快速搭建Prometheus 43 Gra
  • 泊松分布–计算概率分布的公式

    Probability Distributions play an important role in our daily lives We commonly use them when trying to summarise and ga
  • Prometheus 的介绍和安装

    介绍 Prometheus 是一个开源的监控和报警系统 最初由SoundCloud于2012年创建 随着越来越多的公司采用Prometheus以及非常活跃的社区 Prometheus于2016年加入云原生基金会 成为Kubernetes之后
  • 因为锁的问题,我们被扣了1万

    前言 春节放假期间 xff0c 一个项目上的积分接口被刷 xff0c 而且不止一个人在刷 xff0c 并且东西也被兑走 xff0c 放假晚上被人叫起来排查问题 xff0c 通过这个人的积分明细观察 xff0c 基本一秒就能获取一次 xff0
  • Prometheus 告警机制介绍及命令解读

    本文您将了解到Prometheus 告警模块Alertmanager的架构介绍 核心概念 命令解析和AMTool的基本使用 Prometheus的告警模块并不存在于Prometheus中 而是 以独立项目Alertmanager存在 Pro

随机推荐