RFM会员价值度模型

模型基本原理

会员价值度用来评估用户的价值情况,是区分会员价值的重要模型和参考依据,也是衡量不同营销效果的关键指标。

价值度模型一般基于交易行为产生,衡量的是有实体转化价值的行为。常用的价值度模型是RFM

RFM模型是根据会员

  • 最近一次购买时间R(Recency)
  • 购买频率F(Frequency)
  • 购买金额M(Monetary)计算得出RFM得分
  • 通过这3个维度来评估客户的订单活跃价值,常用来做客户分群或价值区分
  • RFM模型基于一个固定时间点来做模型分析,不同时间计算的的RFM结果可能不一样

 RFM模型的基本实现过程

①设置要做计算时的截止时间节点(例如2017-5-30),用来做基于该时间的数据选取和计算。

②在会员数据库中,以今天为时间界限向前推固定周期(例如1年),得到包含每个会员的会员ID、订单时间、订单金额的原始数据集。一个会员可能会产生多条订单记录。

③ 数据预计算。从订单时间中找到各个会员距离截止时间节点最近的订单时间作为最近购买时间;以会员ID为维度统计每个用户的订单数量作为购买频率;将用户多个订单的订单金额求和得到总订单金额。由此得到R、F、M三个原始数据量。

④ R、F、M分区。对于F和M变量来讲,值越大代表购买频率越高、订单金额越高;但对R来讲,值越小代表离截止时间节点越近,因此值越好。对R、F、M分别使用五分位(三分位也可以,分位数越多划分得越详细)法做数据分区。需要注意的是,对于R来讲需要倒过来划分,离截止时间越近的值划分越大。这样就得到每个用户的R、F、M三个变量的分位数值。

⑤ 将3个值组合或相加得到总的RFM得分。对于RFM总得分的计算有两种方式,一种是直接将3个值拼接到一起,例如RFM得分为312、333、132;另一种是直接将3个值相加求得一个新的汇总值,例如RFM得分为6、9、6。

RFM划分案例思路说明

在得到不同会员的RFM之后,根据步骤⑤产生的两种结果有两种应用思路

思路1:基于3个维度值做用户群体划分和解读,对用户的价值度做分析

  1. 得分为212的会员往往购买频率较低,针对购买频率低的客户应定期发送促销活动邮件
  2. 得分为321的会员虽然购买频率高但是订单金额低等,这些客户往往具有较高的购买黏性,可以考虑通过关联或搭配销售的方式提升订单金额。

在得到不同会员的RFM之后,根据步骤⑤产生的两种结果有两种应用思路

思路2:基于RFM的汇总得分评估所有会员的价值度价值,并可以做价值度排名。同时,该得分还可以作为输入维度与其他维度一起作为其他数据分析和挖掘模型的输入变量,为分析建模提供基础。

案例背景介绍 

用户价值细分是了解用户价值度的重要途径,针对交易数据分析的常用模型是RFM模型

业务对RFM的结果要求

  • 对用户做分组
  • 将每个组的用户特征概括和总结出来,便于后续精细化运营不同的客户群体,且根据不同群体做定制化或差异性的营销和关怀

规划目标将RFM的3个维度分别做3个区间的离散化

  • 用户群体最大有3×3×3=27个
  • 划分区间过多则不利于用户群体的拆分
  • 区间过少则可能导致每个特征上的用户区分不显著 

数据介绍 

案例数据是某企业从2015年到2018年共4年的用户订单抽样数据,数据来源于销售系统

数据在Excel中包含5个sheet,前4个sheet以年份为单位存储为单个sheet中,最后一张会员等级表为用户的等级表 

 读取数据

查看数据基本情况

 数据预处理

  •  
  • 通过for循环配合enumerate方法,获得每个可迭代元素的索引和具体值
  • 处理缺失值和异常值只针对订单数据,因此sheet_datas通过索引实现不包含最后一个对象(即会员等级表)
  • 直接将each_data使用dropna丢弃缺失值后的dataframe代原来sheet_datas中的dataframe
  • 使用each_data[each_data['订单金额']>1]来过滤出包含订单金额>1的记录数,然后替换原来sheet_datas中的dataframe
  • 最后一行代码的目的是在每个年份的数据中新增一列max_year_date,通过each_data['提交日期'].max()获取一年中日期的最大值,这样方便后续针对每年的数据分别做RFM计算,而不是针对4年的数据统一做RFM计算。 

汇总所有数据 

汇总所有数据: 将4年的数据使用pd.concat方法合并为一个完整的dataframe data_merge,后续的所有计算都能基于同一个dataframe进行,而不用写循环代码段对每个年份的数据单独计算 

按会员ID做聚合 

 这里使用groupby分组,以year和会员ID为联合主键,设置as_index=False意味着year和会员ID不作为index列,而是普通的数据框结果列。后面的agg方法实际上是一个“批量”聚合功能的函数,它实现了对date_interval、提交日期、订单金额三列分别以min、count、sum做聚合计算的功能。否则,我们需要分别写3条goupby来实现3个聚合

