使用 ARIMA 模型进行销售预测

机器算法验证 时间序列 预测 有马
2022-04-13 12:07:56

我试图了解是否可以改进 ARIMA 模型。这是我的数据集(sales):

28.35, 51.89, 37.26, 48.22, 30.93, 43.54, 35.3, 59.45, 49.41, 65.61, 36.59, 51.25, 31.42, 53.16, 39.41, 64.45, 43.94, 79.36, 52.93, 74.99, 55.03, 86.93, 41.69, 62.77, 41.29, 59.95, 40.07, 66.13, 47.15, 85.12, 74.44, 76.42, 49.17, 82.66, 49.88, 70.98, 52.83, 75.85, 61.4, 85.2, 61.99, 90.68, 48.05, 74.2, 41.7, 68, 46.41, 82.23, 62.18, 88.65, 65.21, 100.9, 46.63, 83.53, 56.57, 108.87, 51.01, 80.15, 57.03, 87.91, 62.41, 96.11, 71.41, 82.08, 62.5, 88.52, 60.53, 100.15, 67.74, 111.88, 74.64, 138.64, 97.88, 153.88, 111.34, 176.4, 67.57, 111.95, 72.36, 118.85, 82.19, 136.88, 84.95, 160.58, 64.13, 111.32, 64.65, 113.82, 74.75, 118.76, 86.28, 166.36, 71.82, 119.83, 67.64, 116.17, 77.83, 130.64, 95.23, 149.84, 115.97, 189.69, 96.35, 137.51, 82.04, 139.19, 70.68, 135.22, 69.84, 105.7, 65.47, 111.47, 63.71, 108.23, 66.81, 117.96, 86.82, 141.74, 71.97, 122.65, 89.35, 133.97, 110.07, 159.18, 117.4, 196.9, 167.69, 244.75, 85.43, 135.54, 70.51, 118.3, 78.83, 139.85, 108.57, 162.66, 139.03, 203.72, 94.37, 135.92, 80.35, 128.63, 90.2, 157.56, 112.91, 177.07, 147.28, 221.67, 90.86, 142.66, 93.96, 157.89, 121.5, 200.35, 140.08, 306.36, 187.86, 171.39, 113.52, 174.2, 108.89, 170.53, 121.49, 193.65, 148.72, 210.61, 168.46, 250.4, 213.54, 181.78, 126.56, 190.46, 137.85, 226.25, 148.68, 235.04, 170.39, 275.04, 106.68, 163.24, 109.15, 186.46, 129.33, 156.18, 91.03, 159.87, 119.43, 164.51, 92.84, 145, 87.02, 156.55, 92.76, 140.93, 102.72, 143.41, 92.11, 159.72, 96.44, 156.98,
151.38, 221.12, 174.89, 242.53, 117.66, 163.44, 111.25, 169.58, 103.27, 163.09, 105.62, 186.64, 124.75, 145.65, 108.31, 165.3, 101.91, 156.55, 101.72, 147.11, 106.25, 185.68, 146.83, 192.05, 101.46, 153.65, 105.91, 170.1, 97.07, 165.05, 106.06, 167.25, 102.68, 197.21, 99.19, 169.58, 106.66, 196.44, 103.46, 165.62, 108.77, 188.32, 117.03, 241.48, 171.6, 189.78, 110.79, 166.22, 116.14, 229.75, 144.17, 205.75, 137.51, 216.51, 111.98, 186.34, 138.92, 218.35, 172.29, 271.53, 143.24, 272.35, 274.9, 232.97, 238, 234.88, 172.19, 260.82, 143.12, 217.38, 136.56, 209.91, 144.57, 253.58, 171.79, 264.78, 189.01, 298.97, 231.23, 315.29, 198.05, 318.52, 183.21, 232.33, 161.4, 261.82, 145.56, 218.09, 140.13, 215, 154.87, 293.88, 164.71, 256.85, 192.69, 306.87, 255.16, 382.27, 298.13, 438.22, 183.88, 279.56, 217.82, 371.55, 269.81, 383.89, 211.72, 330.02, 217.97, 312.64, 227.47, 329.25, 238.65, 363.8, 280.39, 453.38, 363.84, 486.65, 647.67, 534.41, 219.69, 292.16, 209.73, 336.33, 226.43, 336.23, 249.48, 359.84, 188.05, 307.73, 231.67, 330.43, 252.22, 379.3, 293.54, 413.67, 384.64, 515.86, 482.36, 438.12

