Python pandas RFM模型应用实例详解

本文实例讲述了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大类:

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

聚类结果:

#聚类
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])

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

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

(0)

相关推荐

  • Python 中pandas.read_excel详细介绍

    Python 中pandas.read_excel详细介绍 #coding:utf-8 import pandas as pd import numpy as np filefullpath = r"/home/geeklee/temp/all_gov_file/pol_gov_mon/downloads/1.xls" #filefullpath = r"/home/geeklee/temp/all_gov_file/pol_gov_mon/downloads/26368f3

  • python中pandas.DataFrame的简单操作方法(创建、索引、增添与删除)

    前言 最近在网上搜了许多关于pandas.DataFrame的操作说明,都是一些基础的操作,但是这些操作组合起来还是比较费时间去正确操作DataFrame,花了我挺长时间去调整BUG的.我在这里做一些总结,方便你我他.感兴趣的朋友们一起来看看吧. 一.创建DataFrame的简单操作: 1.根据字典创造: In [1]: import pandas as pd In [3]: aa={'one':[1,2,3],'two':[2,3,4],'three':[3,4,5]} In [4]: bb=

  • Python pandas自定义函数的使用方法示例

    本文实例讲述了Python pandas自定义函数的使用方法.分享给大家供大家参考,具体如下: 自定义函数的使用 import numpy as np import pandas as pd # todo 将自定义的函数作用到dataframe的行和列 或者Serise的行上 ser1 = pd.Series(np.random.randint(-10,10,5),index=list('abcde')) df1 = pd.DataFrame(np.random.randint(-10,10,(

  • Python使用Pandas读写Excel实例解析

    这篇文章主要介绍了Python使用Pandas读写Excel实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Pandas是python的一个数据分析包,纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具. Pandas提供了大量能使我们快速便捷地处理数据的函数和方法. Pandas官方文档:https://pandas.pydata.org/pandas-docs/stable/ Pandas中文文档:https:/

  • 在Python中利用Pandas库处理大数据的简单介绍

    在数据分析领域,最热门的莫过于Python和R语言,此前有一篇文章<别老扯什么Hadoop了,你的数据根本不够大>指出:只有在超过5TB数据量的规模下,Hadoop才是一个合理的技术选择.这次拿到近亿条日志数据,千万级数据已经是关系型数据库的查询分析瓶颈,之前使用过Hadoop对大量文本进行分类,这次决定采用Python来处理数据: 硬件环境         CPU:3.5 GHz Intel Core i7         内存:32 GB HDDR 3 1600 MHz         硬

  • Python pandas常用函数详解

    本文研究的主要是pandas常用函数,具体介绍如下. 1 import语句 import pandas as pd import numpy as np import matplotlib.pyplot as plt import datetime import re 2 文件读取 df = pd.read_csv(path='file.csv') 参数:header=None 用默认列名,0,1,2,3... names=['A', 'B', 'C'...] 自定义列名 index_col='

  • python中pandas.DataFrame对行与列求和及添加新行与列示例

    本文介绍的是python中pandas.DataFrame对行与列求和及添加新行与列的相关资料,下面话不多说,来看看详细的介绍吧. 方法如下: 导入模块: from pandas import DataFrame import pandas as pd import numpy as np 生成DataFrame数据 df = DataFrame(np.random.randn(4, 5), columns=['A', 'B', 'C', 'D', 'E']) DataFrame数据预览: A

  • Python 中pandas索引切片读取数据缺失数据处理问题

    引入 numpy已经能够帮助我们处理数据,能够结合matplotlib解决我们数据分析的问题,那么pandas学习的目的在什么地方呢? numpy能够帮我们处理处理数值型数据,但是这还不够 很多时候,我们的数据除了数值之外,还有字符串,还有时间序列等 比如:我们通过爬虫获取到了存储在数据库中的数据 比如:之前youtube的例子中除了数值之外还有国家的信息,视频的分类(tag)信息,标题信息等 所以,numpy能够帮助我们处理数值,但是pandas除了处理数值之外(基于numpy),还能够帮助我

  • Python3 pandas 操作列表实例详解

    1.首先需要安装pandas, 安装的时候可能由依赖的包需要安装,根据运行时候的提示,缺少哪个库,就pip 安装哪个库. 2.示例代码 import pandas as pd from pandas import ExcelWriter EX_PATH = "E:\\code\\test2.xlsx" #读取excel里面的内容 data = pd.read_excel(EX_PATH,sheet_name='Sheet1') #新增加一列内容 lista = [21, 21, 20,

  • Python科学计算之Pandas详解

    起步 Pandas最初被作为金融数据分析工具而开发出来,因此 pandas 为时间序列分析提供了很好的支持. Pandas 的名称来自于面板数据(panel data)和python数据分析 (data analysis) .panel data是经济学中关于多维数据集的一个术语,在Pandas中也提供了panel的数据类型. 在我看来,对于 Numpy 以及 Matplotlib ,Pandas可以帮助创建一个非常牢固的用于数据挖掘与分析的基础.而Scipy当然是另一个主要的也十分出色的科学计

  • python pandas dataframe 按列或者按行合并的方法

    concat 与其说是连接,更准确的说是拼接.就是把两个表直接合在一起.于是有一个突出的问题,是横向拼接还是纵向拼接,所以concat 函数的关键参数是axis . 函数的具体参数是: concat(objs,axis=0,join='outer',join_axes=None,ignore_index=False,keys=None,levels=None,names=None,verigy_integrity=False) objs 是需要拼接的对象集合,一般为列表或者字典 axis=0 是

  • Windows下Python使用Pandas模块操作Excel文件的教程

    安装Python环境 ANACONDA是一个Python的发行版本,包含了400多个Python最常用的库,其中就包括了数据分析中需要经常使用到的Numpy和Pandas等.更重要的是,不论在哪个平台上,都可以一键安装,自动配置好环境,不需要用户任何的额外操作,非常方便.因此,安装Python环境就只需要到ANACONDA网站上下载安装文件,双击安装即可. ANACONDA官方下载地址:https://www.continuum.io/downloads 安装完成之后,使用windows + r

随机推荐