确定RFM划分区间 

在做RFM划分时,基本逻辑是分别对R、F、M做离散化操作,然后再计算RFM。而离散化本身有多种方法可选,由于我们要对数据做RFM离散化,因此需要先看下数据的基本分布状态

 

区间分析 

从数据分布看出 汇总后的数据总共有14万条 r和m的数据分布相对较为离散,表现在min、25%、50%、75%和max的数据没有特别集中

而从f(购买频率)则可以看出,大部分用户的分布都趋近于1,表现是从min到75%的分段值都是1且mean(均值)才为1.365

计划选择25%和75%作为区间划分的2个边界值

 确定RFM划分区间

f的分布情况说明

  • r和m本身能较好地区分用户特征,而f则无法区分(大量的用户只有1个订单)
  • 行业属性(家电)原因,1年购买1次比较普遍(其中包含新客户以及老客户在当年的第1次购买)
  • 与业务部门沟通,划分时可以使用2和5来作为边界 

举例:[1,2,3,4,5],假如数据划分的区间边界是[1,3,5],即划分为2份 

其中的2/3被划分到(1,3]区间中

3/4/5被划分到(3,5]区间中 

1无法划分到任何一个正常区间内

RFM计算过程

  • 每个rfm的过程使用了pd.cut方法,基于自定义的边界区间做划分
  • labels用来显示每个离散化后的具体值。F和M的规则是值越大,等级越高
  • 而R的规则是值越小,等级越高,因此labels的规则与F和M相反
  • 在labels指定时需要注意,4个区间的结果是划分为3份

 将3列作为字符串组合为新的分组

  • 代码中,先针对3列使用astype方法将数值型转换为字符串型
  • 然后使用pandas的字符串处理库str中的cat方法做字符串合并,该方法可以将右侧的数据合并到左侧
  • 再连续使用两个str.cat方法得到总的R、F、M字符串组合

保存结果 

保存RFM结果到Excel

rfm_gb.to_excel('sales_rfm_score1.xlsx')  # 保存数据为Excel

保存结果到Mysql    (pip install pymysql)

 

RFM图形展示 

为了更好地了解不同周期下RFM分组人数的变化,通过3D柱形图展示结果

展示结果时只有3个维度,分别是年份、rfm分组和用户数量。

第1行代码使用数据框的groupby以rfm_group和year为联合对象,以会员ID会为计算维度做计数,得到每个RFM分组、年份下的会员数量

第2行代码对结果列重命名

第3行代码将rfm分组列转换为int32形式 

输出3D图像中

  • X轴为RFM分组、Y轴为年份、Z轴为用户数量
  • 该3D图可旋转、缩放,以便查看不同细节 
  • 左侧滑块,用来显示或不显示特定数量的分组结果

 分别针3类群体,按照公司实际运营需求和当前目标,制定了不同的群体落地的排期

  1. RFM模型是经典的一种用户分群方法,操作起来比较简单,如果数据量不是很大的时候,直接使用Excel就可以实现
  2. RFM并不是在所有业务场景下都可以使用,一般用于零售行业(复购率相对高的行业)
  3. 使用Python的cut方法对数据进行分组,需要注意分组区间默认是左开右闭
  4. 使用Pyecharts可以方便的绘制出可以交互的3D图,在修改弹出提示信息内容时,需要注意字符串拼接的格式 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/297435.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何在 Windows 上从电脑硬盘恢复照片

如今,随着相机设备的普及,您可以轻松地一次拍摄一堆照片,将它们传输到硬盘上,然后再拍摄更多照片。但是,如果您的所有照片意外丢失在驱动器中怎么办?你能恢复它们吗? 在本指南中,我…

配置文件的创建和部署

配置描述文件(Configuration Profiles)的格式为xml,其提供了一个非常容易的方式去给电脑、移动设备或用户定义一些设置或限制,你可以使用Jamf Pro去创建这样的配置文件。 (配置文件的负载) 有关配置文件的配…

Spring——Spring AOP1(代理模式Proxy)

