Python如何做RFM模型分析

RFM模型是一个比较经典的用户分析模型,现在互联网企业一直在使用,特别是电商领域,使用频率会比较高,对用户进行精细化运营,分辨出高价值用户。
一、RFM模型是什么
RFM模型是衡量客户价值和客户创利能力的重要工具和手段。在众多的RFM模型是衡量客户价值和客户创利能力的重要工具和手段。该模型通过一个客户的近期购买行为、购买的总体频率以及花了多少钱3项指标来描述该客户的价值状况。
R(Recency)最近一次消费时间:表示用户最近一次消费距离现在的时间。消费时间越近的客户价值越大。1年前消费过的用户肯定没有1周前消费过的用户价值大。
F(Frequency)消费频率:消费频率是指用户在统计周期内购买商品的次数,经常购买的用户也就是熟客,价值肯定比偶尔来一次的客户价值大。
M(Monetary)消费金额:消费金额是指用户在统计周期内消费的总金额,体现了消费者为企业创利的多少,自然是消费越多的用户价值越大。
在这里插入图片描述
从上面可知可以将用户价值分成8个等级:
在这里插入图片描述
如果某个用户最近一次消费时间距今比较久远,没有再消费了,但是累计消费金额和消费频次都很高,说明这个用户曾经很有价值也就是RFM模型中的重要保持客户,我们不希望他流失,所以运营人员就会专门针对这类型用户设计召回策略,这也就是RFM模型的核心价值。
二、Python模型实现逻辑

1.计算各个分项的数值

R_V:距离当前日期越近,得分越高,最高5分,最低1分

F_V:交易频率越高,得分越高,最高5分,最低1分

M_V:交易金额越高,得分越高,最高5分,最低1分

2.计算总分

RFM = 100*R+10*F+M(说明:这个公式可以根据公司和情况定,如有业务场景量小价高就可改成RFM = 100*R+10*M+F)
三、案例分析

本案例样本为某天猫商家2011年3月至5月的交易数据,包含了如下几个字段,其pur_time为交易时间,price为交易金额。
在这里插入图片描述
1、先处理数据

df = pd.read_excel(r'C:\Users\didi\Desktop\卖家交易表.xlsx','Sheet1')
df['diff']= df.pur_time-datetime.datetime(2011,6,1)#因为excel里面就是日期格式,所以直接引用,如果不是可以进行格式转换
df['diff']=df['diff'].dt.days
r_data = df.groupby('buyer_id').agg({'diff':'min'})#最近的一次交易
r_data = r_data.reset_index()
f_data = df.groupby('buyer_id').agg({'goods_id':'count'})#交易次数
f_data = f_data.reset_index()
m_data = df.groupby('buyer_id').agg({'price':'sum'})#交易金额
m_data = m_data.reset_index()
#将数据进行合并
data=pd.merge(r_data,f_data,on='buyer_id',how='left')
data = pd.merge(data,m_data,on='buyer_id',how ='left')
print(data)

在这里插入图片描述
2、RFM各小项目得分和总分的换算

因为要分出五个不等同级的分数,最简单的方法就是取百分位数进行换算,主要用到两个方法是pd.quantile和pd.cut

binsr = data['diff'].quantile([0,0.2,0.4,0.6,0.8,1])
r_s = pd.cut(data['diff'],binsr,labels=[1,2,3,4,5])
binsf = data['goods_id'].quantile([0,0.93,0.98,0.993,0.997,1])#因为数据样本原因为就没有进行等分布
f_s = pd.cut(data['goods_id'],binsf,labels=[1,2,3,4,5],right=False)#right进行左开右闭
binsm =data['price'].quantile([0,0.2,0.4,0.6,0.8,1])
m_s = pd.cut(data['price'],binsm,labels=[1,2,3,4,5])
data['r_s'] =r_s
data['f_s'] =f_s
data['m_s'] =m_s
data['rfm']=data['r_s'].values.astype(int)*100+10*data['f_s'].values.astype(int)+data['m_s'].values.astype(int)
print(data)

在这里插入图片描述
3.得出用户的不同等级

与上面操作思路大致相同


bins = data['rfm'].quantile([ 0, 0.125, 0.25, 0.375, 0.5, 0.625, 0.75, 0.875, 1])
label =['一般挽留客户','一般保持客户','一般发展客户','一般价值客户','重要挽留客户','重要保持客户','重要发展客户','重要价值客户']
levels = pd.cut(data['rfm'],bins,labels =label)
data['levels']=levels
data =data.rename({'diff':'recently','goods_id':'frequently','price':'measure'},axis =1)
print(data)

在这里插入图片描述
已开通微信账号,欢迎关注数据分析小栈交流,如需本案例的数据可以联系:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值