RFM模型是衡量客户价值和客户创造利益能力的重要工具和手段。在众多的客户关系管理(CRM)的分析模式中,RFM模型是被广泛提到的。该机械模型通过一个客户的近期购买行为、购买的总体频率以及花了多少钱3项指标来描述该客户的价值状况。RFM是一种综合评分的分类模型,由于其计算简单方便,在众多的客户细分模型中,RFM模型是被广泛提到和使用的。

一、RFM模型

RFM分析主要由3个指标组成,分别为R(Recency,近度)F(Frequency频度)M(Monetary,额度)组成。RFM是三个指标的缩写:Recency:最近一次消费距离现在的时间,该值越小越好;Frequency:某段时间内的消费次数,这个值越大越好;Monetary:某段时间内的消费金额,对于企业来说,消费自然越多越好。这三个维度需要根据实际业务确定,比如针对游戏行业,R可以定义为最近一次充值距离现在的时间,F可以定义为某段时间的充值次数,M为某段时间的充值金额。

.center { width: auto; display: table; margin-left: auto; margin-right: auto }

指标 解释 意义
R(Recency,近度) 客户最近一次交易时间到当前时间的间隔 R越大,表示客户越久为发生交易;R越小,表示客户越近有交易发生
F(Frequency,频度) 客户在最近一段时间内交易的次数 F越大,表示客户交易越频繁; F越小,表示客户交易越少
M(Monetary,额度) 客户在最近一段时间内交易的金额 M越大,表示客户价值越高;M越小,表示客户价值越低

依据如上三项指标,划分为6,8,11等几种模型。最常见的为8种:

二、RFM的评分

RFM模型基于下面的理解:假设最近有过交易行为的客户比最近没有交易行为的客户,更有可能再次发生交易行为;假设交易频率较高的客户比交易频率较低的客户,更有可能中再次发生交易行为;假设过去所有交易总金额更多的客户比交易总金额较少的客户,更有消费积极性。如果没有特别的分组标准,通常按照平均值划分为两个组,并分别赋值1,2。

定义

说明

取值

说明

R_score

近度得分,最近一次交易日期距离指定日期越近,R_score越大

2

R<=平均值

1

R>=平均值

F_score

频度得分,交易频率越高,F_score越大

2

F>=平均值

1

F<=平均值

M_score

额度得分,交易金额越高,M_score越大

2

M>=平均值

1

M<=平均值

2.1 R值分:最近一次消费(Recency)

消费指的是客户在店铺消费最近一次和当前的时间间隔,理论上R值越小的客户是价值越高的客户,即对店铺的回购几次最有可能产生回应。目前网购便利,顾客已经有了更多的购买选择和更低的购买成本,去除地域的限制因素,客户非常容易流失,因此CRM操盘手想要提高回购率和留存率,需要时刻警惕R值。如下图,某零食网店用户最近一次消费R值分布图(时间截至2016年12月31日):

从图中可以看出,客户R值呈规律性的“波浪形”分布,时间越长,波浪越小;最近一年内用户占比50%。这个数据说明每引入2个客户,就有一位用户在持续购买。说明店铺复购做的比较好,R值在不断的变为0。

2.2 F值分:消费频率(Frequency)

消费频率是客户在固定时间内的购买次数(一般是1年)。但是如果实操中实际店铺由于受品类宽度的原因,比如卖3C产品,耐用品等即使是忠实粉丝用户也很难在1年内购买多次。所以,一般店铺在运营RFM模型时,会把F值的时间范围去掉,替换成累计购买次数。如下图,某零食网店用户购买频次图(如1个客户在1天内购买多笔订单,则自动合并为1笔订单):

从图中可以看出,购买1次(新客户)占比为65.5%,产生重复购买(老客户)的占比为34.4%;购买3次及以上(成熟客户)的占比为17%,购买5次及以上(忠实客户)的占比为6%。

2.3 M值分:消费金额(Monetary)

M值是RFM模型中相对于R值和F值最难使用,但最具有价值的指标。大家熟知的“二八定律”(又名“帕雷托法则”)曾作出过这样的解释:公司80%的收入来自于20%的用户。

