精华内容
下载资源
问答
  • 数据分析——RFM模型 万次阅读 多人点赞
    2022-01-15 16:01:36

    一、RFM模型概述

    RFM模型是网点衡量当前用户价值和客户潜在价值的重要工具和手段。RFM是Rencency(最近一次消费),Frequency(消费频率)、Monetary(消费金额),三个指标首字母组合,如图所示:
    在这里插入图片描述

    R值:最近一次消费(Recency)

    消费指的是客户在店铺消费最近一次和上一次的时间间隔,理论上R值越小的客户是价值越高的客户,即对店铺的回购几次最有可能产生回应。目前网购便利,顾客已经有了更多的购买选择和更低的购买成本,去除地域的限制因素,客户非常容易流失,因此CRM操盘手想要提高回购率和留存率,需要时刻警惕R值。

    如下图,某零食网店用户最近一次消费R值分布图(时间截至2016年12月31日):
    在这里插入图片描述
    1、客户R值呈规律性的“波浪形”分布,时间越长,波浪越小;

    2、最近一年内用户占比50%(真的很巧);

    数据分析:这个数据根据向行业内专业人员请教,已经是比较理想了的。说明每引入2个客户,就有一位用户在持续购买。说明店铺复购做的比较好,R值在不断的变为0。

    F值:消费频率(Frequency)

    消费频率是客户在固定时间内的购买次数(一般是1年)。但是如果实操中实际店铺由于受品类宽度的原因,比如卖3C产品,耐用品等即使是忠实粉丝用户也很难在1年内购买多次。所以,一般店铺在运营RFM模型时,会把F值的时间范围去掉,替换成累计购买次数。

    如下图,某零食网店用户购买频次图(如1个客户在1天内购买多笔订单,则自动合并为1笔订单):
    在这里插入图片描述
    1、购买1次(新客户)占比为65.5%,产生重复购买(老客户)的占比为34.4%;

    2、购买3次及以上(成熟客户)的占比为17%,购买5次及以上(忠实客户)的占比为6%。

    数据分析:影响复购的核心因素是商品,因此复购不适合做跨类目比较。比如食品类目和美妆类目:食品是属于“半标品”,产品的标品化程度越高,客户背叛的难度就越小,越难形成忠实用户;但是相对美妆,食品又属于易耗品,消耗周期短,购买频率高,相对容易产生重复购买,因此跨类目复购并不具有可比性。

    M值:消费金额(Monetary)

    值是RFM模型中相对于R值和F值最难使用,但最具有价值的指标。大家熟知的“二八定律”(又名“帕雷托法则”)曾作出过这样的解释:公司80%的收入来自于20%的用户。

    这个数据我在自己所从事的公司总都得到过验证!可能有些店铺不会那么精确,一般也很会控制在30%客户贡献70%收入,或者40%贡献60%收入。

    理论上M值和F值是一样的,都带有时间范围,指的是一段时间(通常是1年)内的消费金额,在工作中我认为对于一般店铺的类目而言,产品的价格带都是比较单一的,比如:同一品牌美妆类,价格浮动范围基本在某个特定消费群的可接受范围内,加上单一品类购买频次不高,所以对于一般店铺而言,M值对客户细分的作用相对较弱。

    所以我认为用店铺的累计购买金额和平均客单价替代传统的M值能更好的体现客户消费金额的差异。

    教大家一个特别简单的累积金额划分方法:将1/2的客单价作为累积消费金额的分段,比如客单价是300元,则按照150元进行累计消费金额分段,得出十个分段。

    现以国内某知名化妆品店铺举例,店铺平均客单为160元,因此以80元作为间隔将累积消费金额分段,从表中可以很明显发现,累计消费160元以下用户占比为65.5%(近2/3),贡献的店铺收入比例只占31.6%(近1/3),具体如下:
    在这里插入图片描述

    二、基于RFM模型的实践应用

    作为CRM操盘手,主要有两种方法来分析RFM模型的结果:用基于RFM模型的划分标准来进行客户细分,用基于RFM模型的客户评分来进行客户细分。

    1、基于RFM模型进行客户细分

    CRM实操时可以选择RFM模型中的1-3个指标进行客户细分,如下表所示。切记细分指标需要在自己可操控的合理范围内,并非越多越好,一旦用户细分群组过多,一来会给自己的营销方案执行带来较大的难度,而来可能会遗漏用户群或者对同个用户造成多次打扰。

    最终选择多少个指标有两个参考标准:店铺的客户基数,店铺的商品和客户结构。
    在这里插入图片描述

    店铺的客户基数:在店铺客户一定的情况下选择的维度越多,细分出来每一组的用户越少。对于店铺基数不大(5万以下客户数)的店铺而言,选择1-2个维度进行细分即可。对于客户超过50万的大卖家而言可以选择2-3个指标。

    店铺的商品和客户结构:如果在店铺的商品层次比较单一,客单价差异幅度不大的情况下,购买频次(F值)和消费金额(M值)高度相关的情况下,可以只选择比较容易操作的购买频次(F值)代替消费金额(M值)。对于刚刚开店还没形成客户粘性的店铺,则可以放弃购买频次(F值),直接用最后一次消费(R值)或者消费金额(M值)。

    2、通过RFM模型评分后输出目标用户

    除了直接用RFM模型对用户进行分组之外,还有一种常见的方法是利用RFM模型的三个属性对客户进行打分,通过打分确定每个用户的质量,最终筛选出自己的目标用户。

    RFM模型评分主要有三个部分:

    1、确定RFM三个指标的分段和每个分段的分值;

    2、计算每个客户RFM三个指标的得分;

    3、计算每个客户的总得分,并且根据总得分筛选出优质的客户

    比如,实操的过程中一般每个指标分为3-5段,其中R值可以根据开店以来的时间和产品的回购周期来判定,F值根据现有店铺的平均购买频次,M值可参考上文客单价的分段指标。

    举个例子:
    在这里插入图片描述

    确认RFM的分段和对应分段的分值之后,就可以按照用户情况对应进行打分。

    更多相关内容
  • 最近正好刚帮某电信行业完成一个数据挖掘工作,其中的RFM模型还是有一定代表性,就再把数据挖掘RFM模型的建模思路细节与大家分享一下吧!手机充值业务是一项主要电信业务形式,客户的充值行为记录正好满足RFM模型的...
  • RFM模型的基础上,增加了注册使用App天数这一指标用于客户分群与价值分析,得到本次的LRFM模型,变量解释如下: L:注册使用APP天数。客户注册日期至观测结束日期的间隔。 R:距今还款未复贷天数。客户最近的成功...
  • RFM模型根据客户活跃程度和交易金额的贡献,进行客户价值细分的一种方法。 R(Recency):最近一次交易时间间隔。基于最近一次交易日期计算的得分,距离当前日期越近,得分越高。如5分制。反映客户交易活跃度。 F...
  • 基于熵权法改进RFM模型的电商客户价值细分研究.pdf
  • RFM模型

    2020-12-20 20:44:19
    客户细分是客户关系管理的一个主要的组成部分,本文尝试以电商企业为研究对象根据其客户特点,提出了一种基于客户价值分析RFM模型,从而对客户进行分类,并对此结果进行动态的客户分析,以达到对不同的客户采取不同...

    客户细分是客户关系管理的一个主要的组成部分,本文尝试以电商企业为研究对象根据其客户特点,提出了一种基于客户价值分析RFM模型,从而对客户进行分类,并对此结果进行动态的客户分析,以达到对不同的客户采取不同的客户服务的效果。

     在众多的客户关系管理(CRM)的分析模式中,RFM模型是被广泛提到的。RFM模型是衡量客户价值和客户创利能力的重要工具和手段。该模型通过一个客户的近期购买行为、购买的总体频率以及花了多少钱三项指标来描述该客户的价值状况。

    RFM模型较为动态地层示了一个客户的全部轮廓,这对个性化的沟通和服务提供了依据,同时,如果与该客户打交道的时间足够长,也能够较为精确地判断该客户的长期价值(甚至是终身价值),通过改善三项指标的状况,从而为更多的营销决策提供支持。

    RFM非常适用于生产多种商品的卖家,而且这些商品单价相对不高,如消费品、化妆品、服装、零食等;它也适合在一个企业内只有少数耐久商品,但是该商品中有一部分属于消耗品,如面膜、尿不湿、零食等消耗品。

    RFM可以用来提高客户的交易次数。业界常用的EDM和短信,常常批量滥发,不仅费钱而且效果很差。根据统计(以一般邮购日用品而言),如果将所有R(Resency)的客户分为五级,最好的第五级转换率是第四级的三倍,因为这些客户刚完成交易不久,所以会更注意店铺促销信息。如果用M(Monetary)来把客户分为五级,最好与次好的平均转化率,几乎没有显著差异。

    有些人会用客户绝对贡献金额来分析客户是否流失,但是绝对金额有时会曲解客户行为。因为每个商品价格可能不同,对不同产品的促销有不同的折扣,所以采用相对的分级(例如R、F、M都各分为五级)来比较消费者在级别区间的变动,则更可以显现出相对行为。企业用R、F的变化,可以推测客户消费的异动状况,根据客户流失的可能性,列出客户,再从M(消费金额)的角度来分析,就可以把重点放在贡献度高且流失机会也高的客户上,重点拜访或联系,以最有效的方式挽回更多的商机。

    RFM也不可以用过头,而造成高交易的客户不断收到短信。每一家店铺应该设计一个客户接触频率规则,如购买三天或一周内应该发出一个感谢的电话或Email,并主动关心消费者是否有使用方面的问题,一个月后发出使用是否满意的询问,而三个月后则提供交叉销售的建议,并开始注意客户的流失可能性,不断地创造主动接触客户的机会。这样一来,客户再购买的机会也会大幅提高。

     

    随机抽取的20名中国移动客户的数据,分析显示如下表: 随机抽取的20名客户的数据分析显示如下表:

     

     

    IDRecencyFrequencyMonetaryFRM
    scorescorescorescore
    1221221
    2222222
    3112112
    4222222
    5211211
    6111111
    7211211
    8112112
    9122122
    10111111
    11212212
    12222222
    13222222
    14122122
    15112112
    16211211
    17221112
    18111111
    19111111
    20221221

     

     类别RFM运营策略
    重要价值重要价值客户保持现状
    重点发展重要发展客户提升频次
    重点保持重要保持客户用户回流
    重点挽留重要挽留客户重点召回
    一般客户一般价值用户刺激消费
    一般客户一般发展用户挖掘需求
    一般客户一般保持用户流失召回
    无价值一般挽留用户可放弃

     

    展开全文
  • 07 RFM建模实战_RFM模型_python_RFM_数据分析_源码.zip
  • 基于RFM模型的半监督聚类算法.pdf
  • 在众多的客户关系管理(CRM)的分析模式中,RFM模型是被广泛提到的。 RFM模型是属于业务分析方法与模型中的部分。它的本质是用户分类。本文将用现代最流行的编程语言---Python语言来实践课堂上讲解的RFM模型,将用户...

    CDA数据分析师 出品  

    1

    背景

    RFM(Recency Frequency Monetary)模型是衡量客户价值和客户创利能力的重要工具和手段。在众多的客户关系管理(CRM)的分析模式中,RFM模型是被广泛提到的。

    RFM模型是属于业务分析方法与模型中的部分。它的本质是用户分类。本文将用现代最流行的编程语言---Python语言来实践课堂上讲解的RFM模型,将用户进行分类。

    本文采用Anaconda进行Python编译,主要涉及的Python模块:

    • pandas

    • matplotlib

    • seaborn

    • datetime

    本章分为三部分讲解:

    1.RFM模型原理与步骤

    2.Python分布实现RFM

    3.总结

    2

    RFM模型原理与步骤

    RFM模型的思路是:该模型是根据用户历史行为数据,结合业务理解选择划分维度,实现用户分类,助力用户精准营销。此外,还学习了构建RFM模型的步骤:

    • 获取R、F、M三个维度下的原始数据

    • 定义R、F、M的评估模型与判断阈值

    • 进行数据处理,获取R、F、M的值

    • 参照评估模型与阈值,对用户进行分层

    • 针对不同层级用户制定运营策略

    上面步骤可以知道,我们需要有RFM三个维度,根据我们在业务分析方法课程中学到的,业务分析模型离不开指标,而指标是对度量的汇总。因此,在找出RFM三个维度后,需要对每个维度下度量实现不同汇总规则。下面讲述对R、F、M三个维度下的度量如何进行汇总。

    1.R代表最近一次消费,是计算最近一次消费时间点和当前时间点的时间差。因此,这里需要用到多维数据透视分析中的基本透视规则---最小值MIN求出最小的时间差。

    2.F代表消费频次,是在指定区间内统计用户的购买次数。因此,这里需要用到多维数据透视分析中的基本透视规则---技术类COUNT(技术类不去重指标)统计用户的购买次数。

    3.M代表消费金额,是指在指定区间内统计用户的消费总金额,因此,这里需要用到求和类指标,也即基本透视规则中的合计规则---SUM。

    在对得到RFM模型中的指标值后最重要的一步就是分层,根据我们在课堂上学到的内容,大部分的用户分层是根据经验来分层的,本文在追求数据的客观性下采取统计学中的等距分箱方法来进行分层,对R、F、M三个维度分成两类。

    综上,我们大致了解了如何构建RFM模型,下面以Python实现RFM模型,并对每一步进行详细的讲解。

    3

    Python实现RFM模型

    数据准备

    本文所需的数据是一家公司对2021年10月底至今的客户购买行为数据,(前十二行)如图下:

    其中, uid 代表客户的id,是存在重复情况的。 prince 维度代表客户每发生一次交易行为所花费的金额。 time 为客户发生交易行为的时间。

    数据读取与理解

    在得到一份数据之后,我们第一步就是要理解数据的业务意义,以及对数据表的EDA(探索性分析),这里通过如下代码,发现以下特征:

    具体代码(包含Python导入包部分)如下:

    # 导入相关包
    import pandas as pd
    import time
    import numpy as np
    import seaborn as sns
    import matplotlib.pyplot as plt
    plt.rcParams['font.sans-serif'] = ["SimHei"]
    plt.rcParams["axes.unicode_minus"] = False
    sns.set(style="darkgrid")
    
    
    # 数据读取与查看
    data = pd.read_excel('data.xlsx')
    data.head()
    data.isnull().sum()  #查看缺失值
    data.duplicated().sum()   #重复值,但是不删
    data.dtypes  #查看数据类型
    data.describe()
    
    
    # 创建dataframe,存放RFM各值
    data_rfm = pd.DataFrame()
    

    接下来进行R、F、M指标值构建。

    时间维度处理

    从上文可以知道 time 维度,即每笔交易行为发生的时间是字符串object的格式,而在Python中我们对时间作差需要的是 datetime 格式,因此利用 pandas 库中的 pd.to_datetime 函数将时间格式进行转换,代码如下:

    data['time'] = pd.to_datetime(data['time'])

    得到的前五行数据如图下,可以看到数据类型变成了 datetime64[ns]

    统计每笔订单产生时间与当前时间的差(这里的当前时间是2021年12月11日),得到的差是 timedelta64[ns] 类型

    可以看到时间差中包含了day、时、分、秒4个维度,但是这里我们仅需要day维度,因此我们用 astype() 函数将类型转为仅含有day维度的 timedelta64[D] 类型。具体代码如下:

    # 统计没条数据与当前日期的时间差
    ## 计算相差天数
    data['R'] = (pd.datetime.now() - data['time'])
    ## 将时间差timedelta格式转化为需要的日格式
    data['R'] = data['R'].astype('timedelta64[D]').astype('int')
    

    ( tips:这里可能会报警告: FutureWarning: The pandas.datetime class is deprecated and will be removed from pandas in a future version. Import from datetime module instead. 读者无需理会,这是由于我们所用的 pd.datetime.now() 是一个比较旧的函数,以后将会废弃。 )

    统计R值

    在上面我们已经创建了名为 data_rfm 的表结构的数据框,因此,将下面统计的R值放入其中。R值得统计是找客户最近发生交易行为日期与当前日期的差。换一种思路就是找所有时间差中的最小值。因此利用 pandas 中的 groupby 函数对每个用户以上一步统计的R值作为分组依据进行分组,并求出最小值。具体代码如下:

    data_rfm = pd.merge(data_rfm,data.groupby('uid')['R'].min(),
             left_on = 'user_id',right_on='uid')
    

    统计F值

    F值得统计就是统计指定区间内的消费频次,而指定区间一般为人为设定,这里我们取全部数据,即2021年10月底至今作为指定区间。

    本文利用 value_counts() 函数对 uid 进行统计即为每个用户得消费频次,同时将结果合并到 data_rfm 数据框中。

    # 统计指定区间内的消费频次
    data_rfm['user_id'] = data['uid'].value_counts().index
    data_rfm['F'] = data['uid'].value_counts().values
    

    统计M值

    本文以 uid 作为分组依据对 price 字段进行求和,得到求和类指标M值。此外,将结果合并到 data_rfm 数据框中。

    data_rfm = pd.merge(data_rfm,data.groupby('uid')['price'].sum(),
             left_on = 'user_id',right_on='uid')
    data_rfm.rename(columns={'price':'M'},inplace = True)
    

    上述代码中出现了 pandas 库中得合并语法 merge() , merge() 函数采取的是横向合并,不同于MYSQL,不需要指定左表还是右表为主表,只需要提供左表与右表的公共字段在各表中的名称即可。由于 data_rfm 数据表中的 user_id 是去重的,因此将其作为主键。而 data.groupby('uid')['price'].sum() 得到的表格也是去重的,因此我们可以采取多维数据模型中的连接对应关系---一对一对两表进行合并。公共字段为:左表的 uid ,右表的 user_id 。

    最终表格结果如下,展现前18行:

    数据分箱

    在得到R、F、M三个指标值后,我们需要对这三个指标进行分类,并将每个用户进行分层。

    本文不采取人为主观性的经验法则划分,而是采取等距分箱的方式划分,等距分箱的原理较简单,这里写出步骤:

    • 从最小值到最大值之间,均分为$N$等份(这里$N$取为2)。

    • 如果 $A$,$B$ 为最小最大值, 则每个区间的长度为 $W=(B−A)/N$ ,.

    • 则区间边界值为$A+W$,$A+2W$,….$A+(N−1)W$ 。这里只考虑边界,采用左闭右开的方式,即每个等份的实例数量不等。

    在Python中可以利用 pandas 库中的 cut() 函数轻松实现上述等距分箱,同时将结果 R_label , F_label , M_label 合并到 data_rfm 数据框中具体代码如下:

    # 分箱 客观 左闭右开
    cut_R = pd.cut(data_rfm['R'],bins = 2,right = False,labels = range(1,3)).astype('int')
    data_rfm['R_label'] = cut_R
    
    
    cut_F = pd.cut(data_rfm['F'],bins = 2,right = False,labels = range(1,3)).astype('int')
    data_rfm['F_label'] = cut_F
    
    
    cut_M = pd.cut(data_rfm['M'],bins = 2,right = False,labels = range(1,3)).astype('int')
    data_rfm['M_label'] = cut_M
    

    由于利用 cut() 函数得到的是区间形式的值,因此需要赋予label值进行虚拟变量引用。label值使用1和2,对应的区间为从小到大。具体代表意思如下表:

    得到最终的表格形式如下:

    用户分类

    在得到每个用户的R、F、M三个维度的label值后,最后就是需要对用户进行分类,分类的原则如图下:

    利用pandas库中的· terrows() 函数循环遍历每个用户行为记录,将符合上述条件的划分对应的类,具体代码如下:

    for i,j in data_rfm.iterrows():
        if j['R_label'] ==  2 and j['F_label'] == 2 and j['M_label'] == 2:
            data_rfm.loc[i,'用户类别'] = '重要价值用户'
        if j['R_label'] ==  2 and j['F_label'] == 1 and j['M_label'] == 2:
            data_rfm.loc[i,'用户类别'] = '重要发展用户'
        if j['R_label'] ==  1 and j['F_label'] == 2 and j['M_label'] == 2:
            data_rfm.loc[i,'用户类别'] = '重要保持用户'
        if j['R_label'] ==  1 and j['F_label'] == 1 and j['M_label'] == 2:
            data_rfm.loc[i,'用户类别'] = '重要挽留用户'
        if j['R_label'] ==  2 and j['F_label'] == 2 and j['M_label'] == 1:
            data_rfm.loc[i,'用户类别'] = '一般价值用户'
        if j['R_label'] ==  2 and j['F_label'] == 1 and j['M_label'] == 1:
            data_rfm.loc[i,'用户类别'] = '一般发展用户'
        if j['R_label'] ==  1 and j['F_label'] == 2 and j['M_label'] == 1:
            data_rfm.loc[i,'用户类别'] = '一般保持用户'
        if j['R_label'] ==  1 and j['F_label'] == 1 and j['M_label'] == 1:
            data_rfm.loc[i,'用户类别'] = '一般挽留用户'
    

    条形图可视化用户类别

    利用 seaborn 画图库对已划分类别的用户进行技术统计与可视化,得到如下图表

    可以看出,大部分的用户属于一般发展用户与一般挽留用户。而对于一般发展用户而言采取的策略为挖掘需求,后者则是放弃治疗。因此,可以看出该公司在10月底至今的时间段内,用户流失较多,但是可发展的用户同样是非常多的,想要提高收入,对一般发展用户入手是成本少,效率高的选择。

    4

    总结

    RFM模型同时还利用了多维数据透视分析和业务分析方法两个模块的内容。所以说实践是检验和巩固学到的东西的最好方法。例如一级的常考题上,我们常碰到一个模拟题,包含RFM模型划分规则和一张帕累托图,问题是在公司有限成本下提高公司收入,需要针对哪种用户营销最好,答案是一般发展用户。相信大家一开始都很疑惑为什么选这个,这时候如果像本文一样对一份数据进行实践,这样你就会更加理解为什么是这个答案。

    展开全文
  • 【机器学习小案例篇】关于RFM模型的小案例 https://blog.csdn.net/songyu8713162/article/details/87535347 【机器学习业务篇】基于RFM模型的用户分群方法 ...
  • 基于改进RFM模型的产品推荐算法.pdf
  • Python构建RFM模型

    2021-09-09 11:08:02
    一、RFM模型理论 原始的RFM模型的核心是消费行为,R(最近一次消费),F(消费频次)以及 M(消费金额),但像文章创作、短视频流等业务模式不涉及消费行为,所以RFM模型需要针对业务模式进行一定修正。为了更具普世...

    声明在前:
    我的代码有参考某些大神的帖子,在文末会贴上作者及链接;
    我的代码和文章仅做学习研究分享,如需转载请注明作者(笨小孩)和出处
    https://blog.csdn.net/CC_Cynthia/article/details/104278690;
    转载请知会作者;
    此文仅供非商业用途,谢谢。
    那么闲话不多说,上干货。

    一、RFM模型理论

    原始的RFM模型的核心是消费行为,R(最近一次消费),F(消费频次)以及 M(消费金额),但像文章创作、短视频流等业务模式不涉及消费行为,所以RFM模型需要针对业务模式进行一定修正。为了更具普世价值,我将使用【行为】代替不同业务核心关注的指标,比如【播放视频】或【撰写文章】。

    1、定义修正

    本文中,我将RFM的定义修正如下:
    Rencency 代表用户最近一次行为,时间距离越短,对产品与平台印象越高;
    Frequency 代表一定周期内用户做出该行为的累计天数(行为频次),频率越高对平台的忠诚度越高;
    Monetary 代表一定周期内用户的累计行为次数,行为次数越高,给平台带来的潜在收益越高。
    针对指标的打分标准,我这里选取的是1-5分,当然也可以根据数据分布和业务不同选(1-3)、(1-10)等打分标准。三个指标打分后将用户分成125[R(5)*F(5)*M(5)]个类别,针对每个类别的用户设计对应的营销策略,但是出125份营销策略是非常困难的,正常使用时会将每个指标分为两类(以指标均值为例,打分高于均值的属于高,否则属于低),最后将用户分成8个类别,具体如下图:
    图片非原创
    具化成表格为:
    在这里插入图片描述

    2、具体释义

    1 )重要价值用户
    三高用户,价值最高,企业忠诚用户,需要一定的营销策略延长用户忠诚时间,比如VIP服务、永久打折策略等等让用户有荣誉感的营销策略;
    2 )重要发展用户
    近期有发生购买行为,行为次数高于多数用户,但是行为频率较低,需要鼓励用户重复行为,增加品牌忠诚,可以通过短信、邮件定期召回;
    3 )重要保持用户
    最近一次行为时间较远,但行为次数和行为频率高,说明是一段时间没有活跃的忠实用户(即将流失),需要我们主动联系进行挽回;
    4 )重要挽留用户
    历史行为次数多,但是行为频率较低,近期没有发生行为,已经趋于流失,最核心的需求是鼓励用户回流,增加对产品的印象;
    5 )一般价值客户
    近期有行为,行为频率高但行为次数少,这部分用户属于高潜力活跃用户,需要给与一定关注度;
    6 )一般发展用户
    近期有发生行为,但行为频率和行为次数较低,这部分用户也属于潜力活跃用户,也需要给与一定的关注;
    7 )一般保持用户和一般挽留用户
    用户已经处于流失阶段,可以不做运营,或者尝试低成本触达。

    二、数据准备

    按前文的rfm定义捞出所需数据,如下:
    在这里插入图片描述
    总计三列,比较简单,behav_date 为行为日期,user id为用户id, behav_cnt为行为日期当天用户行为次数.
    如behav_cnt=3 的含义为:2021-01-01 用户id为4006816388467的用户进行了该行为3次。
    下面对RFM各维度数据进行准备。

    1、R

    1)behav_date格式存在问题,进行转化。

    # 将behav_date转换为datetime格式
    rfm['behav_date']=pd.to_datetime(rfm['behav_date'])
    

    在这里插入图片描述

    2)按user id 对数据进行分组,取最近一次行为的日期

    r=rfm.groupby('user Id')['behav_date'].max().reset_index()
    

    在这里插入图片描述

    *注意

    ①如果不进行上一步的日期处理(pd.to_datetime),那么在使用max函数时会得不到最大的日期值;
    ②如果不使用【reset_index】,得出的数据类型为Dataframe,聚合键作为index,无列名显示,如下图
    在这里插入图片描述

    3)计算R值

    R值= 今天的日期 - 最近一次行为日期
    因为计算当日日期为【2021-8-16】所以这里写的是这天

    #设置R
    r['R']=((pd.to_datetime('2021-08-16')-pd.to_datetime(r['behav_date']))/pd.Timedelta(1, 'D')).fillna(0).astype(int)
    

    在这里插入图片描述

    *注意

    ①直接使用datetime减去datetime这一计算,得出的数据类型为timedelta,在pandas中timedelta是两个datetime值之间的差(如日,秒和微妙)的类型,如果不处理会带有单位【days】。所以需要除以一个timedelta单位为1天
    在这里插入图片描述

    ②为了防止有n/a的情况出现,所以后面增加 fillna(0)
    ③防止小数点出现,取整数

    2、F

    F维度数据整理

    # F:询盘天数,按照user Id对天数进行加总,即2年内该用户进行该行为的累计天数
    F=rfm.groupby('user Id').agg('count').reset_index()
    F=F[['user Id','behav_date']]
    F=F.rename(columns={'behav_date':'F'})
    F
    

    在这里插入图片描述

    3、M

    M维度数据整理

    M=rfm.groupby('user Id')['behav_cnt'].sum().reset_index()
    M=M.rename(columns={'behav_cnt':'M'})
    M
    

    在这里插入图片描述

    4、RFM合并

    此合并以user id作为关联字段进行内连接。为了提高运行效率,我们进行2次merge

    #需要合并2次
    RFM = pd.merge(r,F,left_on = 'user Id',right_on = 'user Id',how = 'inner')
    RFM = pd.merge(RFM,M,left_on = 'user Id',right_on = 'user Id',how = 'inner')
    #修改下具体列的名称
    RFM=RFM.rename(columns={'behav_date':'Recent_behav_date'})
    RFM['Recent_behav_date']=pd.to_datetime(RFM['Recent_behav_date'])
    RFM
    

    在这里插入图片描述

    三、RFM模型的修正

    1、F定义修正

    在开始分析之前,我对3个维度进行了相关系数检验,结果发现F与M之间的相关系数偏高,比较接近1。

    RFM.corr()
    

    在这里插入图片描述
    对此,我选择了2个代替F的维度定义:
    ①F1=M/F
    ②F2=(M/(最近一次行为时间-最早一次行为时间)

    #new_f1
    RFM['new_f1']=RFM['M']/RFM['F']
    #new_f2 F2=(M/(最近一次行为时间-最早一次行为时间))
    #先对behav_date进行date格式的处理,否则在使用min或者max时会出现错误
    rfm['behav_date']=pd.to_datetime(rfm['behav_date'])
    #选择最近的询盘时间
    date_max=rfm.groupby('user Id')['behav_date'].max().reset_index()
    #选择最早的询盘时间
    date_min=rfm.groupby('user Id')['behav_date'].min().reset_index()
    #修改列名
    date_max=date_max.rename(columns={'behav_date':'max_date'})
    date_min=date_min.rename(columns={'behav_date':'min_date'})
    #合并表格
    new_f2 = pd.merge(date_max,date_min,left_on = 'user Id',right_on = 'user Id',how = 'inner')
    #新增(最近一次行为时间-最早一次行为时间)时间差
    new_f2['max-min']=((pd.to_datetime(new_f2['max_date'])-pd.to_datetime(new_f2['min_date']))/pd.Timedelta(1,'D')).fillna(0).astype(int)
    #将【最近一次行为时间-最早一次行为时间】时间差的值新增到现有的表格中去
    new_f2= pd.merge(RFM,new_f2,left_on = 'user Id',right_on = 'user Id',how = 'inner')
    #算出new_f2
    new_f2['new_f2']=new_f2['M']/new_f2['max-min']
    new_f2=new_f2[['user Id','new_f2']]
    #替换正inf为0
    new_f2=new_f2.replace(np.inf, 0) 
    #合并
    RFM = pd.merge(RFM,new_f2,left_on = 'user Id',right_on = 'user Id',how = 'inner')
    

    在这里插入图片描述
    我们再看一次相关关系:
    在这里插入图片描述F2与M的相关系数比F1与M的相关系数低,但因为F2中存在很多inf的数据被替换为0,会影响用户分层,此处不考虑F2。

    2、分值修正

    粗略对RFM分布观察一下发现,new_f1与M 75%的分位数之前数据都是1,如果仍按5点打分,会导致用户无法进一步分层。所以将打分制修正为:
    R 5点打分
    F 3点打分
    M 4点打分
    在这里插入图片描述

    四、RFM打分

    如前文所述,此处采用R 5点打分,F 3点打分,M 4点打分分值按照分位数进行切割。

    1、R打分

    #R的5分位数值
    RFM.R.quantile([0.2,0.4,0.6,0.8,1])
    

    在这里插入图片描述

    R的分值范围为
    分值1 [573-746)
    分值2 [425-573)
    分值3 [254-425)
    分值4 [116-254)
    分值5 [1-116)

    2、F打分

    #F的5分位数值
    RFM.F.quantile([0.2,0.4,0.6,0.8,1])
    

    在这里插入图片描述
    F的分值范围为
    分值1 1
    分值2 2
    分值3 2以上

    3、M打分

    #M的5分位数值
    RFM.M.quantile([0.2,0.4,0.6,0.8,1])
    

    在这里插入图片描述

    M的分值划分
    分值1 1
    分值2 2
    分值3 3
    分值4 3以上

    4、RFM打分

    import warnings
    warnings.filterwarnings('ignore')
    RFM['R-SCORE'] = pd.cut(RFM['R'],bins = [0,116,254,425,573,9999],labels = [5,4,3,2,1],right = False).astype(float)
    RFM['F-SCORE'] = pd.cut(RFM['F'],bins = [0,1,2,9999],labels = [1,2,3],right = False).astype(float)
    RFM['M-SCORE'] = pd.cut(RFM['M'],bins = [0,1,2,3,9999],labels = [1,2,3,4],right = False).astype(float)
    RFM.head()
    

    在这里插入图片描述

    *注意

    ①import warning是为了防止Jupter大规模爆红影响数据可读性;
    ②pandas.cut(x, bins, right=True, labels=None, retbins=False, precision=3, include_lowest=False, duplicates=‘raise’),cut函数默认参数right为true,表示切割时包含区间右部。比如bins=[1,2,3],right=True,则区间为(1,2],(2,3];right=False,则区间为(1,2),(2,3)

    5、RFM标签化

    1)将每一个分值与总体均值比较高低

    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()
    

    在这里插入图片描述

    *注意

    Python中大小判断后返回的结果是True和False,对应着数值1和0,只要把这个布尔结果乘上1,True就变成了1,False变成了0,易于理解。

    2)比较结果标签化

    RFM['人群数值'] = (RFM['R是否大于均值'] * 100) + (RFM['F是否大于均值'] * 10) + (RFM['M是否大于均值'] * 1)
    RFM
    

    在这里插入图片描述

    *注意

    人群数值是数值类型,所以位于前面的0就自动略过,比如“11”代表着重要保持客户,10对应着“010”的一般保持客户。有点模糊是吧,再看一眼这个表格。

    在这里插入图片描述

    3)封装函数定义人群标签

    为了得到最终人群标签,定义一个判断函数,通过判断人群数值的值,来返回对应的分类标签:

    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
    

    在这里插入图片描述

    到这里RFM分层就完成了,​但如果后面新增用户使用起来不是很方便,这就需要将整个模型封装成函数,我下期再分享吧。

    感谢你看到了最后。​

    参考文献
    [1]SoWhat1412.7. RFM用户分析模型 https://blog.csdn.net/qq_31821675/article/details/107179790
    [2]数据爱好者记.快速掌握用户分层模型(RFM)的使用方法|【业务模型】https://blog.csdn.net/littlelianglian/article/details/107584064

    展开全文
  • 数据挖掘应用案例 RFM 模型分析与客户细分 分类 数据挖掘 | 标签 市场研究 数据挖掘 RFM 模型 2012-01-21 21:39 阅读 ( 16854 ) 评论 (9) 这里我先给各位朋友 拜年祝大家新春快乐 兔年就要过去了本命年的最后一天...
  • 用户群体细分(RFM模型)-附件资源
  • python-RFM模型

    2022-05-31 18:21:04
    RFM模型:根据客户消费行为的三个关键指标(R-最近一次的购物时间,F-一段时间内客户的购物次数,M-客户消费总金额)来将客户分层并针对不同层级的客户进行不同的营销策略; 此次将客户分成8类(按R、F、M三个值的...
  • RFM模型是一个被广泛使用的客户关系分析模型,主要以用户行为来区分客户。通过RFM模型,为用户分群,实现精细化运营。
  • 基于聚类算法识别大型百货商场客户价值的RFM模型.pdf
  • 基于RFM模型的超市个性化推荐方法研究及实现.pdf
  • 数据分析八大模型:详解RFM模型

    千次阅读 2022-01-23 00:43:03
    今天跟大家分享的是一个经常被提及,但是价值被严重低估的模型:RFM模型。 一、RFM的基本思路 RFM模型由三个基础指标组成: R:最近一次消费至今的时间 F:一定时间内重复消费频率 M:一定时间内累计...
  • 本文实例讲述了Python pandas RFM模型应用。分享给大家供大家参考,具体如下: 什么是RFM模型 根据美国数据库营销研究所Arthur Hughes的研究,客户数据库中有3个神奇的要素,这3个要素构成了数据分析最好的指标: ...
  • 数据分析 一文搞懂什么是RFM模型

    千次阅读 2021-11-13 15:39:06
    数据分析 | 一文搞懂什么是RFM模型 想知道你在电商平台心里的地位吗?学会RFM分析法,你自然知道 大家好,我是翔宇!今天我们来了解做数据分析一定要会的分析方法之一----RFM分析法。 相信大家在前天的双十一一定也...
  • RFM模型实战

    2021-07-23 23:32:37
    什么是RFM模型 RFM模型是衡量客户价值和客户创利能力的重要工具。该模型通过一个客户的近期购买行为、购买的总体频率,以及花了多少钱三项指标来描述该客户的价值状况。 如何构建RFM模型 最近一次消费 (Recency) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,332
精华内容 2,132
关键字:

rfm模型