こんにちは、エクスチュアの權泳東(権泳東/コン・ヨンドン)です。
今回は、私がよく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認定データエンジニア資格を保持した技術者達によるデータ分析基盤構築業務を承っております。
お問い合わせはこちらからどうぞ。
ブログへの記事リクエストはこちらまで