供应链需求预测理论篇
上一篇文章写到了安全库存的理论算法,安全库存的存在可以视为对现实的一种妥协,因为对未来的需求预测不准确,因为供应链不可靠,因为回货周期太长,而被迫设置安全库存,以一定比例额外库存的持有成本来对冲潜在的销售损失,如果上述几点能够提升,则安全库存就能相应的下降。
所以接下来总结一下供应链中的需求预测,需求预测并不等于销售预测,它是在销售预测的基础上结合实际经营情况得出的综合预估,决定在什么时间(When)采买多少数量(Quantity),我先从销售预测说起,而提到销售预测就必须先明确预测框架。
预测框架 - 销售预测所需要明确的约束条件
它至少应该覆盖以下几个角度: 预测的目标, 预测的精度, 预测的对象, 预测的时间段, 预测的数据需求。
预测的目标: 预测是为了解决什么问题? 是为了制定全年采购计划还是OTB,还是监控日常运营或者其它什么目的?
此文的预测目标是让回货决策更加精准,在最合适的时间采买最合适的数量。
预测的精度: 销售的变化有复杂的多方面原因的影响,我们基本不可能建立一个完美的模型将所有因子考虑在内,预测的本质就是不靠谱的,但是只要其结果能稳定地比人工预测来的准确,目标也就达到了。所以要先通过历史的回货订单数据复盘,来分析一下人工预测的准确率,以此为基准来衡量机器预测的效能。
接下来明确准确率如何计算,可以引入几个回归指标: MAD/RMSE/MAPE
e = error中位绝对偏差 - Mean Absolute Deviation (MAD)
各数据与平均值的离差的绝对值的平均数,对于数据集中异常值的处理比标准差更具有弹性,可以大大减少异常值对于数据集的影响
e = error均方根误差 - Root Mean Square of Error (RMSE)
描述预测值与实际值之间的偏差的离散程度
A = Actual Value平均百分比误差 - Mean Absolute Percent Error (MAPE)
MAPE是一个相对指标,不仅仅考虑预测值与真实值的误差,还考虑了误差与真实值之间的比例
计算示例:
下图是根据甜甜圈从周一到周五的预测销售与实际销售数据计算出来的三个指标
MAD = 54/5 = 10.8
RMSE = sqrt(126.8) = 11.3
MAPE = 104%/5 = 21%
预测的对象: 预测的对象可以是大盘销售,区域销售,品类销售,单品销售,也可以是区域维度,品类纬度,时间维度在各种粒度上的组合。
这里界定的对象是大盘头部单品销售,即针对销量最高的头部商品进行预测,前十分一的畅销sku宽度已经能贡献一半的销售,而长尾商品日均销过低,预测误差过大且价值也不大。最后还要考虑商品的交付周期(Lead Time)和生命周期(Life Cycle),我选择的是生命周期较长的交付周期一个月左右的百货类商品。
一般来说,预测粒度聚合度越高则结果越靠谱,预测品类销售比预测单品销售靠谱,预测区域销售比预测单店销售靠谱,预测一周销售比预测一天销售靠谱。最细的力度是单店单品单日的预测,这基本就是属于占卜算卦的范畴了。
预测的时间段: 预测有短期,中期,长期,短期最多不超过一年。针对供应链需求的预测可以选取不同商品的交付周期作为预测时间段,暂定我要预测的是单个商品未来一个月的销售。下图是时间段和目的之间的完整对应关系:
Forecasting Level预测的数据需求: 要求商品有一年的销售数据且覆盖一百个以上的门店。
商品销量变化的诱因
销售预测不是一个纯技术的算法问题,好的预测模型需要对业务逻辑有清晰深刻的洞察,这好比我们在求解一个多元函数,理解业务能帮助我们找到函数到底有哪些输入项,而算法的选择只是帮我们更快更准的解出这个方程,如果连input都没搞清楚,算法再精妙也得不出正确的output。
思考这个问题的时候可以先用一批商品销售数据(可比店范围内)生成趋势图进行观察,猜测可能的原因:
Case 1: 下图商品的销售在春节后呈现比较稳定的脉冲波形在矩形内震荡,周期性很规律,高点都是周末两日的销售。供应链的锯齿波节奏和波长也相对节奏稳定,表现不错,需求预测也相对容易。
Case 2: 下图的商品在八月中上旬的销售明显出现一段低洼,因为总仓库存从七月中开始缺货,水位触底后未能及时反弹,铺店数,门店库存,销售均快速下滑。另外六月一号出现一个spike, 因为玩具品类在儿童节(同时也是周六)表现会特别突出,可以是平日周六的两倍以上。
Case 3: 这个商品在六月进入了生命周期尾声,估计已经被打上了淘汰标签,可能有新款棉签作为替代,最后一次回货入仓在五月底,因为回货数量很高,因此销售则从八月才开始延后下滑。
总结一下主要的归因如下:
外因
a. 行业趋势的变化或者商品流行度的变化
b. 节假日的周期性波动,包括公众假期和周末
c. 季节性因素
内因
d. 缺货导致的影响,可能是补货单导致的总仓缺货,也可能是配发逻辑导致的门店缺货
e. 经营规模的变化例如开店和闭店
f. 商品生命周期,商品进入淘汰期不再回货或者有新的主推替代款(不过预淘汰款其实也不用预测销量了)
g. 经营策略的变化,品类占比和宽度的规划发生变更
h. 促销活动引发的销量变化
i. 营销推广计划带来的客流变化或者单品热度变化
以上这些因素对单品销量影响对于预测来说应该比算法的选型还要重要的多,需决定哪些归因是我们能够自动化融入模型的。
接下来了解一下目前实际运营过程中对于回货数量的判断逻辑
1. 对销售的预测基本就是拿商品过去[28天日均销]作为参考再加上人工决断
这样的估算方式对于销售预测来说,需要考虑未来的某个时间段内有多少个周末,有没有节假日,有没有促销活动,过去销售趋势是在上升还是下滑(虽然两者的日均销可能一样),依靠人工判断精度极难保证。
2. 下单时机的计算公式是[返单生产周期+保有天数+内部流程 - 当前库存的周转天数]
库存周转天数是否准确取决于对未来一段时间需求预估的进度。
3. 决策的频次是一周一次,每周检查一下所有商品的销售与库存变化决定是否要补货
如果系统自动化计算完全可以将每周一次缩减到每天一次
4. 下单深度是在[下单天数*预测日均销*铺货店数]与[最小起订量]两者间取大值。
店铺的单品销量差异明显,如果仅以铺货门店的数量来推导下单数量就比较粗犷了。可以初步细分一下,针对品类和店群维度计算出一个店群品类销售指数作为权重在来推算需求总量。
需求预测模型如何完善
1. 引入日系数
可以根据完整自然年的销售数据测算出每天在全年的销售占比,这应该能覆盖公众假期和周末带来的销售波动影响。如果销售数据拆到品类,也能覆盖季节性影响。
商品在一个自然年中的销量走势由随机波动+周期性波动+增长趋势拟合而成,我们可以把周期性因子提取出来生成日系数,这是一个时间序列的分解(Decomposition)过程。对于单品销售预测这个场景来说,日系数要拆到最小类目上,比如针对牙刷就要提取口腔清洁品类的日系数。
2. 在训练集中找到异常缺货时段,修复数据将缺货损失的销售还原
采用有效日均销进行修复减少铺店和单店库存不足最小陈列量的销售损失。
3. 剔除离群点,明显异常的单日数据要消除
异常数据最有可能是团购大单带来的销量暴增,可能是区域性断网影响收银之类带来的销售下滑。
4. 引入店群品类销售指数
简单的用计划铺店数乘以日均销只关注了门店的数量却忽略了每个门店对于某商品销量的巨大差异,可以针对单品所属的品类来计算历史销售数据中每个门店的品类销售指数,以此进行店群划分,计算每个店群的单品日均销,但是未来要铺货的门店和历史有此单品销售的门店是不一样的,所以计划铺货的目标门店可以再次用品类销售指数分群,每个店群内的门店数乘以店群单品日均销,再累加起来得出全局的预估销量。
5. 打通全年的营销日历和促销日历,前提是营销计划和促销计划至少有三个月的提前量,根据活动等级可以人为设一个权重参数。
6. 打通渠道的开店与闭店计划,以新开店预估的销售目标和老店的实际销售数据来计算销售占比权重。
以上1/2/3/4比较容易实施,5/6依赖于成熟的运营体系,能前瞻的制定好较为精确的季度促销日历/营销日历和季度的开闭店计划,且实现这些数据的系统化和一体化。
References:
Introduction to Demand Planning & Forecasting
Extracting Seasonality and Trend from Data: Decomposition Using R