超市RFM用户分层实战案例源码和数据集分享

之前我就已经做过B站相关的推荐了这里我就不废话了直接上代码,RFM都不知道是啥东西的多去看看其他博主写的

本次数据集获取方式:
关注:YOLO的学习进阶日常
回复:RFM用户分层实战案例

RFM模型

Recency、Frequency、Monetary Value (RFM) 的概念可以追溯到 Jan Roelf Bult 和 Tom Wansbeek 的文章“直接邮件的最佳选择”,该文章发表在 1995 年的营销科学杂志上。RFM 分析通常支持“80% 的业务来自 20% 的客户”的营销格言

1. RFM是什么?

请添加图片描述

根据美国数据库营销研究所Arthur Hughes的研究,客户数据库中有三个神奇的要素,最重要的功能就是用来进行用户分群这三个要素构成了数据分析最好的指标:

  • 最近一次消费(Recency):客户最近多久进行一次购买,上一次消费离得越近,R值越小,用户价值越高
  • 消费频率(Frequency):客户购买的频率,购买频率越高,F值越大,客户价值越高
  • 消费金额(Monetary):客户在购买上花了多少钱,消费金额越高,M值越大,用户价值越高

根据这三个指标,我们可以把指标按照价值从低到高排序,并把这三个指标作为XYZ坐标轴,就可以把空间分为8部份

请添加图片描述

不同用户分类的运营策略
在这里插入图片描述

2. RFM有什么用?

金融行业、零售行业、电信行业等经常要对用户进行划分,以标记不同的标签,从而进行个性化的精准化营销行为。RFM模型,是以用户的实际交易或消费或购买或充值等(以下统称“交易”)一系列行为数据作为基础,从而进行用户群体的划分的,简单而又具有实际价值。可以看到客户满意度,实现精准营销,调整战略等。根据企业智库《2017中国会员经济数据报告》数据显示如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LsC9CXCc-1627628121233)(C:\Users\Dasiy\AppData\Roaming\Typora\typora-user-images\image-20210730144936660.png)]

3. RFM如何用?

我们一般使用RFM来计算用户价值度,有两种建模方式:

  1. 打分制度:根据自己的业务来调整打分制度
  2. 基于RFM以及K-Means算法的用户价值度分析

案例:

下面通过构建RFM模型对超市订单用户数据集进行分层,以实现精准营销

导入数据

import pandas as  pd
import numpy as np
data=pd.read_csv("./supermarket_data.csv",encoding="gbk")
data.head()
客户名称付款日期国家/地区 (Country)地区类别销售额数量
0Aaron Bergman2014/11/11美国美国中部技术221.981
1Justin Ritter2014/2/5澳大利亚大洋洲家具3709.401
2Craig Reiter2014/10/17澳大利亚大洋洲技术5175.171
3Katherine Murray2014/1/28德国西欧技术2892.511
4Rick Hansen2014/11/5塞内加尔西非技术2832.961

数据描述

data.info()
 #   Column           Non-Null Count  Dtype  
---  ------           --------------  -----  
 0   客户名称             45693 non-null  object 
 1   付款日期             45693 non-null  object 
 2   国家/地区 (Country)  45693 non-null  object 
 3   地区               45693 non-null  object 
 4   类别               45693 non-null  object 
 5   销售额              45693 non-null  float64
 6   数量               45693 non-null  int64  
dtypes: float64(1), int64(1), object(5)
memory usage: 2.4+ MB

R的计算

R=data.groupby("客户名称")["付款日期"].max().reset_index()
# 计算最近一次付款时间截至到2015.12.31日间隔天数,一般就是一个年度来计算一次
R['R']=(pd.to_datetime('2015-12-31')-pd.to_datetime(R["付款日期"])).dt.days
R=R[['客户名称','R']]
R
客户名称R
0Aaron Bergman113
1Aaron Hawkins118
2Aaron Smayling117
3Adam Bellavance105
4Adam Hart96
.........
791Xylona Preis130
792Yana Sorensen125
793Yoseph Carroll99
794Zuschuss Carroll110
795Zuschuss Donatelli211

796 rows × 2 columns

F的计算

data['FZ']=data['付款日期']
dup_f=data.groupby(['客户名称','付款日期'])['FZ'].count().reset_index()
f=data.groupby("客户名称")['付款日期'].count().reset_index()
f.columns=['客户名称','F']
f
客户名称F
0Aaron Bergman87
1Aaron Hawkins55
2Aaron Smayling53
3Adam Bellavance55
4Adam Hart64
.........
791Xylona Preis56
792Yana Sorensen61
793Yoseph Carroll51
794Zuschuss Carroll75
795Zuschuss Donatelli48

796 rows × 2 columns

计算M值

