Google Analytics (分析) 中的不重複計數

Google Analytics (分析) 開發人員服務代表 Minhaz Kazi - 2022 年 10 月

如要評估大型資料集的確切不重複計數 (即基數),就需要龐大的記憶體,並會影響效能。Google Analytics (分析) 4 資源使用 HyperLogLog++ (HLL++) 演算法來「估算」常用指標的基數,包括「活躍使用者」和「工作階段」。舉例來說,在 Google Analytics (分析) UI 和 Data API 中查看活躍使用者時,計數就會是約略值。針對這些指標使用 HLL++ 時,預估準確度較高、錯誤範圍下限也更低,因此可確保效能更佳。這篇網誌文章詳細說明 HLL++ 在 Google Analytics (分析) 4 資源中的使用方式,以及如何使用 BigQuery 事件匯出資料複製部分預估值。

關於 HLL++

HLL++「估計」基數,同時減少記憶體並提升效能。HLL++ 使用 HyperLogLog 演算法的強化功能,並以 HyperLogLog in Practice: Algorithmic Engineering of the Art Cinality Estimation Algorithm。HLL++ precision 參數中的變更會捨棄記憶體用量,與計算的統計資料的準確度比較。增加參數值可減少錯誤,但會增加記憶體用量。

BigQuery 中的不重複計數實作

  • 使用 COUNT(DISTINCT) 評估確切基數。這個方法需要較多的記憶體,並且需要較長的執行時間。對於大型資料集而言,更是如此。
  • APPROX_COUNT_DISTINCT 會使用 HLL++ 估算結果。不過,APPROX_COUNT_DISTINCT 不允許使用者設定近似準確率。
  • 如要使用自訂的 precision 值,請使用 HyperLogLog++ 函式。請參閱 HLL++ 草圖,瞭解允許的 precision 值以及一般精確度的信賴區間。
  • 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 資源的事件資料,可以嘗試比對 UI 的指標與 BigQuery 資料。以下範例假設:

  • Google Analytics (分析) 4 資源的報表 ID 已設為 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 事件匯出資料表計算「活躍使用者」計數,您必須先篩選出「活躍使用者」的事件。實作「Active User」篩選器並不在本文的討論範圍內。

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++ 加快大型資料集的數量差異