Я пытаюсь понять, лучше ли составлять отчет за месяц по текущему отчету о метриках пользователей "Активные" в Firebase (см. График ниже), или, скорее, самостоятельно рассчитать и сообщить среднее значение каждого из этих показателей за определенный период.
На первый взгляд на панели инструментов отображаются активные пользователи в течение 1-го, 7-го и 28-дневного периода в декабре 2018 года, но на самом деле отображается только последний день выбранных значений диапазона дат (в право). Это приятно знать, но немного вводит в заблуждение сравнение только последних значений даты для моего анализа по месяцам. Альтернативный подход может состоять в том, чтобы самостоятельно рассчитать среднее значение за выбранный период:
Применительно к демонстрационному набору данных Firebase я получил следующие цифры:
Панель инструментов Firebase:
Мое Расчетное Среднее:
Разница дельта здесь небольшая, но я вижу некоторые существенные различия в нашем приложении, в котором миллионы активных пользователей в месяц.
Вопрос:
Чтобы ответить на мой собственный вопрос, я хотел бы сначала вернуться к определениям, а затем выполнить вычисления.
Основываясь на подтверждающих документах Firebase, я суммировал определения для каждой из метрик ниже. Очень важно указать, что только уникальные пользователи должны учитываться по каждой метрике (с учетом выбранного диапазона дат).
user_engagement
к приложению на переднем плане устройства и зарегистрировал событие user_engagement
в течение последнего 1-дневного периода (с учетом выбранного диапазона дат).user_engagement
к приложению на переднем плане устройства и зарегистрировал событие user_engagement
в течение последнего 7-дневного периода (с учетом выбранного диапазона дат).user_engagement
к приложению на переднем плане устройства и зарегистрировал событие user_engagement
в течение последнего 28-дневного периода (с учетом выбранного диапазона дат).В ячейках ниже вы можете увидеть, как рассчитываются показатели за декабрь:
Методология расчета каждой метрики/аудитории:
Average 1-day active user metric
.Average 7-day active user metric
. Я рассчитал это путем усреднения снимков на 7, 14, 21, 28 декабря.Non-averaged 28-day active user metric
. Основная причина не усреднения этого значения показателя заключается в том, что я хочу получить только один снимок за весь месяц. Если бы я использовал здесь средние значения, я бы также учел пользователей, которые были активны в предыдущем месяце.AVG 1-дневная уникальная активная метрика пользователя (Android, декабрь 2018 г.)
# 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
AVG 7-дневная уникальная активная метрика пользователя (Android, декабрь 2018 г.)
-- 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
Не усредненная 28-дневная уникальная активная метрика пользователя (Android, декабрь 2018 г.)
# 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"
Примечания стороны:
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';