import numpy as np
import pandas as pd
df=pd.read_csv("rfm.csv")
df.head()
'''
CustomerID Recency Frquency Monetary
0 12347.0 2 7 2866.77
1 12348.0 248 1 17.00
2 12349.0 18 1 1155.75
3 12350.0 310 1 274.00
4 12352.0 36 7 1147.44
'''
'''
R:距离当前日期越近,得分越高,最高5分,最低1分
F:交易频率越高, 得分越高,最高5分,最低1分
M:交易金额越高, 得分越高,最高5分,最低1分
以上三个指标会将维度再细分出5份,这样就能够细分出5x5x5=125类用户,再根据每类用户精准营销.
显然125类用户已超出普通人脑的计算范畴了。
实际运用上,我们只需要把每个维度做一次两分即可,这样在3个维度上我们依然得到了8组用户(2*2*2)。
即我们可以这样定义
R: 1 if R < R_中位数 else 0 (距今购物间隔越短,代表该用户越活跃)
F: 1 if F > F_中位数 else 0
M: 1 if M > M_中位数 else 0
这样,之前提的问题,就能很容易被解读(编号次序RFM,1代表高,0代表低)
重要价值客户(111):最近消费时间较近、消费频次和消费金额都很高,必须是VIP啊!
重要保持客户(011):最近消费时间较远,但消费频次和金额都很高,说明这是个一段时间没来的忠诚客户,我们需要主动和他保持联系。
重要发展客户(101):最近消费时间较近、消费金额高,但频次不高,忠诚度不高,很有潜力的用户,必须重点发展。
重要挽留客户(001):最近消费时间较远、消费频次不高,但消费金额高的用户,可能是将要流失或者已经要流失的用户,应当基于挽留措施。
'''
构建RFM判别函数
R(x,median) if x<median retuen 1 else 0
F(x,median) if x<median retuen 1 else 0
M(x,median) if x<median retuen 1 else 0
def R(x,median):
if x<median:
return 1
else:
return 0
def F(x,median):
if x<median:
return 1
else:
return 0
def M(x,median):
if x<median:
return 1
else:
return 0
#构建中位数字典
#首先去除掉CustomeID该列
df.iloc[:,1:]
#求每列的中位数
df.iloc[:,1:].quantile(0.5)
'''
Recency 51.00
Frquency 2.00
Monetary 427.45
Name: 0.5, dtype: float64
'''
#求每列的中位数,在转为字典
median_dict_all=df.iloc[:,1:].quantile(0.5).to_dict()
median_dict_all
'''
{'Recency': 51.0, 'Frquency': 2.0, 'Monetary': 427.4500000000001}
'''
#再为df添加新的列,用RFM的判别函数
df['R']=df.Recency.apply(lambda x:(R(x,median_dict_all.get("Recency"))))
df['F']=df.Frquency.apply(lambda x:(R(x,median_dict_all.get("Frquency"))))
df['M']=df.Monetary.apply(lambda x:(R(x,median_dict_all.get("Monetary"))))
df.head()
'''
CustomerID Recency Frquency Monetary R F M
0 12347.0 2 7 2866.77 1 0 0
1 12348.0 248 1 17.00 0 1 1
2 12349.0 18 1 1155.75 1 1 0
3 12350.0 310 1 274.00 0 1 1
4 12352.0 36 7 1147.44 1 0 0
'''

RFM模型.png
网友评论