南瓜香料时间序列分析 (Nánguā xiāngliào shíjiān xùliè fēnxī)

南瓜香料时尚趋势分析 (Nánguā xiāngliào shíshàng qūshì fēnxī)

穿上最舒适的宽松毛衣,拿起你最喜欢的热饮料,让我们来编程。

Photo by Nathan Dumlao on Unsplash

在北半球又到了那个时候 —— 苹果、南瓜和各种肉桂、豆蔻、生姜、甘草和丁香的组合。随着杂货店开始准备万圣节、感恩节和冬季假期,这是一个很好的时机来复习我的统计建模技巧。抓住你的调味拿铁,让我们做一些以函数为导向的季节建模。完整的代码笔记本可以在这里找到。

假设:

“南瓜香料”作为一个在美国的谷歌搜索词,在美国秋季假日和季节性食品菜肴相关联,其受欢迎程度将具有强烈的季节性。

零假设:

使用上周或去年的数据将更能预测“南瓜香料”搜索词的本周受欢迎程度。

数据:

来自Google Trends的过去5年数据,于2023年10月7日拉取。 [1]

迭代建模方法:

  • 制作一个简单的模型,其中上周/去年的数据是本周的预测值。具体来说,我的最终模型不能在真空中准确或不准确。我的最终模型必须优于使用历史数据作为直接预测的情况。
  • 训练测试分离将给我两组数据,一组用于算法学习,另一组用于测试算法性能。
  • 通过季节分解大致了解数据的可预测性,尝试将年度总体趋势与季节模式和噪声分离开来。较小尺度的噪声意味着算法可以捕捉更多的数据。
  • 一系列统计检验来确定数据是否平稳。如果数据不平稳,我需要进行差分操作(运行时间差函数,每个时间间隔的数据仅显示与上个时间间隔的数据的差异,这将强制数据变得平稳)。
  • 制作一些SARIMA模型,使用自相关图对移动平均项进行推断,使用偏自相关图对自回归项进行推断。SARIMA是时间序列建模的首选方法,我将在尝试ACF和PACF推断之前尝试使用Auto Arima的蛮力方法。
  • 尝试使用Auto Arima,它将迭代许多项并选择最佳的项组合。我希望通过实验了解它为SARIMA模型提供的参数是否会产生更好的性能。
  • 尝试使用ETS模型,根据季节分解的推断来确定x在时间上是加法还是乘法。ETS模型更加注重季节性和总体趋势,而不是SARIMA家族模型,当捕捉南瓜香料与时间的关系时,ETS模型可能会给我带来优势。

性能绘图KPIs:

  • 尝试使用MAPE分数,因为它是许多工作场所的行业标准,人们可能已经习惯了它。这个评分容易理解。
  • 尝试使用RMSE分数,因为它更有用。
  • 将预测结果与测试数据进行绘图,并通过视觉检查性能。

数据审查:

Image by the author.

从上图可以看出,这些数据显示了季节建模的巨大潜力。每年下半年有明显的峰值,然后逐渐减小,再出现另一个峰值,然后降至基准线。

然而,除了2021年,每年的主要峰值都比去年大,这是有道理的,考虑到大流行,人们可能没有将庆祝季节放在心上。

导入:

注意:这些导入在笔记本中显示形式不同,因为我在笔记本中依赖于seasonal_mod.py,里面有许多我已经导入的模块。

作者提供的图像。

以下是我用来创建代码笔记本的库。针对时间序列问题,我选择使用statsmodels而不是scikit-learn,因为我更喜欢statsmodels来解决大多数线性回归问题。

基于函数的代码方法:

我不知道你们怎么看,但我不想每次创建新模型时都写几行代码,然后再写更多代码来验证。因此,我使用了一些函数来保持我的代码DRY,并防止自己犯错。

作者提供的图像。

这三个小函数一起工作,所以我只需要运行metrics_graph(),并将y_truey_preds作为输入,它会给我一个蓝色线条表示真实数据,一个红色线条表示预测数据,还会显示MAPE和RMSE。这将节省我时间和麻烦。

使用去年的数据作为成功的基准:

我在零售管理方面的经验使我决定尝试使用上周的数据和去年的数据直接预测今年的数据。在零售业中,我们经常使用上个季节(1个时间单位之前的)的数据作为直接预测,以确保在黑色星期五期间有足够的库存。然而,上周的数据的表现不如去年的数据。

作者提供的图像。

