此文档为学习笔记,原课程为佐罗老师的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 |
_日期表和_用户行为表的关系是 :一对多关系
求:新用户计算
计算1-时间点算法
用户行为时间在某时间范围内的,则算新用户
_new_1 = //...][t1,t2][...
var t1=min('_日期表'[Date]) //最早的时间
var t2=max('_日期表'[Date]) //最近的时间
var users_current=values('_用户行为'[用户key]) //用户集
var user_new=filter(
users_current,
var first_point=calculate(min('_用户行为'[日期key]),all('_日期表')) //取首次行为时间
return first_point >=t1 && first_point<=t2 //首次行为时间在区间内,则返回对应用户
)
return COUNTROWS(user_new)
计算2-集合的算法
指定新用户的时间,用户行为早于指定时间的就算做老用户,用户集-老用户集=新用户
_new_2 =
var users_current=values('_用户行为'[用户KEY]) //用户集
var t1=min('_日期表'[Date]) //指定新用户的时间
var users_before_t1=calculatetable(values('_用户行为'[用户KEY]),'_日期表'[Date]<t1) //早于新用户时间的老用户集
var user_new=except(users_current,users_before_t1)//用户集-老用户
return countrows(user_new)
计算2,以区间来计算
_new_3 =
var t1=min('_日期表'[Date]) //取最早时间
var t2=max('_日期表'[Date]) //取最近时间
var t1t2=DATESBETWEEN('_日期表'[Date],t1,t2)//返回区间
var t0t1=DATESBETWEEN('_日期表'[Date],0, t1 -1)//从最开始-指定最早时间的前一天=返回老用户时间的区间
var user_t1t2=CALCULATETABLE(values('_用户行为'[用户key]),t1t2)//返回用户集
var user_t0t1=CALCULATETABLE(values('_用户行为'[用户key]),t0t1)//返回老用户集
var user_new=EXCEPT(user_t1t2,user_t0t1) //用户集-老用户
return countrows(user_new)
计算3-表达式嵌套的算法
当前用户在最早日期前有无用户行为,如果无,则说明是新用户
_new_4 =
COUNTROWS(
filter(
//如果行为次数=0,说明是新用户
ADDCOLUMNS(
//取:当前用于在指定时间的最早日期前的行为次数
values('_用户行为'[用户key]),//当前用户
"times",//表达式命名
calculate(
countrows('_用户行为'),
filter(all('_日期表'[Date]),'_日期表'[Date]<min('_日期表'[Date]))
)
),
[times]=0)
)
最后,可以使用DAX studio 来评估性能
此案例数据量较小,故在此不评判3种算法的性能问题
求:新用户标签
在用户行为表上,给满足条件的用户打上新用户
标签
_new_tag =
var current_user=selectedvalue('_用户行为'[用户key])
var current_date=selectedvalue('_用户行为'[日期key])
return if(sumx(filter(all('_用户行为'),'_用户行为'[用户key]=current_user && '_用户行为'[日期key]<current_date),'_用户行为'[日期key])>0,"老","新")