python数据分析:会员数据化运营(中)——RMF分析

版权声明:本文为博主原创文章,如若转载请注明出处 https://blog.csdn.net/tonydz0523/article/details/84894467

何为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数据分析与数据化运营》 宋天龙

猜你喜欢

转载自blog.csdn.net/tonydz0523/article/details/84894467
今日推荐