GA4

【GA4SQL】ランディングページの次ページ遷移・直帰率をBigQueryから取得

ランディングページの2ページ目及び直帰数を同時にBigQueryから取得するSQLを解説する。探索の「経路データ探索」においてもページ遷移を確認することができるが、ユーザー単位での遷移でのみしか確認できない仕様のようなので、以下に提示するクエリ結果と「経路データ探索」の数値は完全に合致しない。そのため、計算結果の検証が難しくなったが、ロジックの正しさについては念入りににチェックを行ったので公開する。また、提示するSQLは簡易版であるため、より精緻にクエリを組み直したバージョンは完全版を参考して頂きたい。

参考:[GA4] ランディング ページ レポート
参考:[GA4] 閲覧開始数と離脱数

ランディングページの2ページ目を取得するクエリ

WITH
  NextPage_01 AS (
    SELECT
      PARSE_DATE("%Y%m%d", event_date) AS ymd,
      event_timestamp,
      CONCAT(user_pseudo_id, '-', CAST((SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS STRING)) AS ssid,
      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) p WHERE p.key = 'entrances') AS entrances
    FROM
      `<project>.<dataset>.events_*`
    WHERE
      _TABLE_SUFFIX BETWEEN '20240401' AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
    AND
      event_name = 'page_view'
  ),
  NextPage_02 AS (
    SELECT
      ymd,
      event_timestamp,
      ssid,
      page_location,
      LEAD(page_location) OVER(PARTITION BY ssid ORDER BY event_timestamp ASC) AS next_page_location,
      entrances
    FROM
      NextPage_01
  ),
  NextPage_03 AS (
    SELECT
      ymd,
      ssid,
      page_location,
      IFNULL(next_page_location, '( Exit )') AS nextpage_01,
      entrances
    FROM
      NextPage_02
    WHERE
      entrances = 1
  ),
  NextPage_04 AS (
    SELECT
      ymd,
      page_location AS LandingPage,
      nextpage_01,
      COUNT(*) AS _cnt
    FROM
      NextPage_03
    GROUP BY
      ymd,
      page_location,
      nextpage_01
    ORDER BY
      ymd ASC,
      LandingPage ASC,
      _cnt DESC
  )

SELECT
  *
FROM
  NextPage_04

クエリ解説

当クエリのランディングページの判定では’entrances’パラメータの値で判定を行っている。’entrances’パラメータはセッションにおける最初のページビューに立つフラグであるため、’entrances’の値が’1’である場合にランディングページとして区別することが可能になる。また同時にセッションベースでのランディングページの表示カウントにも活用することができ、この指標を「閲覧開始数」として探索上でも選択することができる。おそらく「閲覧開始数」は’entrances’パラメータの値に基づいて処理されている。

GA4の「ランディング ページ」レポートでは「セッション」数が指標として並んでいるが、ディメンションに「ランディング ページ」を選択した上で指標に「セッション」と「閲覧開始数」を並べると理論上は同値になり、実際にトラフィックが多くないサイトでは同値になる。ただサイト流入数のトラフィックが大きくなるにつれて、数値のズレが生じてくる。これはセッションにHyperLogLog++による集計処理が行われるため数値が完全には合致しなくなるため。このような理由から、「ランディングページ」を集計するためのカウント方法は’entrances’パラメータによる集計の方がより正確にカウントすることができるので、ランディングページに着地したセッション数として採用している。

次ページへの遷移はLEAD関数により’event_timestamp’の昇順で’page_location’を取得しているため、セッションによる2ページ目は「離脱」になるか、必ず「1ページのみ」が遷移ページとしてカウントされる。そのため、「経路データ探索」の「ユーザー」単位とは異なる集計方法としてカウントされる。

GA4の探索では「経路データ探索」

GA4の探索では行動フローをビジュアライズ的に分かりやすく可視化してくれる「経路データ探索」が備わっており、ユーザーの行動フローを可視化することができる。「経路データ探索」のビジュアライズはLooker Studioでは再現できないため、2ページ目、3ページ目と深掘りして分析する必要があれば必須の機能となる。ちなみに2ページ目以降のページ遷移もBigQueryで抽出することも可能ではある。

