本文节选自

《谁说菜鸟不会数据分析(Python篇)》

RFM分析,是根据客户活跃程度和交易金额贡献,进行客户价值细分的一种客户细分方法。RFM分析,主要由三个指标组成,分别为R(Recency)近度、F(Frequency)频度、M(Monetary)额度组成。

R表示近度(Recency):也就是客户最近一次交易时间到现在的间隔,注意,R是最近一次交易时间到现在的间隔,而不是最近一次的交易时间,R越大,表示客户越久未发生交易,R越小,表示客户越近有交易发生。

F表示频度(Frequency):也就是客户在最近一段时间内交易的次数,F越大,表示客户交易越频繁,F越小,表示客户不够活跃。

M表示额度(Monetary):也就是客户在最近一段时间内交易的金额,M越大,表示客户价值越高,M越小,表示客户价值越低。

下面是一张经典RFM客户细分模型图,如下图所示。

R分值、F分值和M分值三个指标构成了一个三维立方图,在各自维度上,根据得分值又可以分为高和低两个分类,最终三个指标,每个指标分为高低两类,两两组合,就细分为八大客户群体。

例如R分值高,F分值高,M分值高的客户为重要价值客户,R、F、M三个分值都低的客户为潜在客户,其他类型客户以此类推进行解读即可。

RFM分析步骤如下图所示。

STEP01 数据准备

下面通过一个案例学习RFM分析的使用,首先将数据导入到data变量,代码如下:

import pandas

data = pandas.read_csv(

'D:/RFM分析.csv',

engine='python')

-----------------

长按识别下方二维码,关注公众号

回复“RFM”获取案例数据

执行代码,即可得到data数据框,如下图所示。

可以看到,第一列为订单ID,第二列为客户ID,第三列为交易日期,第四列为交易金额。

这个数据格式,也是RFM分析要求的基本数据格式。

根据交易日期,计算出交易日期距离指定日期的间隔天数,代码如下:

# 将交易日期处理为日期数据类型

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

执行代码,即可得到交易日期距离指定日期的天数,如下图所示。

STEP02 计算R、F、M

数据准备好后,接下来就可以计算每个客户的最近消费距离R、消费频率F以及消费总额M,计算方法如下:

最近消费距离R:使用CustomerID作为分组列,距离指定日期间隔天数Days作为统计列,统计函数使用最小值函数min,即可得到每个客户的最近消费距离R。

消费频率F:使用CustomerID作为分组列,OrderID作为统计列,统计函数使用计数函数count。

消费总额M:使用CustomerID作为分组列,订单金额Sales作为统计列,统计函数使用求和函数sum。

代码如下:

# 统计每个客户距离指定日期有多久没有消费了,即找出最小的最近消费距离

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参数可以省略不写,代码如下:

# 将R、F、M三个数据框关联,merge默认内连接,可省略,两表on条件的关联列名均为CustomerID,同样可省略

RFMData = R.merge(F).merge(M)

# 修改列名

RFMData.columns = ['CustomerID', 'R', 'F', 'M']

执行代码,得到的结果如下图所示。

STEP03 将R、F、M分组打分赋值

各个客户的R、F、M数据计算好后,接下来就可以对R、F、M这三个列进行分组打分赋值得到对应的R分值、F分值、M分值。

分组标准可以按照平均值、业务经验等标准进行划分。如果没有特别的标准,通常采用平均值进行划分。

本例将R、F、M三列分别按照各自的平均值划分为2个组,并赋值1分、2分。

R分值(R_S):定义为距离指定日期越近,R_S越大,R>=平均值,R_S为1,R

F分值(F_S):定义为交易频率越高,F_S越大,F<=平均值,F_S为1,F>平均值,F_S为2。

M分值(M_S):定义为交易金额越高,M_S越大,M<=平均值,M_S为1,M>平均值,M_S为2。

在Python中,可以使用数据框的loc属性将符合条件的数据行进行打分赋值,代码如下:

# 判断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']

#同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的分组分值就计算出来了,如下图所示。

STEP04 计算RFM综合分值

得到R_S、F_S、M_S的分组分值后,接下来就可以计算RFM综合分值。RFM综合分值计算公式如下所示。

RFM = 100╳R_S + 10╳F_S + 1╳M_S

为什么设置R_S的权重为100,F_S的权重为10,M_S的权重为1呢?

这样设置相当分别为百位、十位、个位的组合,以确保RFM综合分值顺序与RFM客户细分模型的分类顺序一致。

RFM综合分值计算的代码如下:

# 计算RFM综合分值

RFMData['RFM'] = 100*RFMData.R_S+10*RFMData.F_S+1*RFMData.M_S

执行代码,得到的RFM综合分值如下图所示。

STEP05 客户分类

接下来根据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')

执行代码,就可以得到各个客户类型的客户数了。

后续就可以对不同的客户群体,有针对性地采取相应运营策略进行推广、管理,进而提升客户价值和营收水平。

-----------------

长按识别下方二维码,并关注公众号

