开发适当的时间序列模型以根据过去一个月的记录预测销售额

机器算法验证 时间序列 预测
2022-03-26 04:43:54

我已经连续两年经营在线业务,所以我有大约两年的月度销售数据。我每个月的业务肯定会受到季节性波动的影响(圣诞节表现更好等),可能还有一些我不知道的其他因素。

为了更好地预测未来的销售,为了衡量我的销售活动的有效性或新竞争对手的影响,我希望能够开发一个合适的时间序列模型来将我当前的销售数据外推到未来。这样当我将我的预测结果与实际结果进行比较时,我就可以定量地测试我的销售活动的有效性,或者竞争对手的影响。

我的问题是,鉴于我有 2 年的销售数据,我是否可以为此制定预测时间序列模型?

注意:我对背景概念和理论更感兴趣,而不是黑盒工具。说到工具,我有 mathematica、matlab、R、Excel、Google 电子表格......你能想到的。

3个回答

是的,有办法做到这一点。人们靠做这样的事情谋生 ;-)

您正在寻找因果预测查看这本免费的在线预测教科书,了解预测方法。

您需要处理两个关键问题:一方面是季节性(或更一般地说,时间序列结构,可能带有自回归),另一方面是促销等因果效应。上面教科书中的第 8章处理ARIMA 上下文中的时间序列,而第 5 章处理因果效应。

令人高兴的是,可以通过计算所谓的 ARIMAX(X 代表“外部效应”,即具有外部效应的 ARIMA)模型或具有 ARIMA 误差的回归来解决这两个问题。请参阅Rob Hyndman 的博客文章“The ARIMAX model mudle”了解不同之处。R 包中的auto.arima()函数forecast将拟合带有 ARIMA 错误的回归。让我们来看一个示例,我在其中获取具有强烈趋势和季节性的标准数据集并添加“促销”。

library(forecast)
AirPassengers # a built-in dataset
#      Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
# 1949 112 118 132 129 121 135 148 148 136 119 104 118
# 1950 115 126 141 135 125 149 170 170 158 133 114 140
# 1951 145 150 178 163 172 178 199 199 184 162 146 166
# 1952 171 180 193 181 183 218 230 242 209 191 172 194
# 1953 196 196 236 235 229 243 264 272 237 211 180 201
# 1954 204 188 235 227 234 264 302 293 259 229 203 229
# 1955 242 233 267 269 270 315 364 347 312 274 237 278
# 1956 284 277 317 313 318 374 413 405 355 306 271 306
# 1957 315 301 356 348 355 422 465 467 404 347 305 336
# 1958 340 318 362 348 363 435 491 505 404 359 310 337
# 1959 360 342 406 396 420 472 548 559 463 407 362 405
# 1960 417 391 419 461 472 535 622 606 508 461 390 432

set.seed(1) # for reproducibility
promos <- rep(0,length(AirPassengers))
promos[sample(seq_along(AirPassengers),10)] <- 1
promos.future <- c(0,1,0,0,1,0,0,1,0,0,1,0)
AP.with.promos <- AirPassengers
AP.with.promos[promos==1] <- AP.with.promos[promos==1]+120

model <- auto.arima(AP.with.promos,xreg=promos)
summary(model) # examine the model - you'll see the estimated promo coefficient
# Series: AP.with.promos 
# ARIMA(0,1,1)(0,1,0)[12]                    

# Coefficients:
#           ma1    promos
#       -0.3099  122.2599
# s.e.   0.0947    2.2999

# sigma^2 estimated as 151.2:  log likelihood=-457.4
# AIC=920.79   AICc=920.98   BIC=929.42

# Training set error measures:
#                     ME     RMSE     MAE        MPE     MAPE      MASE         ACF1
# Training set 0.2682805 11.12974 8.24397 0.06139784 2.867274 0.1860814 0.0008326436

