如何利用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

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

TP-Link PDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务

《TP-LinkPDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务》近期,路由器制造巨头普联(TP-Link)在用户群体中引发了一系列重要变动,上个月,公司发出了一则通知,明确要求所... 路由器厂商普联(TP-Link)上个月发布公告要求所有用户必须完成实名认证后才能继续使用普联提供的 D

Python创建Excel的4种方式小结

《Python创建Excel的4种方式小结》这篇文章主要为大家详细介绍了Python中创建Excel的4种常见方式,文中的示例代码简洁易懂,具有一定的参考价值,感兴趣的小伙伴可以学习一下... 目录库的安装代码1——pandas代码2——openpyxl代码3——xlsxwriterwww.cppcns.c

轻松上手MYSQL之JSON函数实现高效数据查询与操作

《轻松上手MYSQL之JSON函数实现高效数据查询与操作》:本文主要介绍轻松上手MYSQL之JSON函数实现高效数据查询与操作的相关资料,MySQL提供了多个JSON函数,用于处理和查询JSON数... 目录一、jsON_EXTRACT 提取指定数据二、JSON_UNQUOTE 取消双引号三、JSON_KE

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误