可能有些店铺不会那么精确,一般也会控制在30%客户贡献70%收入,或者40%贡献60%收入。理论上M值和F值是一样的,都带有时间范围,指的是一段时间(通常是1年)内的消费金额,M值对客户细分的作用相对较弱。

2.4 RFM综合加权得分

在得到R值、F值、M值的分组分值后,就可以计算RFM综合分值了,常用的RFM综合分值计算公式为

RFM = 100×R值 + 10×值 + 1×M值

这样设置的原因是用百十个位的组合,构造一个RFM分值,三个分数的加权平均数。

三、RFM模型的数据准备

3.1 数据源

Online Retail.xlsx百度网盘数据文件

数据来源于英国在线零售数据。数据里涵盖了从2010年12月1号到2011年12月9号期间在英国注册的在线零售店发生的所有交易。该公司主要销售一些通用的节日礼品,其客户许多都是批发商。

主要字段信息:
InvoiceNo StockCode Description Quantity InvoiceDate UnitPrice CustomerID Country
发票编号。
标称值,6位整数。如果代码以字母“c”开头,则表示取消 产品代码。标称值,为每个不同的产品唯一分配的5位整数 产品名 产品数量 发票日期 单价,英镑单位的产品价格 客户编码 每个客户所在的国家

3.2 数据结构展示

  1. InvoiceNo StockCode Description Quantity InvoiceDate UnitPrice CustomerID Country
  2. 1 536365 85123A WHITE HANGING HEART T-LIGHT HOLDER 6 2010-12-01 2.55 17850 United Kingdom
  3. 2 536365 71053 WHITE METAL LANTERN 6 2010-12-01 3.39 17850 United Kingdom
  4. 3 536365 84406B CREAM CUPID HEARTS COAT HANGER 8 2010-12-01 2.75 17850 United Kingdom
  5. 4 536365 84029G KNITTED UNION FLAG HOT WATER BOTTLE 6 2010-12-01 3.39 17850 United Kingdom
  6. 5 536365 84029E RED WOOLLY HOTTIE WHITE HEART. 6 2010-12-01 3.39 17850 United Kingdom
  7. 6 536365 22752 SET 7 BABUSHKA NESTING BOXES 2 2010-12-01 7.65 17850 United Kingdom
  8. 7 536365 21730 GLASS STAR FROSTED T-LIGHT HOLDER 6 2010-12-01 4.25 17850 United Kingdom
  9. 8 536366 22633 HAND WARMER UNION JACK 6 2010-12-01 1.85 17850 United Kingdom
  10. 9 536366 22632 HAND WARMER RED POLKA DOT 6 2010-12-01 1.85 17850 United Kingdom
  11. 10 536367 84879 ASSORTED COLOUR BIRD ORNAMENT 32 2010-12-01 1.69 13047 United Kingdom

3.3 数据清洗

原始数据维度(541909,8)。利用summary统计各字段的总计、缺失值、唯一值、偏度、峰度等信息发现CustemerID、Description存在缺失值,CustomerID的缺失率达到24.9%;还能看到产品单价和数量的描述性统计信息,发现部分购买量和单价为负数,将这些数据行去掉整理。

数据清洗:缺失值,异常值
  1. library(ggplot2)
  2. library(rfm)
  3. library(dplyr)
  4. library(tidyverse)
  5. library(lubridate)
  6. data=dd1=read.csv("Retail.csv",header = T) #将原始数据格式*.xlsx转存为*.csv,导入R中(特别要注意日期数据!!!)
  7. summary(data) #数据整体描述一览
  8. data <- data %>%
  9. mutate(Quantity = replace(Quantity, Quantity<=0, NA),
  10. UnitPrice = replace(UnitPrice, UnitPrice<=0, NA))
  11. data <- data %>%
  12. drop_na()
