GA4

【GA4SQL】ページ単位の平均エンゲージメント時間

ユーザーエンゲージメントとは

GA4になりユーザーが「ページを実際に閲覧していた時間」を精緻に算出できるようになった。その指標が「ユーザーエンゲージメント」となる。ユーザーエンゲージメントの算出方法は以下公式ヘルプにて記載がある通り、「engagement_time_msec」の合算によって求められる。この値を元に「平均エンゲージメント時間」が求められる。「engagement_time_msec」の単位はミリセカンドで集計され、探索やレポート上では、小数点以下が切り捨てられ整数の値が使われる。

参考:[GA4] ユーザー エンゲージメント -アナリティクス ヘルプ

ユーザーエンゲージメントの他にも旧UAと同様の指標である「セッションの継続時間」もあるが、特段の理由がなければ「ユーザーエンゲージメント」を基本としてモニタリングしていくことを推奨する。「セッションの継続時間」よりも、より精緻な「ユーザーエンゲージメント」を使わない理由はない。

日次のユーザーエンゲージメントを取得するクエリ

WITH
  Engagement_Time AS (
    SELECT
      ymd,
      _engagement_time_seconds,
      FORMAT_TIMESTAMP(
        '%H時間 %M分 %S秒',
        TIMESTAMP_SECONDS(CAST(_engagement_time_seconds AS INT64))
      ) AS format_second
    FROM(
      SELECT
        ymd,
        -- SAFE_DIVIDE(COALESCE(SUM(engagement_time_msec), 0), 1000) AS _engagement_time_seconds,     -- より正確性を求めるのであればこちらを使う
        SUM(FLOOR(SAFE_DIVIDE(COALESCE(_engagement_time_msec, 0), 1000))) AS _engagement_time_seconds -- 探索と合わせるのであればこちらを使う    
      FROM(
        SELECT
          PARSE_DATE("%Y%m%d", event_date) AS ymd,
          (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'engagement_time_msec') AS _engagement_time_msec
        FROM
          `<project>.<dataset>.events_*`
        WHERE
          _TABLE_SUFFIX BETWEEN '20240401' AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY))
      )
      GROUP BY
        ymd
    )
    WHERE
      _engagement_time_seconds <> 0
    ORDER BY
      ymd ASC
  )

SELECT
  *
FROM
  Engagement_Time

ページごとのユーザーエンゲージメントを取得するクエリ

WITH
  Page_Engagement_Time AS (
    SELECT
      ymd,
      page_location,
      _engagement_time_seconds,
      FORMAT_TIMESTAMP(
        '%H時間 %M分 %S秒',
        TIMESTAMP_SECONDS(CAST(_engagement_time_seconds AS INT64))
      ) AS format_second
    FROM(
      SELECT
        ymd,
        page_location,
        -- SAFE_DIVIDE(COALESCE(SUM(engagement_time_msec), 0), 1000) AS _engagement_time_seconds,     -- より正確性を求めるのであればこちらを使う
        SUM(FLOOR(SAFE_DIVIDE(COALESCE(_engagement_time_msec, 0), 1000))) AS _engagement_time_seconds -- 探索と合わせるのであればこちらを使う    
      FROM(
        SELECT
          PARSE_DATE("%Y%m%d", event_date) AS ymd,
          REGEXP_REPLACE((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location'), r"\?.*","") AS page_location,
          (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'engagement_time_msec') AS _engagement_time_msec
        FROM
          `<project>.<dataset>.events_*`
        WHERE
          _TABLE_SUFFIX BETWEEN '20240401' AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(),INTERVAL 1 DAY))
      )
      GROUP BY
        ymd,
        page_location
    )
    WHERE
      _engagement_time_seconds <> 0
    ORDER BY
      ymd ASC
  )

SELECT
  *
FROM
  Page_Engagement_Time

ページ単位の「ユーザーエンゲージメント」とは

ここではユーザーごとの「エンゲージメント」ではなく、ページ単位の「ユーザーエンゲージメント」の算出について解説する。実際のところ、ユーザー単位のユーザーエンゲージメントをモニタリングしても、「ユーザー」自体はコントロールできないものであるため、そこから改善につなげることは難しい。そのためドリルダウンして「ページ単位」でのユーザーエンゲージメントをモニタリングすることで具体的な改善アクションにつなげることができる。「ページ単位の平均エンゲージメント時間」とは実際にページがフォーカス状態にあった時間を元にすることで、ページごとの正確な「ページ滞在時間」を求めることが可能になる。これと旧UAでの算出式である次ページが表示されたときの時間の差分をページ滞在時間としたときと比較検証してみると、大きな時間の差異があることが確認できた。このことから「ページの滞在時間」を評価するには、「ユーザーエンゲージメント」を採用することが適切であると考えられる。そして、以下がその算出式となる。

ページ単位の平均滞在時間(平均エンゲージメント時間) =
ユーザーエンゲージメント ÷ アクティブユーザー数

ここでもう少し補足しておくと、GA4のページ単位レポートでは「アクティブユーザー数」を母数とした「平均エンゲージメント時間」が採用されているが、母数を「セッション」としても問題がない。特にアナリティクスは伝統的に「延べ人数」という概念がないため、ユーザー数を母数としてしまうと日付を跨った場合でも母数が少なくなってしまい直感に反する結果になってしまう。その場合は、1つドリルダウンしたセッションを母数とすることで日付を跨いだユーザーも実質「延べ人数」としてカウントされるため、ケースバイケースで母数をユーザーなのかセッションにするかを選択することを推奨する。

GA4管理画面にて該当箇所を確認する際は、「エンゲージメント」から「ページとスクリーン」レポートでページごとの平均エンゲージメント時間を確認することができる。

探索で平均エンゲージメント時間を確認するには?

平均エンゲージメント時間はユーザーエンゲージメントをアクティブユーザー数で割ることで算出できるため、探索でユーザーエンゲージメントとアクティブユーザー数の指標を選択して並べてもよいが、この結果を「カスタム定義」で定義することで「平均エンゲージメント時間」をわかりやすく可視化することができる。カスタム定義の計算指標の数式には以下を入力する。

{ユーザー エンゲージメント} / {アクティブ ユーザー数}

このカスタム定義で作成した平均エンゲージメント時間を探索の指標に追加することで、日次・ページ単位の平均エンゲージメント時間(単位は秒)を可視化することが可能になる。

Looker Studioにおけるデータ可視化

ページ単位の平均ユーザーエンゲージメント時間のモニタリングはGA4のレポートでは幾分、操作やインタラクションの機能に劣る。そのため、BigQueryのデータからページごとの平均エンゲージメント時間をモニタリングできる仕組みを整えることが望ましい。

関連記事

【GA4 SQL】セッション単位のページ遷移数をBigQueryから取得

【GA4 SQL】再帰CTEで同一ページを除いた「2ページ目」を取得 BigQuery WITH RECURSIVE

【検証】GA4 entrancesパラメータ

PAGE TOP