基於RFM的客戶價值分析模型
來自專欄 Python 項目分析
本文用具體實例的方式,在RFM的基礎上構建客戶價值分析模型,探討如何對客戶群體進行細分,以及細分後如何進行客戶價值分析。最終得到LRFMC模型,並將客戶群體細分為重要保持客戶、重要發展客戶、重要挽留客戶、一般客戶、低價值客戶五類。
本文原始數據與分析思路來自《Python數據分析與挖掘實戰》第七章,感謝這本書提供的數據集與分析框架。(這本書很不錯,推薦)
1 背景與目標
1.1 背景
在面向客戶制定運營策略、營銷策略時,我們希望能夠針對不同的客戶推行不同的策略,實現精準化運營,以期獲取最大的轉化率。精準化運營的前提是客戶關係管理,而客戶關係管理的核心是客戶分類。通過客戶分類,對客戶群體進行細分,區別出低價值客戶、高價值客戶,對不同的客戶群體開展不同的個性化服務,將有限的資源合理地分配給不同價值的客戶,實現效益最大化。
在客戶分類中,RFM模型是一個經典的分類模型,模型利用通用交易環節中最核心的三個維度——最近消費(Recency)、消費頻率(Frequency)、消費金額(Monetary)細分客戶群體,從而分析不同群體的客戶價值。
在某些商業形態中,客戶與企業產生連接的核心指標會因產品特性而改變。如互聯網產品中,以上三項指標可以相應地變為下圖中的三項:最近一次登錄、登錄頻率、在線時長。
1.2 目標
本實例藉助某航空公司客戶數據,探討如何利用KMeans演算法對客戶群體進行細分,以及細分後如何利用RFM模型對客戶價值進行分析,並識別出高價值客戶。
在本實例中,主要希望實現以下三個目標:
- 藉助航空公司客戶數據,對客戶進行群體分類
- 對不同的客戶群體進行特徵分析,比較各細分群體的客戶價值
- 對不同價值的客戶制定相應的運營策略
2 分析過程
2.1 分析思路
本實例的數據包含了2012年4月1日至2014年3月31日期間的客戶數據,共有6萬餘條記錄。分析中需要用到KMeans演算法,且需要將數據分析的結果可視化,便於後期的結論分析,於是採用以下兩種工具進行分析:
- jupyter notebook(Python 3.6 )
- Excel 2016
同時數據的屬性定義見下表所示,可見維度非常豐富。
考慮到商用航空行業與一般商業形態的不同,決定在RFM模型的基礎上,增加2個指標用於客戶分群與價值分析,得到航空行業的LRFMC模型:
- L:客戶關係長度。客戶加入會員的日期至觀測窗口結束日期的間隔。(單位:天)
- R:最近一次乘機時間。最近一次乘機日期至觀測窗口結束日期的間隔。(單位:天)
- F:乘機頻率。客戶在觀測窗口期內乘坐飛機的次數。(單位:次)
- M:飛行總里程。客戶在觀測窗口期內的飛行總里程。(單位:公里)
- C:平均折扣率。客戶在觀測窗口期內的平均折扣率。(單位:無)
首先對原始數據進行探索,清洗異常記錄,再根據上述公式將原始數據表變換得到LRFMC模型建模需要的新數據表,接著對新數據表的數據進行屬性規約、數據變換、Python建模、結果分析,便能得到最終的結果。
總體思路與流程見下圖:
由於本實例中的數據已經得到,顧不需要在業務系統中抽取數據,直接開始對數據進行預處理即可。
2.2 數據預處理
2.2.1 數據探索
import pandas as pddata = pd.read_csv(datafile, encoding = utf-8)explore = data.describe(percentiles = [], include = all).Texplore[null] = len(data) - explore[count]
經過初步的數據探索,發現數據有幾點特徵:
- 共62988條記錄
- 部分維度存在缺失值,WORK_CITY缺失2269條,SUM_YR_1缺失551條,SUM_YR_2缺失138條
2.2.2 數據清洗
此處主要清洗兩類異常數據:
- 缺失值:票價為null的數據(注意不是票價為零)
- 異常值:票價為0、平均折扣率不為0、總飛行公里數大於0的數據(折扣不為0,仍有飛行里程,說明客戶必然是花錢買票飛行的,如果此時票價也為0,說明是錯誤數據)
# 剔除票價為空值的記錄dataCleaned_1 = data[data[SUM_YR_1].notnull()&data[SUM_YR_2].notnull()]# 剔除票價為0、平均折扣率不為0、總飛行公里數大於0的記錄flag1 = dataCleaned_1[SUM_YR_1] != 0flag2 = dataCleaned_1[SUM_YR_2] != 0flag3 = (dataCleaned_1[SEG_KM_SUM] == 0) & (dataCleaned_1[avg_discount] == 0)dataCleaned = dataCleaned_1[flag1 | flag2 | flag3]dataCleaned = dataCleaned.reset_index(drop=True) # 刪除異常值後重新建立索引
共清洗944條異常數據,得到62044條有效記錄。
2.2.3 屬性規約
根據LRFMC模型,選取與模型強相關的6個屬性:LOAD_TIME、FFP_DATE、LAST_TO_END、LIGHT_COUNT、SEG_KM_SUM、avg_discount。刪除其他冗餘的、弱相關的屬性,得到屬性選擇後的數據集。
dataSpec = dataCleaned[[LOAD_TIME, FFP_DATE, LAST_TO_END, FLIGHT_COUNT, SEG_KM_SUM, avg_discount]]
2.2.4 數據變換
構建包含L、R、F、M、C五項指標的新數據表,並對應屬性定義表,得到LRFMC模型中五項指標的計算公式:
- L = LOAD_TIME - FFP_DATE. (觀測窗口結束日期 - 入會日期)
- R = LAST_TO_END. (最後一次乘機時間至觀測窗口結束時長)
- F = FLIGHT_COUNT. (觀測窗口內的飛行次數)
- M = SEG_KM_SUM. (觀測窗口的總飛行公里數)
- C = AVG_DISCOUNT. (平均折扣率)
利用2.2.3中的數據表計算得到變換後的數據表。
dataTransformed = pd.DataFrame(columns=[L, R, F, M, C]) tmp = { L:pd.to_datetime(dataSpec[LOAD_TIME]) - pd.to_datetime(dataSpec[FFP_DATE]), # 需要將LOAA_TIME & FFP_DATE 兩列先轉化為datetime格式,再進行相減 R:dataSpec[LAST_TO_END], F:dataSpec[FLIGHT_COUNT], M:dataSpec[SEG_KM_SUM], C:dataSpec[avg_discount], }dataTransformed = pd.DataFrame(data = tmp, columns = [L, R, F, M, C]) import numpy as np# 將timedelta64格式轉化為int32格式dataTransformed[L] = (dataTransformed[L] / np.timedelta64(1, D)).astype(int)
結果如下圖所示:
從表中可以發現,每個指標的數據取值範圍分布較廣,為提高後續聚類分析的準確性,還需要將L、R、F、M、C五類數據進行標準化處理。標準化方法有極大極小標準化、標準差標準化等方法,此處採用標準差標準化的方法對數據進行處理。
dataZscore = (dataTransformed - dataTransformed.mean(axis=0)) / dataTransformed.std(axis=0)dataZscore.columns = [Z + i for i in dataTransformed.columns]
結果如下圖所示:
標準差標準化後,得到包含ZL、ZR、ZF、ZM、ZC五項指標的數據集。
2.3 數據建模
客戶價值分析模型構建主要分為兩個部分:
- 利用K-Means演算法對客戶進行聚類分析,得到細分的客戶群
- 對細分的客戶群進行特徵分析,得到客戶價值分析模型
2.3.1 聚類分析
採用K-Means聚類演算法對客戶數據進行分群,共分為5類。
from sklearn.cluster import KMeansk = 5 # 共分為5類kmodel = KMeans(n_clusters = k, n_jobs = 4)kmodel.fit(dataZscore)kmodel.cluster_centers_kmodel.labels_
得到結果後,將結果轉化為DataFrame對象。
kmeansCenters = pd.DataFrame(kmodel.cluster_centers_, columns = dataZscore.columns)labelsCounts = pd.DataFrame(kmodel.labels_)[0].value_counts()kmeansLabels = pd.DataFrame(labelsCounts, index = None)kmeansLabels.columns = [Num]kmeansResult = pd.concat([kmeansCenters, kmeansLabels], axis=1)kmeansResult[Class] = [1,2,3,4,5]kmeansResult = kmeansResult[[Class,Num, ZL, ZR, ZF, ZM, ZC]]
結果如下圖所示:
以及對62044位客戶貼上群體標籤,記為1、2、3、4、5五類,並輸出帶有標籤的Excel文件。
dataLabels = pd.DataFrame(kmodel.labels_, columns= [CLASS]) + 1dataResult = pd.concat([dataCleaned, dataLabels],axis=1)dataResult.to_excel(tmp/dataResult.xlsx)
結果如下圖所示:
2.3.2 特徵分析
對2.3.2中的聚類結果進行特徵分析,如下圖所示。
分析:
- 群體1的C屬性上最大
- 群體2的M、F屬性屬性最大,R屬性最小
- 群體3的L、C屬性最小
- 群體4的R屬性最大,F、M屬性最小
- 群體5的L屬性最大
其中每項指標的實際業務意義為:
- L:加入會員的時長。越大代表會員資歷越久
- R:最近一次乘機時間。越大代表越久沒乘機
- F:乘機次數。越大代表乘機次數越多
- M:飛行總里程。越大代表總里程越多
- C:平均折扣率。越大代表折扣越弱,0表示0折免費機票,10代表無折機票
對應實際業務對聚類結果進行分值離散轉化,對應1-5分,其中屬性值越大,分數越高。
同時針對業務需要,及參考RFM模型對客戶類別的分類,定義五個等級的客戶類別:
- 重要保持客戶
- 平均折扣率高(C↑),最近有乘機記錄(R↓),乘機次數高(F↑)或里程高(M↑)
- 這類客戶機票票價高,不在意機票折扣,經常乘機,是最理想的客戶類型
- 公司應優先將資源投放到他們身上,維持這類客戶的忠誠度
- 重要發展客戶
- 平均折扣率高(C↑),最近有乘機記錄(R↓),乘機次數低(F↓)或里程高(M↓)
- 這類客戶機票票價高,不在意機票折扣,最近有乘機記錄,但總里程低,具有很大的發展潛力
- 公司應加強這類客戶的滿意度,使他們逐漸成為忠誠客戶
- 重要挽留客戶
- 平均折扣率高(C↑),乘機次數高(F↑)或里程高(M↑),最近無乘機記錄(R↑)
- 這類客戶總里程高,但較長時間沒有乘機,可能處於流失狀態
- 公司應加強與這類客戶的互動,召回用戶,延長客戶的生命周期
- 一般客戶
- 平均折扣率低(C↓),最近無乘機記錄(R↑),乘機次數低(F↓)或里程低(M↓),入會時間短(L↓)
- 這類客戶機票票價低,經常買折扣機票,最近無乘機記錄,可能是趁著折扣而選擇購買,對品牌無忠誠度
- 公司需要在資源支持的情況下強化對這類客戶的聯繫
- 低價值客戶
- 平均折扣率低(C↓),最近無乘機記錄(R↑),乘機次數低(F↓)或里程低(M↓),入會時間短(L↓)
- 這類客戶與一般客戶類似,機票票價低,經常買折扣機票,最近無乘機記錄,可能是趁著折扣而選擇購買,對品牌無忠誠度
根據聚類結果,對應上述五類客戶類型,進行匹配,得到客戶群體的價值排名。
在數據與處理時,我們已經將62044位用戶與客戶群體一一對應,現在每類客戶群體也對應了客戶價值,至此得到了62044位客戶的價值分類結果,建模完成。
3 分析結果
根據建模結果,發現該公司的五類不同價值的客戶數量分布如圖所示。
對數據進行可視化,如下圖所示。
分析:
- 重要保持客戶、重要發展客戶佔比15.3%,不足兩成,整體較少
- 一般客戶、低價值客戶佔比59.3%,接近六成,整體偏多
- 重要挽留客戶佔比25.4%,接近四分之一,整體發揮空間大
按照20/80法則,一般而言企業的80%收入由頭部20%的用戶貢獻,從上圖中也能發現,忠誠的重要保留客戶、中發展客戶必然貢獻了企業收入的絕大部分,企業也需要投入資源服務好這部分客戶。
同時,重要保持客戶、重要發展客戶、重要挽留客戶這三類客戶其實也對應著客戶生命周期中的發展期、穩定器、衰退期三個時期。從客戶生命周期的角度講,也應重點投入資源召回衰退期的客戶。
一般而言,數據分析最終的目的是針對分析結果提出並開展一系列的運營/營銷策略,以期幫助企業發展。在本實例中,運營策略有三個方向:
- 提高活躍度:提高一般客戶、低價值客戶的活躍度。將其轉化為優質客戶
- 提高留存率:與重要挽留客戶互動,提高這部分用戶的留存率
- 提高付費率:維繫重要保持客戶、重要發展客戶的忠誠度,保持企業良好收入
每個方向對應不同的策略,如會員升級、積分兌換、交叉銷售、發放折扣券等手段,此處不再展開。
推薦閱讀:
※推薦系統乾貨總結
※視角觀察:四個話題讀懂大數據醫療
※【Live預告】如何從0開始通過參加Kaggle拿到Amazon實習Offer?
※量化投資必讀書目(三)——《量化投資:數據挖掘技術與實踐(MATLAB版)》
※【譯文】集成學習三大法寶-bagging、boosting、stacking