engineering データ分析 デザイン戦略チーム

Google アナリティクスにやって来るゴーストスパムとその対策

engineering データ分析 デザイン戦略チーム

こんにちは。デザイン戦略チームの @zaimy です。

今回は、ロリポップ!のサービスサイトで利用している Google アナリティクスに、ゴーストスパムによる異常なデータが記録される問題が発生したので、その原因と対策をご紹介します。

異常なデータが記録されて Slack で相談されている様子

  1. Google アナリティクスにおけるスパムとは
  2. ゴーストスパムの見分け方
  3. ゴーストスパムの対策方法
    1. 自サイトのホスト名でフィルタする
    2. ウェブサイトへアクセスしたデータをカスタムディメンションでフィルタする
  4. まとめ

Google アナリティクスにおけるスパムとは

Google アナリティクス(ユニバーサル アナリティクス)では、ウェブサイトのトラッキングコードやモバイルアプリの SDK の他に、Measurement Protocol を使って、ユーザーの利用状況に関するデータをプログラマブルに送信できます。

Google アナリティクスの Measurement Protocol を使用すると、HTTP リクエストでユーザーの利用状況に関する生データを Google アナリティクス サーバーに直接送信できます。

Measurement Protocol の概要  |  Google Developers

この Measurement Protocol を悪用して、ウェブサイトへのアクセスを行わずにデータを不特定多数のプロパティに送りつける「ゴーストスパム」という手法が存在します。また、任意のドメインをリファラにセットすることでレポートの閲覧者を誘導する場合は「リファラスパム」と呼ばれます。

ゴーストスパムの見分け方

前述の通り、ゴーストスパムはウェブサイトへのアクセスが発生しないため、サーバーのアクセスログとアクセス数を突き合わせることで、ゴーストスパムが発生しているかどうか判別が可能です。

また、ロリポップ!のプロパティにやって来たゴーストスパムの場合は、ホスト名やリファラ、ユーザーの環境に関するディメンションに値がセットされていないデータが多く見られました。これらのディメンションに値がセットされていなかったり、不審な値がセットされている場合はゴーストスパムを疑えるでしょう。

ゴーストスパムの対策方法

自サイトのホスト名でフィルタする

不特定多数のプロパティに対してゴーストスパムが行われる際、具体的にはランダムなプロパティ ID に対してデータが送信されますが、ターゲットとなったプロパティの実際のホスト名はスパマーには分からないため、送信されるデータのホスト名は値がセットされていないか、適当な値がセットされています。これを利用して、自サイトのホスト名でフィルタを作成することで、ホスト名に適当な値がセットされているデータをレポートから除くことができます。

Google アナリティクスの Admin パネルから View の Filters を選択して、次の通りフィルタを作成します。

  • Filter Type: Custom
  • Include
  • Filter Field: Hostname
  • Filter Pattern: 自サイトのホスト名を表す正規表現

ロリポップ!でのホスト名でのフィルタの設定例

Google アナリティクスでトラッキングされている自サイトのホスト名を正確に把握するには、Audience » Technology » Network レポートでプライマリディメンションに Hostname を選択することで一覧を見ることができます。

ただし、この方法ではホスト名に値がセットされていないデータを除くことができません(数年前まではできたようですが、検証したところ現在はできなくなっています)。そこでロリポップ!では、次のカスタムディメンションでフィルタする方法を採りました。

ウェブサイトへアクセスしたデータをカスタムディメンションでフィルタする

この方法では、ウェブサイトでのトラッキングに固定値のカスタムディメンションを設定し、その値でフィルタを行うことで、実際にウェブサイトにアクセスしていないデータをレポートから除きます。

Google アナリティクスの Admin パネルから Propety の Custom Definitions » Custom Dimentions を選択して、スコープが Session のカスタムディメンションを定義します。

更に、カスタムディメンションに固定値がセットされるように、次のような一行をトラッキングコードに追加します。ページごとの最初のトラッキングよりも前にカスタムディメンションがセットされるように注意しましょう。

ga('set', 'dimension1', 'Lolipop Anti-ghost-spam Dimension');

最後に、Google アナリティクスの Admin パネルから View の Filters を選択して、次の通りフィルタを作成します。

  • Filter Type: Custom
  • Include
  • Filter Field: 定義したカスタムディメンション
  • Filter Pattern: カスタムディメンションにセットした固定値を表す正規表現

ロリポップ!でのカスタムディメンションでのフィルタの設定例

まとめ

ロリポップ!ではこれらのフィルタを適用することで、ゴーストスパムによる異常なデータをレポートから除外することができました。また、冒頭の画像にあるような明らかな異常値を示している日以外にも、実は定常的に一定のスパムデータが含まれていたことも確認されました。

スパムデータは一度レポートに含まれてしまうと、セグメントなどで除外するのが面倒なものです。ウェブサイトのトラッキングを行っている場合は、現在明らかな異常値が無い場合でも、この記事で紹介したフィルタを設定しておくと良いのではないでしょうか。