pandas---RFM模型

本文介绍RFM模型在客户价值分析中的应用,包括最近一次消费、消费频率和消费金额的量化评估,通过聚类分析实现客户分类,以及如何利用RFM模型进行客户价值打分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是RFM模型

根据美国数据库营销研究所Arthur Hughes的研究,客户数据库中有3个神奇的要素,这3个要素构成了数据分析最好的指标:

  • 最近一次消费 (Recency): 客户最近一次交易时间的间隔。R值越大,表示客户交易距今越久,反之则越近;
  • 消费频率 (Frequency): 客户在最近一段时间内交易的次数。F值越大,表示客户交易越频繁,反之则不够活跃;
  • 消费金额 (Monetary): 客户在最近一段时间内交易的金额。M值越大,表示客户价值越高,反之则越低。

RFM实践应用

1、前提假设验证

RFM模型的应用是有前提假设的,即R、F、M值越大价值越大,客户未来的为企业带来的价值越大。这个前提假

设其实已经经过大量的研究和实证,假设是成立的。不过为了更加严谨,确保RFM模型对于特殊案例是有效的,

本文还进行了前提假设验证:
ps:Frequency、Monetary均为近6个月内的数据,即1-6月数据;

利用相关性检验,验证假设:

  • 最近购买产品的用户更容易产生下一次消费行为

  • 消费频次高的用户,用户满意度高,忠诚度高,更容易产生下一次消费行为

  • 消费金额高的用户更容易带来高消费行为

2、RFM分级

简单的做法,RFM三个指标以均值来划分,高于均值的为高价值、低于均值的为低价值,如此可以将客户划分为8大类:
在这里插入图片描述
本文采取的方法是将三个指标进行标准化,然后按照分为数划分为5个等级,数值越大代表价值越高;当然最终划分的规则还是要结合业务来定。划分为5个等级后,客户可以细分为125种。

#读取数据
rfm<-read.csv('~/desktop/rfm1_7.csv',header=TRUE)
summary(rfm)
#数据分布
par(mfrow=c(1,3))
boxplot(rfm$rankR1) 
boxplot(rfm$rankF1) 
boxplot(rfm$rankM1)
#rfm分级
breaks1<-quantile(rfm$Recency, probs = seq(0, 1, 0.2),names = FALSE)
breaks1<-c(1,14,30,57111,181) #以流失用户的定义来设置分级 30天以上为流失用户
breaks2<-quantile(rfm$Frequency, probs = seq(0, 1, 0.2),names = FALSE)
breaks2<-c(1,2,3,6,14,164) 
breaks3<-quantile(rfm$Monetary, probs = seq(0, 1, 0.2),names = FALSE)
rfm$rankR1<- cut(rfm$Recency,breaks1, 5,labels=F)
rfm$rankR1<- 6-rfm$rankR1
rfm$rankF1<- cut(rfm$Frequency,breaks2, 5,labels=F)
rfm$rankM1<- cut(rfm$Monetary,breaks3, 5,labels=F)

3、客户分类

本文采用K-means聚类进行分类,聚类结果结合业务划分为4大类:

  • Cluster1:价值用户R、F、M三项指标均较高;

  • Cluster2,3:用户贡献值最低,且用户近度(小于2)和频度较低,为无价值客户;

  • Cluster4:发展用户,用户频度和值度较低,但用户近度较高,可做up营销;

  • Cluster5:挽留客户,用户近度较低,但频度和值度较高,需采用挽留手段

k值选择:

在这里插入图片描述

聚类结果:

在这里插入图片描述

#聚类
df<-rfm[,c(6,7,8)]
p1<-fviz_nbclust(df, kmeans, method = "wss")
p2<-p1 + geom_vline(xintercept = 5, linetype = 2)
km_result <- kmeans(df, 5)
dd <- cbind(rfm,df, cluster = km_result$cluster)
##查看每一类的数目
table(dd$cluster)
picture<-fviz_cluster(km_result, df, geom = "point")
####聚类结果解释####
rfm_final <- within(dd,{Custom = NA
Custom[cluster == 1] = '高价值客户'  
Custom[cluster == 2 ] = '无价值客户' 
Custom[ cluster == 3] = '无价值客户'  
Custom[cluster == 4] = '重点发展客户'    
Custom[cluster == 5] = '重点挽留客户'  
})

4、RFM打分

步骤3,我们将客户划分为四大类,其实如果一类客户中还有大量的客户,此时为了精细化营销,可以根据RFM进行加权打分,给出一个综合价值的分。这里,运用AHP层次分析法确定RFM各指标权重:

客户价值RFM_SCORE= 0.25rankR + 0.20rankF+0.55*rankM

AHP层次分析法(专家打分法)

在这里插入图片描述

总结

