使用许多零条目预测每日时间序列销售收入

机器算法验证 时间序列 预测 有马 零通胀 克罗斯顿法
2022-04-06 15:33:55

我一直在尝试预测不同产品组的销售收入(显示的销售收入每天汇总所有产品,例如具有不同价格的智能手机作为一组),但还没有找到正确的方法。我几乎是时间序列分析/预测和使用 Python 的新手。我尝试使用 (S)ARIMA,但没有得到有意义的结果。我认为主要问题是我的数据太稀疏,我只有大约一年半的数据点。最重要的是,时间序列波动很大。我的假设是否正确,即 ARIMA 对像我这样的数据结构有问题?(因为它使用系列的平均值?)

顶部图像是“更好”的时间序列之一,底部图像是“平均”时间序列之一。我尝试重新采样每周数据,然后我认为预测更合适,但我失去了一周平均的一些信息。对于底部示例,每周数据仍然不足以使用 ARIMA。如果可能的话,我宁愿使用每日数据。最后,我想添加外生特征,如星期几、天气、促销等

鉴于我的数据的计数性质,我有哪些选择?我真的很感激一些指示。我的研究导致了“克罗斯顿方法”。它适合我的问题吗?我需要将我的 $ 更改为销售数字吗?是否有用于 croston 的 Python 包,还是我必须使用 R?任何帮助深表感谢。

销售收入产品组 2

粘贴数据

编辑

澄清不同的时间序列代表什么:两者都是不同的产品组(我有大约 10-20 个)。而我更感兴趣的预测(因为我的大部分数据看起来都是这样)是最底层的。

我为底部时间序列做了更多准备。

from statsmodels.tsa.stattools import adfuller
series = dataframe["Sales Revenue2"]
X = series.values
result = adfuller(X)

(-1.3334675205365911,
 0.6137252422831784,
 15,
 267,
 {'1%': -3.4550813975770827,
  '10%': -2.5725712007462582,
  '5%': -2.8724265892710914},
 3623.772858172633)

所以时间序列不是静止的。

现在使用分解:

 from statsmodels.tsa.seasonal import seasonal_decompose
 result = seasonal_decompose(dataframe["Sales Revenue2"], model='additive')
 fig = result.plot()
 plt.show()

分解(第二个)时间序列

老实说,我还没有想出 100% 的分解。由于模式每 7 天重复一次,图片是否显示我每周有季节性?

接下来看看 ACF 和 PACF

ACF 原始(第二)时间序列

模式告诉我什么?

PACF 原始(第二)时间序列

然后?

我也试图区分时间序列并得到

def difference(dataset, interval=1):
    diff = list()
    for i in range(interval, len(dataset)):
        value = dataset[i] - dataset[i - interval]
        diff.append(value)
    return diff

PACF 看起来很时髦。(负值在 conf 区间外从 41 增加到 48 到 -1,然后在 49 处跳到正 3,之后缓慢下降) ACF 在 conf 区间内,除了 1 阶的负值

我的下一步是尝试使用 auto.arima(在 Python 中)

我试过 m=7,对于每周的季节性?和不同的起始值。

我不明白为什么那些是最适合的订单?这与我的第一个 ACF/PACF 相比如何 - 我是否需要 dif t=7 才能看到该顺序的真正 ACF、PACF?

阿里玛 204 x 0117 阿里玛 006 x 0117

我还尝试在没有季节性趋势设置 m=1 的情况下进行拟合。

最让我恼火的是顺序 (1,1,1) 非常接近 阿里玛 111 x 0001

到没有季节性的最佳模型 (12,1,1)(该顺序如何组合在一起?) 3743 与 3738 相比的 AIC

如果有人可以指导我了解我的结果,我将不胜感激。我可以使用 ARIMA 来预测我拥有的数据吗?新的结果看起来还不错。我得到的结果大多与上一个例子相似,只是在平均值附近。但是我之前是逐步使用的,现在我明确地尝试了更高的订单。如果我的非零值更少怎么办。我的方法是将时间序列转换为计数数据的方法是什么?

再次感谢!

(由于我没有足够的声誉,我不得不剪掉一些图表。第一个时间序列现在已经消失了,因为它并没有真正关注我的主题 - 我只是想展示一个比较。我还必须剪掉差异 ACF和PACF

2个回答

我需要将我的 $ 更改为销售数字吗?

理想情况下是的。由于这不是一个独特的产品,我怎么知道 600美元是一个 600美元的单位还是 2 300 美元的单位?

是否有用于 crostons 的 Python 包,还是我必须使用 R?

现在,对于 Croston 和类似的间歇性方法,没有任何好的 R 包。R 提供了更好的选择。

我的假设是否正确,即 ARIMA 对像我这样的数据结构有问题?

要看。ARIMA 可能适用于顶部图中的数据,但它不适用于底部图中的数据(或任何比这更稀疏的数据)。

Croston 及其较新的版本(TSB 等)是更好的选择。但是您需要记住,这些方法不会像 ARIMA 或 ETS 那样产生正常的预测。他们预测销售率(或速度),然后可以使用它来计算很长一段时间内的平均销售量。

您还应该查看计数预测方法,例如负二项分布和泊松分布。

我最近遇到了与您类似的时间系列的相同问题,不断尝试不同的模型,但最适合此类系列的模型是使用具有超参数优化和一些滞后功能的XGboost