暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

SQL之计算DNU、DAU、WAU以及MAU

数分小白龙 2021-11-03
5306
在数据分析日常工作中,基本上都会或多或少涉及用户研究,而用户研究必然离不开新增、活跃、留存、流失以及回流等用户指标。作为一名数据分析小小白,之前也只是在网上偶尔看到过这些术语,但是没有深入研究,主要因为缺乏特定的业务场景。在最近实习工作中,也开始慢慢接触到这些需求,于是我就写篇文章记录记录学习心得,分享下实际工作中如何使用SQL/Hive来计算这些指标。

本文先主要讲解新增用户和活跃用户共4个指标的计算方法,写代码之前呢,我们要明确新增和活跃的定义是什么?什么是新增用户,什么是活跃用户?DNU、WNU、MNU、DAU、WAU以及MAU又分别代表了什么呢?

新增用户:定义很简单,就是之前从未注册登陆过我们的网站,现在注册并登录使用的用户,可以按照日期来划分为日新增用户(DNU)周新增用户(WNU)以及月新增用户(MNU)

用户活跃:首先给出"活跃"行为定义,如登录一次、登录并有操作行为、访问时长超过10分钟、消费1次等等,之后用户每次做出活跃行为,即记录为:活跃一次。按照日期可以划分为日活(DAU)周活(WAU)以及月活(MAU)等;本文的活跃定义主要以用户登录一次为准。




好了,知道了新增和活跃两者的定义后,下面我们就来实现把。为了方便起见,我们这里的表只需要两个字段,一个是用户每天操作的日期 -- createdate,一个是用户的唯一标识符 -- unionid;大概样式如下:

createdateunionid
2021-11-03 10:00:00
Th4ng7StzSaN4CVt2IoMxj6k

首先是日新增用户Daily New User,缩写DNU,指首次注册并登录的去重用户数;在公司的用户访问日志表里,从用户注册、登录、浏览、点击等等操作都会自动被后台收取到日志表里,所以我们想要在这一个大宽表里找到每天的新增用户数,应该怎么查呢?很简单,我们只需要查找每个用户访问时的最小日期就是该用户的注册日期。

-- 2. 再根据第一次访问日期分组, 然后去重, 就可以得到DNU了
select first_date, count(distinct unionid) DNU
from
( -- 1. 先找到每个用户第一次访问日期
  select unionid, min(to_date(createdate)) first_date
  from table a
  group by unionid
) b
group by first_date;
复制

下一个我们来看一下日活、周活以及月活用户数如何计算?这三个的区别主要在于时间的范围不一样,日活主要以每日作为分组依据,周活以周作为分组依据,月活就是以月作为分组依据。


DAU:Daily Active User,日活跃用户。指历史注册登录的用户,在注册日之后,又登录了我们的产品/平台,则这类用户就是日活,即DAU。日活的计算是最简单的,只需要根据用户登录日期来进行去重计数,即可得到每日用户活跃数。


select to_date(partition_date) createdate, count(distinct unionid) DAU
from table a
group by to_date(partition_date);
复制


WAU:Weekly Active Users,周活跃用户,是表示七天内登陆过产品的用户数(去除重复登录的用户)。周活相对于日活来说,最难的地方可能就在于如何来确定每一天都是哪个周,这周是几号到几号,明确了每一周之后,再根据周来分组,就可以得到周活了(WAU)。

select date_range, week, count(distinct unionid) WAU
FROM
(
select to_date(createdate) createdate, weekofyear(to_date(createdate)) week,
concat_ws('__',
min(to_date(createdate)) over(partition by weekofyear(to_date(createdate))),
max(to_date(createdate)) over(partition by weekofyear(to_date(createdate)))
) date_range,
unionid
    from table a
) b
group by week, date_range;
复制

MAU:Month Active Users,月活跃用户,是表示每个月登陆过产品的用户数(去除重复登录的用户)。月活相对于日活来说,只需要将日期修改下格式,以月为最小单位,这里就需要用到date_format()函数。

select DATE_FORMAT(to_date(partition_date),"yyyy-MM") ym_date, count(distinct unionid) MAU
FROM table
group by DATE_FORMAT(to_date(partition_date),"yyyy-MM");
复制

好了,以上就是本文分享的内容,下一篇将会分享下留存和流失相关指标的SQL计算方法,相对于本文难度会上升一些。


END

作者:龙小仔




参考文章

DAU,WAU,MAU分析活跃以及留存用户

http://www.jiangwenseo.com/operating/825.html

用户活跃、留存、流失,终于讲清楚了!

https://cloud.tencent.com/developer/news/645667

画说日活、新增、留存、回流及其关系模型

https://www.jianshu.com/p/3018da7b29cb 

什么是新增用户、活跃用户、留存用户?

https://cloud.tencent.com/developer/article/1513585








文章转载自数分小白龙,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论