使用 Google Analytics(分析)4 和 BigQuery 衡量效果并进行调试

了解如何将 Web Vitals 数据发送到 Google Analytics 4 媒体资源,以及如何导出此类数据以便在 BigQuery 和 Looker Studio 中进行分析。

Google 提供了多种工具(Search ConsolePageSpeed Insights [PSI] 和 Chrome 用户体验报告 [CrUX]),可让开发者了解其网站在实际环境中针对真实用户的 Core Web Vitals 指标的表现。

这些工具非常棒,可让您大致了解网站的真实用户体验,而且无需任何设置即可开始使用。

不过,您不应仅依靠这些工具来衡量网站的效果,原因有以下几点:

  • 基于 CrUX 的工具会按月或过去 28 天的时间段报告数据。 这意味着,您在进行任何更改后,都需要等待很长时间才能看到结果。
  • 基于 CrUX 的工具只能按少数维度(例如国家/地区、连接类型和设备类别 [桌面设备或移动设备])进行细分。您无法按业务特有的维度(例如:感兴趣的用户、特定实验组中的用户等)对数据进行细分。
  • 基于 CrUX 的工具可以告诉您效果如何,但无法告诉您原因。借助分析工具,您可以发送更多数据,以帮助您跟踪和调试问题。

因此,我们建议所有网站所有者使用现有的分析工具监控核心网页指标。本文介绍了如何使用 Google 提供的免费工具来实现这一目标。

完成所有设置后,您就可以创建如下信息中心:

网页指标连接器报告屏幕截图

网页指标连接器报告屏幕截图

如果您想直观地了解上述所有步骤,请观看 我们在 2021 年 Google I/O 大会上的演讲

测量

您一直可以使用 Google Analytics 中的自定义指标衡量效果,但 Google Analytics 4 (GA4) 中有一些新功能,开发者尤其应该对其感到兴奋。

虽然 Google Analytics 网站界面确实提供了强大的分析工具,但很难比得上使用您可能已经熟悉的查询语言访问原始事件数据的强大和灵活性。

如需开始使用 Google Analytics 4 和 BigQuery 衡量核心网页指标,您需要完成以下三项操作:

  1. 创建 Google Analytics 4 媒体资源BigQuery 项目
  2. 在 Google Analytics 媒体资源配置中启用 BigQuery Export,以便您收到的所有数据都会自动填充到 BigQuery 项目表中。
  3. web-vitals JavaScript 库添加到您的网站,以便您衡量 Core Web Vitals 指标并将数据发送到 Google Analytics 4,包括归因数据

分析

完成所有设置后,您应该会在 BigQuery 界面中看到事件数据,并且应该能够按如下方式查询数据:

SELECT * FROM `my_project_id.analytics_XXXXX.events_*`
WHERE event_name IN ('LCP', 'INP', 'CLS')

以下是该查询的结果预览:

BigQuery 中的 Web Vitals 事件数据

查询 Web Vitals 数据

在开始查询 Web Vitals 事件数据之前,请务必了解数据的汇总方式。

最重要的一点是,在某些情况下,系统可能会针对同一网页上的同一指标收到多个事件。如果指标值发生变化并报告更新后的值(CLS 中经常出现这种情况),就可能会出现这种情况。

对于 Web Vitals 事件,发送的最后一个值始终是最准确的值,因此在执行任何分析之前,请务必仅过滤出这些值。web-vitals JavaScript 库提供的用于向 Google Analytics 4 发送数据的代码段包括为每个指标发送唯一 ID,因此您可以使用以下查询将结果限制为仅包含每个指标 ID 的最后收到的值:

# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
  SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
    SELECT *, IF (ROW_NUMBER() OVER (
      PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
      ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
    ) = 1, true, false) AS is_last_received_value
    FROM `bigquery_project_id.analytics_XXXXX.events_*`
    WHERE event_name in ('CLS', 'INP', 'LCP') AND
      _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  ) WHERE is_last_received_value
)

请注意,本文中提及的所有其他查询都将以此子查询开头。

示例查询

接下来的几个部分将展示一些您可能想要运行的常见 Web Vitals 查询示例。

整个网站的第 75 百分位 (p75) LCP、INP 和 CLS

# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
  SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
    SELECT *, IF (ROW_NUMBER() OVER (
      PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
      ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
    ) = 1, true, false) AS is_last_received_value
    FROM `bigquery_project_id.analytics_XXXXX.events_*`
    WHERE event_name in ('CLS', 'INP', 'LCP') AND
      _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  ) WHERE is_last_received_value
)
# Main query logic
SELECT
  metric_name,
  APPROX_QUANTILES(metric_value, 100)[OFFSET(75)] AS p75,
  COUNT(1) as count
FROM (
  SELECT
    metric_name,
    ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = "metric_value"), 3) AS metric_value,
  FROM web_vitals_events
)
GROUP BY 1

所有单个 LCP 值(从高到低)

# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
  SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
    SELECT *, IF (ROW_NUMBER() OVER (
      PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
      ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
    ) = 1, true, false) AS is_last_received_value
    FROM `bigquery_project_id.analytics_XXXXX.events_*`
    WHERE event_name in ('CLS', 'INP', 'LCP') AND
      _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  ) WHERE is_last_received_value
)
# Main query logic
SELECT
  ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = "metric_value"), 3) AS metric_value,
FROM web_vitals_events
WHERE metric_name = 'LCP'
ORDER BY metric_value DESC
# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
  SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
    SELECT *, IF (ROW_NUMBER() OVER (
      PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
      ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
    ) = 1, true, false) AS is_last_received_value
    FROM `bigquery_project_id.analytics_XXXXX.events_*`
    WHERE event_name in ('CLS', 'INP', 'LCP') AND
      _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  ) WHERE is_last_received_value
)
# Main query logic
SELECT
  page_path,
  APPROX_QUANTILES(metric_value, 100)[OFFSET(75)] AS LCP,
  COUNT(1) as count
FROM (
  SELECT
    REGEXP_SUBSTR((SELECT value.string_value FROM UNNEST(event_params) WHERE key = "page_location"), r'\.com(\/[^?]*)') AS page_path,
    ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = "metric_value"), 3) AS metric_value,
  FROM web_vitals_events
  WHERE metric_name = 'LCP'
)
GROUP BY 1
ORDER BY count DESC
LIMIT 10

CLS(第 75 百分位)最差的前 10 个网页

# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
  SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
    SELECT *, IF (ROW_NUMBER() OVER (
      PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
      ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
    ) = 1, true, false) AS is_last_received_value
    FROM `bigquery_project_id.analytics_XXXXX.events_*`
    WHERE event_name in ('CLS', 'INP', 'LCP') AND
      _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  ) WHERE is_last_received_value
)
# Main query logic
SELECT
  page_path,
  APPROX_QUANTILES(metric_value, 100)[OFFSET(75)] AS CLS,
  COUNT(1) as count
FROM (
  SELECT
    REGEXP_SUBSTR((SELECT value.string_value FROM UNNEST(event_params) WHERE key = "page_location"), r'\.com(\/[^?]*)') AS page_path,
    ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = "metric_value"), 3) AS metric_value,
  FROM web_vitals_events
  WHERE metric_name = 'CLS'
)
GROUP BY 1
HAVING count > 50 # Limit to relatively popular pages
ORDER BY CLS DESC
LIMIT 10

调试

前面的查询展示了如何查询 Core Web Vitals 指标数据,这些数据有助于您了解当前的性能以及性能随时间推移的趋势。但是,如果效果不如预期,但您又不确定原因,该怎么办?

如果您无法采取行动来解决问题,那么了解得分是没有帮助的。

在现场调试性能介绍了如何随分析数据一起发送其他调试信息。如果您按照该博文中详述的说明操作,应该也会在 BigQuery 中看到调试信息。

示例查询

以下查询演示了如何使用 debug_target 事件参数来帮助找出性能问题的根本原因。

对 CLS 影响最大的元素

debug_target 是一个 CSS 选择器字符串,它将对应页面上与指标值最相关的元素。

对于 CLS,debug_target 表示 CLS 值成因背后的最大布局偏移的最大元素。如果没有偏移元素,则 debug_target 值将为 null

以下查询将按第 75 百分位的 CLS 按最差到最佳的顺序列出网页,并按 debug_target 分组:

# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
  SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
    SELECT *, IF (ROW_NUMBER() OVER (
      PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
      ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
    ) = 1, true, false) AS is_last_received_value
    FROM `bigquery_project_id.analytics_XXXXX.events_*`
    WHERE event_name in ('CLS', 'INP', 'LCP') AND
      _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  ) WHERE is_last_received_value
)
# Main query logic
SELECT
  page_path,
  debug_target,
  APPROX_QUANTILES(metric_value, 100)[OFFSET(75)] AS CLS,
  COUNT(1) as count
