上一篇文章寫到了安全庫存的理論算法,安全庫存的存在可以視為對現(xiàn)實的一種妥協(xié),因為對未來的需求預測不準確,因為供應鏈不可靠,因為回貨周期太長,而被迫設置安全庫存,以一定比例額外庫存的持有成本來對沖潛在的銷售損失,如果上述幾點能夠提升,則安全庫存就能相應的下降。
所以接下來總結(jié)一下供應鏈中的需求預測,需求預測并不等于銷售預測,它是在銷售預測的基礎上結(jié)合實際經(jīng)營情況得出的綜合預估,決定在什么時間(When)采買多少數(shù)量(Quantity),我先從銷售預測說起,而提到銷售預測就必須先明確預測框架。

預測框架 - 銷售預測所需要明確的約束條件
它至少應該覆蓋以下幾個角度: 預測的目標, 預測的精度, 預測的對象, 預測的時間段, 預測的數(shù)據(jù)需求。
預測的目標: 預測是為了解決什么問題? 是為了制定全年采購計劃還是OTB,還是監(jiān)控日常運營或者其它什么目的?
此文的預測目標是讓回貨決策更加精準,在最合適的時間采買最合適的數(shù)量。
預測的精度: 銷售的變化有復雜的多方面原因的影響,我們基本不可能建立一個完美的模型將所有因子考慮在內(nèi),預測的本質(zhì)就是不靠譜的,但是只要其結(jié)果能穩(wěn)定地比人工預測來的準確,目標也就達到了。所以要先通過歷史的回貨訂單數(shù)據(jù)復盤,來分析一下人工預測的準確率,以此為基準來衡量機器預測的效能。
接下來明確準確率如何計算,可以引入幾個回歸指標: MAD/RMSE/MAPE
中位絕對偏差 - Mean Absolute Deviation (MAD)
各數(shù)據(jù)與平均值的離差的絕對值的平均數(shù),對于數(shù)據(jù)集中異常值的處理比標準差更具有彈性,可以大大減少異常值對于數(shù)據(jù)集的影響

均方根誤差 - Root Mean Square of Error (RMSE)
描述預測值與實際值之間的偏差的離散程度

平均百分比誤差 - Mean Absolute Percent Error (MAPE)
MAPE是一個相對指標,不僅僅考慮預測值與真實值的誤差,還考慮了誤差與真實值之間的比例

計算示例:
下圖是根據(jù)甜甜圈從周一到周五的預測銷售與實際銷售數(shù)據(jù)計算出來的三個指標


MAD = 54/5 = 10.8
RMSE = sqrt(126.8) = 11.3
MAPE = 104%/5 = 21%
預測的對象: 預測的對象可以是大盤銷售,區(qū)域銷售,品類銷售,單品銷售,也可以是區(qū)域維度,品類緯度,時間維度在各種粒度上的組合。
這里界定的對象是大盤頭部單品銷售,即針對銷量最高的頭部商品進行預測,前十分一的暢銷sku寬度已經(jīng)能貢獻一半的銷售,而長尾商品日均銷過低,預測誤差過大且價值也不大。最后還要考慮商品的交付周期(Lead Time)和生命周期(Life Cycle),我選擇的是生命周期較長的交付周期一個月左右的百貨類商品。

一般來說,預測粒度聚合度越高則結(jié)果越靠譜,預測品類銷售比預測單品銷售靠譜,預測區(qū)域銷售比預測單店銷售靠譜,預測一周銷售比預測一天銷售靠譜。最細的力度是單店單品單日的預測,這基本就是屬于占卜算卦的范疇了。
預測的時間段: 預測有短期,中期,長期,短期最多不超過一年。針對供應鏈需求的預測可以選取不同商品的交付周期作為預測時間段,暫定我要預測的是單個商品未來一個月的銷售。下圖是時間段和目的之間的完整對應關系:

預測的數(shù)據(jù)需求: 要求商品有一年的銷售數(shù)據(jù)且覆蓋一百個以上的門店。
商品銷量變化的誘因
銷售預測不是一個純技術的算法問題,好的預測模型需要對業(yè)務邏輯有清晰深刻的洞察,這好比我們在求解一個多元函數(shù),理解業(yè)務能幫助我們找到函數(shù)到底有哪些輸入項,而算法的選擇只是幫我們更快更準的解出這個方程,如果連input都沒搞清楚,算法再精妙也得不出正確的output。
思考這個問題的時候可以先用一批商品銷售數(shù)據(jù)(可比店范圍內(nèi))生成趨勢圖進行觀察,猜測可能的原因:
Case 1: 下圖商品的銷售在春節(jié)后呈現(xiàn)比較穩(wěn)定的脈沖波形在矩形內(nèi)震蕩,周期性很規(guī)律,高點都是周末兩日的銷售。供應鏈的鋸齒波節(jié)奏和波長也相對節(jié)奏穩(wěn)定,表現(xiàn)不錯,需求預測也相對容易。

Case 2: 下圖的商品在八月中上旬的銷售明顯出現(xiàn)一段低洼,因為總倉庫存從七月中開始缺貨,水位觸底后未能及時反彈,鋪店數(shù),門店庫存,銷售均快速下滑。另外六月一號出現(xiàn)一個spike, 因為玩具品類在兒童節(jié)(同時也是周六)表現(xiàn)會特別突出,可以是平日周六的兩倍以上。

