RFM模型及R语言实现
每每以为攀得众山小,可、每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~
———————————————————————————
一、基本概念
根据美国数据库营销研究所Arthur Hughes的研究,客户数据库中有三个神奇的要素,这三个要素构成了数据分析最好的指标:最近一次消费(Recency)、消费频率(Frequency)、消费金额(Monetary)。
RFM模型:R(Recency)表示客户最近一次购买的时间有多远,F(Frequency)表示客户在最近一段时间内购买的次数,M (Monetary)表示客户在最近一段时间内购买的金额。
一般原始数据为3个字段:客户ID、购买时间(日期格式)、购买金额,用数据挖掘软件处理,加权(考虑权重)得到RFM得分,进而可以进行客户细分,客户等级分类,Customer Level Value得分排序等,实现数据库营销!
二、算法流程
拿到了RFM模型的Recency_Score、Frequency_Score、Monetary_Score和RFM_Score之后,对RFM得分进行了五等分切割(我个人觉得按照分位数来定等级,根据分位数曲线的拐点来分也可以),采用100、10、1加权得到RFM得分表明了125个RFM魔方块。
在R中实现比较简单,用cut 或 quantile 函数都可以实现。
三、深入分析
传统的RFM模型到此也就完成了,但125个细分市场太多啦无法针对性营销也需要识别客户特征和行为,有必要进一步细分客户群。
可以进行不同块的对比分析:均值分析、块类别分析等等

