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简单生成随机姓名的方法示例
Dec 27 Python
解决每次打开pycharm直接进入项目的问题
Oct 28 Python
Django使用redis缓存服务器的实现代码示例
Apr 28 Python
python粘包问题及socket套接字编程详解
Jun 29 Python
使用pytorch实现可视化中间层的结果
Dec 30 Python
Python reshape的用法及多个二维数组合并为三维数组的实例
Feb 07 Python
jupyter notebook运行命令显示[*](解决办法)
May 18 Python
python中Ansible模块的Playbook的具体使用
May 28 Python
keras K.function获取某层的输出操作
Jun 29 Python
使用Dajngo 通过代码添加xadmin用户和权限(组)
Jul 03 Python
Django windows使用Apache实现部署流程解析
Oct 12 Python
如何利用python实现Simhash算法
Jun 28 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
造势之举?韩国总统候选人发布《星际争霸》地图
2017/04/22 星际争霸
安装PHP可能遇到的问题“无法载入mysql扩展” 的解决方法
2007/04/16 PHP
PHP生成不同颜色、不同大小的tag标签函数
2013/09/23 PHP
浅析ThinkPHP中execute和query方法的区别
2014/06/13 PHP
ie下动态加态js文件的方法
2011/09/13 Javascript
基于jquery的web页面日期格式化插件
2011/11/15 Javascript
用Jquery重写windows.alert方法实现思路
2013/04/03 Javascript
详解jQuery插件开发中的extend方法
2013/11/19 Javascript
window.location的重写及判断location是否被重写
2014/09/04 Javascript
JavaScript中的变量定义与储存介绍
2014/12/31 Javascript
微信中一些常用的js方法汇总
2015/03/12 Javascript
jQuery实现宽屏图片轮播实例教程
2015/11/24 Javascript
js实现密码强度检测【附示例】
2016/03/30 Javascript
基于JS实现移动端向左滑动出现删除按钮功能
2017/02/22 Javascript
layer弹出子iframe层父子页面传值的实现方法
2018/11/22 Javascript
一次让你了解全部JavaScript的作用域
2019/06/24 Javascript
Vue商品控件与购物车联动效果的实例代码
2019/07/21 Javascript
详解python的几种标准输出重定向方式
2016/08/15 Python
Python实现采用进度条实时显示处理进度的方法
2017/12/19 Python
Python中elasticsearch插入和更新数据的实现方法
2018/04/01 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
python KNN算法实现鸢尾花数据集分类
2019/10/24 Python
如何提高python 中for循环的效率
2020/04/15 Python
python学习之使用Matplotlib画实时的动态折线图的示例代码
2021/02/25 Python
Square Off美国/加拿大:世界上最聪明的国际象棋棋盘
2018/12/06 全球购物
客服专员岗位职责范本
2013/11/29 职场文书
电脑销售顾问自荐信
2014/01/29 职场文书
优秀学生获奖感言
2014/02/15 职场文书
领导干部作风整顿剖析材料
2014/10/11 职场文书
爱心募捐感谢信
2015/01/22 职场文书
绿色环保倡议书
2015/04/28 职场文书
五星级酒店宣传口号
2015/12/25 职场文书
《称赞》教学反思
2016/02/17 职场文书
pycharm代码删除恢复的方法
2021/06/26 Python
Vue ECharts实现机舱座位选择展示功能
2022/05/15 Vue.js
Win11无法安装更新补丁KB3045316怎么办 附KB3045316补丁修复教程
2022/08/14 数码科技