使用OLS预测每两周一次的数据

时间:2018-07-03 12:14:07

标签: python time-series regression

我有两个月的客户销售数据,数据看起来像

Sales_date  Cigarette_sales
10/15/2015   2,783 
11/1/2015    385 
11/15/2015   536 
12/1/2015    768 
12/15/2015   413 
1/1/2016     182 
1/15/2016    529 
2/1/2016     398 
2/15/2016    22 
3/1/2016     65 
3/15/2016    603 
4/1/2016     759 
4/15/2016    64 
5/1/2016     391 
5/15/2016    669 
6/1/2016     833 
6/15/2016    516 
7/1/2016     480 
7/15/2016    260 
8/1/2016     252 
8/15/2016    689 
9/1/2016     119 
9/15/2016    812 
10/1/2016    275 
10/15/2016   425 
11/1/2016    132 
11/15/2016   26 
12/1/2016    170 
12/15/2016   321 
1/1/2017     349 
1/15/2017    102 
2/1/2017     155 
2/15/2017    117 
3/1/2017     99 
3/15/2017    812 
4/1/2017     441 
4/15/2017    51 
5/1/2017     210 
5/15/2017    625 
6/1/2017     42 
6/15/2017    333 
7/1/2017     460 
7/15/2017    1,580 
8/1/2017     632 
8/15/2017    441 
9/1/2017     80 
9/15/2017    723 
10/1/2017    209 
10/15/2017   377 
11/1/2017    493 
11/15/2017   475 
12/1/2017    252 
12/15/2017   735

由于要对时间序列数据进行线性回归,因此我们需要一个数字指标 时间段,因此我为DatetimeIndex创建了一个天变量,它只是我的训练数据集上从0开始的计数器

train ['days'] = range(len(train))

10/15/2015   2,783  0
11/1/2015    385    1
11/15/2015   536    2
12/1/2015    768    3
12/15/2015   413    4
1/1/2016     182    5
1/15/2016    529    6
2/1/2016     398    7
2/15/2016    22     8
3/1/2016     65     9
3/15/2016    603    10
4/1/2016     759    11
4/15/2016    64     12
5/1/2016     391    13
5/15/2016    669    14
6/1/2016     833    15
6/15/2016    516    16
7/1/2016     480    17
7/15/2016    260    18
8/1/2016     252    19
8/15/2016    689    20
9/1/2016     119    21
9/15/2016    812    22
10/1/2016    275    23
10/15/2016   425    24
11/1/2016    132    25
11/15/2016   26     26
12/1/2016    170    27
12/15/2016   321    28
1/1/2017     349    29
1/15/2017    102    30
2/1/2017     155    31
2/15/2017    117    32
3/1/2017     99     33
3/15/2017    812    34
4/1/2017     441    35
4/15/2017    51     36
5/1/2017     210    37
5/15/2017    625    38
6/1/2017     42     39
6/15/2017    333    40
7/1/2017     460    41
7/15/2017    1,580  42
8/1/2017     632    43
8/15/2017    441    44
9/1/2017     80     45
9/15/2017    723    46
10/1/2017    209    47
10/15/2017   377    48
11/1/2017    493    49
11/15/2017   475    50
12/1/2017    252    51
12/15/2017   735    52

当我尝试将OLS回归拟合为卷烟销量的天数

sales_lm4 = smf.ols(香烟销售〜天',data = salesdata).fit()

这是我的总结

部门。变量:香烟销售的R平方:0.001
型号:OLS调整。 R平方:-0.019
方法:最小二乘F统计量:0.03564
日期:2018年6月29日,星期五,概率(F统计):0.851
时间:8:51:28对数可能性:-73.31
观察值:52 AIC:150.6
Df残渣:50 BIC:154.5
DF型号:1
协方差类型:非稳健
    coef std err t P> | t | [0.025 0.975] 拦截19.3901 0.284 68.187 0 18.819 19.961 天0.0018 0.009 0.189 0.851 -0.017 0.021 综合:8.573达宾·沃森:1.795
概率(总括):0.014 Jarque-Bera(JB):8.209
偏斜:-0.959概率(JB):0.0165
峰度:3.331 61.8

即使我获取销售数据的日志,摘要统计信息也没有太大变化

sales_lm4 = smf.ols(log_cigarette_sales〜days',data = salesdata).fit()

部门。变量: log_cigarette_sales R平方: 0.002

型号: 最小二乘 调整R平方: -0.017

方法: 最小二乘 F统计: 0.1134

日期: 2018年7月3日星期二 概率(F统计): 0.738

时间: 09:29:19 对数似然: -76.756

不。观察结果: 53 AIC: 157.5

Df残留: 51 BIC: 161.5

Df模型: 1

协方差类型: 不稳健

海岸

std err

t

P> | t |

[0.025

0.975]

拦截 19.5629 0.284 68.799 0.000 18.992 20.134

天 -0.0032 0.009 -0.337 0.738 -0.022 0.016

Omnibus: 6.854 杜宾·沃森: 1.701

概率(综合): 0.032 Jarque-Bera(JB): 5.975

倾斜: -0.789 概率(JB): 0.0504

峰度: 3.462 条件。没有。 59.5

如何更好地修改此系列以生成一个具有良好的r平方和已调整的r平方值的良好模型。我在这里做错什么了?

1 个答案:

答案 0 :(得分:2)

在进行任何操作之前,先作图。很明显,2015年10月15日和2017年7月15日是异常值。从训练集中删除它们。

数据仍然波动很大。您有两种消除波动的方法:(a)进行移动平均,(b)查看累积数据。首先,如果您不按整个季节周期平均,则会引入偏差(此偏差可以在以后消除,但需要一些额外的计算)。因此,对于第一遍,我更喜欢保持数据尽可能原始。

获取累积数据[y(t) = x(t)+y(t-1)使波动消失(没有魔术,波动比趋势低一个数量级)。此处的图表几乎是线性的,表示稳定(稳定)的客户销售。线性回归告诉您,单循环是369.48,换句话说,每15天的销售额约为369.48。

然后您可以计算残差e(t)=x(t)-369.48,并在其中查找季节性。我看不到任何东西,但是请确保进行自相关。

所以您的最佳预测是369.48。

enter image description here