最近有朋友在问怎么做用户分群,刚好看到有个RFM客户价值模型,就移过来用python简单演示一下,感觉还是有一定的作用的。
>RFM模型是衡量客户价值和客户创利能力的重要工具和手段。在众多的客户关系管理(CRM)的分析模式中,RFM模型是被广泛提到的。该模型通过一个客户的近期购买行为、购买的总体频率以及花了多少钱3项指标来描述该客户的价值状况。
目录:
- 0. 关于RFM模型
- 1. 数据预处理
- 2. 指标打分
- 3. 计算RFM
- 4. RFM用户分群
0. 关于RFM模型
根据美国数据库营销研究所Arthur Hughes的研究,客户数据库中有3个神奇的要素,这3个要素构成了数据分析最好的指标。
R:最近一次消费间隔
(Recency),计算用户最近一次消费记录截止当前时间的间隔天数
F:消费频率
(Frequency),计算在统计周期内用户消费记录次数
M:消费金额
(Monetary),计算在统计周期内用户累计消费金额或者是单次平均消费金额
针对RFM,我们可以发现:
- 如果最近一次消费间隔R越小,就表示用户上次消费至今最近,那么该用户的流失风险越低
- 如果消费频率F越大,就表示用户在统计周期内消费次数多,那么该用户的忠诚度越高
- 如果消费金额M越大,就表示用户在统计周期内消费支出的金额多,那么该用户的价值越高
基于以上RFM的值,我们简单的按照大小高低来划分,可以分为8类用户群体。
RFM
为了方便划分,我们可以简单根据RFM各自的均值来判断高低:
- 高:大于均值
- 低:不大于均值
从而我们可以很好地区分出8类群体,这8类用户群体的特征如下表所示,我们可以根据自己产品的现状制定出更适合不同用户群体的业务决策,从而提升数据。
群体特征
RFM建模流程:
- 数据预处理
- 指标打分
- 计算RFM
- RFM客户分群
1. 数据预处理
大家可以回复0413
获取本文案例数据源
读取数据并预览:
代码语言:javascript复制import pandas as pd
df = pd.read_csv(r'C:Userslogs数据.csv')
df.head()
数据预览
原始数据中,@timestamp
是时间、price
是价格、uid
是用户唯一标识符。
df.info()
info
时间字段类型转化:
我们发现时间字段类似并非时间,这里需要进行转化,转化的时候需要注意只获取日期即可,时间部分不需要。
代码语言:javascript复制df['@timestamp'] = pd.to_datetime(df['@timestamp']).dt.floor('d')
df.head()
时间字段转化结果预览
代码语言:javascript复制df.info()
info
2. 指标打分
通过R、F、M的定义计算其值,直接分组聚合计算即可得到F和M的值。
代码语言:javascript复制data = df.groupby('uid').agg(
last_date=('@timestamp','max'), # 计算最近一次消费日期
F=('@timestamp','count'), # 计算消费次数 F
M=('price','sum'), # 计算消费总金额(也可选择平均值) M
).reset_index()
data.head()
FM
计算最近一次消费间隔R:
直接利用当前日期减去最近消费日期可得到最近消费间隔
代码语言:javascript复制data['R'] = (pd.to_datetime('2021.4.12') - data['last_date']).dt.days
RFM
指标打分:
根据上面计算出来的RFM值,我们按照一定的分箱规则进行赋分即可,关于这个打分的规则,大家根据自己产品类型、历史数据或行业经验自行判断即可。
我这边简单做了如下划分:
R打分标准:
分值 | R区间 | 说明 |
---|---|---|
1 | 0-7 | 最近7天内有充值行为 |
2 | 7~14 | |
3 | 14~21 | |
4 | 21~28 | |
5 | 28~ | 超过28天没有充值行为 |
F打分标准:
分值 | F区间 | 说明 |
---|---|---|
1 | 1 | 周期内充值1次 |
2 | 2 | |
3 | 3 | |
4 | 4 | |
5 | 4 | 周期内充值4次以上 |
M打分标准:
分值 | M区间 | 说明 |
---|---|---|
1 | 100- | 周期内充值100元以内 |
2 | 100~200 | |
3 | 200~400 | |
4 | 400~800 | |
5 | 800 | 周期内充值800元以上 |
这里,我们直接采用分箱
进行操作即可,需要注意的是由于分箱的返回结果类型是Categoricals
类型,无法用于后续进行分值算术运算,需要进行类型转化。
# 打分,直接参考统计区间
# R-score (7天以内,5分;7-14天,4分;14-21天,3分;21-28天,2分;超过28天,1分)
data['R_score'] = pd.cut(data['R'],
bins=[0,7,14,21,28,10000],
labels=[5,4,3,2,1]
).astype('int')
data['F_score'] = pd.cut(data['F'],
bins=[0,1,2,3,4,10000],
labels=[1,2,3,4,5]
).astype('int')
data['M_score'] = pd.cut(data['M'],
bins=[0,100,200,400,800,1000000],
labels=[1,2,3,4,5]
).astype('int')
data.head()
指标打分
3. 计算RFM
我们完成对指标打分之后,按照8类用户群体划分的方式,直接比较各种的平均值即可获得高低分类,用1表示高、0表示低。
代码语言:javascript复制data['R_level'] = (data['R_score']>data['R_score'].mean())*1
data['F_level'] = (data['F_score']>data['F_score'].mean())*1
data['M_level'] = (data['M_score']>data['M_score'].mean())*1
data.head()
RFM_level
计算RFM:
代码语言:javascript复制data['RFM'] = data['R_level'].astype('str').str.cat([data['F_level'].astype('str'),data['M_level'].astype('str')])
data.head()
RFM值
4. RFM用户分群
基于8类用户分群规则,这里直接用replace
函数方法进行操作
data['RFM'] = data['RFM'].replace(['111','101','011','001','110','100','010','000'],
['重要价值用户','重要发展用户','重要保持用户','重要挽留用户','一般价值用户','一般发展用户','一般保持用户','一般挽留用户'])
data.head()
RFM用户分群
计算8类用户群体数量分布:
代码语言:javascript复制data.groupby('RFM')['uid'].nunique().to_frame('用户数').reset_index()
RFM用户分布
代码语言:javascript复制# 类似于excel里柱状图填充色中依据数据点着色
import plotly.express as px
dataRFM = data.groupby('RFM')['uid'].nunique().to_frame('用户数').reset_index()
fig = px.bar(dataRFM, x='RFM', y='用户数',
color='用户数', # 指定柱状图颜色根据 用户数字段数值大小自动着色
height=600, # 图表高度
text = '用户数',
title= '最近42天付费用户RFM分群人数分布',
)
fig.update_traces(
textposition='outside',
)
fig.show()
用户RFM分群人数分布 以上就是本次全部内容,是不是感觉还蛮简单的感兴的话,大家可以自己下载数据实际演示一下 回复 0413 即可获取数据源