RFM客户价值分析及可视化

 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)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值