168大数据

标题: 探索RFM模型:在B2B行业中做商品分析 [打印本页]

作者: 168主编    时间: 2019-12-18 21:58
标题: 探索RFM模型:在B2B行业中做商品分析
RFM模型是衡量客户价值和客户创利能力的重要工具和手段。在众多的客户关系管理(CRM)的分析模式中,RFM模型是被广泛提到的。该机械模型通过一个客户的近期购买行为、购买的总体频率以及花了多少钱3项指标来描述该客户的价值状况。--百度百科;
R:Recency—— 客户最近一次交易时间的间隔。R值越大,表示客户交易距今越久,反之则越近;
F:Frequency—— 客户在最近一段时间内交易的次数。F值越大,表示客户交易越频繁,反之则不够活跃;
M:Monetary—— 客户在最近一段时间内交易的金额。M值越大,表示客户价值越高,反之则越低。
在传统的定义中RFM模型针对是把客户作为分析对象,同样可以灵活应用,可以延伸参考使用,例如:
航空行业:R-最近乘机时间,F-乘机次数,M-飞行总里程;
社交、游戏行业:R-最近一次登录,F-登录频率,M-在线时间;
或者:R-最近一次登录,F-点赞数 ,M-评论数;
通信行业:R-最近缴费时间,F-缴费次数,M-缴费总额,等;
本文是探索B2B平台中,把商品(SKU)作为分析对象,参考RFM模型进行商品分析:
注:因为考虑到此模型需要较高频率交易产品适用性强,所以较适用于:日化、快消、食品、饮料等,如果是传统期货制,半年或者一个季度才固定采买一次,可能此种方法意义不大,或者有其他方法可以应用;
主要使用工具:R语言进行数据清洗、整理、模型实现、可视化展示;
数据源简介:主要字段包含:下单日期、商品编码(SKU)、下单客户、下单金额等;
主要是用R语言做数据处理、模型探索等,不是工程代码,所以主要贴部分模型探索过程代码示例;
一、关于R(Recency)的计算方法:
因为存在多个客户不同时间下单SKU情况,如果仅以某SKU最近一次下单时间间隔统计,会存在统计规则影响分析判断,比如,仅一个客户昨天下单某SKU,其他客户最后下单均在1个月以前,那么R的值就显得非常低,就会影响统计误差情况;当客户较多的情况下,粗略计算总会存在每天最少有1个客户下单的可能性,这样R的值就比较固定,对模型的分析判断起不到作用;
考虑到以上因素,模型中对R的计算方法为:取统计周期内单SKU下每个客户的R值的“平均值”方法,结合实际计算后数据分布情况情况如下图:
倾斜度计算公式如下:3*(mean -median) / sd,Recency整体数据倾斜度为:0.77;数据呈现右偏(上图中蓝色线为中位数、红色线为平均值),这里Recency用中位数标准取数,提高数据的“平均值的合理性”,部分代码如下:

[AppleScript] 纯文本查看 复制代码

#每个SKU、客户最后下单日期值计算方法;
sales_mat_max <- aggregate(subset_sales$sales_date,by = list(subset_sales$MATERIAL,subset_sales$Customer) , max)
#计算每个SKU 、客户 距今销售周期R
sales_max$max_date <- as.numeric( Sys.Date() - sales_max$sales_maxdate)
#倾斜度
t <- (3*(mean(sales_max$max_date) - median(sales_max$max_date)))/sd(sales_max$max_date)
#总体SKU在每个客户下R值分布图
library(ggplot2)
ggplot(sales_max, aes(x=max_date)) +
geom_density(col ="blue",size =1) +
geom_vline(data=sales_max,aes(xintercept = mean(sales_max$max_date)), linetype="dashed",col = "red",size =1.2)+
geom_vline(data=sales_max,aes(xintercept = median(sales_max$max_date)), linetype ="dashed" ,col ="blue",size = 1.2)
#计算每个SKU在分客户下R值的中位数
recency <- aggregate(max_date ~ MATERIAL,data = sales_max , median)
二、关于F(Frequency)的计算方法:
关于F的计算主要是对下单客户进行去重计数,如果客户较多,可以对下单客户进行数据离散化处理,便于分析,至于离散的标准和规则,可以根据具体的数据量决定;部分代码示例如下:
[AppleScript] 纯文本查看 复制代码