长按识别下方二维码,关注公众号

回复“RFM”获取案例数据

如何用python计算营业额_如何用Python进行RFM分析相关推荐

  1. 如何用python计算营业额_如何用python计算上个月的最高总销售额

    首先创建DatetimeIndex:#if necessary #df = df.set_index('Date') #df['Date'] = pd.to_datetime(df['Date']) ...

  2. 如何用python计算圆周率_如何用python计算圆周率?

    如何用python计算圆周率? python计算圆周率的方法: 圆周率没有精确的计算公式,所以只能用近似的方式计算它的近似值. 我们运用蒙特卡罗方法,思路很简单,在下面图形中随机抛置大量的点, 计算落 ...

  3. python计算卡方分布_如何用Python计算上证指数的涨跌幅分布情况?

    话不多说先上代码,这个分布情况指的就是分析一下涨跌幅在每个百分比阶段各有多少天,例如0%-1%有多少天,1%-2%有多少天: import os#缓存数据class SecurityData: cou ...

  4. python计算均方根误差_如何在Python中创建线性回归机器学习模型?「入门篇」

    线性回归和逻辑回归是当今很受欢迎的两种机器学习模型. 本文将教你如何使用 scikit-learn 库在Python中创建.训练和测试你的第一个线性.逻辑回归机器学习模型,本文适合大部分的新人小白. ...

  5. 温度转换python代码解释_如何用python代码温度转换?

    如何用python代码温度转换? 用python代码温度转换的方法: 步骤一:分析问题的计算部分 步骤二:确定功能,使用IPO方法进一步分析 输入:华氏或者摄氏温度值.温度标识 处理:温度转化算法 输 ...

  6. python 图像格式转换_如何用六行Python构建图像类型转换器

    python 图像格式转换 by AMR 通过AMR 如何用六行Python构建图像类型转换器 (How to build an image type convertor in six lines o ...

  7. pycharm如何更改python项目环境_如何用Pycharm打开已有项目配置python环境

    如何用Pycharm打开已有项目配置python环境 发布时间:2020-07-06 11:06:30 来源:亿速云 阅读:175 作者:清晨 这篇文章将为大家详细讲解有关如何用Pycharm打开已有 ...

  8. python vlookup 模糊_如何用python写excel中的vlookup函数?

    1.背景 Vlookup 函数,可以算是一个数据专员必须要会使用的基本函数了,确实很好用.但是你可能会注意到,Excel 一旦数据量过大,打开都费劲了,何况打开后,你还要输入公式计算,就更费劲了,此时 ...

  9. python编写函数_如何用Python编写自己喜欢的R函数

    python编写函数 数据科学和机器学习的伟大现代斗争之一是" Python vs. R". 毫无疑问,近年来两者都已经取得了巨大的发展,成为数据科学,预测分析和机器学习的顶级编程 ...

最新文章

  1. iOS开发学无止境 - UICollectionView自定义布局之风火轮[译]
  2. DGA短域名(360样本) mark下 下次分析可以参考
  3. 应用下载店用户喜好分析
  4. Linux之磁盘概述
  5. 浪潮服务器建立虚拟驱动器,像《十二时辰》一样去建立标准! 浪潮这款服务器做到了...
  6. 深入理解 AMQP 协议
  7. 5g上行速率怎么提升_揭秘联发科5G独家技术,攻克上行覆盖和终端功耗两大技术难题...
  8. 登陆注册重连 之 老掉牙的故事 新说法
  9. 寒假打工去,不能继续写博客,表示好心痛啊。。。
  10. 在C#中IEnumerable与IEnumerator
  11. delete trancate drop三者之间的区别
  12. python 帮助 help
  13. 加多宝首度披露"换头手术"的详细内幕
  14. html学习——按钮与多选框
  15. 什么是视频分配器 编码器
  16. 百度分词ai php,百度分词技术
  17. 有时间的时候没钱,有钱的时候没时间_天使Emily_一起游博客_一起游_17u.com
  18. android 软电话 开发包-JNI 封装 SIP 协议,可进行二次开发应用于VOIP
  19. JAVA 文件上传格式限制_关于servlet文件上传限制文件大小的问题,求高手帮忙
  20. kafka 0.10.0 producer java代码实现

热门文章

  1. 基于matlab 系统仿真学报,基于MATLAB/Simulink的混合动力汽车正向仿真软件的开发...
  2. 计算机参观企业心得,走进联想 感悟联想——北航MBA参观联想集团总部
  3. mysql longtext db2_从 MySQL 或 PostgreSQL 迁移到 DB2 Express-C
  4. mysql 重复了更新_MYSql id相同就更新
  5. java将一个整数反转输出,输入一个整数,实现反转输出,如输入123,输出321。...
  6. swag您的装置不支持_209P型铁路客车转向架之轮对轴箱弹簧定位装置简介
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的医院就诊系统
  8. 我不是bug神(JVM问题排查)
  9. Nginx之进程间的通信机制(信号、信号量、文件锁)
  10. 第一次冲刺团队绩效评估