天天看點

使用聚類算法幫助線下零售店提升供貨效率

兩周前公司在Noosa的一家店(confidentiality原因不具體指明品牌了)的店長回報當地的短褲類産品賣得很火,但停止供貨了。這是個有趣的問題。立即與該品牌線下零售的負責人取得聯系,得到了一些背景資訊。

  1. 服飾零售業顯然有季節性,十多年來公司始終是根據各地氣候确認何時供貨的
  2. 在澳洲國内分為六個區,Hot hot熱帶區, Hot亞熱區,Warm溫帶區,Cold寒冷區,Perth地中海型氣候區,Riverera幹熱區。所有店均按這六個區的分割來确定何時進入清倉模式

在Power BI上用地圖視圖可以清晰看到基于地理和氣候的劃分

使用聚類算法幫助線下零售店提升供貨效率

問題的第一步是證僞。根據店長回報顯然起碼Noosa店并不适合按這種區劃來确定供貨周期(Assortment Planning)。是否的确如此呢?可以根據夏季産品的銷量占比來做聚類,觀察哪些店有類似的銷售模式。

category_sales = df.set_index(['Store', 'Month'])
category_sales['UnitQtyMonthlySum'] = category_sales['UnitQty'].groupby(['Store', 'Month']).sum()
category_sales['UnitQtyPerc'] = category_sales['UnitQty'] / \
    category_sales['UnitQtyMonthlySum']
category_sales['SalesAmtMonthlySum'] = category_sales['SalesAmt'].groupby(['Store', 'Month']).sum()
category_sales['SalesAmtPerc'] = category_sales['SalesAmt'] / \
    category_sales['SalesAmtMonthlySum']
           

選取夏季典型的polo衫和短褲品類

category_sales_sub = category_sales[(category_sales.Category == 'SHORTS') | (category_sales.Category == 'POLOS')][['Category','UnitQtyPerc','SalesAmt']]
           

Reshape資料,計算每個月每種品類的銷售占比

category_sales_pivoted = pd.pivot_table(category_sales_sub, index='Store', columns=[
                                        'Month', 'Category'], values=['UnitQtyPerc','SalesAmt'])
category_sales_pivoted.fillna(0, inplace=True)
           

簡單預處理完資料,即成為如下格式

使用聚類算法幫助線下零售店提升供貨效率

K-means算法是最常用的聚類算法之一。使用不同的K值計算inertia,又稱within-cluster sum-of-squares,來确認比較合适的聚類數量。一般而言我們取所謂的elbow肘尖處,因為這裡是inertia不再随聚類數增加顯著降低的點。但具體情況還是要參考聚類的statistics的,不能機械采用rule of thumb。

使用聚類算法幫助線下零售店提升供貨效率

根據這張圖,5到8都可以是合适的聚類數。為了和現存的區劃做對比,本來傾向于采用K=6,但發覺這種情況下會有一個cluster有且僅有一個店。于是退回到5,取得cluster label後回Power BI看一下地理位置圖

使用聚類算法幫助線下零售店提升供貨效率

為了和之前的分布圖做對比,盡量采用了一樣顔色的點來代表新的聚類,這樣對Business來說會比較直覺。現實中的資料科學項目是否成功很大程度上取決于insights是否actionable,而是否actionable又取決于business是否能了解你的findings。這種小細節對資料科學家而言沒有任何技術難度故而很容易被忽視,但卻可能成為成敗關鍵。

很顯然,根據銷售占比得到的聚類的确部分反映了現有區劃。但地中海型氣候區和幹熱區基本混在一起了,溫帶區也并沒有形成顯著的聚類,相反,很多溫帶區的點和寒冷區的點混雜在一起。值得注意的是,清倉模式其實會引入人工噪聲。銷售占比并非該店附近demand的真實反映,因為一旦到達清倉時間,價格下降會導緻購買高峰,之後就算有需求也不再補貨。對區劃的錯誤假定在某種程度上會導緻我們稱為self-fulfilment的結論--停止供貨會使得同一區域的店展現出類似的銷售模式,但這并不意味着區域内的店真的有那麼相似。有趣的是即使在這樣的人為噪聲下,我們仍能看到,現有區劃方案下的店面顯示出很不一樣的銷售模式。

再次回到Power BI,做crosstab comparison。這個界面是business作日常決策的依據。有時候即使發現某些店面的assortment planning方案和預想中不一樣,但由于銷售總量有限,不值得投入資源去改變現有方案。

使用聚類算法幫助線下零售店提升供貨效率

以上已經證明現有方案的不合理,但我們還沒有給出更為合理的區劃方案。做了三個方案。其一,采用全部category品類來做聚類。雖然會由于季節性對某些品類停止供貨,但其他品類的季節性在某種程度上會cancel off人為引入的噪聲。其二,采用external data。比如google analytics有基于地域的搜尋詞統計,将之應用到某個店面的地理位置,再繪制出時間曲線,可以展現出當地對這個品類産品的需求。其三,采用線上銷售的統計資料。線上店是面向多時區的,不會按季節停止供貨。用google geocoding的api把所有線上銷售的寄送位址map到最近的店,某種程度上就反映了該店附近的需求。出于篇幅考慮這裡不再具體給出相應代碼。有興趣的話下次分享。

繼續閱讀