RFM模型分析

article/2025/10/22 10:51:06

1.RFM的重要意义

RFM模型是衡量用户价值和用户创利能力的重要工具和手段

通过用户的近期交易行为、交易频次以及交易金额三个指标描述客户价值

指标解释意义

R(Recency)

用户最近一次交易的时间间隔

R值越大,表示越久没有发生交易

F(Frequency)

用户在最近一段时间内的交易频次

F值越大,表示交易越频繁

M(Monetary)

用户在最近一段时间内的交易金额

M值越大,表示交易金额越大

2.RFM的计算逻辑

R分为两类,分值高为1,分值低为0;

F分为两类,分值高为1,分值低为0;

M分为两类,分值高为1,分值低为0;

R、F和M两两组合,可得出8个不同的RFM值

按照实际情况分为八大客户群体,具体分类规则如下:

用户标签RFM值用户特点

重要价值

111
最近一次消费时间近,消费频率高,消费金额高

一般价值

110
最近一次消费时间近,消费频率高,消费金额低

重要发展

101
最近一次消费时间近,消费频率低,消费金额高

一般发展

100
最近一次消费时间近,消费频率低,消费金额低

重要保持

11
最近一次消费时间远,消费频率高,消费金额高

一般保持

10
最近一次消费时间远,消费频率高,消费金额低

重要挽留

1
最近一次消费时间远,消费频率低,消费金额高

一般挽留

0
最近一次消费时间远,消费频率低,消费金额低

3.例题

编辑器:jupyter notebook 

import numpy as np
import pandas as pd# 读取数据
df = pd.read_excel('./data/订单明细.xlsx')
df.head()

df.info()
'''
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 28832 entries, 0 to 28831
Data columns (total 7 columns):#   Column  Non-Null Count  Dtype         
---  ------  --------------  -----         0   订单编号    28832 non-null  object        1   用户编号    28832 non-null  object        2   交易时间    28832 non-null  datetime64[ns]3   交易状态    28832 non-null  object        4   数量      28832 non-null  int64         5   金额      28832 non-null  float64       6   省份      28832 non-null  object        
dtypes: datetime64[ns](1), float64(1), int64(1), object(4)
memory usage: 1.5+ MB
'''df['交易状态'].unique()
'''
array(['交易成功', '退款成功'], dtype=object)
'''df = df[df['交易状态'] == '交易成功']
df = df[['用户编号','交易时间','金额']]
df.head()

# R: 最近一次交易距今的天数
today = pd.to_datetime('2021-07-21')    # 统计的时间
df_r = df.groupby('用户编号')['交易时间'].max().reset_index()   # 每个用户的最近交易时间
df_r['R'] = (today - df_r['交易时间']).dt.days
df_r = df_r[['用户编号','R']]
df_r.head()

# F: 交易频次,当天多次交易仅计算一次
df['交易日期'] = df['交易时间'].dt.date
tb = df.drop_duplicates(subset=['用户编号','交易日期'])    # 去重
# 以用户编号分组计数
df_f = tb.groupby('用户编号').agg(F=('用户编号','count')).reset_index()
df_f.head()

# M: 交易金额
df_m = df.groupby('用户编号').agg(M=('金额','sum')).reset_index()
df_m.head()

# RFM 合并(df_r/df_f/df_m三表合并)
# join\merge\concat
rfm = df_r.merge(df_f,on='用户编号').merge(df_m,on='用户编号')
rfm.head()

# 如果极端值过多可取中位数
# R指标的均值
avg_r = rfm['R'].mean()
# F指标的均值
avg_f = rfm['F'].mean()
# M指标的均值
avg_m = rfm['M'].mean()# R指标的分值
rfm['R_score'] = (rfm['R'] < avg_r) * 100    # 100用于做分类,也可用其他值
# F指标的分值
rfm['F_score'] = (rfm['F'] > avg_f) * 10
# M指标的分值
rfm['M_score'] = (rfm['M'] > avg_m) * 1rfm.head()

# 总分值
rfm['Total_score'] = rfm['R_score'] + rfm['F_score'] + rfm['M_score']
rfm.head()

rfm['Total_score'].unique()
'''
array([  1,   0,  11, 111, 100,  10, 110, 101])
'''dct = {111:'重要价值',110:'一般价值',101:'重要发展',100:'一般发展',11:'重要保持',10:'一般保持',1:'重要挽留',0:'一般挽留'
}
rfm['用户标签'] = rfm['Total_score'].map(dct)
rfm.head()

rfm['用户标签'].unique()
‘’‘
array(['重要挽留', '一般挽留', '重要保持', '重要价值', '一般发展', '一般保持', '一般价值', '重要发展'],dtype=object)
’‘’# 各类用户的人数统计
cnt = rfm['用户标签'].value_counts().reset_index()
cnt.columns = ['用户标签','人数']
cnt['人数占比'] = cnt['人数'] / cnt['人数'].sum()
cnt

