RFM分析
RFM分析是根據客戶活躍程度和交易金額貢獻,進行客戶價值細分的一種方法;
可以通過R,F,M三個次元,将客戶劃分為8種類型。
RFM分析過程
1.計算RFM各項分值
R_S,距離目前日期越近,得分越高,最高5分,最低1分
F_S,交易頻率越高,得分越高,最高5分,最低1分
M_S,交易金額越高,得分越高,最高5分,最低1分
2.歸總RFM分值
RFM=100*R_S+10*F_S+1*M_S
3.根據RFM分值對客戶分類
RFM分析前提,滿足以下三個假設,這三個假設也是符合邏輯的
1.最近有過交易行為的客戶,再次發生交易的可能性要高于最近買有交易行為的客戶;
2.交易頻率較高的客戶比交易頻率較低的客戶,更有可能再次發生交易行為;
3.過去所有交易總金額較多的客戶,比交易總金額較少的客戶,更有消費積極性。
我們了解了RFM的分析原理後,下面來看看如何在Python中用代碼實作:
[python] view plain copy
- import numpy
- import pandas
- data = pandas.read_csv(
- 'D:\\PDA\\5.7\\data.csv'
- )
- data['DealDateTime'] = pandas.to_datetime(
- data.DealDateTime,
- format='%Y/%m/%d'
- )
- data['DateDiff'] = pandas.to_datetime(
- 'today'
- ) - data['DealDateTime']
- data['DateDiff'] = data['DateDiff'].dt.days
- R_Agg = data.groupby(
- by=['CustomerID']
- )['DateDiff'].agg({
- 'RecencyAgg': numpy.min
- })
- F_Agg = data.groupby(
- by=['CustomerID']
- )['OrderID'].agg({
- 'FrequencyAgg': numpy.size
- })
- M_Agg = data.groupby(
- by=['CustomerID']
- )['Sales'].agg({
- 'MonetaryAgg': numpy.sum
- })
- aggData = R_Agg.join(F_Agg).join(M_Agg)
- bins = aggData.RecencyAgg.quantile(
- q=[0, 0.2, 0.4, 0.6, 0.8, 1],
- interpolation='nearest'
- )
- bins[0] = 0
- labels = [5, 4, 3, 2, 1]
- R_S = pandas.cut(
- aggData.RecencyAgg,
- bins, labels=labels
- )
- bins = aggData.FrequencyAgg.quantile(
- q=[0, 0.2, 0.4, 0.6, 0.8, 1],
- interpolation='nearest'
- )
- bins[0] = 0;
- labels = [1, 2, 3, 4, 5];
- F_S = pandas.cut(
- aggData.FrequencyAgg,
- bins, labels=labels
- )
- bins = aggData.MonetaryAgg.quantile(
- q=[0, 0.2, 0.4, 0.6, 0.8, 1],
- interpolation='nearest'
- )
- bins[0] = 0
- labels = [1, 2, 3, 4, 5]
- M_S = pandas.cut(
- aggData.MonetaryAgg,
- bins, labels=labels
- )
- aggData['R_S']=R_S
- aggData['F_S']=F_S
- aggData['M_S']=M_S
- aggData['RFM'] = 100*R_S.astype(int) + 10*F_S.astype(int) + 1*M_S.astype(int)
- bins = aggData.RFM.quantile(
- q=[
- 0, 0.125, 0.25, 0.375, 0.5,
- 0.625, 0.75, 0.875, 1
- ],
- interpolation='nearest'
- )
- bins[0] = 0
- labels = [1, 2, 3, 4, 5, 6, 7, 8]
- aggData['level'] = pandas.cut(
- aggData.RFM,
- bins, labels=labels
- )
- aggData = aggData.reset_index()
- aggData.sort(
- ['level', 'RFM'],
- ascending=[1, 1]
- )
- aggData.groupby(
- by=['level']
- )['CustomerID'].agg({
- 'size':numpy.size
- })
RFM在傳統的直效營銷領域的應用 作為一種對 客戶分類的方法,RFM分析模型起初主要用于直效營銷(Direct Marketing)領域,目的是提高老客戶交易的次數。 廣東一家辦公裝置及耗材零售企業,在省内建立了9家連鎖配送中心,業務發展迅速,有過成交記錄的老客戶也多了起來,通過向客戶用郵政信函發送商品目錄、開展直效營銷的成本越來越高。該公司希望找到一種更有效的方法,來區分客戶,以便在“更恰當的時間、向恰當的客戶傳遞恰當的商品資訊”,進而刺激重複交易,同時也适當降低郵寄費用。 他們把客戶購買日期到當天的天數算出來,得到R這個參數。然後可以依據參數R的大小對客戶進行分組,例如可以把客戶分成數量基本相等的5個等級,R5級表示購買時間最接近統計當日,R1級表示購買時間最遠離統計當日;此外還可以依據停止交易的絕對天數、不考慮每級的客戶數量是否近似而進行劃分。 對于R5級的客戶,該公司會立即再郵寄一份商品目錄及獎勵積分計劃,對于R4級的客戶則會在一周内再郵寄一份商品目錄及獎勵積分計劃,對于R3級以下的客戶則不采用這種追随購買的郵寄方式。 根據國外的統計結果,R5級客戶對直效郵件的回函率是R4級的三倍,因為這些客戶剛完成交易不久,是以會更注意同一公司的商品資訊。如果及時跟進的郵件内容,采用“交叉銷售”(Cross-Sell)或“追加銷售”(Up-Sell)的政策,推薦與客戶購買需求相關度高的商品,或者提供額外的重複購買獎勵,效果更加顯著。 通過大量的統計發現,緊随參數R之後、與重複購買有密切關系的是參數F。采用F購買次數作為參數,将客戶分為F5~F1五組,采取不同的郵寄政策也是很有意義的。例如過去6個月購買超過5次以上的客戶,今後将每月郵寄一次商品目錄;而購買不足2次的客戶,将隻會每兩個月郵寄一次。 相對而言,參數M與刺激重複購買的頻率之間關系不那麼緊密。統計發現,如果采用M貨币價值這個參數對 客戶分類,平均交易金額高的客戶的回報率并不見得比平均交易金額低的客戶來得多。但這個世界永遠存在這樣一些客戶,他們對一些促銷宣傳小政策反應冷漠,但偶爾一次的大額采購往往給您帶來意外的驚喜。 是以有必要讓他們在需要采購的時候能想起您,這就需要利用參數M,同樣我們也可以把客戶分為M5~M1五組。 将客戶分别按照R、F、M參數分組後,假設某個客戶同時屬于R5、F4、M3三個組,則可以得到該客戶的RFM代碼543。同理,我們可以推測,有一些客戶剛剛成功交易、且交易頻率高、總采購金額大,其RFM代碼是555,還有一些客戶的RFM代碼是554、545……每一個RFM代碼都對應着一小組客戶,開展市場營銷活動的時候可以從中挑選出若幹組進行。 RFM非常适用于提供多種商品的企業,這些商品單價相對不高,或者互相間有互補性,具有多次重複購買的必要,這些企業可能提供如下商品:日用消費品、服裝、小家電等;RFM也适用于這類企業,它們既提供高價值耐用商品、同時又提供配套的零部件或維修服務,如下:精密機床、成套生産裝置、列印機等;RFM對于商品批發、原材料貿易、以及一些服務業(如旅行、保險、運輸、快遞、娛樂等)的企業也很适用。