Google Analyticsからデータの取り込み

こんにちは、渡部です。

今回は、Google Analyticsからデータを取り出してみたいと思います。

Google Analytics

新卒の頃からGoogle Analyticsの存在は知っていましたが、どのように活用すべきか、いつも疑問に感じてました。(使うのならちゃんと使ってあげたいですよね!)

Google Analyticsのデータを活用するのは公式のレポート画面でも十分だとは思うのですが、自分が見知った環境にデータを取り込むのも一つの方法だと思います。

今回は、Pythonを使ってデータをGoogle Analyticsのデータを取り込みたいと思います。

完成版は、https://github.com/watanany/ga_testにあります。

Google Analyticsからデータの取り込み

APIのセットアップ

Google AnalyticsはAPIを公開しており、それを利用します。

はじめてのアナリティクス Reporting API v4: インストール済みアプリケーション向け Python クイックスタート | アナリティクス Reporting API v4 | Google Developers

を参考に、APIの有効化と認証情報のセットアップを行います。

セットアップが完了したら、client_secrets.jsonView IDが手に入ります。

完成版では、./config/client_secrets.jsonにファイルを置くようにしました。

View ID./lib/get_print.pyVIEW_IDにセットしました。

Google Analyticsのデータ

レポートデータの構造

Google Analyticsではディメンジョン(dimension)と指標(metrics explorer)という用語が出てきます。

ディメンションと指標 - アナリティクス ヘルプ

あまり見ない言葉なのですが、「ディメンジョン」が言葉で表せる属性(性別や地域など)、「指標」が数値で表せる属性(セッションの数、ページ遷移の数など)のようです。

セグメントについて - アナリティクス ヘルプ を見るとレポートデータの構造としては以下のようになっているのだと思われます。

ユーザー > セッション(30分以内のブラウジング) > ヒット(ページ内でのアクション)

(セグメントはレポートデータのフィルタ群らしい)

このレポートデータから、どんな情報を取り出すかを指定できるのがディメンジョンと指標です(間違えてたらすみません(^^;))

ディメンジョンと指標の組み合わせ

ディメンジョンと指標を組み合わせて、どのようにレポートデータを取り出すかを指定できますが、その中でも組み合わせられるものと組み合わせられないものがあるようです。

どのようなものを組み合わせられるかをチェックするのは面倒ですが、以下のURLで組み合わせの整合性をチェックできるようです。

Dimensions & Metrics Explorer | アナリティクス Reporting API v4 | Google Developers

今回の組み合わせ

./lib/get_print.pyでは「ユーザーのID(ga:userBucket)」と「ユーザーごとに訪れたページのタイトル(ga:pageTitle)」というディメンジョン、「ページの表示数(ga:pageViews)」という指標を使ってデータを取り出しています。

一ヶ月分のデータの取り込み

以下のコードで、データを取り込めるようにしました。

https://github.com/watanany/ga_test/blob/master/lib/get_print.py

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import argparse
import csv
from io import StringIO
from functools import reduce
from operator import add
from httplib2 import Http
from toolz import compose
from oauth2client import client
from oauth2client import file
from oauth2client import tools
from apiclient.discovery import build

SCOPES = ['https://www.googleapis.com/auth/analytics.readonly']
DISCOVERY_URI = ('https://analyticsreporting.googleapis.com/$discovery/rest')
CLIENT_SECRETS_PATH = './config/client_secrets.json'

VIEW_ID = '<取得したView IDを入れる>'

DIMENSIONS = ['ga:userBucket', 'ga:pageTitle']
METRICS = ['ga:pageViews']
ORDER_BYS = ['ga:userBucket']


def initialize_analyticsreporting():
    """Initializes the analyticsreporting service object.
    Returns:
      analytics an authorized analyticsreporting service object.
    """
    # Parse command-line arguments.
    parser = argparse.ArgumentParser(
        formatter_class=argparse.RawDescriptionHelpFormatter,
        parents=[tools.argparser])
    flags = parser.parse_args([])

    # Set up a Flow object to be used if we need to authenticate.
    flow = client.flow_from_clientsecrets(
        CLIENT_SECRETS_PATH, scope=SCOPES,
        message=tools.message_if_missing(CLIENT_SECRETS_PATH))

    # Prepare credentials, and authorize HTTP object with them.
    # If the credentials don't exist or are invalid run through the native client
    # flow. The Storage object will ensure that if successful the good
    # credentials will get written back to a file.
    storage = file.Storage('./config/analyticsreporting.dat')
    credentials = storage.get()
    if credentials is None or credentials.invalid:
        credentials = tools.run_flow(flow, storage, flags)
    http = credentials.authorize(http=Http())

    # Build the service object.
    analytics = build('analytics', 'v4', http=http, discoveryServiceUrl=DISCOVERY_URI)

    return analytics

def get_report(analytics, page_token=None):
    # Use the Analytics Service Object to query the Analytics Reporting API V4.
    body = {
        'reportRequests': [
            {
                'viewId': VIEW_ID,
                'dateRanges': [{'startDate': '31daysAgo', 'endDate': 'today'}],
                'dimensions': [{'name': d} for d in DIMENSIONS],
                'metrics': [{'expression': m} for m in METRICS],
                'orderBys': [{'fieldName': f} for f in ORDER_BYS],
                'pageToken': page_token
            }
        ]
    }

    return analytics.reports().batchGet(body=body).execute()

def get_reports(analytics):
    page_token = None
    while page_token != -1:
        response = get_report(analytics, page_token)
        report = response['reports'][0]
        page_token = report.get('nextPageToken', -1)
        yield report

def convert(report):
    """Convert Google Analytics Report to 2D Array
    Returns:
      M 2D Array
    """
    M = []
    for row in report['data']['rows']:
        dimensions = row['dimensions']
        metrics = row['metrics'][0]['values']
        M.append(dimensions + metrics)
    return M

def main():
    analytics = initialize_analyticsreporting()
    M = compose(list, reduce)(add, [convert(report) for report in get_reports(analytics)])

    csv_io = StringIO(newline='')
    w = csv.writer(csv_io, quoting=csv.QUOTE_ALL)
    w.writerow(DIMENSIONS + METRICS)
    for row in M:
        w.writerow(row)

    print(csv_io.getvalue())


if __name__ == '__main__':
  main()

中身を見ていただくとわかるのですが、一度のAPI呼び出しでは全てのデータを取り出すことはできません。

APIのレスポンスには、nextPageTokenという値が入っていて、それを使っていくことによってデータを一ヶ月分取り出しています。

感想

Google Analyticsはデータの計測ツールとして頻繁に使われるツールだと思います。

Webページにタグを埋め込むだけで使えるという簡単さも魅力的ですが、使いこなすにはまだまだ覚えることが多そうでした。 というか用語が難しい

このツールを使うことによってデータを有用に活用でき、このツールを知ることによってどのようにデータを整理すべきかを学べる素晴らしいツールですね。

本当はGoogle Analyticsのデータを使って勉強会で行った「KMeans + 遺伝的アルゴリズム」で、本ブログのユーザーをクラスタリングしてみたかったのですが、取り込む手順だけで長くなってしまったので省略します。

ソースコードは、https://github.com/watanany/ga_test(./lib/calc.py)に置いてあるので、興味がある方はぜひ見てみてください。

それでは〜。