RFM分析,是根據客戶活躍程度和交易金額貢獻,進行客戶價值細分的一種客戶細分方法。RFM分析,主要由三個指標組成,分別爲R(Recency)近度、F(Frequency)頻度、M(Monetary)額度組成。python
下面是一張經典RFM客戶細分模型圖,以下圖所示。
R分值、F分值和M分值三個指標構成了一個三維立方圖,在各自維度上,根據得分值又能夠分爲高和低兩個分類,最終三個指標,每一個指標分爲高低兩類,兩兩組合,就細分爲八大客戶羣體。
例如R分值高,F分值高,M分值高的客戶爲重要價值客戶,R、F、M三個分值都低的客戶爲潛在客戶,其餘類型客戶以此類推動行解讀便可。ide
RFM分析步驟以下圖所示。函數
下面經過一個案例學習RFM分析的使用,首先將數據導入到data變量,代碼以下:學習
import pandas data = pandas.read_csv( 'D:/RFM分析.csv', engine='python')
長按識別下方二維碼,關注公衆號
回覆「RFM」獲取案例數據
執行代碼,便可獲得data數據框,以下圖所示。
能夠看到,第一列爲訂單ID,第二列爲客戶ID,第三列爲交易日期,第四列爲交易金額。這個數據格式,也是RFM分析要求的基本數據格式。
根據交易日期,計算出交易日期距離指定日期的間隔天數,代碼以下:3d
# 將交易日期處理爲日期數據類型 data['DealDateTime'] = pandas.to_datetime( data.DealDateTime, format='%Y/%m/%d' ) # 假設2015-10-1是計算當天,求交易日期至計算當天的距離天數 data['Days'] = pandas.to_datetime('2015-10-1') - data['DealDateTime'] # 從時間距離中獲取天數 data['Days'] = data['Days'].dt.days
執行代碼,便可獲得交易日期距離指定日期的天數,以下圖所示。code
數據準備好後,接下來就能夠計算每一個客戶的最近消費距離R、消費頻率F以及消費總額M,計算方法以下:orm
# 統計每一個客戶距離指定日期有多久沒有消費了,即找出最小的最近消費距離 R = data.groupby( by=['CustomerID'], as_index=False )['Days'].agg('min') # 統計每一個客戶交易的總次數,即對訂單ID計數 F = data.groupby( by=['CustomerID'], as_index=False )['OrderID'].agg('count') # 統計每一個客戶交易的總額,即對每次的交易金額求和 M = data.groupby( by=['CustomerID'], as_index=False )['Sales'].agg('sum')
執行代碼,獲得的結果以下圖所示。
接下來使用merge方法,將R、F、M三個數據框關聯起來,由於它們擁有共同的列名CustomerID,而且CustomerID就是鏈接條件,在這種狀況下,on參數能夠省略不寫,代碼以下:blog
# 將R、F、M三個數據框關聯,merge默認內鏈接,可省略,兩表on條件的關聯列名均爲CustomerID,一樣可省略 RFMData = R.merge(F).merge(M) # 修改列名 RFMData.columns = ['CustomerID', 'R', 'F', 'M']
執行代碼,獲得的結果以下圖所示。pandas
各個客戶的R、F、M數據計算好後,接下來就能夠對R、F、M這三個列進行分組打分賦值獲得對應的R分值、F分值、M分值。
分組標準能夠按照平均值、業務經驗等標準進行劃分。若是沒有特別的標準,一般採用平均值進行劃分。
本例將R、F、M三列分別按照各自的平均值劃分爲2個組,並賦值1分、2分。it
# 判斷R列是否大於等於R列的平均值,使用loc將符合條件R_S列的值賦值爲1 RFMData.loc[RFMData['R'] >= RFMData.R.mean(), 'R_S'] = 1 # 判斷R列是否小於R列的平均值,使用loc將符合條件R_S列的值賦值爲2 RFMData.loc[RFMData['R'] < RFMData.R.mean(), 'R_S'] = 2 #同R_S賦值方法,對F_S、M_S進行賦值,但與R相反,F、M均爲越大越好 RFMData.loc[RFMData['F'] <= RFMData.F.mean(), 'F_S'] = 1 RFMData.loc[RFMData['F'] > RFMData.F.mean(), 'F_S'] = 2 RFMData.loc[RFMData['M'] <= RFMData.M.mean(), 'M_S'] = 1 RFMData.loc[RFMData['M'] > RFMData.M.mean(), 'M_S'] = 2
執行代碼,R_S、F_S、M_S的分組分值就計算出來了,以下圖所示。
獲得R_S、F_S、M_S的分組分值後,接下來就能夠計算RFM綜合分值。RFM綜合分值計算公式以下所示。
爲何設置R_S的權重爲100,F_S的權重爲10,M_S的權重爲1呢?
這樣設置至關分別爲百位、十位、個位的組合,以確保RFM綜合分值順序與RFM客戶細分模型的分類順序一致。
RFM綜合分值計算的代碼以下:
RFMData['RFM'] = 100*RFMData.R_S+10*RFMData.F_S+1*RFMData.M_S
執行代碼,獲得的RFM綜合分值以下圖所示。
接下來根據RFM客戶細分模型,將客戶細分爲八種不一樣的類型。本例採用與RFM綜合分值客戶類型的對應關係表匹配合並的方式實現客戶分類。
首先將各個RFM綜合分值與客戶類型的對應關係定義爲一個數據框。
而後再使用merge中的內鏈接inner方法,將RFMData數據框與剛定義的RFM綜合分值客戶類型的對應關係表,根據關聯列名RFM匹配合併爲一個數據框,這樣就完成了客戶分類的操做,代碼以下:
# 定義RFM綜合分值與客戶類型的對應關係表 CustomerType = pandas.DataFrame( data={ 'RFM': [111,112,121,122,211,212,221,222] 'Type': ['潛在客戶','重點挽留客戶','通常保持客戶','重點保持客戶', '通常發展客戶','重點發展客戶','通常價值客戶','高價值客戶'] } ) # 將RFMData與RFM綜合分值客戶類型的對應關係表合併爲一個數據框 # merge默認內鏈接,可省略,兩表on條件的關聯列名均爲RFM,一樣可省略 RFMData = RFMData.merge(CustomerType)
執行代碼,獲得的數據以下圖所示。
能夠看到,最後一列數據,就是對每一個客戶細分的客戶類型。
最後,咱們來看看,每一個類別的客戶數是多少,代碼以下:
# 按RFM、Type進行分組統計客戶數 RFMData.groupby( by=['RFM','Type'] )['CustomerID'].agg('count')
長按識別下方二維碼,並關注公衆號