此文档为学习笔记,原课程为佐罗老师的Power BI 自动化用户运营分析
根据行为用户数据,计算复活用户
创建一张日期表(维度表):
_日期表 = ADDCOLUMNS (
CALENDAR ( date(2022,12,01),date(2023,01,31) )
,"年", YEAR ( [Date] )
,"月", MONTH ( [Date] )
)
_日期表:
Date | 年 | 月 |
---|---|---|
2022/12/1 | 2022 | 12 |
2022/12/2 | 2022 | 12 |
2022/12/3 | 2022 | 12 |
… | … | … |
2022/12/31 | 2022 | 12 |
2023/1/1 | 2023 | 1 |
2023/1/2 | 2023 | 1 |
2023/1/3 | 2023 | 1 |
… | … | … |
2023/1/31 | 2023 | 1 |
创建一张用户行为表(事实表):
_用户行为 =
var tb={
(1,"u001","2022/12/01"),
(2,"u001","2022/12/15"),
(3,"u001","2023/01/02"),
(1,"u002","2023/01/06"),
(3,"u002","2023/01/07"),
(2,"u003","2023/01/01"),
(3,"u004","2023/01/15"),
(1,"u004","2023/01/16"),
(3,"u005","2023/01/11")
}
return selectcolumns(tb,"用户行为key",[Value1],"用户key",[Value2],"日期key",[Value3])
_用户行为:
用户行为key | 用户key | 日期key |
---|---|---|
1 | u001 | 2022/12/01 |
2 | u001 | 2022/12/15 |
3 | u001 | 2023/01/02 |
1 | u002 | 2023/01/06 |
3 | u002 | 2023/01/07 |
2 | u003 | 2023/01/01 |
3 | u004 | 2023/01/15 |
1 | u004 | 2023/01/16 |
3 | u005 | 2023/01/11 |
_日期表和_用户行为表的关系是 :一对多关系
复活用户模型
复活用户的定义
- 有过访问,后来流失了,流失后又有访问,即该用户复活
- 最后一次访问在[t1,t2]左边
- 考虑流失时长,在流失时长范围内无任何访问
- [t1,t2]内发生访问,且访问点晚于流失点
如:
1/已知用户U001有3次用户行为
用户行为key | 用户key | 日期key |
---|---|---|
1 | u001 | 2022/12/01 |
2 | u001 | 2022/12/15 |
3 | u001 | 2023/01/02 |
2/指定流失阈值为7
天
3/2022/12/1~~2022/12/15
中:
①2022/12/15是否是复活点?,即2022/12/15
为[t1,t2]
②在2022/12/15前的最后一次访问是2022/12/1,即:最后一次访问在[t1,t2]左边
③2022/12/1后7+1天(2022/12/2-2022/12/9),未发生有效行为
,即:考虑流失时长,在流失时长范围内无任何访问,且流失点就是2022/12/9
④2022/12/15有过用户行为,即:[t1,t2]内发生访问,且访问点晚于流失点
⑤满足以上条件,那么2022/12/15就是复活点
日期key | 有过用户行为 | 备注 |
---|---|---|
2022/12/1 | ✔ | 新用户节点 |
… | - | - |
2022/12/9 | - | 流失点 |
… | - | - |
2022/12/15 | ✔ | 复活点 |
… | - | - |
2022/12/23 | - | 流失点 |
… | - | - |
2023/1/2 | ✔ | 复活点 |
DAX表达式
以用户u001为例,时间到了2022/12/15
_users_lost_recovery =
// ...][t1,t2][...
var days=7 + 1 //流失阈值
var t1=min('_日期表'[Date]) //当前日期 2022/12/15
var dates_filter_t1_before=DATESBETWEEN('_日期表'[Date],blank(),t1-1) //...~~2022/12/14
var users_current=values('_用户行为'[用户KEY]) //用户表
var users_recovery=filter(
users_current,
var last_point_before_t1=calculate(max('_用户行为'[日期KEY]),dates_filter_t1_before) //当前日期前最后一次的用户行为 2022/12/1
var first_point_in_t1t2=calculate(min ('_用户行为'[日期KEY])) // 最近一次用户行为 2022/12/15
// 如果最后一次的用户行为不为空(说明在此之前有过访问) 且 后7+1天的 时间点 早于 当前日期(当前有访问),则当前日期算复活
// 即:在此之前有过访问,且之前那次的访问 至 当前这段时间里,用户流失了,而当前又有访问了,那么当前这次算复活
return last_point_before_t1<>blank() &&
last_point_before_t1 +days < first_point_in_t1t2
)
return countrows(users_recovery)
下图所示:u001的用户行为时间点复活时间点