fcast <- forecast(model,xreg=promos.future,h=length(promos.future))
fcast
#          Point Forecast    Lo 80    Hi 80    Lo 95    Hi 95
# Jan 1961       447.1516 431.3951 462.9081 423.0542 471.2490
# Feb 1961       543.4115 524.2670 562.5559 514.1326 572.6904
# Mar 1961       449.1516 427.1345 471.1687 415.4793 482.8239
# Apr 1961       491.1516 466.5956 515.7076 453.5964 528.7068
# May 1961       624.4115 597.5556 651.2674 583.3389 665.4841
# Jun 1961       565.1516 536.1777 594.1255 520.8399 609.4633
# Jul 1961       652.1516 621.2044 683.0988 604.8220 699.4812
# Aug 1961       758.4115 725.6095 791.2135 708.2452 808.5778
# Sep 1961       538.1516 503.5942 572.7090 485.3006 591.0026
# Oct 1961       491.1516 454.9237 527.3795 435.7459 546.5573
# Nov 1961       542.4115 504.5869 580.2361 484.5637 600.2593
# Dec 1961       462.1516 422.7950 501.5082 401.9608 522.3424
promos.ts <- ts(c(AP.with.promos,fcast$mean),
                  start=start(AirPassengers),frequency=frequency(AirPassengers))
promos.ts[c(promos,promos.future)==0] <- NA

plot(fcast)
points(promos.ts,pch=19,col="red")

阿里麦克斯

红点是促销。默认情况下,您会得到以灰色绘制的预测区间。您可以通过xreg参数将多个回归量输入到模型中,如果您有不同类型的具有不同效果的促销活动,您应该这样做。做一点实验。

如果您有数据,我建议您查看比每月更细粒度的数据,例如每周。当然,如果您的促销活动没有持续整整几个月。您可以按产品单独执行此操作,尤其是在您宣传特定产品或整个类别时。

考虑到您对概念比对代码更感兴趣,另一种选择是查看指数平滑并通过将促销组件添加到标准的三个级别、季节和趋势组件来根据您的需要进行更改。与尝试最大似然估计 ARIMAX 模型相比,您自己可以使用指数平滑做更多的事情,但如果您有多种促销类型,平滑可能会变成一场簿记噩梦。

首先,您没有很多数据可以使用,只有 24 个观察值。在您的情况下,这意味着您几乎没有几个参数可以可靠地估计。预测中最系统的方法是提出数据生成过程(DGP)。你假设你的销售的真实过程是什么,然后尝试估计它的参数。

考虑一个带有 AR(1) DGP 的纯时间序列模型:xt=ϕxt1+c,即您本月的销售额是上月销售额的加权平均值加上一个常数。您已经有 3 个参数(两个系数和一个误差方差),这意味着每个参数大约有 8 个观察值 - 显然不是很多。

由于您的销售是季节性的,我们必须对此采取措施。一种方法是添加乘法季节性(1L)(1L12)xt=c以滞后运算符表示法,或以扩展形式:xt=c+ϕ1xt1+ϕ12xt12ϕ1ϕ12xr13. 这又增加了一个参数来估计,因此每个参数下降到 6 个观察值 - 一个真正的延伸。

在 Matlab 中这个模型被指定为arima('ARLags',1,'SARLags',12)

这是假设您的销售稳定,即一般不会增长。

如果您认为您的销售额正在增长,那么您有两种选择:随机游走 (RW) 和时间趋势。

在 Matlab RW 中指定为arima('D',1,'SARLags',12)

显然,这些只是不同 DGP 的示例。无论您做什么,都要记住要估计的参数数量。有 24 个观察值,您的模型必须非常简单,最多 4 个参数(包括方差)。

这是你应该做的制作两个图表:

  • 整个 24 个月的销售额与时间
  • 在第一年的基础上绘制第二年的销售额与时间

看他们。注释任何特殊促销或已知竞争活动的日期。“December”通常很明显,但如果有帮助,请添加注释。

继续并拟合一个时间序列模型 - 任何模型(有数百个)。该模型可能会为您提供比您的判断略好的下一个时期 (t+1) 的预测。至少,它会挑战你的判断力。在下一个时期 (t+n, n>1) 之后,任何时间序列模型都是废话。† 所以忘记定量评估销售活动的有效性或竞争对手的影响。如果您将实际销售额与预测进行比较,您会发现预测是胡扯。预测未来是困难的,没有任何方法可以改变这一基本事实。

你会发现你的两个图表更有用。研究一下这些,然后把剩下的时间花在想出如何增加销售额的想法上——这将比尝试拟合时间序列模型更有利可图地利用你的时间。

† 如果您可以创建基于领先指标的预测模型,您将更有希望- 即上个月的房屋销售可能有助于预测当月的窗帘销售。