Minhaz Kazi、Google アナリティクス デベロッパー アドボケイト – 2022 年 10 月
大規模なデータセットで一意の要素の数(基数)を正確に測定するには、相当量のメモリが必要になり、パフォーマンスにも影響します。Google アナリティクス 4 プロパティでは、HyperLogLog++(HLL++)アルゴリズムを使用して、最もよく使われる指標(アクティブ ユーザー数やセッション数など)の基数を推定しています。たとえば、Google アナリティクスの UI と Data API でアクティブ ユーザー数を確認すると、その数は近似値になります。これらの指標に HLL++ を使用すると、推定の精度が向上して誤差の範囲が小さくなるため、パフォーマンスが向上します。このブログ投稿では、HLL++ が Google アナリティクス 4 プロパティでどのように使用されているかを説明し、BigQuery のイベント エクスポート データを使用して一部の推定を再現する方法をご紹介します。
HLL++ について
HLL++ を使用すると、より少ないメモリを使いながらもパフォーマンスを改善して、基数を推定できます。HLL++ には HyperLogLog アルゴリズムを介して行われる拡張があり、HyperLogLog in Practice: Algorithmic Engineering of a State of the Art の内容に基づいて機能します。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 アナリティクス 4 プロパティでの HLL++ の実装
Google アナリティクス 4 では、以下の設定を使用して関連指標の基数を測定します。
指標 | precision |
sparse precision |
---|---|---|
セッション数 | 12 | 17 |
アクティブ ユーザー数 | 14 | 25 |
合計ユーザー数 | 14 | 25 |
Google アナリティクスのイベントデータで BigQuery の HLL++ 関数を使用する
Google アナリティクス 4 プロパティのイベントデータが BigQuery で使用できる場合は、Google アナリティクスの UI で生成される指標を 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_*`
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 アナリティクスの UI にデータを複製するために 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 ブログの投稿記事 Using HLL++ to speed up count-distinct in massive datasets をご覧ください。