Google Analytics

Google Analytics StandardのデータをBigQueryで分析するための力技

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

先月「Google Cloud認定プロフェッショナル・データエンジニア資格」試験に合格しました。

というわけで、これからもGoogle Cloud Platformのビッグデータ製品を使ったTipsをこのブログでドシドシ紹介して行きます。

さて、今回は

“Google Analytics Stadard (無料版)を使っているが、このデータをBigQueryで分析したい。そして有料版のAnalytics 360を使う予定はない。”

というケースに効くワザです。
もちろん無料版のStandardでは、BigQueryエクスポート機能が使えないので工夫が必要です。

1.Google Analytics Standard でヒット毎にユニークなヒットIDを計測する

 
Gooogle Analytics Standardだと長いので、以下「GA」と略します。

GAでヒットIDを計測するためには、タイムスタンプ+ClientIDのデータをカスタムディメンションで計測します。
そうすると、訪問者別のタイムスタンプが記録されるので、これがヒットを識別するためのユニークなIDになります。

前回のブログでGTMでClientIDを取得する方法を書きましたが、今回もそれを応用してCustomTaskを使います。

では、下記のJavascriptを使って、カスタムディメンションに「タイムスタンプ+クライアントID」によるヒットIDをセットします。
この例ではdimension3番に入れてます。

名前: hit_id
中身:

function() {
  return function(model) {
    var cid = model.get('clientId');
    var timestamp = new Date().getTime();
    model.set('dimension3',  timestamp + '_' + cid);
  }
}

このhit_idを、GAタグのcustomTaskの値にセットします。
※customTaskフィールドの設定方法は前回のブログに書いたとおりです

2.Reporting APIでヒットIDx各ディメンション別のクロス集計データを抽出する

 
Reporting APIを使うためには、

・Google Cloud Platformのプロジェクトの作成
・Reporting API の有効化
・サービスアカウントの作成 → GAユーザーとしてGAに登録

この3つが必要です。
セットアップツールが用意されてるので、まだ上記のセットアップが済んでない場合は実施します。

ReportingAPIを実行するためのサービスアカウントを作成したら、JSON形式の認証キーをダウンロードしておいてください。
のちほど使います。

さらに、このサービスアカウントに対してGAレポートの閲覧権限が必要なので、
GAのユーザー設定から、今回作成したサービスアカウントをユーザーとして登録しておきます。

では、いよいよAPIを実装します。
Javascriptが大好きな私はNode.jsで実装しました。これをmain.jsという名前のファイルで保存します。

/*
* main.js
*/
if (process.argv.length < 4) {
    console.log('Usage: node main.js dimenstion YYYY-MM-DD YYYY-MM-DD');
    process.exit(1);
}

let dname = process.argv[2];
let start = process.argv[3];
let end = process.argv[4];

const {google} = require('googleapis');
const analyticsreporting = google.analyticsreporting({
  version: 'v4'
});

let apikey = require('./my-sample-project.json'); //サービスアカウントの認証キーJSONを指定
let client = new google.auth.JWT(apikey.client_email, null, apikey.private_key, ["https://www.googleapis.com/auth/analytics"], null);

let runReport = async() => {
    let res = await analyticsreporting.reports.batchGet({
        resource: {
            reportRequests: [{
                "viewId": "123456789", //GAのビューIDを指定
                "dateRanges": [{
                    "startDate": start,
                    "endDate": end
                }],
                "dimensions": [{
                    "name": "ga:dimension3" //ヒットIDが入ってるカスタムディメンション
                },{
                    "name": dname
                }],
                "metrics": [{
                    "expression": 'ga:hits'
                }]
            }]
        },
        auth: client
    });
    let d = res.data.reports[0].data.rows
    for (let i=0; i<d.length; i++) {
        console.log(d[i].dimensions[0] + '\t' + d[i].dimensions[1]);
    }
};
client.authorize().then(c => runReport());

この実装では、ヒットID(カスタムディメンション3)と、任意のディメンションをひとつクロス集計した状態で取得出来ます。
これを使って、ページパス、参照元、デバイスカテゴリ、セッション回数、などなど、、、各ディメンション別のデータを取得して行きます。

そして最後にヒットIDをキーにして集約すれば、ヒット毎のローデータ代わりになる、という事です。

さて、使い方はこうです。

$ node main ディメンション名 開始日 終了日 > 出力先ファイル

これを使って、まずは試しにページパス、参照元、デバイスカテゴリ、セッション回数を取得します。

$ node main ga:pagePath 2018-05-01 2018-05-30 > page.txt
$ node main ga:fullReferrer 2018-05-01 2018-05-30 > referrer.txt
$ node main ga:deviceCategory 2018-05-01 2018-05-30 > device.txt
$ node main ga:sessionCount 2018-05-01 2018-05-30 > session.txt

出来上がったファイルを、BigQueryに別々のテーブルにロードして行きます。

例えば、page.txtをmy-sample-project:mydataset.pageにロードするなら

$ bq load --source_format=CSV --field_delimiter="\t" my-sample-project:mydataset.page page.txt hit_id:string,page:string 

というコマンドでロード出来ます。

3.ヒットIDをキーにして各データを結合する

 
さて、それぞれ個別のテーブルにロードしたあとは、hit_idをキーにして結合して一つのテーブルを作ります。

#standardSQL
select p.hitid as hitid,
p.page as page,
r.referrer as referrer,
d.device as device,
s.session as session
from
`mydataset.page` as p
left join `mydateset.referrer` as r on p.hitid = r.hitid
left join `mydateset.device` as d on p.hitid = d.hitid
left join `mydateset.session` as s on p.hitid = s.hitid;

このクエリをテーブルとして保存すると、こういう結果になりました。

hit_id列がキーとなり、そのヒットで閲覧されたページパス、参照元、デバイスカテゴリ、セッション回数というヒットデータになっている事が分かります。
今回はヒットIDの他に4つのディメンションだけ使いましたが、同じ要領でその他のディメンションも取り出していけば、さらに詳細なヒット事のローデータを再現出来るようになります。

Reporting APIには制限があり、例えば一度に取得可能なレコードは最大10,000行までです。(デフォルトは1,000行)
そのため、10,000行以上のデータを取り出す場合は、レスポンスに含まれるnextPageTokenパラメータを取得して次のリクエストにセットする必要があります。
詳細はAPIのリファレンスに書いてあります。

今回はGoogle Analytics Standard(無料版) でヒットIDがを計測して、ヒット事のデータをReporting APIで抽出してBigQueryにロードする方法についてでした。

弊社はGoogle Cloud認定データエンジニア資格を持つエンジニア達がGoogle AnalyticsやAdobe Analyticsのデータを分析するための分析基盤構築の支援を行っております。
お問い合わせはこちらからどうぞ。

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

Adobe Summit 2018 レポート(1):AIとヒトで最高の経験を!前のページ

Adobe Cloud Platform Auditor (Powered by ObservePoint)を使ってみた次のページ

ピックアップ記事

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

関連記事

  1. Analytics Hub

    BigQueryでもデータクリーンルームの検証

    こんちには、喜田です。エクスチュアでは顧客のSnowflak…

  2. Adobe Analytics

    【超わかる】WEB解析の全貌

    はじめにこんにちは!インターン生の與那覇(ヨナハ)です今回は時代の…

  3. Adobe Analytics

    Adobe AnaltyicsとGoogle Analytics の「生Webビーコン」をBigQu…

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

  4. Google BigQuery

    BigQueryのユーザー定義関数(UDF)をTableauで使う

    こんにちは、エクスチュアの渡部です。今回はTableauでstan…

  5. Google Analytics

    Google Tag Manager上でGoogle AnalyticsのclientIDを取得する…

    2018/4/20追記:この記事の内容は古いので、下記の新しい記事…

  6. Google Tag Manager

    サーバーサイドGTM: ウェブコンテナを使って1stパーティドメインからgtm.jsを配信してみた

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

カテゴリ
最近の記事
  1. dbt Projects on Snowflake使ってみた…
  2. Cortex Analystを使ってみた
  3. SnowflakeのAI_SQLと再帰CTEで遊ぶ(Snow…
  4. dbt Fusion使ってみた
  5. Manusを使ってみたうえでManusに感想ブログを書かせて…
  1. Qualtrics

    イベントレポート Qualtrics XM on tour TOKYO 2022…
  2. ブログ

    「Power BI」を使ってみよう!
  3. Adobe Analytics

    Adobe Analyticsと「どこどこJP」のAPIを連携する
  4. Cloud Dataproc

    BigQueryテーブルをAVRO形式でエクスポートしてHiveで扱う
  5. Adobe Analytics

    続・SafariのITP2.x対策として別サーバー使ってクッキーを永続化する
PAGE TOP