參考場景:銷量預測

文中涉及的「數據目錄」和「源代碼目錄」見雲盤:pan.baidu.com/s/1slJntR

下面在某些場景中,我們會用到 KNIME 這個工具來進行一些操作,這是一個開源的流程化數據處理工具(https://www.knime.com),很多基礎的數據演算法和模型不需要用代碼實現,在工程早期非常實用。下面提到後綴為 knwf 的文件都需要用 KNIME 導入使用。

為了解不同店鋪中食品的銷售情況,BigMart 的工作人員在不同城市的 10 個店鋪收集了 1559 種食品的銷售數據,這些數據總共包含 8523 條記錄(數據目錄下 bigmart.csv)。希望通過這些數據,我們可以對其它任何一家店鋪的銷量進行預測。

這個例子中的程序見源代碼目錄下 bigmart.knwf

1、認識數據

我們先來看一下數據中包含的屬性:

通過對數據的觀察,我們可以了解到:

  • Item_Weight 中包含一些缺失值,也就是缺失了一些食品的重量,這些可以用其它店鋪中同個產品的重量來代替,屬於一個可以補充的失誤數據。
  • Item_Fat_Content 的取值不太規範,比如低脂食品大部分標記為「Low Fat」,但也有不少標記為「low fat」和「LF」的,需要後續進行統一。
  • Item_Visibility 有不少 0 值,應該屬於數據的缺失,但是通過對數據的觀察,同一種食品即使在不同店鋪,Item_Visibility 值大多數也很相近。
  • Item_Type 包含了食品的 16 個種類,分別是「蔬菜水果」、「零食」、「家居烹飪」、「冷凍食品」、「奶製品」、「罐頭食品」、「烘焙食品」、「綠色食品」、「軟飲」、「肉類」、「麵包」、「酒精飲料」、「其它」、「澱粉食品」、「早餐」、「海鮮」(按產品多少排序)。
  • Outlet_Establishment_Year 記錄了店鋪的開業年份,顯然,店鋪已經開張的時間是更有效的特徵,由於這些數據都是 2013 年收集的,因此可以用 2013 減去開業年份作為一個新的特徵。
  • Outlet_Size 代表產品所在店鋪的規模,中小型規模的各為兩千多,大型規模的不到一千,剩下的都缺失。
  • Outlet_Location_Type 代表了地段的特點,取值為「級別1」、「級別2」、「級別3」。
  • Outlet_Type 包含了店鋪的 4 種類別,分別是「超市類別1」、「超市類別2」、「超市類別3」、「便利店」,其中「超市類別1」對應有 5577 條,剩下類別分別在一千條左右。

2、清洗數據

根據上面了解到的數據的情況,下面就可以對這個數據進行清洗了。在這個例子中,我們依次做了如下的事情:

① 標準化 Item_Fat_Content 的取值。

② 計算店鋪的開張時間。

③ 找出 Outlet_Size 缺失的店鋪,選取店鋪的總銷量、類型等特徵,用 GBDT 方法對店鋪規模進行預測,然後補充到源數據。

④ 補充 Item_Visibility 數據,首先用相同 ID 食品的期望數據進行填補,如果數據不存在,再用相同類別食品的期望數據進行填補。

⑤ 補充 Item_Weight 數據,用相同 ID 食品的期望數據進行填補。

3、建立預測模型

在對數據進行了這些必要的清洗後,我們可以建立一個模型,用來對某種食品在某個店鋪的銷售情況進行預測。這裡,我們採用隨機森林方法:

這個模型運行下來後,得到模型預測 Item_Outlet_Sales 的效果為 RMSE = 1135,其中 RMSE 定義為sqrtfrac{sum_{i=1}^N(Prediction_i-Actual_i)^2}{N},下面是部分結果的直觀感受:

4、預測模型調優

影響隨機森林方法的參數中,包含的決策樹數量比較關鍵,默認取值為 100,我們可以嘗試不同的值來比較生成的模型的性能優劣:

從生成的圖表可以看出,決策樹數量取值在 150 就可以得到一個較好且已經穩定的模型了,這時模型的 RMSE 值為 1133。

常識告訴我們,一般來說價格會對銷量有比較重要的影響,那就來看看標價 Item_MRP 的分布到底是怎麼樣的吧(下圖由 GeoDa 生成):

從圖中很顯然可以發現,標價在 70、137、203 這三個數據附近形成了分割,我們可以根據這樣的規律來將標價分為「很低」、「低」、「高」、「很高」這四類,用來作為一個新的特徵。將這個新的特徵加入到預測模型中去之後,模型預測結果的 RMSE 值降低到了 1109。

5、數據的理解和啟發

我們再來嘗試深入一點理解這個數據,

先來看一下不同店鋪的銷售情況,通過如下的箱圖能夠看到(由 KNIME 的 JavaScript Conditional Box Plot 節點生成),OUT010 和 OUT019 明顯各個產品的營業額都遠不如其它店鋪,其實從上面數據清洗過程中已經可以了解到,這兩家店鋪都是「便利店」類型,規模都屬於小型,而且已經開了很多年。

但是,你也可以發現,「便利店」內產品的陳列面積佔比相對較高:

這是什麼原因造成的?通過對每個店鋪總共售賣的產品數量(SKU)進行統計,就可以發現,「便利店」內售賣的產品種類只有超市類型的一半左右,那麼顯然,每種產品能夠佔據的陳列空間就大了一倍,這和上圖中的規律相符。

接下來,我們再來看一下每個店鋪的銷售情況。雖然對於單個產品來說,模型預測的數據還存在不小的波動;但是,如果按每個店鋪產品的銷售情況進行統計,可以發現模型對於店鋪整體經營狀況的預測誤差很小,最大不超過 18%,大部分都能保證在個位數百分比,平均誤差為 6%。

最後,如果要更準確的對銷量進行預測,而且能盡量符合各種類型的店鋪,後續還應該考慮擴大數據的收集範圍。比如,應該多包含幾個類型為「便利店」、「超市類型2」、「超市類型3」的店鋪;又比如,可以考慮用「營業面積」這樣更精細一點的數據,來描述店鋪的規模。通過這樣一些數據的改進,應該可以得到更好的預測模型。

6、練習

現在,有一家零售商想要了解它的客戶在黑色星期五促銷節的時候購買各種產品的規律,來預測每個客戶可能在未來的黑色星期五消費的金額,以此來判斷一個客戶潛在價值的大小。因此,它採集了一些關於客戶的性別、年齡、城市、居住情況等信息,並追蹤了一部分客戶在促銷節購買的產品以及消費金額的數據。

這些數據存儲在數據目錄下的 blackfriday.csv 中,數據的屬性可以通過欄位名來理解其含義。希望能通過數據,來構建一個能夠預測任何一個客戶未來可能在黑色星期五促銷節消費金額的模型。


推薦閱讀:

數據挖掘面試題之梯度提升樹
學大數據之前要知道的事
關於知乎KOL關注者組成的研究(進行中)
數據分析之數據可視化
第二十章 KNN演算法(上)

TAG:銷量分析 | 數據分析 | 數據挖掘 |