当前位置: 首页 > 科技观察

不到70行Python代码,轻松玩转RFM用户分析模型

时间:2023-03-12 18:24:56 科技观察

本文从RFM模型的概念入手,结合实际案例,详细讲解Python实现模型的每一步,并提供同源数据的案例让学生知其然。注:想直接下载代码和数据的同学可以文末空降。看这篇文章之前,源数据是这样的:学完直接回车,源数据变成这样:Areyouexcited?好了,废话少说,开饭啦!RFM是经典的让人头皮发麻的用户分类和价值分析模型。同时,这个模型以直截了当着称,直截了当,必填字段都写在脸上了,让我们再读一遍:“R!F!M!”:R,Rency,即如何每个顾客多少天没有回购,可以理解为距离上次购买已经过了多少天。F,Frequency,是每个顾客购买了多少次。M,Monetary,代表每个客户的平均购买量,这里也可以是累计购买量。这三个维度是RFM模型的精髓,帮助我们将混合的客户数据划分为8个标准类别,然后根据每个类别的不同特征,比如用户数、贡献量等进行细化匹配手术。使用Python搭建RFM模型,整体建模思路分为五个步骤,一句话——“五步到手,模型到手”,分别是数据概览、数据清洗、维度打分、分数计算和客户分层.01数据概览我们的源数据是订单表,记录了与用户交易相关的字段:有一个细节需要注意,订单的每一行代表单个用户的单次购买行为,什么意思?如果用户一天内购买了4次,订单表对应记录4行,在实际业务场景中,用户一天内的多次消费行为应该被视为一个整体。比如今天10点在必胜客天猫店买了披萨券,11点点了饮料券,18点看到打折后买了两张冰淇淋券。虽然我这一天下了3次订单,但最后还是一次性消费了这些优惠券,应该只能算一次完整的消费行为。这个逻辑会指导后面F值的计算。我们发现在订单状态中,除了交易成功,还有用户退款导致交易关闭。这包括其他州吗?让我看看:只有这两种状态,退款单对我们的模型价值不大,需要在后续清洗中去除。然后观察类型和缺失数据:订单一共28833行,没有任何缺失值。在尼斯方面!类型,付款日期为时间格式,实际付款金额、邮费、购买数量为数字类型,其他为字符串类型。02refunds的数据清洗和去除在观察阶段,我们定义了清洗的第一个目标,就是去除refund数据:抽取去除关键字段后,感觉我们的订单字段还是太多了,RFM模型只需要买家昵称,支付时间,实际支付金额三个关键字段,所以提取出来:关键字段搭建上面的基本清理到此结束,这一步的关键是构建模型需要的三个字段:R(最近一次购买多少?天),F(购买多少)和M(平均或累计购买量)。第一个是R值,也就是距离每个用户最后一次购买时间的天数。如果用户只下过一次订单,则从当前日期减去付款日期;如果用户多次下单,先过滤掉用户上次付款的时间,再从今天减去。需要提醒的是,时间的洪流越来越猛烈,对应的是时间格式,也就是距离今天越近,时间“越大”。比如September9,2019大于September1,2019Day:所以要得到所有用户最晚的付款时间,只需要按买家昵称分组,然后选择最大付款日期:即可得到最后的R值,从今天开始减去每个用户最近一次支付的时间,就得到R值。这个订单是在7月1日产生的,所以这里我们把“2019-7-1”当成“今天”:接下来我们要得到F值,也就是每个用户的累计购买频次。在之前的数据概览阶段,我们明确了“将一天内单个用户下的多笔订单作为一个整体来考虑”的思路,所以我们引入了一个精确到当天的日期标签,根据“买家昵称”和“日期标签”进行分组,将每个用户在一天内的多次下单行为组合起来,然后统计购买次数:上一步计算了每个用户的购买频率,这里我们只需要得到每个用户的总金额用户,然后将总金额除以用户的平均支付金额,可以通过购买频次得到:最后万剑回到战队,三个指标结合起来:至此,我们完成了模型的核心指标,打扫完房子就可以招待客人了。03维度打分维度确认的核心是确定分数。根据设定的标准,我们对每个消费者的R/F/M值进行打分。分数的大小取决于我们的偏好,也就是我们越喜欢的行为,分数越高:以R值为例,R代表用户有多少天没有下单。值越大,用户流失的可能性越大。当然我们不希望用户流失,所以R越大,值就越高。分数越小。F值代表用户的购买频率,M值代表用户的平均支付金额。两个指标越大越好,即数值越大,得分越高。RFM模型中的评分一般采用5分制。常见的有两种方式,一种是根据数据的分位数来打分,另一种是根据对数据和业务的理解来分分。这里希望同学们加深对数据的理解,设定自己的分值,所以在叙述过程中采用了第二种方法,即预先做好不同值对应的分值。根据行业经验,R值设置为30天的跨度,区间左闭右开:F值与购买频率挂钩,每多购买一次加一分给分:我们可以先对M值做一个简单的区间统计,然后分组,这里我们按照50元的区间来划分:这一步我们确定了一个评分框架,每个用户的每个指标都有相应的分数。04ScoreCalculation分数划分逻辑已经确定,好像有点麻烦。接下来我们请来潘师傅(熊猫)出场,看他如何三拳两脚解决这个麻烦的分组逻辑。先以R值为例:大海在流动,方显潘师本色,一行代码即可搞定5级评分。回顾一下Pandas的cut函数:第一个参数传入要拆分的数据列。bins参数表示我们根据什么间隔进行分组。我们确定了R值是按照30天的间隔进行分组的。只需输入[0,30,60,90,120,1000000]。最后一个值设置得非常大,以便为Grouping提供允许极大值的容错空间。right表示右边的区间是开区间还是闭区间,即包中不包含右边的值。如果设置为False,则表示[0,30),包括左侧的组数据,不包括右侧的组数据。如果设置为True,那么就是[0,30],包括开头和结尾。由标签和箱子分割的数组来回回显。你是什??么意思?bins设置6个值,一共分为5组,labels分别标注每组。0-30为5分,30-60为4分,以此类推。那么,F和M的取值就很简单了,按照我们设定的值来划分即可:第一轮打分已经完成,下面进入第二轮打分。guestofficer脏了不要紧,面试不止两轮,伦家RFM模式哪来的这么随便。现在R-SCORE、F-SCORE、M-SCORE在1-5之间。如果你组合3个值,像111,112,113...你可以组合125个结果,太多分类和非分类本质上是一样的。因此,我们通过判断每个客户的R、F、M值是否大于平均值来简化分类结果。因为每个客户的R、F、M都是和平均值比较,所以只有两个结果:0和1(0表示小于平均值,1表示大于平均值)。整体组合有8组,比较合理。健康)状况。下面来判断用户的每一次得分是否大于平均值:Python中判断后返回的结果有True和False,对应值1和0,只要布尔结果乘以1,True变成1,False变成0,处理后可读性更强。05客户层次结构查看前面的步骤。清洗后,我们确定评分逻辑,然后分别计算每个用户的R、F、M分数(SCORE),然后将分数与对应的平均值进行比较,得到三列大于意思是。至此,建模需要的数据都准备好了,剩下的就是客户分层了。RFM经典分层会根据R/F/M各指标是否高于平均值将用户分为8类。我们总结了一下,如下表所示:由于传统的分类,有些名称有点扭曲,像大多数类别前面都加了“重要”,“潜力”和“深耕”有什么区别?进行了适当的改进。强调潜力是为了消费(平均支付金额),深耕是为了增加消费频次,重要客户的召回其实和重要价值客户很相似,只是近期没有复购,以及churnwarningsshouldbedone等。这只是一个介绍,提供一个思路,总之,一切都是为了更容易理解。我们也对每一类客户的特点做了简单的解读。比如重要的价值客户就是最近才购买我们的产品,在整个消费生命周期中购买频率高,单笔平均支付金额也高的客户。其他的分类也同样符合逻辑,可以结合解释来加强理解。下面,我们使用Python来实现这个分类。先引入一个人群值的辅助列,将R\F\M是否大于平均值三个值串联起来再判断:人群值是数值类型,所以前面的0自动跳过,比如1代表“001”的高消费人群回调客户群,10对应“010”的普通客户。为了得到最终的人群标签,定义一个判断函数返回对应的分类标签通过判断crowdvalue的值:最后对crowdvalue列应用标签分类函数:客户分类工作的完成宣告RFM模型建模最后,每个客户都有自己的RFM标签。实际上,RFM模型结果分析在上一步中已经走完了整个建模过程,但是所有的模型结果最终都要服务于业务,所以最后我们会做一些基于扩展和探索性的分析基于现有模型的结果。查看各类用户占比:探索不同类型客户的消费贡献占比:可视化结果(可视化代码留给大家试试):从以上结果我们可以快速得出一些推论:客户流失严重,而高消费电话回头客和流失客户占比超过50%,因此如何制定有针对性的召回策略迫在眉睫。重要价值客户占比仅为2.97%,三级客户占比更是不足2%。我们的模型评分可能不够科学,可以进一步调整评分区间进行优化。……结合金额分析:28.87%因高消费召回的客户占总金额的38.11%。这些顾客是消费的主体。他们为什么会流失,还需要结合订单和购买行为数据进一步探究。深耕常客占比紧随其后。这部分客户的特点是近期消费、消费频率低、消费金额高。高消费召回客户之间的唯一区别是购买时间。如何让这些客户从消费的循环中带回客户,是我们要思考的主要命题。流失客户数量占比26.28%,金额占比仅为12.66%。这些客户中有多少是羊毛用户,有多少是目标用户。如何引导和调整引流策略?.....至此,基于订单源数据,我们按照五步法完成了用Python建立RFM模型,并对结果进行了简单的分析。最后,只要把上面的代码封装成一个函数,对于一个新的数据源,一键回车就可以拉出模型了,SoEasy!整个案例、数据和完整代码都经过了N周的精心准备。觉得有用的朋友动动你的小手来评论一波或者围观一下吧~