目录
注:个人学习笔记--谁说菜鸟不会数据分析 R语言篇
一、RFM分析的定义:
RFM分析,是指根据客户活跃程度和交易金额贡献进行客户价值细分的一种客户细分方法。RFM分析主要由3个指标组成,分别为R(Recency,近度)、F(Frequency频度)、M(Monetary,额度)组成
指标 | 解释 | 意义 |
R(Recency,近度) | 客户最近一次交易时间到当前时间的间隔 | R越大,表示客户越久为发生交易 R越小,表示客户越近有交易发生 |
F(Frequency,频度) | 客户在最近一段时间内交易的次数 | F越大,表示客户交易越频繁 F越小,表示客户交易越少 |
M(Monetary,额度) | 客户在最近一段时间内交易的金额 | M越大,表示客户价值越高 M越小,表示客户价值越低 |
依据如上三项指标,划分为6,8,11等几种模型。最常见的为8种:
二、RFM分析的假设
1、假设最近有过交易行为的客户比最近没有交易行为的客户,更有可能再次发生交易行为。
2、假设交易频率较高的客户比交易频率较低的客户,更有可能中再次发生交易行为。
3、假设过去所有交易总金额更多的客户比交易总金额较少的客户,更有消费积极性。
三、RFM分析的步骤
RFM分析,我的理解就是根据用户的行为,从三个层次角度分被构建指标,分别打分,然后计算RFM综合分值,最后将客户进行分类,最后对不同的客户采用不同的营销手段,实现留存高价值客户、发展重点发展客户,挖掘潜在客户的目的。
因此,RFM分析可以分为如下五个步骤:
1.数据准备
2.计算R、F、M
3.将R、F、M分组打分赋值
4.计算RFM综合分值
5.客户分类
四、RMF分析实例
4.1 数据准备
data = read.csv('C:/Users/ABC/Desktop/书籍源代码和配套资源/谁说菜鸟不会数据分析(R语言篇)--数据/第五章/5.7 RFM分析/RFM分析.csv',
fileEncoding="utf8",
stringsAsFactors=FALSE)
数据第一列为OrderID(订单ID)、第二列为CustomerID(客户ID)、第三列DealDataTime(交易日期)第四列为Sales(交易金额)
由于交易日期不利于数据之间的对比,这就需要我们根据交易日期计算出交易日期距当前日期的间隔天数,主要分为如下四个步骤:
1.将日期处理为时间型
2.将当前日期与交易日期相减得到交易日期距离当前日期的时间差
3.使用as.numeric函数将时间
差转换为以日为单位的数值
4.使用floor函数将数据向下取整得到天数。
#1.数据准备
#将时间处理为时间型
data$DealDateTime = strptime(data$DealDateTime, format ='%Y-%m-%d')
#求交易日期至当前日期的时间差
data$DateDiff = Sys.time() - data$DealDateTime
#根据时间差获取天数
data$DateDiff = floor(as.numeric(data$DateDiff, units = "days"))
4.2计算R/F/M
R:使用CustomerID作为分组列,最近一次交易日期距离当前日期的间隔天数Days作为统计列,统计函数使用最小值函数min
F:使用CustomerID作为分组列,OrderID作为统计列,统计函数使用计数函数length
M:使用CustomerID作为分组列,Sales作为统计列,统计函数使用求和函数sum
如下:
#2.计算R、F、M
#统计每个客户的最近一次交易日期距离当前日期的间隔天数,即找出最近消费距离
R = tapply(data$DateDiff, data$CustomerID, min)
#统计每个客户交易的总次数,即对订单计数
F = tapply(data$OrderID, data$CustomerID, length)
#统计每个客户交易的总额,即对每次的交易金额求和
M = tapply(data$Sales, data$CustomerID, sum)
#查看变量
View(R)
View(F)
View(M)
#将R、F、M合并成一个数据框
#使用row.names函数获取R向量的索引以生成CustomerID列
RFMData = data.frame('CustomerID' = row.names(R), 'R' = R, 'F' = F, 'M' = M)
4.3 将R、F、M分组打分赋值
如果没有特别的分组标准,通常按照平均值划分为两个组,并分别赋值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<=平均值 |
#3.将R、F、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)
4.4计算RFM综合分值
在得到R_score、F_score、M_score的分组分值后,就可以计算RFM综合分值了,RFM综合分值计算公式为
RFM = 100×R_score + 10×F_score + 1×M_score
这样设置的原因是用百十个位的组合,构造一个RFM分值。
#4.计算RFM综合分值
RFMData$RFM = 100*RFMData$R_score + 10*RFMData$F_score + 1*RFMData$M_score
4.5客户分类
本例采用与RFM综合分值和客户类型的对应关系表进行匹配合并的方式实现客户分类。
首先将各个RFM综合分值和客户类型的对应关系定义为一个数据框。然后使用merge函数的内连接方法,将RFMData数据框与港定义的RFM综合分值和客户类型的对应关系表,根据管理案例额名RFM匹配合并为一个数据框,这样就完成了客户分类的操作。
#5.客户分类
#定义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)
4.6 完整代码
#R语言 - RFM分析
data = read.csv('C:/Users/ABC/Desktop/书籍源代码和配套资源/谁说菜鸟不会数据分析(R语言篇)--数据/第五章/5.7 RFM分析/RFM分析.csv',
fileEncoding="utf8",
stringsAsFactors=FALSE)
#1.数据准备
#1.将时间处理为实践型
data$DealDateTime = strptime(data$DealDateTime, format ='%Y-%m-%d')
#求交易日期至当前日期的时间差
data$DateDiff = Sys.time() - data$DealDateTime
#根据时间差获取天数
data$DateDiff = floor(as.numeric(data$DateDiff, units = "days"))
#2.计算R、F、M
#统计每个客户的最近一次交易日期距离当前日期的间隔天数,即找出最近消费距离
R = tapply(data$DateDiff, data$CustomerID, min)
#统计每个客户交易的总次数,即对订单计数
F = tapply(data$OrderID, data$CustomerID, length)
#统计每个客户交易的总额,即对每次的交易金额求和
M = tapply(data$Sales, data$CustomerID, sum)
#查看变量
View(R)
View(F)
View(M)
#将R、F、M合并成一个数据框
#使用row.names函数获取R向量的索引以生成CustomerID列
RFMData = data.frame('CustomerID' = row.names(R), 'R' = R, 'F' = F, 'M' = M)
#3.将R、F、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)
#4.计算RFM综合分值
RFMData$RFM = 100*RFMData$R_score + 10*RFMData$F_score + 1*RFMData$M_score
#5.客户分类
#定义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)