ARIMA

用ARIMA模型作需求预测


本文结构:php

  • 时间序列分析?
  • 什么是ARIMA?
  • ARIMA数学模型?
  • input,output 是什么?
  • 怎么用?-代码实例
  • 常见问题?

时间序列分析?

时间序列,就是按时间顺序排列的,随时间变化的数据序列。
生活中各领域各行业太多时间序列的数据了,销售额,顾客数,访问量,股价,油价,GDP,气温。。。python

随机过程的特征有均值、方差、协方差等。
若是随机过程的特征随着时间变化,则此过程是非平稳的;相反,若是随机过程的特征不随时间而变化,就称此过程是平稳的。
下图所示,左边非稳定,右边稳定。
bash

非平稳时间序列分析时,若致使非平稳的缘由是肯定的,能够用的方法主要有趋势拟合模型、季节调整模型、移动平均、指数平滑等方法。
若致使非平稳的缘由是随机的,方法主要有ARIMA(autoregressive integrated moving average)及自回归条件异方差模型等。markdown


什么是ARIMA?

ARIMA (Auto Regressive Integrated Moving Average) 能够用来对时间序列进行预测,常被用于需求预测和规划中。函数

能够用来对付 ‘随机过程的特征随着时间变化而非固定’ 且 ‘致使时间序列非平稳的缘由是随机而非肯定’ 的问题。不过,若是是从一个非平稳的时间序列开始, 首先须要作差分,直到获得一个平稳的序列。post

模型的思想就是从历史的数据中学习到随时间变化的模式,学到了就用这个规律去预测将来。学习

ARIMA(p,d,q)模型,其中 d 是差分的阶数,用来获得平稳序列。测试

AR是自回归, p为相应的自回归项。大数据

MA为移动平均,q为相应的移动平均项数。flex


ARIMA数学模型?

ARIMA(p,d,q)模型是ARMA(p,q)模型的扩展。

ARIMA(p,d,q)模型能够表示为:

其中L 是滞后算子(Lag operator),d in Z, d>0。

AR:
当前值只是过去值的加权求和。

MA:
过去的白噪音的移动平均。

ARMA:
AR和MA的综合。

ARIMA:
和ARMA的区别,就是公式左边的x变成差分算子,保证数据的稳定性。

差分算子就是:

令 wt 为:

则 ARIMA 就能够写成:


input,output 是什么?

输入历史数据,预测将来时间点的数据。


怎么用?-代码实例

本文参考了:时间序列实例
另外推荐你们看这篇,36大数据上有一个python版讲的不错,里面对稳定性的定量检验的讲解比较详细:时间序列预测全攻略-附带Python代码

ARIMA模型运用的基本流程有几下几步:

  1. 数据可视化,识别平稳性。
  2. 对非平稳的时间序列数据,作差分,获得平稳序列。
  3. 创建合适的模型。
    平稳化处理后,若偏自相关函数是截尾的,而自相关函数是拖尾的,则创建AR模型;
    若偏自相关函数是拖尾的,而自相关函数是截尾的,则创建MA模型;
    若偏自相关函数和自相关函数均是拖尾的,则序列适合ARMA模型。
  4. 模型的阶数在肯定以后,对ARMA模型进行参数估计,比较经常使用是最小二乘法进行参数估计。
  5. 假设检验,判断(诊断)残差序列是否为白噪声序列。
  6. 利用已经过检验的模型进行预测。

使用ARIMA模型对裙子长度预测

一、加载数据

skirts <- scan("http://robjhyndman.com/tsdldata/roberts/skirts.dat", skip=5)
  • 1
str(skirts) head(skirts) boxplot(skirts) length(skirts)
  • 1
  • 2
  • 3
  • 4

二、把数据转化为是时间序列

skirts_ts <- ts(skirts, start=c(1886), frequency=1)
  • 1

1)查看时间序列对应的时间

skirts_ts
  • 1

2)画出时间序列图

plot.ts(skirts_ts)
  • 1

从图可知:女人裙子边缘的直径作成的时间序列数据,从 1866 年到 1911 年在平均值上是不平稳的

三、作差分获得平稳序列

1)作时间序列的一阶差分

skirts_diff <- diff(skirts_ts, differences = 1) plot.ts(skirts_diff)
  • 1
  • 2

从一阶差分的图中能够看出,数据还是不平稳的,继续差分

2)作时间序列的二阶差分

skirts_diff2 <- diff(skirts_ts, differences = 2) plot.ts(skirts_diff2)
  • 1
  • 2

二次差分后的时间序列在均值和方差上看起来是平稳了

四、找到合适的ARIMA模型

寻找 ARIMA(p,d,q)中合适的 p 值和 q

1)自相关图ACF

acf(skirts_diff2, lag.max = 20)
  • 1
acf(skirts_diff2, lag.max = 20, plot = F)
  • 1

