[数据分析] 使用Python简单玩玩RFM用户价值模型

2021-08-05 14:58:28 浏览数 (1)

大家好,我是才子。

最近有朋友在问怎么做用户分群,刚好看到有个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建模流程

  1. 数据预处理
  2. 指标打分
  3. 计算RFM
  4. RFM客户分群

1. 数据预处理

大家可以回复0413获取本文案例数据源

读取数据并预览

代码语言:javascript复制
import pandas as pd

df = pd.read_csv(r'C:Userslogs数据.csv')
df.head()

数据预览

原始数据中,@timestamp是时间、price是价格、uid是用户唯一标识符。

代码语言:javascript复制
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类型,无法用于后续进行分值算术运算,需要进行类型转化。

代码语言:javascript复制
# 打分,直接参考统计区间
# 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函数方法进行操作

代码语言:javascript复制
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 即可获取数据源

0 人点赞