基於RFM的客戶價值分析模型

基於RFM的客戶價值分析模型

來自專欄 Python 項目分析

本文用具體實例的方式,在RFM的基礎上構建客戶價值分析模型,探討如何對客戶群體進行細分,以及細分後如何進行客戶價值分析。最終得到LRFMC模型,並將客戶群體細分為重要保持客戶、重要發展客戶、重要挽留客戶、一般客戶、低價值客戶五類。

本文原始數據與分析思路來自《Python數據分析與挖掘實戰》第七章,感謝這本書提供的數據集與分析框架。(這本書很不錯,推薦)


1 背景與目標

1.1 背景

在面向客戶制定運營策略、營銷策略時,我們希望能夠針對不同的客戶推行不同的策略,實現精準化運營,以期獲取最大的轉化率。精準化運營的前提是客戶關係管理,而客戶關係管理的核心是客戶分類。通過客戶分類,對客戶群體進行細分,區別出低價值客戶、高價值客戶,對不同的客戶群體開展不同的個性化服務,將有限的資源合理地分配給不同價值的客戶,實現效益最大化。

在客戶分類中,RFM模型是一個經典的分類模型,模型利用通用交易環節中最核心的三個維度——最近消費(Recency)、消費頻率(Frequency)、消費金額(Monetary)細分客戶群體,從而分析不同群體的客戶價值。

在某些商業形態中,客戶與企業產生連接的核心指標會因產品特性而改變。如互聯網產品中,以上三項指標可以相應地變為下圖中的三項:最近一次登錄、登錄頻率、在線時長。

1.2 目標

本實例藉助某航空公司客戶數據,探討如何利用KMeans演算法對客戶群體進行細分,以及細分後如何利用RFM模型對客戶價值進行分析,並識別出高價值客戶。

在本實例中,主要希望實現以下三個目標:

  1. 藉助航空公司客戶數據,對客戶進行群體分類
  2. 對不同的客戶群體進行特徵分析,比較各細分群體的客戶價值
  3. 對不同價值的客戶制定相應的運營策略

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]

經過初步的數據探索,發現數據有幾點特徵:

  1. 共62988條記錄
  2. 部分維度存在缺失值,WORK_CITY缺失2269條,SUM_YR_1缺失551條,SUM_YR_2缺失138條

2.2.2 數據清洗

此處主要清洗兩類異常數據:

  1. 缺失值:票價為null的數據(注意不是票價為零)
  2. 異常值:票價為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 數據建模

客戶價值分析模型構建主要分為兩個部分:

  1. 利用K-Means演算法對客戶進行聚類分析,得到細分的客戶群
  2. 對細分的客戶群進行特徵分析,得到客戶價值分析模型

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%的用戶貢獻,從上圖中也能發現,忠誠的重要保留客戶、中發展客戶必然貢獻了企業收入的絕大部分,企業也需要投入資源服務好這部分客戶。

同時,重要保持客戶、重要發展客戶、重要挽留客戶這三類客戶其實也對應著客戶生命周期中的發展期、穩定器、衰退期三個時期。從客戶生命周期的角度講,也應重點投入資源召回衰退期的客戶。

一般而言,數據分析最終的目的是針對分析結果提出並開展一系列的運營/營銷策略,以期幫助企業發展。在本實例中,運營策略有三個方向:

  1. 提高活躍度:提高一般客戶、低價值客戶的活躍度。將其轉化為優質客戶
  2. 提高留存率:與重要挽留客戶互動,提高這部分用戶的留存率
  3. 提高付費率:維繫重要保持客戶、重要發展客戶的忠誠度,保持企業良好收入

每個方向對應不同的策略,如會員升級、積分兌換、交叉銷售、發放折扣券等手段,此處不再展開。

推薦閱讀:

推薦系統乾貨總結
視角觀察:四個話題讀懂大數據醫療
【Live預告】如何從0開始通過參加Kaggle拿到Amazon實習Offer?
量化投資必讀書目(三)——《量化投資:數據挖掘技術與實踐(MATLAB版)》
【譯文】集成學習三大法寶-bagging、boosting、stacking

TAG:數據分析 | 數據挖掘 | 客戶價值 |