接下来,我们继续采用挖掘工具对R、F、M三个字段进行聚类分析。
这时候我们要考虑是直接用R(Recency)、F(Frequency)、M (Monetary)三个变量还是要进行变换,因为R、F、M三个字段的测量尺度不同最好对三个变量进行标准化,例如:Z得分(实际情况可以选择线性插值法,比较法,对标法等标准化)!
另外一个考虑:就是R、F、M三个指标的权重该如何考虑,在现实营销中这三个指标重要性显然不同!有资料研究表明:对RFM各变量的指标权重问题,Hughes,Arthur认为RFM在衡量一个问题上的权重是一致的,因而并没有给予不同的划分。而Stone,Bob通过对信用卡的实证分析,认为各个指标的权重并不相同,应该给予频度最高,近度次之,值度最低的权重。
这里我们采用加权方法:WR=2 WF=3 WM=5的简单加权法(实际情况需要专家或营销人员测定);具体选择哪种聚类方法和聚类数需要反复测试和评估,同时也要比较三种方法哪种方式更理想!
输出结果后将R、F、M三个字段分类与该字段的均值进行比较,利用Excel软件的条件格式给出与均值比较的趋势!结合RFM模型魔方块的分类识别客户类型:通过RFM分析将客户群体划分成重要保持客户、重要发展客户、重要挽留客户、一般重要客户、一般客户、无价值客户等六个级别;(有可能某个级别不存在)。
另外一个考虑是针对R、F、M三个指标的标准化得分按聚类结果进行加权计算,然后进行综合得分排名,识别各个类别的客户价值水平;
至此如果我们通过对RFM模型分析和进行的客户细分满意的话,可能分析就此结束。
如果我们还有客户背景资料信息库,可以将聚类结果和RFM得分作为自变量进行其他数据挖掘建模工作!
举例代码:
library(magrittr)
library(dplyr)
sales=data.frame(sample(1000:1999,replace=T,size=10000),abs(round(rnorm(10000,28,13))))
# rnorm(n, mean = 0, sd = 1),以上产生均值为28,方差为13的1万个数,用来模拟用户的消费情况.
# sample(1000:1999,replace=T,size=10000), 从1000到1999这些数字中,有放回抽样进行取样,一共取1万个样本,平均每个样本取10次。
names(sales)=c("CustomerId","Sales Value")
# 查看生成的数据
# dplyr::arrange(dplyr::count(sales,CustomerId), desc(n))
# Source: local data frame [1,000 x 2]
# CustomerId n
# 1 1052 24
# 2 1739 23
# 3 1843 21
# 4 1867 21
# > dplyr::arrange(dplyr::count(sales,CustomerId),n)
# Source: local data frame [1,000 x 2]
# CustomerId n
# 1 1962 1
# 2 1264 2
# 3 1566 2
#generating random dates
#runif(n, min = 0, max = 1), stats::runif(10000),产生1万个服从0,1上均匀分布的数
sales.dates <- as.Date("2012/1/1") + 700*sort(stats::runif(10000))
sales=cbind(sales,sales.dates)
str(sales)
sales$recency=round(as.numeric(difftime(Sys.Date(),sales[,3],units="days")) )
# 更改单列的列名
names(sales)<-c("CustomerId", "Purchase.Value", "sales.dates","recency")
## Creating Total Sales(Monetization),Frequency, Last Purchase date for each customer
#aggregate:首先将数据进行分组(按行),然后对每一组数据进行函数统计,最后把结果组合成一个比较nice的表格返回
# aggregate(x, by, FUN, ..., simplify = TRUE)
#统计每个用户的购买总值
salesM=aggregate(sales[,2],list(sales$CustomerId),sum)
names(salesM)=c("CustomerId","Monetization")
salesF=aggregate(sales[,2],list(sales$CustomerId),length)
names(salesF)=c("CustomerId","Frequency")
salesR=aggregate(sales[,4],list(sales$CustomerId),min)
names(salesR)=c("CustomerId","Recency")
##Merging R,F,M
# merge:将两个DF融合成一个DF,merge(x, y, by = intersect(names(x), names(y)) )
test1=merge(salesF,salesR,"CustomerId")
salesRFM=merge(salesM,test1,"CustomerId")
##Creating R,F,M levels
#切分成100份,实际只用前5份
salesRFM$rankR=cut(salesRFM$Recency, 100,labels=F) #rankR 1 is very recent while rankR 5 is least recent
salesRFM$rankF=cut(salesRFM$Frequency, 100,labels=F)#rankF 1 is least frequent while rankF 5 is most frequent
salesRFM$rankM=cut(salesRFM$Monetization, 100,labels=F)#rankM 1 is lowest sales while rankM 5 is highest sales
##Looking at RFM tables
# 以table形式查看
table(salesRFM[,5:6])
table(salesRFM[,6:7])
table(salesRFM[,5:7])
五、后续分析——针对性服务
1. R=短 F=高 M=高
这类客户可以采用“重要保持”的措施。这类消费者的消费频次和客单价都高于均值,要保持这种消费者的有效方法是给予一定的长期优惠,如给予店铺VIP资格。
2. R=短 F=低 M=低
这类用户最近有消费,但频次和客单价低于平均值。针对此客户重要做的是“重要发展”:给予满就送、搭配套餐式的促销组合推荐。如买了热水袋,可以推荐美臀坐垫、睡衣、美发卷等关联产品组合促销,拉升他们的消费频次。关联销售则可以拉动客单价的提升。
3. R=短 F=低 M=高
这类消费者属于店铺销量的主要贡献者,最近有消费,消费频次低于平均值,但客单价却高于平均值。这些消费者的价值关键点在于可以通过提高消费频次来加大其对店铺的贡献,建议采用“重要价值”的方式来提升其贡献值。建议卖家分析这部分客户最近的消费产品,交叉定向发送差异品类产品及促销信息,促进再次购买。如客户麦乐电吹风,要针对性发送浴室相关的居家用品。
4. R=长 F=高 M=高
这类消费者的考虑时间较长,虽然购买频率和购买金额都较高,但容易“溜走”,需要卖家给予“重要挽留”式的措施去加以挽留。卖家要有有针对性的唤醒措施,可以发送定向优惠,在指定时间内满多少可享受折扣。

六、划分客户生命周期
根据客户不同回购周期所占有的客户比例,可以为客户生命周期的划分提供依据,可以把客户划分为: “活跃”、“沉默”、“睡眠”、“流失”四个生命周期。

