基于五等均分法和Bob Stone法衡量RFM顾客价值

news2025/7/18 8:17:43

最近学习了衡量RFM模型的两种顾客价值的方法,即五等均分法和Bob Stone法。仅以此博客记录我的学习过程,后序学习到了其他方法再来补充。关于RFM实战案例可参考我的其他文章大数据分析案例-基于RFM模型对电商客户价值分析

大数据分析案例-用RFM模型对客户价值分析(聚类)

目录

数据集介绍

 五等均分法

1.给分机制的设计

2.Python代码实现

 Bob Stone法

1.给分机制的设计

 2.Python代码实现

两种方法的比较


数据集介绍

本次实验用的数据的主要是2011-2012年100位客户的信用卡消费记录,数据共有三个字段,顾客ID、消费日期、消费金额,其中的一位客户数据如下: 

 五等均分法

如何综合使用R、F、M三项指标来衡量顾客价值?业界常见的做法是根据客户在三个指标上的排序,转化RFM原始数据成为可合并的分数。首先,将客户的最近购买期间(R)由小到大排序;排序愈靠前的客户代表不久之前才购买,与企业的交易关系仍很密切,因此有较高的顾客价值,得到较高的R分数(R-score)。其次,再按照客户的购买频率(F)由大到小排序,排序在前的客户获得较高的F分数(F-score)。最后,再按照客户的平均购买金额(M)由高到低排序,排序在前的客户获得较高的M分数(M-score)。

1.给分机制的设计

 五等均分法的给分机制是令排序在前20%的客户获得5分,下一个20%的客户获得4分,其余以此类推。图4-2显示客户按照最近购买期间(R)由小到大的排序结果,以及对于的给分结果。例如,编号1277、3209.....等客户的R值最小,因此R分数获得5分。然后,重新按照客户的购买次数(F)由大到小排序,再以20%的人数比例切割成五群,依序给予5、4、3、2、1分。最后,再重新按照客户的平均购买金额(M)由大到小排序,依序给予各群客户适当的M分数。

2.Python代码实现

首先还是导入数据

import pandas as pd
import numpy as np

data = pd.read_excel('data.xlsx')
data.tail() # 查看数据最后五行

接下来就是要构造我们的rfm模型,因为我们这里使用的是国内数据,而这些方法的金额给分机制都是基于美元来设计,所有需要转换一下。 

# 已知美元汇率为7.05
data['amount'] = data['amount'].apply(lambda x:x/7.05)  # 将RMB转换为美元
# 这里类似于Excel中的数据透视表,以客户ID为索引获取最后一次的消费日期,消费次数、平均购买金额
rfm = data.pivot_table(index='customer ID',aggfunc={'Date':'max','customer ID':'count','amount':'mean'})
rfm.head()

然后对上一步进行优化 

rfm.columns = ['R','M','F']
max_dt = pd.to_datetime('2012-12-1')  # 窗口期,即最后的统计日期
rfm['R'] = (max_dt-rfm['R']).values/np.timedelta64(1,'D')
rfm.head()

 

 接下来就需要实现我们的五等均分法了,这里使用pandas中的qcut实现,关于pandas基础知识可参考一文让你快速上手Pandas

# 利用pandas中的qcut来实现五等均分法
rfm['R-score'] = pd.qcut(rfm['R'],q=5,labels=[5,4,3,2,1])
rfm['M-score'] = pd.qcut(rfm['M'],q=5,labels=[1,2,3,4,5])
rfm['F-score'] = pd.qcut(rfm['F'],q=5,labels=[1,2,3,4,5])
rfm['R-score'] = rfm['R-score'].astype(int)
rfm['M-score'] = rfm['M-score'].astype(int)
rfm['F-score'] = rfm['F-score'].astype(int)
rfm['Sum-Score'] = rfm['R-score'] + rfm['M-score'] + rfm['F-score']
rfm.head()

最后我们可以根据总分进行排序,这一步我是为了不打乱原始客户ID的排序方便后面和Bob Stone法进行对比,所以这里可能稍微多几部操作。

rfm.reset_index(inplace=True)
df1 = rfm[['customer ID','Sum-Score']]
rfm2 = df1.sort_values(by='Sum-Score',ascending=False)
rfm2['Rank'] = [i for i in range(1,len(df1)+1)]
rfm2.drop('Sum-Score',axis=1,inplace=True)
result = pd.merge(rfm,rfm2,on='customer ID')
result.head()

 最后你可以将上面结果保存为Excel文件

