RFM是通过分析客户的消费行为来判断客户价值,以及进行对多客户进行精细运营的一种工具。
R(Recency)——最近一次消费的时间距离现在多久了?R值主要体现近期活跃度;
F(Frequency)——最近一段时间内的购买次数。F值越高,可以理解是对我们产品越满意的客户,表示客户的忠诚度越高;
M(Monetary)——最近一段时间内的消费金额。M值越高,说明客户实际贡献度越高;
#导入需要使用的模块
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import xlrd
import datetime
import openpyxl
import xlsxwriter
# 可视化时候,正确显示中文字体, pyplot 设置为默认不支持中文显示,需要用 rcParams 修改字体
plt.rcParams['font.sans-serif']=['Heiti TC'] #中文字体引用黑体;此语句适合MAC系统下使用;
plt.rcParams['axes.unicode_minus'] = False #无法显示负号修正。
df=pd.read_excel('订单明细20220331.xls') #读取一季度数据源;
df.info() #判断数据是否有缺失项
df.dropna(how='any',inplace=True) #删除缺失项
df.dropduplicates(inplace=True) #删除重复项
df=df[['日期','客户','消费金额']] #从多列数据中仅提取有用的三列数据,即订单日期,合作客户, 消费金额
df.info()
#构建模型,计算R、F、M的值
#R值计算
r=df.groupby('客户')['日期'].max().reset_index() #筛选出最后一次付款日期;因为最后日期最大,所以用max方法
r['R']=(datetime.date(2022,4,5)-r['日期'].dt.date).dt.days #用4月5日当作当前计算日期和最近一次交易日期的差来计算天数
r=r[['客户','R']] #提取r数据中的客户和R值两列
#F值计算
dup_df=df.groupby('客户')['日期'].count().reset_index() #去掉当日交易的重复值,并对计算交易频次
dup_df.columns=['客户','F'] #提取客户和F值两列
print(dup_df)
#M值计算
sum_m=df.groupby('客户')['消费金额'].sum().reset_index() #针对每个客户的消费金额进行求和,并转变成dateframe类型
sum_m.columns=['客户','累计金额'] #重置列名
comp_m=pd.merge(sum_m,dup_df,on='客户',how='inner') #把具有M、F值的数据集合并;
comp_m.columns=['客户','M','F'] #重置列名
#把RFM数据合并
rfm=pd.merge(r,comp_m,on='客户',how='inner')
print(rfm)
#分值计算
#R值评分规则:0-30天:1分;30~60天:2分:60~90天:3分;90~120天:4分;大于120天:5分;
rfm['R-score']=pd.cut(rfm['R'],bins=[0,30,60,90,120,99999],labels=[5,4,3,2,1],right=False).astype(float)
#F值评分规则:购买频次与分值对应;
rfm['F-score']=pd.cut(rfm['F'],bins=[1,2,3,4,5,99999],labels=[1,2,3,4,5],right=False).astype(float)
#M值评分规则:0~1万:1分;1万~10万:2分;10~20万:3分;20~50万:4分;大于50万:5分;
rfm['M-score']=pd.cut(rfm['M'],bins=[0,10000,100000,200000,500000,1000000000000],labels=[1,2,3,4,5],right=False).astype(float)、
#根据RFM的值是否大于平均分来区分,大于平均分则为1,小于等于平均分则为0;
rfm['R是否大于平均分']=(rfm['R-score']>rfm['R-score'].mean())*1
rfm['F是否大于平均分']=(rfm['F-score']>rfm['F-score'].mean())*1
rfm['M是否大于平均分']=(rfm['M-score']>rfm['M-score'].mean())*1
#综合得分的计算方法为:R为百分位,F为十位,M为个位;总计构成8种方式的打分结果
rfm['RFM综合得分']=(rfm['R是否大于平均值'])*100+(rfm['F是否大于平均值'])*10+(rfm['M是否大于平均值'])*1
#定义8种分值对应不同的客户类型函数
def get_score(x):
dic={
111:'重要价值客户',
110:'消费潜力客户',
101:'频次深耕客户',
100:'新客户',
11:'重要价值流失预警客户',
10:'一般客户',
1:'高消费挽回客户',
0:'流失客户'
}
return dic[x]
rfm['客户类型']=rfm['RFM综合得分'].apply(get_score) #客户类型的规则和分值应用到数据中,并生成每个客户的客户类型
#把数据统计分析的结果分别写入到一个Excel文件的sheet中,并设定好对应的sheet名字
excelpath='/Users/simaxiaohu/Desktop/RFM分析结果.xlsx'
writer=pd.ExcelWriter(excelpath,engine='xlsxwriter')
rfm.to_excel(writer,sheet_name='RFM分析')
writer.save()
#对RFM结果进行分析
count=rfm['客户类型'].value_counts().reset_index() #对不同客户类型的客户进行计数求和;
count.columns=['客户类型','客户数量']
count['客户数量占比']=count['客户数量']/count['客户数量'].sum() #不同客户类型的占比计算;
#可视化,客户类型数量分布及占比
fig=plt.figure(figsize=(10,5))
plt.bar(count['客户类型'],count['客户数量'],width=0.3,label='客户数量')
plt.xticks(rotation=70)
plt.xlabel('客户类型')
plt.ylabel('客户数量')
plt.twinx()
plt.plot(count['客户类型'],count['客户数量占比'],color='r',label='客户数量占比')
for a,b in zip(count['客户类型'],count['客户数量占比']):
plt.text(a,b,"%.2f%%" % (b*100))
plt.ylabel('客户数量占比')
fig.legend()
plt.title('RFM各类型客户分布及占比')
plt.show()
plt.savefig('各类型客户分布及占比.png',transparent=True)