属性规约、标准化处理
  1. data <- data %>%
  2. mutate(InvoiceNo=as.factor(InvoiceNo), StockCode=as.factor(StockCode),
  3. InvoiceDate=as.Date(InvoiceDate, '%m/%d/%Y %H:%M'), CustomerID=as.factor(CustomerID),
  4. Country=as.factor(Country))
  5. data <- data %>%
  6. mutate(total_dolar = Quantity*UnitPrice)
  7. colnames(data)[1] <- 'InnvoiceNo'

放弃没有用户ID的,以及单价或数量为负的,用剩余数据作为模型分析的基础,清洗后的数据为397884行。

3.4 数据合并

上面处理后的数据中还需要整合,每一个顾客在某一天中买了好多种商品,见具体支票号InnvoiceNo里面的明细。

  1. attach(data)
  2. T<- aggregate(total_dolar~InnvoiceNo+CustomerID+InvoiceDate, FUN=sum) #数据预处理-累计某一张发票某个顾客的消费总额
  3. #length(unique(data$InnvoiceNo))
  4. detach(data)

这样处理后的数据T才是后面计算RFM值的基准数据。

四、RFM模型的数据处理

4.1 中间数据计算

  1. #将时间处理为时间型
  2. T$InvoiceDate = strptime(T$InvoiceDate, format ='%Y-%m-%d')
  3. #求交易日期至当前日期的时间差
  4. T$DateDiff = Sys.time() - T$InvoiceDate
  5. #根据时间差获取天数
  6. T$DateDiff = floor(as.numeric(T$DateDiff, units = "days"))

4.2 计算R/F/M

R:使用CustomerID作为分组列,最近一次交易日期距离当前日期的间隔天数data$DateDiff作为统计列,统计函数使用最小值函数min

F:使用CustomerID作为分组列,InnvoiceNo作为统计列,统计函数使用计数函数length

M:使用CustomerID作为分组列,total_dolar作为统计列,统计函数使用求和函数sum

  1. #统计每个客户的最近一次交易日期距离当前日期的间隔天数,即找出最近消费距离
  2. R = tapply(T$DateDiff, T$CustomerID, min)
  3. #统计每个客户交易的总次数,即对订单计数
  4. F = tapply(T$InnvoiceNo, T$CustomerID, length)
  5. #统计每个客户交易的总额,即对每次的交易金额求和
  6. M = tapply(T$total_dolar, T$CustomerID, sum)
  7. #将R、F、M合并成一个数据框
  8. #使用row.names函数获取R向量的索引以生成CustomerID列
  9. RFMData = data.frame('CustomerID' = row.names(R), 'R' = R, 'F' = F, 'M' = M)
  1. #判断R列是否大于或等于自身的平均值,将符合条件的位置赋值为1,否则赋值为2
  2. RFMData$R_score = ifelse(RFMData$R >= mean(RFMData$R), 1, 2)
  3. #赋值方法同上,对F_score,M_score进行赋值,但与R相反
  4. RFMData$F_score = ifelse(RFMData$F >= mean(RFMData$F), 2, 1)
  5. RFMData$M_score = ifelse(RFMData$M >= mean(RFMData$M), 2, 1)
  6. 计算RFM综合分值
  7. RFMData$RFM = 100*RFMData$R_score + 10*RFMData$F_score + 1*RFMData$M_score

4.3 客户分类

本例采用与RFM综合分值和客户类型的对应关系表进行匹配合并的方式实现客户分类。

首先将各个RFM综合分值和客户类型的对应关系定义为一个数据框。然后使用merge函数的内连接方法,将RFMData数据框与港定义的RFM综合分值和客户类型的对应关系表,根据管理案例额名RFM匹配合并为一个数据框,这样就完成了客户分类的操作。

  1. #定义RFM综合分值和客户类型的对应关系表
  2. CustomerType = data.frame(
  3. 'RFM' = c(111, 112, 121, 122, 211, 212, 221, 222),
  4. 'Type' = c('潜在客户', '重点挽留客户', '一般保持客户','重点保持客户', '一般发展客户', '重点发展客户', '一般价值客户', '高价值客户')
  5. )
  6. #将RFMData与RFM综合分值和客户类型的对应关系表合并为一个数据框
  7. RFMData = merge(RFMData, CustomerType)
  8. #按Type进行分组,统计各个类型的客户数量
  9. count = tapply(RFMData$CustomerID, RFMData$Type, length)
  10. View(count)
  11. CustomerTypeSum = data.frame('数量' = count)
  12. View(CustomerTypeSum)

