0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于Python语言的RFM模型讲解

数据分析与开发 来源:CDA数据分析师 作者:CDA数据分析师 2022-03-15 15:38 次阅读

背景

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

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

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

  • pandas

  • matplotlib

  • seaborn

  • datetime

本章分为三部分讲解:

1.RFM模型原理与步骤

2.Python分布实现RFM

3.总结

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模型,并对每一步进行详细的讲解。

03 Python实现RFM模型

数据准备

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

abd337c8-91e2-11ec-952b-dac502259ad0.png

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

数据读取与理解

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

abeab51a-91e2-11ec-952b-dac502259ad0.png

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

#导入相关包
importpandasaspd
importtime
importnumpyasnp
importseabornassns
importmatplotlib.pyplotasplt
plt.rcParams['font.sans-serif']=["SimHei"]
plt.rcParams["axes.unicode_minus"]=Falsesns.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]

abffd4f4-91e2-11ec-952b-dac502259ad0.png

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

ac1717fe-91e2-11ec-952b-dac502259ad0.png

可以看到时间差中包含了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行:

ac2cd22e-91e2-11ec-952b-dac502259ad0.png

数据分箱

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

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

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

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

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

在Python中可以利用pandas库中的cut()函数轻松实现上述等距分箱,同时将结果R_labelF_labelM_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,对应的区间为从小到大。具体代表意思如下表:

ac4e7226-91e2-11ec-952b-dac502259ad0.jpg

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

ac628266-91e2-11ec-952b-dac502259ad0.png

用户分类

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

ac8f2e7e-91e2-11ec-952b-dac502259ad0.png

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

fori,jindata_rfm.iterrows():
ifj['R_label']==2andj['F_label']==2andj['M_label']==2:
data_rfm.loc[i,'用户类别']='重要价值用户'
ifj['R_label']==2andj['F_label']==1andj['M_label']==2:
data_rfm.loc[i,'用户类别']='重要发展用户'
ifj['R_label']==1andj['F_label']==2andj['M_label']==2:
data_rfm.loc[i,'用户类别']='重要保持用户'
ifj['R_label']==1andj['F_label']==1andj['M_label']==2:
data_rfm.loc[i,'用户类别']='重要挽留用户'
ifj['R_label']==2andj['F_label']==2andj['M_label']==1:
data_rfm.loc[i,'用户类别']='一般价值用户'
ifj['R_label']==2andj['F_label']==1andj['M_label']==1:
data_rfm.loc[i,'用户类别']='一般发展用户'
ifj['R_label']==1andj['F_label']==2andj['M_label']==1:
data_rfm.loc[i,'用户类别']='一般保持用户'
ifj['R_label']==1andj['F_label']==1andj['M_label']==1:
data_rfm.loc[i,'用户类别']='一般挽留用户'

条形图可视化用户类别

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

acabd60a-91e2-11ec-952b-dac502259ad0.png

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

总结

RFM模型同时还利用了多维数据透视分析和业务分析方法两个模块的内容。所以说实践是检验和巩固学到的东西的最好方法。

例如一级的常考题上,我们常碰到一个模拟题,包含RFM模型划分规则和一张帕累托图,问题是在公司有限成本下提高公司收入,需要针对哪种用户营销最好,答案是一般发展用户。相信大家一开始都很疑惑为什么选这个,这时候如果像本文一样对一份数据进行实践,这样你就会更加理解为什么是这个答案。

审核编辑:郭婷


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • python
    +关注

    关注

    56

    文章

    4797

    浏览量

    84690

原文标题:基于客观事实的 RFM 模型(Python 代码)