自相关图显示滞后1阶自相关值基本没有超过边界值,虽然5阶自相关值超出边界,那么极可能属于偶然出现的,而自相关值在其余上都没有超出显著边界, 并且咱们能够指望 1 到 20 之间的会偶尔超出 95%的置信边界。 自相关图5阶后结尾

2)偏相关图PACF

pacf(skirts_diff2, lag.max = 20)
  • 1
pacf(skirts_diff2, lag.max = 20, plot = F)
  • 1

偏自相关值选1阶后结尾
故咱们的ARMIA模型为armia(1,2,5

3)使用auto.arima()函数,自动获取最佳的ARIMA模型

library(forecast)
  • 1
auto.arima(skirts_ts, ic=c("aicc", "aic", "bic"), trace = T)
  • 1

Best model: ARIMA(1,2,0)

五、创建ARIMA模型:并对比arima(1, 2, 0)与arima(1, 2, 5)模型

1)arima(1, 2, 0)模型

(skirts_arima <- arima(skirts_ts, order = c(1, 2, 0)))
  • 1

aic = 391.33

2)arima(1, 2, 5)模型

(skirts_arima <- arima(skirts_ts, order = c(1, 2, 5)))
  • 1

aic = 381.6

AIC是赤池消息准则SC是施瓦茨准则,当两个数值最小时,则是最优滞后分布的长度。咱们进行模型选择时,AIC值越小越好。因此arima(1, 2, 5)模型较好

六、预测:预测5年后裙子的边缘直径

(skirts_forecast <- forecast.Arima(skirts_arima, h=5, level = c(99.5)))
  • 1
plot.forecast(skirts_forecast)
  • 1

七、检验

观察 ARIMA 模型的预测偏差是不是平均值为 0 且方差为常数的正态分布,同时也要观察连续预测偏差是否自相关

1)检验预测偏差的自相关性

tsdiag(skirts_arima)
  • 1

下面第一个图表表明估计模型偏差的绘图。图中竖线的长度比较类似,都处在稳定范围以内,即估计的模型没产生不符合要求的偏差分布。

第二张绘图,显示估计的模型没形成偏差之间的任何关系。这是符合数据生成时每一个数据都是独立的这个前提的。因而可知,这ACF图符合检测要求。

第三张图,也就是Ljung-Box 指标。这个指标可对每个时间序列的延迟进行显著性的评估。断定技巧是,P-value点的高度越高,咱们的模型越可信。

acf(skirts_forecast$residuals, lag.max = 20)
  • 1
Box.test(skirts_forecast$residuals, lag=20, type = "Ljung-Box")
  • 1

p-value = 0.9871
相关图显示出在滞后1-20阶中样本自相关值都没有超出显著置信边界,并且Ljung-Box检验的p值为0.99,因此咱们推断在滞后1-20阶(lags1-20)中没明显证听说明预测偏差是非零自相关的。

Acf检验说明:残差没有明显的自相关性,Ljung-Box测试显示:全部的P-value>0.05,说明残差为白噪声。

2)判断预测偏差是不是平均值为零且方差为常数的正态分布
作预测偏差的时间曲线图和直方图(具备正态分布曲线)

预测偏差的均值是否为0

plot.ts(skirts_forecast$residuals)
  • 1

自定义判断预测偏差的方差是正态分布的函数

plotForecastErrors <- function(forecasterrors){ #画预测偏差的直方图 hist(forecasterrors, col="red", freq = F) #画方差是预测偏差数据的方差,平均值是0的正态分布数据的线 mysd <- sd(forecasterrors) mynorm <- rnorm(10000, mean = 0, sd = mysd) myhist <- hist(mynorm, plot = F) points(myhist$mids, myhist$density, type="l", col="blue", lwd=2) } plotForecastErrors(skirts_forecast$residuals)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

下图显示时间序列的直方图显示预测误大体是正态分布的且平均值接近于0。所以,把预测偏差看做平均值为0方差为服从零均值、方差不变的正态分布是合理的。

既然依次连续的预测偏差看起来不是相关,并且服从零均值、方差不变的正态分布,那么对于裙子直径的数据,ARIMA(1,2,5)看起来是能够提供很是合适预测的模型。


常见问题?

1.ARIMA建模的步骤

  1. 观察数据是不是时间序列数据,是否有seasonal等因素。
  2. transform:Box-correlation,保证variance是uniform的。若是用box-cor还不能稳定,还要继续深刻挖掘。
  3. ACF/PACF 是为了找到 MA 和 AR 的order。
  4. d=0-stationarity,1,2-non stationarity
  5. 白噪音check:肯定这个模型是optimize的,mean=0,平方差=1.
  6. 偏差是白噪音的时候,model就ok了,就能够预测了

2.决定ARIMA参数的方法

d是差分的阶数,几阶后就能够保证稳定:

modelfit,计算出来的参数是 1,1,1 ,但可能 2,1,1 预测效果更好,那就用后者。

或者用AIC比较俩模型。

相关文章
相关标签/搜索