Googleアナリティクスを用いてWeb以外のリアルを計測する


[Google Analytics Advent Calendar 2015](http://qiita.com/advent-calendar/2015/ga)の説明文に

> Google社のWebトラッキングツール、Google Analyticsのことについて。

とありますが、Googleアナリティクスは、ユニバーサル・アナリティクスになって、Webだけに適用範囲を止めないマーケティング・ツールとなっています。

実際に、Webトラッキング用のライブラリ以外に、Google社はAndroid/iOSやUnityといったプラットフォーム向けのライブラリを提供しています。さらに、どんなプラットフォームであっても、HTTPリクエストさえ実行できれば利用可能な**Measurement Protocol**というデータ送信方法も準備されています。

今回は、Measurement Protocolを使って、Web以外の世界の計測にもGoogleアナリティクスを導入してみましょう、というお話です。

## Measurement Protocolとは何か
Googleアナリティクスにデータを送信するための方法の1つで、詳細は[Google公式の開発者向けヘルプ - アナリティクス Measurement Protocol](https://developers.google.com/analytics/devguides/collection/protocol/v1/)に記載されています。

Measurement Protocolでは、

```http
POST /collect HTTP/1.1
Host: www.google-analytics.com

v=1              // Version.
&tid=UA-XXXXX-Y  // Tracking ID / Property ID.
&cid=555         // Anonymous Client ID.

&t=pageview      // Pageview hit type.
&dh=mydemo.com   // Document hostname.
&dp=/home        // Page.
&dt=homepage     // Title.
```

のようなHTTPリクエストを送信することで、Web以外のプラットフォームからでも、Googleアナリティクスにページビューデータを送信することができます。

送信することができる値の種類は、上記のパラメーターだけでなく、[Measurement Protocol のパラメータ リファレンス](https://developers.google.com/analytics/devguides/collection/protocol/v1/parameters)に掲載されているパラメーターを利用することができます。

さらに、ユニバーサル・アナリティクスでは「カスタムディメンション」「カスタムメトリクス」という項目を使って、任意のパラメーターを作成することができるようになっています。計測したい対象に合わせて、任意のパラメーターを作成してデータを送信すると、後からGoogleアナリティクスのレポートを見た時に少し分かりやすくなります。

## 指定されたフォルダ以下の各ファイルのサイズ情報を送信する例
今回は、Rubyスクリプトを用いて、特定フォルダ以下の全ファイルのファイルサイズをGoogleアナリティクスに送信してみます。

```rb
require 'staccato'
require 'date'
module MeasurementProtocolSample
  class FileSizeTracker
    def initialize(hostname, path)
      @hostname = hostname
      @path = Pathname.new(path)
      @datetime = DateTime.now
    end

    def files
      Dir.glob("#{@path}/**/*").collect do |file|
        stat = File.new(file).stat
        filepath = file
        filepath = file + '/' if stat.ftype == 'directory'
        {
          :path => filepath,
          :size => stat.size,
          :type => stat.ftype,
        }
      end
    end

    def send_to(tracking_id)
      tracker = Staccato.tracker(tracking_id)
      self.files.each do |file|
        pageview = Staccato::Pageview.new(tracker, {
          path: file[:path].gsub(@path.to_s, ''),
          hostname: "#{@hostname}:#{@path}",
          campaign_source: 'Measurement Protocol',
          campaign_medium: '(none)',
          campaign_name: @datetime,
        })
        pageview.add_custom_metric(1, file[:size])
        pageview.add_custom_dimension(1, file[:type])
        pageview.track!
      end
    end
  end
end

tracker = MeasurementProtocolSample::FileSizeTracker.new('MyServer3', '/var/www/analytics')
tracker.send_to('トラッキングID')
```

簡単に解説します。
まず、Measurement Protocolの送信には、Rubyの便利なライブラリ「[Staccato](https://github.com/tpitale/staccato)」を利用しています。

また、送信するデータは、ホスト名として、該当のサーバー名＋計測対象のルートディレクトリまでのパスを設定しています。そして、計測URLとして各ファイルのパスを設定してみました。

そして、ファイルサイズをカスタムメトリクスとして登録して、送信しています。その他ディレクトリか否かをカスタムディメンションに設定して送信してみました。

こういった、どの項目をどのようなデータとしてGoogleアナリティクスに送信するべきか？は、Googleアナリティクスに詳しくないと難しい問題ですが、仕様さえ把握してしまえば簡単です。



## 他にどんな活用方法がある？
上記のように、Webとは全く異なるプラットフォームからGoogleアナリティクスにデータを送信することができます。このMeasurement Protocolを用いれば、リアルデバイスのセンサーで取得したデータをGoogleアナリティクスに送信することも可能です。

POSレジと連動させたり、ビーコンを使って人の往来をトラッキングすることができるようになります。自分は、体重計が記録したデータを、Measurement Protocolを使って、Googleアナリティクスにデータ送信しています。当然、体重や体脂肪率といったデータをカスタムメトリクスとして作成し、送信しているので、いつでも過去の自分の体重などのデータをGoogleアナリティクスを通して見ることができます。