민하즈 카지, Google 애널리틱스 Developer Advocate – 2022년 10월
대규모 데이터 세트의 정확한 고유 개수(카디널리티)를 측정하려면 상당한 메모리가 필요하며 성능에도 영향을 줍니다. Google 애널리틱스 4 속성은 HyperLogLog++(HLL++) 알고리즘을 사용하여 활성 사용자, 세션 등 가장 많이 사용되는 측정항목의 카디널리티를 추정합니다. 예를 들어 Google 애널리틱스 UI는 물론 Data API를 통해 활성 사용자를 조회하는 경우 개수는 근사값입니다. 이러한 측정항목에 HLL++를 사용하면 추정 정확도가 높아지고 오류 범위가 낮아지므로 성능이 향상됩니다. 이 블로그 게시물에서는 Google 애널리틱스 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 애널리틱스 4 속성의 HLL++ 구현
Google 애널리틱스 4에서는 다음 구성을 사용하여 관련 측정항목의 카디널리티를 측정합니다.
측정항목 | precision |
sparse precision |
---|---|---|
세션 | 12 | 17 |
활성 사용자 | 14 | 25 |
총 사용자 | 14 | 25 |
Google 애널리틱스 이벤트 데이터와 함께 BigQuery HLL++ 함수 사용하기
BigQuery에서 Google 애널리틱스 4 속성의 이벤트 데이터를 사용할 수 있는 경우 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 블로그의 심층 블로그 게시물인 HLL++를 사용하여 대규모 데이터 세트의 개수 구분 속도 높이기를 참고하세요.