RFM客户分类模型的应用——R语言

2023-05-12,,

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 数据结构展示

      InvoiceNo StockCode                        Description  Quantity InvoiceDate UnitPrice CustomerID        Country
1 536365 85123A WHITE HANGING HEART T-LIGHT HOLDER 6 2010-12-01 2.55 17850 United Kingdom
2 536365 71053 WHITE METAL LANTERN 6 2010-12-01 3.39 17850 United Kingdom
3 536365 84406B CREAM CUPID HEARTS COAT HANGER 8 2010-12-01 2.75 17850 United Kingdom
4 536365 84029G KNITTED UNION FLAG HOT WATER BOTTLE 6 2010-12-01 3.39 17850 United Kingdom
5 536365 84029E RED WOOLLY HOTTIE WHITE HEART. 6 2010-12-01 3.39 17850 United Kingdom
6 536365 22752 SET 7 BABUSHKA NESTING BOXES 2 2010-12-01 7.65 17850 United Kingdom
7 536365 21730 GLASS STAR FROSTED T-LIGHT HOLDER 6 2010-12-01 4.25 17850 United Kingdom
8 536366 22633 HAND WARMER UNION JACK 6 2010-12-01 1.85 17850 United Kingdom
9 536366 22632 HAND WARMER RED POLKA DOT 6 2010-12-01 1.85 17850 United Kingdom
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%;还能看到产品单价和数量的描述性统计信息,发现部分购买量和单价为负数,将这些数据行去掉整理。

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

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

3.4 数据合并

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

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

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

四、RFM模型的数据处理

4.1 中间数据计算

#将时间处理为时间型
T$InvoiceDate = strptime(T$InvoiceDate, format ='%Y-%m-%d')
#求交易日期至当前日期的时间差
T$DateDiff = Sys.time() - T$InvoiceDate
#根据时间差获取天数
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

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

4.3 客户分类

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

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

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

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

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

4.4 客户分类可视化

```{r setup, include=FALSE}
ggplot(CustomerTypeSum, aes(x =rownames(CustomerTypeSum), y =CustomerTypeSum[,1], fill = CustomerTypeSum[,1])) +
geom_bar(stat = "identity",width = 0.5) +
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语言的相关教程结束。

《RFM客户分类模型的应用——R语言.doc》

下载本文的Word格式文档,以方便收藏与打印。