Google Analytics用户事件计数计算逻辑及BigQuery匹配差异问询
Google Analytics事件仪表板与BigQuery计算差异问题
Google Analytics「用户行为分析」板块的事件仪表板展示以下指标:事件名称、事件总数、总用户数、用户事件计数(定义为平均每位用户的事件数)。通过BigQuery查询时,事件总数和总用户数能和GA后台精准匹配,但部分事件(比如页面浏览)的用户事件计数无法匹配,怀疑这类特定事件的用户事件计数并非简单的「事件总数/总用户数」,是否存在额外计算逻辑?
用户提供的BigQuery查询代码:
WITH test AS(SELECT * FROM `project.dataset.googleanalyticsevents` where dataset = 'analytics_xxx' and cast(concat(left(event_date,4),'-',substr(event_date,(-4),2),'-',right(event_date,2)) as date) between '2024-03-28' and '2024-03-29'), test2 as ( SELECT cast(concat(left(event_date,4),'-',substr(event_date,(-4),2),'-',right(event_date,2)) as date) dt, event_name, count(DISTINCT user_pseudo_id) usercount, count(*) eventcount FROM test GROUP BY cast(concat(left(event_date,4),'-',substr(event_date,(-4),2),'-',right(event_date,2)) as date) , event_name ORDER BY 1,2 ) SELECT dt, event_name, eventcount, usercount, (eventcount/usercount) FROM test2
GA事件仪表板数据示例:
核心原因:特定事件的用户事件计数存在专属计算逻辑
对于页面浏览(page_view)这类自动收集的事件,GA后台的用户事件计数确实不是简单的「事件总数/总用户数」,和你在BigQuery的计算逻辑有两点关键差异:
同会话同页面的重复事件合并
GA后台统计页面浏览的用户事件计数时,会合并同一用户在单次会话内连续刷新同一页面的重复触发事件,只计为1次有效事件;但BigQuery的原始数据会保留所有触发记录,导致你计算的eventcount偏大,最终平均值和后台不一致。用户身份的合并识别
GA后台的「总用户数」会合并user_id和user_pseudo_id:如果同一用户同时存在这两个标识,会被算作1个用户;而你仅用user_pseudo_id去重,会把这类用户拆成2个,导致usercount偏大,计算出的平均值偏小。
对齐GA逻辑的BigQuery修正查询
WITH test AS( SELECT *, -- 生成用户+会话+页面的唯一标识,用于合并同会话同页面的重复刷新 CONCAT( IF(user_id IS NOT NULL, user_id, user_pseudo_id), (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'session_id'), (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location') ) AS user_session_page FROM `project.dataset.googleanalyticsevents` WHERE dataset = 'analytics_xxx' AND PARSE_DATE('%Y%m%d', event_date) BETWEEN '2024-03-28' AND '2024-03-29' -- 简化日期转换逻辑 ), test2 AS ( SELECT PARSE_DATE('%Y%m%d', event_date) AS dt, event_name, -- 合并user_id和user_pseudo_id,对齐GA的用户去重逻辑 COUNT(DISTINCT IF(user_id IS NOT NULL, user_id, user_pseudo_id)) AS usercount, -- 页面浏览事件按用户+会话+页面去重,其他事件保留原始计数 CASE WHEN event_name = 'page_view' THEN COUNT(DISTINCT user_session_page) ELSE COUNT(*) END AS eventcount FROM test GROUP BY dt, event_name ORDER BY dt, event_name ) SELECT dt, event_name, eventcount, usercount, ROUND(eventcount/usercount, 2) AS avg_events_per_user FROM test2
验证注意事项
- 先单独针对
page_view事件对比修正后的平均值和GA后台数据 - 确认你的GA4数据中是否包含
session_id参数,部分配置可能需要手动启用该参数收集 - 检查是否存在
user_id不为空的用户,这是影响用户数统计的关键因素
内容的提问来源于stack exchange,提问作者hSin
相关产品推荐
相关产品推荐

