GA4

【GA4SQL】ページ/セッションをGA4で確認する方法

GA4においてもページ/セッション(セッションあたりのページビュー数)を確認することは可能であり、それぞれBigQuery・レポート・探索における確認方法を解説する。

BigQueryからデータを抽出しLookerStudioで連携することでよりページ/セッションの分析をしやすくすることもできるため、SQLのコードについても記載する。

ページ/セッションとは

ページ/セッションとは、1訪問(セッション)あたりに何ページ閲覧(アプリの場合も同様に閲覧した画面ビュー数)したかをカウントした指標のことで、サイトが1回の訪問でどれくらい閲覧されたかを図る指標として最適な指標となる。サイトの「回遊率」といってもよい。計算式としては「ページビュー数÷セッション数」となる。この際、同じ画面を繰り返し表示されても、集計され計算対象になる。

ページ/セッションの分析視点

一般的な分析方法として、どの切り口から「ページ/セッション」をモニタリングしていくかを決める必要がある。最も大きな視点ではサイト全体と月単位でページ/セッションの推移をモニタリングしていく。これは主にサイトの回遊率に大きな変動が起きていないかをチェックするためであり、ページビューやセッション数など他の指標と共に推移を追っていく。また、1つドリルダウンして日次でページ/セッションの推移をモニタリングすることで変化が起こったタイミングを捉えることができる。

サイト全体で月次や日次でページ/セッションの変化をモニタリングすることは主にサイト全体に変化があったかを図るものであり、施策に対して結果どうなったのかを図る上で適切な指標となる。例えば、記事の下部に他の記事へ遷移させるための関連記事カードを設置したことで、ページ/セッション数が増加すれば関連記事カードを設置した施策はうまくいった施策として判断できるだろう。

ページ改善を検証するページ/セッション

ページ/セッションをページ単位にドリルダウンすることでページごとにページ/セッションの改善がされたかを検証することが可能になる。つまり、ページの回遊率が改善されたかをページごとに確認することができ、ページを相対的に比較すれば、どのようなページの回遊率が高いのかの傾向が掴める。

この際、気を付けるべき点としてはページは「ランディングページ」をディメンションとしてページ/セッションを計測する必要がある。その理由としては、その「ページを起点」として、どれくらいページ遷移が発生したかを計測することで、そのページのページ/セッションが改善されたかをより正確に計測することができるため。

サイトテーマに興味関心が高いユーザーを分析するページ/セッション

ランディングページを起点としてページ/セッションを記事単位で相対比較することで、どのページがサイトテーマに興味を持って読み進めてくれるユーザーなのかを分析することができる。つまり、そのランディングページで離脱してしまったユーザーが多いページよりもページ/セッションが高いページの方が、サイト全体に興味を持ってくれている可能性が高いわけである。そのため、コンテンツの追加などにどのようなテーマのページを追加していくべきか、ページ/セッションが高いページを参考にすることができるということになる。

日次のページ/セッションを取得するクエリ