#每个SKU下单客户数去重  计算F
frenquency_d <- unique(subset_sales[,c("MATERIAL","customer")])#去重客户数据
frenquency <-  aggregate(frenquency_d$customer,by =list( frenquency_d$MATERIAL),length)
names(frenquency) <- c("MATERIAL","frenqu")
#对下单客户数量做离散处理  分箱
breaks_f <- c(0,100,300,500,700,1000,1300,1600,2000)
labels_f <- c("(0-100]","(100-300]","(300-500]","(500-700]","(700-1000]","(1000-1300]","(1300-1600]","(1600-2000]")
frenquency[,'frenqu_cut'] <- cut(frenquency$frenqu, breaks =  breaks_f, labels = labels_f)
三、关于M(Monetary)的计算方法:
关于M的计算主要分为单SKU下单总金额和平均每个客户的下单金额2种方式,因为B端产品下单金额相对差别较大,也可以对数据进行离散处理,可以通过自定义方式对下单金额离散(参考F的离散方法)或者直接通过分位数进行分段,本文使用分位数方法分段,示例代码如下:
[AppleScript] 纯文本查看 复制代码

#计算统计统计内每个SKU下单总金额
monetary <- aggregate(amount ~ MATERIAL, data = subset_sales , sum)
breaks_m <- fivenum(monetary$amount)#分位数5个值 对应四个区间段数据
labels_m <- c(paste(0,round(breaks_m[2]/10000,2),sep = "-" ,collapse = ""),
              paste(round(breaks_m[2]/10000,2),round(breaks_m[3]/10000,2),sep = "-" ,collapse = ""),
              paste(round(breaks_m[3]/10000,2),round(breaks_m[4]/10000,2),sep = "-" ,collapse = ""),
              paste(round(breaks_m[4]/10000,2),round(breaks_m[5]/10000,2),sep = "-" ,collapse = ""))
monetary[,'amount_cut'] <- cut(monetary$amount,breaks = breaks_m,labels = labels_m
四、在完成RFM数据计算后,开始对数据分析应用和数据呈现:
1、RFM块状计数图:
[AppleScript] 纯文本查看 复制代码
ggplot(data,aes(frenqu_cut)) + geom_bar() + facet_grid( data$Monetary_avg_cut ~data$max_date_cut) +
  theme_gray()
2、RFM热力图:
[AppleScript] 纯文本查看 复制代码

library(dplyr)
heatmap_data <- data %>% group_by(frenqu_cut,max_date_cut) %>% dplyr::summarize(M_mean = mean(amount))
ggplot(heatmap_data,aes(max_date_cut,frenqu_cut,fill =M_mean)) + geom_tile() +
  scale_fill_distiller(palette = 'RdYlGn',direction = 1)
3、RFM直方图:
[AppleScript] 纯文本查看 复制代码

par(mfrow=c(1,3))
hist(data$max_date,col = "blue2" ,xlab ="R",main ="Recency")
hist(data$frenqu,col = "green",xlab = "F",main ="Frenquency")
hist(data$Monetary_avg, col = "yellow2",xlab = "M", main ="Monetary")
4、RFM散点图:
[AppleScript] 纯文本查看 复制代码

par(mfrow=c(3,1))
plot(x= data$Monetary_avg, y = data$max_date , type = "p",col ="blue" ,cex =2,xlab = "M" ,ylab = "R")
plot(x= data$Monetary_avg, y = data$frenqu , type = "p",col ="green",cex =2,xlab = "M" ,ylab = "F")
plot(x= data$frenqu, y = data$max_date , type = "p",col ="red",cex =2,xlab = "F" ,ylab = "R")
5、RFM交叉明细表:
[AppleScript] 纯文本查看 复制代码

library(reshape2)
dcast(data, max_date_cut + frenqu_cut  ~ Monetary_avg_cut)
总结:
RFM分析模型的结果输出,用于分析每个SKU最近购买周期、下单频率、下单金额分布情况等,针对不同的SKU制定不同的相关营销策略;
同时对SKU按照价值排序,可以参考量化SKU价值,做到定期对SKU进行分析,通过SKU价值模型的变动,执行相应的营销策略,提高SKU的整体下单情况;
结合不同的SKU性质,对平台做推荐,比如SKU下单客户较少,但下单频次和金额得分较高,可以推荐给未下单客户等方法综合应用;
全文主要做简单思路呈现、和RFM的探索应用;
来源:数据D江湖






欢迎光临 168大数据 (http://www.bi168.cn/) Powered by Discuz! X3.2