上述客户分类其实比较粗旷,真正在面对千万级客户量时,如此划分为四大类是难以满足运营需求的。运营中,还需要综合CRM中其他指标、维度。

ps:后续作者利用RFM客户价值得分进行潜在客户挖掘,尝试利用决策树等模型挖掘平台潜在客户特征。

简单实例

import pandas as pd
import numpy as np
import time

#todo 读取数据
data = pd.read_csv('RFM_TRAD_FLOW.csv',encoding='gbk')
# print(ret)

# todo RFM------>R(最近一次消费)

#todo 时间与字符串相互转换
data['time'] = data['time'].map(lambda x:time.mktime(time.strptime(x,'%d%b%y:%H:%M:%S')))
# print(data)
# todo 分组
groupby_obj = data.groupby(['cumid','type'])
# for name,data in groupby_obj:
#     print(name)
#     print(data)
# todo 取值
R = groupby_obj[['time']].max()
# print(
# todo 转为透视表
r_trans = pd.pivot_table(R,index='cumid',columns='type',values='time')
# print(data_trans)
# todo 替换缺失值 有缺失值,替换成最远的值
r_trans[['Special_offer','returned_goods']] = r_trans[['Special_offer','returned_goods']].apply(lambda x:x.replace(np.nan,min(x)),axis = 0)
# print(data_trans)
r_trans['r_max'] = r_trans.apply(lambda x:sum(x),axis=1)
# print(r_trans)


# todo RFM------>F(消费频率)
# 取值
F =groupby_obj[['transID']].count()
# print(F)
#转为透视表
f_trans = pd.pivot_table(F,index='cumid',columns='type',values='transID')
# print(f_trans)
#替换缺失值
f_trans[['Special_offer','returned_goods']]= f_trans[['Special_offer','returned_goods']].fillna(0)
# print(f_trans)
#
f_trans['returned_goods'] = f_trans['returned_goods'].map(lambda x:-x)
# print(f_trans)
f_trans['f_total'] = f_trans.apply(lambda x:sum(x),axis=1)
# print(f_trans)


# todo RFM------>M(消费金额)

# 取值
M =groupby_obj[['amount']].sum()
# print(M)
#转为透视表
m_trans = pd.pivot_table(M,index='cumid',columns='type',values='amount')
# print(f_trans)
#替换缺失值
m_trans[['Special_offer','returned_goods']]= m_trans[['Special_offer','returned_goods']].fillna(0)
# print(f_trans)
#
m_trans['m_total'] = m_trans.apply(lambda x:sum(x),axis=1)
# print(m_trans)

# 合并
RFM=pd.concat([r_trans["r_max"],f_trans['f_total'],m_trans['m_total']],axis=1)
print(RFM)

r_score = pd.cut(RFM.r_max,3,labels=[0,1,2])
f_score = pd.cut(RFM.r_max,3,labels=[0,1,2])
m_score = pd.cut(RFM.r_max,3,labels=[0,1,2])

03-08
### PS-RFM 技术概述 PS-RFM 是一种用于客户细分的技术方法,它扩展了传统的 RFM (Recency, Frequency, Monetary) 模型,在此基础上加入了更多的维度来更全面地评估客户的购买行为和价值。这种方法不仅考虑了最近一次购买的时间、购买频率以及消费金额,还可能引入其他因素如产品偏好等,从而提供更加细致入微的市场洞察[^1]。 为了确保开发和测试人员能够理解该技术的应用场景及其实现细节,建议编写详细的文档说明如何应用此模型进行数据分析工作。当有新的需求或者算法调整时,应及时更新这些材料并向相关人员传达变化内容。 关于是否允许同一个客户被分配到多个不同的群组之中,这取决于具体应用场景的需求设定。如果业务逻辑支持的话,确实存在所谓的“可重叠”的聚类情况;反之则为排他性的分类方式[^2]。 针对希望获取更多有关 PS-RFM 的学习资料这一诉求: - 可以访问学术数据库如 IEEE Xplore 或 Google Scholar 寻找最新的研究成果; - 访问 GitHub 平台寻找开源项目实例作为参考; - 加入专业的在线社区论坛交流经验心得; - 查阅商业智能领域内的知名博客文章了解行业动态和发展趋势。 ```python import pandas as pd from sklearn.cluster import KMeans def ps_rfm_analysis(dataframe): """ 对给定的数据框执行简单的RFM分析 参数: dataframe (pd.DataFrame): 包含交易记录的数据集 返回: rfm_scores (pd.DataFrame): 各个用户的RFM得分表 """ # 数据预处理... kmeans = KMeans(n_clusters=5).fit(rfm_data) labels = kmeans.labels_ return pd.concat([rfm_data, pd.Series(labels)], axis=1) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值