代理(Proxy)模式 1.创建工程 2.代理(Proxy)模式介绍 作用:通过代理可以控制访问某个对象的方法,在调用这个方法前做前置处理,调用这个方法后做后置处理。(即: AOP的微观…

Postman 并发测试入门指南:如何模拟用户并发请求?

背景介绍 最近,我们发起了一个在线图书管理系统的项目。我负责的一个关键模块包括三个主要后台接口: 实现对books数据的检索。实施对likes数据的获取。通过collections端点访问数据。 应对高流量的挑战 在设计并部署接口时,我们不可避免地…

Anaconda安装教程及注意事项

一、Anaconda简介 Anaconda是一个大数据处理、科学计算领域的Python发行版。它包含了众多流行的开源软件和库,如NumPy、SciPy、Matplotlib、Pandas等,并同时提供了一个方便的打包、分发和管理这些工具的工具集合,如conda和pip等。Anaconda还提…

Service Weaver:Google开源基于分布式应用程序开发的框架,重新定义微服务边界

大家好,我是萧楚河,公众号:golang面试经典讲解,感谢关注,一起学习一起成长。一、前言 今年6月,一群谷歌员工(由谷歌软件工程师Michael Whittaker领导)发表了一篇名为“Towards Mode…

transforms图像增强(一)

一、数据增强 数据增强(Data Augmentation)是一种常用的数据预处理技术,通过对训练集进行各种变换和扩增操作,可以增加训练数据的多样性和丰富性,从而提高模型的泛化能力。 数据增强的目的是通过对训练集中的图像进行…

如何在Ubuntu安装SVN服务并结合cpolar实现公网TCP地址远程访问本地服务

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

locust 快速入门--程序调试

背景 对测试的api引入locust后,不在使用requests库进行http请求了,而是通过client属性发送请求,实质是使用HttpSession。 问题:如果对locust程序进行调试 解决方案: 因为locust使用协程,需要开启pych…

剧本杀小程序/APP搭建,增加玩家游戏体验

近年来,剧本杀游戏成为了年轻人娱乐的新方式,受到了年轻人的追捧。 剧本杀是一种新型的社交游戏,在游戏中,玩家不仅可以进行角色扮演,也能够交到好友,符合当下年轻人的生活模式。 小程序、app是当下剧本杀…

微服务-java spi 与 dubbo spi

Java SPI 通过一个案例来看SPI public interface DemoSPI {void echo(); } public class FirstImpl implements DemoSPI{Overridepublic void echo() {System.out.println("first echo");} } public class SecondImpl implements DemoSPI{Overridepublic void ech…

C++ 类的内存分布

文章目录 1 . 前言2 . 无继承,无虚函数3 . 无继承,有虚函数4 . 单一继承,无虚函数5 . 单一继承,有虚函数,虚析构6 . 多重继承7 . 菱形继承8 . 虚拟继承9 . 总结 【极客技术传送门】 : https://blog.csdn.net/Engineer_…

Vue框架底层

一、前端框架的由来 1、服务端渲染 sequenceDiagram 浏览器->>服务器: https://www.bilibili.com/ Note right of 服务器: 组装页面(服务端渲染) 服务器->>-浏览器: 完整页面2、前后端分离 sequenceDiagram 浏览器->>服务器: https://www.bilibili.com/ 服务…

算法基础之合并果子

合并果子 核心思想&#xff1a; 贪心 Huffman树(算法): 每次将两个最小的堆合并 然后不断向上合并 #include<iostream>#include<algorithm>#include<queue> //用小根堆实现找最小堆using namespace std;int main(){int n;cin>>n;priority_queue&l…

支持 input 函数的在线 python 运行环境 - 基于队列

支持 input 函数的在线 python 运行环境 - 基于队列 思路两次用户输入三次用户输入 实现前端使用 vue element uiWindows 环境的执行器子进程需要执行的代码 代码仓库参考 本文提供了一种方式来实现支持 input 函数&#xff0c;即支持用户输的在线 python 运行环境。效果如下图…

查询json数组

步骤一&#xff1a;创建表格 首先&#xff0c;我们需要创建一个表格来存储包含JSON对象数组的数据。可以使用以下代码创建一个名为 my_table 的表格&#xff1a; CREATE TABLE my_table (id INT PRIMARY KEY AUTO_INCREMENT,json_data JSON ); 上述代码创建了一个包含两个列的…

算法实验T15——POJ1636 Prison rearrangement

题目描述 Prison rearrangement Time Limit: 3000MSMemory Limit: 10000KTotal Submissions: 6415Accepted: 2718 Description&#xff1a; In order to lower the risk of riots and escape attempts, the boards of two nearby prisons of equal prisoner capacity, have dec…

计算机毕业设计 SpringBoot的中小型制造企业质量管理系统 Javaweb项目 Java实战项目 前后端分离 文档报告 代码讲解 安装调试

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

Kafka安全认证机制详解之SASL_PLAIN

一、概述 官方文档&#xff1a; https://kafka.apache.org/documentation/#security 在官方文档中&#xff0c;kafka有五种加密认证方式&#xff0c;分别如下&#xff1a; SSL&#xff1a;用于测试环境SASL/GSSAPI (Kerberos) &#xff1a;使用kerberos认证&#xff0c;密码是…

Ubuntu 本地部署 ChatGPT-Next-Web

Ubuntu 本地部署 ChatGPT-Next-Web 文章目录 Ubuntu 本地部署 ChatGPT-Next-Web ChatGPT-Next-Web 项目地址&#xff1a;https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web 本文主要演示如何在 Ubuntu 本地&#xff08;默认是端口 3000&#xff09;部署 ChatGPT-Next-Web&am…