数据分析实战项目3:RFM用户分群
目录
- 1、RFM模型介绍
- 2、Excel实际RFM划分案例
- 3、RFM案例
- 3.1 数据加载和基本信息查看
- 3.2 数据预处理和RFM的初始值计算
- 3.3 RFM区间和划分和分值计算
- 3.4 RFM计算结果保存
- 3.4.1 保存到excel
- 3.4.2 保存到数据库
- 3.5 RFM计算结果可视化
- 3.6 结果分析(营销建议)
- 3.7 案例注意点
- 4、总结
1、RFM模型介绍
RFM客户价值模型详细介绍
-
R最近一次购买时间R(recenty)
-
购买频率F(frequency)
-
购买金额M(monetary)
通过这三个维度来评估客户的订单活跃价值,用来做客户分群或价值区分
RFM模型基于一个固定的时间点做的分析
RFM模型的实习过程: -
设置做计算的截止时间点
-
以时间点为截止时间节点,向前推固定周期
-
数据预计算,初始RFM:(最近的订单时间R,订单数量F,订单总金额M)
-
R,F,M区间分组。(F,M越大越好,R越小越好),得到一个分数值
-
将三个维度值,组合或者相加得到总的RFM分
R,M,F分别为2,3,1 则拼接RFM= 231 求和RFM=6
2、Excel实际RFM划分案例
RFM划分过程:
1)提取用户最近一次的交易时间,算出距离计算时间的差值
当前时间=TODAY()
2)计算最近一次交易时间距当前时间的间隔
时间间隔 = Days(后时间,前时间)
3)根据间隔天数长度赋予对应的R值
if(条件,满足条件师输出内容,不满足时输出内容)
4)从历史数据中提取所有用户的购买次数,根据次数多少赋予对应的F值
5)从历史数据中汇总,求得该用户的交易总额,根据金额大小赋予对应的M值
6)求出RFM的中值,例如中位数,用中值和用户的实际值进行比较,高于中值的为高,否则为低
7)在得到不同会员的RFM之后,根据步骤5产生的两种结果有两种应用思路
思路1:基于3个维度值做用户群体划分和解读,对用户的价值度做分析
思路2:基于RFM的汇总得分评估价值度
基于不同群体用户做不同的策略
RFM数值可以作为一些数据挖掘的输入信息
3、RFM案例
用户价值细分是了解用户价值度的重要途经,针对交易数据分析最主要用的就是RFM模型
一般对每个维度分三个划分,最多333=27种
数据sales.xlsx。密码gi7b
数据介绍:
3.1 数据加载和基本信息查看
import pandas as pd
import numpy as np
import time
import pymysql
from pyecharts.charts import Bar3D
#忽略警告
import warnings
warnings.filterwarnings('ignore')
数据是一个有五个sheet的excel表格
如何处理多sheet的excel表,导入python:
#加载数据
#数据是一个有五个sheet的excel表格
sheet_names = ['2015','2016','2017','2018','会员等级']
sheet_datas = [pd.read_excel('./data/sales.xlsx',sheet_name=i) for i in sheet_names]
#每个sheet数据都读出来放在列表中#zip将两个列表的元素组合起来
for each_name,each_data in zip(sheet_names,sheet_datas):print('[data summary for ========{}=======]'.format(each_name)) #打印是哪个sheet,表名print('Overview:','\n',each_data.head(4))#打印前四行print('DESC:','\n',each_data.describe())#数据的描述性信息print('NA records',each_Data.isnull().any(axis=1).sum())#缺失值记录数print('Dtypes',each_data.dtypes)#数据类型
结论:日期列已经自动识别日期格式
订单金额的分布不均匀,有明显的极大值
有的表存在缺失值,但缺失量不大
等等
3.2 数据预处理和RFM的初始值计算
思路:缺失值异常值处理–添加每年的最大日期—四年数据拼接—增加间隔列和日期列—计算RFM各值
1)缺失值,异常值处理
for i,each_data in enumerate(sheet_datas[:]-1):#只要前四个表数据,会员等级那个不要#删除含有缺失值的行,这些行不多,而原数据大量--所以直接删each_data = each_data.dropna()#删除缺失行dropna#剔除订单金额小于1的数据,这些很可能是异常的sheet_data[i] =each_data[each_data['订单金额']>1]#添加提交订单日期最大值这一列,方便后面计算时间间隔sheet_datas[i]['max_year_data']= sheet_datas[i]['提交日期'].max()sheet_datas[0] #先查看一下
2)数据拼接----pd.concat()
四年的数据合并一下,后面就不用再循环读取了
#将四年的数据合并一下,按行拼接
data_merge = pd.concat(sheet_datas[:-1])
data_merge
虽然把四年的数据合并在了一起,但是还是分年进行分析的
3)增加两列:
date_interval(当年中,此提交日期和最大的日期之间的差值),是当年的最后日期
year(年份)
#订单数据处理:增加两列date_interval、year
data_merge['date_interval'] = data_merge['max_year_date'] - date_merge['提交日期']
data_merge['year'] = date_merge['提交日期'].dt.year
date_merge.head()
此时,date_interval类型是两日期相减后的,我们想要改成数字类型
data_merge['date_intervl'] = data_merge['date_intervl'].dt.days
data_merge.info
此时改好了,
4)计算RFM数据
R:date_interval列分组后计算最小值
F:频率,按照年和会员id分组后,计数
M:按照年和会员id分组后,对订单金额求和
此时的数据:
data_merge.groupby(['year','会员ID']).agg(('date_interval':'min','订单号':'count','订单金额':'sum'))
data_merge.groupby(['year','会员ID'],as_index=False).agg(('date_interval':'min','订单号':'count','订单金额':'sum'))
#分组列不作为行标签:as_index=False
#修改列名
rfm_gb.columns = ['year','会员ID','r','f','m']
rfm_gb.head()
3.3 RFM区间和划分和分值计算
上面已经得到RFM具体值,但我们是需要划分区间,333个区间
如何定区间的边界值?
先看一下数值的统计值
em=fm_gb.iloc[:,2:].describe().T #T转置一下
可以划定的三个区间:最小值-1/4分位数,1/4分位数-3/4分位数,3/4分位数-最大值
和业务部门沟通确定,结合业务确定
#定义区间边界
r_bins = [-1,79,255,365]#左开右闭,所以边界小于最小值
f_bins = [0,2,5,130]
m_bins = [0,69,1199,206252]
下面用pd.cut进行分割
pd.cut(rfm_gb['r'],bins=r_bins)
进行了区间分割,并且打了分数:
rfm_gb['r_score'] = pd.cut(rfm_gb['r'],bins=r_bins,labels=[3,2,1])#给三个区间给定分数,1,2,3
rfm_gb['f_score'] = pd.cut(rfm_gb['f'],bins=f_bins,labels=[1,2,3])
rfm_gb['m_score'] = pd.cut(rfm_gb['m'],bins=m_bins,labels=[1,2,3])
rfm_gb
将RFM的值进行拼接
先将默认类型int,转化成str类型:
rfm_gb['r_score'] = rfm_gb['r_score'].astype(np.str)
rfm_gb['f_score'] = rfm_gb['f_score'].astype(np.str)
rfm_gb['m_score'] = rfm_gb['m_score'].astype(np.str)
rfm_gb.info()
进行拼接:输出212这种,增加一列
str.cat()
rfm_gb['rfm_group'] = rfm_gb['r_score'].str.cat(rfm_gb['f_score']).str.cat(rfm_gb['m_score'])
rfm_gb
有了上述数据,需要进行保存
3.4 RFM计算结果保存
3.4.1 保存到excel
to_excel
#保存到excel
rfm_gb.to_excel('./data/sales_rfm.xlsx')
3.4.2 保存到数据库
2.1 创建sale_rfm_score数据表
配置参数信息:
建表操作:
2.2 写入数据到sales_rfm_score数据表
3.5 RFM计算结果可视化
未来更好地了解各组RFM人数的变化,绘制3D柱形图
三个维度:年份、、
#汇总结果:统计不同不同年份的不同rfm分值的会员数量
display_data = rfm_gb.groupby(['rfm_group','year'],as_index=False)['会员ID'].count()
display_data['rfm_group'] = ['rfm_group','year','number']
display_data['rfm_group'].astype(np.int32) #转化类型成int32
display_data.head()
数据拿到后,准备绘图:
from pyecharts.commons.utils import JsCode
from pyecharts import options as optsrange_color = ['#313695', '#4575b4', '#74add1', '#abd9e9', '#e0f3f8', '#ffffbf','#fee090', '#fdae61', '#f46d43', '#d73027', '#a50026']
range_max = int(display_data['number'].max())# 绘制 3D 图形
bar = Bar3D().add(series_name='',data=[d.tolist() for d in display_data.values],xaxis3d_opts=opts.Axis3DOpts(type_='category', name='分组名称'), yaxis3d_opts=opts.Axis3DOpts(type_='category', name='年份'),zaxis3d_opts=opts.Axis3DOpts(type_='value', name='会员数量')
).set_global_opts(visualmap_opts=opts.VisualMapOpts(max_=range_max, range_color=range_color),title_opts=opts.TitleOpts(title="RFM分组结果")
)#xaxis3d_opts是对x轴,visualmap_opts缩放条,图片也可以旋转
bar.render_notebook()
理解上面的作图代码:
[d.tolist() for d in display_data.values]
#将display_data中数值遍历,后放在list列表中
3.6 结果分析(营销建议)
根据上面的图,能发现2018年212群体的数量最多。
从2016到2017年用户群体数量变化不大,但到了2018年增长了近一倍,作为重点分析人群
除212外,312,213,211及112人群都在各个年份占据很大数量
有很大分组人数很少,甚至没有
根据用户的量级可以分成两类:
第一类:用户群体占比超过10%的群体
第二类:占比在个位数的群体(1%-10%)
第三类:占比非常少,但却非常重要的群体
企业可以针对3类群体,按照公司实际运营需求,制定针对不同群体的策略
录入数据库或者保存下来的数据,可以应用到其他模型当中去,成为模型输入的关键维度特征
3.7 案例注意点
1,不同品类、行业对于RFM的依赖度是有差异的,甚至不同阶段也有影响
例如:
大型家电消费周期长的企业,R和M更重要
快消等短而快的,更看重R和F
2,RFM的区间划分,需要结合业务情况
4、总结
- RFM模型是经典的一种用户分群方法,如果数据量不大,可以直接用excel实现
- RFM并非适用所有行业,多用于复购率较高的行业
相关文章:
数据分析实战项目3:RFM用户分群
目录1、RFM模型介绍2、Excel实际RFM划分案例3、RFM案例3.1 数据加载和基本信息查看3.2 数据预处理和RFM的初始值计算3.3 RFM区间和划分和分值计算3.4 RFM计算结果保存3.4.1 保存到excel3.4.2 保存到数据库3.5 RFM计算结果可视化3.6 结果分析(营销建议)3.…...
消息中间件概述
目录1.为什么学习消息队列2.什么是消息中间件3.消息队列应用场景3.1 应用解耦3.2 异步处理3.3 流量削峰3.4 什么是QPS,PV3.5 什么是PV,UV,PR4. AMQP 和 JMS4.1 AMQP4.2 JMS4.3. AMQP 与 JMS 区别5. 消息队列产品6. RabbitMQ6.1 RabbitMQ简介6.2 RabbitMQ 中的相关概…...
vue和js给后端接口返回的数据(如以json数据为元素的数组)添加新的json字段
文章目录vue和js给后端接口返回的数据(如以json数据为元素的数组)添加新的json字段1. res为后端接口的响应2. 获取后端接口返回的数据3. 向 tableData 添加字段3.1. 向 tableData 中添加一个新json元素( {"time", "2023-02-09"} )3.…...
负载均衡的方式
在业务初期,我们一般会先使用单台服务器对外提供服务。随着业务流量越来越大,单台服务器无论如何优化,无论采用多好的硬件,总会有性能天花板,当单服务器的性能无法满足业务需求时,就需要把多台服务器组成集…...
python(15)--函数设计
前言 函数是可重用的程序代码块。 函数的作用,不仅可以实现代码的复用,还可以保证修改函数的代码时,所有调用该函数的地方都能得到体现。目前我已知函数的作用是:对代码实现了封装、函数调用、传递参数、返回计算结果等。 正文 …...
手把手教你用Python做可视化数据,还能调节动画丝滑度
数据可视化动画还在用Excel做? 现在一个简单的Python包就能分分钟搞定! 而且生成的动画也足够丝滑,效果是酱紫的: 这是一位专攻Python语言的程序员开发的安装包,名叫Pynimate。 目前可以直接通过PyPI安装使用。 使用…...
湖南中创教育PMP项目管理——变更管理
【变更管理】包括 一、如何理解需求变更 二、如何控制需求变更 三、项目变更管理流程 四、如何应对“奇葩”变更 一、如何理解需求变更: 1、项目中发生变更是正常现象,变更无法回避 2、哪里都可能出现变更,任何人都有权提出变更 3、…...
IC真题 —— 刷题记录(1)
引言 记录一些 我自己刷的 IC行业招聘真题,不是每题记录,只记录一些值得记录的,写下自己的看法。主要是一些数字IC行业题目,偏前端。 1、有一个逐次逼近型 8位A/D 转换器,若时钟频率为250KHz,完成一次转换…...
【C++入门】命名空间,输出输入,缺省参数,函数重载
文章目录命名空间C输入与输出缺省参数函数重载命名空间 在C/C中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标 识符的名称进行本地化࿰…...
cmu 445 poject 2笔记
2022年的任务 https://15445.courses.cs.cmu.edu/fall2022/project2/ checkpoint 1,实现b树,读,写,删 checkpoint 2, 实现b树,迭代器,并发读写删 本文不写代码,只记录遇到的一些思维盲点 checkp…...
梅开二度的 axios 源码阅读,三千字详细分享功能函数,帮助扩展开发思维
前言 第一遍看 axios 源码,更多的是带着日常开发的习惯,时不时产生出点联想。 第二遍再看 axios 源码,目标明确,就是奔着函数来的。 当有了明确清晰的目标,阅读速度上来了,思绪也转的飞快。 按图索骥&a…...
vcs仿真教程
VCS是在linux下面用来进行仿真看波形的工具,类似于windows下面的modelsim以及questasim等工具,以及quartus、vivado仿真的操作。 1.vcs的基本指令 vcs的常见指令后缀 sim常见指令 2.使用vcs的实例 采用的是全加器的官方教程,首先介绍不使用…...
java 自定义json解析注解 复杂json解析 工具类
java 自定义json解析注解 复杂json解析 工具类 目录java 自定义json解析注解 复杂json解析 工具类1.背景2、需求-各式各样的json一、一星难度json【json对象中不分层】二、二星难度json【json对象中出现层级】三、三星难度json【json对象中存在数组】四、四星难度json【json对象…...
类的 6 个默认成员函数
文章目录一、构造函数1. 构造函数的定义2. 编译器生成的构造函数3. 默认构造函数4. 初始化列表5. 内置成员变量指定缺省值(C11)二、析构函数1. 析构函数的定义2. 编译器生成的析构函数3. 自己写的析构函数的执行方式三、拷贝构造函数1. C语言值传递和返回值时存在 bug2. 拷贝构…...
基于Verilog HDL的状态机描述方法
⭐本专栏针对FPGA进行入门学习,从数电中常见的逻辑代数讲起,结合Verilog HDL语言学习与仿真,主要对组合逻辑电路与时序逻辑电路进行分析与设计,对状态机FSM进行剖析与建模。 🔥文章和代码已归档至【Github仓库…...
6年软件测试经历:成长、迷茫、奋斗
前言 测试工作6年,经历过不同产品、共事过不同专业背景、能力的同事,踩过测试各种坑、遇到过各种bug。测试职场生涯积极努力上进业务和技术能力快速进步过、也有努力付出却一无所得过、有对测试生涯前景充满希望认为一片朝气蓬勃过、也有对中年危机思考不…...
OpenMMLab AI实战营第五次课程
语义分割与MMSegmentation 什么是语义分割 任务: 将图像按照物体的类别分割成不同的区域 等价于: 对每个像素进行分类 应用:无人驾驶汽车 自动驾驶车辆,会将行人,其他车辆,行车道,人行道、交…...
【软考】系统集成项目管理工程师(二十)项目风险管理
一、项目风险管理概述1. 风险概念2. 风险分类3. 风险成本二、项目风险管理子过程1. 规划风险管理2. 识别风险3. 实施定性风险分析4. 实施定量风险分析5. 规划风险应对6. 控制风险三、项目风险管理流程梳理一、项目风险管理概述 1. 风险概念 风险是一种不确定事件或条件,一旦…...
2017-PMLR-Neural Message Passing for Quantum Chemistry
2017-PMLR-Neural Message Passing for Quantum Chemistry Paper: https://arxiv.org/pdf/1704.01212.pdf Code: https://github.com/brain-research/mpnn 量子化学的神经信息传递 这篇文献作者主要是总结了先前神经网络模型的共性,提出了一种消息传递神经网络&am…...
Python:每日一题之全球变暖(DFS连通性判断)
题目描述 你有一张某海域 NxN 像素的照片,"."表示海洋、"#"表示陆地,如下所示: ....... .##.... .##.... ....##. ..####. ...###. ....... 其中"上下左右"四个方向上连在一起的一片陆地组成一座岛屿…...
企业级安全软件装机量可能大增
声明 本文是学习大中型政企机构网络安全建设发展趋势研究报告. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 研究背景 大中型政企机构是网络安全保护的重中之重,也是国内网络安全建设投入最大,应用新技术、新产品最多的机构…...
为什么要用频谱分析仪测量频谱?
频谱分析仪是研究电信号频谱结构的仪器,用于信号失真度、调制度、谱纯度、频率稳定度和交调失真等信号参数的测量,可用以测量放大器和滤波器等电路系统的某些参数,是一种多用途的电子测量仪器。从事通信工程的技术人员,在很多时候…...
Python环境搭建、Idea整合
1、学python先要下载什么? 2、python官网 3、idea配置Python 4、idea新建python 学python先要下载什么? python是一种语言,首先你需要下载python,有了python环境,你才可以在你的电脑上使用python。现在大多使用的是pyt…...
HTTP请求返回304状态码以及研究nginx中的304
文章目录1. 引出问题2. 分析问题3. 解决问题4. 研究nginx中的3044.1 启动服务4.2 ETag说明4.3 响应头Cache-Control1. 引出问题 之前在调试接口时,代码总出现304问题,如下所示: 2. 分析问题 HTTP 304: Not Modified是什么意思? …...
【GD32F427开发板试用】使用Arm-2D显示电池电量
本篇文章来自极术社区与兆易创新组织的GD32F427开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:boc 【虽迟但到】 由于快递的原因,11月份申请的,12月1日才收到GD32F427开发板。虽然姗姗来迟,但也没有减少…...
TS第二天 Typesrcipt编译
文章目录自动编译tsconfig.json配置选项include 比较重要excludeextendsfilescompilerOptions 比较重要自动编译 手动模式:每次ts文件修改完,手动编译一次 tsc 01.ts监视模式:ts文件修改完,自动监视编译 tsc 01.ts -w编译所有文…...
基于C#制作一个飞机大战小游戏
此文主要基于C#制作一个飞机大战游戏,重温经典的同时亦可学习。 实现流程1、创建项目2、界面绘制3、我方飞机4、敌方飞机5、子弹及碰撞检测实现流程 1、创建项目 打开Visual Studio,右侧选择创建新项目。 搜索框输入winform,选择windows窗体…...
git修改历史提交(commit)信息
我们在开发中使用git经常会遇到想要修改之前commit的提交信息,这里记录下怎么使用git修改之前已经提交的信息。一、修改最近一次commit的信息 首先通过git log查看commit信息。 我这里一共有6次commit记录。 最新的commit信息为“Merge branch ‘master’ of https:…...
代码解析工具cpg
cpg 是一个跨语言代码属性图解析工具,它目前支持C/C (C17), Java (Java 13)并且对Go, LLVM, python, TypeScript也有支持,在这个项目的根目录下: cpg-core为cpg解析模块的核心功能,主要包括将代码解析为图,core模块只包括对C/C/Ja…...
Linux虚拟机部署Java环境-Jdk-Mysql
Linux虚拟机部署 author hf 1.安装 电脑安装x-shell工具,然后使用堡垒机基础控件windows版进行安装扫描,最后点击自动检测,保证能扫描到X-shell工具的安装路径 使用堡垒机登录快照夏选择工具点击Xshell进行连接 查看linux版本 root:~# ca…...
推荐一下做图文的网站/短视频营销策略有哪些
点击蓝字关注我们哟~1、移动:图形在平面上的移动,图形本身的大小和形状不发生改变,分析移动规律时要找准移动的方向和距离。(1)上下、左右;折返、循环(2)顺、逆时针:就近原则、平均原则(不一定到顶端才转弯、十六格注意…...
dede女性网站源码/刚刚北京传来重大消息
原标题:Linux护照阅读机 护照读卡器 高速护照扫描仪应用行业解析Linux护照阅读机 护照读卡器提供嵌入式Linux平台的驱动、SDK,比如海思平台。护照阅读器便于集成 出入口设备,包括门禁、访客、通道设备集成,集成后可以直接在备上面…...
外贸网站如何做推广/shopify seo
近日刚刚升级完win7SP1补丁,想乘着系统稳定的时候做个映像,以后有事恢复一下就OK了。可运行win7的备份还原功能里的备份映像后发现系统会强制备份C和D两个盘的数据,我的D盘是软件分区近百G的东东让我再复制一份我可受不了。结症所在是D盘有文…...
怎么看网站是什么语言做的后台/长沙关键词优化公司电话
作者:Mazin https://my.oschina.net/u/3441184/blog/893628 这样的情景可能不常见,但是还是会有的,一旦遇到,如果业务比较复杂,就会很麻烦,但是还是有解决的方案的,比如将一个service方法拆成两…...
蓬莱网站建设联系电话/台湾新闻最新消息今天
HTML其常用标签及属性有: 1、 常见的块级标签: ①<h1></h1>......<h6><h6>:标题标签,自动加粗,h1最大,h6最小。 ②<hr/>:水平线标签,添加一条水平…...
网站开发的项目流程图/自媒体营销的策略和方法
词向量模型之CBOW模型的原理与实现关于词向量模型word2rec,平台里只有skip-gram一个模型的代码实现,本项目将对word2rec算法的第二个模型——CBOW模型进行补充此项目用于交流与学习,如有问题,请大家积极指出,作者将第一…...