參考場景:推廣與促銷
文中涉及的「數據目錄」和「源代碼目錄」見雲盤:https://pan.baidu.com/s/1slJntRR
在移動互聯網時代,優惠券是一種很多 App 都在使用的推廣與促銷手段。但是,如果隨機給所有的用戶投放優惠券不但成本高,而且會對很多用戶造成干擾,因此,我們需要根據用戶的特點來有針對地發放優惠券。
這裡現在有用戶在2016年1月1日到2016年6月15日真實消費行為發生的數據(數據目錄下 coupon.csv),希望可以儘可能準確地預測某個用戶在領取優惠券之後一周內會不會使用該優惠券。
這個例子中的程序見源代碼目錄下 coupon.knwf 和 coupon.py,前者用於生成特徵,後者用於訓練模型
1、認識數據
這個數據中包含了大約 1318.5 萬條消費記錄,其中的屬性含義如下:
經過初步統計,這些記錄中包含有 1.6 萬個商家、103.5 萬個用戶、3.7 萬種優惠券。
這些記錄詳盡地記錄了每個用戶在某個商家的店鋪內點擊查看產品、領取優惠券、最終產生消費等一系列行為。但是很明顯,這些行為有先後順序的關聯,有時間間隔的關聯,其實很多信息隱藏在了若干條數據所記錄的行為之間了。因此,這個分析的重點在於構建良好的特徵來反映這些隱藏的信息。
2、探索性分析
對於這樣時序性發生的事件,首先可以考慮按照時間線將所有事件可視化出來,看看是否有一些規律。這裡先用 KINME 將所有記錄按照日期分組統計,然後分別把領取優惠券、使用優惠券購買、未使用優惠券購買行為的統計數據在一張圖表上繪製出來(下圖用 Tableau 生成):
明顯可以看出,數據在春節前後可能並不能反映一般情況,這也和常識相符。因此,可以將春節前後的數據去掉,考慮到數據的連貫性,用於分析的數據可以從3月份開始提取。
另外,既然需要預測用戶在領取優惠券之後一周內會不會使用該優惠券,那麼在計算領取優惠券的時候需要排除最後7天的記錄;而且,樣本數據需要有前後的連續性,不能進行隨機的取樣。基於這些原因,後續可以考慮將數據劃分成兩部分,其中2016年3月1日到2016年5月31日的數據用於訓練,2016年6月1日到2016年6月15日的數據用於測試驗證。
3、構建特徵
要預測用戶使用優惠券的可能,最相關的信息可能主要包含在以下這幾個方面:
① 商家的特點:商家的產品是不是受歡迎、優惠力度大不大,等等。
② 用戶的特點:用戶經常看但很少買還是很容易剁手下單、用戶是不是經常領優惠券、用戶是不是偏愛某些商家,等等。
③ 優惠券的特點:某種類型的優惠券是不是比較受歡迎、優惠券對消費行為的促進作用是不是來的很快,等等。
④ 事件發生的時間特點:用戶是不是在周幾比較活躍、是月末還是月初更容易發生購買行為,等等。
我們可以分別從這些方面來構建有信息量的特徵:
① 從商家特點考慮:
- 商家提供過多少種優惠券 Merchant_Coupon_Types
- 商家優惠券的平均使用率 Merchant_Coupon_Use_Rate
- 商家優惠券被領取且被使用的數量 Merchant_Use_Coupon_Count
- 商家優惠券被領取的數量 Merchant_Receive_Coupon_Count
- 商家優惠券的平均使用時間 Merchant_Use_Coupon_Days
- 商家優惠券被多少用戶領取過 Merchant_Receive_Coupon_User_Count
- 商家優惠券被多少用戶使用過 Merchant_Use_Coupon_User_Count
- 商家所有類型的購買覆蓋了多少用戶 Merchant_User_Count
- 商家總共的購買次數 Merchant_Purchase_Count
- 商家用戶的平均購買次數 Merchant_Purchase_Count_Per_User
- 商家用戶中使用優惠券的比例 Merchant_Use_Coupon_User_Rate
- 商家所有購買行為中使用優惠券的比例 Merchant_Use_Coupon_Rate
② 從用戶特點考慮:
- 用戶使用過多少種優惠券 User_Coupon_Count
- 用戶總共操作次數 User_Action_Count
- 用戶操作中的點擊率 User_Action_0_Rate
- 用戶操作中的購買率 User_Action_1_Rate
- 用戶操作中的優惠券領取率 User_Action_2_Rate
- 用戶購買中使用優惠券的數量 User_Use_Coupon_Count
- 用戶購買中使用優惠券的比例 User_Use_Coupon_Rate
- 用戶購買中使用折扣類優惠券的數量 User_Use_Coupon_Type_1_Count
- 用戶購買中使用折扣類優惠券的比例 User_Use_Coupon_Type_1_Rate
- 用戶購買中使用滿減類優惠券的數量 User_Use_Coupon_Type_2_Count
- 用戶購買中使用滿減類優惠券的比例 User_Use_Coupon_Type_2_Rate
- 用戶購買中使用固定優惠類優惠券的數量 User_Use_Coupon_Type_3_Count
- 用戶購買中使用固定優惠類優惠券的比例 User_Use_Coupon_Type_3_Rate
- 用戶使用優惠券的平均時間 User_Use_Coupon_Days
- 用戶在某個商家的總共操作次數 User_Merchant_Action_Count
- 用戶在某個商家的點擊次數 User_Merchant_Action_0_Count
- 用戶在某個商家的點擊率 User_Merchant_Action_0_Rate
- 用戶在某個商家的購買次數 User_Merchant_Action_1_Count
- 用戶在某個商家的購買率 User_Merchant_Action_1_Rate
- 用戶在某個商家的優惠券領取次數 User_Merchant_Action_2_Count
- 用戶在某個商家的優惠券領取率 User_Merchant_Action_2_Rate
- 用戶領取某種優惠券的數量 User_Coupon_Action_2_Count(導致過擬合,移除)
- 用戶使用某種優惠券的數量 User_Coupon_Action_1_Count(導致過擬合,移除)
- 用戶對某種優惠券的使用率 User_Coupon_Use_Rate(導致過擬合,移除)
③ 從優惠券特點考慮:
- 優惠券的類型 Coupon_Discount_Type
- 優惠券的優惠比率 Coupon_Discount_Value
- 滿減類優惠券的最低消費金額 Coupon_Discount_XY_Min
- 優惠券被領取次數 Coupon_Action_2_Count
- 優惠券被使用次數 Coupon_Action_1_Count
- 優惠券的被使用率 Coupon_Use_Rate
④ 從日期特點考慮:
- 一周的第幾天 Date_Week_Day
- 一個月的第幾周 Date_Month_Quarter
下面,我們就可以從原始數據中構建出這些特徵,由於特徵比較多,在此就不贅述細節了,有興趣可以在 KNIME 中導入源代碼目錄下的 coupon.knwf 來查看詳細步驟。當然,如果熟悉其它數據處理工具,也可以用其它方式來處理,比如 SQL 等。
4、訓練與調優
通過使用工具,我們已經生成了用於訓練和驗證的數據集。通過查看這些已經添加了特徵的數據,可以發現它們有以下幾個特點:
- 特徵維度較多
- 特徵間有相關性
- 數據中有許多缺失值
- 不同特徵的取值類型、取值範圍都有比較大的區別
對於這樣的數據,一般首先考慮使用集成學習方法。這裡,我們採用了 XGBoost 來進行處理(由於這個數據量比較大,因此沒有選擇在 KNIME 中進行計算,而是通過 Python 調用原生庫的方式來提高計算效率):
%matplotlib inlineimport pandas as pdimport matplotlib.pyplot as pltimport xgboost as xgb# 讀取並處理數據data_train = pd.read_csv("coupon_train.csv")target_train = data_train.pop(Use_Coupon)X_train = data_train.valuesy_train = target_train.valuesdata_test = pd.read_csv("coupon_test.csv")target_test = data_test.pop(Use_Coupon)X_test = data_test.valuesy_test = target_test.values# XGBoostdtrain = xgb.DMatrix(data_train, label=target_train)dtest = xgb.DMatrix(data_test, label=target_test)params = { max_depth: 3, eta: 0.3, min_child_weight: 1, gamma: 0, subsample: 0.8, objective: binary:logistic, eval_metric: auc}evals = [(dtrain,train), (dtest,test)]num_boost_round = 100bst = xgb.train(params, dtrain, num_boost_round, evals, early_stopping_rounds=20)print(bst.best_score, bst.best_iteration, bst.best_ntree_limit)# 特徵重要性plt.figure(figsize=(16, 6))f_importances = pd.Series(bst.get_score(importance_type=gain)).sort_values(ascending=False) f_importances.plot(kind=bar)plt.show()
上面包含了已經進行過調優的參數,和默認的參數相比,主要有兩個參數的調整帶來了較大的性能優化:一個是樹的最大深度,我們發現這個訓練任務並不適合特別深的樹;另一個是樣本取樣,這個任務在訓練的時候加以隨機採樣可以減少過擬合現象。
這裡使用了 ROC-AUC 作為評價指標,最後在設置決策樹數量為 44 的情況下可以達到最優的 auc 值 0.74。
5、結果的理解與思考
通過訓練得到的模型,我們可以將特徵按照重要程度進行排序:
最重要的特徵有這些:
- 用戶在某個商家的總共操作次數 User_Merchant_Action_Count(喜歡這個商家的用戶)
- 用戶購買中使用滿減類優惠券的數量 User_ Use_Coupon_Type_2_Count(用優惠券多的用戶)
- 用戶購買中使用滿減類優惠券的比例 User_Use_Coupon_Type_2_Rate(用優惠券多的用戶)
- 用戶在某個商家的購買率 User_Merchant_Action_1_Rate(喜歡這個商家的用戶)
- 用戶使用優惠券的平均時間 User_Use_Coupon_Days(下決定快的用戶)
- 商家優惠券被多少用戶領取過 Merchant_Receive_Coupon_User_Count(受歡迎的商家)
- 優惠券的被使用率 Coupon_Use_Rate(受歡迎的優惠券)
- 用戶使用過多少種優惠券 User_Coupon_Count(用優惠券多的用戶)
- 用戶在某個商家的購買次數 User_Merchant_Action_1_Count(喜歡這個商家的用戶)
可見,模型認為用戶會不會在一周內使用優惠券的因素,主要與用戶的特點、優惠券的特點關聯比較大,尤其是用戶是不是經常領取、使用優惠券,應該是其中最為主要的原因。
但是,查看預測的結果數據後,我們會另外發現:如果用戶最後的確不會使用優惠券,模型的預測準確率比較高;但如果用戶最後其實用了優惠券,但是模型很多時候會預測錯誤。也就是說模型對於識別用戶可能使用優惠券的情形還有較大的提升空間,目前的數據還不足以用於準確地發現用戶的消費衝動。而這些行為和用戶的關聯較大,因此,如果能有更多的用戶特徵加入進來,這個預測應該可以更加準確。
6、練習
現在每年都會有很多促銷節日,比如雙十一、618等等。在這些促銷節日里,很多商家都會推出優惠活動,但是,很多在促銷節日被吸引過來的客戶並不會因此成為回頭客。因此,商家需要找出那些可能成為忠實客戶的對象,有針對地提供更好的優惠和服務。
這是天貓提供的數據和場景,現在需要從中預測,未來半年內會從同一商家處再次購買的客戶,從這裡可以找到具體的數據及其描述:https://tianchi.aliyun.com/competition/information.htm?raceId=231576
推薦閱讀:
※12個刺激消費的促銷方式
※100個促銷方案之:以人為本(持續更新)
※有這100個促銷方案,老闆了還是策划了再也不發愁了