如何用Python進行RFM分析

RFM分析,是根據客戶活躍程度和交易金額貢獻,進行客戶價值細分的一種客戶細分方法。RFM分析,主要由三個指標組成,分別爲R(Recency)近度、F(Frequency)頻度、M(Monetary)額度組成。
如何用Python進行RFM分析python

  • R表示近度(Recency):也就是客戶最近一次交易時間到如今的間隔,注意,R是最近一次交易時間到如今的間隔,而不是最近一次的交易時間,R越大,表示客戶越久未發生交易,R越小,表示客戶越近有交易發生。
  • F表示頻度(Frequency):也就是客戶在最近一段時間內交易的次數,F越大,表示客戶交易越頻繁,F越小,表示客戶不夠活躍。
  • M表示額度(Monetary):也就是客戶在最近一段時間內交易的金額,M越大,表示客戶價值越高,M越小,表示客戶價值越低。

下面是一張經典RFM客戶細分模型圖,以下圖所示。
如何用Python進行RFM分析
R分值、F分值和M分值三個指標構成了一個三維立方圖,在各自維度上,根據得分值又能夠分爲高和低兩個分類,最終三個指標,每一個指標分爲高低兩類,兩兩組合,就細分爲八大客戶羣體。
例如R分值高,F分值高,M分值高的客戶爲重要價值客戶,R、F、M三個分值都低的客戶爲潛在客戶,其餘類型客戶以此類推動行解讀便可。ide

RFM分析步驟以下圖所示。
如何用Python進行RFM分析函數

STEP01 數據準備

下面經過一個案例學習RFM分析的使用,首先將數據導入到data變量,代碼以下:學習

import pandas
data = pandas.read_csv(
    'D:/RFM分析.csv',
    engine='python')

長按識別下方二維碼,關注公衆號
回覆「RFM」獲取案例數據
如何用Python進行RFM分析
執行代碼,便可獲得data數據框,以下圖所示。
如何用Python進行RFM分析
能夠看到,第一列爲訂單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

執行代碼,便可獲得交易日期距離指定日期的天數,以下圖所示。
如何用Python進行RFM分析code

STEP02 計算R、F、M

數據準備好後,接下來就能夠計算每一個客戶的最近消費距離R、消費頻率F以及消費總額M,計算方法以下:orm

  • 最近消費距離R:使用CustomerID做爲分組列,距離指定日期間隔天數Days做爲統計列,統計函數使用最小值函數min,便可獲得每一個客戶的最近消費距離R。
  • 消費頻率F:使用CustomerID做爲分組列,OrderID做爲統計列,統計函數使用計數函數count。
  • 消費總額M:使用CustomerID做爲分組列,訂單金額Sales做爲統計列,統計函數使用求和函數sum。
    代碼以下:
# 統計每一個客戶距離指定日期有多久沒有消費了,即找出最小的最近消費距離
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')

執行代碼,獲得的結果以下圖所示。
如何用Python進行RFM分析
接下來使用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']

執行代碼,獲得的結果以下圖所示。
如何用Python進行RFM分析pandas

STEP03 將R、F、M分組打分賦值

各個客戶的R、F、M數據計算好後,接下來就能夠對R、F、M這三個列進行分組打分賦值獲得對應的R分值、F分值、M分值。
分組標準能夠按照平均值、業務經驗等標準進行劃分。若是沒有特別的標準,一般採用平均值進行劃分。
本例將R、F、M三列分別按照各自的平均值劃分爲2個組,並賦值1分、2分。it

  • R分值(R_S):定義爲距離指定日期越近,R_S越大,R>=平均值,R_S爲1,R<平均值,R_S爲2。
  • F分值(F_S):定義爲交易頻率越高,F_S越大,F<=平均值,F_S爲1,F>平均值,F_S爲2。
  • M分值(M_S):定義爲交易金額越高,M_S越大,M<=平均值,M_S爲1,M>平均值,M_S爲2。
    在Python中,可使用數據框的loc屬性將符合條件的數據行進行打分賦值,代碼以下:
# 判斷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的分組分值就計算出來了,以下圖所示。
如何用Python進行RFM分析

STEP04 計算RFM綜合分值

獲得R_S、F_S、M_S的分組分值後,接下來就能夠計算RFM綜合分值。RFM綜合分值計算公式以下所示。

RFM = 100╳R_S + 10╳F_S + 1╳M_S

爲何設置R_S的權重爲100,F_S的權重爲10,M_S的權重爲1呢?
這樣設置至關分別爲百位、十位、個位的組合,以確保RFM綜合分值順序與RFM客戶細分模型的分類順序一致。
RFM綜合分值計算的代碼以下:

計算RFM綜合分值

RFMData['RFM'] = 100*RFMData.R_S+10*RFMData.F_S+1*RFMData.M_S

執行代碼,獲得的RFM綜合分值以下圖所示。
如何用Python進行RFM分析

STEP05 客戶分類

接下來根據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)

執行代碼,獲得的數據以下圖所示。
如何用Python進行RFM分析
能夠看到,最後一列數據,就是對每一個客戶細分的客戶類型。
最後,咱們來看看,每一個類別的客戶數是多少,代碼以下:

# 按RFM、Type進行分組統計客戶數
RFMData.groupby(
    by=['RFM','Type'] 
)['CustomerID'].agg('count')

執行代碼,就能夠獲得各個客戶類型的客戶數了。
如何用Python進行RFM分析
後續就能夠對不一樣的客戶羣體,有針對性地採起相應運營策略進行推廣、管理,進而提高客戶價值和營收水平。

長按識別下方二維碼,並關注公衆號
如何用Python進行RFM分析

相關文章
相關標籤/搜索