精細化運營神器:RFM用戶分層

7 評論 26324 瀏覽 228 收藏 15 分鐘

編輯導語:在互聯網紅利逐漸消失的當下,粗狂式的運營已經難以為繼,如何把有限的費用投入到我們最精準的用戶上,也就是所謂的精細化運營,是每個公司應該關注的問題。這其中最重要的是用戶分層,本文介紹了用戶分層的一種最常見、也最常見的方法: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協議

更多精彩內容,請關注人人都是產品經理微信公眾號或下載App
評論
評論請登錄
  1. 寫的很好,看懂了,之前看的都是方法論,很難落實,現在完全明白了

    來自中國 回復
  2. 代碼部分也屬于我們做嘛?

    來自美國 回復
    1. ip美國?

      來自安徽 回復
  3. 很棒很實用!

    來自福建 回復
  4. 為什么要摻雜代碼相關的內容進去,純粹講RFM就好了。

    來自廣東 回復
    1. 重在實踐

      來自浙江 回復
  5. 請問下最開始的數據選取是以什么標準的呢?如某一天的交易數據,進行數據清洗后,在劃分?

    回復