DAX-流失用户计算

此文档为学习笔记,原课程为佐罗老师的Power BI 自动化用户运营分析

根据行为用户数据,计算流失用户

创建一张日期表(维度表):

_日期表 = ADDCOLUMNS (
CALENDAR ( date(2022,12,01),date(2023,01,31) )
,"年", YEAR ( [Date] )
,"月", MONTH ( [Date] )
)

_日期表:

Date
2022/12/1202212
2022/12/2202212
2022/12/3202212
2022/12/31202212
2023/1/120231
2023/1/220231
2023/1/320231
2023/1/3120231

创建一张用户行为表(事实表):

_用户行为 = 
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
1u0012022/12/01
2u0012022/12/15
3u0012023/01/02
1u0022023/01/06
3u0022023/01/07
2u0032023/01/01
3u0042023/01/15
1u0042023/01/16
3u0052023/01/11

_日期表和_用户行为表的关系是 :一对多关系

流失用户模型

流失用户的定义

  • 在t时长无任何有效行为
  • t时长前有过有效行为
  • 且t时常结束前恰好在[t1,t2]内
  • [t1,t2]内无有效行为,若存在有效行为,则必须晚于t时常在[t1,t2]中的结束点

如:
①已知用户U002有2次用户行为

用户行为key用户key日期key
1u0022023/01/06
3u0022023/01/07

②定义流失节点是:7天
2023/1/6的前7+1天(即:2022/12/29-2023/1/5)未发生有效行为,故流失用户要从2023/1/6后开始算起
PS:7+1=7天后开始算流失
2023/1/7的前7+1天(即:2022/12/30-2023/1/6)有发生有效行为2023/1/7的时间点是活跃用户节点,故流失用户又要从2023/1/7后开始算起
2023/1/7用户行为的后7+1天(即:2023/1/8-2023/1/15)未发生有效行为,那么流失用户的时间节点就是2023/1/15

日期key有过用户行为
2022/12/29-
-
2023/1/5-
2023/1/6
2023/1/7
-
2023/1/15流失时间节点

DAX表达式

以用户u002为例,时间到了2023/1/15

_user_lost_7 = 
//...][t1=days ...days ... t1-1][t1,t2][...
var days=7+1 
var t1=firstdate('_日期表'[date])   //2023/1/15
var t2=lastdate('_日期表'[date])   //2023/1/15
var filter_dates_t1t2=datesbetween('_日期表'[date],t1,t2) // 2023/1/15--2023/1/15
var filter_dates_for_maybe_lost=datesbetween('_日期表'[date],t1 - days,t1 - 1) //可能会流失的时间点:2023/1/7--2023/1/14
var users_maybe_lost=calculatetable(values('_用户行为'[用户key]),filter_dates_for_maybe_lost) //可能会流失的用户  2023/1/7时的u002

var user_lost=filter(
    //从可能会流失的用户中筛选:
    
    users_maybe_lost,//可能会流失的用户
    
    var user=calculatetable(values('_用户行为'[用户key]),all('_日期表')) //用户表  
    
	//在可能会流失的用户中,最近一次有用户行为的时间点:2023/1/7
    var user_last_point_in_days=calculate(lastdate('_用户行为'[日期key]),filter_dates_for_maybe_lost,user)  
   
    //最终流失的时间点=最近一次有用户行为的时间+(7+1):2023/1/15
    var user_lost_point_in_t1t2=user_last_point_in_days + days   
    
    //取用户在当前时间内首次用户行为:无
    var user_first_point_in_t1t2=calculate(firstdate('_用户行为'[日期key]),filter_dates_t1t2,user)  //无
	
	//如果最终流失的时间点在当前时间区间内,且用户在当前时间内首次行为时间为空 或 晚于 最终流失的时间点,则算为流失
    return 
        (user_lost_point_in_t1t2>=t1 && user_lost_point_in_t1t2<=t2) &&
        (user_first_point_in_t1t2 =blank() || user_first_point_in_t1t2 > user_lost_point_in_t1t2)
)
return countrows(user_lost)

下图所示:u002的用户行为时间点及流失时间点
在这里插入图片描述

使用参数

①新建参数表

_参数_流失天数_阈值_ = 
var tb=GENERATESERIES(1,60,1)
return SELECTCOLUMNS(tb,"param",[Value])

参数_流失天数_阈值:

param
1
2
3
60

②新建度量值
SELECTEDVALUE返回_参数_流失天数_阈值_[param]唯一引用值,默认值是7
_参数_流失天数_阈值_ = SELECTEDVALUE('_参数_流失天数_阈值_'[param],7)

③流失用户的DAX表达式:

_user_lost_7 = 
//...][t1=days ...days ... t1-1][t1,t2][...
var days=[_参数_流失天数_阈值_] + 1  //引用参数
var t1=firstdate('_日期表'[date])   //2023/1/15
var t2=lastdate('_日期表'[date])   //2023/1/15
var filter_dates_t1t2=datesbetween('_日期表'[date],t1,t2) // 2023/1/15--2023/1/15
var filter_dates_for_maybe_lost=datesbetween('_日期表'[date],t1 - days,t1 - 1) //可能会流失的时间点:2023/1/7--2023/1/14
var users_maybe_lost=calculatetable(values('_用户行为'[用户key]),filter_dates_for_maybe_lost) //可能会流失的用户  2023/1/7时的u002

var user_lost=filter(
    //从可能会流失的用户中筛选:
    
    users_maybe_lost,//可能会流失的用户
    
    var user=calculatetable(values('_用户行为'[用户key]),all('_日期表')) //用户表  
    
	//在可能会流失的用户中,最近一次有用户行为的时间点:2023/1/7
    var user_last_point_in_days=calculate(lastdate('_用户行为'[日期key]),filter_dates_for_maybe_lost,user)  
   
    //最终流失的时间点=最近一次有用户行为的时间+(7+1):2023/1/15
    var user_lost_point_in_t1t2=user_last_point_in_days + days   
    
    //取用户在当前时间内首次用户行为:无
    var user_first_point_in_t1t2=calculate(firstdate('_用户行为'[日期key]),filter_dates_t1t2,user)  //无
	
	//如果最终流失的时间点在当前时间区间内,且用户在当前时间内首次行为时间为空 或 晚于 最终流失的时间点,则算为流失
    return 
        (user_lost_point_in_t1t2>=t1 && user_lost_point_in_t1t2<=t2) &&
        (user_first_point_in_t1t2 =blank() || user_first_point_in_t1t2 > user_lost_point_in_t1t2)
)
return countrows(user_lost)

下图所示:当参数选择15天,那么流失点是2023/1/23
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jackie_Mina

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值