时间序列是以固定时间间隔为单位的一列数据,最常见的比如某只股票的每日股价走势图,每天的气象数据等。时间序列分析是统计分析的一个重要内容,由于基于历史数据可以进行预测,因此几乎每种统计分析软件都有时间序列的分析及预测功能。
时间序列常见的分析方法有:简单平均法、加权平均法和移动平均法等。还有time series 里面两个强大的算法:Holt-Winters 和ARIMA。R语言具有功能强大的程序包,在数据计算、统计分析以及数据挖掘等方面都所向披靡,在这篇文章中,我以2018年4月到2019年10月某淘宝店三只松鼠销售量情况为例,向各位读者展示时间序列数据在R中统计分析及预测的实现。需要原始数据集自己进行练手分析以及本文完整程序代码的读者朋友请在我的公众号(全哥的学习生涯)内回复“时间序列”获得。
1. 数据处理
数据从2018年4月到2019年10月,大约是两年半的月销售数据。
首先我们使用read.csv函数对原始数据进行导入:
data<-read.csv(“C://Users//Desktop//data.csv”)
如图所示:
2.时间序列图
根据历史数据,首先绘制时间序列图
plot.ts(data$本月销量,xlab="月份")
如图1所示:
从图中可以看出,是三只松鼠31个月的销售数据,没有明显的周期和季节趋势,2019年9月,创下销售记录,30637件,推测可能是新生开学季,要在宿舍屯零食。2018年7月出现了销售销售的低谷,销量只有3000多。
3 时间序列检验分析
3.1 自相关检验
对于非平稳数列的数据,ACF自相关图不会趋向于0,或者趋向0的速度很慢。自相关图中的两条虚线表示置信界限,是自相关系数的上下界。
下面绘制原始数列的自相关图:
acf(data$本月销量,lag.max=30)
需要原始数据集自己进行练手分析以及本文完整程序代码的读者朋友请在我的公众号(全哥的学习生涯)内回复“时间序列”获得。
如图2所示:
3.2 单位根检验
这里需要用到fUnitRoots包,还请读者们事先进行下载安装。
unitrootTest(data$本月销量)
如图3所示:
从以上几幅图进行分析,图1中的时序图,可以看出有连年递增趋势,为非平稳序列。从自相关检验结果看,自相关系数长期大于零,进一步表明为非平稳序列;单位根检验结果p值显著大于0.05,也判断其为非平稳序列。
4. ARIMA 建模分析
4.1 非平稳序列差分
差分,即Integrated。一阶差分是把原数列每一项减去前一项的值。二阶差分是一阶差分基础上再来一次差分。差分一直得到平稳序列为止。R中使用diff()函数对时间序列进行差分运算。
diffsale<-diff(data$本月销量)
结果如图4所示。
差分后再进行检验:
plot.ts(diffsale)
acf(diffsale,lag.max=30)
unitrootTest(diffsale)
一阶差分后的时序图如图5所示。
自相关检验图与单位根检验图分别如图6,7所示。
一阶差分后,时序图在均值附近平稳波动,自相关有很强的短期相关性,单位根检验P值远小于0.05。所以一阶差分后序列表现为平稳。
4.2 时间序列模型识别定阶
从一阶差分后的自相关图可以看出,ACF值迅速跌入置信区间,没有收敛趋势,显示出拖尾性。所以考虑选用AR模型一阶差分后的序列,即对原始序列使用ARIMA(1,1,0)模型。
arima<-arima(data$本月销量,order=c(1,1,0))
结果如图8所示。
4.3 白噪声检验
检验残差序列是否为白噪声序列,使用Box.test函数
Box.test(arima$residuals,lag=5,type="Ljung-Box")
结果如图9所示。需要原始数据集自己进行练手分析以及本文完整程序代码的读者朋友请在我的公众号(全哥的学习生涯)内回复“时间序列”获得。
可以看出,p值=0.4215,大于0.05,通过白噪声检验。
5.ARIMA模型预测
R中可以通过forecast包对未来的序列值进行预测,预测未来5个月朗逸的月销量以及置信度上下界,语句如下:
library(forecast)
forecast(arima,h=5,level=c(80,95))
结果如图10所示。
可以清晰地看到预测值。还可以绘制原始及预测值图形,使用plot完成。
forecast<-forecast (arima,h=5,level=c(80,95))
plot(forecast)
结果如图11所示。
以上是对某淘宝店三只松鼠月度销售数据分析研究,主要使用R语言的时间序列分析方法,绘制序列图,检验其是否为平稳序列,非平稳序列进行差分处理,直到平稳为止。然后使用ARIMA方法进行分析建模,再进一步完成预测。需要本文完整程序代码的读者朋友请在我的公众号(全哥的学习生涯)内回复“时间序列”获得。
最后,屏幕前的你如果对R语言学习还有什么问题或看法,欢迎在给我留言。
感谢你的阅读。