result.to_excel('五等均分法.xlsx',index=False)

 Bob Stone法

1.给分机制的设计

根据五等均分法所产生的RFM分数,实质上属于顺序尺度,不适合进行量化分析。因此,Bob Stone(1995)提出另外一种给分机制,将R、F、M等衡量单位不同且数值范围大小有异的三个变量,按照比例尺的概念,转换成简洁的整数,如表4-6所示。例如,最近一次购买期间(R)等比例地切割成最近三个月之内、3~6个月、6~9个月、9~12个月及超过12个月等五个区间,对应的R分数分别是24分、12分、6分、3分、及0分等。代表购买频率高低的F分数,设定为实际购买次数的4倍。代表购买金额多寡的M分数,设定为平均购买金额(以美元计)的10%,再无条件计入为整数,超过9分者以9分计。

 2.Python代码实现

前面准备RFM模型数据的代码跟上面的五等均分法几乎一样

import pandas as pd
import numpy as np
data = pd.read_excel('data.xlsx')
# 已知美元汇率为7.05
data['amount'] = data['amount'].apply(lambda x:x/7.05)
rfm = data.pivot_table(index='customer ID',aggfunc={'Date':'max','customer ID':'count','amount':'mean'})
rfm.columns = ['R','M','F']
max_dt = pd.to_datetime('2012-12-1')
rfm['R'] = (max_dt-rfm['R']).values/np.timedelta64(1,'D')
rfm.head()

接着开始根据给分机制实现Bob Stone法 

def r_score(x):
    if x<=30*3:
        return 24
    elif 30*3<x<=30*6:
        return 12
    elif 30*6<x<=30*9:
        return 6
    elif 30*9<x<30*12:
        return 3
    else:
        return 0

rfm['R-score'] = rfm['R'].apply(r_score)
rfm['F-score'] = rfm['F'].apply(lambda x:x*4)
rfm['M-score'] = rfm['M'].apply(lambda x:int(x*0.1) if x*0.1<=9 else 9)
rfm['Sum-Score'] = rfm['R-score'] + rfm['F-score'] + rfm['M-score']
rfm.head()

接着还是根据总分进行排序

rfm.reset_index(inplace=True)  # 还原rfm的索引列customer ID
df1 = rfm[['customer ID','Sum-Score']]
rfm2 = df1.sort_values(by='Sum-Score',ascending=False)
rfm2['Rank'] = [i for i in range(1,len(df1)+1)]  # 根据总分进行排名
rfm2.drop('Sum-Score',axis=1,inplace=True)
result = pd.merge(rfm,rfm2,on='customer ID') 
result.head()

 最后可以将上面结果保存为Excel文件

result.to_excel('Bob Stone法.xlsx',index=False)

两种方法的比较

前面我们已经实现了两种方法,接着我们可以手动进行整理如下所示:

 由表可知,两种给分法的计算结果差异颇大。例如,ID为605的客户的顾客价值在Bob Stone法下是第1名,但是在五等均分法下却是第32名。那么,对于这家银行企业而言,给分机制究竟要如何设定,RFM分数才能有效地反映顾客价值的高低呢?以RFM给分机制为例,企业可以通过样本的切割与对比,去评估何种参数设定具有最高信度,以此计算顾客价值。

所以,针对上述问题,这里我们将原始两年数据进行切半,令前一年数据为建模样本,后一年数据为验证样本,如图4-7所示,获得客户分别在建模样本与验证样本下的顾客价值顺序。然后计算两者的顺序相关系数,系数愈靠近1则代表Bob Stone法的信誉度愈高,愈适合以过去的RFM分数去预测未来的顾客价值,也代表愈合作为顾客价值的给分机制。

我们先使用五等均分法,并计算其顺序相关系数。

关于划分数据,只需要在前面代码读取完数据后添加一下年份筛选即可,代码如下:

data = data[data['Date'].dt.year==2011]
# data = data[data['Date'].dt.year==2012]

可视化并计算相关系数代码如下: 

