GA4にてLPで流入した場合、ユーザーが離脱するまでの平均表示回数、ランディングページから次のページ閲覧と表示回数、CV数を算出。

この分析を行うことで、ランディングページから流入した際にコンバージョンするまで何ページ閲覧しているか、またどの程度の平均ページ閲覧で離脱したか、1セッションに関する行動や傾向がわかります。

WITH session_data AS (
  SELECT
    user_pseudo_id,
    CONCAT(CAST(user_pseudo_id AS STRING), "_", CAST((SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS STRING)) AS session_id,
    (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location') AS page_location,
    event_timestamp,
    DATE(TIMESTAMP_MICROS(event_timestamp)) AS event_date,
    ROW_NUMBER() OVER (PARTITION BY user_pseudo_id, CONCAT(CAST(user_pseudo_id AS STRING), "_", CAST((SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS STRING)) ORDER BY event_timestamp) AS page_view_rank
  FROM
    `.events_*`  ###テーブルID
  WHERE
    _table_suffix BETWEEN FORMAT_DATE("%Y%m%d", DATE_ADD(CURRENT_DATE(), INTERVAL -300 DAY))
    AND FORMAT_DATE("%Y%m%d", CURRENT_DATE())
    AND event_name = 'page_view'
),
landing_pages AS (
  SELECT
    user_pseudo_id,
    session_id,
    page_location AS landing_page,
    MIN(event_timestamp) AS landing_timestamp,
    DATE(TIMESTAMP_MICROS(MIN(event_timestamp))) AS landing_date
  FROM
    session_data
  GROUP BY
    user_pseudo_id, session_id, page_location
),
entry_complete AS (
  SELECT
    CONCAT(CAST(user_pseudo_id AS STRING), "_", CAST((SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS STRING)) AS session_id,
    COUNT(event_name) AS EntryCompleteCount
  FROM
     `.events_*`  ###テーブルID
  WHERE
    _table_suffix BETWEEN FORMAT_DATE("%Y%m%d", DATE_ADD(CURRENT_DATE(), INTERVAL -300 DAY))
    AND FORMAT_DATE("%Y%m%d", CURRENT_DATE())
    AND event_name = '計測するイベント名を入力' ###イベント名を入力
  GROUP BY
    session_id
),
page_views AS (
  SELECT
    sd.user_pseudo_id,
    sd.session_id,
    sd.page_location,
    sd.page_view_rank,
    lp.landing_page,
    lp.landing_date
  FROM
    session_data sd
  JOIN
    landing_pages lp
  ON
    sd.user_pseudo_id = lp.user_pseudo_id
    AND sd.session_id = lp.session_id
  WHERE
    sd.event_timestamp >= lp.landing_timestamp
)
SELECT
  pv.session_id,
  pv.landing_date AS event_date,
  pv.landing_page,
  pv.page_location AS next_page,
  COUNT(*) AS views,
  AVG(pv.page_view_rank) AS avg_views_before_exit,
  COALESCE(ec.EntryCompleteCount, 0) AS EntryCompleteCount
FROM
  page_views pv
LEFT JOIN
  entry_complete ec
ON
  pv.session_id = ec.session_id
GROUP BY
  pv.session_id, pv.landing_date, pv.landing_page, pv.page_location, ec.EntryCompleteCount
ORDER BY
  EntryCompleteCount DESC;

・使用方法

FROM
`.events_*`  ###テーブルID
LテーブルIDを入力する

AND event_name = '計測するイベント名を入力' ###イベント名を入力
Lコンバージョンするイベント名を入力

1. session_data CTE (Common Table Expression)
目的: ユーザーのページビューに関する情報を取得します。

WITH session_data AS (
  SELECT
    user_pseudo_id,
    CONCAT(CAST(user_pseudo_id AS STRING), "_", CAST((SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS STRING)) AS session_id,
    (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location') AS page_location,
    event_timestamp,
    DATE(TIMESTAMP_MICROS(event_timestamp)) AS event_date,
    ROW_NUMBER() OVER (PARTITION BY user_pseudo_id, CONCAT(CAST(user_pseudo_id AS STRING), "_", CAST((SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS STRING)) ORDER BY event_timestamp) AS page_view_rank
  FROM
    `.events_*`
  WHERE
    _table_suffix BETWEEN FORMAT_DATE("%Y%m%d", DATE_ADD(CURRENT_DATE(), INTERVAL -300 DAY))
    AND FORMAT_DATE("%Y%m%d", CURRENT_DATE())
    AND event_name = 'page_view'
)
  • 主なフィールド:

    • user_pseudo_id: ユーザーの識別子。

    • session_id: セッションの識別子。user_pseudo_idとga_session_idから生成されます。

    • page_location: ページのURL。

    • event_timestamp: イベントのタイムスタンプ。

    • event_date: イベントの日付。

    • page_view_rank: 同じセッション内でのページビューの順序。

2. landing_pages CTE
目的: 各セッションの最初のページビュー(ランディングページ)を特定します。

landing_pages AS (
  SELECT
    user_pseudo_id,
    session_id,
    page_location AS landing_page,
    MIN(event_timestamp) AS landing_timestamp,
    DATE(TIMESTAMP_MICROS(MIN(event_timestamp))) AS landing_date
  FROM
    session_data
  GROUP BY
    user_pseudo_id, session_id, page_location
)
  • 主なフィールド:

    • user_pseudo_id: ユーザーの識別子。

    • session_id: セッションの識別子。

    • landing_page: ランディングページのURL。

    • landing_timestamp: ランディングページのタイムスタンプ。

    • landing_date: ランディングページの日時。

3. entry_complete CTE
目的: 特定のイベント(エントリー完了)の発生回数をセッションごとにカウントします。

entry_complete AS (
  SELECT
    CONCAT(CAST(user_pseudo_id AS STRING), "_", CAST((SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS STRING)) AS session_id,
    COUNT(event_name) AS EntryCompleteCount
  FROM
    `.events_*`
  WHERE
    _table_suffix BETWEEN FORMAT_DATE("%Y%m%d", DATE_ADD(CURRENT_DATE(), INTERVAL -300 DAY))
    AND FORMAT_DATE("%Y%m%d", CURRENT_DATE())
    AND event_name = 'エントリー完了'
  GROUP BY
    session_id
)
  • 主なフィールド:

    • session_id: セッションの識別子。

    • EntryCompleteCount: エントリー完了イベントのカウント。

4. page_views CTE
目的: ランディングページ以降のページビューを取得します。

page_views AS (
  SELECT
    sd.user_pseudo_id,
    sd.session_id,
    sd.page_location,
    sd.page_view_rank,
    lp.landing_page,
    lp.landing_date
  FROM
    session_data sd
  JOIN
    landing_pages lp
  ON
    sd.user_pseudo_id = lp.user_pseudo_id
    AND sd.session_id = lp.session_id
  WHERE
    sd.event_timestamp >= lp.landing_timestamp
)
  • 主なフィールド:

    • user_pseudo_id: ユーザーの識別子。

    • session_id: セッションの識別子。

    • page_location: ページのURL。

    • page_view_rank: ページビューの順序。

    • landing_page: ランディングページのURL。

    • landing_date: ランディングページの日付。

5. メインクエリ
目的: 各セッションごとにランディングページとその後のページビューのデータをまとめ、エントリー完了イベントのカウントを含めたレポートを生成します。

SELECT
  pv.session_id,
  pv.landing_date AS event_date,
  pv.landing_page,
  pv.page_location AS next_page,
  COUNT(*) AS views,
  AVG(pv.page_view_rank) AS avg_views_before_exit,
  COALESCE(ec.EntryCompleteCount, 0) AS EntryCompleteCount
FROM
  page_views pv
LEFT JOIN
  entry_complete ec
ON
  pv.session_id = ec.session_id
GROUP BY
  pv.session_id, pv.landing_date, pv.landing_page, pv.page_location, ec.EntryCompleteCount
ORDER BY
  EntryCompleteCount DESC;
  • 主なフィールド:

    • session_id: セッションの識別子。

    • event_date: イベントの日付。

    • landing_page: ランディングページのURL。

    • next_page: 次のページのURL。

    • views: ページビューのカウント。

    • avg_views_before_exit: ページビューの平均ランク(順序)。

    • EntryCompleteCount: エントリー完了イベントのカウント。

おすすめの記事