m=data.groupby('客户名称')['销售额'].sum().reset_index()
m.columns=['客户名称','总支付金额']
fm=pd.merge(m,f,left_on='客户名称',right_on='客户名称',how='inner')
fm['M']=fm['总支付金额']/fm['F']
fm=fm[['客户名称','F','M']]
fm
客户名称FM
0Aaron Bergman87274.515862
1Aaron Hawkins55348.524909
2Aaron Smayling53193.015660
3Adam Bellavance55281.993818
4Adam Hart64259.273594
............
791Xylona Preis56210.724821
792Yana Sorensen61312.006721
793Yoseph Carroll51363.586275
794Zuschuss Carroll75342.939733
795Zuschuss Donatelli48236.603125

796 rows × 3 columns

RFM合并

rfm=pd.merge(R,fm,left_on='客户名称',right_on='客户名称',how='inner')
rfm
客户名称RFM
0Aaron Bergman11387274.515862
1Aaron Hawkins11855348.524909
2Aaron Smayling11753193.015660
3Adam Bellavance10555281.993818
4Adam Hart9664259.273594
...............
791Xylona Preis13056210.724821
792Yana Sorensen12561312.006721
793Yoseph Carroll9951363.586275
794Zuschuss Carroll11075342.939733
795Zuschuss Donatelli21148236.603125

796 rows × 4 columns

打分

基于以上的RFM,我们要对每个用户的RFM进行打分,这里的打分用的是五分值(根据自己场景的不同,打分制度也不同)

rfm['R-SCORE'] = pd.cut(rfm['R'],bins = [0,30,60,90,120,float('inf')],labels = [5,4,3,2,1],right = False).astype(float)
rfm['F-SCORE'] = pd.cut(rfm['F'],bins = [0,23,40,57,74,float('inf')],labels = [1,2,3,4,5],right = False).astype(float)
rfm['M-SCORE'] = pd.cut(rfm['M'],bins = [0,180,240,300,360,float('inf')],labels = [1,2,3,4,5],right = False).astype(float)
rfm
客户名称RFMR-SCOREF-SCOREM-SCORE
0Aaron Bergman11387274.5158622.05.03.0
1Aaron Hawkins11855348.5249092.03.04.0
2Aaron Smayling11753193.0156602.03.02.0
3Adam Bellavance10555281.9938182.03.03.0
4Adam Hart9664259.2735942.04.03.0
........................
791Xylona Preis13056210.7248211.03.02.0
792Yana Sorensen12561312.0067211.04.04.0
793Yoseph Carroll9951363.5862752.03.05.0
794Zuschuss Carroll11075342.9397332.05.04.0
795Zuschuss Donatelli21148236.6031251.03.02.0

796 rows × 7 columns

rfm['R是否大于均值'] = (rfm['R-SCORE'] > rfm['R-SCORE'].mean()) * 1
rfm['F是否大于均值'] = (rfm['F-SCORE'] > rfm['F-SCORE'].mean()) * 1
rfm['M是否大于均值'] = (rfm['M-SCORE'] > rfm['M-SCORE'].mean()) * 1
rfm.head()
客户名称RFMR-SCOREF-SCOREM-SCORER是否大于均值F是否大于均值M是否大于均值
0Aaron Bergman11387274.5158622.05.03.0111
1Aaron Hawkins11855348.5249092.03.04.0101
2Aaron Smayling11753193.0156602.03.02.0100
3Adam Bellavance10555281.9938182.03.03.0101
4Adam Hart9664259.2735942.04.03.0111
rfm['标签'] = (rfm['R是否大于均值'] * 100) + (rfm['F是否大于均值'] * 10) + (rfm['M是否大于均值'] * 1)
rfm.head()
客户名称RFMR-SCOREF-SCOREM-SCORER是否大于均值F是否大于均值M是否大于均值标签
0Aaron Bergman11387274.5158622.05.03.0111111
1Aaron Hawkins11855348.5249092.03.04.0101101
2Aaron Smayling11753193.0156602.03.02.0100100
3Adam Bellavance10555281.9938182.03.03.0101101
4Adam Hart9664259.2735942.04.03.0111111
def transform_label(x):
    if x == 111:
        label = '重要价值客户'
    elif x == 110:
        label = '一般价值客户'
    elif x == 101:
        label = '重要发展客户'
    elif x == 100:
        label = '一般发展客户'
    elif x == 11:
        label = '重要保持客户'
    elif x == 10:
        label = '一般保持客户'
    elif x == 1:
        label = '重要挽留客户'
    elif x == 0:
        label = '一般挽留客户'
    return label
