当前位置: 首页 > news >正文

RFM模型

1 模型原理

        RFM模型是衡客户价值和客户创造利益能力的重要工具和手段。在众多的客户关系管理(CRM)的分析模式中,RFM模型是被广泛提到的。该模型通过一个客户的近期购买行为、购买的总体频率以及花了多少钱3项指标来描述该客户的价值状况。

 模型指标:   

        R(Recency): 最近一次消费

        F(Frequency): 消费频率 

        M(Monetary): 消费金额 

对RFM的各个维度分别进行二分,最终形成8种不同的组合,并对8种组合进行不同的定义。

最终形成模型如下:

2 运营策略

  • 重要价值用户:最近一次消费时间近、消费频次和消费金额都高,属于优质用户,需要保持,定期提供VIP服务。
  • 重要发展用户:最近一次消费时间近、消费金额高,但消费次数少,忠诚度不够,需要通过相关激励,提高复购频率,定期用户回访,提高用户黏性。
  • 重要保持用户:消费金额和消费频次都高,但最近一次消费时间远,属于很长时间没来的忠实用户,需要主动和其进行互动,及时唤回。
  • 重要挽留用户:消费金额高,但最近一次消费时间远、消费频次低,说明消费能力强,是潜在的价值客户,需要重点维持。
  • 一般价值用户:最近一次消费时间近、消费频次高,但消费金额低,属于低客单价群体,可以尝试逐步推广消费金额比较高的产品。
  • 一般发展用户:最近一次消费时间近,但消费频次和消费金额低,说明属于意向用户,属于探索期用户,可以主动介绍产品,保持联络。
  • 一般保持用户:消费频次多,最近一次消费时间远、消费金额低,总体贡献不大,一般维持即可。
  • 一般挽留用户:最近一次消费时间远、消费频次和消费金额也都低,贡献度最小,如果不需要额外的运营预算和精力,也可适当进行维护

3 模型实现

3.1 实现思路

  1. 对单个用户原始数据进行计算R、F、M三个指标值;
  2. 对R、F、M三个指标分别进行价值计算,并将其分为1到5个段;
  3. 分别单个用户的R、F、M的各个指标的价值进行判断,如果低于总用户平均分则标记为“低”,高于平均分则“高”;
  4. 根据分类规则表将用户打上相应的标签;

3.2 具体实现

3.2.1 数据源


工作台 - Heywhale.comicon-default.png?t=O83Ahttps://www.heywhale.com/mw/dataset/63f995627f5ec36e16e810be/file

3.2.2 数据预处理

  1. 过滤掉有退款交易;
  2. 将付款时间转换成订单日期;
  3. 过滤付款金额小于0的交易;
  4. 按用户进行汇总聚合,单个用户取最后交易时间,交易总条数,总金额;
import pandas as pd
from matplotlib import pyplot as pltdata = pd.read_excel("/Users/yiche1/Desktop/数据分析/study-data/order2021.xlsx")data = data[data['是否退款']=='否']data = data[['订单号','用户名','付款金额','付款时间']]data['订单日期'] = pd.to_datetime(data['付款时间'],format='%Y-%m-%d').dt.datedata = data[data['付款金额'] >=0]data1 = data.groupby(['用户名','订单日期']).agg(amount = ('付款金额','sum')).reset_index()data_rfm = data1.groupby(['用户名']).agg(R = ('订单日期','max'),F = ('订单日期','count'), M =('amount','sum')).reset_index()

 3.2.3 计算R的分布值

data_rfm['R'] = data_rfm['R'].apply(lambda x: date - x)data_rfm['R'] = data_rfm['R'].dt.daysR_bin_list = [0 + i * 10 for i in range(54)]  #生成R划分列表,以10为划分区间data_rfm_R = data_rfm[['用户名','R']]data_rfm_R.loc[:,'R_type'] = pd.cut(data_rfm_R['R'],bins=R_bin_list,right=False)data_rfm_Rcount = data_rfm_R.groupby('R_type')['用户名'].count()print(data_rfm_Rcount)# 画R柱形分布图
plt.figure(figsize=(30,8))
data_rfm_Rcount.plot(kind='bar', color='g', alpha=0.8, width=0.4, rot=0)# R的累计分布图
lj = data_rfm_Rcount.cumsum()/data_rfm_Rcount.sum()
lj.plot(style='--ko',secondary_y=True)plt.show()

3.2.4 计算F的分布值

data_rfm_F = data_rfm[['用户名','F']]
F_bin_list = [1,2,3,4,5,6,7,8]
data_rfm_F.loc[:,'F_type'] = pd.cut(data_rfm_F['F'], bins=F_bin_list, right=False)data_rfm_Fcount = data_rfm_F.groupby('F_type')['用户名'].count()
plt.figure(figsize=(30,8))
data_rfm_Fcount.plot(kind='bar', color='g', alpha=0.8, width=0.4, rot=0)lj = data_rfm_Fcount.cumsum()/data_rfm_Rcount.sum()
lj.plot(style='--ko',secondary_y=True)plt.show()