使用上周的数据预测本周的数据的MAPE得分略高于18,RMSE约为11。相比之下,使用去年的数据直接预测今年的数据,MAPE得分约为12,RMSE约为7。

作者提供的图像。

因此,我选择将我建立的所有统计模型与使用去年的数据的简单模型进行比较。这个模型能够更准确地预测峰值和下降的时间,但我仍然觉得我可以做得更好。建模的下一步是进行季节分解。

下面的函数帮助我运行季节分解,并将其作为可重用的代码保存以供将来的建模使用。

作者提供的图像。

以下是我如何使用季节分解。

作者提供的图像。

加法模型在残差中有一个重复出现的年度模式,证明加法模型不能完全分解所有重复模式。这是尝试使用乘法模型来处理年度峰值的一个很好的理由。

作者提供的图像。

现在,乘法分解的残差更有希望。它们更随机且尺度更小,说明乘法模型最能捕捉到数据。残差的尺度在1.5到-1之间,表示建模前景广阔。

现在,我想要一个专门用于运行SARIMA模型的函数,仅需输入顺序即可。我还想尝试运行具有这些顺序的SARIMA模型的c,tct版本,因为季节性分解倾向于使用乘法模型而不是加法模型。通过在trend = 参数中使用c,t和ct,我能够将乘数添加到我的SARIMA模型中。

图片由作者提供。

我将跳过描述我查看AFC和PACF图的部分以及试用PMD自动ARIMA找到在SARIMA模型中使用的最佳项的部分。[如果您对这些细节感兴趣,请查看我的完整代码笔记本。](https://github.com/casanave/Pumpkin_Spice/blob/main/Pumpkin_Spice.ipynb)

我最好的SARIMA模型:

图片由作者提供。

所以,我的最佳SARIMA模型的MAPE得分比我的纯天真模型高,从将近29提高到将近12,但RMSE降低了约1个单位,从将近7降低到将近6。我对使用这个模型的最大问题是它在2023年的高峰期真的预测不足,从2023年8月到9月的红线和蓝线之间有很大的区域。在RMSE与MAPE的观点上,该模型可能被认为比我的年度纯天真模型更好或更差,这取决于您的观点。然而,我还没有完成。我的最终模型明显优于我的年度纯天真模型。

最终模型:

我最终使用了ETS(指数平滑)模型,这使我可以明确使用seasonal参数以实现乘法方法。

图片由作者提供。

现在你可能会想:“但是这个模型的MAPE得分高于年度纯天真模型。”您是对的,差距约为0.3%。然而,考虑到现在我有了大约4.5的RMSE而不是7,我认为这是一个相当公平的交换。虽然相对于我的最佳SARIMA模型,该模型在2022年12月的表现稍差,但它与2023年秋季的更大波峰相比,它的波动范围更小,而我更关心后者。您可以在这里找到该模型。

进一步验证:

我将等到2024年10月7日进行另一次数据抓取,并查看该模型对去年数据的表现。

结论:

总之,我能够证明原假设是错误的,我的最终模型优于纯天真的年度模型。我证明了谷歌上的南瓜香料流行非常季节性,并且可以进行预测。在纯天真模型、SARMA模型和ETS模型之间,ETS能更好地捕捉时间和南瓜香料流行之间的关系。南瓜香料与时间之间的乘法关系意味着南瓜香料的流行基于除时间外的一个以上的独立变量表达式time * unknown_independant_var = pumpkin_spice_popularity。

我学到了什么以及未来的工作:

我的下一步是使用某个版本的[Meta的图形API](https://developers.facebook.com/docs/instagram-api/)来寻找在商业文章中使用“pumpkin spice”的情况。我想知道那些数据与我在谷歌趋势数据中的数据是否相关。我还了解到,当季节性分解指向乘法模型时,在我的流程中,我会更快地使用ETS模型。

此外,我对自动化大部分过程很感兴趣。理想情况下,我希望构建一个Python模块,其输入直接来自谷歌趋势的CSV,并且输出可以是可用的模型,并具备足够好的文档,以至于非技术用户可以创建和测试自己的预测模型。在用户选择难以预测的数据(例如纯天真或随机游走模型更合适)的可能性下,我希望构建该模块来向用户解释。然后,我可以收集使用该模块的应用程序中的数据,以展示对大量未经测试的数据的季节性发现。

明年南瓜香料季节时,请留意那个应用程序!

[1] 谷歌趋势, N/A (https://www.google.com/trends)