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 30 Python
Python中__name__的使用实例
Apr 14 Python
Python求解任意闭区间的所有素数
Jun 10 Python
python 除法保留两位小数点的方法
Jul 16 Python
Python 一键制作微信好友图片墙的方法
May 16 Python
python自带tkinter库实现棋盘覆盖图形界面
Jul 17 Python
Python Selenium参数配置方法解析
Jan 19 Python
python GUI库图形界面开发之PyQt5下拉列表框控件QComboBox详细使用方法与实例
Feb 27 Python
Tensorflow之梯度裁剪的实现示例
Mar 08 Python
python excel多行合并的方法
Dec 09 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
Dec 14 Python
Python数据清洗工具之Numpy的基本操作
Apr 22 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
php录入页面中动态从数据库中提取数据的实现
2006/10/09 PHP
PHP中trim()函数简单使用指南
2015/04/16 PHP
PHP 闭包详解及实例代码
2016/09/28 PHP
php删除数组指定元素实现代码
2017/05/03 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
在云虚拟主机部署thinkphp5项目的步骤详解
2017/12/21 PHP
jQuery 拖动层(在可视区域范围内)
2012/05/24 Javascript
jQuery中outerHeight()方法用法实例
2015/01/19 Javascript
基于JavaScript实现屏幕滚动效果
2017/01/18 Javascript
JS实现简单表格排序操作示例
2017/10/07 Javascript
jQuery插件artDialog.js使用与关闭方法示例
2017/10/09 jQuery
angularjs实现时间轴效果的示例代码
2017/11/29 Javascript
JavaScript实现快速排序的方法分析
2018/01/10 Javascript
jQuery实现的淡入淡出图片轮播效果示例
2018/08/29 jQuery
[03:02]安得倚天剑,跨海斩长鲸——中国军团出征DOTA2国际邀请赛
2018/08/14 DOTA
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
Python中用psycopg2模块操作PostgreSQL方法
2017/11/28 Python
Python使用 Beanstalkd 做异步任务处理的方法
2018/04/24 Python
解决nohup重定向python输出到文件不成功的问题
2018/05/11 Python
python mysql自增字段AUTO_INCREMENT值的修改方式
2020/05/18 Python
Django微信小程序后台开发教程的实现
2020/06/03 Python
Python logging日志库空间不足问题解决
2020/09/14 Python
python中strip(),lstrip(),rstrip()函数的使用讲解
2020/11/17 Python
html5的pushstate以及监听浏览器返回事件的实现
2020/08/11 HTML / CSS
盛大笔试题
2016/11/05 面试题
公务员总结性个人自我评价
2013/12/05 职场文书
学生实习介绍信
2014/01/15 职场文书
幼儿园老师寄语
2014/04/03 职场文书
《假如》教学反思
2014/04/17 职场文书
党员批评与自我批评范文
2014/09/23 职场文书
群众路线教育实践活动总结
2014/10/30 职场文书
2014小学教师个人工作总结
2014/11/10 职场文书
学生自我评语
2015/01/04 职场文书
《西游记》读后感(3篇)
2019/09/20 职场文书
Python数据清洗工具之Numpy的基本操作
2021/04/22 Python
Python+tkinter实现高清图片保存
2022/03/13 Python