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ā)哈~