文章出处:【微信号:DBDevs,微信公众号:数据分析与开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    语言模型开发框架是什么

    语言模型开发框架是指用于训练、推理和部署大型语言模型的软件工具和库。下面,AI部落小编为您介绍大语言
    的头像 发表于 12-06 10:28 125次阅读

    语言模型开发语言是什么

    在人工智能领域,大语言模型(Large Language Models, LLMs)背后,离不开高效的开发语言和工具的支持。下面,AI部落小编为您介绍大语言
    的头像 发表于 12-04 11:44 117次阅读

    对比Python与Java编程语言

    Python与Java都是目前非常流行的编程语言,它们各有其独特的优势和适用场景。以下是对这两种编程语言的对比: 一、语法和易用性 Python 语法简洁,代码更易读,非常适合初学者。
    的头像 发表于 11-15 09:31 316次阅读

    【《大语言模型应用指南》阅读体验】+ 基础篇

    学习方法。其中文本向量化中的三种编码方式:独热编码、静态编码和动态编码,这些概念描述是需要时间仔细研究理解的。 1.5章节终于开始讲解语言模型了,这也是基础篇的最后一章节,占据了基础篇的一半篇幅
    发表于 07-25 14:33

    Python语言基础2

    电子发烧友网站提供《Python语言基础2.rar》资料免费下载
    发表于 07-17 17:23 1次下载

    python训练出的模型怎么调用

    Python中,训练出的模型可以通过多种方式进行调用。 1. 模型保存与加载 在Python中,训练好的模型需要被保存,以便在其他程序或会
    的头像 发表于 07-11 10:15 1954次阅读

    语言模型(LLM)快速理解

    自2022年,ChatGPT发布之后,大语言模型(LargeLanguageModel),简称LLM掀起了一波狂潮。作为学习理解LLM的开始,先来整体理解一下大语言模型。一、发展历史大
    的头像 发表于 06-04 08:27 983次阅读
    大<b class='flag-5'>语言</b><b class='flag-5'>模型</b>(LLM)快速理解

    语言模型:原理与工程时间+小白初识大语言模型

    解锁 我理解的是基于深度学习,需要训练各种数据知识最后生成自己的的语言理解和能力的交互模型。 对于常说的RNN是处理短序列的数据时表现出色,耳真正厉害的是Transformer,此框架被推出后直接
    发表于 05-12 23:57

    【大语言模型:原理与工程实践】大语言模型的应用

    ,它通过抽象思考和逻辑推理,协助我们应对复杂的决策。 相应地,我们设计了两类任务来检验大语言模型的能力。一类是感性的、无需理性能力的任务,类似于人类的系统1,如情感分析和抽取式问答等。大语言
    发表于 05-07 17:21

    【大语言模型:原理与工程实践】大语言模型的评测

    地提升工作效率。大语言模型的代码类评测任务包括:1)代码生成评估,如生成逆转字符串的Python函数;2)代码纠错评估,如识别并修正JavaScript代码中的错误;3)代码解释评估,如解释冒泡排序算法
    发表于 05-07 17:12

    【大语言模型:原理与工程实践】大语言模型的预训练

    语言模型的核心特点在于其庞大的参数量,这赋予了模型强大的学习容量,使其无需依赖微调即可适应各种下游任务,而更倾向于培养通用的处理能力。然而,随着学习容量的增加,对预训练数据的需求也相应
    发表于 05-07 17:10

    【大语言模型:原理与工程实践】探索《大语言模型原理与工程实践》2.0

    《大语言模型“原理与工程实践”》是关于大语言模型内在机理和应用实践的一次深入探索。作者不仅深入讨论了理论,还提供了丰富的实践案例,帮助读者理解如何将理论知识应用于解决实际问题。书中的案
    发表于 05-07 10:30

    【大语言模型:原理与工程实践】大语言模型的基础技术

    全面剖析大语言模型的核心技术与基础知识。首先,概述自然语言的基本表示,这是理解大语言模型技术的前提。接着,详细介绍自然
    发表于 05-05 12:17

    【大语言模型:原理与工程实践】揭开大语言模型的面纱

    语言模型(LLM)是人工智能领域的尖端技术,凭借庞大的参数量和卓越的语言理解能力赢得了广泛关注。它基于深度学习,利用神经网络框架来理解和生成自然语言文本。这些
    发表于 05-04 23:55

    【大语言模型:原理与工程实践】探索《大语言模型原理与工程实践》

    《大语言模型》是一本深入探讨人工智能领域中语言模型的著作。作者通过对语言模型的基本概念、基础技术
    发表于 04-30 15:35