Googleアナリティクスの仕様に関する豆知識

## はじめに
Google Analytics Advent Calender 4日目の記事です

この記事では、Googleアナリティクスの公式ヘルプページに書かれているにもかかわらず知らない人が多い豆知識を3つ解説します。

## Googleアナリティクスは多通貨にデフォルトで対応している
多通貨で、世界中をターゲットにECサイトを運用しているサイトにおける豆知識です。

- 購入金額: 10,000円のトランザクション
- 購入金額: 900.50$のトランザクション
- 購入金額: 980元のトランザクション

が1日で発生した時、この日の売上金額はどのように表示されるの？と疑問に思う方もいると思います。

自分も先月、このような状況が発生して、どうすればいいのか悩みました。JavaScriptで為替レートを取得してきて、単一通貨に変換して送信しなきゃいけない？本気で？といった感じです。

答えは、

[Googleアナリティクスヘルプ - 通貨のリファレンス](https://support.google.com/analytics/answer/6205902?hl=ja)

に載っていました。トランザクションデータなど、金額データを送信するときに、その金額の通貨を一緒に送信すれば解決するようです。

Googleアナリティクスのサーバー側で、前日の為替レートに基づいて、単一の通貨に換算してレポートに表示してくれるようです。換算先の通貨は、ビューの設定で指定している通貨になります。

もし、通貨を送信しなかった場合、このような自動換算は行われず、
$10,000 + 900.50 + 980 = 11,880.5$
となってしまいます。


## 短時間の大量ヒット送信に関する制限
Googleアナリティクスのサーバーリソースを特定のサイトだけで過度に消費されないように、Googleアナリティクスには幾つかの制限があります。よく知られているものには、

- １か月のヒット送信数が1,000万件
- ユーザーあたり1日に20万ヒットまで
- セッションあたり500ヒットまで（拡張eコマースの処理を除く）

があります。が、実はあまり知られていない制限として、「短時間に大量にヒットを送信しないように」という制限があります。下記のコードを実行しても、50件のイベントは送信されず、20個前後しか送信されません。

```html
<html>
  <head></head>
  <body>
    <!-- begin: トラッキングコード -->
    <!-- 省略 -->
    <!-- end: トラッキングコード -->
    <script>
      for (var i = 1; i <= 50; i++) {
        ga('send', 'event', '大量イベント', 'Sample', i + '回目のイベント');
      }
    </script>
  </body>
</html>
```

[開発者向けGoogleアナリティクスヘルプ - Google アナリティクスのデータ収集上限](https://developers.google.com/analytics/devguides/collection/analyticsjs/limits-quotas)

によると、

> 各 analytics.js のトラッカー オブジェクトの上限は 20 ヒットから始まり、1 秒 2 ヒットの速度で回復していきます。e コマース（アイテムまたはトランザクション）を除くすべてのヒットタイプに適用されます。

となっており、この制限に引っかかっています。一度に大量のイベントを実行する可能性があるときは、この制限に注意するようにしましょう。内部的には、analytics.js内のライブラリでこのチェックを行っており、制限を受けている間は、GoogleアナリティクスのサーバーへのHTTPリクエストすら行われません。

また、analytics.jsやga.js、Android SDK、iOS SDKにも同様の制限があるようですが、Measurement Protocolにはどうやらこの制限がありません。実際、以前レポートの動きを確認するために、Rubyコードを使ってMeasurement Protocolから1000PVほど送信しましたが、問題なく処理されていました。Measurement Protocolの利用シーンの性質上、制限させることが難しい、ということかと思いますが、制限がないがために、リファラースパムが流行っているのかもしれません。

もう一つ、この制限はトラッカーオブジェクトごとに設定されています。Googleタグマネージャでは、トラッカー名を設定しない場合、各リクエストごとにトラッカーオブジェクトが生成される仕組みになっています。つまり、Googleタグマネージャを使っており、トラッカー名を設定しないで利用する場合は**この上限は無視して良い**と捉えることができます。

## デフォルトの設定では、「サイトの速度」レポートの数字は当てにならない
少し言いすぎました。しかし、
[開発者向けGoogleアナリティクスヘルプ - カスタム速度](https://developers.google.com/analytics/devguides/collection/analyticsjs/user-timings#sampling_considerations)
にあるように、「サイトの速度」に関するレポートは、ウェブサイトからGoogleアナリティクスにデータ送信するタイミングですでにサンプリング化されています。さらにそのサンプリングレートは、デフォルトでは1%と非常に少ない数値となっています。

3,000PV/日のサイトの場合、サイトの速度の対象となるページビューはわずか30件となります。モバイル端末の電波の悪い場所からアクセスしてきている人がいたら、それだけでサイトの速度の数値は大きく悪化します。

そうならないためにも、サイトの速度のレポートを利用する場合は、

- サンプリングレートを上げる。
- カスタムディメンションなどにClientIDやタイムスタンプを設定して、ローデータに近いデータを取得できるようにして、**サイトの速度の分布を見る**

ようにしましょう。サンプリングレートは、上記のヘルプページを参考に決めてください（おそらく、ほとんどのサイトでは10%で良いと思います）。特に、レポートに表示される平均値を見るのではなく、分布を見ることが非常に重要です。過去の自分の経験では、トータルの平均読み込み時間は14.78秒となっており、非常に時間がかかっているように見えましたが、その実態は

> 1.15, 1.22, 1.42, 1.44, 1.53, 1.83, 1.93, 2.11, 2.20, 2.23, 2.25, 2.37, 2.38, 2.81, 2.86, 2.98, 3.21, 3.94, 4.50, 4.74, 5.26, 5.42, 5.65, 6.27, 6.30, 6.47, 6.53, 6.59, 6.68, 7.34, 7.49, 7.86, 9.31, 366.20, 

となっていました。ここから異常値とみられる「366.20」を除外して計算し直すと、4.13秒となります。基本的に速度に関するレポートは、その値が正規分布とは程遠い分布になるはずなので、平均値を過度に信用しないようにする必要があります。

なお、サンプリングレートは、

```js
ga('create', 'UA-XXXXXX-Y', {
  'siteSpeedSampleRate': 10
});
```
のようにして、トラッカーを生成することで実現できます。Googleタグマネージャーを使う場合は、「設定するフィールド」で、

- フィールド名：siteSpeedSampleRate
- 値：10

を設定します。


## 終わりに
たった3つの豆知識でしたが、いくつ知っているものがありましたか？
まだまだ奥が深いのがGoogleアナリティクスです。