最近有朋友在问怎么做用户分群,刚好看到有个RFM客户价值模型,就移过来用python简单演示一下,感觉还是有一定的作用的。
>RFM模型是衡量客户价值和客户创利能力的重要工具和手段。在众多的客户关系管理(CRM)的分析模式中,RFM模型是被广泛提到的。该模型通过一个客户的近期购买行为、购买的总体频率以及花了多少钱3项指标来描述该客户的价值状况。
目录:
根据美国数据库营销研究所Arthur Hughes的研究,客户数据库中有3个神奇的要素,这3个要素构成了数据分析最好的指标。
R:最近一次消费间隔
(Recency),计算用户最近一次消费记录截止当前时间的间隔天数
F:消费频率
(Frequency),计算在统计周期内用户消费记录次数
M:消费金额
(Monetary),计算在统计周期内用户累计消费金额或者是单次平均消费金额
针对RFM,我们可以发现:
基于以上RFM的值,我们简单的按照大小高低来划分,可以分为8类用户群体。
RFM
为了方便划分,我们可以简单根据RFM各自的均值来判断高低:
从而我们可以很好地区分出8类群体,这8类用户群体的特征如下表所示,我们可以根据自己产品的现状制定出更适合不同用户群体的业务决策,从而提升数据。
群体特征
RFM建模流程:
大家可以回复0413
获取本文案例数据源
读取数据并预览:
import pandas as pd
df = pd.read_csv(r'C:\Users\logs\数据.csv')
df.head()
数据预览
原始数据中,@timestamp
是时间、price
是价格、uid
是用户唯一标识符。
df.info()
info
时间字段类型转化:
我们发现时间字段类似并非时间,这里需要进行转化,转化的时候需要注意只获取日期即可,时间部分不需要。
df['@timestamp'] = pd.to_datetime(df['@timestamp']).dt.floor('d')
df.head()
时间字段转化结果预览
df.info()
info
通过R、F、M的定义计算其值,直接分组聚合计算即可得到F和M的值。
data = df.groupby('uid').agg(
last_date=('@timestamp','max'), # 计算最近一次消费日期
F=('@timestamp','count'), # 计算消费次数 F
M=('price','sum'), # 计算消费总金额(也可选择平均值) M
).reset_index()
data.head()
FM
计算最近一次消费间隔R:
直接利用当前日期减去最近消费日期可得到最近消费间隔
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()
指标打分
我们完成对指标打分之后,按照8类用户群体划分的方式,直接比较各种的平均值即可获得高低分类,用1表示高、0表示低。
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:
data['RFM'] = data['R_level'].astype('str').str.cat([data['F_level'].astype('str'),data['M_level'].astype('str')])
data.head()
RFM值
基于8类用户分群规则,这里直接用replace
函数方法进行操作
data['RFM'] = data['RFM'].replace(['111','101','011','001','110','100','010','000'],
['重要价值用户','重要发展用户','重要保持用户','重要挽留用户','一般价值用户','一般发展用户','一般保持用户','一般挽留用户'])
data.head()
RFM用户分群
计算8类用户群体数量分布:
data.groupby('RFM')['uid'].nunique().to_frame('用户数').reset_index()
RFM用户分布
# 类似于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 即可获取数据源