Case 3: 這個商品在六月進入了生命周期尾聲,估計已經(jīng)被打上了淘汰標簽,可能有新款棉簽作為替代,最后一次回貨入倉在五月底,因為回貨數(shù)量很高,因此銷售則從八月才開始延后下滑。

總結(jié)一下主要的歸因如下:
外因
a. 行業(yè)趨勢的變化或者商品流行度的變化
b. 節(jié)假日的周期性波動,包括公眾假期和周末
c. 季節(jié)性因素
內(nèi)因
d. 缺貨導致的影響,可能是補貨單導致的總倉缺貨,也可能是配發(fā)邏輯導致的門店缺貨
e. 經(jīng)營規(guī)模的變化例如開店和閉店
f. 商品生命周期,商品進入淘汰期不再回貨或者有新的主推替代款(不過預淘汰款其實也不用預測銷量了)
g. 經(jīng)營策略的變化,品類占比和寬度的規(guī)劃發(fā)生變更
h. 促銷活動引發(fā)的銷量變化
i. 營銷推廣計劃帶來的客流變化或者單品熱度變化
以上這些因素對單品銷量影響對于預測來說應該比算法的選型還要重要的多,需決定哪些歸因是我們能夠自動化融入模型的。
接下來了解一下目前實際運營過程中對于回貨數(shù)量的判斷邏輯
1. 對銷售的預測基本就是拿商品過去[28天日均銷]作為參考再加上人工決斷
這樣的估算方式對于銷售預測來說,需要考慮未來的某個時間段內(nèi)有多少個周末,有沒有節(jié)假日,有沒有促銷活動,過去銷售趨勢是在上升還是下滑(雖然兩者的日均銷可能一樣),依靠人工判斷精度極難保證。
2. 下單時機的計算公式是[返單生產(chǎn)周期+保有天數(shù)+內(nèi)部流程 - 當前庫存的周轉(zhuǎn)天數(shù)]
庫存周轉(zhuǎn)天數(shù)是否準確取決于對未來一段時間需求預估的進度。
3. 決策的頻次是一周一次,每周檢查一下所有商品的銷售與庫存變化決定是否要補貨
如果系統(tǒng)自動化計算完全可以將每周一次縮減到每天一次
4. 下單深度是在[下單天數(shù)*預測日均銷*鋪貨店數(shù)]與[最小起訂量]兩者間取大值。
店鋪的單品銷量差異明顯,如果僅以鋪貨門店的數(shù)量來推導下單數(shù)量就比較粗獷了??梢猿醪郊毞忠幌拢槍ζ奉惡偷耆壕S度計算出一個店群品類銷售指數(shù)作為權重在來推算需求總量。
需求預測模型如何完善
1. 引入日系數(shù)
可以根據(jù)完整自然年的銷售數(shù)據(jù)測算出每天在全年的銷售占比,這應該能覆蓋公眾假期和周末帶來的銷售波動影響。如果銷售數(shù)據(jù)拆到品類,也能覆蓋季節(jié)性影響。
商品在一個自然年中的銷量走勢由隨機波動+周期性波動+增長趨勢擬合而成,我們可以把周期性因子提取出來生成日系數(shù),這是一個時間序列的分解(Decomposition)過程。對于單品銷售預測這個場景來說,日系數(shù)要拆到最小類目上,比如針對牙刷就要提取口腔清潔品類的日系數(shù)。

2. 在訓練集中找到異常缺貨時段,修復數(shù)據(jù)將缺貨損失的銷售還原
采用有效日均銷進行修復減少鋪店和單店庫存不足最小陳列量的銷售損失。
3. 剔除離群點,明顯異常的單日數(shù)據(jù)要消除
異常數(shù)據(jù)最有可能是團購大單帶來的銷量暴增,可能是區(qū)域性斷網(wǎng)影響收銀之類帶來的銷售下滑。
4. 引入店群品類銷售指數(shù)
簡單的用計劃鋪店數(shù)乘以日均銷只關注了門店的數(shù)量卻忽略了每個門店對于某商品銷量的巨大差異,可以針對單品所屬的品類來計算歷史銷售數(shù)據(jù)中每個門店的品類銷售指數(shù),以此進行店群劃分,計算每個店群的單品日均銷,但是未來要鋪貨的門店和歷史有此單品銷售的門店是不一樣的,所以計劃鋪貨的目標門店可以再次用品類銷售指數(shù)分群,每個店群內(nèi)的門店數(shù)乘以店群單品日均銷,再累加起來得出全局的預估銷量。
5. 打通全年的營銷日歷和促銷日歷,前提是營銷計劃和促銷計劃至少有三個月的提前量,根據(jù)活動等級可以人為設一個權重參數(shù)。
6. 打通渠道的開店與閉店計劃,以新開店預估的銷售目標和老店的實際銷售數(shù)據(jù)來計算銷售占比權重。
以上1/2/3/4比較容易實施,5/6依賴于成熟的運營體系,能前瞻的制定好較為精確的季度促銷日歷/營銷日歷和季度的開閉店計劃,且實現(xiàn)這些數(shù)據(jù)的系統(tǒng)化和一體化。
References:
Introduction to Demand Planning & Forecasting
Extracting Seasonality and Trend from Data: Decomposition Using R