「経路データ探索」においてランディングページをスタート地点として分析する際は、始点にイベント名で”session_start”を指定する。ステップ1にはページタイトルかページパスを指定することで、ランディングページがステップ1に並ぶことになる。指標にはセッションや表示回数は選択できず、ユーザー単位の「アクティブ ユーザー数」か「総ユーザー数」を指定する。

参考:[GA4] 経路データ探索

BigQuery + Looker StudioでLP2ページ目を可視化

Looker Studio単体ではランディングページからの2ページ目や直帰率を可視化することはできない(※正確にいえば、2ページ目はできなくはないが)。BigQueryのみで集計されたデータもそれだけでは、人の脳ではどのような傾向があるのかを読み取ることは困難となる。そのため、ここからは集計されたデータをLooker Studioに渡し、直感的に分かり易いようにビジュアライズする必要がある。SQLもデータ可視化用に必要なカラム・行を追加する必要がある。そのコードの完成形は「Visual SEM Report」で提供している。以下はコードのみ。

Protected Area

This content is password-protected. Please verify with a password to unlock the content.

ランディングページの2ページ目を取得するクエリ(同一ページを除去した改良版)

こちらのクエリでは同一ページで’page_view’が複数回カウントされた場合に重複した’page_view’を除去する処理を行っている。そのため、次のページは必ず次のページか離脱となる。’page_view’イベントの遷移をすべて可視化したいのであれば先に上げたクエリを使えばよいが、同一ページを2ページ目としないのであれば以下のクエリを使用する。

CREATE TEMP FUNCTION date_from() RETURNS STRING AS ('20240401');

WITH
  BounceRate AS (
    SELECT
      ssid,
      ymd,
      event_timestamp,
      Landing_page,
      final_next_page,
      IF(final_next_page = 'Exit',1, 0) AS _exit,
      _entrances
    FROM (
      SELECT
        ssid,
        ymd,
        event_timestamp,
        page_location AS Landing_page,
        CASE
          WHEN next_page_location IS NULL THEN 'Exit'
          ELSE next_page_location
        END AS final_next_page,
        IF ( 
            entrances = 1
          OR
            entrances_01 = 1
          ,1,0
        ) AS _entrances
      FROM (
        SELECT
          *,
          IF ( 
              LAG(entrances) OVER(PARTITION BY ssid ORDER BY event_timestamp ASC) = 1
            AND
              LAG(dup_page) OVER(PARTITION BY ssid ORDER BY event_timestamp ASC) = 1
            ,1,0
          ) AS entrances_01
        FROM (
          SELECT
            ssid,
            ymd,
            event_timestamp,
            page_location,
            next_page_location,
            IF(page_location = next_page_location,1, 0) AS dup_page,
            entrances
          FROM (
            SELECT
              ssid,
              ymd,
              event_timestamp,
              page_location,
              LEAD(page_location) OVER(PARTITION BY ssid ORDER BY event_timestamp ASC) AS next_page_location,
              entrances
            FROM (
              SELECT
                CONCAT(user_pseudo_id, '-', CAST((SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS STRING)) AS ssid,
                PARSE_DATE("%Y%m%d", event_date) AS ymd,
                event_timestamp,
                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) p WHERE p.key = 'entrances') AS entrances
              FROM
                `<project>.<dataset>.events_*`
              WHERE
                _TABLE_SUFFIX BETWEEN date_from() AND FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 1 DAY))
              AND
                event_name = 'page_view'
            )
          )
        )
        WHERE 
          entrances = 1
        OR
          dup_page = 0 
      )
      WHERE
        (dup_page = 0 AND entrances = 1)
      OR
        entrances_01 = 1
    )

  )

SELECT
  *
FROM
    BounceRate

関連記事

【GA4 SQL】UA定義の直帰率をBigQueryで再現

【GA4 SQL】2つのevent_timestampの日付比較

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

PAGE TOP