WITH
  PagePerSession AS (
    SELECT
      ymd,
      _ssuu,
      _pv,
      ROUND(_pv / _ssuu, 2) AS _PagePerSession
    FROM (
      SELECT
        ymd,
        COUNT(DISTINCT ssid) AS _ssuu,
        COUNTIF(event_name = 'page_view') AS _pv,
      FROM (
        SELECT
          ymd,
          CONCAT(user_pseudo_id, '-', CAST(ga_session_id AS STRING)) AS ssid,
          event_name
        FROM (
          SELECT
            PARSE_DATE("%Y%m%d", event_date) AS ymd,
            user_pseudo_id,
            (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS ga_session_id,
            event_name
          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
    )
    ORDER BY
      ymd ASC
)

SELECT
  *
FROM
  PagePerSession

ChatGPTによるクエリ解説

### 全体構造
– **CTE (Common Table Expression)**: `WITH`句を使用して`PagePerSession`という名前の一時的なテーブルを定義しています。これにより、複雑なサブクエリの結果を簡単に再利用することができます。
– **最終選択**: `PagePerSession`から全てのカラムを選択し、結果を表示しています。

### サブクエリの説明

1. **最内部のサブクエリ**:
– 日付、ユーザーID、セッションID、イベント名を選択しています。
– `event_date`を日付型に変換し、`ymd`としています。
– `ga_session_id`はイベントパラメータから抽出しており、セッション識別子を形成するために使用されます。
– ユーザーIDとセッションIDを組み合わせてユニークなセッション識別子(`ssid`)を生成しています。

2. **中間サブクエリ**:
– 日付(`ymd`)とセッション識別子(`ssid`)、イベント名(`event_name`)をグループ化の対象としています。
– セッション数をカウントするために`COUNT(DISTINCT ssid)`を使っており、これはユニークなセッションの数を示します。
– ページビューのイベントだけをカウントするために`COUNTIF(event_name = ‘page_view’)`を使っています。

3. **最外部のサブクエリ**:
– 各日付に対して、セッション数とページビュー数を使用してページビュー/セッションの比率を計算しています。
– `ROUND(_pv / _ssuu, 2)`で計算されるのは、セッションごとの平均ページビュー数で、これを2桁の小数点以下まで丸めています。

### 最終的な出力
– `PagePerSession`からの選択により、各日におけるページビュー/セッションの比率が計算され、これが日付ごとに並べられます。

ランディングページの日次ページ/セッションを取得するクエリ

CREATE TEMP FUNCTION date_from() AS ('20240401'); -- 開始日

WITH
  LP_PagePerSession AS (
    SELECT
      ymd,
      landing_page,
      COALESCE(_ssuu, 0) AS _ssuu,
      COALESCE(_lp_pv, 0) AS _lp_pv,
      COALESCE(_PagePerSession, 0) AS _PagePerSession
    FROM (
      SELECT
        s.ymd,
        s.landing_page,
        _ssuu,
        _lp_pv,
        ROUND(_lp_pv / _ssuu, 2) AS _PagePerSession
      FROM (
        SELECT
          ymd,
          page_location AS landing_page,
          SUM(entrances) AS _ssuu
        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) 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'
        )
        GROUP BY
          ymd,
          page_location
      ) AS s
      LEFT JOIN (
        SELECT
          lp.ymd,
          lp.landing_page,
          SUM(p.page_views_count) AS _lp_pv
        FROM ( 
          SELECT
            f.ymd,
            f.user_pseudo_id,
            f.ga_session_id,
            l.page_location AS landing_page
          FROM (
            SELECT
              PARSE_DATE("%Y%m%d", event_date) AS ymd,
              user_pseudo_id,
              (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS ga_session_id,
              MIN(event_timestamp) AS first_event_timestamp
            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'
            GROUP BY
              ymd,
              user_pseudo_id,
              ga_session_id
          ) AS f 
          INNER JOIN (
            SELECT
              PARSE_DATE("%Y%m%d", event_date) AS ymd,
              user_pseudo_id,
              (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS ga_session_id,
              REGEXP_REPLACE((SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location'), r"\?.*", "") AS page_location,   
              event_timestamp
            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'
        ) AS l
          ON
            f.ymd = l.ymd
          AND
            f.user_pseudo_id = l.user_pseudo_id
          AND
            f.ga_session_id = l.ga_session_id
          AND
            f.first_event_timestamp = l.event_timestamp      
        ) AS lp  
        INNER JOIN (      
          SELECT
            PARSE_DATE("%Y%m%d", event_date) AS ymd,
            user_pseudo_id,
            (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS ga_session_id,
            COUNT(*) AS page_views_count
          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'
          GROUP BY
            ymd,
            user_pseudo_id,
            ga_session_id      
        ) AS p 
          ON
            lp.ymd = p.ymd
          AND    
            lp.user_pseudo_id = p.user_pseudo_id
          AND
            lp.ga_session_id = p.ga_session_id
        GROUP BY
          lp.ymd,
          lp.landing_page
      ) AS p
      ON s.ymd = p.ymd AND s.landing_page = p.landing_page
      ORDER BY
        ymd ASC,
        _PagePerSession DESC
    )
  )

SELECT
  *
FROM
  LP_PagePerSession

探索でページ/セッション確認

探索でページ/セッションを確認するには、ディメンションに日付、ランディングページごとに確認したければ「ランディング ページ + クエリ文字列」を置き、指標には「セッションあたりのページビュー数」を置く。

レポートでページ/セッションを確認

GA4のデフォルトレポートには「ページ/セッション」を確認できるレポートはないが、「ライブラリ」機能を活用することで「ページ/セッション」レポートを作成することができる。GA4のレポートはユニバーサルアナリティクスのレポートと異なりカスタマイズして作成することができるため、デフォルトで表示されているレポートに拘る必要はない。

参考:[GA4] レポート ライブラリ

BigQuery + Looker Studioでページ/セッションを可視化

BigQueryからページ/セッションの可視化に必要なデータをSQL(上記で提示した)で抽出しLooker Studioと連携することで、より高速にページ/セッションの分析が可能になる。

関連記事

【GA4 SQL】新規ユーザーのユーザーセグメントを日次で適用

【GA4 SQL】セッションセグメントを適用させる方法

【GA4 SQL】セッションの参照元情報をBigQueryから取得

PAGE TOP