精細化運營神器:RFM用戶分層
編輯導語:在互聯網紅利逐漸消失的當下,粗狂式的運營已經難以為繼,如何把有限的費用投入到我們最精準的用戶上,也就是所謂的精細化運營,是每個公司應該關注的問題。這其中最重要的是用戶分層,本文介紹了用戶分層的一種最常見、也最常見的方法:RFM用戶分層。
一、寫在前面
隨著互聯網流量紅利的逐漸消失,之前粗狂式的拓客和一刀切的用戶運營已經難以為繼,越來越多的公司開始意識到,只靠燒錢圈用戶、養用戶成本太高,因為不是所有的用戶都需要你重點投入,金主爸爸一定要好好維護,潛力股一定要加大投入挖掘價值,而羊毛黨永遠都是你應該嚴防的對象,這就是所謂的精細化運營,錢要花在刀刃上,要花在業務和核心用戶上。
精細化運營講究的是千人千面,一千類用戶一千種運營策略,所以第一步就是要把用戶進行分類,然后才有針對性的運營策略,而用戶分類中一種尤為重要和常用的方法就是RFM。
二、什么是RFM?
什么是RFM?RFM最早產生于電商領域,根據客戶的交易頻次和交易額衡量客戶的價值,對客戶進行細分。
RFM是衡量客戶價值的三個維度,分別為R(Recency)交易間隔、F(Frequency)交易頻度、M(Monetary)交易金額組成。
R表示間隔(Recency):也就是客戶最近一次交易距今的間隔,需要注意的是,R是最近一次交易時間到現在的間隔,而不是最近一次的交易時間,R越大,表示客戶越久未發生交易,反之R越小,表示客戶越近有交易發生。
F表示頻次(Frequency):也就是客戶在最近一段時間內交易的次數,一般來說選取一個特定的時間段,F越大,表示客戶交易越頻繁,反之F越小,表示客戶不夠活躍。
M表示額度(Monetary):也在同樣的時間段內,客戶交易的金額,M越大,表示客戶價值越高,M越小,表示客戶價值越低。
有了以上3個維度的數據,就可以對每個用戶按照每個維度進行衡量,一般來說我們會選取一個合理的分值對R、F、M進行劃分,將3個維度分別分為高、低兩類,組合下來就是8類,也就形成了8個用戶群體。
當然你說我每個維度分成3類行不行,最終分成27個用戶群體不是更精細,當然沒問題,但是我們能不能給出27種不同的運營方案,如果給不出,如此細分不就是自嗨么?
畢竟,分為多少個群體不重要,每個群體都要有個性化的運營策略才重要。
下面是一張經典RFM客戶細分模型圖,R分值、F分值和M分值三個指標構成了一個三維立方圖,在各自維度上,根據得分值又可以分為高、低兩個分類,分別用2、1表示,最終3個指標兩兩組合,就構成了8大客戶群體。
對每個用戶群體進行定性,例如R、F、M分值高的客戶為重要價值客戶,R、F、M三個分值都低的客戶為潛在客戶,其他類型客戶可以此類推解讀。
三、RFM實際案例
RFM的原理到這里就講完了,是不是很簡單?確實很簡單,但是也確實很實用,在實際的工作中是如何實施這個用戶分層模型的呢?下面我們就用一個實際的案例手把手教你如何進行RFM用戶分層。
整體來說,RFM模型實施需要以下幾個關鍵的步驟。
1. 數據準備
下面通過一個實際的案例學習RFM分析的使用,案例是用python做的,當然了Excel也能做,不必糾結于工具哈,首先將數據導入到data變量,代碼如下:
import pandas data=pandas.read_csv(‘./RFM分析.csv’,engine=’python’)
可以大致看一眼data數據的樣式,如下圖所示。
可以看到,這里記錄的是客戶的每一個訂單的信息,第一列為訂單ID,第二列為客戶ID,第三列為交易日期,第四列為交易金額。
對數據進行一下加工,根據交易日期,計算出每次交易距今的間隔天數,代碼如下:
#將交易日期處理為日期數據類型
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
執行以上代碼,即可得到用戶每一次交易日期距離指定日期的天數,如下圖所示。
2. 計算R、F、M
用戶的明細數據準備好后,接下來就可以計算每個客戶的最近交易間隔R、交易頻率F以及交易總額M,計算方法如下:
最近交易間隔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’)
執行以上代碼,得到的結果如下圖所示。
接下來使用merge方法,將R、F、M三個數據在客戶CustomerID維度上關聯起來,因為它們擁有共同的列名,在這種情況下,on參數可以省略不寫,代碼如下:
#將R、F、M三個數據框關聯,merge默認內連接,可省略,兩表on條件的關聯列名均為CustomerID
Data=R.merge(F).merge(M)
#修改列名 RFMData.columns=[‘CustomerID’,’R’,’F’,’M’]
執行以上代碼,得到的結果如下圖所示。
3. 計算R、F、M綜合分值
每個客戶的R、F、M數據計算好后,接下來就可以對R、F、M這三個維度進行分組打分賦值,得到對應的R分值、F分值、M分值。
打分標準可以按照業務經驗、平均值等標準進行劃分。最好是按照業務經驗劃分,因為這里分類的的用戶是要到后面進行精細化運營的,可以通過已有的運營策略反推這里的劃分閾值。
當然,如果還沒有特別清晰的運營策略,也可以采用平均值進行劃分。本例將R、F、M三列分別按照各自的平均值劃分為高、低2個組,并分別賦值1分、2分。
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。對各個用戶的RFM的數據行進行打分賦值,代碼如下:
#判斷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’]=1RFMData.loc[RFMData[‘M’]>RFMData.M.mean(),’M_S’]=2
執行代碼,R_S、F_S、M_S的分組分值就計算出來了,如下圖所示。
基于以上得出用戶最終的RFM分層,如下圖所示。
#計算RFM綜合分值
RFMData[‘RFM’]=100*RFMData.R_S+10*RFMData.F_S+1*RFMData.M_S
執行代碼,得到的RFM綜合分值如下圖所示。CustomerID:14568的分層為221,對應的就是一般價值用戶。
4. 用戶分層
接下來結合文章開頭提到的用戶分層定義,將用戶細分為8種不同的類型。本例采用與RFM綜合分值與用戶類型的對應關系表映射的方式實現用戶分層。
首先將各個RFM綜合分值與用戶類型的對應關系定義為一個映射匹配表。
然后再使用merge中的內連接inner方法,將RFMData與剛定義的RFM綜合分值用戶類型的映射匹配表,根據關聯列名RFM匹配合并為一個dataframe,這樣就完成了用戶分層的操作,代碼如下:
#定義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’)
執行代碼,就可以得到各個客戶類型的客戶數了。
后續就可以對不同的客戶群體,有針對性地采取相應運營策略進行推廣、管理,進而提升客戶價值和營收水平,限于篇幅,這里就不再展開,我們會在后續的用戶運營專題上和大家繼續討論。
本文由 @數據分析星球 原創發布于人人都是產品經理,未經許可,禁止轉載。
題圖來自 Unsplash,基于CC0協議
寫的很好,看懂了,之前看的都是方法論,很難落實,現在完全明白了
代碼部分也屬于我們做嘛?
ip美國?
很棒很實用!
為什么要摻雜代碼相關的內容進去,純粹講RFM就好了。
重在實踐
請問下最開始的數據選取是以什么標準的呢?如某一天的交易數據,進行數據清洗后,在劃分?