Adobe Analytics

Adobe Analytics + Google BigQueryでよく使うSQL例 6選

こんにちは、エクスチュアの權泳東(権泳東/コン・ヨンドン)です。

今回は、私がよくBigQueryで使ってるAdobe Analytics用のSQL例を紹介します。
GA360編はこちら

もうBigQueryあるからAdobeのUIいらねーよってくらいBigQuery依存です。

以前、レガシーSQLの例を掲載しましたが、今回は標準SQLです。

前提条件

当然ながらAdobeAnalytics DatafeedをBigQueryにロードしてる事。

  • スキーマのテンプレート: All Columns Premium (August 2018)
  • 原則 exclude_hit = 0の行を利用する
  • hit_time_gmt列(UTC)で日付分割パーティションを作ってるので、期間を絞る場合はタイムゾーンをAsia/Tokyoにしてを使う

1. ページビュー数

post_page_event = 0 がページビュー。
日別で出します。

SELECT
  DATE(hit_time_gmt, 'Asia/Tokyo') AS date,
  COUNT(1) AS pageviews
FROM
  `datafeed.hit_data`
WHERE
  DATE(hit_time_gmt, 'Asia/Tokyo') >= '2019-01-01'
  AND DATE(hit_time_gmt, 'Asia/Tokyo') < '2019-02-01'
  AND exclude_hit = 0
  AND post_page_event = 0
GROUP BY 1
ORDER BY 1

 

2. 訪問回数

post_visid_high + post_visid_low + visit_num を文字列にしたものをCONCATして、ユニーク数をカウントしたのが訪問回数。
これも日別で出します。

SELECT
  DATE(hit_time_gmt, 'Asia/Tokyo') AS date,
  COUNT(DISTINCT CONCAT(post_visid_high, post_visid_low, SAFE_CAST(visit_num AS string))) AS visits
FROM
  `datafeed.hit_data`
WHERE
  DATE(hit_time_gmt, 'Asia/Tokyo') >= '2019-01-01'
  AND DATE(hit_time_gmt, 'Asia/Tokyo') < '2019-02-01'
  AND exclude_hit = 0
GROUP BY 1
ORDER BY 1

 

3. 訪問者数

post_visid_high + post_visid_low をCONCATして、ユニーク数をカウントすると訪問者数。
下記はdateでGROUP BYしてるので、日別訪問者数を出してます。

SELECT
  DATE(hit_time_gmt, 'Asia/Tokyo') AS date,
  COUNT(DISTINCT CONCAT(post_visid_high, post_visid_low)) AS visitors
FROM
  `datafeed.hit_data`
WHERE
  DATE(hit_time_gmt, 'Asia/Tokyo') >= '2019-01-01'
  AND DATE(hit_time_gmt, 'Asia/Tokyo') < '2019-02-01'
  AND exclude_hit = 0
GROUP BY 1
ORDER BY 1

 

4. ページ別入口数・出口数(離脱数)・直帰数

post_visid_high + post_visid_low + visit_numをセッションIDとして使う。
これをhit_time_gmtを昇順ソートして、一番目のページが入口。
逆にhit_time_gmtを降順ソートしたら、一番目のページが離脱。
そして入口&離脱になったページが直帰。
post_page_event = 0に絞ってるので「直帰数」になってますが、「バウンス数」を見たい場合はpost_page_event = 0を外せば良い。

WITH
  t1 AS (
  SELECT
    hit_time_gmt,
    post_pagename AS pagename,
    CONCAT(post_visid_high, post_visid_low, SAFE_CAST(visit_num AS string)) AS sid,
    CASE
      WHEN ROW_NUMBER() OVER(PARTITION BY CONCAT(post_visid_high, post_visid_low, SAFE_CAST(visit_num AS string))  ORDER BY  hit_time_gmt) = 1 THEN 1
      ELSE 0
    END AS is_lp,
    CASE
      WHEN ROW_NUMBER() OVER(PARTITION BY CONCAT(post_visid_high, post_visid_low, SAFE_CAST(visit_num AS string))  ORDER BY  hit_time_gmt DESC) = 1 THEN 1
      ELSE 0
    END AS is_exit,
    CASE
      WHEN COUNT(1) OVER(PARTITION BY CONCAT(post_visid_high, post_visid_low, SAFE_CAST(visit_num AS string))) = 1 THEN 1
      ELSE 0
    END AS is_singlevisit
  FROM
    `datafeed.hit_data`
  WHERE
    DATE(hit_time_gmt, 'Asia/Tokyo') >= '2019-01-01'
    AND DATE(hit_time_gmt, 'Asia/Tokyo') < '2019-02-01'
    AND exclude_hit = 0
    AND post_page_event = 0)
SELECT
  t1.pagename,
  SUM(t1.is_lp) AS entry,
  SUM(t1.is_exit) AS exit,
  SUM(t1.is_singlevisit) AS singlevisit
FROM t1
GROUP BY 1
ORDER BY 2 DESC

 

5. ページ平均滞在時間

セッションID別にLEAD関数で次のhit_time_gmtとの差分を合算した秒数をトータル滞在時間として抽出。
30分以上(1800秒以上)経過した場合はカウントしない。
滞在時間の合計を、セッション数で割れば平均滞在時間になる。