FROM (
  SELECT
    REGEXP_SUBSTR((SELECT value.string_value FROM UNNEST(event_params) WHERE key = "page_location"), r'\.com(\/[^?]*)') AS page_path,
    (SELECT value.string_value FROM UNNEST(event_params) WHERE key = "debug_target") as debug_target,
    ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = "metric_value"), 3) AS metric_value,
    *
  FROM web_vitals_events
  WHERE metric_name = 'CLS'
)
GROUP BY 1, 2
HAVING count > 50 # Limit to relatively popular pages
ORDER BY CLS DESC

导致 CLS 偏高的主要元素的查询结果

知道页面上的哪些元素在发生偏移,则应当能够更轻松地识别问题的根本原因并加以解决。

请注意,此处报告的元素与您在本地调试页面时发现产生偏移的元素可能并不相同,因此,请务必从一开始就捕获这些数据。如果未意识到存在问题,就很难解决问题!

调试其他指标

上一个查询显示了 CLS 指标的结果,但可使用完全相同的分析法来报告 LCP 和 INP 的调试目标。只需将 where 子句替换为要调试的相关指标:

WHERE metric_name = 'INP'
WHERE metric_name = 'LCP'

再次提醒,如需了解如何收集和发送每个核心网页指标的调试信息,请参阅在现场调试性能

可视化

仅仅通过查看查询结果,很难获得有价值的数据分析。例如,以下查询会列出数据集中每日 LCP 的 75 分位数值。

# Subquery all Web Vitals events from the last 28 days
WITH web_vitals_events AS (
  SELECT event_name as metric_name, * EXCEPT(event_name, is_last_received_value) FROM (
    SELECT *, IF (ROW_NUMBER() OVER (
      PARTITION BY (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
      ORDER BY (SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value') DESC
    ) = 1, true, false) AS is_last_received_value
    FROM `bigquery_project_id.analytics_XXXXX.events_*`
    WHERE event_name in ('CLS', 'INP', 'LCP') AND
      _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 28 DAY)) AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE, INTERVAL 1 DAY))
  ) WHERE is_last_received_value
)
# Main query logic
SELECT
  event_date,
  metric_name,
  APPROX_QUANTILES(ROUND(metric_value, 2), 100)[OFFSET(75)] AS p75
FROM
  (
    SELECT
      event_date,
      metric_name,
      ROUND((SELECT COALESCE(value.double_value, value.int_value) FROM UNNEST(event_params) WHERE key = 'metric_value'), 3) AS metric_value
    FROM web_vitals_events
    WHERE
      metric_name = 'LCP'
  )
GROUP BY
  1, 2
ORDER BY event_date

从这些查询结果中,仅通过查看数据就很难找出趋势或离群值。

每日指标值查询结果

在这种情况下,直观呈现数据有助于您更快地获得数据洞见。

在 Looker Studio 中可视化查询结果

BigQuery 可通过数据洞察快速可视化任何查询结果。Looker 数据洞察是一款免费的数据可视化和信息中心工具。如需在 BigQuery 界面中运行查询后可视化查询结果,请点击“探索数据”按钮,然后选择通过 Looker Studio 进行探索

BigQuery 中的“通过 Looker Studio 探索”选项

这将在探索视图中创建从 BigQuery 到 Looker Studio 的直接链接。在此视图中,您可以选择要可视化的字段、选择图表类型、设置过滤条件,还可以创建临时图表来进行快速可视化分析。根据上一个查询结果,您可以创建以下折线图来查看 LCP 值在一段时间内的趋势:

Looker Studio 中的每日 LCP 值折线图

借助 BigQuery 与 Looker Studio 之间的直接链接,您可以基于任意查询创建快速图表,并执行可视化分析。不过,如果您想要执行更多分析,则可能需要在交互式信息中心内查看多个图表,以便于获取更加全面的视图或展开数据细目。借助便捷的信息中心,您在分析指标时不必每次都手动编写查询并生成图表。

您可以使用原生 BigQuery 连接器在 Looker 数据洞察中创建一个信息中心。为此,请前往 datastudio.google.com,创建一个新的数据源,选择 BigQuery 连接器,然后选择要使用的数据集:

在 Looker Studio 中使用 BigQuery 原生连接器