# 各类用户的金额统计
rfm['金额'] = rfm['M']
amt = rfm.groupby('用户标签')['金额'].sum().reset_index()
amt['金额占比'] = amt['金额'] / amt['金额'].sum()
amt

result = pd.merge(cnt,amt,on='用户标签')
result['人数占比'] = result['人数占比'].apply(lambda x: '{:.2%}'.format(x))
result['金额占比'] = result['金额占比'].apply(lambda x: '{:.2%}'.format(x))
result = result.sort_values(by=['金额','人数'],ascending=[False,False])
result

 

# !pip install pyecharts==1.9.1from pyecharts.charts import *
from pyecharts import options as opts# 绘制饼图
pie = Pie(init_opts=opts.InitOpts(width='1000px',height='500px'))  # 实例化类,并调节大小
pie.add('交易金额',result[['用户标签','金额']].values.tolist(),radius=['20%','70%'],rosetype='radius',center=['25%','50%']  # 第一项是相对于画布的宽度,第二项是相对于画布的高度,默认是百分比形式,参考点为圆心
)
pie.add('交易人数',result[['用户标签','人数']].values.tolist(),radius=['20%','70%'],rosetype='radius',center=['75%','50%']  # 第一项是相对于画布的宽度,第二项是相对于画布的高度,默认是百分比形式,参考点为圆心
)
pie.set_series_opts(label_opts=opts.LabelOpts(formatter='{d}%'))    # {a} 交易金额或人数;{b} 用户标签;{c} 指标的数值;{d} 百分比
pie.render('RFM模型分析.html')
pie.render_notebook()

 


http://chatgpt.dhexx.cn/article/EsBXsofi.shtml

相关文章

RFM 模型

RFM 模型 顾客价值分析 顾客价值分析 由于激烈的市场竞争&#xff0c;各个公司相继推出了多样灵活的优惠方式来吸引更多的客户。 对一个没有购买力的顾客&#xff0c;你打电话推销优惠活动毫无作用&#xff0c;可一个高价值顾客&#xff0c;会说有优惠活动怎么不通知我呢&…

数据分析八大模型:详解RFM模型

大家好&#xff0c;我是爱学习的小xiong熊妹。 今天跟大家分享的是一个经常被提及&#xff0c;但是价值被严重低估的模型&#xff1a;RFM模型。 一、RFM的基本思路 RFM模型由三个基础指标组成&#xff1a; R&#xff1a;最近一次消费至今的时间 F&#xff1a;一定时间内重复…

线性代数:如何求特征值和特征向量?

一、特征值和特征向量的定义 1 首先让我们来了解一下特征值和特征向量的定义&#xff0c;如下&#xff1a; 2 特征子空间基本定义&#xff0c;如下&#xff1a; END 二、特征多项式 1 特征多项式的定义&#xff0c;如下&#xff1a; 2 推论&#xff1a;n阶方阵A可逆的充…

如何用计算机求特征值特征向量,利用QR算法求解矩阵的特征值和特征向量

利用QR算法求解矩阵的特征值和特征向量 为了求解一般矩阵(不是那种幼稚到shi的2 x 2矩阵)的特征值. 根据定义的话,很可能需要求解高阶方程... 这明显是个坑...高阶方程你肿么破... 折腾了好久 1.我要求特征值和特征向量. 2.找到一种算法QR分解矩阵求解特征值 3.QR矩…

【考研线代】五. 特征值和特征向量

文章目录 第五章 特征值和特征向量5.1 特征值&#xff0c;特征向量5.1.1 概念5.1.2 性质 & 定理 & 推论 ⭐5.1.3 求特征值和特征向量的方法数值型矩阵抽象型矩阵巧解矩阵特征值方法⭐ 5.2 相似矩阵5.2.1 概念5.2.2 性质5.2.3 求可逆矩阵P使得A可相似对角化方法 5.3 实对…

线性代数特征值

特征值的性质&#xff1a; 下面是例题&#xff1a; 要注意单位阵的特征值是替换成1 注意下面两个&#xff1a; 例题5&#xff1a; 仔细看解题过程。 例题6&#xff1a; 运用了特征值相加等于矩阵主对角线元素之和 、特征值相乘等于矩阵的行列式、求特征值的定义。列出以上三…

eigen求特征值和特征向量

Eigen::Matrix2d matrix_22;matrix_22 << 2,3,2,1;cout << "matrix \n"<< matrix_22<<endl;//Eigen::SelfAdjointEigenSolver<Eigen::Matrix2d> eigen_solver1 ( matrix_22 );/这句是啥不清楚Eigen::EigenSolver<Eigen::Matrix2d&…

特征多项式法(characteristic polynomial )求特征值(结合lanczos和householder)(python,数值积分)

第三十四篇 特征多项式法求对称三对角矩阵的特征值 特征多项式 在之前的篇章中介绍过的&#xff0c;一个矩阵的特征值可以形成一个n阶多项式的根&#xff0c;称为“特征多项式”。线性方程的求解方法可以用来求这些根&#xff0c;详情可以翻看我之前写过的文章。但这并不是一…

