如何利用SQL创建RFM用户分析模型

2024-01-15 15:44

本文主要是介绍如何利用SQL创建RFM用户分析模型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

   RFM用户分析模型究竟是什么?在之前的博客已经介绍了它的意义以及如何在现有的数据的情况下,利用Pandas创建分析模型,这里不再重复,详细可以参考我博客https://blog.csdn.net/weixin_48591974/article/details/116192534



   这一期将详细介绍如何利用SQL直接获取所需的数据去创建RFM用户分析模型。SQL ---- Structured Query Language(结构化查询语言 ),它是一种专门用来与数据库沟通的语言,提供了很多从数据库中高效地读写数据、查询数据的方法。常用的DBMS(数据库管理软件) 有 MySQL、Access、SQLite、SQL SERVER、Oracle 等等。



Recency:最近一次消费,即上一次交易距今多少天,反应了客户是否流失;


Frequency:消费频率,一段时间内客户的消费频率,反应了客户的消费活跃度;


Monetary:消费金额,一段时间内客户消费总金额,反应了客户价值


根据 RFM 这 3个 Dimension,可以分为8种客户类型,如下图:



在这里插入图片描述



   以下将简单介绍3个指标值的计算方法:



   F 值的计算:例如要计算 子表 orders 里 user_id 为 8002011的值。



在这里插入图片描述



   统计数据行数,我们可以使用 count() 函数完成,最后得出 F值为 3



SELECT  count(*)    AS F
FROM    orders
WHERE   user_id = 8002011;


   M 值的计算: 使用 sum() 函数将计算字段 price * amount 所有行加起来就得出 user_id 8002011 总消费金额为 13000



SELECT  sum(price * amount) AS M
FROM    orders
WHERE   user_id = 8002011;


   R 值的计算:在orders表中,可见时间是以 Integer 类型存在,也就是以格兰威治秒数(Unix时间戳)类型存在,指的是从1970年1月1日开始计算的秒数。关于时间戳和日期转换方法,可以运用 python的 datetime module 去实现转换。例如今天(2024-01-12)所对应的时间戳经过转换为 1704988800(秒),因此可以用这数值减去最近一次消费的日期,最后转换成天数,就知道 user_id 8002011最近一次消费距离今天为多少天。



SELECT (1704988800 - max(pay_time)) / (24 * 60 * 60) AS R,
FROM    orders
WHERE   user_id = 8002011;


   有了以上对3个指标的计算方法,以下就继续介绍各种方法进行分析。假设有如下总的数据表(更多数据行省略…)



在这里插入图片描述



   首先通过GROUP BY 子句,将原数据进行 分组,再通过聚合函数把字段组合相同的行划分为同一组。具体语法如下:



SELECT user_id  AS 用户ID,user_name AS 用户昵称,(1704988800 - max(pay_time)) / (24 * 60 * 60) AS R,count(user_id) AS F,  sum(price * amount) AS M
FROM   orders
GROUP BY user_id;


   这样就可以把每位用户的 RFM 值都计算出来了。



在这里插入图片描述



   刚才根据 R、F、M 维度表现的高与低,把用户分划分为 8 类,我们可以选择中位数作为区分高、低的依据。



   数据表 orders 共包含 21名用户数据。所以如果我们想获取中位数,查询语句需要写成 LIMIT 10, 1 由于21的中位数为 11, 因此 LIMIT 语句的第1个参数为 10,第2个参数为返回1行的结果,那就是中位数的值。



   获取 R 的中位数: 结果为32



SELECT (1704988800 - max(pay_time)) / (24 * 60 * 60) AS R
FROM   orders
GROUP BY user_id
ORDER BY R
LIMIT 10,1;


   获取 F 的中位数: 结果为3



SELECT count(user_id) AS F
FROM   orders
GROUP BY user_id
ORDER BY F
LIMIT 10,1;


   获取 M 的中位数: 结果为 36500