将网页指标数据具体化

如前所述,创建网页指标事件数据的信息中心时,直接使用 Google Analytics 4 导出数据集的效率并不高。由于 GA4 数据的结构,再加上 Web Vitals 指标需要进行的预处理,查询的一些部分最终会运行多次。这会带来两个问题:信息中心性能和 BigQuery 成本。

您可以免费使用 BigQuery 沙盒模式。借助 BigQuery 的免费用量层级,每月处理的前 1 TB 查询数据是免费的。对于本文中讨论的分析方法,除非您使用非常大的数据集或定期查询大量数据集,否则应当每月都能保持在免费限额以内。但是,如果您的网站流量非常高,并且希望使用快速交互式信息中心定期监视不同的指标,则建议您使用 BigQuery 效率功能(如分区、聚类和缓存),对网页指标数据进行预处理并具体化。

以下脚本会预处理您的 BigQuery 数据(源表)并创建一个具体化表(目标表)。在对自己的数据集使用此查询时,您可能还需要为来源表定义日期范围,以减少要处理的数据量。

# Materialize Web Vitals metrics from GA4 event export data

# Replace target table name
CREATE OR REPLACE TABLE bigquery_project_id.ga4_demo_dev.web_vitals_summary
  PARTITION BY DATE(event_timestamp)
  CLUSTER BY metric_name
AS
SELECT
  ga_session_id,
  IF(
    EXISTS(SELECT 1 FROM UNNEST(events) AS e WHERE e.event_name = 'first_visit'),
    'New user',
    'Returning user') AS user_type,
  IF(
    (SELECT MAX(session_engaged) FROM UNNEST(events)) > 0, 'Engaged', 'Not engaged')
    AS session_engagement,
  evt.* EXCEPT (session_engaged, event_name),
  event_name AS metric_name,
  FORMAT_TIMESTAMP('%Y%m%d', event_timestamp) AS event_date
