
1.3 Python预测初步
本节拟通过一个简单的例子说明用Python进行预测的主要步骤,旨在让各位读者了解用Python进行预测的基本过程。本例使用wineind数据集,它表示从1980年1月到1994年8月,葡萄酒生产商销售的容量不到1升的澳大利亚葡萄酒的总量。数据示意如图1-3-1所示。

图1-3-1 数据示意
从数据中可知,这是典型的时间序列数据,一行表示一年,12列表示一年的12个月。将时间序列数据绘制为如图1-3-2所示的图表。

图1-3-2 葡萄酒销售量时间序列
从图1-3-2中可以明显看出,该时间序列数据呈明显的周期性变化。
1.3.1 数据预处理
基于wineind数据集,使用statsmodels.graphics.tsaplots模块下面的plot_acf函数查看wineind数据的自相关性,代码如下:

图1-3-3中的竖线表示对应近n期延迟数据的相关系数,阴影部分表示相关性不明显的部分,我们从图中找出近几期较明显的点位即可。从左到右,最终选择了近1、4、6、8、12期数据(如图1-3-3中空心点所示,第1条竖线为第0期)来建立指标,作为预测基础数据。

图1-3-3 wineind数据的自相关图
通过观察确定wineind的数据周期为一年,我们可以将1980年到1993年每年按月的曲线图画在一张图中(见图1-3-4),相应代码如下:

由图1-3-4可知,月份与销量的线性关系明显,应该考虑加入建模基础数据用于预测。至此,需要将wineind的原始数据处理成如表1-3-1所示格式,输出建模基础数据集。

图1-3-4 wineind数据与月份的关系图
表1-3-1 基础数据集属性配置表

数据转换的代码如下:

散点矩阵图如图1-3-5所示。

图1-3-5 散点矩阵图
注意看value-r12_value的子图,拥有较明显的线性关系,但是图中存在明显的杠杆点。放大该子图,如图1-3-6所示。

图1-3-6 value-r12_value散点图
图1-3-7中的画圈部分圈出了两个点,在建模之前需要去掉这两个点,因为这些杠杆点会影响线性模型的建模效果。建立value-r12_value的线性模型,通过cooks标准来计算每行记录对模型的影响程度,代码如下:

效果如图1-3-7所示。
图1-3-5中的点表示记录,横坐标表示杠杆影响,纵坐标表示学生化残差。从图中可知91号和135号样本存在明显的异常,现将这两个点在ralue-r12_value对应的散点图中标记出来,代码如下:

效果如图1-3-8所示。

图1-3-7 识别杠杆点

图1-3-8 杠杆点
由图1-3-8可知,91号和135号的点正是我们通过散点矩阵图发现的杠杆点。现将这两个样本从pdata中去掉,代码如下:

1.3.2 建立模型
根据上一步得到的基础数据pdata,提取其前150行数据作为训练集,余下的部分作为测试集。数据分区及建模的代码如下:

最小二乘法(OLS)回归分析的结果如表1-3-2所示。
图1-3-2 OLS回归分析结果

可以看到,调整后的R平方值达到0.847,作为模型来讲,基本可以使用。但是看一下截距项(const)的P值为0.17,不显著。所以,目前的模型还需要进一步调整,使得截距项(const)的P值低于0.05或0.01为止。另外,变量x2(r1_value)和x4(r6_value)的P值都较大,明显不显著,可将这两个变量移除。重新构建模型,代码如下:

OLS回归分析的结果如表1-3-3所示。
表1-3-3 OLS回归分析结果

可以看到,截距项的P值仍然较大,但相比0.17已经有所下降,另外,x2对应的P值是这些变量中最大的,可以尝试使用非线性的思路来进一步拟合模型,在模型中加入x2(r4_value)对应的二次项、三次项,重新建模,代码如下:

OLS 回归分析的结果如表1-3-4所示。
表1-3-4 OLS回归分析结果

从以上结果可知,调整后的R平方值达到0.854,同时,对应各变量及截距项的P值均低于0.01,统计显著,可将该模型用于预测。Model就是我们建立的用于时间序列预测的线性回归模型。
1.3.3 预测及误差分析
用Model作为预测模型,对预测数据集test_set进行预测,代码如下:

预测结果如下:

统计预测结果,代码如下:

统计结果如下:

从统计结果中可以看到,预测数据集共13条记录进行预测,最小百分误差率为1.2%,最大百分误差率为34.6%,平均百分误差率为11.1%。预测结果还是很不错的,除了最后一条记录,预测值为31436.49,取整为31436与真实结果23356差别较大,根据笔者的经验,该月可能遇到了什么特殊情况(如气象灾害导致葡萄收成不好等),导致高估了葡萄酒的销量。当预测不准时,不见得都是模型的问题,也有可能是数据的问题,这时需要从数据中发现问题,并进一步解决问题,预测的目的就是为了改变。有兴趣的读者还可以使用纵横两年的数据关系构建指标体系,有望对模型进一步优化。