こんにちは、エクスチュアの權泳東(権泳東/コン・ヨンドン)です。
前回の続きです。
今回は、BigQueryにストリーミングインサートされてるAdobe AnalyticsとGoogle AnalyticsのWebビーコンログを抽出して、Lookerでグラフ化します。
1. BigQueryでAA/GAログを抽出する
ビーコンのログそのものは見づらいので、加工必須です。
あと、ビーコンにはセッションの情報がありません。
という訳で、各ヒット間のタイムスタンプが30分以上開いていたら、新しいセッションとしてカウントします。
そのうえで、PV、セッション数、UU数をビーコンログからカウントします。
AAビーコンの場合
使ってるs_codeのバージョンに依存するのですが、弊社はAppMeasurement1.7+VisitorAPIなので、midというパラメータに訪問者IDが入ります。
それを訪問者IDとして使います。
また、URLにブログタイトルが入る事があるので、それを見やすくするために2回デコードします。
あとはページビューだけ集計したいので、&pevパラメータ(クリックイベント)も除外します。
CREATE TEMPORARY FUNCTION decodeTwice(str String) RETURNS STRING LANGUAGE js AS """ var ret = ''; if (str) { try { ret = decodeURIComponent(decodeURIComponent(str)); } catch(e) { ret = str; } } return ret; """; WITH base AS ( SELECT hit_time, DATE(hit_time, 'Asia/Tokyo') AS date, REGEXP_EXTRACT(log, r"&mid=(\d+)&") AS vid, decodeTwice(REGEXP_EXTRACT(log, r"&g=([^&]+)")) AS page_url FROM `beacon.hit_data` WHERE REGEXP_CONTAINS(log, r"&mid=(\d+)&") AND NOT REGEXP_CONTAINS(log, r"&pev") AND log_type = 'aa' ), history AS ( SELECT hit_time, LAG(hit_time, 1) OVER (PARTITION BY vid ORDER BY hit_time) AS last_hit, date, vid, page_url FROM base), aalog AS ( SELECT *, CASE WHEN TIMESTAMP_DIFF(hit_time, last_hit, second) > 1800 THEN 1 WHEN last_hit IS NULL THEN 1 ELSE 0 END AS session_start FROM history ) SELECT hit_time, date, vid, SUM(session_start) OVER (PARTITION BY vid ORDER BY hit_time) AS session_num, page_url FROM aalog
GAビーコンの場合
これもAAと同じ要領で、パースします。
GAの場合はcidというパラメータに訪問者IDが入ります。
また、URLにブログタイトルが入る事があるので、それを見やすくするために2回デコードします。
あとはページビューだけ集計したいので、&t=pageviewの行だけ抽出します。
CREATE TEMPORARY FUNCTION decodeTwice(str String) RETURNS STRING LANGUAGE js AS """ var ret = ''; if (str) { try { ret = decodeURIComponent(decodeURIComponent(str)); } catch(e) { ret = str; } } return ret; """; WITH base AS ( SELECT hit_time, DATE(hit_time, 'Asia/Tokyo') AS date, REGEXP_EXTRACT(log, r"&cid=(\d+\.\d+)&") AS vid, decodeTwice(REGEXP_EXTRACT(log, r"&dl=([^&]+)")) AS page_url FROM `beacon.hit_data` WHERE REGEXP_CONTAINS(log, r"&cid=(\d+\.\d+)&") AND REGEXP_CONTAINS(log, r"&t=pageview") AND log_type = 'ga' ), history AS ( SELECT hit_time, LAG(hit_time, 1) OVER (PARTITION BY vid ORDER BY hit_time) AS last_hit, date, vid, page_url FROM base), galog AS ( SELECT *, CASE WHEN TIMESTAMP_DIFF(hit_time, last_hit, second) > 1800 THEN 1 WHEN last_hit IS NULL THEN 1 ELSE 0 END AS session_start FROM history ) SELECT hit_time, date, vid, SUM(session_start) OVER (PARTITION BY vid ORDER BY hit_time) AS session_num, page_url FROM galog
SQLを実行すると、このような結果になります。
AAの場合
session_numの列に各訪問者ID別に訪問回数が入ってます。
GAの場合
こちらも同様にsession_numに訪問回数が入ります。
あとはこのデータを使って、COUNTでページビュー数、vid+session_numのCOUNT DISTINCTでセッション数、vid単体のCOUNT DISTINCTでユーザー数が出せるようになります。
2. Lookerでログデータをグラフ化する
ここからLookerの出番です。
上記のSQLを使って、Derived Table(派生テーブル)を作ります。
LookerのDerived TableでBigQueryのUDFを使う時の注意点
SQL Runnerの実行結果からDerived Table用のLookMLを簡単に作る事が出来るのですが、UDFが入ったままのDerived Tableを作るとエラーが発生します。
Syntax error: Expected “(” or keyword SELECT or keyword WITH but got keyword CREATE
回避策はここらへんに書いてありますが、UDFだけ別のexploreセクションに分けてあげて、Derived Tableのビューからはextends句で参照するとエラーを回避出来ます。
ビューのLookMLはこうなりました。
view: aa_log { derived_table: { sql: WITH base AS ( SELECT hit_time, REGEXP_EXTRACT(log, r"&mid=(\d+)&") AS vid, REGEXP_EXTRACT(log, r"&g=([^&]+)") AS page_url FROM `beacon.hit_data` WHERE REGEXP_CONTAINS(log, r"&mid=\d+&") AND NOT REGEXP_CONTAINS(log, r"&pev") AND log_type = 'aa' ), history AS ( SELECT hit_time, LAG(hit_time, 1) OVER (PARTITION BY vid ORDER BY hit_time) AS last_hit, vid, page_url FROM base), aalog AS ( SELECT *, CASE WHEN TIMESTAMP_DIFF(hit_time, last_hit, second) > 1800 THEN 1 WHEN last_hit IS NULL THEN 1 ELSE 0 END AS session_start FROM history ) SELECT hit_time, vid, SUM(session_start) OVER (PARTITION BY vid ORDER BY hit_time) AS session_num, page_url FROM aalog ;; } measure: pageview { type: count drill_fields: [detail*] } measure: uu { type: count_distinct sql: ${vid} ;; drill_fields: [detail*] } measure: session { type: count_distinct sql: concat(${vid}, safe_cast(${session_num} as string)) ;; drill_fields: [detail*] } dimension_group: hit_time { type: time timeframes: [ raw, time, date, week, month, quarter, year ] sql: ${TABLE}.hit_time ;; } dimension: vid { type: string sql: ${TABLE}.vid ;; } dimension: session_num { type: number sql: ${TABLE}.session_num ;; } dimension: page_url { type: string sql: decodeTwice(${TABLE}.page_url) ;; } set: detail { fields: [hit_time_time, vid, session_num, page_url] } }
これだけクリアすれば、あとは普通のLookerの使い方です。
Exploreでデータを抽出して、任意のVisulizationを選んでグラフ化します。
日別のページビュー・セッション数・ユーザー数と、ページ別の数字をササっとグラフ化して、ダッシュボードに並べるだけでログデータの可視化が出来ました。
今回はAdobeAnalyticsとGoogleAnalyticsのビーコンデータを横取りして、それをダッシュボード化しましたが、ワザワザAA/GAを使わなくても自分でビーコン計測タグを作れば、あとはGCPとLookerを使って即席Web解析ツールの出来上がり!という訳です。
弊社では各種マーテックツールの導入支援と、Google Cloud Platformを使ったデータ分析基盤構築を主に行っております。
お問い合わせはこちらからどうぞ。
ブログへの記事リクエストはこちらまで