參加 Kaggle 競賽 Sticker Sales 心得

這次參加了2025年的第一個 Kaggle 競賽,這次參加的比賽是 Sticker Sales Forcast

先前在競賽的成績大約是 PR 50以下,而這次終於到達大約 PR 55 的排名
P.S. 2025/2/2 更新:比賽結束後我的 PR值上升至 60了!
算是自己在轉職數據分析的highlight,想做這篇文章復盤一下自己做數據分析、建模的過程。

這篇文章想要涵蓋幾點內容:

  • 如何拆解此題的思路 (aka. 想要達成什麼樣的目標)
  • 如何對資料進行前處理?
  • 資料視覺化
  • 資料建模進行預測

拆解 Sticker Sales 題目思路:

題目需要預測的是貼圖在不同國家、商店、產品在不同日期的銷售量,因此在一開始分析時決定用基本的 linear regression 進行資料建模;然而 linear regression 可能使銷售量的預測結果可能會變成負數(銷售的數字不會有負數),第一步確保預測的結果不會有小於 0 的數字。 接下來,我也需要了解銷售量在訓練資料集的數據分佈為何,這時候我們可以用 Python 的 seaborn 套件幫我畫出 histogram 查看數據分佈狀況,

確認數據分佈是偏向左邊或偏向右邊;之後就是辨認預測數據的偏離值是向左或向右,在這個 dataset 中數據是偏向靠左,因此數據偏右側的地方高機率是偏離值。

在知道了數據的偏離值之後,由於我們在分析訓練資料集依舊希望儘可能保留最多資料;因此在資料建模時我對預測銷售數量進行運算,確保這數字結果一定會是正數。

資料視覺化 EDA:

在資料集中有國家、商店、產品等屬於類別型的欄位,因此將這些類別型的欄位查看每個年月的銷售量的總和;這樣我們就可以查看銷售量對於時間的影響,或是找到一定的 pattern。

P.S. 也可以使用假設檢定的方法

  • t-test :適用於變數有兩種類別
  • anova :適用於兩種以上類別

查看不同國家的銷售量差異,以確認該類別欄位是否對銷售量的統計有影響

資料前處理:

日期資料的前處理:

這次的資料前處理讓我學到的是可以使用三角函數的 sin, cos處理日期數據, 例如:年份、月份、甚至是該年的第幾天;在知道這方法之前,都是直接使用年、月、日作為參數丟到模型處理, 我覺得用三角函數的方式處理日期可以更有效將日期的年、月、日限縮為 -1 到 1 之間,可以有效控制coefficient 變異量的範圍,這樣可以使預測結果不容易有乖離現象 這個時候才真正了解到高中三角函數的用途呢!

銷售量的處理:

銷售數量因為藉由 histogram 知道了樣本的 skewness 偏向右邊,代表在數據偏左的情況更偏向 outlier,並且這樣的情況容易導致在 linear regression 的時候數據預測有偏誤,例如:預測的銷售量竟然為負數。

在這 case 中,我將這個樣本數據直接用 log 進行運算,以確保我的每筆資料預測結果一定是正數;畢竟現實生活中不會表達"我賣出了 -10 個蛋糕"。

用 log 對數據樣本計算後,可以用 seaborn 畫圖看到其分佈更接近常態分佈;整體數據也比較沒有極端值的問題,導致線性回歸的數據的起始點就是負數的問題。

類別欄位的處理:

  • one-hot encoding: 形成一個稀疏矩陣;例如我的國家欄位有美國、台灣、日本,這時我的 encode 會出現country_US、country_TW、country_JPN的欄位是數字型態的欄位,有0, 1兩種數值;當某欄資料國家是台灣,country_TW會顯示 1 其餘 country_ 欄位皆為 0
  • frequency encode: 依據該資料在欄位出現的比例決定數值,ratio 的數值會介於 0跟1之間;可以避免數據維度過大使得模型複雜度提升。

建立統計模型尋找參數:

我是使用了 Python 的 statsmodels 函式庫進行 linear regression 與 linear mixed effect 的預測,linear mixed effect 主要假設國家、商店、產品的差異對於線性回歸中斜率、截距的差異。 並藉由 p-value (每個 feature 對於 target 的影響程度),以 0.05 作為基準點,找出p-value小於 0.05 的 feature 如何讓模型有好效能跟分析結果。

結論:

這次的預測建模比賽大約花了 1 ~ 2 週完成,覺得在研究所學習的數學訓練確實讓我的數據分析基礎更扎實一點;對於競賽,可以比較有條理地將分析的思路書寫出來,雖然上學期是用 R 這次則是用 Python;後續打算將數據分析的 notebook 思路與程式註解整理得更好懂。