sales = as.ts(sales, frequency=2)

每周两个数据。在这个时间序列中,我看到了季节性和趋势。如我错了请纠正我。经过对数变换以稳定方差:

sales.transformed <- log(sales)

给出的模型auto.arima是:

fit <- auto.arima(sales.transformed, seasonal=TRUE)
summary(fit)

    Series: sales.transformed 
    ARIMA(3,1,1) with drift         

Coefficients:
         ar1     ar2      ar3      ma1   drift
      0.2340  0.6310  -0.4893  -0.8913  0.0064
s.e.  0.0541  0.0471   0.0485   0.0407  0.0018

sigma^2 estimated as 0.03276:  log likelihood=96.98
AIC=-181.96   AICc=-181.71   BIC=-159.01

但是残差的行为不像白噪声:

res <- residuals(fit)
Acf(res, main="ACF of residuals")

然后我尝试了一个季节性的 ARIMA 模型。

fit <- Arima(sales.transformed, order=c(3,1,1), 
             seasonal=list(order=c(3,0,1), period=2))

情况正在好转:

Series: sales.transformed 
ARIMA(3,1,1)(2,0,1)[2]                    

Coefficients:
          ar1     ar2     ar3     ma1    sar1     sar2     sma1
      -1.3075  0.2398  0.5474  0.9721  0.0648  -0.0803  -0.7839
s.e.   0.0630  0.1221  0.1010  0.0401  0.0848   0.0657   0.0606

sigma^2 estimated as 0.02667:  log likelihood=131.05
AIC=-246.09   AICc=-245.65   BIC=-215.48

现在情况更好了。

ARIMA(5,1,0) with drift         
Box Cox transformation: lambda= 0 

Coefficients:
          ar1     ar2      ar3      ar4      ar5   drift
      -0.4224  0.0143  -0.2956  -0.0849  -0.3238  0.0015
s.e.   0.0516  0.0563   0.0541   0.0564   0.0516  0.0009

sigma^2 estimated as 0.001257:  log likelihood=649.72
AIC=-1285.44   AICc=-1285.1   BIC=-1258.65

在此处输入图像描述

鉴于我的时间序列,我不知道该模型是否可以改进,或者这是否是 ARIMA 可以做的最好的事情。我可能应该尝试使用自回归混合模型并添加新的预测变量......

任何建议将不胜感激。

2个回答

由于您的数据具有上升趋势,因此您的模型具有上升趋势是件好事。数据看起来呈指数级,因此使用对数变换是一个好主意。

但是,您的模型的方差似乎低于数据的方差。我会尝试更多的自回归值。例如 ARIMA(7,1,0)、ARIMA(9,1,0) 等。这可能会有所帮助。

您还可以在分析之前平均每 2 个数据点。这将每周产生一个数据点,并消除实际上并不那么有趣的短暂的、有规律的波动。(如果可能的话......)这应该会产生更好的预测。

此外,在根据实际数据绘制模型结果之前,请检查您是否反转了模型结果的对数转换。这可能是方差不匹配的原因。

我喜欢你寻找其他预测因子的想法。这可能有助于那些不遵循基本模式的异常点。

预测呈上升趋势,这似乎过于激进。

如果您不寻找或调整异常值,则您的模型不稳健。例如,周期 263、301、319、321、322 和 339 不遵循向上向下的模式。

一个具有双差分、一个 AR2 和一个单独的 AR1 的模型加上对上述异常值进行调整就可以了。模型随着时间的推移而变化,前 167 个参数与之后的参数不同,因此您可以使用 Chow 测试来识别这一点,并仅使用 168 及以后的数据。