【數(shù)據(jù)分析思維】RFM用戶分層

01、寫在前面

隨著互聯(lián)網(wǎng)流量紅利的逐漸消失,之前粗狂式的拓客和一刀切的用戶運營已經(jīng)難以為繼,越來越多的公司開始意識到,只靠燒錢圈用戶、養(yǎng)用戶成本太高,因為不是所有的用戶都需要你重點投入,金主爸爸一定要好好維護,潛力股一定要加大投入挖掘價值,而羊毛黨永遠都是你應該嚴防的對象,這就是所謂的精細化運營,錢要花在刀刃上,要花在業(yè)務和核心用戶上。

精細化運營講究的是千人千面,一千類用戶一千種運營策略,所以第一步就是要把用戶進行分類,然后才有針對性的運營策略,而用戶分類中一種尤為重要和常用的方法就是RFM。

02、什么是RFM?? ? ? ?

什么是RFM?RFM最早產(chǎn)生于電商領域,根據(jù)客戶的交易頻次和交易額衡量客戶的價值,對客戶進行細分。RFM是衡量客戶價值的三個維度,分別為R(Recency)交易間隔、F(Frequency)交易頻度、M(Monetary)交易金額組成。

R表示間隔(Recency):也就是客戶最近一次交易距今的間隔,需要注意的是,R是

最近一次交易時間到現(xiàn)在的間隔,而不是最近一次的交易時間,R越大,表示客戶越久

未發(fā)生交易,反之R越小,表示客戶越近有交易發(fā)生。

F表示頻次(Frequency):也就是客戶在最近一段時間內(nèi)交易的次數(shù),一般來說

選取一個特定的時間段,F(xiàn)越大,表示客戶交易越頻繁,反之F越小,表示客戶不夠

活躍。

M表示額度(Monetary):也在同樣的時間段內(nèi),客戶交易的金額,M越大,表示

客戶價值越高,M越小,表示客戶價值越低。

有了以上3個維度的數(shù)據(jù),就可以對每個用戶按照每個維度進行衡量,一般來說我們會選取一個合理的分值對R、F、M進行劃分,將3個維度分別分為高、低兩類,組合下來就是8類,也就形成了8個用戶群體。當然你說我每個維度分成3類行不行,最終分成27個用戶群體不是更精細,當然沒問題,但是我們能不能給出27種不同的運營方案,如果給不出,如此細分不就是自嗨么?畢竟,分為多少個群體不重要,每個群體都要有個性化的運營策略才重要。

下面是一張經(jīng)典RFM客戶細分模型圖,R分值、F分值和M分值三個指標構成了一個三維立方圖,在各自維度上,根據(jù)得分值又可以分為高、低兩個分類,分別用2、1表示,最終3個指標兩兩組合,就構成了8大客戶群體。

對每個用戶群體進行定性,例如R、F、M分值高的客戶為重要價值客戶,R、F、M三個分值都低的客戶為潛在客戶,其他類型客戶可以此類推解讀。



03、RFM實際案例

RFM的原理到這里就講完了,是不是很簡單?確實很簡單,但是也確實很實用,在實際的工作中是如何實施這個用戶分層模型的呢?下面我們就用一個實際的案例手把手教你如何進行RFM用戶分層。

整體來說,RFM模型實施需要以下幾個關鍵的步驟。

01、數(shù)據(jù)準備

下面通過一個實際的案例學習RFM分析的使用,案例是用python做的,當然了Excel也能做,不必糾結于工具哈,首先將數(shù)據(jù)導入到data變量,代碼如下:

import pandas

