Google アナリティクスとプライバシー・イベントトラッキング

原文: Google Analytics, Privacy, and Event Tracking on January 27, 2016 by Stephanie Hobson

自分の web サイトをユーザがどのように利用したか確認するのに、Google アナリティクス (GA) のようなサードパーティ製のサービスを利用することが多いかと思います。このようなサービスによって、ユーザの訪問時刻やクリックの内容を知ることができ、得られたデータはメンテナンス時間や機能の削除など、重要な意思決定の際に役立つことがあります。

これらのサービスは様々な web サイトで利用されているため、ユーザがインターネットを利用するほど、サービスを運用するサードパーティはユーザの情報を多く集めることができます。しかし、すべてのユーザがこの仕組みに満足しているわけではありません。不満を持つ人の中には Ghostery などの広告ブロッカーをインストールしたり、Firefox のトラッキング保護機能 を有効にしたりすることで、自分のプライバシーを守る取り組みを始めています。

私はとても良いことだと思います!

web サイトに支障が出ることも

web サイトのコードがサードパーティ製サービスに依存していたり、そのサービスにアクセスできない場合、web サイトの動作に支障が出ることがあります。

以降の例では、よくあるユースケースとして外部リンクのトラッキングを取り上げています。しかし、GA のスクリプトを読み込まなかったユーザが、私たちの web サイト内で移動できなくなってしまったため(特定のエッジケースであり、字面ほど深刻ではありません)、私はこの問題を調査することになりました。

また、今回はユニバーサルアナリティクスのトラッキングに用いるコード (analytics.js) を使用しています(旧来のコード ga.js ではありません)。そのため、私のコードと皆さんのコードとに異なる部分があるかもしれません。

何が問題なのか?

Google が 2016 年 1 月現在推奨している アウトバウンドリンクのトラッキング 方法は以下のようなものです。

<a href="http://www.example.com"
   onclick="trackOutboundLink('http://www.example.com'); return false;">
        Check out example.com
</a>
var trackOutboundLink = function(url) {
    ga('send', 'event', 'outbound', 'click', url, {
        'transport': 'beacon',
        'hitCallback': function(){document.location = url;}
    });
}

Google が推奨している内容は次の通りです。

  1. クリック時にユーザがページから移動しないよう、リンクに return false を追加する
  2. ユーザがリンクをクリックした際には、トラッキングのためにクリック内容を GA のイベントキューに追加し、終了したらユーザを新しいページに移動させるよう GA に伝える
  3. 受け取ったイベントを GA が処理する
  4. コールバックを GA が呼び出し、ユーザを新しいページへ移動させる

この仕組みにより、ユーザの行動を記録するまでユーザを確実に web サイトへ留めることができます。しかし、GA がイベントの処理に失敗した場合は… コールバックは決して呼び出されず、web サイト上のリンクがすべて壊れてしまいます。:(

ユーザが新しいページに移動できるかは GA 次第なのですが、もし GA のコードが決して実行されなかったとしたら?

どうやって問題を回避するか

現在推奨されている方法で GA を web サイトに追加している場合、以下のようなコードがすべてのページに含まれているはずです。

(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)})(window,document,'script','//www.google-analytics.com/analytics.js','ga');

ga('create', 'UA-xxxxx-x', 'auto');
ga('send', 'pageview');

このスニペットが生成したグローバルオブジェクト ga には、同じページに読み込まれた任意の JavaScript からアクセスできます。

これは以下の 2 つを意味します。

  1. GA が読み込まれる前にイベントをキューに追加できる(これなら早い段階で生じたイベントを簡単にトラッキングできますね!)
  2. これまでと同様 ga オブジェクトは常に存在しているので、オブジェクトの存在によって GA が読み込まれたか否かは判断できない

ならば GA が読み込まれたかどうかを知る術はあるのでしょうか?ええ、賢い人であれば GA が初期化時にグローバルオブジェクト ga を何通りかの方法で差し替えている事実に気づくでしょう。ただし、このことは Google の公式ドキュメントには何も書かれていないため、いずれは動作しなくなる可能性があります。

Google の Andreas Veithen 氏は自身のブログ記事 Tracking outbound links with Google Analytics で、ga オブジェクトが q という配列を持っているか否かを確認するのが最も信頼性がある、と提案しています。ga.q のキューで待機しているイベントすべてを GA が初期化時に処理したのち、この配列は削除されます。ga.q は先程のスニペットで作成される配列であり、そこに変更を加えると web サイトに影響を与えかねないため、Google の立場としては大きな変更と捉えるでしょう。対して、ga.q を削除しないように Google がコードを変更することもあり得ますが、これが他の方法よりも信頼性があるかどうかは分かりません。

