Приблизительный расчет уникальных значений в Google Аналитике

Минхаз Кази (Minhaz Kazi), специалист по связям с разработчиками, Google Аналитика, октябрь 2022 г.

Чтобы регистрировать точные уникальные значения (например, их количество) для больших наборов данных, требуется много памяти, что может повлиять на эффективность. В ресурсах Google Аналитики 4 используется алгоритм HyperLogLog++ (HLL++), чтобы приблизительно рассчитывать количество уникальных значений для наиболее часто встречающихся показателей, таких как Активные пользователи и Сеансы. Например, если вы просматриваете данные об Активных пользователях в интерфейсе Google Аналитики или с помощью Data API, количество будет указано приблизительно. Такое использование алгоритма HLL++ повышает эффективность и точность расчетов и снижает предел погрешности. В этой записи рассказывается о том, как HLL++ используется в ресурсах Google Аналитики 4 и как вы можете сами воспроизвести некоторые расчеты, используя экспорт данных о событиях в BigQuery.

Алгоритм HLL++

Алгоритм HLL++ приблизительно рассчитывает количество уникальных значений, используя меньше памяти, что повышает эффективность операции. Алгоритм HLL++ является измененной версией алгоритма HyperLogLog. Подробную информацию вы найдете в статье Работа с HyperLogLog: алгоритмическая разработка передового алгоритма для расчета количества уникальных значений (на англ. языке). Изменения в параметре precision алгоритма HLL++ компенсируют использование памяти за счет точности рассчитанных данных. При увеличении значения параметра снижается погрешность, но возрастает использование памяти.

Реализация уникальных значений в BigQuery

  • Чтобы получить точное количество уникальных значений, используйте COUNT(DISTINCT). Эта операция использует больше памяти и требует больше времени, особенно для крупных наборов данных.
  • Команда APPROX_COUNT_DISTINCT позволяет приблизительно рассчитать результаты с помощью HLL++. Однако APPROX_COUNT_DISTINCT не позволяет настроить точность вычислений.
  • Чтобы использовать собственные значения precision, используйте функции HyperLogLog++. Разрешенные значения precision и доверительные интервалы для типичных вариантов precision вы найдете на сайте HLL++ Sketches.
  • sparse precision – ещё один параметр HLL+. В BigQuery нельзя задать значение sparse precision, оно всегда равно precision + 5.

Реализация HLL++ в ресурсах Google Аналитики 4

В Google Аналитике 4 для измерения количества уникальных значений связанных показателей используется следующая конфигурация:

Показатель precision sparse precision
Сеансы 12 17
Активные пользователи 14 25
Всего пользователей 14 25

Как использовать функции HLL++ в BigQuery с данными о событиях Google Аналитики

Если в BigQuery доступны данные о событиях ресурса Google Аналитики 4, вы можете попробовать сопоставить данные из интерфейса с данными BigQuery. Для примеров ниже предполагается, что:

  • для ресурса Google Аналитики 4 задан идентификатор отчетов By device only;
  • устранены другие возможные источники расхождений, например часовой пояс отчетов.

Всего пользователей

Точное количество рассчитывается с помощью COUNT(DISTINCT):

SELECT
  COUNT(DISTINCT user_pseudo_id) AS exact_total_user_count,
FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`

Примерное количество рассчитывается с помощью APPROX_COUNT_DISTINCT:

SELECT
  APPROX_COUNT_DISTINCT(user_pseudo_id) AS approx_total_user_count,
FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`

Вы можете воспроизвести действие APPROX_COUNT_DISTINCT, используя функции HLL++ в BigQuery. Ниже показан код, которые вернет те же результаты, что и APPROX_COUNT_DISTINCT, или похожие.

SELECT
  HLL_COUNT.EXTRACT(HLL_COUNT.INIT(user_pseudo_id, 15)) AS approx_total_user_count,
FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`

Наконец, чтобы получить те же данные в интерфейсе Google Аналитики, используйте precision = 14:

SELECT
  HLL_COUNT.EXTRACT(HLL_COUNT.INIT(user_pseudo_id, 14)) AS total_user_count,
FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`

Активные пользователи

Чтобы рассчитать количество Активных пользователей для таблицы экспорта событий в BigQuery, сначала нужно отфильтровать события по Активным пользователям. Инструкции о том, как реализовать фильтр по Активным пользователям, в этой статье не приводятся.

WITH ActiveUsers AS
(
  SELECT
    user_pseudo_id
  FROM
    `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`
  WHERE
  <implement active user filter logic>
)
SELECT
  HLL_COUNT.EXTRACT(HLL_COUNT.INIT(user_pseudo_id, 14)) AS active_user_count,
FROM ActiveUsers

Сеансы

Параметр события ga_session_id позволяет идентифицировать уникальные сеансы для каждого пользователя. Для уникальных сеансов комбинация user_pseudo_id и ga_session_id в пределах набора данных будет уникальной. Это стандартный метод учета сеансов для ресурсов Google Аналитики 4. Для сеансов значение precision составляет 12.

SELECT
  HLL_COUNT.EXTRACT(
    HLL_COUNT.INIT(
      CONCAT(
        user_pseudo_id,
        (SELECT `value` FROM UNNEST(event_params) WHERE key = 'ga_session_id' LIMIT 1).int_value),
      12)) AS session_count,
FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`

Запросы, приведенные в этой статье, можно использовать с примерами базовых и расширенных запросов, чтобы получить дополнительные данные из данных о событиях ресурсов Google Аналитики 4, экспортированных в BigQuery, Если для вашего ресурса регистрируется большой объем данных о событиях, вы можете также реализовать функции HLL++, чтобы приблизительно рассчитывать количество уникальных значений других показателей, которые вы часто используете в запросах BigQuery. Подробную информацию о HLL++ и о том, почему расчет количества уникальных значений для больших наборов данных – ресурсоемкая операция, вы найдете в записи в Cloud Blog Как использовать HLL++, чтобы ускорить учет уникальных значений в массивных наборах данных.