できる逆引き Googleアナリティクス4 成果を生み出す分析・改善ワザ 192』の紙面で紹介している、SQL文を公開しています。各データはワザの番号順に掲載しています。

公開データ一覧

  • ワザ028:追加したタグの動作をBigQueryで確認する
  • ワザ183:BigQueryによる高度な分析の前提を理解する
  • ワザ185:ユニバーサルアナリティクスと同じ定義の直帰率を求める
  • ワザ186:ランディングページと2ページ目のコンバージョン率を確認する
  • ワザ187:指標「ページの価値」でページの評価を行う
  • ワザ188:平均以外の指標でセグメントの本当の評価を行う
  • ワザ189:アトリビューションの考えをコンテンツ分析に適用する
  • ワザ190:閲覧するとCVRが高くなるページを網羅的に探索する
  • ワザ191:初回訪問からN日以内のLTVで初回訪問獲得を最適化する
  • ワザ192:初回訪問時のメディアとランディングページごとのLTVを確認する

ワザ028
追加したタグの動作をBigQueryで確認する

特定の時刻より後に発生したscrollイベントだけに限定し、時系列順に並べたうえで「scroll」イベントが発生した「page_title」と「percent_scrolled」を一覧で確認できます。

    SELECT event_timestamp, user_pseudo_id, event_name
    , (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_title') AS page_title
    , (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'percent_scrolled') AS percent_scrolled
    FROM 'bigquerytableauoct.analytics_254394192.events_20220911'
    WHERE event_name = "scroll"
    ORDER BY event_timestamp
  

ワザ183
BigQueryによる高度な分析の前提を理解する

FROM句に次のような記述がある場合は、Googleアナリティクス4のデモアカウントのデータを参照していることを指しています。

    `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_XXXXXXXX`
  

自社のデータを使って分析を行う場合、FROM句のAAAのところに自社のBigQueryのプロジェクトIDを、BBBのところにGA4のプロパティIDを、YYYYMMDDのところに分析したい日付を入れ、SQL文を実行してください。

    FROM `AAA.analytics_BBB.events_YYYYMMDD`
  

ワザ185
ユニバーサルアナリティクスと同じ定義の直帰率を求める

ユニバーサルアナリティクスの「直帰率」(1ページビューしか発生しなかったセッションの割合)を求めるSQL文です。

    WITH master AS (
    SELECT event_date, ga_session_id, COUNT(*) AS pv_by_session
    FROM (
    SELECT
    event_date
    , (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS ga_session_id
    FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_202011*`
    WHERE event_name = 'page_view'
    ) GROUP BY event_date, ga_session_id
    )

    SELECT event_date, COUNT(DISTINCT ga_session_id) AS sessions, SUM(bounce) AS bounces
    , ROUND(SUM(bounce) / COUNT(DISTINCT ga_session_id) * 100, 2) AS bounce_rate_percent
    FROM (
    SELECT
    event_date, ga_session_id, IF(pv_by_session = 1, 1, 0) AS bounce
    FROM master
    )
    GROUP BY event_date
    ORDER BY 1
  

ワザ186
ランディングページと2ページ目のコンバージョン率を確認する

ユニバーサルアナリティクスと同様の「ランディングページ」「2ページ目」を求めるSQL文です。

    WITH cv_sessions AS
    ( SELECT DISTINCT ga_session_id, 1 AS cv
    FROM ( SELECT
    (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS ga_session_id
    FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_202101*`
    WHERE event_name = 'purchase'
    ))
    , pages AS (SELECT ga_session_id, MAX(landing_page) AS landing_page
    , MAX(IF(second_page = landing_page, third_page, second_page)) AS second_page
    FROM (
      SELECT ga_session_id
      , FIRST_VALUE(page_title) OVER (PARTITION BY ga_session_id ORDER BY event_timestamp) AS landing_page
      , NTH_VALUE(page_title,2) OVER (PARTITION BY ga_session_id ORDER BY event_timestamp) AS second_page
      , NTH_VALUE(page_title,3) OVER (PARTITION BY ga_session_id ORDER BY event_timestamp) AS third_page
      FROM (
      SELECT
      event_timestamp
    , (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS ga_session_id
    , (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_title') AS page_title
    FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_202101*`
    WHERE event_name = 'page_view'
    ))
    GROUP BY ga_session_id)

    SELECT landing_page, second_page, COUNT(DISTINCT ga_session_id) AS sessions, SUM(cv) AS cvs
    , ROUND(SUM(cv) / COUNT(DISTINCT ga_session_id) * 100 , 2) AS cvr_percent
    FROM (
    SELECT p.ga_session_id , p.landing_page , p.second_page , COALESCE(cvs.cv,0) AS cv FROM pages AS p
    LEFT JOIN cv_sessions AS cvs
    ON p.ga_session_id = cvs.ga_session_id
    )
    --WHERE second_page is not null
    GROUP BY landing_page, second_page
    ORDER BY 3 DESC
  

ワザ187
指標「ページの価値」でページの評価を行う

ユニバーサルアナリティクスに存在した、ページのコンバージョン貢献度を可視化する指標「ページの価値」を求めるSQL文です。

    WITH page as (
      SELECT ga_session_id, page_title
      FROM (
      SELECT
    (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS ga_session_id
    ,(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_title') AS page_title
      FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_202101*`
      ORDER BY 1)
      WHERE page_title NOT IN ('Shopping Cart', 'Checkout Your Information', 'Payment Method', 'Checkout Confirmation', 'Checkout Review')
      GROUP BY ga_session_id, page_title)
    , revenue AS (
      SELECT ga_session_id, SUM(revenue) AS revenue
      FROM (
      SELECT
    (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS ga_session_id
    , ecommerce.purchase_revenue AS revenue
      FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_202101*`
    ) GROUP BY ga_session_id)

    SELECT *, revenue / unique_sessions_per_page AS page_value
    FROM (
    SELECT page_title, COUNT(DISTINCT ga_session_id) AS unique_sessions_per_page, SUM(revenue) AS revenue
    FROM (
      SELECT p.ga_session_id, p.page_title, COALESCE(r.revenue, 0) AS revenue
      FROM page AS p
      LEFT JOIN revenue AS r
      ON p.ga_session_id = r.ga_session_id
    )
    GROUP BY page_title
    ) ORDER BY 2 DESC
  

ワザ188
平均以外の指標でセグメントの本当の評価を行う

国別のユーザーエンゲージメントを平均値、中央値、標準偏差で求めるSQL文です。

    WITH master AS (
    SELECT user_pseudo_id
    , MAX(geo.country) AS country
    , SUM((SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'engagement_time_msec')) / 1000 AS engagement_time
    FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_20210131`
    GROUP BY user_pseudo_id)
    , a AS (
    SELECT country, COUNT(DISTINCT user_pseudo_id) AS users
    , ROUND(AVG(engagement_time), 1) AS average_engagement_time
    FROM master
    GROUP BY country)
    , m AS (
    SELECT DISTINCT country
    , ROUND(PERCENTILE_CONT(engagement_time, 0.5) OVER(PARTITION BY country), 1) AS median_engagement_time
    , ROUND(STDDEV_POP(engagement_time) OVER(PARTITION BY country), 1) AS std_dev_engagement_time
    FROM master)

    SELECT a.country, a.users, a.average_engagement_time, m.median_engagement_time, m.std_dev_engagement_time
    FROM a
    INNER JOIN m
    ON a.country = m.country
    ORDER BY 2 DESC
  

ワザ189
アトリビューションの考えをコンテンツ分析に適用する

Googleアナリティクス4のデモアカウントで「purchase」イベントをコンバージョンとして、ページ別のコンバージョン貢献度をアトリビューションモデルごとに取得するSQL文です。

    WITH cv_users AS (
    SELECT
    user_pseudo_id
    , MAX(IF(event_name = 'purchase', 1, 0)) AS cv_flag
    , MIN(IF(event_name = 'purchase', event_timestamp, NULL)) AS min_cv_timestamp
    FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_202101*`
    GROUP BY user_pseudo_id
    HAVING cv_flag = 1
    )
    , pageviews AS (
      SELECT * FROM (
      SELECT user_pseudo_id, event_name
    , event_timestamp
    , (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_title') AS page_title
    FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_202101*`
    WHERE event_name IN ('page_view', 'purchase')
      ) WHERE page_title NOT IN ('Shopping Cart', 'Checkout Your Information', 'Payment Method', 'Checkout Confirmation', 'Checkout Review')
    )
    , master AS (
      SELECT * FROM (
    SELECT pv.user_pseudo_id
    , pv.event_name
    , pv.page_title
    , pv.event_timestamp
    , cv.min_cv_timestamp
    , ROW_NUMBER() OVER(PARTITION BY pv.user_pseudo_id ORDER BY pv.event_timestamp) AS row_num
    FROM pageviews AS pv
    INNER JOIN cv_users AS cv
    ON pv.user_pseudo_id = cv.user_pseudo_id
      ) WHERE event_timestamp < min_cv_timestamp
    )

    SELECT page_title
    , SUM(first_touch) AS first_touch
    , SUM(last_touch) AS last_touch
    , SUM(linear) AS linear
    , SUM(touch_point) AS touch_point
    FROM (
    SELECT *
    , IF(row_num = MIN(row_num) OVER(PARTITION BY user_pseudo_id), 1, 0) AS first_touch
    , IF(row_num = MAX(row_num) OVER(PARTITION BY user_pseudo_id), 1, 0) AS last_touch
    , 1 / MAX(row_num) OVER(PARTITION BY user_pseudo_id) AS linear
    , CASE
    WHEN MAX(row_num) OVER(PARTITION BY user_pseudo_id) = 1 THEN 1
    WHEN MAX(row_num) OVER(PARTITION BY user_pseudo_id) = 2 THEN 0.5
    ELSE
      CASE
    WHEN row_num = MIN(row_num) OVER(PARTITION BY user_pseudo_id) THEN 0.4
    WHEN row_num = MAX(row_num) OVER(PARTITION BY user_pseudo_id) THEN 0.4
    ELSE 0.2 / (MAX(row_num) OVER(PARTITION BY user_pseudo_id) - 2)
    END
    END AS touch_point
      FROM master
    ) GROUP BY page_title
    ORDER BY 2 DESC
  

ワザ190
閲覧するとCVRが高くなるページを網羅的に探索する

複数のコンテンツについて「表示したユーザー」「表示し、かつコンバージョンしたユーザー」「表示していないユーザー」「表示していない、かつコンバージョンしたユーザー」を可視化し、どのコンテンツを表示した場合にユーザー単位コンバージョン率が変化するのかを、網羅的に可視化するSQL文です。

    WITH master AS (
    SELECT DISTINCT user_pseudo_id AS cid
    FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_202101*`
    ), pvu AS (
    SELECT * FROM (
    SELECT user_pseudo_id AS cid
    , (SELECT value.string_value FROM UNNEST(event_params) WHERE key = "page_title") AS page
    FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_202101*`)
    WHERE REGEXP_CONTAINS(page, r"^(Home|Men's\s/\sUnisex\s\|\sApparel|Sale\s\|\sG|New\s\|\sG|Small\sGoods\s\|\sLifestyle|YouTube\s\|\sS|Bags\s\|)") IS true
    group by cid, page
    ), cvu AS (
    SELECT DISTINCT user_pseudo_id AS cid, 1 AS cv
    FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_202101*`
    WHERE event_name = "purchase")

    SELECT *, ROUND(view_user_cvr / non_view_user_cvr, 1) AS difference_ratio
    FROM (
    SELECT *
    , ROUND(non_view_cv_users / non_view_users, 4) AS non_view_user_cvr
    FROM (
    SELECT *, ROUND(view_cv_users / view_users, 4) AS view_user_cvr
    , (SELECT COUNT(DISTINCT cid) FROM master) - view_users AS non_view_users
    , (SELECT SUM(cv) FROM cvu) - view_cv_users AS non_view_cv_users
    FROM (
    SELECT page, COUNT(DISTINCT view_users) AS view_users, SUM(cv) AS view_cv_users
    FROM (
    SELECT master.cid AS all_users, pvu.cid AS view_users, pvu.page, cvu.cv
    FROM master
    LEFT JOIN pvu
    USING (cid)
    LEFT JOIN cvu
    USING (cid)
    WHERE page IS NOT NULL
    ) GROUP BY page)))
    ORDER BY 2 DESC
  

ワザ191
初回訪問からN日以内のLTVで初回訪問獲得を最適化する

「初回訪問から30日以内のLTV」ユーザーの最初のメディアを評価するSQL文です。

    WITH master AS (
      SELECT user_pseudo_id
      , MAX(user_first_touch_date) AS user_first_touch_date
      , MAX(user_first_medium) AS user_first_medium
      , SUM(revenue) AS revenue
    FROM (
    SELECT user_pseudo_id
      , CAST(DATETIME_TRUNC(DATETIME(timestamp_micros(user_first_touch_timestamp),'America/Los_Angeles'), day) AS date) AS user_first_touch_date
      , PARSE_DATE(""%Y%m%d"",event_date) AS event_date
      , traffic_source.medium AS user_first_medium
      , ecommerce.purchase_revenue_in_usd AS revenue
    FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_2020*`
    WHERE event_name IN ('first_visit','purchase')
    )
    WHERE DATE_DIFF(event_date, user_first_touch_date, day) <=30 AND user_first_touch_date >= '2020-11-01'
    GROUP BY user_pseudo_id
    )

    SELECT user_first_medium, COUNT(DISTINCT user_pseudo_id) AS users
      , SUM(revenue) AS ltv_within_30days_from_first_visit
      , ROUND(SUM(revenue)/COUNT(DISTINCT user_pseudo_id),2) AS avg_ltv_within_30days_from_first_visit
    FROM master
    GROUP BY user_first_medium
    ORDER BY 2 DESC
  

ワザ192
初回訪問時のメディアとランディングページごとのLTVを確認する

初回訪問のメディアと、ランディングページ別のユーザー数とLTVを取得するSQL文です。

    WITH ltv AS (
    SELECT user_pseudo_id, MAX(user_ltv.revenue) AS ltv, MAX(traffic_source.medium) AS first_media
    FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_202101*`
    GROUP BY user_pseudo_id)
    , flp AS(
    SELECT user_pseudo_id
    , (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location') AS page_location
    FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`
    WHERE event_name = "first_visit" )
    
    SELECT first_media, first_landing_page, COUNT(DISTINCT user_pseudo_id) AS users, SUM(ltv) AS ltv
    , SUM(ltv)/COUNT(DISTINCT user_pseudo_id) AS avg_ltv
    FROM (
    SELECT ltv.first_media, flp.page_location AS first_landing_page, ltv.user_pseudo_id, ltv.ltv
    FROM ltv JOIN flp USING(user_pseudo_id)
    WHERE ltv.first_media <> "(data deleted)"
    )
    GROUP BY first_media, first_landing_page
    ORDER BY 3 DESC
  

公開データは以上です。お詫びと訂正(正誤表)については、インプレスブックスの書籍詳細ページでご確認ください。