3.2.5 计算M的分布值

M_bin_list = [0 + i * 200 for i in range(51)]
M_bin_list.append(1000000)
data_rfm_M = data_rfm[['用户名','M']]
data_rfm_M.loc[:,'M_type'] = pd.cut(data_rfm_M['M'], bins=M_bin_list, right=False)
data_rfm_Mcount = data_rfm_M.groupby('M_type')['用户名'].count()plt.figure(figsize=(30,8))
data_rfm_Mcount.plot(kind='bar', color='g', alpha=0.8, width=0.4, rot=0)lj = data_rfm_Mcount.cumsum()/data_rfm_Mcount.sum()
lj.plot(style='--ko',secondary_y=True)plt.show()

3.2.6 数据打标

        根据拐点法定义数据价值区间,对R、F、M分别进行区间划分;比较价值分与总用户平均分的大小,打上“高、低”价值标签;通过影射表关联用户标签;

# 定义区间边界
r_bins = [-1,30,60,150,240,370]
f_bins = [0,1,2,3,4,7]
m_bins = [-1,600,1400,2600,5000,1000000]# RFM分箱得分
data_rfm['R_score'] = pd.cut(data_rfm['R'], r_bins, labels=[i for i in range(len(r_bins)-1,0,-1)]).astype('int') #计算R得分
data_rfm['F_score'] = pd.cut(data_rfm['F'], f_bins, labels=[i+1 for i in range(len(f_bins)-1)]).astype('int') #计算F得分
data_rfm['M_score'] = pd.cut(data_rfm['M'], m_bins, labels=[i+1 for i in range(len(m_bins)-1)]).astype('int') #计算M得分data_rfm['R_value'] = data_rfm['R_score'].apply(lambda x:'1' if x>=data_rfm['R_score'].mean() else '0')
data_rfm['F_value'] = data_rfm['F_score'].apply(lambda x:'1' if x>=data_rfm['F_score'].mean() else '0')
data_rfm['M_value'] = data_rfm['M_score'].apply(lambda x:'1' if x>=data_rfm['M_score'].mean() else '0')
data_rfm['result'] = data_rfm['R_value']+data_rfm['F_value']+data_rfm['M_value']data_label = pd.DataFrame([['111','重要价值用户'],['101','重要发展用户'],['011','重要保持用户'],['001','重要挽留用户'],['110','一般价值用户'],['100','一般发展用户'],['010','一般保持用户'],['000','一般挽留用户']],columns=['result','user_label'])# 数据与标签join
data_rfm_result = pd.merge(data_rfm,data_label, on='result', how='left')print(data_rfm_result)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数字证书学习
  • Docker 部署 Seata (图文并茂超详细)
  • Python数据处理利器,pivot与melt让表格变得灵活
  • Java架构师未来篇大模型
  • c++ 链表详细介绍
  • C++vector类 (带你一篇文章搞定C++中的vector类)
  • 区块链审计 如何测试solidity的bool值占用几个字节
  • 基于SpringBoot+Vue+MySQL的画师约稿平台系统
  • 【Unity-Lua】音乐播放器循环滚动播放音乐名
  • 【微服务】Ribbon(负载均衡,服务调用)+ OpenFeign(服务发现,远程调用)【详解】
  • 【Kubernetes】常见面试题汇总(二)
  • JVM: JDK内置命令 - JPS
  • 微信小程序-formData使用
  • 【MySQL】查询表中重复数据、模糊查询列信息、快速copy表数据(1)
  • 分布式锁-Redisson 可重入锁
  • Android开源项目规范总结
  • CSS 三角实现
  • css选择器
  • Fastjson的基本使用方法大全
  • Java教程_软件开发基础
  • MySQL主从复制读写分离及奇怪的问题
  • open-falcon 开发笔记(一):从零开始搭建虚拟服务器和监测环境
  • vue--为什么data属性必须是一个函数
  • webpack+react项目初体验——记录我的webpack环境配置
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 高性能JavaScript阅读简记(三)
  • 诡异!React stopPropagation失灵
  • 将回调地狱按在地上摩擦的Promise
  • 浏览器缓存机制分析
  • 排序(1):冒泡排序
  • 前端之React实战:创建跨平台的项目架构
  • 容器化应用: 在阿里云搭建多节点 Openshift 集群
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 实现菜单下拉伸展折叠效果demo
  • 王永庆:技术创新改变教育未来
  • 用quicker-worker.js轻松跑一个大数据遍历
  • 责任链模式的两种实现
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 浅谈sql中的in与not in,exists与not exists的区别
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • ​【已解决】npm install​卡主不动的情况
  • #Java第九次作业--输入输出流和文件操作
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (Java入门)学生管理系统
  • (Note)C++中的继承方式
  • (二刷)代码随想录第16天|104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
  • (南京观海微电子)——I3C协议介绍
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (转)AS3正则:元子符,元序列,标志,数量表达符
  • (转)EXC_BREAKPOINT僵尸错误
  • .[backups@airmail.cc].faust勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .net core 控制台应用程序读取配置文件app.config