GA 360 Suite

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

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

今回は、私がよくBigQueryで使ってるGoogle Analytics 360用のSQL例を紹介します。
以前書いたAdobe Analytics編のGA360版です。

前提条件

  • 当然ながらGA360のデータをBigQueryにエクスポートしてる事。

ここでは、パブリックデータセットの bigquery-public-data:google_analytics_sample を使って説明します。

1. ページビュー数

日別で出します。
hits.type = ‘PAGE’ に絞るとページビューになる。
hitsはネストされたRECORD型のカラムになってるので、UNNEST関数でフラットにしてあげる必要があります。
以前書いた、BigQuery: Google Analytics 360のネストされたデータをフラット変換するSQLを参考。

SELECT
  DATE(TIMESTAMP_SECONDS(visitStartTime + CAST((hits.time / 1000) AS int64)), 'Asia/Tokyo') AS hitdate,
  COUNT(1) AS pageviews
FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_*`, 
  UNNEST(hits) AS hits
WHERE
  _TABLE_SUFFIX between  '20170701' AND '20170731'
  AND hits.type = 'PAGE'
GROUP BY 1
ORDER BY 1

なお、サイト全体のPVならtotals.pageviewsの数をSUM関数で合算する方法もあります。
しかしページ別に出したりするならばhitsレコードをUNNESTする事になるので、私は上記SQLをテンプレにしてます。
 

2. セッション数

fullVisitorId と visitNumberを文字列にしたものをCONCATして、ユニーク数をカウントしたのがセッション数。
これも日別で出します。

SELECT
  DATE(TIMESTAMP_SECONDS(visitStartTime + CAST((hits.time / 1000) AS int64)), 'Asia/Tokyo') AS hitdate,
  COUNT(DISTINCT CONCAT(fullVisitorId, SAFE_CAST(visitNumber AS string))) AS sessions
FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_*`, 
  UNNEST(hits) AS hits
WHERE
  _TABLE_SUFFIX between  '20170701' AND '20170731'
GROUP BY 1
ORDER BY 1

 

3. ユーザー数

fullVisitorIdのユニーク数をカウントするとユーザー数。
下記はhitdateでGROUP BYしてるので、日別のユーザー数を出してます。

SELECT
  DATE(TIMESTAMP_SECONDS(visitStartTime + CAST((hits.time / 1000) AS int64)), 'Asia/Tokyo') AS hitdate,
  COUNT(DISTINCT fullVisitorId) AS users
FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_*`, 
  UNNEST(hits) AS hits
WHERE
  _TABLE_SUFFIX between  '20170701' AND '20170731'
GROUP BY 1
ORDER BY 1

 

4. ページ別ランディング数・離脱数・直帰数

hits.page.pagePathがページ。
hits.isEntranceが1になってるページがランディング。
hits.isExitが1になってるページが離脱。
totals.bouncesが1だと直帰。

WITH t1 AS (
  SELECT
    hits.page.pagePath AS pagePath,
    CASE WHEN isEntrance THEN 1 ELSE 0
    END AS is_ent,
    CASE WHEN isExit THEN 1 ELSE 0
    END AS is_exit,
    CASE WHEN totals.bounces = 1 THEN 1 ELSE 0
    END AS is_bounce
    FROM
     `bigquery-public-data.google_analytics_sample.ga_sessions_*`,
      UNNEST(hits) AS hits
  WHERE
    _TABLE_SUFFIX between  '20170701' AND '20170731'
)
SELECT
  t1.pagePath,
  SUM(t1.is_ent) AS entrance,
  SUM(t1.is_exit) AS exit,
  SUM(t1.is_bounce) AS bounce
FROM t1
GROUP BY 1
ORDER BY 2 DESC

 

5. ページ平均滞在時間

fullVisitorId + visitNumberをセッションIDとして使う。
ページ別に次ページとのタイムスタンプの差分を合算した秒数をページ別トータル滞在時間として抽出。
次ページのタイムスタンプ差が1800秒以上あるものはセッションが切れてるので除外。
hits.isInteraction = trueで、非インタラクションヒットは除外。
滞在時間の合計を、ページのセッション数で割れば平均滞在時間になる。

WITH t1 AS (
  SELECT
    TIMESTAMP_SECONDS(visitStartTime + CAST((hits.time / 1000) AS int64)) AS hit_timestamp,
    CONCAT(fullVisitorId, SAFE_CAST(visitNumber AS string)) as sid,
    hits.page.pagePath AS pagePath
    FROM
     `bigquery-public-data.google_analytics_sample.ga_sessions_*`,
      UNNEST(hits) AS hits
  WHERE
    _TABLE_SUFFIX between  '20170701' AND '20170731'
    AND hits.isInteraction = true
),
t2 AS (
    SELECT
      hit_timestamp,
      sid,
      pagePath,
      CASE WHEN timestamp_diff(LEAD(hit_timestamp) OVER(PARTITION BY sid ORDER BY hit_timestamp), hit_timestamp, second) > 1800 THEN NULL
      ELSE LEAD(hit_timestamp) OVER(PARTITION BY sid ORDER BY hit_timestamp) END AS next_hit
    FROM t1
)
SELECT
  t2.pagePath,
  COUNT(DISTINCT t2.sid) AS visits,
  SUM(IFNULL(TIMESTAMP_DIFF(t2.next_hit, t2.hit_timestamp, second), 0)) AS totaltimespent,
  ROUND(SAFE_DIVIDE(SUM(IFNULL(TIMESTAMP_DIFF(t2.next_hit, t2.hit_timestamp, second), 0)), COUNT(DISTINCT t2.sid)), 2) AS avgtimespent
FROM t2
WHERE t2.pagePath IS NOT NULL
GROUP BY 1
ORDER BY 2 DESC

 

6. カスタムディメンションの集計

カスタムディメンションは縦持ちのレコードなので、横持ちに変換すると使いやすいです。
これまた、以前書いた記事に書いてます。

セッションスコープのカスタムディメンション4 x ヒットスコープのカスタムディメンション5 をクロス集計してセッション数を出します。
※なお、このサンプルデータではdimension5は空っぽです。

SELECT
  (SELECT value FROM UNNEST(t.customDimensions) WHERE index = 4) AS dimension4, 
  (SELECT value FROM UNNEST(hits.customDimensions) WHERE index = 5) AS dimension5, 
  COUNT(DISTINCT CONCAT(fullVisitorId, SAFE_CAST(visitNumber AS string))) AS sessions
FROM
  `bigquery-public-data.google_analytics_sample.ga_sessions_*` as t, 
  UNNEST(hits) AS hits
WHERE
  _TABLE_SUFFIX between  '20170701' AND '20170731'
GROUP BY 1, 2
ORDER BY 3 DESC

 

SQLでWeb解析ログを分析すると、Adobe Analytics や Google Analytics で集めたデータを自由にドリルダウン出来るのがメリットです。

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

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

ピックアップ記事

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

関連記事

  1. Google BigQuery

    Big QueryでWindow関数を用いて、累積和を計算する

    こんにちは。エクスチュアでインターンをさせて頂いている中野です。…

  2. Google Analytics

    Google Analytics フィルタ①

    こんにちは!今回はGAの機能の一つである「フィルタ」について解説したい…

  3. Adobe Analytics

    Adobe Analyticsに入り切らないデータをBigQueryに投入する

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

  4. Adobe Analytics

    Adobe Analytics: BigQueryでパーティシペーション指標を集計するSQL

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

  5. Google Analytics

    Server-side GTMのGAビーコンログをBigQueryにエクスポートして分解する

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

  6. Adobe Analytics

    Adobe Analytics: BigQueryにロードしたデータフィードをDataStudioで…

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

最近の記事

  1. モダンデータスタックなワークフローオーケストレーションツール…
  2. Streamlit in Snowflakeによるダッシュボ…
  3. Streamlit in SnowflakeによるStrea…
  4. Streamlitを使った簡単なデータアプリケーション作成ガ…
  5. 生成AI機能を活かしたデータカタログ製品「Secoda」を試…
  1. Google Tag Manager

    同一サイトにGTMを複数導入する危険性について
  2. Tableau

    Tableau Bridgeをザックリ理解する
  3. Tableau

    Tableauのヘックスタイルマップでヒートマップを地図上に粗く表現する
  4. Adobe Analytics

    購入とは-Adobe Analyticsの指標説明
  5. Adobe Analytics

    Metabase: カスタムマップで日本地図を追加する
PAGE TOP