Matlab求特征值和特征向量 + find函数的基本简单用法

A[1 5 4; 3 2 1;5 6 6] 计算矩阵A的特征值和特征向量的函数是eig&#xff08;A&#xff09;&#xff0c;常用方法为&#xff1a; 1.求矩阵的特征值 每一列有一个特征值&#xff0c;可知A有三个特征值 设矩阵A的全部特征值构成向量E Eeig(A) 执行选中内容命令行窗口如下&…

Eigen求特征值与特征向量

这里列举三种方式求矩阵的特征值与特征向量 #include <stdio.h> #include <stdlib.h> #include<Eigen/Eigen>using namespace std; using namespace Eigen;void main() {MatrixXd m(3, 3);m << 1,-2,2,-2,-2,4,2,4,-2;cout << m << endl …

matlab 求特征值的命令,matlab怎么求特征值

matlab怎么求特征值&#xff1f; 求矩阵的特征值和特征向量方法 方法/步骤 第一步我们首先需要知道计算矩阵的特征值和特征向量要用eig函数&#xff0c;可以在命令行窗口中输入help eig&#xff0c;查看一下eig函数的用法&#xff0c;如下图所示&#xff1a; 第二步在命令行窗口…

转: 特征值和特征向量--1

转&#xff1a;https://jingyan.baidu.com/article/27fa7326afb4c146f8271ff3.html 一、特征值和特征向量的定义 1 首先让我们来了解一下特征值和特征向量的定义&#xff0c;如下&#xff1a; 2 特征子空间基本定义&#xff0c;如下&#xff1a; END 二、特征多项式 1 特征多项…

线性代数(8):特征值、特征向量和相似矩阵

一、特征值和特征向量 &#xff08;2&#xff09;定义 有矩阵 A 为 n 阶矩阵&#xff0c;Ax λx &#xff08; λ 为一个实数&#xff0c;x为 n 维非零列向量 &#xff09;&#xff0c;则称 λ 为方阵 A 的特征值&#xff0c; x 为特征向量&#xff1b; &#xff08;2&#x…

mosquitto入门教程

参考大神的博客&#xff1a; http://mqtt.org/ MQTT 是一个轻型协议&#xff0c;使用基于 TCP/IP 协议的发布/订阅消息转发模式&#xff0c;专门用于机器对机器 (M2M) 通信。 MQTT 协议的中心是 MQTT 服务器或代理 (broker) &#xff0c;支持发布程序和订阅程序进行访问&…

mosquitto源码分析(一)

关于mqtt、mosquito的技术交流&#xff0c;可入群&#xff1a;221779856 本文由逍遥子撰写&#xff0c;转发请标注原址&#xff1a; http://blog.csdn.net/houjixin/article/details/21461225 一、 Mosquitto简介 mosquitto是一款实现了消息推送协议MQTT v3.1 的开源消息代理…

mosquitto安装与使用

Eclipse Mosquitto 是实现MQTT协议版本5.0、3.1.1和3.1的开源消息代理&#xff08;经EPL / EDL许可&#xff09;。mosquitto 是一个开源的轻量级的C实现&#xff0c;适合在从低功耗单板计算机到完整服务器的所有设备上使用。mosquitto包括服务端和客户端。官网&#xff1a;http…

NMOS和PMOS管

这里我先说一下我自己分辨MOS管的方法 对于NMOS我们看下图中的箭头&#xff0c;都是远离源头。 对于PMOS我们看箭头&#xff0c;都是指向源头 P&#xff1a;POSITIVE积极的寻找自己的起源 N&#xff1a;NEGTIVE消极的远离自己的源头 首先明确一点&#xff0c;S是源极&#xff…

mosquitto接口流程图

接口流程图 1、mosquitto_new2、mosquitto_reinitialise3、mosquitto_connect_async4、mosquitto_loop5、mosquitto_loop_start6、mosquitto_loop_stop7、mosquitto_loop_forever8、mosquitto client自定义开发流程 1、mosquitto_new 2、mosquitto_reinitialise 3、mosquitto_c…

Mosquitto常用命令

1 mosquitto服务器的搭建 服务器这里使用了阿里云的服务器&#xff0c;mosquitto默认需要1883的TCP入端口。需要在安全策略里设置一下。端口当然也可以选其他端口进行配置。 服务安装 # 服务器终端安装mosquitto和mosquitto-clients&#xff0c;后者是一些客户端&#xff0c;…

mosquitto 在 Windows 上的安装

文章目录 第一步&#xff1a;准备安装文件第二步&#xff1a;安装Mosquitto第三步&#xff1a;安装OpenSSL第四步&#xff1a;将要求的DLL放置Mosquitto安装目录下第五步&#xff1a;添加环境变量第六步&#xff1a;验证 第一步&#xff1a;准备安装文件 安装文件点此下载 注…