---
title: Project21
tags: teach:MF
---
# 玉山競賽
## 1. Motivations
:::info
在台灣,多數人都有用信用卡消費的經驗,而目前台灣信用流通量更高達5100多萬張,遠勝過全國總人口數。然而,信用卡種類百百種,若銀行能準確預測出客戶每個月消費金額較高的消費類別,便可精準地向顧客推銷,避免過度打擾消費者同時減少行銷成本,達到精準行銷的目標。
本組欲使用資料科學之方法首先進行資料預處理,包含PCA、mice填補空缺值、feature importance等方法,以確保資料之完整性,在進行K-means進行消費者分群,使每一群皆包含相同特性之消費者,最後以機器學習之方法如XGBoost , Random Forest , MLP , Linear Regression進行消費者之消費類別金額之預測。
:::

(圖片來源:https://iof.hexun.com/2020-08-08/201840119.html)
## 2. EDA
### 訓練資料欄位說明:
| 欄位名稱 | 欄位中文名稱 | 資料型態 |
| -------- | -------- | -------- |
| dt |消費月份 |數值型(數字越大表是月份離testing data越近)
chid |顧客編號 |-
shop_tag |消費類別 |類別型
txn_cnt |消費次數 |數值型
txn_amt |消費金額(經過神秘轉換)|數值型(數字越大代表原始金額越大)
domestic_offline_cnt|國內實體通路消費次數|數值型
domestic_online_cnt|國內線上通路消費次數|數值型
overseas_offline_cnt|海外實體通路消費次數|數值型
overseas_online_cnt|海外線上通路消費次數|數值型
domestic_offline_amt_pct|國內實體通路消費金額佔比|數值型
domestic_online_amt_pct|國內線上通路消費金額佔比|數值型
overseas_offline_amt_pct|海外實體通路消費金額佔比|數值型
overseas_online_amt_pct|海外線上通路消費金額佔比|數值型
card_1_txn_cnt |卡片1消費次數 |數值型
card_2_txn_cnt |卡片2消費次數 |數值型
card_3_txn_cnt |卡片3消費次數 |數值型
card_4_txn_cnt |卡片4消費次數 |數值型
card_5_txn_cnt |卡片5消費次數 |數值型
card_6_txn_cnt |卡片6消費次數 |數值型
card_7_txn_cnt |卡片7消費次數 |數值型
card_8_txn_cnt |卡片8消費次數 |數值型
card_9_txn_cnt |卡片9消費次數 |數值型
card_10_txn_cnt |卡片10消費次數 |數值型
card_11_txn_cnt |卡片11消費次數 |數值型
card_12_txn_cnt |卡片12消費次數 |數值型
card_13_txn_cnt |卡片13消費次數 |數值型
card_14_txn_cnt |卡片14消費次數 |數值型
card_other_txn_cnt |其他卡片消費次數 |數值型
card_1_txn_amt_pct |卡片1消費金額佔比 |數值型
card_2_txn_amt_pct |卡片2消費金額佔比 |數值型
card_3_txn_amt_pct |卡片3消費金額佔比 |數值型
card_4_txn_amt_pct |卡片4消費金額佔比 |數值型
card_5_txn_amt_pct |卡片5消費金額佔比 |數值型
card_6_txn_amt_pct |卡片6消費金額佔比 |數值型
card_7_txn_amt_pct |卡片7消費金額佔比 |數值型
card_8_txn_amt_pct |卡片8消費金額佔比 |數值型
card_9_txn_amt_pct |卡片9消費金額佔比 |數值型
card_10_txn_amt_pct |卡片10消費金額佔比 |數值型
card_11_txn_amt_pct |卡片11消費金額佔比 |數值型
card_12_txn_amt_pct |卡片12消費金額佔比 |數值型
card_13_txn_amt_pct |卡片13消費金額佔比 |數值型
card_14_txn_amt_pct |卡片14消費金額佔比 |數值型
card_other_txn_amt_pct|其他卡片消費金額佔比|數值型
masts |婚姻狀態 |類別型
educd |學歷代碼 |類別型
trdtp |行業別 |類別型
naty |國籍 |類別型
poscd |職位別 |類別型
cuorg |客戶來源 |類別型
slam |正卡信用額度(經過神秘轉換) |數值型(數字越大代表原始金額越大)
gender_code |性別代碼 |類別型
age |年紀 |類別型
primary_card |正附卡註記 |類別型
### 資料架構:
#### 目標:預測出每位顧客下個月消費金額前三高的消費類別

### 原始資料概述:
:::info
原始資料一共32,975,653筆、53個特徵,並涵蓋24個消費月份(dt),目標值為下個月顧客之前三名消費類別(shop_tag)。
消費月份(dt):24個消費月份(1-24)。
消費類別(shop_tag):49種消費類別(1-48)。
其中需要預測的類別為:2, 6, 10, 12, 13, 15, 18, 19, 21, 22, 25, 26, 36, 37, 39, 48
顧客編號(chid):500,000個顧客(不包含重複)。
:::
### 原始資料缺失值:
|欄位名稱 |缺失值 |
|--------|------|
|婚姻狀態(masts) |10
|學歷代碼(educd) |23
|行業別(trdtp) |435
|國籍(naty) |10
|職位別(poscd) |10
|客戶來源(cuorg) |10
|正卡信用額度(slam) |1,749,906
|性別代碼(gender_code) |421,667
|年紀(age) |421,667
### 敘述統計量:
:::info
1. 原始的顧客有500000個,但有消費需預測類別的顧客僅有498040。
2. 每個消費類別每個月的消費總額統計量
:::


:::info
除了類別2、10、39有離群值外,其餘每月的總金額約落在$10^7$~$10^8$之間。
:::
### 資料視覺化:
1. 顧客屬性統計圖

:::info
* 性別類別中以0的性別居多
* 年齡以3、4居多
* 婚姻狀況並無太大區別
* 職位別以99、2居多
:::


:::info
* 正附卡以1居多
* 國籍以1居多
* 行業別多為2、5、11、15
* 教育程度以3居多
:::
2.顧客消費資訊

:::info
在dt11的時候消費類別39有一筆離群值,官方表示因為金額經過特殊轉換因此才出現離群值,且此顧客確實消費了69次。
:::

:::info
整體來看,37、15、2、48、10、36為熱賣類別
:::

:::info
從總金額來看,37類別也是最多的,其中2、10、15、36、4為熱賣商品
:::

:::info
此圖顯示了卡片別與消費類別的關係,可以看出以卡片1~6&11為重
:::



:::info
上圖顯示了各個消費類別於dt1~dt24的消費總金額,此圖可得知各消費類的消費金額別並沒有明顯的季節性規律,且類別39僅於dt11有消費紀錄
:::
3. feature importance



:::info
根據24期的feature importamce來看,slam的影響性不大,故將其刪除。
:::
## 3. Problem formulation
### Problem Definition:
:::info
#### 預測下個期間(dt25)每位消費者於各個消費類別的消費金額,並依金額進行排序,取前消費金額前三高者,與其對應的消費類別。
:::
### Hypothesis:
:::info
### 假設1:不同的客戶屬性會有不同的消費模式
### 假設2:不同的卡片會影響消費類別的偏好
### 假設3:dt越大(越靠近現在),顧客的消費模式越相近
:::
### Processing:
(1) 顧客分群
:::info
取出每個顧客的屬性資料(包含性別gender_code、年齡age、職位別poscd等),及每位客戶於dt13~24消費金額前三高的消費類別,以K-means方法分群,若欄位有缺失值以眾數方式填補,根據inertia折線圖與分群結果得出應分為5群。
:::
inertia折線圖

分群結果

:::info
由分群結果圖可發現各群消費者在各個消費類別的消費金額有明顯的差異(例如:第一群顧客沒有消費shop_tag2,而第三群顧客於shop_tag2的消費金額極高)
:::
(2) 卡片資料
:::info
取出每個顧客在card1~card6和card11的消費次數,將其加總及排序,以1表示對顧客來說最不重要的卡片,7為最重要的卡片。
:::
(3) 極端值處理
:::info
找出每個消費類別大於3倍IQR的金額將其替換成第三四分位數+3倍IQR的值(3Q+3*IQR),降低離群值影響。
下圖顯示各個消費類別中消費金額屬於該類別離群值之數量
:::

(4) 時間處理

:::info
利用加權法得出每一個顧客的16個預測類別加權金額,且dt越大的權重越重。
ex.
dt=24,weighted=$\frac{1}{1}$
dt=23,weighted=$\frac{2}{1+2}$
$\vdots$
dt=1,weighted=$\frac{24}{1+2+...+24}$
:::
### Benchmark:linear regression
### Machine Learning Method:Random Forest、XGBoost、MLPRegressor
### measurement:比賽規定之評分標準
:::info
以NDCG(Normalized Discounted cumulative gain)進行評分:
$$NDCG = \frac{\Sigma_{c\in C}NDCG_c}{|C|} = \frac{\Sigma_{c\in C}\frac{DCG_c}{iDCG_c}}{|C|}$$
其中C為所有客戶,c是其中的一個客戶
$DCG_c$的定義如下:
$$DCG_c = \Sigma_{i=1}^3\frac{V_{i,c}}{log_2(1+i)}$$
$V_{i,c}$:顧客c於模型預測出第i個消費類型的消費金額(>=0)
$$iDCG_c=\Sigma_{i=1}^3\frac{\hat{V_{i,c}}}{log_2(1+i)}$$
$V_{i,c}$:顧客消費金額第i高之消費類型的消費金額(>=0)
$0\leqslant NDCG_c\leqslant1$
:::
## 4. Analysis and Conclusion
### 特徵變量與目標值之選擇
:::info
根據本組前述所提出之假設,本組欲以客戶屬性(類別變數)、類別消費金額(數值變數)、不同卡別消費次數(數值變數)作為特徵變量,欲預測下一期(dt = 25)之16種類別之消費金額並做排序,以得出每個顧客下一期消費金額前三高之類別。
:::

### 測試結果
| 模型 | 特徵變量 | 目標值 | $NDCG_c$分數 |
| -------- | -------- | -------- | -------- |
| Linear Regression | 客戶屬性+卡片重要性+消費金額 | 消費金額 | 0.697606912 |
| Random Forest Regressor | 客戶屬性+卡片重要性+消費金額 | 消費金額 | 0.6919987613 |
| MLP Regressor | 客戶屬性+卡片重要性+消費金額 | 消費金額 | 0.6975254349 |
| XGB Regressor | 客戶屬性+卡片重要性+消費金額 | 消費金額 | 0.6982442489 |
:::info
分數以XGB Regressor為最高,線性回歸之準確度高於Random Forest Regressor和MLP Regressor,表示可能資料特性可能比較偏向線性模型。
:::
### 其他方式之測試結果
:::info
資料預處理:
NA值填補眾數
分群方法:
客戶消費次數分群、客戶消費金額分群、客戶消費次數+客戶屬性分群、客戶消費金額加+客戶屬性分群、消費次數前六名分群、消費次數前三名分群
特徵變量選擇:
消費金額、消費金額+客戶屬性、消費金額+客戶屬性+卡片次數
另外本組也嘗試過將特徵變量做PCA、將數值變數做標準化、將類別變數轉dummy variable,模型績效並未較佳
時間區間選擇:
本組亦嘗試過以不同時間區間進行測試,發現X_train(1-23)、y_train(1-24)、X_test(1-24)模型績效效果最佳
:::
## Reference
https://tbrain.trendmicro.com.tw/Competitions/Details/18?utm_source=prof_list&utm_medium=email&utm_campaign=EAOC2021
https://scikit-learn.org/stable/user_guide.html
---
---