import pandas as pd
import matplotlib.pylab as plt
plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示
plt.rcParams['axes.unicode_minus'] = False   #解决符号无法显示
def main():
    rank_list = []
    for year in [2011,2012]:
        data1 = pd.read_excel(f'五等均分法-{year}.xlsx',usecols=['客户ID','Sum-Score'])
        df1 = data1.copy()
        df2 = df1.sort_values(by='Sum-Score',ascending=False)
        df2['Rank'] = [i for i in range(1,len(df1)+1)]  # 根据总分进行排名
        df2.drop('Sum-Score',axis=1,inplace=True)
        result = pd.merge(data1,df2,on='客户ID') 
        rank = result['Rank'].values.tolist()
        rank_list.append(rank)
        result.to_excel(f'五等均分法-{year}.xlsx')

    plt.scatter(rank_list[0],rank_list[1])  # 可视化
    plt.show()
    res = pd.DataFrame()
    res['rank1'] = rank_list[0]
    res['rank2'] = rank_list[1]
    print(res.corr())  # 打印相关系数

main()

 

从结果看出,五等均分法的顺序相关系数为0.6287。

接着我们算Bob Stone法的相关系数,跟上面代码一样,只不过把数据换下。最后结果如下:

 

从结果我们看出Bob Stone法的顺序相关系数为0.7656明显高于五等均分法,所有愈适合以过去的RFM分数去预测未来的顾客价值,也愈合适合作为顾客价值的给分机制。 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/8375.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

p53 与铁死亡有关?Nature 解锁新机制

众所周知&#xff0c;p53 是一种肿瘤抑制基因&#xff0c;被广泛称为“基因组的守护者”。自 1979 年被发现至今&#xff0c;p53 基因一直是分子生物学和肿瘤学的研究热门。据 Elie Dolgin 在 Nature 上发表的 “The most popular genes in the human genome” 统计&#xff0c…

wpf Viewport3D 学习

呈现 Viewport3D 元素的 2-D 布局范围内包含的 3-D 内容。就是3D画布&#xff0c; 继承 Object DispatcherObject DependencyObject Visual UIElement FrameworkElement Viewport3D 从FrameworkElement继承&#xff0c;FrameworkElement继承自UIElement&#xff1b; 该 V…

(五)Spring之Bean的作用域

文章目录环境单例的&#xff08;singleton&#xff09;多例的&#xff08;prototype&#xff09;其它scope自定义scope上一篇&#xff1a;&#xff08;四&#xff09;Spring对IoC的实现 环境 spring6里程碑版本的仓库 依赖&#xff1a;spring context依赖、junit依赖、log4j2…

【单片机基础】单片机中断和定时

中断什么是中断&#xff1f;中断IE寄存器中断查询次序例程定时器/计数器实现定时的方法&#xff1f;定时计数的概念什么是单片机定时器/计数器&#xff1f;定时器/计数器内部结构定时器的相关寄存器51单片机定时器初值计算方法详解例程中断 什么是中断&#xff1f; 中断是为使…

VINS学习(二)IMU预积分原理与实现

VINS学习&#xff08;二&#xff09;IMU预积分原理与实现一、连续时间下的IMU积分二、连续时间下的IMU预积分三、离散时间下的IMU预积分1. 欧拉法2. 中值法四、连续时间下的IMU状态误差传递五、离散时间下的IMU状态误差传递六、预积分量关于零偏的雅克比七、VINS代码实践1.预积…

【文末福利】半导体封装率先国产化,400+封装厂商最新名单汇总

根据我国国民经济“九五”计划至“十四五”规划&#xff0c;可窥见多方政策都在积极支持我国集成电路的发展&#xff0c;近几年更是强调突破集成电路关键技术&#xff0c;集中力量发展集成电路。其中封测技术作为集成电路制造的后道工艺&#xff0c;在整个集成电路产业链中扮演…

熬夜整理的vue面试题

Vue-router 路由模式有几种 vue-router 有 3 种路由模式&#xff1a;hash、history、abstract&#xff0c;对应的源码如下所示 switch (mode) {case history:this.history new HTML5History(this, options.base)breakcase hash:this.history new HashHistory(this, options…

网络安全设备之防火墙技术详解

一、防火墙概述 1、网络防火墙简介 无论是大中型企业网络,还是小型家庭办公网络,对网络安全方面的要求一直保持上升趋势。微软公司的官方网站尚且难逃黑客的魔爪,普通的中小网络更是难以抵抗了。解决网络安全问题最常用的防护手段就是安装网络防火墙,对于大中型规模的企业…

css实现流星划过动画

背景 &#x1f44f;渐变伪元素实现流星&#xff0c;translateY实现划过动画&#xff0c;速速来Get吧~ &#x1f947;文末分享源代码。记得点赞关注收藏&#xff01; 1.实现效果 2.实现原理 translateY()&#xff1a; translateY() 在页面垂直移动元素。 translateY(ty) 对应 …

