预测商店销售
我们都曾与像ARIMA、指数平滑等传统的时间序列模型做过斗争,这些模型不是那么直观,而且很难用纯粹的统计术语来解释。
鉴于基于时间的销售数据,直觉上我们想到的是找出月度趋势、逐年趋势、日趋势、每周峰值等模式。因此,这促使我设计出一种方法,该方法可以分解时间序列以轻松地找到所有这些参数,并且还使我们能够以更简单和直观的方式对未来进行预测。
在这篇文章中,我们将使用Roseman Store Sales Kaggle Challenge从2013年1月到2015年6月的商店销售数据,时间跨度约为2.5年。
表1:商店XYZ的销售数据
创建流程
我们的目标是确定(分解)时间序列的不同组成部分,并将我们学到的知识转化为一个更简单、更直观的模型。
数据分析(EDA)
功能创建和平均销售计算
推导出模型的方程式
训练模型
分解时间序列的不同组成部分
使用分解的组件创建更简单直观的模型
模型的权重分析并使用它来获取其他有用的信息
结论
1.数据分析
让我们开始我们的旅程吧。我们有特定日期的商店销售,字段Open表示商店当天是否正常运作。商店XYZ周日仍然关闭。因此,只有当商店开放时,我们会考虑到这些日子。
商店销售在该时间段内的图形可视化。
用于可视化销售的代码
我们看到每年12月份都有明显的高峰。除此之外,多年来的下降趋势也是显而易见的。 2014年和2015年显示出类似的趋势,但与2013年相比有明显下降,一个好的方法应该能够捕捉这些变化。
接下来,我们将执行EDA以了解一周内的销售变化。
在一周内可视化销售的代码
在一周内的几天内存储的销售额
因为商店关闭,所以周日没有销售。我们可以在周六和周一看到明显的高峰。可能是由于周末的原因,周六增加了销售。同样,周日商店的非功能性可能导致周一销售增加。一个好的方法应该能够捕捉这些变化。
我们已经看到了12月份的销售高峰,但让我们用几个月的类似EDA重新确认我们的假设,就像我们对一周内几天的销售所做的那样。
代码可以在几个月内显示销售情况
门店月内销售额
另一件事,我们可以调查的是一个月内的销售模式。我有一种直觉,这不会是一个强有力的模式,一个月内几个星期的销售应该表现得相似。但是,为什么不测试一下呢?世界充满了惊喜,不是吗?我们将分析一周中每天的平均销售额。
在一个月内显示销售额的代码
一个月内销售数周
在一个月的周和后一周,销售额持续数天。一个随机的猜测可能是月底的工资和更多的人购物。
2.特征创建和平均销售额
每个日期可以按年、月、周和日标识。以这种方式表示日期的主要原因是找到每月、逐年、每日和每周趋势。
保持周数的原因一般是确定销售是否随着月份的进展而增加、减少或者根本不会影响很多,我们将其称为每周趋势。
此外,我们将删除商店保持关闭的数据点。周日,商店仍然会关闭。
执行功能创建和清理步骤后,数据看起来像
表2:数据概述
接下来,我们将执行年、月、日和周字段的单热编码。一种热编码是分类数据的二进制表示。作为此步骤的结果,我们将得到以下字段。
平均销售额
我们将从计算平均销售额开始。我们将用平均销售额表示它,有2.5年的数据,即2013年、2014年和2015年中期。由于2015年全年数据不可用,如果用于平均销售计算,则可能会增加噪音。我们仅使用2013年和2014年的销售数据来计算平均销售额。
avgSales 输出 4825.98
3.推导出模型的方程式
主要想法是找到每月、逐年、每日和每周的趋势。我们希望附加一个值,称为索引。因此,我们希望得出每月、逐年、每日和每周趋势指数。我们假设这些趋势对一天内的销售额负全部责任,超过我们上面计算的平均销售额(avgSales)。
模型方程(1)
我们有一个热门编码输入功能。一次只有一个月高或设置为1,一天、一周和一年。输入将处理它。因此,我们的输入方程被修改为:
模型方程(2)
让我们看看2014年5月17日模型方程的形式。在这种情况下,年份将是2014年,月份将是5月,周数将是3日,日期将是星期六,其他所有输入都是0,幂为0的系数为1。
模型的方程形式为2014年5月17日
我们将在两侧进行记录,以简化等式,并将其转换为易于应用线性回归的形式。我们将应用无拦截回归并采用模型系数的反对数来获得月度、年度、每日和每周趋势指数。
应用回归的模型方程
4.训练模型
这里的因变量是ln(Sales)-ln(avgSales),我们将使用基数2来记录。我们有一个商店的销售数据,从2013年1月到2015年6月约为2.5年。我们不会使用上个月的数据以验证模型的性能。
训练模型
接下来,我们将采用模型系数的反对数来获得相应的指数。
采用模型系数的反对数
年度指数
每月指数
日间指数
每周指数
5.从回归模型中学习以分解时间序列
年度趋势
时间序列的一个重要组成部分是逐年趋势。我们的模型所获得的年度指数在2013年明显高于2014年和2015年。捕获的年度指数将帮助我们从时间序列数据中分解年度趋势。让我们想象一下结果。
年度指数
年度趋势
多年来我们可以清楚地看到减少的趋势。下降趋势可能有很多原因,如商店质量下降或竞争对手商店开放等。需要进行更深入的分析才能找到,这将是一个有趣的发现。
每月趋势
时间序列的另一个重要组成部分是月度趋势,我们的模型所学的月度指数显然在12月份呈现出更高的趋势。它将帮助我们从时间序列数据中分解月度趋势。让我们想象一下结果。
每月指数
可视化月度趋势
每月趋势
日趋势
在EDA部分,我们分析了一周内的销售天数。我们看到周六和周一的销售额较高。模型学习的日期索引能够捕获这些模式。让我们想象一下结果。
可视化日常趋势
日趋势
每周趋势
在EDA部分,我们在一个月的周和后一周看到了一个小峰值。模型学习的每周索引能够捕获这种模式。让我们想象一下结果。
每周指数
可视化每周趋势
每周趋势
6.使用分解组件的简单直观模型
我们将使用上述学习设计一个新的、简单直观的模型,我们称之为乘法模型。终的模型方程将是:
模型方程(1)
将根据日期从计算表中使用annual_index,monthly_index,day_index和weekNbr_index。
系数表
使用上述模型对2015年9月21日进行预测。它将在2015年9月份的第3周进行
Sales = avgSales * Sep_index * 3rdWeek_index * 2015_index
= 4825.98 * 0.880 * 0.98 * 0.9425 = 3922.54
Prediction for Dec 31st, 2015? It falls on December month, 5th week and year 2015
Sales = avgSales * Dec_coefficient * 5thWeek_coefficient * 2015_index
= 4825.98 * 1.244 * 1.069 * 0.9425 = 6048.74
7.模型的质量分析,并使用它来获取其他有用的信息
同时,还训练了线性回归模型,其对特征的截距或对数没有任何约束。我们称之为Model-1和我们的乘法模型Model-2。我们针对50多家商店的3个月的未见数据测试了这两种模型。
大多数情况下,这两个模型在均方根误差方面表现同样好,具有相似的RMSE值。然而在某些情况下,Model-2是一个明显的赢家,与Model1相比,RMSE较低。一个可能的原因可能是域知识的提供,avgSales,不允许它过度拟合并且在看不见的数据上表现良好。
代码比较两个模型的性能
对于大多数情况,两种模型都表现相似
乘法模型(模型-2),商店39,85和88的明显赢家
乘法模型是胜利者
从Multipplicative模型中获取其他有用信息
一些关键信息和乐趣事实可以从乘法模型中轻松推导出来。比如,如果企业问我们能说什么,或者我们如何比较2014年5月和2014年11月的销售额。我们需要使用每月、每年、每天和每周索引的价值来回答这些问题。
2014年5月= may_index * 2014_index = 1.02 * 0.9879 = 1.007
2014年11月= nov_index * 2014_index = 1.051 * 0.9879 = 1.038
与2014年5月相比,2014年11月的销售额增加了多少
(1.038-1.007)/1.007 = 0.0307
因此,2014年11月的季节性比2014年5月多3.07%。我们可以对数年、数周、数天进行类似的比较,并从分解的预测模型中获得更清晰的图像。
8.结论
这篇博客文章的主要思想是调整传统模型来分解时间序列,并创建一个更简单直观的模型。