SELECT sum(price * amount) AS M
FROM   orders
GROUP BY user_id
ORDER BY M
LIMIT 10,1;


   接着,以如何获得 “新用户” 和 "流失用户"为例去继续编写语句分析。以上已经得出 R、F、M 的中位数。由于R(最近一次消费)的值越小,说明用户越活跃,因此低于 32 的被划分为 R 水平 高,反之为 R 水平 低。同理,我们可以得出 F 和 M 的划分方法, F:低于 3 为水平 低,反之为 高;M:低于 36500 为水平 低,反之为 高。



   HAVING 子句在用法上和 WHERE 子句非常相似,它们都能够根据指定条件筛选数据,也可以使用我们在 SELECT 子句中定义的字段别名。不同之处在于,WHERE 子句作用于原数据表,用来筛选 行;而 HAVING 子句作用于分组结果,用来筛选 分组。所以在编写语句时,必须区分好。



SELECT user_id  AS 用户ID,user_name AS 用户昵称,(1704988800 - max(pay_time)) / (24 * 60 * 60) AS R,count(user_id) AS F,  sum(price * amount) AS M
FROM   orders
GROUP BY user_id
HAVING R <=32AND F < 3AND M < 36500;


   得出"新用户" 数据表:



在这里插入图片描述



SELECT user_id  AS 用户ID,user_name AS 用户昵称,(1704988800 - max(pay_time)) / (24 * 60 * 60) AS R,count(user_id) AS F,  sum(price * amount) AS M
FROM   orders
GROUP BY user_id
HAVING R > 32AND F < 3AND M < 36500;


   得出"流失用户" 数据表:



在这里插入图片描述



   同理,其它6个维度的客户分析也是同样编写相对应的条件语句进行筛选。对于在众多的用户中如何可以快速、科学地分类,尤其前5个维度,对于每个商业行业有着重要的作用,也是掌握企业命运的风向标。

这篇关于如何利用SQL创建RFM用户分析模型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/609404

相关文章

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

SQL Server数据库死锁处理超详细攻略

《SQLServer数据库死锁处理超详细攻略》SQLServer作为主流数据库管理系统,在高并发场景下可能面临死锁问题,影响系统性能和稳定性,这篇文章主要给大家介绍了关于SQLServer数据库死... 目录一、引言二、查询 Sqlserver 中造成死锁的 SPID三、用内置函数查询执行信息1. sp_w

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

MySQL存储过程之循环遍历查询的结果集详解

《MySQL存储过程之循环遍历查询的结果集详解》:本文主要介绍MySQL存储过程之循环遍历查询的结果集,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言1. 表结构2. 存储过程3. 关于存储过程的SQL补充总结前言近来碰到这样一个问题:在生产上导入的数据发现

MySQL 衍生表(Derived Tables)的使用

《MySQL衍生表(DerivedTables)的使用》本文主要介绍了MySQL衍生表(DerivedTables)的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学... 目录一、衍生表简介1.1 衍生表基本用法1.2 自定义列名1.3 衍生表的局限在SQL的查询语句select

MySQL 横向衍生表(Lateral Derived Tables)的实现

《MySQL横向衍生表(LateralDerivedTables)的实现》横向衍生表适用于在需要通过子查询获取中间结果集的场景,相对于普通衍生表,横向衍生表可以引用在其之前出现过的表名,本文就来... 目录一、横向衍生表用法示例1.1 用法示例1.2 使用建议前面我们介绍过mysql中的衍生表(From子句

六个案例搞懂mysql间隙锁

《六个案例搞懂mysql间隙锁》MySQL中的间隙是指索引中两个索引键之间的空间,间隙锁用于防止范围查询期间的幻读,本文主要介绍了六个案例搞懂mysql间隙锁,具有一定的参考价值,感兴趣的可以了解一下... 目录概念解释间隙锁详解间隙锁触发条件间隙锁加锁规则案例演示案例一:唯一索引等值锁定存在的数据案例二:

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA