GA4

ランディングページ改善のためのコンテンツ評価分析

コンテンツを評価する方法はいくつもあるが、ここではランディングページ改善のための最終的なCVの貢献度を評価することを目的とした分析方法を解説する。そのため、これがコンテンツを評価するための唯一の方法でもなく、コンテキストに合わせてコンテンツを評価していくことが望ましい。

ボトム評価としてのコンテンツ評価はCVRを上げられたかどうか

最近はペライチのランディングページよりもランディングページを根幹としたコンテンツ群を設置するサイト構造をとることが多い。そのようなサイト構成ではランディングページに情報を全て詰め込むのではなく、詳細な情報は別記事で用意することで、ランディングページの情報過多により逆にユーザービリティを損なうことを防ぐことができる。また、商品販売が主目的でありながらも、1つのメディアのような形態をとることでナーチャリングを行いながら、CVへの導線を引くことができるため、1回限りのセッションで勝負を付けることを目的としたペライチのランディングページよりも現代のユーザー行動にあった見せ方だといえる。

いわばこのようなサイト構成におけるコンテンツの役割はランディングページを補佐することでCVRを上げることであるともいえ、そのような役割を果たしているのかを判断基準としてコンテンツを評価する必要がある。

計算式

CVR = LPとページAの閲覧後にCVしたセッション数 / LPとページAを閲覧したセッション数

直接的にCVに貢献したかを判断したいのでセッションで計算する。あくまでランディングページが主体であり、ランディングページの改善が主目的であるため、LPの閲覧は条件として必須とする。UAではランディングページの2ページ目というディメンションで評価することもできたが、ここでは同一のセッションであれば閲覧順序は問わない。その理由として2ページ目と限定してしまうと、そもそも2ページ目に遷移しやすい導線であれば、平等に評価することが難しくなるためだ。計算式の分子ではより貢献度を正確にするために閲覧順序を指定する。

探索のセグメントの重複による分析方法

探索の「セグメントの重複」などでも計算式に近しいことは求めることは可能ではあるが、閲覧順序の指定はできないのと、なによりも検証したいセグメントを都度作成しなければならず、また計算結果を出すために手動で計算していかなければならない手間が生じる。

BigQueryによる分析方法

探索による手間を考えればやはりBigQueryの活用はマストだといえる。BigQueryを活用することにより、最新のデータを元に検証したいコンテンツの分析も瞬時に結果を出すことが可能になる。

ここでは計算式に必要な個々のクエリを提示するに留めるが、実際にはこのクエリを呼び出す処理を記載しLooker Studioで可視化する手順を踏むことになる。ここでは解説の範疇を超えてしまうため、各クエリの提示のみとする。

それぞれページAとページBに該当のURLを指定するが、ページAはランディングページのURLに固定し、ページBのみを検証対象のURLに差し替える。

ページA・Bを閲覧した日次セッション数を集計

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

WITH
  SEG_pageAB AS (
    SELECT
      CONCAT(user_pseudo_id, '-', CAST(ga_session_id AS STRING)) AS ssid
    FROM(
      SELECT
        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
      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
      page_location = 'Page_A'
    GROUP BY
      ssid

    INTERSECT DISTINCT

    SELECT
      CONCAT(user_pseudo_id, '-', CAST(ga_session_id AS STRING)) AS ssid
    FROM(
      SELECT
        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
      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
      page_location = 'page_B'
    GROUP BY
      ssid
  ),
  PageAB_SSUU AS (
    SELECT
      ymd,
      COUNT(DISTINCT ssid) AS _ssuu
    FROM (
      SELECT
        PARSE_DATE("%Y%m%d", event_date) AS ymd,
        CONCAT(user_pseudo_id, '-', CAST((SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS STRING)) AS ssid
      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 event_data
    WHERE
      event_data.ssid IN (SELECT ssid FROM SEG_pageAB)
    GROUP BY
      ymd
    ORDER BY
      ymd ASC
  )

SELECT
  *
FROM
  PageAB_SSUU

ページA・Bを閲覧した後にCVした日次セッション数を集計

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

WITH
  URL_A AS (
    SELECT
      MIN(event_timestamp) AS min_event_timestamp,
      CONCAT(user_pseudo_id, '-', CAST(ga_session_id AS STRING)) AS ssid,
    FROM (
      SELECT
        event_timestamp,
        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,
      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
      page_location = 'URL_A'
    GROUP BY
      ssid
  ),
  URL_B AS (
    SELECT
      MIN(event_timestamp) AS min_event_timestamp,
      CONCAT(user_pseudo_id, '-', CAST(ga_session_id AS STRING)) AS ssid,
    FROM (
      SELECT
        event_timestamp,
        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,
      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
      page_location = 'URL_B'
    GROUP BY
      ssid
  ),
  CV_URL AS (
    SELECT
      MIN(event_timestamp) AS min_event_timestamp,
      CONCAT(user_pseudo_id, '-', CAST(ga_session_id AS STRING)) AS ssid,
    FROM (
      SELECT
        event_timestamp,
        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,
      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
      page_location = 'CV_URL'
    GROUP BY
      ssid
  ),
  Join_URLA_URLB_CVURL AS (
    SELECT
      c.ssid
    FROM
      CV_URL AS c
    INNER JOIN
      URL_A AS a
      ON
        c.ssid = a.ssid
      AND
        c.min_event_timestamp > a.min_event_timestamp
    INNER JOIN
      URL_B AS b
      ON
        c.ssid = b.ssid
      AND
        c.min_event_timestamp > b.min_event_timestamp
  ),
  PageAB_CV_SS AS (
    SELECT
      ymd,
      COUNT(DISTINCT ssid) AS _ssuu
    FROM (
      SELECT
        PARSE_DATE("%Y%m%d", event_date) AS ymd,
        CONCAT(user_pseudo_id, '-', CAST((SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS STRING)) AS ssid
      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 event_data
    WHERE
      event_data.ssid IN (SELECT ssid FROM Join_URLA_URLB_CVURL)
    GROUP BY
      ymd
    ORDER BY
      ymd ASC
  )

SELECT
  *
FROM
  PageAB_CV_SS

関連記事

【GA4 SQL】ランディングページのセッション数を集計

【GA4 SQL】ユーザー エクスプローラーをBigQueryで再現

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

おすすめ記事

最近の記事
おすすめ記事
  1. GA4の「セッション」とは?図解で分かりやすく解説

  2. SQL不要でSearch Consoleを深掘り!BigQuery「会話型分析」で実現する次世代SEOデータ分析 Conversational Analytics

  3. Search ConsoleのデータをBigQueryにエクスポートする全手順

  1. 【GA4 SQL】ボタンクリックのイベント数をBigQueryから集計

  2. 書評『BigQueryではじめるSQLデータ分析』木田和廣

  3. 【GA4 SQL】ページごとのページビュー数をBigQueryから集計

PAGE TOP