在用户增长分析中,"有效新用户"是一个关键指标,它通常指在一定时间内首次使用产品或服务,并满足特定活跃条件的用户。本篇文章将介绍如何在PowerBI中计算每个月的有效新用户。
问题描述
自行建模计算每个月的有效新用户,其中有效新用户的定义为:在本月连续登录不少于3天的新用户,要求如下:
1、基本要求:正确计算明细行的结果
2、进阶要求:确保总计正确
本案例初始数据只有单个表,其完整数据如下:
登录信息表:
user_id | log_time |
---|---|
1101 | 2025/2/9 0:00:00 |
1101 | 2025/2/10 0:00:00 |
1101 | 2025/2/11 0:00:00 |
1102 | 2025/2/9 0:00:00 |
1103 | 2025/2/18 0:00:00 |
1103 | 2025/2/19 0:00:00 |
1103 | 2025/2/20 0:00:00 |
1104 | 2025/2/1 0:00:00 |
1104 | 2025/2/10 0:00:00 |
1104 | 2025/3/3 0:00:00 |
1104 | 2025/3/4 0:00:00 |
1104 | 2025/3/5 0:00:00 |
1105 | 2025/3/8 0:00:00 |
1106 | 2025/3/9 0:00:00 |
1107 | 2025/3/20 0:00:00 |
1107 | 2025/3/21 0:00:00 |
1107 | 2025/3/22 0:00:00 |
1108 | 2025/3/11 0:00:00 |
1108 | 2025/3/18 0:00:00 |
1108 | 2025/3/19 0:00:00 |
1108 | 2025/3/20 0:00:00 |
1109 | 2025/3/29 0:00:00 |
1109 | 2025/3/30 0:00:00 |
1109 | 2025/3/31 0:00:00 |
若需其它辅助表等,可自行创建并建模。
解题要点
1、首先需要找出新用户,然后再从中找到满足活跃条件的有效新用户。
2、新用户的计算方法很多,本文采用的算法为:若某个用户是本月的新用户,那么该用户的首次登陆日期必定在本月中。
3、关于连续日期的计算要点,可以参考下表的分组字段:
日期 | 序号 | 分组(日期-序号) |
---|---|---|
2025/2/10 | 1 | 45697 |
2025/2/11 | 2 | 45697 |
2025/2/12 | 3 | 45697 |
2025/2/14 | 4 | 45698 |
2025/2/15 | 5 | 45698 |
2025/2/16 | 6 | 45698 |
2025/2/17 | 7 | 45698 |
2025/2/20 | 8 | 45700 |
2025/2/21 | 9 | 45700 |
解决方案
首先创建一个日期表,然后与登录信息表建立一对多关系,如下图所示:
所用到的度量值如下:
有效新用户 =
CALCULATE(
VAR AvailableCustomerEachMonth =
GENERATE(
VALUES('Calendar'[YearMonth]),
VAR N = 3
VAR NewCustomer = FILTER(ALL('登录信息表'[user_id]),FIRSTDATE('登录信息表'[log_time]) IN DATEADD('Calendar'[Date],0,DAY))
RETURN
FILTER(
NewCustomer,
VAR LogRecord = CALCULATETABLE(DISTINCT('登录信息表'),CROSSFILTER('登录信息表'[log_time],'Calendar'[Date],OneWay))
VAR Grp = ADDCOLUMNS(LogRecord,"Grp",'登录信息表'[log_time]-ROWNUMBER(LogRecord,ORDERBY('登录信息表'[log_time])))
RETURN
MAXX(SUMMARIZE(Grp,[Grp],"a",COUNT('登录信息表'[log_time])),[a])>=N
)
)
RETURN
IF(ISFILTERED('Calendar'[YearMonth]),
CONCATENATEX(AvailableCustomerEachMonth,'登录信息表'[user_id]," , "),
COUNTROWS(AvailableCustomerEachMonth)
),
CROSSFILTER('Calendar'[Date],'登录信息表'[log_time],None)
)
最后创建一个矩阵,并将日期表中的月份字段作为行标签,再将上面的度量值放入值字段即可,如下图所示:
总结
该案例的解决方案有很多,以上方法仅供参考,若有更优雅的解决方案,欢迎留言讨论~