附案例数据和代码 不到70行Python代码,轻松玩转RFM用户分析模型

本文从RFM模型概念入手,结合实际案例,详解实现模型的每一步操作,并提供案例同款源数据,以供同学们知行合一 。
注:想直接下载代码和数据的同学可以空降文末
看这篇文章前源数据长这样:
学完后只要敲一个回车,源数据就变成了这样:
是不是心动了?OK,闲话少叙,我们来开动正餐!
RFM,是一种经典到头皮发麻的用户分类、价值分析模型,同时,这个模型以直白著称,直白到把需要的字段写在了脸上,让我们再念一遍:“R!F!M!”:
这三个维度,是RFM模型的精髓所在,帮助我们把混杂一体的客户数据分成标准的8类,然后根据每一类用户人数占比、金额贡献等不同的特征,进行人、货、场三重匹配的精细化运营 。
用建立RFM模型,整体建模思路分为五步,一言蔽之——“五步在手,模型你有”,分别是数据概览、数据清洗、维度打分、分值计算和客户分层 。
01 数据概览
我们的源数据是订单表,记录着用户交易相关的字段:
有个细节需要注意,订单每一行代表着单个用户的单次购买行为,什么意思呢?如果一个用户在一天内购买了4次,订单表对应记录着4行,而在实际的业务场景中,一个用户在一天内的多次消费行为,应该从整体上看作一次 。
比如,我今天10点在必胜客天猫店买了个披萨兑换券,11点又下单了饮料兑换券,18点看到优惠又买了两个冰淇淋兑换券 。这一天内虽然我下单了3次,但最终这些兑换券我会一次消费掉,应该只算做一次完整的消费行为,这个逻辑会指导后面F值的计算 。
我们发现在订单状态中,除了交易成功的,还有用户退款导致交易关闭的,那还包括其他状态吗?Let me see see:
只有这两种状态,其中退款订单对于我们模型价值不大,需要在后续清洗中剔除 。
接着再观察数据的类型和缺失情况:
订单一共28833行,没有任何缺失值,Nice!类型方面,付款日期是时间格式,实付金额、邮费和购买数量是数值型,其他均为字符串类型 。
02 数据清洗
剔除退款
在观察阶段,我们明确了第一个清洗的目标,就是剔除退款数据:
关键字段提取
剔除之后,觉得我们订单的字段还是有点多,而RFM模型只需要买家昵称,付款时间和实付金额这3个关键字段,所以提取之:
关键字段构造
上面的基础清洗告一段落,这一步关键在于构建模型所需的三个字段:R(最近一次购买距今多少天),F(购买了多少次)以及M(平均或者累计购买金额) 。
首先是R值,即每个用户最后一次购买时间距今多少天 。如果用户只下单过一次,用现在的日期减去付款日期即可;若是用户多次下单,需先筛选出这个用户最后一次付款的时间,再用今天减去它 。
需要提醒的是,时间洪流越滚越凶,对应在时间格式中,就是距离今天越近,时间也就越“大”,举个例子,2019年9月9日是要大于2019年9月1日的:

附案例数据和代码  不到70行Python代码,轻松玩转RFM用户分析模型

文章插图
因此,要拿到所有用户最近一次付款时间,只需要按买家昵称分组,再选取付款日期的最大值即可:
为了得到最终的R值,用今天减去每位用户最近一次付款时间,就得到R值了,这份订单是7月1日生成的,所以这里我们把“2019-7-1”当作“今天”:
接着来搞定F值,即每个用户累计购买频次 。
在前面数据概览阶段,我们明确了“把单个用户一天内多次下单行为看作整体一次”的思路,所以,引入一个精确到天的日期标签,依照“买家昵称”和“日期标签”进行分组,把每个用户一天内的多次下单行为合并,再统计购买次数: