通俗易懂学习:以简单直观的方式分解时间序列

点击上方关注,All in AI中国

通俗易懂学习:以简单直观的方式分解时间序列

预测商店销售

我们都曾与像ARIMA、指数平滑等传统的时间序列模型做过斗争,这些模型不是那么直观,而且很难用纯粹的统计术语来解释。

鉴于基于时间的销售数据,直觉上我们想到的是找出月度趋势、逐年趋势、日趋势、每周峰值等模式。因此,这促使我设计出一种方法,该方法可以分解时间序列以轻松地找到所有这些参数,并且还使我们能够以更简单和直观的方式对未来进行预测。

在这篇文章中,我们将使用Roseman Store Sales Kaggle Challenge从2013年1月到2015年6月的商店销售数据,时间跨度约为2.5年。

通俗易懂学习:以简单直观的方式分解时间序列

表1:商店XYZ的销售数据

创建流程

我们的目标是确定(分解)时间序列的不同组成部分,并将我们学到的知识转化为一个更简单、更直观的模型。

  1. 数据分析(EDA)
  2. 功能创建和平均销售计算
  3. 推导出模型的方程式
  4. 训练模型
  5. 分解时间序列的不同组成部分
  6. 使用分解的组件创建更简单直观的模型
  7. 模型的权重分析并使用它来获取其他有用的信息
  8. 结论

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.结论

这篇博客文章的主要思想是调整传统模型来分解时间序列,并创建一个更简单直观的模型。

通俗易懂学习:以简单直观的方式分解时间序列

编译出品



分享到:


相關文章: