Hatena::ブログ(Diary)

ある1つのサンプル

2011-01-05

Google Analyticsのイベントトラッキングを利用した簡易アンケート

昨年のBlogaraで最もアクセスがあったテーマは、 世間的にも色々と話題になったAKB48

所属メンバーの所有するブログが多く、さらにブログの更新頻度も高いという事で、 アイドルグループはBlogaraにはうってつけのテーマと言えます。


以前のテーマ:AKB48では、SDN48も一緒に扱っていましたが、 SDN48のメジャーデビューに向けた各人の公式ブログ開始に伴い、さすがに1テーマで扱うにはブログが増えすぎた為、SDN48を独立したテーマとして分離しました。

よって現在のテーマ:AKB48では、AKB48とSKE48の全正規メンバーの(携帯向けのIP制限が掛かっておらず誰でも読む事が出来る)全ブログが登録されています。

が、現状でも既に150近いブログとなっており、しかも今後AKB48の正規メンバー増員とSKE48 チームEメンバーの個人ブログ開始による登録ブログ数増加が見込まれ、 さらに今年始動したNMB48の扱いも考えなければならない為、この機会にテーマ:AKB48の構成を見直そうと考えました。

そこで利用者の方々の意見も参考にすべきという訳で、テーマページにアンケートフォームを設置してみる事にします。


テーマの構成についての利用者へのアンケート

Webページにアンケートを設置する場合には、サーバー側のスクリプトでの処理と集計が一般的ですが、 処理内容と集計結果の確認はアクセス解析と同様のものとなる為に、単純なものであれば開発と設置にはそれほどのコストは掛かりません。 ただ、ある程度複雑なデータ解析を行おうとする場合にはそれなりのコストが掛かり、あまりお手軽とは言えません。


高機能の解析の定番と言えばGoogleAnalytics(以下GA)。 そこで、GAを利用しアンケートを行う事が出来ないかと考えたのが今回の発端。

既にBlogaraでは、ブログの人気ランキングの参考資料として利用する為に、 GAのイベントトラッキングを利用したブログリンクのクリック数カウントを行っていますので、 今回のアンケートにもその手法を流用し、設置の手間も少なく尚且つ多様な機能を駆使して集計結果を確認出来るGAでアンケート計測を行ってみます。


今回のポイントとしては、

ボタン1クリックによる決定
今回は単一項目のアンケートとなる為に、アンケートフォームの定番であるチェックボックスラジオボタンと送信ボタンを組み合わせた形では無く、 選択肢が表示されたボタンの1クリックで送信を行えるようにする。
これにより、ユーザーの操作行動が一段階省略出来、その分アンケート回答までのハードルを多少下げる事が見込まれ、 尚且つアンケートフォームのUI設置面積も削減可能となる。
1ユーザーは1度の回答
通常のアンケート同様に、各利用者には1度だけ回答を行ってもらう事が望ましいので、 回答したか否かを(localStorageでは無く)Cookieに保存し、回答済みであるならアンケートフォーム自体を表示しないようにする。
アンケートの期間中に常時表示されるようなケースでは、目立つ場所に表示させると非常に目障りとなるが、 一度回答したユーザーにはアンケートが表示されない為、比較的目立つ場所にアンケートフォームを置いたとしても弊害は少なく、回答率上昇が期待出来る。
イベントトラッキングの値の設定
既にBlogaraではいくつかの用途でイベントトラッキングを利用しているので、それらと区別出来るカテゴリ/アクション/ラベルを設定する。

GAでのイベントトラッキング

GAのイベントトラッキングでは公式ガイドにもある通り、 カテゴリ/アクション/ラベル/値という分類にそれぞれ任意の値を設定出来ます。

例えば、Blogaraで既に利用している各ブログへのリンクがクリックされた回数を記録するイベントトラッキングでは、

カテゴリ
イベントの種類を表し、ここではブログリンククリックを意味するlinkが設定されている。
アクション
誰のどのブログがクリックされたかを記録する用途で利用。メンバーID_ブログIDの組み合わせで指定され、581_1060のような値が記録される。
ラベル
補足情報としてどのテーマで表示されていたのかを記録。akb48akb_sel2のようなテーマIDが格納される。
数値
未使用

カテゴリ/アクション/ラベルはそれぞれ大分類/中分類/小分類として利用する感覚で問題無いと思われます。 また、数値に整数値が必要とされる以外、他の3項目は文字列として扱われるので自由に値を設定出来ます。
# 恐らく文字列はUTF-8として扱っていると思われるので、UTF-8なら日本語もOKな気もしますが、
# 未確認なので詳細は不明


そこで、今回のアンケートも上記の利用法に準拠し各項目を設定します。

カテゴリ
イベントの種類を表すカテゴリには、アンケートを意味するenqを設定。
アクション
akbtpc_01のようなアンケートの回答が格納される。
ラベル
何のアンケートかの識別値が格納。akb48。今回はアクションにもアンケートの種類を表す文字列(akbtpc_)が含まれる為、実質利用していない単なるオマケ。
数値
未使用

テーマページへの実装

という訳で早速テーマ:AKB48ページへのアンケートフォームの設置を行います。設置場所は各テーマの補足情報を表示する為に用意されているブログ一覧タブの上部になります。

// アンケートフォームを表示するエリアを設定
<div id="dvEnqArea" class="mbtnArea"></div>
<script type="text/javascript"> 
(function(){
  // checkEnqStateは、Cookieを参照し既に回答したか否かをチェックする処理。
  // 回答済みならアンケートを表示しない。
  if ( !Blogara.checkEnqState('akbtpc','akb48') ) 
  { 
    var elem = $('dvEnqArea'); 
    // アンケートフォームとして表示される説明文とボタンの作成
    elem.set( 'html', '<button id="btEnq01">1. 今後NMB48を追加し...' ); // 略
    // EventDelegationを利用し、個々のボタンにでは無くアンケートエリアにイベントを設定
    elem.addEvent( 'click', function(ev){ 
      var ma = ev.target.id.match(/^btEnq(\d+)/); 
      // クリック対象が指定のIDを割り当てられたアンケート回答ボタンの場合にだけ処理を行う
      if ( ma ) 
      {
        // setEnqDataでは、Cookieに回答済みフラグをセットし、GAのイベントを発行
        Blogara.setEnqData( 'akbtpc', 'akb48', ma[1], {path:'/t/akb48'} ); 
        elem.set( 'html', '<hr />アンケートへのご協力ありがとうございます' ); 
      } 
    }); 
  } 
})(); 
</script>

実際にGAにイベントトラッキングを記録する処理は、

Blogara = {
  // アンケートの回答記録をCookieに保存と同時にAnalyticのイベントトラッキングにも記録
  setEnqData: function( idEnq, label, value, opt ) {
    if ( !label ) label = '';
    // enqNameはアンケートを意味する'enq'
    var action = idEnq+'_'+value, key = Blogara.enqName+'_'+idEnq+'_'+label;
    if ( !opt ) opt = {};
    // enqExipreには30日を設定
    if ( !opt['duration'] ) opt['duration'] = Blogara.enqExpire;

    // Cookieにアンケート回答済みフラグを設定
    Du.CookieCtrl.set( key, value, opt );

    Blogara.sendEventTracking( Blogara.enqName, action, label );
  },

  // GoogleAnalyticsのイベントトラッキングに記録
  sendEventTracking: function( category, action, label ) {
    if ( _gaq )
    {
      // 非同期GAの初期化が終る前は単なる配列、
      // 初期化終了後はGAの非同期管理オブジェクトとなる_gaqにイベントを渡す
      _gaq.push( ['_trackEvent', category, action, label] );
    }
    return true;
  }
}

簡単に言うと、アンケートボタンには回答番号が含まれたIDが設定され、 そのクリックイベントからどの回答が選択されたかを取得し、カテゴリ/アクション/ラベルを組み立てGAのイベントトラッキングを発行する。という処理になります。

GAの非同期版では、 _gaq.push( ['_trackEvent', category, action, label] ); のように_gaqオブジェクト(又は配列)のpushメソッドに'_trackEvent'とカテゴリ/アクション/ラベルを引数として渡す事で、イベントとして記録されます。


実際にページで表示されるアンケートフォームとしては、
アンケートフォームの表示
のようになり、
ボタンとして実装されたアンケート回答をクリックすると、
アンケートの回答
と表示され、
次回このページを訪れた場合には、
回答済みの状態でのページ表示
このようにアンケートの形跡も無いスッキリした表示となります。


アンケート集計

GAのメニュー このアンケートを設置したのは先月19日となり既に半月が経過していますので、現時点でのアンケートの集計結果が確認出来ます。

イベントトラッキングのデータは、GAの メニュー / コンテンツ / イベントのトラッキングから確認出来ます。
イベントのトラッキングをクリックした後に右側のメイン画面に表示されるのがサマリーとなります。


サマリー画面では以下のようにイベントの概要を確認出来ます。 イベントサマリー
後は通常のGAの各種操作が可能になり、例えばアクションakbtpc_03をクリックし、そこからそのアクションを行ったユーザーの参照元キーワードを確認出来ます。
アクションの詳細


二重回答のチェック

このようなWeb上でのユーザー登録を伴わないアンケートでは、回答済みか否かのチェックは大抵Cookieを利用しています。 よって、多少そのあたりの事情を知るユーザーがCookieを削除し複数回の回答を行う事も十分考えられます。

今回は単なる意見募集としてのアンケートなのでそこまで工作するほどのものではありませんが、 例えば人気投票のような、ランキングとして発表されるケースでは注意する必要があります。


残念ながらGAの集計情報の元となるのはクライアントからの自称情報なので、手の込んだ工作に対応する事は正直難しいと言えます。

このような場合、同一人物かの判定を行う参考材料としてIPアドレス帯が利用されますが、 GAではユーザーのIPアドレスが把握出来ずそれが出来ません。

その為、とりあえず今回のアンケートでは、サービスプロバイダ都市の組み合わせを確認し、 それほどメジャーでは無いプロバイダと都市の組み合わせでの回答が多い場合には、 さらにその詳細を分析し、不自然な点が見受けられる場合にはその大半を無効票として判断しています。


結果

このように簡単なアンケートであるなら、設置の容易さと共に集計結果の確認の際に使い慣れた機能を使えるGoogle Analyticsのイベントトラッキング利用は非常に有効であり、 強くお勧め出来る手法となります。

ただ、イベントトラッキングに関しては"誰が"よりも"何を"したかに重点がおかれていますので、 "誰が"(というかどのようなユーザーが)アンケートに回答し、そのユーザーがどのようにサイトを利用しているかを知りたい場合には、 イベントトラッキングと共にユーザー定義を利用するのが良いかと思われます。