原标题:【手把手教你】用R语言进行预测的基本过程
欢迎关注天善智能微信公众号,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区。 对商业智能BI、大数据分析挖掘、机器学习,python,R等数据领域感兴趣的同学加微信:tstoutiao,邀请你进入头条数据爱好者交流群,数据爱好者们都在这儿。
本例使用forecast包中自带的数据集wineind,它表示从1980年1月到1994年8月,由葡萄酒生产商销售的容量不到1L的澳大利亚酒的总量。这是典型的时间序列数据,进一步绘制得到下图。
葡萄酒销售量时间序列
从上图可以看出,该时间序列数据呈明显的周期性变化。
— 数据读入及处理
加载forecast包,使用自带数据集wineind。使用ACF函数查看wineind数据的自相关性,代码如下。
#读入数据
library(forecast)
acf(wineind,lag.max = 100)
得到如下图所示。
wineind数据的自相关图
图中圆点部分为自相关性比较明显的位置,可以初步使用近1、4、6、8、12期的数值建立指标,作为预测基础数据。另外,通过观察确定wineind的数据周期为一年,将1980年到1993年每年按月的曲线图放在一张图中,进一步观察,相应代码如下。
1
#观察曲线簇
2 len=
1993-
1980+
1
3 data
0=wineind[
1
:
12*len]
4 range
0=range(data
0)+c(-
100,
100)
5 plot(
1
:
12,
1
:
12,ylim=range
0,col=
'white', xlab=
"月份", ylab=
"销量")
6
for(i
in
1
:len)
7 {
8 points(
1
:
12,wineind[(
12*(i-
1)+
1)
:(
12*i)])
9 lines(
1
:
12,wineind[(
12*(i-
1)+
1)
:(
12*i)], lty=
2)
10 }
相应图参见下图。
wineind数据与月份的关系图
由图可知,月份与销量线性关系明显,应该考虑进建模基础数据,用于预测。至此,需要将wineind的原始数据,处理成如下表所示格式,输出建模基础数据集。
表 基础数据集属性配置表
数据转换的代码如下。
1
#对数据按指定格式进行转换
2 Month=
NULL
3 DstValue=
NULL
4 RecentVal1=
NULL
5 RecentVal4=
NULL
6 RecentVal6=
NULL
7 RecentVal8=
NULL
8 RecentVal12=
NULL
9
#替换掉太大或太小的值
10 wineind[wineind<
18000]=
18000
11 wineind[wineind>
38000]=
38000
12
for(
i in(12+1):(length(wineind)-1))13{
14 Month
1)
15 DstValue
1])
16 RecentVal1
17 RecentVal4
3])
18 RecentVal6
5])
19 RecentVal8
7])
20 RecentVal12
11])
21 }
22 preData=data.frame(Month,DstValue,RecentVal1,RecentVal4,RecentVal6,
23 RecentVal8,RecentVal12)
24 head(preData)
25
##Month DstValue RecentVal1 RecentVal4 RecentVal6 RecentVal8 RecentVal12
26
## 12180001800022591237391922718000
27
## 23200081800026786211332289320016
28
## 34213542000829740225912373918000
29
## 45194982135418000267862113318019
30
## 56221251949818000297402259119227
31
## 67258172212520008180002678622893
32
#画出散点矩阵图
33 plot(preData)
相应图如下图所示。
— 建立模型
根据上一步输出的基础数据,提取150行作为训练数据,剩下的数据作为测试数据。数据分割及建模的代码如下。
#分离训练集与测试集 trainData=preData[
1:
150,]
testData=preData[
151:
163,]
#建立模型 lm.fit
8+RecentVal12,data=trainData) summary(lm.fit)
##
## Call:
## lm(formula = DstValue ~ Month + RecentVal1 + RecentVal4 + RecentVal6 +
## RecentVal8 + RecentVal12, data = trainData)
##
## Residuals:
## Min 1Q Median 3Q Max
## -4806.5 -1549.1 -171.8 1368.7 6763.3
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.214e+03 1.987e+03 1.114 0.26714
## Month 3.855e+02 8.955e+01 4.305 3.08e-05 ***
## RecentVal1 -2.964e-03 3.354e-02 -0.088 0.92971
## RecentVal4 7.227e-02 3.567e-02 2.026 0.04463 *
## RecentVal6 -1.825e-02 3.759e-02 -0.486 0.62804
## RecentVal8 1.123e-01 3.903e-02 2.876 0.00464 **
## RecentVal12 6.701e-01 5.921e-02 11.316 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1989 on 143 degrees of freedom
## Multiple R-squared: 0.848, Adjusted R-squared: 0.8416
## F-statistic: 133 on 6 and 143 DF, p-value: < 2.2e-16
可以看到,调整后的R平方达到0.84,作为模型来讲,基本可以使用。但是看下误差项(Intercept)的P值为0.26714,不显著。所以,目前的模型还需要进一步调整,使得误差项(Intercept)的P值低于0.05或0.01。另外,变量RecentVal1 和RecentVal6的P值都较大,明显不显著,这里考虑变量之间的相互影响,暂时保留。几个变量中,除了RecentVal12与目标变量呈现比较明显的线性关系,其他变量跟目标变量的线性关系并不明显。为了让模型拟合得更好,现在开始尝试非线性的方法。由于变量RecentVal1和RecentVal6对目标变量的影响不明显。这里主要考虑Month、RecentVal4、RecentVal8三个变量对目标变量的非线性影响。在所有的非线性方法中,多项式比较适合单个变量的衍生变换。因此,这里对Month、RecentVal4、RecentVal8三个变量使用多项式的方法,尝试最高次数为5的情况下,模型的拟合情况。
去掉P值较大的三个变量I(RecentVal4^3)、I(RecentVal4^4)、I(RecentVal4^5)后,再拟合一次模型,从拟合结果可知,所有系数的P值都小于0.05,影响明显,且拟合优度为0.86,可用于预测。lm.fit就是我们建立的用于时间序列预测的线性回归模型。
— 预测及误差分析
用lm.fit作为预测模型,对预测数据源testData进行预测。代码如下。
#对新数据进行预测 testData$pred=predict(lm.fit,testData)
#计算百分误差率 testData$diff=
abs(testData$DstValue-testData$pred)/testData$DstValue testData
## Month DstValue RecentVal1 RecentVal4 RecentVal6 RecentVal8 RecentVal12
## 15310284962272424735268051946325650
## 15411328572849629356252362435230923
## 15512371983285731234247352680537240
## 1561180003719822724293562523618000
## 1572227841800028496312342473519463
## 1583235652278432857227242935624352
## 1594263232356537198284963123426805
## 1605237792632318000328572272425236
## 1616275492377922784371982849624735
## 1627296602754923565180003285729356
## 1638233562966026323227843719831234
## pred diff
## 15325154.080.117276814
## 15431448.290.042874098
## 15537063.760.003608861
## 15618724.460.040247684
## 15720238.790.111710356
## 15824022.790.019426610
## 15925778.010.020704134
## 16024900.350.047157117
## 16124405.940.114089645
## 16230005.150.011636800
## 16330888.460.322506541 summary(testData)
## Month DstValue RecentVal1 RecentVal4
## Min. : 1.000 Min. :18000 Min. :18000 Min. :18000
## 1st Qu.: 3.5001st Qu.:234611st Qu.:231751st Qu.:23175
## Median : 6.000 Median :26323 Median :26323 Median :26323
## Mean : 6.273 Mean :26688 Mean :26630 Mean :27025
## 3rd Qu.: 9.0003rd Qu.:290783rd Qu.:290783rd Qu.:30295
## Max. :12.000 Max. :37198 Max. :37198 Max. :37198
## RecentVal6 RecentVal8 RecentVal12 pred
## Min. :18000 Min. :19463 Min. :18000 Min. :18724
## 1st Qu.:237601st Qu.:245441st Qu.:245441st Qu.:24214
## Median :26805 Median :26805 Median :25650 Median :25154
## Mean :27220 Mean :27496 Mean :26636 Mean :26603
## 3rd Qu.:302953rd Qu.:302953rd Qu.:301403rd Qu.:30447
## Max. :37198 Max. :37198 Max. :37240 Max. :37064
## diff
## Min. :0.003609
## 1st Qu.:0.020065
## Median :0.042874
## Mean :0.077385
## 3rd Qu.:0.112900
## Max. :0.322506
从统计结果中,可以看到,对预测数据集共11条记录进行预测,最小百分误差率为0.36%,最大百分误差率为32.25%,平均百分误差率为7.73%。预测结果还是很不错的,除了最后一条记录,预测值为30888.46,取整为30888与真实结果23356差别较大,根据笔者的经验,该月可能遇到什么特殊情况(如气象灾害导致葡萄收成不好等),导致高估了葡萄酒的销量。当预测不准时,不见得都是模型的问题,有可能是数据的问题,这时需要从数据中去发现问题,并进一步解决问题,预测的目的就是为了改变。有兴趣的读者,还可以使用纵横两年的数据关系,构建指标体系,有望对模型进一步优化。
——节选自《R语言预测实战》 已获得作者授权
转载请保留以下内容:
本文来源自天善社区datakong老师的博客(公众号)。
原文链接: https://ask.hellobi.com/blog/datakong/7664返回搜狐,查看更多
责任编辑: