Python pandas RFM模型应用实例详解


Posted in Python onNovember 20, 2019

本文实例讲述了Python pandas RFM模型应用。分享给大家供大家参考,具体如下:

什么是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大类:

Python pandas RFM模型应用实例详解

本文采取的方法是将三个指标进行标准化,然后按照分为数划分为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,57,111,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值选择:

Python pandas RFM模型应用实例详解

聚类结果:

Python pandas RFM模型应用实例详解

#聚类
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层次分析法(专家打分法)

Python pandas RFM模型应用实例详解

总结

上述客户分类其实比较粗旷,真正在面对千万级客户量时,如此划分为四大类是难以满足运营需求的。运营中,还需要综合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])

关于Python相关内容感兴趣的读者可查看本站专题:《Python函数使用技巧总结》、《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python中声明只包含一个元素的元组数据方法
Aug 25 Python
python实现通过代理服务器访问远程url的方法
Apr 29 Python
Python通过select实现异步IO的方法
Jun 04 Python
Python cookbook(数据结构与算法)实现对不原生支持比较操作的对象排序算法示例
Mar 15 Python
python批量导入数据进Elasticsearch的实例
May 30 Python
python3 http提交json参数并获取返回值的方法
Dec 19 Python
python粘包问题及socket套接字编程详解
Jun 29 Python
python 协程中的迭代器,生成器原理及应用实例详解
Oct 28 Python
Python转换itertools.chain对象为数组的方法
Feb 07 Python
python等差数列求和公式前 100 项的和实例
Feb 25 Python
python实现人脸签到系统
Apr 13 Python
Python用摘要算法生成token及检验token的示例代码
Dec 01 Python
使用Python实现正态分布、正态分布采样
Nov 20 #Python
Python pandas自定义函数的使用方法示例
Nov 20 #Python
Python求正态分布曲线下面积实例
Nov 20 #Python
复化梯形求积分实例——用Python进行数值计算
Nov 20 #Python
Python实现数值积分方式
Nov 20 #Python
基于Python批量生成指定尺寸缩略图代码实例
Nov 20 #Python
python用quad、dblquad实现一维二维积分的实例详解
Nov 20 #Python
You might like
咖啡与水的关系
2021/03/03 冲泡冲煮
PHP 正则表达式常用函数
2014/08/17 PHP
使用PHPCMS搭建wap手机网站
2015/09/20 PHP
php使用CutyCapt实现网页截图保存的方法
2016/10/03 PHP
javascript学习随笔(使用window和frame)的技巧
2007/03/08 Javascript
点击弹出层效果&amp;弹出窗口后网页背景变暗效果的实现代码
2014/02/10 Javascript
extjs每个组件要设置唯一的ID否则会出错
2014/06/15 Javascript
使用jQuery+EasyUI实现CheckBoxTree的级联选中特效
2015/12/06 Javascript
理解js对象继承的N种模式
2016/01/25 Javascript
纯js实现手风琴效果代码
2020/04/17 Javascript
JavaScript中transform实现数字翻页效果
2017/03/08 Javascript
js鼠标跟随运动效果
2017/03/11 Javascript
angular4 如何在全局设置路由跳转动画的方法
2017/08/30 Javascript
解决vue-cli + webpack 新建项目出错的问题
2018/03/20 Javascript
详解使用Next.js构建服务端渲染应用
2018/07/10 Javascript
JavaScript实现旋转木马轮播图
2020/03/16 Javascript
Vue通过provide inject实现组件通信
2020/09/03 Javascript
js将日期格式转换为YYYY-MM-DD HH:MM:SS
2020/09/18 Javascript
使用Python解析JSON数据的基本方法
2015/10/15 Python
Python迭代和迭代器详解
2016/11/10 Python
Python实现读取及写入csv文件的方法示例
2018/01/12 Python
python反编译学习之字节码详解
2019/05/19 Python
Python3.8中使用f-strings调试
2019/05/22 Python
Python中字符串List按照长度排序
2019/07/01 Python
python字典key不能是可以是啥类型
2020/08/04 Python
Canvas波浪花环的示例代码
2020/08/21 HTML / CSS
中国高端鲜花第一品牌:roseonly(一生只送一人)
2017/02/12 全球购物
英国信箱在线鲜花速递公司:Bloom & Wild
2019/03/10 全球购物
施华洛世奇匈牙利官网:SWAROVSKI匈牙利
2019/07/06 全球购物
美国在线肉类和海鲜配送:Crowd Cow
2020/10/02 全球购物
信访工作经验交流材料
2014/05/23 职场文书
公证委托书标准格式
2014/09/11 职场文书
群众路线教育实践活动个人对照检查材料思想汇报(社区班子)
2014/10/06 职场文书
交通事故起诉书
2015/05/19 职场文书
怎么用Python识别手势数字
2021/06/07 Python
Vue3.0 手写放大镜效果
2021/07/25 Vue.js