Dir*_*irk 8 android firebase firebase-analytics
我想了解是否有更好的报告对当前火力地堡“活动”用户统计报告(如下图图)一个月比一个月,或者更确切地说,自计算并报告平均在一个特定的每个指标的值的时期。
乍一看,仪表板显示了 2018 年 12 月的 1 天、7 天和 28 天活跃用户,但实际上仅显示所选日期范围值的最后一天(在对)。很高兴知道这一点,但在我的逐月分析中只比较最后一个日期的值有点误导。另一种方法是自行计算所选期间的平均值:
应用于 Firebase Demo 数据集,我得到以下数字:
Firebase 仪表板:
我的计算平均值:
这里的增量差异很小,但我发现我们的应用程序有一些显着差异,每月有数百万活跃用户。
题:
为了回答这个问题,我想先回顾一下谷歌的适用定义,然后再进行计算(上次回顾:2021 年 7 月)。
谷歌给了我们以下定义:
session_start (app, web) - 当用户使用应用程序或网站时user_engagement (app, web) - 定期,当应用程序处于前台或网页处于焦点时使用参数:engagement_time_msecSessions:在您的网站或应用程序上开始的会话数(触发 session_start 事件)。App session timeout duration:当应用程序移至后台时,应用程序会话开始超时,但您可以选择通过在应用程序处于后台时发送的事件包含 extend_session 参数(值为 1)来扩展该会话。如果您的应用程序经常在后台使用(例如导航和音乐应用程序),这将非常有用。通过setSessionTimeoutDuration方法更改应用程序会话的默认超时 30 分钟。Engaged sessions:持续 10 秒或更长时间,或具有 1 个或更多转化事件或 2 个或更多页面浏览量的会话数。Monthly (28-day), Weekly (7-day), and Daily (1-day) Active Users日期范围,包括与上一个日期范围相比的百分比波动。活跃用户在设备前台与应用程序互动,并记录了 user_engagement 事件。Daily user engagement - 该日期范围内每位用户的平均每日参与度,包括与上一个日期范围相比的百分比波动。我对定义的看法:
根据支持的 GA4/Firebase 文档,我(重新)总结了以下每个指标的定义。非常重要的一点是,在每个指标(给定选定的日期范围内)上只计算唯一身份用户,这一点非常重要。不需要,UNNEST因为我们已经在 -event_name级别查询,而不是 -event_parameter级别。
user_engagement在过去 1 天内(给定所选日期范围)内记录了事件。user_engagement过去的7天期间(给定的选择的日期范围)内的事件。user_engagement过去28天期间(给定的选择的日期范围)内的事件。在下面的单元格中,您可以看到如何计算 12 月的指标:
计算每个指标/受众的方法:
Average 1-day active user metric。Average 7-day active user metric。我通过对 12 月 7 日、14 日、21 日、28 日的快照进行平均来计算出这一点。Non-averaged 28-day active user metric。不平均这个指标的值的主要原因是,因为我只想拥有整个月的一个快照。如果我在这里使用平均值,我还会考虑上个月活跃的用户。1.a) 平均 1 天唯一活跃用户指标
# StandardSQL
SELECT
ROUND(AVG(users),0) AS users
FROM
(
SELECT
event_date,
COUNT(DISTINCT user_pseudo_id) AS users
FROM `<id>.events_*`
WHERE
event_name = 'user_engagement'
AND _TABLE_SUFFIX BETWEEN '20181201' AND '20181231'
AND platform = "ANDROID"
GROUP BY 1
) table
# or you could also use code below, but you will have to add in the remaining days' code to query against the entire month.
-- Set your variables here
WITH timeframe AS (SELECT DATE("2018-12-01") AS start_date, DATE("2018-12-31") AS end_date)
-- Query your variables here
SELECT ROUND(AVG(users),0) AS users
FROM
(
SELECT event_date, COUNT(DISTINCT user_pseudo_id) AS users
FROM `<id>.events_*`AS z, timeframe AS t
WHERE
event_name = 'user_engagement'
AND _TABLE_SUFFIX > FORMAT_DATE('%Y%m%d', DATE_ADD(t.end_date, INTERVAL - 1 DAY))
AND _TABLE_SUFFIX <= FORMAT_DATE('%Y%m%d', DATE_ADD(t.end_date, INTERVAL 0 DAY))
AND platform = "ANDROID"
GROUP BY 1
UNION ALL
SELECT event_date, COUNT(DISTINCT user_pseudo_id) AS users
FROM `<id>.events_*`AS z, timeframe AS t
WHERE
event_name = 'user_engagement'
AND _TABLE_SUFFIX > FORMAT_DATE('%Y%m%d', DATE_ADD(t.end_date, INTERVAL - 2 DAY))
AND _TABLE_SUFFIX <= FORMAT_DATE('%Y%m%d', DATE_ADD(t.end_date, INTERVAL - 1 DAY))
AND platform = "ANDROID"
GROUP BY 1
...
...
...
...
) avg_1_day_active_users
Run Code Online (Sandbox Code Playgroud)
1.b) 平均 1 天唯一活跃用户指标
计划daily到daus_android_{run_time|"%Y%m%d"}具有写入首选项的 BQ 目标表的更新版本WRITE_APPEND可能如下所示。我之前进行了深入研究,并确定将日内表事件传播到永久 BQ 表可能需要长达 48 小时(因此在查询中需要 3 天)。
with base AS (
SELECT *
FROM `<id>.analytics_<number>.events_*`
WHERE (_TABLE_SUFFIX >= FORMAT_DATE('%Y%m%d', DATE_ADD(@run_date, INTERVAL - 3 DAY)) AND _TABLE_SUFFIX < FORMAT_DATE('%Y%m%d', DATE_ADD(@run_date, INTERVAL - 2 DAY)))
AND platform = "ANDROID"
AND event_name = 'user_engagement'
), app AS (
SELECT
FORMAT_DATE('%Y%m%d', @run_date) AS _currentdate,
FORMAT_DATE('%Y%m%d', DATE_ADD(@run_date, INTERVAL - 3 DAY)) AS _begindate,
FORMAT_DATE('%Y%m%d', DATE_ADD(@run_date, INTERVAL - 2 DAY)) AS _enddate,
TIMESTAMP_DIFF(TIMESTAMP(DATE_ADD(@run_date, INTERVAL - 2 DAY)), TIMESTAMP(DATE_ADD(@run_date, INTERVAL - 3 DAY)), HOUR) AS _hoursdiff,
COUNT(DISTINCT user_pseudo_id) AS _uniqusers
FROM base
)
SELECT
app._currentdate,
app._begindate,
app._enddate,
app._hoursdiff,
app._uniqusers
FROM app;
Run Code Online (Sandbox Code Playgroud)
1.c) 平均 1 天唯一活跃用户指标
WITH app as (
SELECT
FORMAT_DATE('%Y%m%d', @run_date) AS _currentdate,
FORMAT_DATE('%Y%m%d', DATE_ADD(@run_date, INTERVAL - 3 DAY)) AS _begindate,
FORMAT_DATE('%Y%m%d', DATE_ADD(@run_date, INTERVAL - 2 DAY)) AS _enddate,
TIMESTAMP_DIFF(TIMESTAMP(DATE_ADD(@run_date, INTERVAL - 2 DAY)), TIMESTAMP(DATE_ADD(@run_date, INTERVAL - 3 DAY)), HOUR) AS _hoursdiff,
COUNT(DISTINCT user_pseudo_id) AS _uniqusers
FROM `<gcp-project>.analytics_<id>.events_*`
WHERE
platform = "ANDROID"
AND event_name = 'user_engagement'
AND _TABLE_SUFFIX >= FORMAT_DATE('%Y%m%d', DATE_ADD(@run_date, INTERVAL - 3 DAY))
AND _TABLE_SUFFIX < FORMAT_DATE('%Y%m%d', DATE_ADD(@run_date, INTERVAL - 2 DAY))
)
SELECT
app._currentdate,
app._begindate,
app._enddate,
app._hoursdiff,
app._uniqusers
FROM app
Run Code Online (Sandbox Code Playgroud)
2.a) 平均 7 天唯一活跃用户指标
-- Set your variables here
WITH timeframe AS (SELECT DATE("2018-12-01") AS start_date, DATE("2018-12-31") AS end_date)
-- Query your variables here
SELECT ROUND(AVG(users),0) AS users
FROM
(
SELECT COUNT(DISTINCT user_pseudo_id) AS users
FROM `<id>.events_*`AS z, timeframe AS t
WHERE
event_name = 'user_engagement'
AND _TABLE_SUFFIX > FORMAT_DATE('%Y%m%d', DATE_ADD(t.end_date, INTERVAL - 7 DAY))
AND _TABLE_SUFFIX <= FORMAT_DATE('%Y%m%d', DATE_ADD(t.end_date, INTERVAL 0 DAY))
AND platform = "ANDROID"
UNION ALL
SELECT COUNT(DISTINCT user_pseudo_id) AS users
FROM `<id>.events_*`AS z, timeframe AS t
WHERE
event_name = 'user_engagement'
AND _TABLE_SUFFIX > FORMAT_DATE('%Y%m%d', DATE_ADD(t.end_date, INTERVAL - 14 DAY))
AND _TABLE_SUFFIX <= FORMAT_DATE('%Y%m%d', DATE_ADD(t.end_date, INTERVAL - 7 DAY))
AND platform = "ANDROID"
UNION ALL
SELECT COUNT(DISTINCT user_pseudo_id) AS users
FROM `<id>.events_*`AS z, timeframe AS t
WHERE
event_name = 'user_engagement'
AND _TABLE_SUFFIX > FORMAT_DATE('%Y%m%d', DATE_ADD(t.end_date, INTERVAL - 21 DAY))
AND _TABLE_SUFFIX <= FORMAT_DATE('%Y%m%d', DATE_ADD(t.end_date, INTERVAL - 14 DAY))
AND platform = "ANDROID"
UNION ALL
SELECT COUNT(DISTINCT user_pseudo_id) AS users
FROM `<id>.events_*`AS z, timeframe AS t
WHERE
event_name = 'user_engagement'
AND _TABLE_SUFFIX > FORMAT_DATE('%Y%m%d', DATE_ADD(t.end_date, INTERVAL - 28 DAY))
AND _TABLE_SUFFIX <= FORMAT_DATE('%Y%m%d', DATE_ADD(t.end_date, INTERVAL - 21 DAY))
AND platform = "ANDROID"
) avg_7_day_active_users
Run Code Online (Sandbox Code Playgroud)
2.b) 平均 7 天唯一活跃用户指标
计划daily到waus_android_{run_time|"%Y%m%d"}具有写入首选项的 BQ 目标表的更新版本WRITE_APPEND可能如下所示:
with base AS (
SELECT *
FROM `<id>.analytics_<number>.events_*`
WHERE (_TABLE_SUFFIX >= FORMAT_DATE('%Y%m%d', DATE_ADD(@run_date, INTERVAL - 9 DAY)) AND _TABLE_SUFFIX < FORMAT_DATE('%Y%m%d', DATE_ADD(@run_date, INTERVAL - 2 DAY)))
AND platform = "ANDROID"
AND event_name = 'user_engagement'
), app AS (
SELECT
FORMAT_DATE('%Y%m%d', @run_date) AS _currentdate,
FORMAT_DATE('%Y%m%d', DATE_ADD(@run_date, INTERVAL - 9 DAY)) AS _begindate,
FORMAT_DATE('%Y%m%d', DATE_ADD(@run_date, INTERVAL - 2 DAY)) AS _enddate,
TIMESTAMP_DIFF(TIMESTAMP(DATE_ADD(@run_date, INTERVAL - 2 DAY)), TIMESTAMP(DATE_ADD(@run_date, INTERVAL - 9 DAY)), HOUR) AS _hoursdiff,
COUNT(DISTINCT user_pseudo_id) AS _uniqusers
FROM base
)
SELECT
app._currentdate,
app._begindate,
app._enddate,
app._hoursdiff,
app._uniqusers
FROM app;
Run Code Online (Sandbox Code Playgroud)
3.a) 非平均 28 天唯一活跃用户指标
# StandardSQL
-- Set your variables here
WITH timeframe AS (SELECT DATE("2018-12-01") AS start_date, DATE("2018-12-31") AS end_date)
-- Query your variables here
SELECT COUNT(DISTINCT user_pseudo_id) AS users
FROM `<id>.events_*`AS z, timeframe AS t
WHERE
event_name = 'user_engagement'
AND _TABLE_SUFFIX > FORMAT_DATE('%Y%m%d', DATE_ADD(t.end_date, INTERVAL - 28 DAY))
AND _TABLE_SUFFIX <= FORMAT_DATE('%Y%m%d', DATE_ADD(t.end_date, INTERVAL 0 DAY))
AND platform = "ANDROID"
Run Code Online (Sandbox Code Playgroud)
3.b) 非平均 28 天唯一活跃用户指标
计划daily到maus_android_{run_time|"%Y%m%d"}具有写入首选项的 BQ 目标表的更新版本WRITE_APPEND可能如下所示:
with base AS (
SELECT *
FROM `<id>.analytics_<number>.events_*`
WHERE (_TABLE_SUFFIX >= FORMAT_DATE('%Y%m%d', DATE_ADD(@run_date, INTERVAL - 30 DAY)) AND _TABLE_SUFFIX < FORMAT_DATE('%Y%m%d', DATE_ADD(@run_date, INTERVAL - 2 DAY)))
AND platform = "ANDROID"
AND event_name = 'user_engagement'
), app AS (
SELECT
FORMAT_DATE('%Y%m%d', @run_date) AS _currentdate,
FORMAT_DATE('%Y%m%d', DATE_ADD(@run_date, INTERVAL - 30 DAY)) AS _begindate,
FORMAT_DATE('%Y%m%d', DATE_ADD(@run_date, INTERVAL - 2 DAY)) AS _enddate,
TIMESTAMP_DIFF(TIMESTAMP(DATE_ADD(@run_date, INTERVAL - 2 DAY)), TIMESTAMP(DATE_ADD(@run_date, INTERVAL - 30 DAY)), HOUR) AS _hoursdiff,
COUNT(DISTINCT user_pseudo_id) AS _uniqusers
FROM base
)
SELECT
app._currentdate,
app._begindate,
app._enddate,
app._hoursdiff,
app._uniqusers
FROM app;
Run Code Online (Sandbox Code Playgroud)
旁注:
DAU-to-MAU-ratio 或WAU-to-MAU-ratio 来确定你的应用程序的粘性Run Code Online (Sandbox Code Playgroud)SELECT COUNT(DISTINCT user_id) FROM /* PLEASE REPLACE WITH YOUR TABLE NAME */ `YOUR_TABLE.events_*` WHERE event_name = 'user_engagement' /* Pick events in the last N = 20 days */ AND event_timestamp > UNIX_MICROS(TIMESTAMP_SUB(CURRENT_TIMESTAMP, INTERVAL 20 DAY)) /* PLEASE REPLACE WITH YOUR DESIRED DATE RANGE */ AND _TABLE_SUFFIX BETWEEN '20180521' AND '20240131';
忍者小贴士
要将您的团队/公司/产品的重点从 转换Vanity Metrics为Actionable Metrics,请考虑将您的主要转化事件之一添加为上述查询的一部分(例如,in_app_purchase对于电子商务公司):
with base AS (
SELECT *
FROM `<id>.analytics_<number>.events_*`
WHERE (_TABLE_SUFFIX >= FORMAT_DATE('%Y%m%d', DATE_ADD(@run_date, INTERVAL - 3 DAY)) AND _TABLE_SUFFIX < FORMAT_DATE('%Y%m%d', DATE_ADD(@run_date, INTERVAL - 2 DAY)))
AND platform = "ANDROID"
# AND event_name = 'user_engagement'
AND event_name = 'in_app_purchase'
), app AS (
SELECT
FORMAT_DATE('%Y%m%d', @run_date) AS _currentdate,
FORMAT_DATE('%Y%m%d', DATE_ADD(@run_date, INTERVAL - 3 DAY)) AS _begindate,
FORMAT_DATE('%Y%m%d', DATE_ADD(@run_date, INTERVAL - 2 DAY)) AS _enddate,
TIMESTAMP_DIFF(TIMESTAMP(DATE_ADD(@run_date, INTERVAL - 2 DAY)), TIMESTAMP(DATE_ADD(@run_date, INTERVAL - 3 DAY)), HOUR) AS _hoursdiff,
COUNT(DISTINCT user_pseudo_id) AS _uniqusers
FROM base
)
SELECT
app._currentdate,
app._begindate,
app._enddate,
app._hoursdiff,
app._uniqusers
FROM app;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5616 次 |
| 最近记录: |