WITH
  t1 AS (
  SELECT
    hit_time_gmt,
    post_pagename AS pagename,
    CONCAT(post_visid_high, post_visid_low, SAFE_CAST(visit_num AS string)) AS sid,
    CASE WHEN timestamp_diff(LEAD(hit_time_gmt) OVER(PARTITION BY CONCAT(post_visid_high, post_visid_low, safe_cast(visit_num as string)) ORDER BY hit_time_gmt), hit_time_gmt, second) > 1800 THEN NULL
ELSE LEAD(hit_time_gmt) OVER(PARTITION BY CONCAT(post_visid_high, post_visid_low, safe_cast(visit_num as string)) ORDER BY hit_time_gmt) END AS next_hit
  FROM
    `datafeed.hit_data`
  WHERE
    DATE(hit_time_gmt, 'Asia/Tokyo') >= '2019-01-01'
    AND DATE(hit_time_gmt, 'Asia/Tokyo') < '2019-02-01'
    AND exclude_hit = 0)
SELECT
  t1.pagename,
  COUNT(DISTINCT t1.sid) AS visits,
  SUM(IFNULL(TIMESTAMP_DIFF(t1.next_hit, t1.hit_time_gmt, second), 0)) AS totaltimespent,
  ROUND(SAFE_DIVIDE(SUM(IFNULL(TIMESTAMP_DIFF(t1.next_hit, t1.hit_time_gmt, second), 0)), COUNT(DISTINCT t1.sid)), 2) AS avgtimespent
FROM t1
WHERE t1.pagename IS NOT NULL
GROUP BY 1
ORDER BY 2 DESC

 

6. 購入回数(purchase) および各events数

purchaseイベントはpost_event_listに、「1」というIDで格納されてます。
このカラムはカンマ区切りで同時に発生したeventsが格納されてるので、post_event_listの前後にカンマを付けて「,1,」が含まれる数をカウントすればOK.
duplicate_purchase=0に絞れば、重複purchaseを除外。
なお、event1〜event100は 200〜299 というIDが付与され、event101〜event1000は 20100〜20999 になる。

SELECT
  DATE(hit_time_gmt, 'Asia/Tokyo') AS date,
  COUNT(1) AS purchases
FROM
  `datafeed.hit_data`
WHERE
  DATE(hit_time_gmt, 'Asia/Tokyo') >= '2019-01-01'
  AND DATE(hit_time_gmt, 'Asia/Tokyo') < '2019-02-01'
  AND exclude_hit = 0
  AND duplicate_purchase = 0
  AND CONCAT(',', post_event_list, ',') LIKE '%,1,%'
GROUP BY 1
ORDER BY 1

 

これさえ分かれば、応用して任意のカラム別(ディメンション別)に集計出来ますね。

おまけ

以下は過去に書いた記事です。

events変数集計用SQL

フォールアウト用SQL

パスレポート(フローレポート)用SQL

ファーストタッチ・ラストタッチ・パーティシペーション(アトリビューション)用SQL

 

弊社では、Google Cloud認定データエンジニア資格とAdobe認定エキスパート資格を保持した技術者達によるデータ分析基盤構築業務を承っております。
お問い合わせはこちらからどうぞ

ブログへの記事リクエストはこちらまで

ピックアップ記事

  1. 最速で理解したい人のためのIT用語集

関連記事

  1. Adobe Analytics

    Adobe AEP SDK: リバースプロキシを使ったアプリ計測検証方法

    こんにちは、エクスチュアの權泳東(コン・ヨンドン)です。Ado…

  2. Adobe Analytics

    検索エンジン-自然とは-Adobe Analyticsの指標説明

    こんにちは。インターン生の市川です。今回は検索エンジン-自然について…

  3. Adobe Analytics

    異常値検出とは-Adobe Analyticsの指標説明

    今回は異常値検出について説明いたします。異常値検出とは過去のデータ…

  4. Google BigQuery

    オープンソースBI「Metabase」の使い勝手が丁度良かった

    こんにちは、エクスチュアの權泳東(コン・ヨンドン)です。ほんの…

  5. Google Analytics

    Google Analytics 4: イベントパラメータをセッションスコープで集計する方法

    こんにちは、エクスチュアの權泳東(権泳東/コン・ヨンドン)です。…

  6. Adobe Analytics

    Adobe Analyticsを学ぶ

    Adobe Analyticsを学ぶ -エクスチュアのツール紹介-Ad…

最近の記事

  1. 【GA4/GTM】dataLayerを使ってカスタムイベント…
  2. 【GA4/GTM】dataLayerを活用しよう
  3. ジャーニーマップをデジタルマーケティングの視点で
  4. ChatGPT ProからClaude3 Proへ移行した話…
  5. その分析、やり方あってる?記述統計と推測統計の違い
  1. IT用語集

    グループウェア(Groupware)って何?
  2. ブログ

    ページ作成ツール"Marketo"を使ってみて。
  3. Qualtrics

    イベントレポート Qualtrics XM on tour TOKYO 2022…
  4. IT用語集

    インベントリ(Inventory)って何?
  5. 海外カンファレンス

    Adobe Summit 1日目
PAGE TOP