使用 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 為基礎的工具可以告訴您成效為何而發生,但無法告訴您原因。您可以透過數據分析工具傳送其他資料,協助您追蹤及偵錯問題。

基於上述原因,我們建議所有網站管理員使用現有的數據分析工具監控 Core Web Vitals 指標。本文將說明如何使用 Google 提供的免費工具來達成這項目標。

完成所有設定後,您就能建立如下所示的資訊主頁:

Web Vitals 連接器報表螢幕截圖

Web Vitals 連接器報表螢幕截圖

如想透過圖像概略瞭解這裡說明的所有步驟,請參閱我們在 2021 年 Google I/O 大會上發表的演講

測量

您隨時可以透過 Google Analytics 自訂指標評估成效,但 Google Analytics 4 (GA4) 還有幾項新功能值得開發人員特別期待。

雖然 Google Analytics 網頁介面確實提供強大的分析工具,但使用您可能已熟悉的查詢語言存取原始事件資料,其功能和彈性都難以超越。

如要開始使用 Google Analytics 4 和 BigQuery 評估 Core Web Vitals,您必須完成以下三件事:

  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 事件資料前,請務必瞭解資料的匯總方式。

最重要的是,在某些情況下,同一頁面可能會收到多個事件,而這些事件都與同一個指標相關。當指標值變更且回報更新後的值時,就可能發生這種情況 (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 查詢。

整個網站上的 LCP、INP 和 CLS 比例為 75% (第 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
  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 最差的前 10 個網頁 (p75)

# 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

偵錯

先前的查詢說明了如何查詢 Web Vitals 指標資料,這有助於瞭解目前的成效,以及成效隨時間變化的趨勢。但如果成效不如預期,但您不確定原因為何,該怎麼辦呢?

如果你無法採取行動並修正問題,瞭解分數並無幫助。

在實地調試成效」一文說明如何透過數據分析資料傳送其他偵錯資訊。如果您按照文章中詳述的操作說明進行,應該也會在 BigQuery 中看到偵錯資訊。

查詢範例

以下查詢說明如何使用 debug_target 事件參數,協助找出效能問題的根本原因。

影響 CLS 的元素

debug_target 是 CSS 選取器字串,對應頁面上與指標值最相關的元素。

在 CLS 中,debug_target 代表影響 CLS 值的最大版面配置位移中,最大的元素。如果沒有元素移位,debug_target 值就會是 null

下列查詢會根據 CLS 第 75 個百分位數,列出最差到最佳的網頁,並依 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'

同樣,您可以參閱「在欄位中對效能進行偵錯」,瞭解如何收集及傳送各個 Core Web Vitals 指標的偵錯資訊。

視覺化

光是查看查詢結果,可能很難獲得洞察。舉例來說,下列查詢會列出資料集中 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 Studio 是可免費使用的資料視覺化和資訊主頁工具。如要以圖表呈現查詢結果,請在 BigQuery UI 中執行查詢後,點選「探索資料」按鈕,然後選取「透過 Looker Studio 探索」

在 BigQuery 中使用「透過 Looker Studio 查看」選項

這麼做會在探索檢視畫面中,建立從 BigQuery 連至 Looker Studio 的直接連結。在這個檢視畫面中,您可以選取要視覺化的欄位、選擇圖表類型、設定篩選器,以及建立臨時圖表,以便快速進行視覺分析。您可以從先前的查詢結果建立此折線圖,查看 LCP 值隨時間變化的趨勢:

Looker Studio 每日 LCP 值的折線圖

透過 BigQuery 和 Looker Studio 之間的直接連結,您可以快速建立任何查詢的圖表,並進行視覺分析。不過,如要進一步分析,您可能會想查看互動式資訊主頁中的多個圖表,以便取得更全面的視圖,或深入瞭解資料。有了方便的資訊主頁,您就不必每次分析指標時都手動編寫查詢和產生圖表。

您可以使用原生 BigQuery 連接器,在 Looker Studio 中建立資訊主頁。如要這樣做,請前往 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 引擎,則可以在此資料表中執行最佳化的 SQL 函式和運算子

您可以直接透過 BigQuery UI 查詢這個具體化資料表,或是透過 BigQuery 連接器在 Looker Studio 中使用。

使用 Web Vitals 連接器

由於從頭開始製作資訊主頁非常耗時,我們開發了一個套件解決方案,為您建立範本資訊主頁。首先,請確認您已使用先前的查詢將 Web Vitals 資料表實體化。接著,請使用以下連結存取 Looker Studio 的 Web Vitals 連接器:goo.gle/web-vitals-connector

提供一次性授權後,您應該會看到下列設定畫面:

Web Vitals 連接器授權畫面

請提供具象化 BigQuery 資料表 ID (即目標資料表) 和 BigQuery 帳單專案 ID。點選「連結」後,Looker Studio 就會建立新的範本資訊主頁,並與您的資料建立關聯。您可以隨意編輯、修改及分享資訊主頁。建立資訊主頁後,除非要從不同資料集建立多個資訊主頁,否則不必再次點選連結。

在瀏覽資訊主頁時,您可以在「摘要」分頁中查看 Web Vitals 指標的每日趨勢,以及網站的部分使用者資訊 (例如使用者和工作階段)。

在「使用者分析」分頁中,您可以選取指標,然後查看指標百分位數以及不同使用情況和業務指標的使用者人數詳細資料。

「網頁路徑分析」分頁可協助您找出網站上的問題區域。您可以在此挑選指標來查看總覽。但您也會看到所有網頁路徑的散布圖,其中 Y 軸顯示百分比值,X 軸則顯示記錄計數。散布圖可協助您找出指標值低於預期的網頁。使用「網頁路徑」表格的散佈圖選取頁面後,您可以查看「Debug Target」表格,進一步細查問題區域。

舉例來說,您可以透過「收益分析」分頁,在同一個地方監控業務和成效指標。這個部分會標示使用者完成購物的所有工作階段。您可以比較特定工作階段中的收益與使用者體驗。

進階用法

隨著您更加熟悉資料集,您可以編輯資訊主頁並新增自己的圖表,取得更豐富多元且針對性的分析。如要讓資訊主頁更實用,您可以採取下列步驟:

  • 在 BigQuery 中設定排程查詢,以便取得更新資料。我們先前執行的實體化查詢只會擷取當下資料的快照。如果您想讓資訊主頁持續更新新資料,可以執行每天執行的排程查詢,並在具象化資料表中附加新資料。
  • 彙整第一方資料 (例如客戶關係管理) 來取得業務洞察資料。在具體化資料表中,您可以將 user_id 新增為個別資料欄。這樣一來,您就能彙整第一方資料。如果您的第一方資料尚未儲存在 BigQuery 中,您可以載入資料,或使用聯合資料來源
  • 在傳送至 Google Analytics 的資料中,將網站或應用程式版本做為參數回報,並在具象化資料表中新增該參數做為資料欄。接著,您可以將該版本資料新增為圖表中的維度,方便查看版本變更對成效的影響。
  • 如果您預期資料集會透過直接查詢或資訊主頁大量使用,可以試著使用 BigQuery BI Engine 付費版本。

摘要

本文介紹基本概念,說明如何使用 Google Analytics 4 和 BigQuery,以在實際環境中收集的真實使用者資料評估及偵錯效能。並說明如何使用 Looker Studio 和 Web Vitals 連接器建立自動化報表和資訊主頁,以便輕鬆呈現資料。

本文重點整理:

  • 透過實際使用者資料評估效能,對於瞭解網站、偵錯和最佳化網站至關重要。
  • 將成效指標和業務指標放在同一個系統中,即可取得更深入的洞察資料。這要歸功於 Google Analytics 和 BigQuery。
  • 透過 BigQuery 匯出原始 Google Analytics 資料,您就能使用自己可能已熟悉的查詢語言,進行深入的客製化分析,發揮無限潛力。
  • Google 提供多種 API 和視覺化工具 (例如 Looker Studio),可讓您自由按照自己想要的方式建立報表。