【笔记】电商RFM模型

article/2025/10/22 21:29:00

一、理论基础

(1)RFM模型

R:Recency 最近一次购买–付款日期-按照买家昵称 groupby 取付款日期的信息

F:Frequency 购买频次-付款日期-按照买家昵称 groupby 取付款曰期次数

M:Monetary 购买金额-实付金额-按照买家昵称 groupby 取实付金额的求和

RFM标签
重要价值客户
重要保持客户
重要发展客户
重要挽留客户
一般价值客户
一般保持客户
一般发展客户
一般挽留客户

(2)问题:客户往往是聚集程度比较高的(从可视化角度),不会均质的分布在8个维度里。

(3)背景:业务方/需求方可能需要我们对应的对客户进行分群,以对应他们准备的3种不同的礼包/优惠券/套餐/推荐,我们作为数据分析师,需要根据客户的一些特征进行分群。

(4)算法思路:

  1. 分类:事先需要准备训练数据集,将训练数据集只保留特征,并提报给业务/需求方由较为有经验的资深员工,进行标签标注。划定哪些客户为第一类,哪些第二类,哪些第三类。标注结束后,用以训练模型并且预测其他客户的分类。

  2. 聚类:使用R/F/M三个特征进行kmeans建模,直接给定k值为3,完成三种不同客户类群的直接划分。


二、导入数据并查看

(1)总览信息查看

import numpy as np
import pandas as pd
import matplotlib.pyplot as pltdata = pd.read_excel('data/电商用户价值挖掘.xlsx')
data.head()
data.info()
data.isnull().mean()

在这里插入图片描述

在这里插入图片描述

城市有空值,但不影响RFM模型。

(2)分别查看各有用字段

① 查看数据的时间周期

# 最早的时间为min
data['付款日期'].min()  # Timestamp('2019-01-01 00:17:59')
# 最晚的时间为max
data['付款日期'].max()  # Timestamp('2019-06-30 22:46:22.511000')

② 查看订单状态

data['订单状态'].value_counts()
"""
交易成功                 27793
付款以后用户退款成功,交易自动关闭     1040
Name: 订单状态, dtype: int64
"""

(3)进行一些简单的预处理

① 扣除退款数据

data = data[data['订单状态'] == '交易成功']

② 去重

# drop_duplicate(subset=[])
# duplicated
data.drop_duplicates(inplace=True)

三、构建RFM模型


3.1 获取RFM数据

(1)添加距窗口日期结束天数列

# 构造R值
data['R_'] = (end_date - data['付款日期']).dt.days

(2)求出RFM

# 只取需要的列
users_df = data[['买家昵称', 'R_', '付款日期', '实付金额']].copy()
# groupby一次性求出RFM
rfm_df = users_df.groupby('买家昵称').agg({'R_':'min', '付款日期':'count', '实付金额':'sum'})
# 改名
rfm_df.columns = ['R', 'F', 'M']
# 查看
rfm_df.head()

在这里插入图片描述

(3)数据处理

① 观察描述性统计信息

rfm_df.describe([0.01, 0.99]).T

在这里插入图片描述

② F大于3的都归为4

rfm_df['F'][rfm_df['F']>3] = 4

③ M大于500的都归为500

rfm_df['M'][rfm_df['M']>500] = 500

3.2 建立统计学的RFM模型

(1)制作阈值,打上标签

# 制作阈值
R_threshold = rfm_df['R'].median()
rfm_df.loc[:,'R_SCORE'] = rfm_df['R'].map(lambda x: x > R_threshold)F_threshold = rfm_df['F'].median()
rfm_df.loc[:,'F_SCORE'] = rfm_df['F'].map(lambda x: x > F_threshold)M_threshold = rfm_df['M'].median()
rfm_df.loc[:,'M_SCORE'] = rfm_df['M'].map(lambda x: x > M_threshold)

(2)3种标签汇总

# 汇总的标签
rfm_df['SCORE'] = rfm_df['R_SCORE'] * 100 + rfm_df['F_SCORE'] * 10 + rfm_df['M_SCORE'] * 1

(3)映射成文字标签

# 基于最后score进行映射,完成对应的代码和对应的分类
user_cate_dict = {1: '重要挽留客户',111: '重要价值客户',11: '重要保持客户',101: '重要发展客户',0: '一般挽留客户',110: '一般价值客户',10: '一般保持客户',100: '一般发展客户'
}
rfm_df['user_cate'] = rfm_df['SCORE'].map(user_cate_dict)

(4)画饼图

plt.rcParams['font.sans-serif'] = ['Microsoft YaHei']
plt.rcParams['axes.unicode_minus'] = Falseplt.figure(figsize=(12,8))
plt.pie(rfm_df['user_cate'].value_counts(),labels=rfm_df['user_cate'].value_counts().index,autopct='%.1f%%')plt.show()

在这里插入图片描述


3.3 KMeans聚类分群

(1)数据预处理

# 数据预处理 标准化
from sklearn.preprocessing import StandardScaler# 标准化 实例化 - 转化
ss = StandardScaler()
rfm = ss.fit_transform(rfm_df[['R', 'F', 'M']])# 重新创建DataFrame对象
rfm = pd.DataFrame(data=rfm, columns=['R', 'F', 'M'])

(2)建模分群并评分

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samples, silhouette_score# 使用KMeans进行建模
kmeans = KMeans(n_clusters=4)
# kmeans也可以先fit 再transform
kmeans.fit(rfm)
# 相当于predict
labels = kmeans.labels_
# 使用轮廓系数查看总体评分
silhouette_score(rfm, labels)# 如何去找一个聚类的代表(聚类中心)
centers = kmeans.cluster_centers_

(3)画饼图

# 画图
plt.figure(figsize=(12,8))
plt.pie(pd.Series(labels).value_counts(),labels=pd.Series(labels).value_counts().index,autopct='%.1f%%')plt.show()

在这里插入图片描述



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

相关文章

RFM模型分析

1.RFM的重要意义 RFM模型是衡量用户价值和用户创利能力的重要工具和手段 通过用户的近期交易行为、交易频次以及交易金额三个指标描述客户价值 指标解释意义 R(Recency) 用户最近一次交易的时间间隔R值越大,表示越久没有发生交易 F(Frequency) 用户在最近一段…

RFM 模型

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

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

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

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

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

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

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

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

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

线性代数特征值

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

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;…