コンテンツを評価する方法はいくつもあるが、ここではランディングページ改善のための最終的なCVの貢献度を評価することを目的とした分析方法を解説する。そのため、これがコンテンツを評価するための唯一の方法でもなく、コンテキストに合わせてコンテンツを評価していくことが望ましい。
ボトム評価としてのコンテンツ評価はCVRを上げられたかどうか
最近はペライチのランディングページよりもランディングページを根幹としたコンテンツ群を設置するサイト構造をとることが多い。そのようなサイト構成ではランディングページに情報を全て詰め込むのではなく、詳細な情報は別記事で用意することで、ランディングページの情報過多により逆にユーザービリティを損なうことを防ぐことができる。また、商品販売が主目的でありながらも、1つのメディアのような形態をとることでナーチャリングを行いながら、CVへの導線を引くことができるため、1回限りのセッションで勝負を付けることを目的としたペライチのランディングページよりも現代のユーザー行動にあった見せ方だといえる。
いわばこのようなサイト構成におけるコンテンツの役割はランディングページを補佐することでCVRを上げることであるともいえ、そのような役割を果たしているのかを判断基準としてコンテンツを評価する必要がある。
計算式
直接的に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