基於RFM的P2P平台用戶聚類模型
前言:
P2P,英文全稱Peer to Peer,一般指兩個主體:資金需求方與資金供給方。資金需求方在網貸平台上發布借貸需求,資金供給方根據自身情況提供資金給需求方,以此完成借貸。P2P網貸平台以其快捷性、高效性、靈活性等優勢迅速吸引了大量個人和小微企業尋求融資,又由於其投資利率高、流程方便快捷,也吸引了大量投資者的參與。作為互聯網金融的一種新模式,P2P網貸從2013年開始大量投資者的參與。作為互聯網金融的一種新模式,P2P網貸從2013年開始呈現爆髮式增長,並於2015年達到頂峰。
對於P2P網路借貸平台而言,不同的客戶群體具有不同的內在商業價值。通過一些有效方法對客戶進行分類,發現客戶內在價值的分布特徵和變化規律,並基於分類的結果制定差異化的服務內容,可以有效提高P2P平台在客戶管理方面的效率和精確度。
另外,經歷了2015-2016年的行業亂象,大量的平台倒閉、跑路、投資者對P2P的投資態度更加趨于謹慎保守。如何提高投資用戶的交易轉化率,增加用戶黏度,是P2P平台的一大『瓶頸』,也是一大關鍵問題。通過建立合理的用戶分類模型,分析比較不同客戶群的特徵和客戶價值,有針對性地制定相應的個性化客戶服務,可以幫助提高投資用戶的留存率。
案例背景:
本案例針對P2P投資用戶提出了一種基於改進RFM指標的客戶分類方法。我們首先根據RFM框架確定用戶的分析指標,再應用K均值聚類演算法對客戶進行分類,再基於分類結果,結合業務經驗,分析每一類客戶的行為特徵和價值,為後續的差異化營銷策略提供支持。
應用技術:
為了有效衡量P2P用戶的客戶價值和創造能力,我們選擇了客戶關係管理分析模式中使用較為廣泛的RFM分析框架。RFM框架如圖所示,
使用的三個指標分別表示客戶最近一次購買時間間隔(recency),客戶最近一段時間內購買次數(frequency)和客戶最近一段時間內購買金額(monetary),使用RFM框架即通過這3個指標對客戶進行分層,以此為基礎衡量客戶的價值水平,並針對性地投入營銷資源。
K-means聚類演算法屬於無監督學習範疇,是在樣本特徵已知,樣本標籤未知的情況下對樣本進行分類。
需要注意的是,由於經濟、市場等外部因素影響,用戶的投資行為往往是持續變化的,對用戶行為的界定標準與時間密切關係。因此,我們需要不斷對模型進行調整和迭代,優化用戶劃分標準,然後和業務結果進行比較,形成反饋機制,驗證模型的準確性,才能提升用戶運營的效率,挖掘用戶內在價值。
數據說明:
案例為公開源數據,是從某三個月時間段內的用戶投標交易相關詳細信息和數據,投標用戶限定為具有有效身份證號碼的P2P個人用戶。數據概況如下:
ID:用戶ID
RECENT_DATE:最近交易時間
TRANS_NUM:投資次數
AVG_TRANS_AMT:平均單筆投資金額
TRANS_NUM_BEFORE:90天前投資次數
分析過程:
1.獲取數據
# 導入需要的庫,並讀取 csv 文件。import pandas as pddata = pd.read_csv(data.csv, encoding = utf-8) data.head(5)
2.數據預處理
data.describe()
由於原始數據中存在部分缺失值,以及數據格式不統一的情況,需要進行數據清洗和屬性轉換等預處理步驟。
具體操作內容如下:
1.過濾掉用戶ID為空的用戶投資記錄;
data = data[data[ID].notnull()]
2.投資金額或投資次數為NULL,統一填充為0;
data = data.fillna(0)
3.將交易時間統一為時間格式
data.to_csv(clean_data.csv) data.head()
3.計算RFM指標
首先,將P2P用戶群中的流失用戶和沉默用戶分離出來,作單獨處理。流失用戶即為觀測時間之前(90天前)曾有過投資交易記錄,但觀測時間段內無投資記錄的用戶;沉默用戶即為註冊用戶至今,從未有過任何一筆投資交易記錄的用戶。
接著,提取建立聚類模型所需要的RFM指標,注意該指標只針對觀測窗內有過投資交易記錄的用戶。具體計算方式如下:
A.R=觀測窗口結束後一天與觀測窗口內最近交易時間相差的天數
B.F=觀測窗口內用戶投資次數總和
C.M=觀測窗口內用戶平均單筆投資金額
# 讀入清洗後的用戶投資數據。data = pd.read_csv(clean_data.csv, encoding = utf-8)# 標記流失用戶和沉默用戶。data[RFM] = data[USR_TYPE] = # 流失用戶 ( L ) 即為觀測時間前曾有投資交易記錄,但觀測時間段內無投資記錄的用戶。data.ix[(data.TRANS_NUM_BEFORE > 0) & (data.TRANS_NUM == 0),[USR_TYPE]] = L data.ix[(data.TRANS_NUM_BEFORE > 0) & (data.TRANS_NUM == 0),[RFM]] = 000# 沉默用戶 ( S ) 即為註冊開戶至今,從未有過任何一筆投資交易記錄的用戶。data.ix[(data.TRANS_NUM_BEFORE == 0) & (data.TRANS_NUM == 0),[USR_TYPE]] = Sdata.ix[(data. TRANS_NUM_BEFORE == 0) & (data.TRANS_NUM == 0),[RFM]] = 000# 計算最近交易時間距離 2018 年 2 月 14 日的天數。data[DAYS] = [(pd.to_datetime(02/14/2018)- pd.to_datetime(str(t))).days for t in data[RECENT_DATE]] # 計算觀測窗內有投資交易記錄的用戶的 R,F,M 指標。data[R] = data[data.TRANS_NUM > 0][DAYS]data[F] = data[data.TRANS_NUM > 0][TRANS_NUM]data[M] = data[data.TRANS_NUM > 0][AVG_TRANS_AMT]# 篩選有效 R,F,M 指標存入單獨 dataframe,用於後續建立模型。data_RFM = data[[R,F,M]].dropna()data.head(15)
4.數據標準化
為克服變數間測量單位的不同對聚類分析結果產生不合理的影響,因此要對各變數的值進行標準化變換。標準化變換有多種方式,本案例主要採用
最小-最大化標準化
X* = (x-x.min)/(x.max-x.min)
以及零均值標準化
x = (a-a.mean())/a.std()
from sklearn import preprocessingfrom pandas import DataFrame#最小-最大標準化min_max_scaler = preprocessing.MinMaxScaler()data_minmax = pd.DataFrame(min_max_scaler.fit_transform(data_RFM), columns = [R,F,M])# 零均值標準化data_scale = pd.DataFrame(preprocessing.scale(data_RFM), columns = [R,F,M])
最大-最小標準化RFM指標
data_minmax.head()
零均值標準化RFM指標
data_scale.head()
5.K-means聚類最優K值選擇
K-menns聚類演算法需要指定聚類個數K值的大小,也就是用戶類別的數量。選用最優K值的常用指標有組內平方和與輪廓係數。
根據聚類分析的結果,我們可以把用戶分為K類,對每一類用戶分別算出其R、F、M指標的相應平均值,對於反向指標R,低於平均值則賦值為1,高於平均值則賦值為0;對於F和M指標則相反,高於平均值則賦值為1,低於為0.最後,按照結果立方圖可以區分出每一類用戶類別
import numpy as npfrom sklearn.cluster import KMeans# 設置模型參數,其中 n_cluster 為類別的個數,並開始訓練。model = KMeans(n_clusters = 8)model.fit(data_scale)# 對每一類用戶分別算出其 R、F、M 指標的相應平均值,高於平均值則賦值為 1,低於平均值則賦值為 0,R 指標則相反。avg_RFM = [np.mean(data_scale.R),np.mean(data_scale.F), np.mean(data_scale.M)] RFM = pd.DataFrame()RFM[R_type] = [1 if value[0] <= avg_RFM[0] else 0 for value in model.cluster_centers_]RFM[F_type] = [1 if value[1] >= avg_RFM[0] else 0 for value in model.cluster_centers_]RFM[M_type] = [1 if value[2] >= avg_RFM[0] else 0 for value in model.cluster_centers_]# 將 RFM 三個指標連接起來。RFM[RFM] = RFM.R_type + RFM.F_type + RFM.M_type# 最後,得到每個用戶通過聚類模型預測的類型結果。data.ix[data.TRANS_NUM > 0,[RFM]] = [RFM.ix[i,RFM] for i in model.labels_]
data.RFM.head()
實施與結果
R代表用戶最近交易時間距離2016年11月1日的天數,F代表觀測時間內用戶投標的次數,M代表觀測時間內用戶的每筆投標金額。
方法一
為了評價模型效果,我們使用組內平方和(SSE)作為評價指標,組內平方和表示的是每個組內各樣本數據與其組均值的誤差平方和,可以反映每個用戶樣本各觀測值的離散情況。依據組內平方和選擇最優K值的方法稱為肘部法則,即繪製出不同K值和對應組內平方和的趨勢圖,圖上的拐點代表了潛在的最佳K值。
隨機重複抽樣500名用戶,選用Scale標準化選取最佳K值
from sklearn.cluster import KMeansfrom scipy.spatial.distance import cdist%matplotlib inlineimport matplotlib.pyplot as pltK = range(1, 20)meandistortions = []data_scale_sample=data_scale.sample(n=500,replace=True)for k in K: kmeans = KMeans(n_clusters=k) kmeans.fit(data_scale) meandistortions.append(sum(np.min(cdist(data_scale_sample, kmeans.cluster_centers_, euclidean), axis=1)) / data_scale_sample.shape[0])plt.plot(K, meandistortions, bx-)plt.xlabel(k)plt.ylabel(平均畸變程度)plt.title(用肘部法則來確定最佳的K值)
隨機重複抽樣500名用戶,選用最大-最小化選取最佳K值
from sklearn.cluster import KMeansfrom scipy.spatial.distance import cdist%matplotlib inlineimport matplotlib.pyplot as pltK = range(1, 20)meandistortions = []data_minmax_sample=data_minmax.sample(n=500,replace=True)for k in K: kmeans = KMeans(n_clusters=k) kmeans.fit(data_minmax_sample) meandistortions.append(sum(np.min(cdist(data_minmax_sample, kmeans.cluster_centers_, euclidean), axis=1)) / data_scale_sample.shape[0])plt.plot(K, meandistortions, bx-)plt.xlabel(k)plt.ylabel(平均畸變程度)plt.title(用肘部法則來確定最佳的K值)
基於零均值標準化,當K=10時,結果最優;基於最小-最大標準化,當K=12,結果最優
方法二
基於零均值化規範方法,以各維度的平均值作為閾值,若大於平均值則設為1,小於平均值則為0,分別求得R、F、M值,最後根據RFM矩陣計算出用戶類型
小結:
本案例主要任務是對P2P用戶進行無監督分類,從而對不同類型用戶的價值進行分析歸納。基於RFM框架,我們選擇最直接反映用戶投資行為特徵的指標,再通過K-Means演算法對用戶進行聚類,採用不同標準化方式進行聚類建模,並對各個模型效果進行評價比較,選出最優模型K值。
之後,根據確定的最優模型結果對P2P用戶進行分類,分析歸納各個類型下的用戶顯著特徵,從而幫助公司制定不同類型客戶的營銷策略。
個人體會,機器學習可以對用戶進行精準分類,但過程沒有那麼簡單,需要建模人員對業務模式有更深刻的理解,並且在數據準備、模型選擇等各個環節都需要多方面考慮,才能做出一個有真正使用價值的模型。
推薦閱讀:
※新手科普 | MySQL手工注入之基本注入流程
※【飛天存儲服務月報】2018年6月刊
※精通Python爬蟲-01-不斷前行的蜘蛛
※【裝機幫扶站】第182期:看過了之後就放心去裝機吧!
※波士頓動力機器人再升級,機器人概念即將爆發
TAG:科技 |