参考文献:
1、http://blog.csdn.net/wa2003/article/details/48265783
每每以为攀得众山小,可、每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~
———————————————————————————
RFM模型及R语言实现的更多相关文章
- 概率图模型 基于R语言 这本书中的第一个R语言程序
概率图模型 基于R语言 这本书中的第一个R语言程序 prior <- c(working =0.99,broken =0.01) likelihood <- rbind(working = ...
- R语言实现SOM(自组织映射)模型(三个函数包+代码)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- SOM自组织映射神经网络模型 的R语言实现 笔 ...
- RFM模型——构建数据库营销的商业战役!(转)
RFM模型:R(Recency)表示客户最近一次购买的时间有多远,F(Frequency)表示客户在最近一段时间内购买的次数,M (Monetary)表示客户在最近一段时间内购买的金额.一般原始数据为 ...
- 数据挖掘应用案例:RFM模型分析与客户细分(转)
正好刚帮某电信行业完成一个数据挖掘工作,其中的RFM模型还是有一定代表性,就再把数据挖掘RFM模型的建模思路细节与大家分享一下吧!手机充值业务是一项主要电信业务形式,客户的充值行为记录正好满足RFM模 ...
- R语言︱关联规则+时间因素=序贯关联规则
序贯模型=关联规则+时间因素. 了解这个模型可以参考李明老师的<R语言与网站分析 [李明著][机械工业出版社][2014.04][446页]>,第九章,第二节的"序列模型关联分析 ...
- 比较分析C++、Java、Python、R语言的面向对象特征,这些特征如何实现的?有什么相同点?
一门课的课后题答案,在这里备份一下: 面向对象程序设计语言 – 比较分析C++.Java.Python.R语言的面向对象特征,这些特征如何实现的?有什么相同点? C++ 语言的面向对象特征: 对象模 ...
- R语言中文社区历史文章整理(类型篇)
R语言中文社区历史文章整理(类型篇) R包: R语言交互式绘制杭州市地图:leafletCN包简介 clickpaste包介绍 igraph包快速上手 jiebaR,从入门到喜欢 Catterpl ...
- 如何在R语言中使用Logistic回归模型
在日常学习或工作中经常会使用线性回归模型对某一事物进行预测,例如预测房价.身高.GDP.学生成绩等,发现这些被预测的变量都属于连续型变量.然而有些情况下,被预测变量可能是二元变量,即成功或失败.流失或 ...
- R语言解读多元线性回归模型
转载:http://blog.fens.me/r-multi-linear-regression/ 前言 本文接上一篇R语言解读一元线性回归模型.在许多生活和工作的实际问题中,影响因变量的因素可能不止 ...
随机推荐
- 初码-Azure系列-存储队列的使用与一个Azure小工具(蓝天助手)
初码Azure系列文章目录 将消息队列技术模型简化,并打造成更适合互联网+与敏捷开发的云服务模式,好像已经是行业趋势,阿里云也在推荐使用消息服务(HTTP协议为主)而来替代消息队列(TCP协议.MQT ...
- ubuntu 新手入门第一天
在虚拟机上安装好linux之后,当前版本 ubuntu-16.04.3-desktop-amd64.iso 1. 设置root用户名和密码 sudo passwd 然后输入两次密码 2. 设置软件源 ...
- C#基础拾遗系列之一:先看懂IL代码
一.前言 首先,想说说为什么要写这样系列的文章,有时候在和同事朋友聊天的时候,经常会听到这样的话题: (1)在这家公司没什么长进,代码太烂,学不到东西.(你有没有想想框架为什么这样写,代码还可以怎么去 ...
- Spring对远程服务的支持
Java程序有以下的远程调用技术选择: 远程过程调用(RPC)是同步的,客户端在服务器端返回结果之前将一直被阻塞. 各种技术适用的场景如下: 典型的RMI开发的过程如下: 定义一个接口,用于客户端和服 ...
- python数据分析工具包(1)——Numpy(一)
在本科阶段,我们常用的科学计算工具是MATLAB.下面介绍python的一个非常好用而且功能强大的科学计算库--Numpy. a powerful N-dimensional array object ...
- 树莓派3B上部署运行.net core 2程序
针对Linxu arm处理器如何部署.net core 2的资料很少,网上找到几篇但都写得不够详细,按照他们教程来撞墙了,折磨了几天终于部署成功了,先上一张运行成功的图 1.windows系统中,在项 ...
- [Python Study Notes]实现对键盘控制与监控
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' ...
- PHP curl 常用操作
网页内容替换 $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, "http://www.baidu.com"); //执行后 ...
- 搭建SS服务器
体验: http://ss.ishadowx.com/ centos7 安装shadowsocks客户端 http://blog.csdn.net/guyan0319/article/details/ ...
- 对网站视频资源的管控-禁止通过视频的url访问视频
一般静态文件的下载是不经过PHP的,直接由web服务器发送到客户端.但有时候需要实现文件下载的权限控制等功能,这时候就需要经由PHP程序来做权限验证.简单粗暴的做法是,在PHP程序里边先验证权限,验证 ...