rfm['客户类型'] = rfm['标签'].apply(transform_label)
rfm.head()
客户名称RFMR-SCOREF-SCOREM-SCORER是否大于均值F是否大于均值M是否大于均值标签客户类型
0Aaron Bergman11387274.5158622.05.03.0111111重要价值客户
1Aaron Hawkins11855348.5249092.03.04.0101101重要发展客户
2Aaron Smayling11753193.0156602.03.02.0100100一般发展客户
3Adam Bellavance10555281.9938182.03.03.0101101重要发展客户
4Adam Hart9664259.2735942.04.03.0111111重要价值客户
count = rfm['客户类型'].value_counts().reset_index()
count.columns = ['客户类型','人数']
count['占比'] = round(count['人数'] / count['人数'].sum(),2)
count
客户类型人数占比
0重要价值客户1530.19
1一般发展客户1480.19
2一般价值客户1330.17
3重要发展客户1150.14
4重要挽留客户720.09
5一般挽留客户660.08
6一般保持客户570.07
7重要保持客户520.07
from pyecharts import options as opts
from pyecharts.charts import Bar
from pyecharts.commons.utils import JsCode
from pyecharts.globals import ThemeType
from  pyecharts.charts import  Line
from  pyecharts.charts import  *
columns = count['客户类型'].tolist()
data1 = count['人数'].tolist()
data2=count['占比'].tolist()
bar = (
    Bar()
    .add_xaxis(columns)
    .add_yaxis(
        "人数", 
        data1,
        label_opts=opts.LabelOpts(is_show=False))
    .set_global_opts(
        title_opts=opts.TitleOpts(title="RFM用户分类结果"))
    .extend_axis(
        yaxis=opts.AxisOpts(
            type_="value",
            min_=0.01,
            max_=0.21,
            interval=.03,
            axislabel_opts=opts.LabelOpts(formatter="{value}"),
        )
    )
)
line=(
    Line()
    .add_xaxis(xaxis_data=columns)
    .add_yaxis(
        series_name="占比",
        yaxis_index=1,
        y_axis=data2
    )
)

all=bar.overlap(line)

aa=Grid(
        init_opts=opts.InitOpts(
        width="1500px",  
        height='650px',
#         theme=ThemeType.PURPLE_PASSION,
))
aa.add(all,
       grid_opts=opts.GridOpts(
       pos_top="20%",
       pos_left="5%",
       pos_right="40%",
       ),
       is_control_axis_index=True 
       )
aa.render()

在这里插入图片描述

我们也直接做了一个脚本只要你输入你的数据直接给你生成图表,需要的话可以关注我!私信我(不过需要收费)大概长这样:
在这里插入图片描述
在这里插入图片描述

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
RFM模型是电商用户大数据分析中常用的一种模型,用于衡量用户价值和忠诚度。RFM模型包括三个指标: R (Recency):最近一次购买时间距离当前时间的天数,表示用户的活跃度。 F (Frequency):用户购买的次数,表示用户的忠诚度。 M (Monetary):用户购买的总金额,表示用户的价值。 以下是一个电商平台的用户RFM模型分析案例和对应的 SQL 语句: 1. 计算每个用户的R、F、M值 ```sql SELECT user_id, DATEDIFF(NOW(), MAX(purchase_time)) AS R, COUNT(*) AS F, SUM(amount) AS M FROM purchase_table GROUP BY user_id; ``` 2. 对R、F、M值进行分组,并计算每个组的平均值和标准差 ```sql SELECT CASE WHEN R < 30 THEN '1. 0-30' WHEN R < 60 THEN '2. 31-60' WHEN R < 90 THEN '3. 61-90' ELSE '4. 91+' END AS R_Group, CASE WHEN F < 2 THEN '1. 1-2' WHEN F < 4 THEN '2. 3-4' WHEN F < 6 THEN '3. 5-6' ELSE '4. 7+' END AS F_Group, CASE WHEN M < 100 THEN '1. 0-100' WHEN M < 200 THEN '2. 101-200' WHEN M < 500 THEN '3. 201-500' ELSE '4. 501+' END AS M_Group, COUNT(*) AS user_count, AVG(R) AS avg_R, AVG(F) AS avg_F, AVG(M) AS avg_M, STDDEV(R) AS std_R, STDDEV(F) AS std_F, STDDEV(M) AS std_M FROM (SELECT user_id, DATEDIFF(NOW(), MAX(purchase_time)) AS R, COUNT(*) AS F, SUM(amount) AS M FROM purchase_table GROUP BY user_id) AS RFM GROUP BY R_Group, F_Group, M_Group; ``` 这里的 R_Group、F_Group、M_Group 分别代表 R、F、M 指标的分组,分别将用户的 R、F、M 值分成四组,分别是 0-30、31-60、61-90、91+ 天,1-2、3-4、5-6、7+ 次,0-100、101-200、201-500、501+ 元。可以根据实际业务场景进行适当调整。 通过RFM模型的分析,可以对用户进行分类,进而制定更有针对性的营销策略,提高用户忠诚度和购买频率,从而提高电商平台的销售额。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值