FROM
  (
    SELECT
      ga_session_id,
      ARRAY_AGG(custom_event) AS events
    FROM
      (
        SELECT
          ga_session_id,
          STRUCT(
            country,
            device_category,
            device_os,
            traffic_medium,
            traffic_name,
            traffic_source,
            page_path,
            debug_target,
            event_timestamp,
            event_name,
            metric_id,
            IF(event_name = 'LCP', metric_value / 1000, metric_value) AS metric_value,
            user_pseudo_id,
            session_engaged,
            session_revenue) AS custom_event
        FROM
          (
            SELECT
              (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id')
                AS ga_session_id,
              (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'metric_id')
                AS metric_id,
              ANY_VALUE(device.category) AS device_category,
              ANY_VALUE(device.operating_system) AS device_os,
              ANY_VALUE(traffic_source.medium) AS traffic_medium,
              ANY_VALUE(traffic_source.name) AS traffic_name,
              ANY_VALUE(traffic_source.source) AS traffic_source,
              ANY_VALUE(
                REGEXP_SUBSTR(
                  (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location'),
                  r'^[^?]+')) AS page_path,
              ANY_VALUE(
                (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'debug_target'))
                AS debug_target,
              ANY_VALUE(user_pseudo_id) AS user_pseudo_id,
              ANY_VALUE(geo.country) AS country,
              ANY_VALUE(event_name) AS event_name,
              SUM(ecommerce.purchase_revenue) AS session_revenue,
              MAX(
                (
                  SELECT
                    COALESCE(
                      value.double_value, value.int_value, CAST(value.string_value AS NUMERIC))
                  FROM UNNEST(event_params)
                  WHERE key = 'session_engaged'
                )) AS session_engaged,
              TIMESTAMP_MICROS(MAX(event_timestamp)) AS event_timestamp,
              MAX(
                (
                  SELECT COALESCE(value.double_value, value.int_value)
                  FROM UNNEST(event_params)
                  WHERE key = 'metric_value'
                )) AS metric_value,
            FROM
              # Replace source table name
              `bigquery_project_id.analytics_XXXXX.events_*`
            WHERE
              event_name IN ('LCP', 'INP', 'CLS', 'first_visit', 'purchase')
            GROUP BY
              1, 2
          )
      )
    WHERE
      ga_session_id IS NOT NULL
    GROUP BY ga_session_id
  )
CROSS JOIN UNNEST(events) AS evt
WHERE evt.event_name NOT IN ('first_visit', 'purchase');

此具体化数据集具有以下多项优势:

  • 采用扁平化数据结构,更易于查询。
  • 仅保留来自原始 GA4 数据集的 Web Vitals 事件。
  • 会话 ID、用户类型(新用户与回访用户)和会话互动信息都直接显示在各个列中。
  • 该表按日期分区,并按指标名称聚类。这通常可以减少每个查询的数据处理量。
  • 由于您不需要使用通配符来查询此表,因此查询结果最多可缓存 24 小时。这样可以减少重复执行同一查询的成本。
  • 如果您使用 BigQuery BI Engine,则可以对此表运行优化的 SQL 函数和运算符

您可以直接在 BigQuery 界面中查询此具体化表,也可以通过 BigQuery 连接器在 Looker Studio 中使用此表。

使用 Web Vitals 连接器

从头开始创建信息中心非常耗时,因此我们开发了打包解决方案来创建模板信息中心。首先,确保您已使用上一个查询将网页指标表具体化。然后,通过以下链接访问 Looker Studio 的 Web Vitals 连接器:goo.gle/web-vitals-connector

提供一次性授权后,您应当会看到以下配置屏幕:

网页指标连接器授权界面

提供具体化的 BigQuery 表 ID(即目标表)和您的 BigQuery 结算项目 ID。点击“连接”后,Looker 数据洞察会创建一个新的模板化信息中心,并与您的数据相关联。您可以根据需要编辑、修改和共享信息中心。如果您已创建一次信息中心,则无需再次访问连接器链接,除非您希望通过不同的数据集创建多个信息中心。

浏览信息中心时,您可以在摘要标签页中查看网页指标的每日趋势以及您网站的一些使用情况信息,例如用户和会话信息。

用户分析标签页中,您可以选择一项指标,然后获取该指标百分位数的细分,以及按不同使用情况和业务指标分类的用户数。

“页面路径分析”标签页可帮助您确定网站上的问题区域。在此标签页中,您可以选择某个指标来查看概览。您还可以查看所有网页路径的散点图,其中 y 轴为百分位值,x 轴为记录数。这种散点图有助于识别指标值低于预期的页面。使用网页路径表的散点图选择页面后,您可以通过查看调试目标表来进一步分析问题。

比如说,您可以通过收入分析标签页来监视同一位置的业务和效果指标。此部分会显示用户做出购买行为的所有会话。您可以比较特定会话期间的收入与用户体验。

高级用法

随着您对数据集的熟悉程度不断加深,您可以修改信息中心并添加自己的图表,以便进行更丰富、更有针对性的分析。如需让信息中心更实用,您可以执行以下步骤:

  • 在 BigQuery 中设置定期查询,以获取更新的数据。我们之前运行的具体化查询只会获取您数据在当时的快照。如果您希望使用新数据不断更新信息中心,可以运行每天运行一次的定期查询,并将新数据附加到具体化表中。
  • 联接第一方数据(例如 CRM 数据),以获取业务数据洞见。在具体化表中,您可以将 user_id 添加为单独的列。这样,您就可以联接第一方数据。如果您的第一方数据尚未在 BigQuery 中,您可以加载数据或使用联合数据源
  • 在发送到 Google Analytics 的数据中,将您的网站或应用版本作为参数进行报告,并将其作为列添加到具体化表中。然后,您可以在图表中将该版本数据添加为维度,以便更轻松地了解版本更改对效果的影响。
  • 如果您预计会通过直接查询或信息中心大量使用数据集,可以尝试使用付费版 BigQuery BI Engine

摘要

本文介绍了如何使用 Google Analytics 4 和 BigQuery 利用在现场收集的真实用户数据衡量效果并进行调试的基础知识。该博文还介绍了如何使用 Looker Studio 和网页指标连接器构建自动化报告和信息中心,以便尽可能轻松地可视化数据。

本文的要点:

  • 使用真实用户数据衡量性能对于了解、调试和优化网站至关重要。
  • 将效果指标和业务指标纳入同一系统后,您可以获得更深入的数据洞见。这正是 Google Analytics 和 BigQuery 的用武之地。
  • 通过 BigQuery 导出原始 Google Analytics 数据,您可以使用自己可能已经熟悉的查询语言,无限扩展自定义分析的深度。
  • Google 提供了许多 API 和可视化工具(例如 Looker 数据洞察),可让您按照自己的意愿自由构建报告。