最后统计各个类型的客户数量

  1. #按Type进行分组,统计各个类型的客户数量
  2. count = tapply(RFMData$CustomerID, RFMData$Type, length)
  3. View(count)
  4. CustomerTypeSum = data.frame('数量' = count)
  5. View(CustomerTypeSum)
  1. CustomerTypeSum
  2. CustomerTypeSum
  3. 数量
  4. 高价值客户 689
  5. 潜在客户 1319
  6. 一般保持客户 40
  7. 一般发展客户 1750
  8. 一般价值客户 358
  9. 重点保持客户 27
  10. 重点发展客户 117
  11. 重点挽留客户 38

4.4 客户分类可视化

  1. ```{r setup, include=FALSE}
  2. ggplot(CustomerTypeSum, aes(x =rownames(CustomerTypeSum), y =CustomerTypeSum[,1], fill = CustomerTypeSum[,1])) +
  3. geom_bar(stat = "identity",width = 0.5) +
  4. labs(title="八种客户的数量分布")

总结

RFM模型通过三个维度的划分,我们可成功将客户划分成了八个类别,还有一些模型的扩展,将各个R、M、F得分划分更多细,比如五标度分法,这样形成的RMF综合分类更为具化,可具体问题具体分析,当然计算也更复杂,这里不在赘述。RFM模型较为动态地显示了一个客户的全部轮廓,这对个性化的沟通和服务提供了依据,同时,如果与该客户打交道的时间足够长,也能够较为精确地判断该客户的长期价值(甚至是终身价值),通过改善三项指标的状况,从而为更多的营销决策提供支持。RFM则强调以客户的行为来区分客户,RFM非常适用于生产多种商品的企业,而且这些商品单价相对不高,如消费品、化妆品、小家电、录像带店、超市等;它也适合在一个企业内只有少数耐久商品,但是该商品中有一部分属于消耗品,如复印机、打印机、汽车维修等消耗品;RFM对于加油站、旅行保险、运输、快递、快餐店、KTV、行动电话信用卡、证券公司等也很适合。

参考文献

1.(R语言 RFM分析)[https://blog.csdn.net/weixin_58587245/article/details/122767879]

2.(深入解读RFM模型(内含实例))[https://www.aisoutu.com/a/1203113]

3.(数据分析实战-RFM模型)[https://zhuanlan.zhihu.com/p/407283531]

4.(R语言 基于RFM的客户价值分析模型)[https://blog.csdn.net/weixin_42009192/article/details/89086434]

RFM客户分类模型的应用——R语言的更多相关文章

  1. 一个简单文本分类任务-EM算法-R语言

    一.问题介绍 概率分布模型中,有时只含有可观测变量,如单硬币投掷模型,对于每个测试样例,硬币最终是正面还是反面是可以观测的.而有时还含有不可观测变量,如三硬币投掷模型.问题这样描述,首先投掷硬币A,如 ...

  2. 模型验证方法——R语言

    在数据分析中经常会对不同的模型做判断 一.混淆矩阵法 作用:一种比较简单的模型验证方法,可算出不同模型的预测精度 将模型的预测值与实际值组合成一个矩阵,正例一般是我们要预测的目标.真正例就是预测为正例 ...

  3. R语言中文社区历史文章整理(类型篇)

    R语言中文社区历史文章整理(类型篇)   R包: R语言交互式绘制杭州市地图:leafletCN包简介 clickpaste包介绍 igraph包快速上手 jiebaR,从入门到喜欢 Catterpl ...

  4. R语言与数据分析

    K最近邻(k-Nearest Neighbor,KNN)分类算法 R语言实现包:R语言中有kknn package实现了weighted k-nearest neighbor. 决策树: R语言实现决 ...

  5. Java-调用R语言和调用Python(前后端展示)

    1. 背景 R语言和Python用于数据分析和数据处理,并生成相应的直方图和散点图 需要实现一个展示平台,后端使用Java,分别调用R语言和调用Python,并返回数据和图给前端显示 这个平台主要实现 ...

  6. 分类-回归树模型(CART)在R语言中的实现

    分类-回归树模型(CART)在R语言中的实现 CART模型 ,即Classification And Regression Trees.它和一般回归分析类似,是用来对变量进行解释和预测的工具,也是数据 ...

  7. R语言实现SOM(自组织映射)模型(三个函数包+代码)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- SOM自组织映射神经网络模型 的R语言实现 笔 ...

  8. 如何在R语言中使用Logistic回归模型

    在日常学习或工作中经常会使用线性回归模型对某一事物进行预测,例如预测房价.身高.GDP.学生成绩等,发现这些被预测的变量都属于连续型变量.然而有些情况下,被预测变量可能是二元变量,即成功或失败.流失或 ...

  9. R语言 常见模型

    转自 雪晴网 [R]如何确定最适合数据集的机器学习算法 抽查(Spot checking)机器学习算法是指如何找出最适合于给定数据集的算法模型.本文中我将介绍八个常用于抽查的机器学习算法,文中还包括各 ...

  10. R语言与分类算法的绩效评估(转)

    关于分类算法我们之前也讨论过了KNN.决策树.naivebayes.SVM.ANN.logistic回归.关于这么多的分类算法,我们自然需要考虑谁的表现更加的优秀. 既然要对分类算法进行评价,那么我们 ...

随机推荐

  1. springboot 整合内存缓存Caffeine

    springboot 整合内存缓存Caffeine 1.引jar包 <dependency> <groupId>org.springframework.boot</gro ...

  2. thymeleaf依赖

    <!--thymeleaf模板--> <dependency> <groupId>org.thymeleaf</groupId> <artifac ...

  3. 数组扩展(Java)

    Arrays类 基本介绍 数组的工具类java.util.Arrays 由于数组本身中没有什么方法可供我们调用,但API中提供了一个工具类Arrays供我们使用,从而可以对数据对象进行一些基本操作 查 ...

  4. PLC入门笔记8

    梯形图基础电路 起保停电路 多点起保停电路 互锁控制电路 周期闪烁电路 这应该是等价的!! 定时器的接力电路 同 延时接通,延时断开电路 同 保持信号变脉冲信号电路 定时器TON 接通延时变断开延时电 ...

  5. 使用python的turtle库画一个冰墩墩

    目录 先看效果图 设置一个画布 画左手和手内 画轮廓和其他部分 画细节(眼睛.鼻子.嘴巴等) 画头部彩虹 画五环标志 最后(别忘记还有一个结束) 先看效果图 设置一个画布 点击查看代码 import ...

  6. AT212 P-CASカードと高橋君

    题目描述 高桥君为了准备即将到来的7月27日土用丑日,打算邮购一些高级鳗鱼食材,通过网上银行来支付. 高桥君使用的银行卡背面有下图所示的9×9密码表.支付的时候从表中某一位置开始根据指定的方向连续读4 ...

  7. python,数据类型和变量,数据类型和变量,集合,字符串拼接

    可不可变: 可变:列表,字典 不可变:字符串,数字,元祖 访问顺序: 直接访问:数字 顺序访问:字符串,列表,元祖 映射:字典 存放元素个数 容器类型:列表,元祖,字典 原子:数字,字符串 集合 1. ...

  8. ABPvNext修改密码强度

    ABPvNext 5.0之后,一些原有的修改密码强度的办法已经被抛弃无法正确使用.目前亲测有效的办法只有通过配置管理修改密码强度. 这里配置文件设置配置的方式,更多方法,可参见官方文档中的Settin ...

  9. Vue学习之基础大全

    1 导入vue: 2 <script src="vue.min.js"></script> 3 创建vm实例 4 var vm=new Vue({ 5 el ...

  10. 121、商城业务---订单服务---rabbitmq消息积压、丢失、重复等解决方案