29、RFM客戶價值分析(有圖有案例)
阿新 • • 發佈:2018-12-07
RFM分析:是根據使用者活躍程度和交易金額貢獻,進行客戶價值細分的一種方法
一、分析指標
指標 | 解釋 | 意義 |
R(Recency)近度 | 客戶最近一次交易時間的間隔 | R越小,表示客戶越近有交易發生 |
F(Frequency)頻度 | 客戶最近一段時間內交易的次數 | F越大,表示交易越頻繁 |
M(Monetary)額度 | 客戶最近一段時間內交易的金額 | M越大,表示客戶價值越高 |
二、客戶分類
更多見圖
三、RFM分析步驟
1 計算RFM各項分值
R_S, 距離當前日期越近,得分越高,最高5份,最低1份
F_S,交易頻率越高,得分越高, 最高5份,最低1份
M_S,交易金額越高,得分越高, 最高5份,最低1份
2 彙總RFM分值
RFM=100*R_S+10*F_S+1*M_S
3 根據RFM分值對客戶分類
RFM分析前提
1 最近有過交易行為的客戶,再次發生交易的可能性高高於最近沒有交易行為的客戶
2 交易頻率較高的客戶比交易頻率較低的客戶,更有可能再次發生交易行為;
3 過去所有交易總金額較多的客戶,比交易總金額較少的客戶,更有消費積極性
四、分析例項
import pandas data=pandas.read_csv( 'D:\\DATA\\pycase\\5.7\\data.csv' ) # 進行時間格式的轉化 data['DealDateTime']=pandas.to_datetime( data.DealDateTime, format='%Y/%m/%d' ) ## 計算距離當前日期的時間 data['DateDiff']=pandas.to_datetime( 'today' )-data['DealDateTime'] # 第一、計RFM各項分值 # 拆取時間天數 data['DateDiff']=data['DateDiff'].dt.days # 根據分組項ID負統計列DateDiff進行分組 import numpy R_Agg=data.groupby( by=['CustomerID'] )['DateDiff'].agg({ 'recenyAgg':numpy.min }) # 同上求取使用者的消費頻次 F_Agg=data.groupby( by=['CustomerID'] )['OrderID'].agg({ 'FrequencyAgg':numpy.size }) # 同上求取使用者的消費總額 M_Agg=data.groupby( by=['CustomerID'] )['Sales'].agg({ 'MoneyaryAgg':numpy.sum }) 第二、彙總RFM分值 # 對資料列進行整合 aggData=R_Agg.join(F_Agg).join(M_Agg) # 進行陣列的劃分,對最近日期區間劃分 # 利用分位數方法進行分組,分為5組,為6分法 # quantile 分位數查詢對應的數值,沒有的話查詢最近的位數 bins=aggData.recenyAgg.quantile( q=[0,0.2,0.4,0.6,0.8,1], interpolation='nearest' ) # 將分組最小值初始化為0 # 為了避免最小值不閉合,輸出最小值為空的錯誤 # cut分組,預設左開右閉 bins[0]=0 # 自定義標籤,分別為1到5分 labels=[5,4,3,2,1] R_S=pandas.cut( aggData.recenyAgg, bins, labels=labels ) # 進行陣列的劃分,對最近頻次 # 利用分位數方法進行分組,分為5組,為6分法 bins=aggData.FrequencyAgg.quantile( q=[0,0.2,0.4,0.6,0.8,1], interpolation='nearest' ) bins[0]=0 # 自定義標籤,分別為1到5分 labels=[1,2,3,4,5] F_S=pandas.cut( aggData.FrequencyAgg, bins, labels=labels ) # 進行陣列的劃分,對最大消費進行劃分 # 利用分位數方法進行分組,分為5組,為6分法 bins=aggData.MoneyaryAgg.quantile( q=[0,0.2,0.4,0.6,0.8,1], interpolation='nearest' ) bins[0]=0 # 自定義標籤,分別為1到5分 labels=[1,2,3,4,5] M_S=pandas.cut( aggData.MoneyaryAgg, bins, labels=labels ) # 最後將計算得變數賦值會資料框裡邊 aggData['R_S']=R_S aggData['F_S']=F_S aggData['M_S']=M_S # 第三、客戶分類 ## RFM公式計算,需要將字元竄轉換為int資料格式 aggData['RFM']=100*R_S.astype(int)+10*F_S.astype(int)+1*M_S.astype(int) # 對得分進行分組處理 ## 根據型別分為8種客戶型別 bins=aggData.RFM.quantile( q=[0,0.125,0.25,0.375,0.5,0.625,0.75,0.875,1], interpolation='nearest' ) bins[0]=0 labels=[1,2,3,4,5,6,7,8] aggData['Level']=pandas.cut( aggData.RFM, bins, labels=labels ) ## aggData=aggData.reset_index() ### 對得分進行排序,需要用sort_value 屬性 aggData_sort=aggData.sort_values( ['Level','RFM'], ascending=[1,1] ) ## 對分組進行個數統計 aggData.groupby( by=['Level'] )['CustomerID'].agg({ 'size':numpy.size })