RFM分析:是根据用户活跃程度和交易金额贡献,进行客户价值细分的一种方法
一、分析指标
指标 | 解释 | 意义 |
R(Recency)近度 | 客户最近一次交易时间的间隔 | R越小,表示客户越近有交易发生 |
F(Frequency)频度 | 客户最近一段时间内交易的次数 | F越大,表示交易越频繁 |
M(Monetary)额度 | 客户最近一段时间内交易的金额 | M越大,表示客户价值越高 |
二、客户分类
更多见图
三、RFM分析步骤
1 计算RFM各项分值
R_S, 距离当前日期越近,得分越高,最高5份,最低1份
F_S,交易频率越高,得分越高, 最高5份,最低1份
M_S,交易金额越高,得分越高, 最高5份,最低1份
2 汇总RFM分值
RFM=100*R_S+10*F_S+1*M_S
3 根据RFM分值对客户分类
RFM分析前提
1 最近有过交易行为的客户,再次发生交易的可能性高高于最近没有交易行为的客户
2 交易频率较高的客户比交易频率较低的客户,更有可能再次发生交易行为;
3 过去所有交易总金额较多的客户,比交易总金额较少的客户,更有消费积极性
四、分析实例
import pandas
data=pandas.read_csv(
'D:\\DATA\\pycase\\5.7\\data.csv'
)
# 进行时间格式的转化
data['DealDateTime']=pandas.to_datetime(
data.DealDateTime,
format='%Y/%m/%d'
)
## 计算距离当前日期的时间
data['DateDiff']=pandas.to_datetime(
'today'
)-data['DealDateTime']
# 第一、计RFM各项分值
# 拆取时间天数
data['DateDiff']=data['DateDiff'].dt.days
# 根据分组项ID负统计列DateDiff进行分组
import numpy
R_Agg=data.groupby(
by=['CustomerID']
)['DateDiff'].agg({
'recenyAgg':numpy.min
})
# 同上求取用户的消费频次
F_Agg=data.groupby(
by=['CustomerID']
)['OrderID'].agg({
'FrequencyAgg':numpy.size
})
# 同上求取用户的消费总额
M_Agg=data.groupby(
by=['CustomerID']
)['Sales'].agg({
'MoneyaryAgg':numpy.sum
})
第二、汇总RFM分值
# 对数据列进行整合
aggData=R_Agg.join(F_Agg).join(M_Agg)
# 进行数组的划分,对最近日期区间划分
# 利用分位数方法进行分组,分为5组,为6分法
# quantile 分位数查找对应的数值,没有的话查找最近的位数
bins=aggData.recenyAgg.quantile(
q=[0,0.2,0.4,0.6,0.8,1],
interpolation='nearest'
)
# 将分组最小值初始化为0
# 为了避免最小值不闭合,输出最小值为空的错误
# cut分组,默认左开右闭
bins[0]=0
# 自定义标签,分别为1到5分
labels=[5,4,3,2,1]
R_S=pandas.cut(
aggData.recenyAgg,
bins,
labels=labels
)
# 进行数组的划分,对最近频次
# 利用分位数方法进行分组,分为5组,为6分法
bins=aggData.FrequencyAgg.quantile(
q=[0,0.2,0.4,0.6,0.8,1],
interpolation='nearest'
)
bins[0]=0
# 自定义标签,分别为1到5分
labels=[1,2,3,4,5]
F_S=pandas.cut(
aggData.FrequencyAgg,
bins,
labels=labels
)
# 进行数组的划分,对最大消费进行划分
# 利用分位数方法进行分组,分为5组,为6分法
bins=aggData.MoneyaryAgg.quantile(
q=[0,0.2,0.4,0.6,0.8,1],
interpolation='nearest'
)
bins[0]=0
# 自定义标签,分别为1到5分
labels=[1,2,3,4,5]
M_S=pandas.cut(
aggData.MoneyaryAgg,
bins,
labels=labels
)
# 最后将计算得变量赋值会数据框里边
aggData['R_S']=R_S
aggData['F_S']=F_S
aggData['M_S']=M_S
# 第三、客户分类
## RFM公式计算,需要将字符窜转换为int数据格式
aggData['RFM']=100*R_S.astype(int)+10*F_S.astype(int)+1*M_S.astype(int)
# 对得分进行分组处理
## 根据类型分为8种客户类型
bins=aggData.RFM.quantile(
q=[0,0.125,0.25,0.375,0.5,0.625,0.75,0.875,1],
interpolation='nearest'
)
bins[0]=0
labels=[1,2,3,4,5,6,7,8]
aggData['Level']=pandas.cut(
aggData.RFM,
bins,
labels=labels
)
##
aggData=aggData.reset_index()
### 对得分进行排序,需要用sort_value 属性
aggData_sort=aggData.sort_values(
['Level','RFM'],
ascending=[1,1]
)
## 对分组进行个数统计
aggData.groupby(
by=['Level']
)['CustomerID'].agg({
'size':numpy.size
})