目录
- [0 前言](#0 前言)
- [1 目标](#1 目标)
- [2 基本概念](#2 基本概念)
-
- [2.1 RFM模型是什么](#2.1 RFM模型是什么)
- [2.2 RFM模型作用](#2.2 RFM模型作用)
- [2.3 典型的使用案例](#2.3 典型的使用案例)
- [2.4 RFM模型如何起作用](#2.4 RFM模型如何起作用)
-
- [2.4.1 提取R、F、M三个指标](#2.4.1 提取R、F、M三个指标)
- [2.4.2 对用户分级](#2.4.2 对用户分级)
- [2.4.3 联合 R+F+M 得到客户分群](#2.4.3 联合 R+F+M 得到客户分群)
- [2.4.4 可视化(可选)](#2.4.4 可视化(可选))
- [3 实操](#3 实操)
-
- [3.1 新建 Customer 表(用户表)](#3.1 新建 Customer 表(用户表))
-
- [3.1.1 用到的DAX表达式](#3.1.1 用到的DAX表达式)
-
- [FILTE()](#FILTE())
- RANKX()
- CEILING()
- TRUE-SWITCH()
- [3.1.2 新建 R_Value 列](#3.1.2 新建 R_Value 列)
- [3.1.3 新建 R_Rank 列](#3.1.3 新建 R_Rank 列)
- [3.1.4 新建 R_Score 列](#3.1.4 新建 R_Score 列)
- [3.1.5 新建 F_Value 列](#3.1.5 新建 F_Value 列)
- [3.1.6 新建 F_Rank 列](#3.1.6 新建 F_Rank 列)
- [3.1.7 新建 F_Score 列](#3.1.7 新建 F_Score 列)
- [3.1.8 新建 M_Value 列](#3.1.8 新建 M_Value 列)
- [3.1.9 新建 M_Rank 列](#3.1.9 新建 M_Rank 列)
- [3.1.10 新建 M_Score 列](#3.1.10 新建 M_Score 列)
- [3.1.11 新建 RFM_Score 列](#3.1.11 新建 RFM_Score 列)
- [3.1.12 新建 CustomerSegment 列](#3.1.12 新建 CustomerSegment 列)
- [3.1.13 完整 Customer 表](#3.1.13 完整 Customer 表)
- [3.2 Customer 表与 Orders 表建立关系](#3.2 Customer 表与 Orders 表建立关系)
- [3.3 可视化](#3.3 可视化)
-
- [3.3.1 用户分群饼状图](#3.3.1 用户分群饼状图)
- [3.3.2 用户分群分解树](#3.3.2 用户分群分解树)
- [3.3.3 用户分群树状图](#3.3.3 用户分群树状图)
- [3.3.4 客户增长趋势图](#3.3.4 客户增长趋势图)
- [4 后记](#4 后记)
0 前言
恭喜宿主完成第一关的任务,接下来来到第二关吧。实话实说,咱这游戏太有技术含量了。
第二关您获得的宝藏是对用户进行分群,获得高价值用户、潜在用户、流动风险用户,有了这些用户分群,我们可以对用户采取更好地营销策略,让我们和用户在金钱和服务上实现一个双赢。
附带大礼包:饼图、分解树、树状图、增长趋势图的可视化。
那让我们开始第二关的旅程叭~
1 目标
【页面 2:客户分析(RFM 模型)】
最近消费(Recency)
购买频率(Frequency)
消费金额(Monetary)
客户分群(高价值、保持、流失风险、潜力客户)
可视化:客户增长趋势图、分解树、树状图、饼图
2 基本概念
既然要使用RFM模型进行客户分析,我们先来了解一下什么是RFM模型?有什么作用,如何起作用。
2.1 RFM模型是什么
RFM模型是一种评估用户价值和用户行为的模型,常常用于数据分析和PowerBI BI项目。适用于电子商务、会员管理、客户价值分析等场合。
**R(Recency)**最近一次购买、消费距今天;**F(Frequency)**消费频率;**M(Monetary)**消费金额。
2.2 RFM模型作用
知道一个东西有什么作用,我们才能清晰地知道在什么场景发挥它最大的优势,这一点是很重要的。
谁是最有价值的客户?
哪些客户正在流失?
哪些客户值得重点维护或召回?
如何制定精准营销策略?
2.3 典型的使用案例
精准营销(不同客户群发不同活动)
客户生命周期分析
VIP客户识别
流失客户预测
提高复购率和客户沾性
2.4 RFM模型如何起作用
2.4.1 提取R、F、M三个指标
R(Recency):最近一次购买、消费距今天
bash
R = 今天日期 - 客户最近一次购买日期
数值越小,客户越活跃
F(Frequency):消费频率
bash
F = 某时间段客户消费次数
M(Monetary):消费金额
bash
M = 某时间段客户总消费金额
2.4.2 对用户分级
根据R、F、M分别给客户评分(五分制或者十分制),使用百分位分组的方法,如P20,P40,P60,P80。高=5,低=1。
百分位数的五分制就是将100分成五段,第一段是0-20;第二段是21-40;第三段是41-60;第四段是61-80;第五段是81-100,落在那一段就给它赋一个分,这样就很好理解了。
举个例子:
R = 5表示最近刚买,非常活跃
F = 5表示购买频繁
M = 5表示购买金额高、贡献大
2.4.3 联合 R+F+M 得到客户分群
| R | F | M | 客户价值 |
|---|---|---|---|
| 5 | 5 | 5 | 最佳用户 Best Customer |
| 5 | 1 | 1 | 新客户 New Customer |
| 1 | 5 | 5 | 忠诚但可能将流失 |
| 1 | 1 | 1 | 低价值客户 |
2.4.4 可视化(可选)
- R/F/M三个KPI卡片
- R vs F散点图(气泡大小表示M)
- 9 分群或者 16 分群热力图
- 客户价值分类条形图
- 客户增长趋势图
在我们的项目中会进行几个可视化图片,其余的感兴趣的话评论区留言,我来实操实操,对了我感觉 9 分群和 16 分群还挺有意思的,对用户分群会更加详细一些些。
3 实操
3.1 新建 Customer 表(用户表)
既然我们要对用户分群,建立一个用户表是非常方便我们在用户维度进行操作的。

后面操作的时候发现表格名字写错了,后来修改过来啦,这都是小问题哈,方面修改,但操作过程中,宝贝们注意一下哟~
bash
Customer = DISTINCT(Orders[Customer ID])
这里的
DISTINCT表示唯一的,可能一个用户有多个订单,但我们只唯一的要一个数量作为主键,在Customer表格中标识用户
我们的目标是建立RFM模型就需要对各个内容新建列,方面后面的可视化。
3.1.1 用到的DAX表达式
FILTE()
FILTER() 过滤器,通过 FILTER,PBI 只展示符合条件的数据。
RANKX()
RANKX()用来对表中的每一个值,按照某个指标做排名,ASC就是从低到高,DESC就是从高到低。
RANKX()语法:
bash
RANKX(
<table>,
<expression>,
[<value>],
[<order>],
[<ties>]
)
table:排名的对象集合,如 ALL(Customer)
expression:用来排名的度量,如 Total Sales
value:可选,用于特殊情况,一般不用
order:排序方式:DESC(默认)=最大排第一,ASC = 最小排第一
ties:同分时的规则:SKIP 或 DENSE
其中
[]表示可选,可填写可不填写,但如果不填写,就要打个,隔开哟。
table ,排名的对象集合,这里要十分注意,如 ALL(Customer),这里的 ALL 就移除了所有的过滤条件,是对所有的Customer进行排名。
下面详细介绍一下SKIP 或 DENSE 这两个参数
| 产品 | 销售额 |
|---|---|
| A | 100 |
| B | 90 |
| C | 90 |
- SKIP(跳过):排名结果:1,2, 2, 4
可以看出都是 90 分,出现两个 2,把 3 跳过了。 - DENSE(密集):排名结果:1,2, 2, 3
不会跳过数字(推荐使用)
常用情景:
RMF 分群→ DENSE
Top N 产品分析→ DENSE
需要真实排名(比赛排名)→ SKIP
CEILING()
CEILING()向上取整数,比如 4.5 我们把他取整为 5
TRUE-SWITCH()
bash
SWITCH(
TRUE(),
condition1, result1,
condition2, result2,
condition3, result3,
default
)
有了这个 TRUE(),那么能够确保每一个条件都执行,他的执行逻辑是从上到下的顺序,满足哪一个就立刻返回哪一个值,都不满足就执行 default 语句。
3.1.2 新建 R_Value 列

这里给出 R_Value 的 DAX 代码
bash
R_Value =
VAR LastOrderDate =
CALCULATE(
MAX(Orders[Order Date]),
FILTER(Orders, Orders[Customer ID] = Customer[Customer ID])
)
RETURN
DATEDIFF(LastOrderDate, TODAY(), DAY)
3.1.3 新建 R_Rank 列

这里给出 R_Rank 的 DAX 代码
bash
R_Rank =
RANKX(
ALL(Customer),
Customer[R_Value],
,
ASC, -- 数值越小越好
Dense
)

3.1.4 新建 R_Score 列
这里给出 R_Score 的 DAX 代码
bash
R_Score =
VAR totalCustomers = COUNTROWS(ALL(Customer))
VAR r_rank = Customer[R_Rank]
VAR quintile =
CEILING( r_rank * 5.0 / totalCustomers, 1 ) -- 1~5,1=最好
RETURN
5 - quintile + 1 -- 反转:1变5,2变4...
- 这段代码的作用,是将 R_Rank 映射到 1-5 当中
- COUNTROWS 表示计数,总共有多少行
- RETURN 5 - quintile + 1:这里是为了反转分数,quintile = 1,那么score = 5,因为 Recency 越小越好,表示最近刚消费。
- 这里 r_rank 为什么要
×5呢,是因为,我们需要把这些数据放到五个区间里面,五分制。
如果 4 分群,就×4;16分群则×16。
3.1.5 新建 F_Value 列
这里给出 F_Value 的 DAX 代码
bash
F_Value =
CALCULATE(
COUNTROWS(Orders),
FILTER(Orders, Orders[Customer ID] = Customer[Customer ID])
)
3.1.6 新建 F_Rank 列
这里给出 F_Rank 的 DAX 代码
bash
F_Rank =
RANKX(
ALL(Customer),
Customer[F_Value],
,
DESC, -- 越大越好
Dense
)
3.1.7 新建 F_Score 列
这里给出 F_Score 的 DAX 代码
bash
F_Score =
VAR totalCustomers = COUNTROWS(ALL(Customer))
VAR f_rank = Customer[F_Rank]
RETURN CEILING(f_rank * 5.0 / totalCustomers, 1)
3.1.8 新建 M_Value 列
这里给出 M_Value 的 DAX 代码
bash
M_Value =
CALCULATE(
SUM(Orders[Sales]),
FILTER(Orders, Orders[Customer ID] = Customer[Customer ID])
)
3.1.9 新建 M_Rank 列
这里给出 M_Rank 的 DAX 代码
bash
M_Rank =
RANKX(
ALL(Customer),
Customer[M_Value],
,
DESC,
Dense
)
3.1.10 新建 M_Score 列
这里给出 M_Score 的 DAX 代码
bash
M_Score =
VAR totalCustomers = COUNTROWS(ALL(Customer))
VAR m_rank = Customer[M_Rank]
RETURN CEILING(m_rank * 5.0 / totalCustomers, 1)
3.1.11 新建 RFM_Score 列
以上所有的步骤,都是为了计算 RFM_Score 。
这里给出 RFM_Score 的 DAX 代码
bash
RFM_Score =
Customer[R_Score] + Customer[F_Score] + Customer[M_Score]
3.1.12 新建 CustomerSegment 列
得到了 RFM_Score ,我们就需要根据分数,对用户进行分群。CustomerSegment 就是用户分群的意思。
这里给了一个分群指标,在实际案例中,根据实际项目指标进行分群指标设置。
bash
CustomerSegment =
VAR score = Customer[RFM_Score]
RETURN
SWITCH(
TRUE(),
score >= 13, "高价值客户",
score >= 10, "保持客户",
score >= 7, "潜力客户",
"流失风险客户"
)
RFM_Score 分数 >= 13,我们将其定义为 高价值客户;10 <= RFM_Score 分数 < 13,我们将其定义为 保持客户;7 <= RFM_Score 分数 < 10,我们将其定义为 潜力客户;1 <= RFM_Score 分数 < 7,我们将其定义为 流失风险客户;
3.1.13 完整 Customer 表
以上列全部创建完后的完整 Customer 表,见下图。

3.2 Customer 表与 Orders 表建立关系
这里是重点,表与表之间只有建立关系,才能多表联合作业,只有单个的表操作简单,但在实际生产中作用不大。
这里需要再一次注意的点,关系的方向和值要正确,这一点很重要。
一个 Customer 表中的 Customer ID 对应 Orders 表格中的多个 Orders ID,多个 Orders 表格中的 Orders ID 对应 Customer 表中的一个 Customer ID。
举例子:结合实际情况来理解的话,就是一个用户会有一个或者多个订单;一个或多个订单属于一个人。

成功建立关系,如下图所示,Customer 表与 Orders 表之间有一条连线,且数值是1对多,从这里也可以确认关系是否正确。

3.3 可视化
可视化是为了直观明了的看数据,为我们后续经营方式决策打了坚实的基础。
3.3.1 用户分群饼状图
操作方法很简单


3.3.2 用户分群分解树
这个分解树就稍稍有一些不同,要注意点击 + 并且选择用 CustomerSegment 展开。



3.3.3 用户分群树状图


3.3.4 客户增长趋势图
这里有点需要操作的东西,既然要用到用户增长,我们就需要知道谁是新用户。
这里给出 FirstPurchaseDate (第一次购买日期)的DAX代码
bash
FirstPurchaseDate =
CALCULATE(
MIN(Orders[Order Date]),
FILTER(
Orders,
Orders[Customer ID] = Customer[Customer ID]
)
)

这里给出 New Customers (新用户)度量值的DAX代码
bash
New Customers =
VAR SelectedMonth =
MAX(DateTable[Date])
RETURN
CALCULATE(
DISTINCTCOUNT(Customer[Customer ID]),
FILTER(
Customer,
Customer[FirstPurchaseDate] >= DATE(YEAR(SelectedMonth), MONTH(SelectedMonth), 1)
&& Customer[FirstPurchaseDate] < EOMONTH(SelectedMonth, 0) + 1
)
)



大家还可以自己尝试一下将x轴换成 年、月、日、季度 分开的这样子。
记得保存!!!
记得保存!!
记得保存!
okay!到这里就恭喜各位宝贝们,掌握了RFM模型、在PBI上实现了这个模型以及可视化,哇塞,你简直就是最棒的宝贝~
4 后记
如果有用的话,记得给我点赞点赞~关注我也行啊,好久没涨粉了,oh my god!
还有两个页面展示,咱们就把PBI数据分析项目实战完成了,胜利指日可待啊。
要和室友去广州潮汕履行,不得不说大家订酒店的速度超出了我的预期,酒店价格微微上涨,我们以迅雷不及掩耳之势火速预定,已经成功了。
干任何事情都能学到东西,好的事情要干,不好的事情千万不干,会对我们的精神灵魂造成污染,有些书啊视频啊,能不看还是别看,潜移默化会影响我们。
订酒店要注意距离景点的位置、是不是临街吵不吵闹、酒店干不干净,酒店面积大不大,像我们两个人,至少要20平方米,不然很不方便,还有房间有没有窗户,这都是需要考虑的,这就要多看看评论,小red书等等,多方收集信息。
我这方面能力真心不错,之前去南昌旅游,酒店我定的,获得室友好评!!!我简直是最棒的小羊。
高中一个男同学约我爬山,看来要放他鸽子了,对不起啰~
如果有用的话,记得给我点赞点赞~