John Morton 氏は自身のブログ記事 Google Analytics, Ghostery, and Event Tracking で、ga オブジェクトの create プロパティで判断することを提案しています。この手法であれば長く使えそうですし、おそらく最も広く使われている方法です(例えば GitHub でも利用されているようです)。

Dom Sammut 氏は自身のブログ記事 Workaround for when the hitCallback function does not receive a response (analytics.js) で、ga オブジェクトの loaded プロパティで判断できると述べています。この手法は Google のドキュメントでも 非公式に使われている節があり、いくらか信頼性があるかもしれません。確認している対象が明白なため、個人的にはこの方法が好みです。

最後の選択肢は、Google が推奨しているコードを以下のように書き換える方法です。

var trackOutboundLink = function(url) {
    // GA オブジェクトが存在し、かつ初期化されていることを確認する
    if(window.ga && ga.loaded) { {
        // 真ならば、リンクによる遷移を GA に任せる
        ga('send', 'event', 'outbound', 'click', url, {
            'transport': 'beacon',
            'hitCallback': function(){document.location = url;}
        });
    } else {
        // 偽ならば、リンクによる遷移を自分で行う
        document.location = url;
    }
}

サードパーティ製のスクリプトを利用する際は、どのようなスクリプトでも 上のような確認を行うのがグッドプラクティスです。また、自分のドメイン以外(CDN など)から読み込んだスクリプトに、ローカルのフォールバックも用意すべきでしょう。

ユーザのプライバシーを尊重する

ユーザの多くは自身のプライバシーに関心を持っていますが、プライバシーを保護する手段は他にもあります。ユーザのデータをより慎重に扱うには、国の定める法律や企業のプライバシーポリシーによる許可が勤務先によっては必要かもしれません。

プライバシーを意識した Google アナリティクスの設定

解析のプラットフォームとして Google アナリティクスを選択した場合、プライバシーを向上させる方法は数多くあります

設定が簡単なものの 1 つに、ユーザの IP アドレスを秘匿化するよう要求する方法があります。本質的には、Google アナリティクスが IP アドレスを記録する前に、アドレスの末尾に位置するオクテットを 0 に変更するものです

これを適用するには、トラッキングのスニペットにある ga('send', 'pageview'); の後に以下の行を追加します。

ga('set' 'anonymizeIp', true);

もちろん、Google はユーザの IP アドレスを依然と取得します(それが web の仕組みです)。この設定は IP アドレスを保存しないよう Google を信頼することだけです。

Do Not Track (DNT) を利用する

また、ユーザが Do Not Track を有効にしているか否かを確認し、読み込むスクリプトを積極的に切り替えることも可能です。

Schalk Neethling 氏は自身のブログ記事 Respect User Choice ~ Do Not Track でその仕組みを解説しています。要約すると、GA の呼び出し自体をラップすることで、ユーザが DNT を有効にしているかどうかの確認を GA を呼び出す前に行うというものです。

function _dntEnabled() {
    // ヘルパー関数を読み込む: https://github.com/schalkneethling/dnt-helper/blob/master/js/dnt-helper.js

}
// GA を読み込む前に DNT の値を確認する
if (!_dntEnabled()) {
    // include the Google Analytics snippet
}

こうすることで、ga オブジェクトがページのグローバルスコープに追加されなくなりますが問題はありません。その場合でも上記のスニペットは上手く動作します。

オンライン上におけるユーザのプライバシーを尊重しつつ解析サービスを利用する方法・提案は他にありますか?あなたのご意見を是非お聞かせください。

2 件のコメント

  1. Pingback from Google アナリティクスとプライバシー・イベントトラッキング | Google Analytics(Google アナリティクス) ニュース on :

    […] 発信元:modest 発信日:2016年4月17日 […]

  2. Ryota YAMADA :

    I have a good idea for this problem.

    It is better to judge whether you can get a tracker.
    Because, in case you put a multiple of Google Analytics to the site,
    it will NOT work when it is invalid only one tracker(which is using send events).

    So, I think following code.

    if (window.ga && window.ga.getByName(‘t0′)) {
    ga(‘send’, ‘event’, ‘outbound’, ‘click’, url, {
    ‘transport': ‘beacon’,
    ‘hitCallback': function() { document.location = url; }
    });
    } else {
    document.location = url;
    }