1. 程式人生 > >python資料分析:會員資料化運營(中)——RMF分析

python資料分析:會員資料化運營(中)——RMF分析

何為RFM模型分析

RFM模型是衡量客戶價值和客戶創利能力的重要工具和手段。在眾多的客戶關係管理(CRM)的分析模式中,RFM模型是被廣泛提到的。該機械模型通過一個客戶的近期購買行為、購買的總體頻率以及花了多少錢3項指標來描述該客戶的價值狀況。

RFM的含義:

  • R(Recency):客戶最近一次交易時間的間隔。R值越大,表示客戶交易發生的日期越久,反之則表示客戶交易發生的日期越近。
  • F(Frequency):客戶在最近一段時間內交易的次數。F值越大,表示客戶交易越頻繁,反之則表示客戶交易不夠活躍。
  • M(Monetary):客戶在最近一段時間內交易的金額。M值越大,表示客戶價值越高,反之則表示客戶價值越低。

RFM分析就是根據客戶活躍程度和交易金額的貢獻,進行客戶價值細分的一種方法。

在這裡插入圖片描述

RFM分析的主要作用:

  • 識別優質客戶。可以指定個性化的溝通和營銷服務,為更多的營銷決策提供有力支援。
  • 能夠衡量客戶價值和客戶利潤創收能力。

python實現

import time
import numpy as np
import pandas as pd

# 匯入資料
df_raw = pd.read_csv('https://raw.githubusercontent.com/ffzs/dataset/master/sales.csv', index_col='USERID'
) df_raw.head()

在這裡插入圖片描述

以下是本資料集的4個特徵變數,包括:

  • USERID:使用者ID,每個使用者的ID唯一,由純數字組成。
  • ORDERDATE:訂單日期,格式為YYYY-MM-DD,例如2016-01-01。
  • ORDERID:訂單ID,每個訂單的ID唯一,由純數字組成。
  • AMOUNTINFO:訂單金額,浮點型資料。
# 檢視型別
df_raw.dtypes

ORDERDATE object
ORDERID int64
AMOUNTINFO float64
dtype: object

需要將將ORDERID列轉換為字元型別,ORDERDATE轉換為時間格式:

# 將ORDERID列轉換為字元型別
df_raw['ORDERID'] = df_raw.ORDERID.astype('str')
# ORDERDATE轉換為時間格式
df_raw['ORDERDATE'] = pd.to_datetime(df_raw.ORDERDATE)

檢視缺失值:

# 檢視缺失值
df_raw.isnull().sum()

ORDERDATE 2
ORDERID 0
AMOUNTINFO 8
dtype: int64

缺失值佔比小,直接刪除

# 異常值處理
df_raw = df_raw.dropna()  # 丟棄帶有缺失值的行記錄
df_raw = df_raw[df_raw['AMOUNTINFO'] > 1]  # 丟棄訂單金額<=1的記錄

接下來需要分別計算R、F、M三個原始變數的數值,主要使用的方式是資料框的groupby方法。:

# 計算RFM值
recency_value = df_raw['ORDERDATE'].groupby(df_raw.index).max()  # 計算原始最近一次訂單時間
frequency_value = df_raw['ORDERDATE'].groupby(df_raw.index).count()  # 計算原始訂單頻率
monetary_value = df_raw['AMOUNTINFO'].groupby(df_raw.index).sum()  # 計算原始訂單總金額

#### 分別計算R、F、M得分 #### 
# 指定一個時間節點,用於計算其他時間與該時間的距離
deadline_date = pd.datetime(2017, 1,1) 
# 計算R間隔
r_interval = (deadline_date - recency_value).dt.days
# 計算R、F、M得分
r_score = pd.cut(r_interval, 5, labels=[5, 4, 3, 2, 1]) 
f_score = pd.cut(frequency_value, 5, labels=[1, 2, 3, 4, 5])  
m_score = pd.cut(monetary_value, 5, labels=[1, 2, 3, 4, 5])  

# R、F、M資料合併
rfm_list = [r_score, f_score, m_score]  # 將r、f、m三個維度組成列表
rfm_cols = ['r_score', 'f_score', 'm_score']  # 設定r、f、m三個維度列名
rfm_pd = pd.DataFrame(np.array(rfm_list).transpose(), dtype=np.int32, columns=rfm_cols, index=frequency_value.index)  # 建立r、f、m資料框

# 計算RFM總得分
# 方法一:加權得分
rfm_pd['rfm_wscore'] = rfm_pd['r_score'] * 0.6 + rfm_pd['f_score'] * 0.3 + rfm_pd['m_score'] * 0.1
# 方法二:RFM組合
rfm_pd_tmp = rfm_pd.copy()
rfm_pd_tmp = rfm_pd_tmp.applymap(lambda x : str(x))
rfm_pd['rfm_comb'] = rfm_pd_tmp.iloc[:,0] + rfm_pd_tmp.iloc[:,1] + rfm_pd_tmp.iloc[:,2]
rfm_pd.sort_values('rfm_comb',ascending=False)[:6]

在這裡插入圖片描述

在方法一中,直接取出資料框的三列(R、F、M)通過乘以特定權重值得到總得分。由於業務方更關注活躍度,認為訪問的鄰近度最重要,因此R的權重比較高,設定為0.6;其次是訪問頻率F設定為0.3;訂單金額M則設定為0.1。然後基於不同的列直接做加權相加,而無需通過迴圈讀出各個元素再做計算。

得分分佈情況:

%matplotlib inline
rfm_pd.rfm_wscore.hist()

在這裡插入圖片描述

rfm_pd.groupby('rfm_comb')['r_score'].count().plot('bar')

在這裡插入圖片描述

案例資料結論

由於在RFM劃分時,將區間劃分為5份,因此可以將這5份區間分別定義了:高、中、一般、差和非常差5個級別,分別對應到R、F、M中的5/4/3/2/1。

基於RFM得分業務方得到這樣的結論:

  • 公司的會員中99%以上的客戶消費狀態都不容樂觀,主要體現在消費頻率低R、消費總金額低M。——經過分析,這裡主要由於其中有一個使用者(ID為74270)消費金額非常高,導致做5分位時收到最大值的影響,區間向大值域區偏移。
  • 公司中有一些典型客戶的整個貢獻特徵明顯,重點是RFM得分為555的使用者(ID為74270),該使用者不僅影響了訂單金額高,而且其頻率和購買新鮮度和消費頻率都非常高,應該引起會員管理部門的重點關注。
  • 由於555的使用者(ID為74270)導致,其他使用者的頻率和消費金額很低,這樣導致其他使用者的頻率和消費總量只能佔1、2, 只有14個分類,可以考慮將74270拿出來直接當成ssssupervip,其他會員再做分析。

參考:

《python資料分析與資料化運營》 宋天龍