coletangsy

學習 Data Science、Machine Learning 中,透過記錄,一步一步往目標前進。

【顧客流失預測項目】1. 數據說的故事要好好聽

發布於
修訂於
想了一會兒,到底要不要把這個小項目再寫成中文文章與大家分享(因為其實有準備一個英文的PPT),可是想到將自己的成果與別人分享也是學習的一部分,再加上完成了不跟大家分享的話不就是「自High」而已?! 所以決定把這個項目按構成分為幾篇文章,寫成一個系列作為記錄。

簡介

這會是一個有關電訊業的顧客流失預測項目的文章系列,也是我第一個看起來有模有樣的機器學習項目,花費了接近二個星期的時間。文章中使用的是我的第一版內容,未來我會更新、修改一些部分使這個小項目看起來更好一點,如果有甚麼好奇的地方,或者發現我哪裡可以改更好,歡迎留言、又或者用各種方法告訴我,大家良性交流,相互學習甚麼的,我最喜歡了!!!

目前按計劃,這個系列至少會有三篇文章,分別是「數據分析」、「建立預測模型」、「部署模型」,預計最快是一星期更新一篇(畢竟我也在修改,也在學習,打字又慢),那麼就從前置作業,也是最重要的EDA開始吧!


顧客流失率

這個項目是預測顧客流失率,那麼我們第一件事是了解甚麼是顧客流失率。顧客流失(Churn)顧名思義就是離開了我們公司的顧客。為甚麼我們會緊張這群顧客呢?最簡單的第一想法就是走了一群顧客,我們的收入就會下降。換言之,就需要找到一群新的消費者補位以維持營收。再深入一點去想,我們還要考慮到找新顧客的成本。如果我們可以直接一點,挽留到即將離開的顧客,不單止可以維持營收,同時減低產生新的成本。

而相比起零售業界,顧客流失這回事對於一些以合約制、訂閱制的行業更為重要,就比如本次項目的電訊行業,因為對零售業界而言,找新顧客的成本相對比以合約制、訂閱制的行業較低。


商業價值

如果成功挽留到即將離開的顧客,就可以維持營收,同時減低產生新的成本的話,那麼我們就可以利用數據分析,找出一些即將離開的顧客的共同特點,然後使用相關資料,去判斷預測顧客是否高機率會離開。當我們可以找出高機率會離開的顧客,就可以集中部分資源,作出對策挽留他們。


背景資料

本次數據庫來自 IBM 的 Sample Data Sets,被轉載到 Kaggle 。數據包括客戶的合約內容、使用服務、Demography 資料、以及是否在上個月離開公司。


數據告訴我們的是...

關於數據處理部分,可以到我的 GitHub Kaggle 上瀏覽。


先看一下我們要預測的目標值

顧客離開 比例

由上圖可見,目前的數據並不平衡,如果直接使用這數據組去訓練我們的模型,會使模型偏向預測占大比數的一邊。所以之後要作出處理,調整訓練組數據。


然後,就是要看一看我們的顧客,

顧客性別 對 離開 比例

由上圖可見,在收集回來的數據中,我們的顧客性別分布平均,而決定離開的顧客對男女比例也相似。


# 將月份群組起來
df_data["tenure"].max()

labels = [f"{i} - {i+11}" for i in range(1,72,12)]
df_data['tenure_group'] = pd.cut(df_data.tenure, range(1, 80, 12), right=False, labels=labels)
顧客餘下合約期 對 離開 比例

由上圖可見,在收集回來的數據中,以數據收集日的第三季度最後一月為計算日,餘下合約期主要分布在1 - 12 個月,即一年內以及 61 - 72 個月,即 5 - 6 年內。以是否離開再細分數據,可以看到在合約期餘下一年內的部分,離開的比例接近一比一,十分值得留意。


顧客合約類型 對 離開 比例

由上圖可見,在收集回來的數據中,比較多顧客以電子支票作支付,在以電子支票作支付的顧客中,選擇離開的比例也比其他支付方法要高,這個也值得留意,打勾。


顧客選用網絡服務類型 對 離開 比例

由上圖可見,在收集回來的數據中,比較多顧客使用我們的光纖服務,但同時使用我們光纖服務的顧客選擇離開的比例也比其他網絡服務要高,是不是我們的光纖服務出了甚麼問題呢?這個亦值得留意,打勾。


顧客每月費用分布

在每月費用分布中,很有趣的一點是在每月費用大概為$70-105 的顧客中,竟然是選擇離開的比例最高的一群,這個可能與使用的光纖服務而又選擇離開的顧客有所重疊,由於光纖服務一般比較貴。


顧客總費用分布

在總費用分布中,就挺合理了,沒甚麼特別。


暫時總結一下,選擇離開的顧客較多是餘下合約期短、以電子支票作支付、使用我們的光纖服務、每月費用大概$70-105。更多的特點分析可以到我的 GitHub Kaggle 上瀏覽。


特徵選取

那麼到底是不是這些特徵最能反映顧客離開呢?我們可以調一個 correlation 出來看看。

plt.figure(figsize=(20,6))
data_dummies.corr()['Churn'].sort_values(ascending = False).plot(kind='bar')
Features correlation towards "Churn"


如果想按重要性排序,不分正負的去觀察的話,那麼也有辦法,

# 以 RandomForestClassifier 來算 features Importances
feature_select = RandomForestClassifier()      
feature_select = feature_select.fit(X_train_resampled, y_train_resampled)
importances = feature_select.feature_importances_

# 變成一個dataframe
feature_importance = zip(X_train.columns, importances)
feature_importance_df = pd.DataFrame(feature_importance, columns =['Features', 'Importances'])
feature_importance_df.sort_values(by="Importances",inplace=True,ascending=False)

# 以棒型圖去看
plt.figure(figsize=(10,6))
sns.barplot(x = "Importances", y ="Features", data = feature_importance_df.head(15))


Features Importances with Random Forest Classifier

由上圖可見,每月續約、總費用、沒有使用附加服務、餘下合約期在一年內、以電子支票作支付,每月費用,使用光纖服務 都與 顧客是否離開 有較大關係。

之後我們可以注重使用這幾個特徵來建立我們的預測模型,這也是下一篇的主題,主要談談選擇模型、建立模型、評估表現。




各種聯繫方法目前應該包括:

  1. 留言
  2. 我的Linkedin
  3. 項目的GitHb



喜歡我的文章嗎?
別忘了給點支持與讚賞,讓我知道創作的路上有你陪伴。

CC BY-NC-ND 2.0 版權聲明
1

看不過癮?

一鍵登入,即可加入全球最優質中文創作社區