RFM分析,是根据客户活跃程度和交易金额贡献,进行客户价值细分的一种客户细分方法。RFM分析,主要由三个指标组成,分别为R(Recency)近度、F(Frequency)频度、M(Monetary)额度组成。python
下面是一张经典RFM客户细分模型图,以下图所示。
R分值、F分值和M分值三个指标构成了一个三维立方图,在各自维度上,根据得分值又能够分为高和低两个分类,最终三个指标,每一个指标分为高低两类,两两组合,就细分为八大客户群体。
例如R分值高,F分值高,M分值高的客户为重要价值客户,R、F、M三个分值都低的客户为潜在客户,其余类型客户以此类推动行解读便可。ide
RFM分析步骤以下图所示。函数
下面经过一个案例学习RFM分析的使用,首先将数据导入到data变量,代码以下:学习
import pandas data = pandas.read_csv( 'D:/RFM分析.csv', engine='python')
长按识别下方二维码,关注公众号
回复“RFM”获取案例数据
执行代码,便可获得data数据框,以下图所示。
能够看到,第一列为订单ID,第二列为客户ID,第三列为交易日期,第四列为交易金额。这个数据格式,也是RFM分析要求的基本数据格式。
根据交易日期,计算出交易日期距离指定日期的间隔天数,代码以下:3d
# 将交易日期处理为日期数据类型 data['DealDateTime'] = pandas.to_datetime( data.DealDateTime, format='%Y/%m/%d' ) # 假设2015-10-1是计算当天,求交易日期至计算当天的距离天数 data['Days'] = pandas.to_datetime('2015-10-1') - data['DealDateTime'] # 从时间距离中获取天数 data['Days'] = data['Days'].dt.days
执行代码,便可获得交易日期距离指定日期的天数,以下图所示。code
数据准备好后,接下来就能够计算每一个客户的最近消费距离R、消费频率F以及消费总额M,计算方法以下:orm
# 统计每一个客户距离指定日期有多久没有消费了,即找出最小的最近消费距离 R = data.groupby( by=['CustomerID'], as_index=False )['Days'].agg('min') # 统计每一个客户交易的总次数,即对订单ID计数 F = data.groupby( by=['CustomerID'], as_index=False )['OrderID'].agg('count') # 统计每一个客户交易的总额,即对每次的交易金额求和 M = data.groupby( by=['CustomerID'], as_index=False )['Sales'].agg('sum')
执行代码,获得的结果以下图所示。
接下来使用merge方法,将R、F、M三个数据框关联起来,由于它们拥有共同的列名CustomerID,而且CustomerID就是链接条件,在这种状况下,on参数能够省略不写,代码以下:blog
# 将R、F、M三个数据框关联,merge默认内链接,可省略,两表on条件的关联列名均为CustomerID,一样可省略 RFMData = R.merge(F).merge(M) # 修改列名 RFMData.columns = ['CustomerID', 'R', 'F', 'M']
执行代码,获得的结果以下图所示。pandas
各个客户的R、F、M数据计算好后,接下来就能够对R、F、M这三个列进行分组打分赋值获得对应的R分值、F分值、M分值。
分组标准能够按照平均值、业务经验等标准进行划分。若是没有特别的标准,一般采用平均值进行划分。
本例将R、F、M三列分别按照各自的平均值划分为2个组,并赋值1分、2分。it
# 判断R列是否大于等于R列的平均值,使用loc将符合条件R_S列的值赋值为1 RFMData.loc[RFMData['R'] >= RFMData.R.mean(), 'R_S'] = 1 # 判断R列是否小于R列的平均值,使用loc将符合条件R_S列的值赋值为2 RFMData.loc[RFMData['R'] < RFMData.R.mean(), 'R_S'] = 2 #同R_S赋值方法,对F_S、M_S进行赋值,但与R相反,F、M均为越大越好 RFMData.loc[RFMData['F'] <= RFMData.F.mean(), 'F_S'] = 1 RFMData.loc[RFMData['F'] > RFMData.F.mean(), 'F_S'] = 2 RFMData.loc[RFMData['M'] <= RFMData.M.mean(), 'M_S'] = 1 RFMData.loc[RFMData['M'] > RFMData.M.mean(), 'M_S'] = 2
执行代码,R_S、F_S、M_S的分组分值就计算出来了,以下图所示。
获得R_S、F_S、M_S的分组分值后,接下来就能够计算RFM综合分值。RFM综合分值计算公式以下所示。
为何设置R_S的权重为100,F_S的权重为10,M_S的权重为1呢?
这样设置至关分别为百位、十位、个位的组合,以确保RFM综合分值顺序与RFM客户细分模型的分类顺序一致。
RFM综合分值计算的代码以下:
RFMData['RFM'] = 100*RFMData.R_S+10*RFMData.F_S+1*RFMData.M_S
执行代码,获得的RFM综合分值以下图所示。
接下来根据RFM客户细分模型,将客户细分为八种不一样的类型。本例采用与RFM综合分值客户类型的对应关系表匹配合并的方式实现客户分类。
首先将各个RFM综合分值与客户类型的对应关系定义为一个数据框。
而后再使用merge中的内链接inner方法,将RFMData数据框与刚定义的RFM综合分值客户类型的对应关系表,根据关联列名RFM匹配合并为一个数据框,这样就完成了客户分类的操做,代码以下:
# 定义RFM综合分值与客户类型的对应关系表 CustomerType = pandas.DataFrame( data={ 'RFM': [111,112,121,122,211,212,221,222] 'Type': ['潜在客户','重点挽留客户','通常保持客户','重点保持客户', '通常发展客户','重点发展客户','通常价值客户','高价值客户'] } ) # 将RFMData与RFM综合分值客户类型的对应关系表合并为一个数据框 # merge默认内链接,可省略,两表on条件的关联列名均为RFM,一样可省略 RFMData = RFMData.merge(CustomerType)
执行代码,获得的数据以下图所示。
能够看到,最后一列数据,就是对每一个客户细分的客户类型。
最后,咱们来看看,每一个类别的客户数是多少,代码以下:
# 按RFM、Type进行分组统计客户数 RFMData.groupby( by=['RFM','Type'] )['CustomerID'].agg('count')
长按识别下方二维码,并关注公众号