Google Analytics(分析)中的唯一计数近似值

Minhaz Kazi,Google Analytics(分析)开发技术推广工程师 - 2022 年 10 月

针对大型数据集衡量确切的非重复计数(即基数)需要大量内存且会影响性能。Google Analytics(分析)4 媒体资源使用 HyperLogLog++ (HLL++) 算法来估算最常用指标的基数,包括活跃用户数会话数指标。例如,在 Google Analytics(分析)界面中以及通过 Data API 查看“活跃用户数”时,看到的将是近似值。针对这些指标使用 HLL++ 可确保实现较高的性能,同时提高估算准确性并缩小误差范围。本博文详细介绍了如何在 Google Analytics(分析)4 媒体资源中使用 HLL++,以及如何复制部分使用 BigQuery 事件导出数据的估算值。

关于 HLL++

HLL++ 可估算基数,同时减少内存占用并提升性能。HLL++ 在 HyperLogLog 算法的基础上得到了增强,基于 HyperLogLog 实践:一种先进的基数估算算法的算法工程。HLL++ precision 参数发生了变化,会在所计算统计数据的内存用量与准确性之间进行权衡。增加参数值可以减少误差,但会增加内存消耗。

BigQuery 中的唯一计数实现

  • 使用 COUNT(DISTINCT) 可衡量确切的基数。此方法需要较多内存和较长的运行时间,尤其是对于大型数据集。
  • APPROX_COUNT_DISTINCT 使用 HLL++ 计算结果的近似值。但是,APPROX_COUNT_DISTINCT 不允许用户配置近似值的准确度。
  • 如需使用自定义 precision 值,请使用 HyperLogLog++ 函数。如需了解允许的 precision 值和典型精确度的置信区间,请参阅 HLL++ 草图
  • sparse precision 是 HLL+ 的另一个参数。在 BigQuery 中,sparse precision 值不可由用户定义,固定为 precision + 5

Google Analytics(分析)4 媒体资源中的 HLL++ 实现

Google Analytics(分析)4 使用以下配置来衡量相关指标的基数。

指标 precision sparse precision
会话数 12 17
活跃用户数 14 25
用户总数 14 25

将 BigQuery HLL++ 函数与 Google Analytics(分析)事件数据结合使用

如果 BigQuery 中有您 Google Analytics(分析)4 媒体资源的事件数据,您可以尝试将 Google Analytics(分析)界面中的指标与 BigQuery 数据进行匹配。以下示例做出了如下假设:

  • 对于 Google Analytics(分析)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_*`

您可以使用 BigQuery HLL++ 函数复制 APPROX_COUNT_DISTINCT。这将与 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 Analytics(分析)界面中复制数据,请使用 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_idga_session_id 的组合在数据集内对唯一会话来说将是唯一的。这是 Google Analytics(分析)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 Analytics(分析)4 媒体资源的 BigQuery 事件导出数据。如果您的媒体资源会生成大量事件数据,您还可以实现 HLL++ 函数来估算 BigQuery 查询中常用的其他指标的基数。如需详细了解 HLL++ 以及为什么大型数据集中的基数计算开销较高,请参阅 Cloud 博客上的深度博文:使用 HLL++ 加速衡量大型数据集中的唯一计数