上海亚商投顾:沪指重返3100点

上海亚商投顾前言&#xff1a;无惧大盘大跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪三大指数今日低开高走&#xff0c;沪指重返3100点上方&#xff0c;深成指、创业板指午后均涨超2%。半导体板块掀涨停…

Java并发编程学习13-任务取消(下)

任务取消&#xff08;下&#xff09; 《任务取消》由于篇幅较多&#xff0c;拆分了两篇来介绍各种实现取消和中断的机制&#xff0c;以及如何编写任务和服务&#xff0c;使它们能对取消请求做出响应。 1. 任务限时运行 我们知道许多任务可能永远也无法处理完成&#xff08;…

[go学习笔记.第十四章.协程和管道] 3.协程配合管道案例以及管道的注意事项和使用细节

案例一 请完成goroutine和channel协同工作的案例&#xff0c;具体要求&#xff1a; (1).开启一个writeData协程&#xff0c;向管道intChan中写入50个整数. (2).开启一个readData协程&#xff0c;从管道intChan中读取writeData写入的数据 (3).注意&#xff1a; writeData和readD…

阿里内部目前最完整“Spring全线笔记”,不止是全家桶,太完整了

前言 对于每一位Java开发人员来说&#xff0c;提起Spring定是不陌生的&#xff0c;实际上自Spring框架诞生以来&#xff0c;就备受开发者的青睐&#xff0c;基本上现在的互联网公司都要使用到Spring框架。Spring框架中又包含了SpringMVC、SpringBoot、SpringCloud等&#xff0…

【前端】Vue+Element UI案例:通用后台管理系统-项目总结

文章目录相关链接前言效果登录页首页管理员的首页xiaoxiao的首页用户管理总结项目搭建左侧&#xff1a;CommonAside上侧&#xff1a;CommonHeader和CommonTag首页&#xff1a;Home.vue用户管理&#xff1a;User.vue登录页&#xff1a;Login.vue总代码相关链接 参考视频&#x…

Spark 3.0 - 1.Spark 新特性简介与 WordCount Demo 实践

目录 一.引言 二.Spark 3.0 特性 1.Improving the Spark SQL engine [改进的SQL引擎] 1.1 Dynamic Partition Pruning [动态分区修剪] 1.2 ANSI SQL compliant [兼容 ANSI SQL] 1.3 Join hints [连接提示] 2.Enhancing the Python APIs: PySpark and Koalas [增强Python…

推荐国产神器Eolink!API优先,Eolink领先!

前言&#xff1a; 在我们后端开发者做项目的时候&#xff0c;避免不了与前端界面的交互&#xff0c;对于我来讲&#xff0c;在做项目的时候用到过postman&#xff0c;swagger做接口测试工作&#xff0c;在公司的时候公司主要用YApi可视化接口平台&#xff0c;最近使用了一个爆款…

Express

目录 Express介绍 测试最基本的服务器 Express基本使用 托管静态资源 2. 挂载路径前缀 nodemon 路由 模块化路由 2.注册使用路由模块 中间件的概念 ​编辑1.next函数的作用 2.app.use(全局中间件) 4.连续多个中间件 5.局部生效中间件 中间件的分类 1.应用级别…

自动驾驶入门:感知

目录 概念 感知方法 CNN 检测与分类 跟踪 分割 Apollo感知 感知设备分类 概念 我们人类天生就配备多种传感器&#xff0c;眼睛可以看到周围的环境&#xff0c;耳朵可以用来听&#xff0c;鼻子可以用来嗅&#xff0c;也有触觉传感器&#xff0c;甚至还有内部传感器&…

Android 性能优化

你会学到什么&#xff1f; 深入底层&#xff0c;全面建立性能优化知识体系&#xff1b; 高手思路&#xff0c;掌握大厂性能调优方法论&#xff1b; 三大模块&#xff0c;实战内存速度包体积优化&#xff1b; 玩转“黑科技”&#xff0c;轻松实现性能优化进阶。 作者介绍 赵…

现货黄金基本知识:黄金策略五大心法

我们经常看电视剧或小说&#xff0c;都会看到一些老套的情景&#xff0c;例如当某个人物死的时候&#xff0c;会讲毕生所学&#xff0c;或者是功夫、或者是知识&#xff0c;传到某一个人的手中。在现货黄金市场&#xff0c;也有累积了历代交易高手的“武功心法”&#xff0c;虽…