一、整体框架
零售业务中需求预测是一个意义重大且极具挑战性的问题。一方面,如果能准确预测出未来的需求,那么它将作为最可靠的依据,帮助公司精准决策;另一方面,未来的需求受到很多不确定因素(比如用户群体、市场推广、营销计划甚至天气等因素)的影响,导致准确的需求预测非常困难。
需求预测是一个典型的“回归”(Regression)问题。算法可以通过历史数据,以真实销量作为数据样本,不断调整模型参数,自动的学习到预测的最优解。
下图为马尔科夫随机链路作为基础的销量预测模型:
这里,作为一种全品类、低计算复杂度的一种方案,我们的预测模型经历了从均值模型,到马尔科夫模型,再到融合模型的一系列优化,最终在我们的预测线上系统中取得了理想的结果。
下面我们对框架中除数据预处理外的其他部分进行介绍。
二、模型介绍
2.1 均值模型
顾名思义,均值模型对历史一段时间的销量求均值,并作为未来每个时刻的需求预测:
构建均值模型还具有以下两个重要意义:
-
均值模型为需求预测提供了准确率的基线。如果要从0到1构建一个预测模型,第一步不是去构建一个复杂的模型,而是先看看简单的预测能达到什么样的准确率,作为后续模型迭代评估的标准。
-
均值模型为预测值提供了合理的尺度。一般来说,某个单品的需求都在某个范围之内波动(促销和缺货除外)。需求不可能短时间激增,也不可能短时间骤减。因此这个波动的范围就是该单品需求的“尺度”,它可以通过均值模型简单得出。
虽然,均值模型比较简单,但是在实际应用中也能达到一定的效果,特别是在针对销量比较稳定的商品进行预测时:
但是,从均值模型的预测结果可以发现,针对销量波动比较大的商品,均值模型往往会出现预测滞后的特点:
均值模型预测滞后性
因此,我们考虑根据商品需求的频繁度和稳定性对商品进行分类,然后针对特点的商品使用不同的模型。
2.2 商品分类
根据需求频繁度和需求稳定性两个定量指标,将商品分为短尾、中尾、长尾三类:
需求频繁度
ABC分类法是根据帕雷托法则(Pareto's law)演化而来的。帕雷托法则也就是我们常说的80/20法则,即80%的结果取决于20%的原因。而在ABC分类法中,80%库存价值来源于20%的存货。
ABC库存分类管理法是指将库存物品按品种和占用资金的多少,分为特别重要的库存(A类) 、一般重要的库存(B类) 和不重要的库存(C类) 三个等级,然后针对不同等级分别进行管理与控制,这样的分类管理法可以实现的作用有:压缩库存总量,释放占压资金,库存合理化与节约管理投入等。
需求稳定性
我们根据商品日销量的离异系数(需求波动系数)判断需求是否稳定,下图为某门店所有商品离异系数的分布:
下面是结合ABC分类法与需求波动系数对商品进行归类的示例:
2.3 马尔科夫模型
针对均值模型对需求波动大的商品具有预测滞后性的问题,我们提出了一种基于马尔科夫模型的改进方法,该方法的出发点是认为商品销量往往是在一个水平上进行上下波动的,并且波动的量与近期波动量相近,具有有一定规律性,比如商品处于销量波峰时后续销量往往会有更大的概率会降低,而销量处于波谷时后续销量往往会有更大的概率会提高,下图为某商品一段时间的销量情况:
七日销量序列
我们按照一定的规则将其转换为销量状态序列:
商品销量状态转换表
七日销量状态序列
可以看到状态序列图中,状态之间的转换具有一定规律性,根据商品销售历史数据我们可以学习到商品状态之间的转换概率:
下图为根据改进模型进行预测的结果,可以看到相比均值模型,改进模型对于波峰波谷的预测比均值模型更好,没有出现明显的滞后性。
七日销量预测结果与实际销量对比
2.4 模型融合
由于基于马尔科夫模型的改进方法需要基于一定长度的历史销量数据学习销量状态之间的转移概率矩阵,对于销售天数较小的商品可能预测不准确,因此我们将均值模型与改进模型进行融合,融合的方式为两种模型分别在商品的相同历史数据上进行测试,选择测试指标更好的模型作为后续预测的模型,这种融合方式既可以解决基于马尔科夫模型的改进方法对销售天数少的商品预测不准确的问题,同时随着历史销售数据的积累,后续可以自动转换为基于马尔科夫模型的改进方法。
2.5 销量序列分解
不管是均值模型还是基于马尔科夫模型的改进模型,预测时都依赖近期的历史销量数据,在我们进行数据分析和建模过程中发现,节假日、促销等往往会带来销量的异常波动,如下图所示为某商品的销量序列
原始日销量序列
可以看到序列中存在多个明显异常的销量,并且这几个异常销量和门店促销及节假日完全吻合,因此在进行建模前我们首先将原始销量序列分解为正常销量序列和节假日/促销等非正常销量序列:
正常日销量序列
节假日、促销等非正常日销量序列
2.6 正常日销量序列
(1)基于均值模型的销量预测 (2)基于马尔可夫模型的销量预测 (3)模型融合
2.7 节假日、促销销量预测
三、模型效果
总体效果
类别效果
作者:宋亚军、马秦宇、陈鹏飞