data = pandas.read_csv(

? ? 'D:/RFM分析.csv',

? ? engine='python'

可以大致看一眼data數(shù)據(jù)的樣式,如下圖所示。

可以看到,這里記錄的是客戶的每一個訂單的信息,第一列為訂單ID,第二列為客戶ID,第三列為交易日期,第四列為交易金額。

對數(shù)據(jù)進行一下加工,根據(jù)交易日期,計算出每次交易距今的間隔天數(shù),代碼如下:

# 將交易日期處理為日期數(shù)據(jù)類型

data['DealDateTime'] = pandas.to_datetime(

? ? data.DealDateTime,

? ? format='%Y/%m/%d'

)

# 假設2015-10-1是計算當天,求交易日期至計算當天的距離天數(shù)

data['Days'] = pandas.to_datetime('2015-10-1') - data['DealDateTime']

# 從時間距離中獲取天數(shù)

data['Days'] = data['Days'].dt.days

執(zhí)行以上代碼,即可得到用戶每一次交易日期距離指定日期的天數(shù),如下圖所示。


02、計算R、F、M

用戶的明細數(shù)據(jù)準備好后,接下來就可以計算每個客戶的最近交易間隔R、交易頻率F以及交易總額M,計算方法如下:

最近交易間隔R:使用CustomerID作為分組列,距離指定日期間隔天數(shù)Days作為

聚合列,統(tǒng)計函數(shù)使用最小值函數(shù)min,即可得到每個客戶的最近交易間隔R。

交易頻率F:使用CustomerID作為分組列,OrderID作為聚合列,統(tǒng)計函數(shù)使用計數(shù)

函數(shù)count。

交易總額M:使用CustomerID作為分組列,訂單金額Sales作為聚合列,統(tǒng)計函數(shù)使

用求和函數(shù)sum。

對應的代碼如下:

# 統(tǒng)計每個客戶距離指定日期有多久沒有消費了,即找出最小的最近消費距離

R = data.groupby(

? ? by=['CustomerID'],

? ? as_index=False

)['Days'].agg('min')

# 統(tǒng)計每個客戶交易的總次數(shù),即對訂單ID計數(shù)

F = data.groupby(

? ? by=['CustomerID'],

? ? as_index=False

)['OrderID'].agg('count')

# 統(tǒng)計每個客戶交易的總額,即對每次的交易金額求和

M = data.groupby(

? ? by=['CustomerID'],

? ? as_index=False

)['Sales'].agg('sum')

執(zhí)行以上代碼,得到的結果如下圖所示。


接下來使用merge方法,將R、F、M三個數(shù)據(jù)在客戶CustomerID維度上關聯(lián)起來,因為它們擁有共同的列名,在這種情況下,on參數(shù)可以省略不寫,代碼如下:

# 將R、F、M三個數(shù)據(jù)框關聯(lián),merge默認內(nèi)連接,可省略,兩表on條件的關聯(lián)列名均為CustomerID,同樣可省略

RFMData = R.merge(F).merge(M)

# 修改列名

RFMData.columns = ['CustomerID', 'R', 'F', 'M']

執(zhí)行以上代碼,得到的結果如下圖所示。


03、計算R、F、M綜合分值

每個客戶的R、F、M數(shù)據(jù)計算好后,接下來就可以對R、F、M這三個維度進行分組打分賦值,得到對應的R分值、F分值、M分值。

打分標準可以按照業(yè)務經(jīng)驗、平均值等標準進行劃分。最好是按照業(yè)務經(jīng)驗劃分,因為這里分類的的用戶是要到后面進行精細化運營的,可以通過已有的運營策略反推這里的劃分閾值,當然,如果還沒有特別清晰的運營策略,也可以采用平均值進行劃分。

本例將R、F、M三列分別按照各自的平均值劃分為高、低2個組,并分別賦值1分、2分。

R分值(R_S):距離指定日期越近,R_S越大,R>=平均值,R_S為1,R<平均值,R_

S為2。

F分值(F_S):定義為交易頻率越高,F(xiàn)_S越大,F(xiàn)<=平均值,F(xiàn)_S為1,F(xiàn)>平均值,F(xiàn)_

S為2。

M分值(M_S):定義為交易金額越高,M_S越大,M<=平均值,M_S為1,M>平均值,M_S為2。

對各個用戶的RFM的數(shù)據(jù)行進行打分賦值,代碼如下:

# 判斷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(xiàn)、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

執(zhí)行代碼,R_S、F_S、M_S的分組分值就計算出來了,如下圖所示。


基于以上得出用戶最終的RFM分層,如下圖所示。

# 計算RFM綜合分值

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

執(zhí)行代碼,得到的RFM綜合分值如下圖所示。CustomerID:14568的分層為221,對應的就是一般價值用戶。


04、用戶分層

接下來結合文章開頭提到的用戶分層定義,將用戶細分為8種不同的類型。本例采用與RFM綜合分值與用戶類型的對應關系表映射的方式實現(xiàn)用戶分層。

首先將各個RFM綜合分值與用戶類型的對應關系定義為一個映射匹配表。然后再使用merge中的內(nèi)連接inner方法,將RFMData與剛定義的RFM綜合分值用戶類型的映射匹配表,根據(jù)關聯(lián)列名RFM匹配合并為一個dataframe,這樣就完成了用戶分層的操作,代碼如下:

# 定義RFM綜合分值與客戶類型的對應關系表

CustomerType = pandas.DataFrame(

? ? data={

? ? ? ? 'RFM': [111,112,121,122,211,212,221,222]

? ? ? ? 'Type': ['潛在客戶','重點挽留客戶','一般保持客戶','重點保持客戶',

? ? ? ? '一般發(fā)展客戶','重點發(fā)展客戶','一般價值客戶','高價值客戶']

? ? }

)

# 將RFMData與RFM綜合分值客戶類型的對應關系表合并為一個數(shù)據(jù)框

# merge默認內(nèi)連接,可省略,兩表on條件的關聯(lián)列名均為RFM,同樣可省略

RFMData = RFMData.merge(CustomerType)

執(zhí)行代碼,得到的數(shù)據(jù)如下圖所示。

可以看到,最后一列數(shù)據(jù),就是對每個用戶細分的用戶分層。最后,我們來看看,每個類別的用戶數(shù)是多少,代碼如下:


# 按RFM、Type進行分組統(tǒng)計客戶數(shù)

RFMData.groupby(

? ? by=['RFM','Type']

)['CustomerID'].agg('count')

執(zhí)行代碼,就可以得到各個客戶類型的客戶數(shù)了。


后續(xù)就可以對不同的客戶群體,有針對性地采取相應運營策略進行推廣、管理,進而提升客戶價值和營收水平,限于篇幅,這里就不再展開,我們會在后續(xù)的用戶運營專題上和大家繼續(xù)討論。碼字不易,覺得不錯,歡迎分享、在看和轉(zhuǎn)發(fā)哈~

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容