Categories
Web分析一般

統計学の基礎

統計学は昔かなり勉強したつもりでいたのですが、結構忘れているところがありました。
わざわざ公開するような内容でもないですけど、復習がてらまとめておきたいと思います。

記述統計学の基礎

記述統計学の基本統計量

相加平均
いわゆる平均。観測データの合計値を観測数で割ったもの。算術平均ともいう。和ではなく積を用いた相乗平均もある。
最頻値(モード)
対象データの中で最も多く観測された値
中央値(メジアン)
データを大きな順に並べたときの中央に位置する値。観測データが正規分布ではなく、ベキ分布に従っている場合など、データの種類によっては平均値よりも代表値として相応しい場合もある。
分散
データのばらつきを表す値。各観測データから平均値を引いて二乗したものの総和を観測数で割る。観測数-1で割った場合は不偏分散と呼ぶ。
標準偏差
データの散らばり具合を示す値。分散の正の平方根
データが正規分布に従っていて、観測数が十分に大きい場合、標準偏差を「σ」とすると、「平均値±σ」の範囲に全体の68.3%が収まる。「平均値±σ*1.96」の範囲で95%が収まり、「平均値±σ*2.58」に99%が収まる

以下のようなデータの場合を考えます(便宜的にRの文法で書きます)。

dataA <- c(5,7,3,6,8,3,6,8,4)
dataB <- c(6,3,5,7,2,3,6,6,8,2)

この場合は各基本統計量は以下のようになります。

data A data B
相加平均 5.556 4.8
最頻値 3, 6, 8 6
中央値 6 5.5
分散 3.777778 4.622222
標準偏差 1.943651 2.149935

統計的検定

上で挙げたdataAとdataBが10点満点で何かに対する評価をしていたとすると、dataAとdataBのどちらの評価が高いと言えるのでしょうか?
(ベキ分布ではなく)正規分布に沿っていると仮定すると、代表値としては平均値が適してそうです。
dataAの平均は「5.556」なのに対し、dataBの平均は「4.8」です。これだけみると、dataAの方が評価が高いと言えそうです。
ほんとにそうでしょうか?dataBの方が標準偏差が大きくバラツキが大きそうです。であれば、高い評価の人と低い評価の人に割れていると考えられます。

2集団の間に違いがあるかどうかを調べるには、T検定を用いて検定を行います。T検定は平均値の差の検定です。
T検定には以下の3種類があります。

  • 等分散を仮定するT検定
  • 等分散を仮定しないT検定
  • 対応のある場合のT検定

同一の評価者によるデータであれば「対応のある場合のT検定」を用いますが、今回はデータ数も違うので対応はないと考えられます。
等分散を仮定できるかどうかは必要であれば、F検定を行って判別します。面倒なので今回は省いて、等分散を仮定しないことにします。

T検定の計算方法はちょっと面倒なので、Rに任せてしまいます。

> t.test(dataA, dataB, var.equal = FALSE)

        Welch Two Sample t-test

data:  dataA and dataB
t = 0.8045, df = 16.998, p-value = 0.4322
alternative hypothesis: true difference in means is not equal to 0
95 percent confidence interval:
-1.225864  2.736975
sample estimates:
mean of x mean of y
5.555556  4.800000

P値(p-value)が0.05以下であれば信頼度95%で、有意差があると言えます。今回はP値が0.4322なので、有意差はなさそうです。

T検定が有効なのは、あくまでも「1対1の比較のみ」です。3つのグループの間の平均値の差を検定したいという場合には使えません。そういう場合は多重比較を行います(ここでは省略します)。

推測統計学と区間推定

記述統計学は観測対象となるデータの性質を正確に記述することを目的としているのに対し、推測統計学では一部のデータ(サンプル)から母集団の性質を推測しようとするものです。

sample Aとsample Bに対して、アンケートを取ってYesかNoかを聞いてみました。結果は以下のようなクロス表になりました。

YES NO 合計
sample A 60 90 150
sample B 80 70 150

行パーセントを計算すると、このようになります。

YES NO 合計
sample A 40.0% 60.0% 100%
sample B 53.3% 46.7% 100%

まず、Sample Aで「YES」と答える確率について考えます。
150人中60人がYESと回答したので、YESと答える確率は40%となります。
この「40%」というデータはどこまで正確なのでしょうか?観測対象となった人数は150人だけですが、これはあくまでもサンプルとして抽出した人の人数であって、背後には多数の「母集団」がいます。では、母集団がYESと答える確率はどの程度でしょうか?これを推測するのが推計統計学の目的となります。

まず、Sample Aの分散と標準偏差を考えます。
確率の場合、分散と標準偏差は以下のような式で簡単に求められます。
確率をPとすると、

  • 分散=P(1-P)
  • 標準偏差=√(P(1-P))

なので、Sample Aの場合、

  • 分散: 0.4*(1-0.4)=0.24
  • 標準偏差: √0.24 = 0.4898979

記述統計の場合は「平均値±σ*1.96」で95%の範囲の値を出すことができましたが、母集団の推測の場合、標準偏差ではなく、標準誤差を用いることで母集団がとりうる値の範囲を推測することができます。

標準誤差をSE、標準偏差をSD、サンプル数をnとすると、標準誤差(SE)は

で算出することが可能です。この時、

が成立します。ちなみに、

が成り立ち、計算は非常に楽になります。

(近似計算を行わずに)計算すると、SampleAの標準誤差は4%となります。
記述統計の場合と同じように、母集団のとりうる値は、
95%の信頼度で、
確率±SE*1.96
となります。
よって、Sample Aの母集団は
下限:32.16%
上限:47.84%
が取りうる値の範囲となります。

同様に、Sample Bの母集団は
下限:45.35%
上限:61.32%
が取りうる値の範囲となります。

確率の検定

それでは、SampleAとSampleBは、どちらのほうがYesと回答する割合が高いと言えるのでしょうか。記述統計の場合と同様に検定を行うことで差の有無を検証します。
確率の検定は通常の場合、カイ二乗検定を行います(サンプル数が非常に少ない場合はフィッシャーの正確確率検定を利用します)。

Rで検定すると、このようになります。

> data
  YES NO
1  60 90
2  80 70
> chisq.test(data)

        Pearson's Chi-squared test with Yates' continuity correction

data:  data
X-squared = 4.8348, df = 1, p-value = 0.02789

P値(p-value)が0.02789で、0.05を下回っているので、SampleAとSampleBに違いがあると認めることができそうです。

Categories
GoogleAnalytics

コンテンツごとの接触管理

Google Analyticsを含む大抵のアクセス解析ツールでは、サイトごとでユーザーの新規訪問、再訪問を判別することが可能です。また、ほとんどのツールでは、そのサイトへの訪問回数まで取得することができます。

しかし、場合によってはサイト単位ではなく、コンテンツ単位・ディレクトリ単位で新規・再訪や訪問回数を取得したい場合があります。ツールによってはプロファイルを分けることで、取得可能な場合もありますが、多くのツールではコンテンツ単位・ディレクトリ単位で新規・再訪を取得することは実質的に不可能です。

代替案として、JavaScriptとCookieを使って、コンテンツの接触を管理していくことができます。この方法を採ることで、各コンテンツの新規・再訪や訪問回数を取得することが可能です。
(なぜ、代替案なのかというと、セッションの管理が解析ツール側とは、どうしても異なってしまうからです。完璧にツール側とセッションの定義を合わせることは難しいです。)

接触履歴の管理方法

実際にどのようなプログラムを走らせるのかを簡単に説明します。

まずコンフィグセクションで、計測対象とするグループを正規表現で指定します。
初めてサイトへ訪れたとき、初期化処理が走ります。
計測対象とするグループの数を判断して、接触履歴管理用の「箱」を2つ作り、cookieへ保存されます。例えば、5つのグループを計測対象とする場合は、
「a0_b0_c0_d0_e0」という箱が2つ作られます。1つはセッションcookieで、もう1つは永続cookieです。

「a」に該当するコンテンツへ訪れた場合、セッションcookie、永続cookieの両方とも値がインクリメントされ、
「a1_b0_c0_d0_e0」
となります。
もう一度、「a」に該当するコンテンツを訪問してもインクリメントされないようになっています。インクリメントされるのはセッションで1回のみです。そのため、セッションcookieのa~eの後に続く数字は1以上にはならないようになっています。
当然、「b」に該当するコンテンツを訪問した場合、「b」がインクリメントされて、
「a1_b1_c0_d0_e0」

2回目以降のセッションでは、永続cookieはそのまま保持されていて、セッションcookieはセッションの初めに初期化され、
「a0_b0_c0_d0_e0」
となります。
永続cookieの方は、前回「a」と「b」に訪問しているので、
「a1_b1_c0_d0_e0」
のままです。
また、「a」のコンテンツへ訪問した場合、
セッションcookieと永続cookieの両方がインクリメントされて、
セッション:「a1_b0_c0_d0_e0」
永続:「a2_b1_c0_d0_e0」
となります。

このようにして、各コンテンツの接触履歴を管理していきます。
ちなみに各コンテンツの訪問回数MAXは「9」なので、10回以上訪問してもインクリメントされないようにしています。(16進法使うとかありますけど、面倒なだけなので)

プログラム使い方

一応、プログラムを載せておきますが、そのまま使えるかどうかは保証できません。

このプログラムはセッションの開始時のみ、グローバル変数「window.gnrResult」に「a1_b1_c0_d0_e0」のような箱を返すようにしています。これは初回訪問時には、「a0_b0_c0_d0_e0」という空の箱が返され、初回以外では前回セッションの最後の永続cookieの値が返されます。セッション開始時以外は「false」が帰ってきます。

Google Analyticsで利用する場合は、セッション管理に「__utmb」と「__utmc」を使っていますので、必ず計測タグより前の位置でこのプログラムを読み込むようにしてください。

あとは普通に、
if(window.gnrResult){
_gaq.push([“_setCustomVar”, 1, window.gnrResult, 2]);
}
みたいな感じで書けば、セッションの最初のみ箱の値がカスタム変数で送信されます。スコープはセッションが良いと思います。

アドバンスドセグメントを使えば簡単に、各セグメントごとの新規再訪でセグメント化することができます。(正規表現「^a0_.+」でセグメントを作れば「a」のコンテンツへの新規訪問者のみのセグメントが抽出される)
各コンテンツへの訪問回数を知りたい場合は。。。気合で集計してください!!

ちなみに、このプログラムはlocation.pathnameでURLを判断しているだけですけど、「リファラー」とか「URLパラメータ」とかで判断できるようにしてしまえば。。。。

group_new_return.js

/*************************************
グループ単位での訪問回数をカウントするスクリプト。

セッション開始時:
cookieから「箱」を読み込んで、グローバル変数「gnrResult」に入れて返す。
cookieがない場合は新規に新しい箱を作って、gnrResultに入れて返す。
箱:a0_b0_c0_d0_e0_f0_g0_h0_i0_j0

通常時:
対象URL群を閲覧した時に、セッションで1度だけ箱の中身をインクリメントする。
セッションで2回以上、対象URL群を踏んでもインクリメントしないように、
クッキーで制御している。
セッション開始時以外は、gnrResultにfalseを入れて返す。
(セッションはga用のcookie(_utmb, _utmc)で判別。)

****************************************/



(function(){

var groupNewReturn = function(conf){
  this.data = conf.data;
  this.cookieName = conf.cookieName;
  this.cookieName2 = conf.cookieName + "_tmp";
  this.c_expires = conf.expires;
  this.MAXLENGTH = 15;
  this.useGA = conf.useGA;
  conf.trackername ? this.trackername = conf.trackername + "." : this.trackername = "";
}

groupNewReturn.prototype = {
    getCookie : function(key) {
    var cookies = document.cookie.split('; ');
      for (var i = 0; i < cookies.length; i++) {
        var part = cookies[i].split('=');
          if (part[0] === key && part[1] !== null) {
          return unescape(part[1]);
        }
      }
    return null;
  },
  setCookie: function(key, value, life_day) {
    var date = new Date();
    date.setTime(date.getTime() + (life_day * 1000 * 60 * 60 * 24));
    document.cookie = key + '=' + escape(value) + '; expires=' + date.toGMTString() + '; path=/';
  },
  makeContainer : function(flag, c_name){
    if(c_name){
      var cookieName = c_name;
    }
    if(flag){
      var cn = this.getCookie(cookieName);
    }else{
      var cn = "";
    }
    if(cn){
      var container = cn;
      return container;
    }else{
      var str = "a0_b0_c0_d0_e0_f0_g0_h0_i0_j0_k0_l0_m0_n0_o0";
      var num = this.data.length;
      if(num < this.MAXLENGTH + 1){
        var container = str.slice(0,(3 * num - 1));
        return container;
      }else{
        console.log("ERROR : too many groups");
        return false;
      }
    }
  },
  checkNew : function(flag){
    if(flag){
      //GA用
      if((!this.getCookie("__utmb"))||(!this.getCookie("__utmc"))){
        return true
      }else{
        return false;
      }
    }else{
      //通常用
      if(!this.getCookie(this.cookieName + "_flag")){
        this.setCookie(this.cookieName + "_flag", "1");
        return true;
      }else{
        this.setCookie(this.cookieName + "_flag", "1");
        return false;
      }

    }
  },
  process : function(){
    var container = this.makeContainer(true, this.cookieName);
    var container_tmp = this.makeContainer(true, this.cookieName2);
    var cont_arr = container.split("_");
    var cont_arr_tmp = container_tmp.split("_");
    var myPath = location.pathname;
    for(var i = 0; i < this.data.length; i++){
      if(myPath.match(this.data[i])){
        if(this.checkIncre(cont_arr_tmp[i])){
         cont_arr[i] =  this.makeIncre(cont_arr[i]);
         cont_arr_tmp[i] = this.makeIncre(cont_arr_tmp[i]);
        }
      }
    }
   var cont_str = cont_arr.join("_");
   this.setCookie(this.cookieName, cont_str, this.c_expires);
   var cont_str_tmp = cont_arr_tmp.join("_");
   this.setCookie(this.cookieName2, cont_str_tmp, this.c_expires);
  },
  checkIncre : function(tmp){
    if(tmp[1]==="0"){
      return true;
    }else{
      return false;
    }
  },
  makeIncre : function(str){
    if(str.length !== 2){
      console.log("Error: it should be 2 bytes");
      return str;
    }
    str1 = str[0];
    str2 = parseInt(str[1]);
    str2++;
    if(!str2){
        console.log("Error: not number, change to 1");
        str2 = 1;
      }else if(str2 > 9){
        str2 = 9;
      }
    return (str1 + str2);
  },
  go : function(){
    // セッション開始時(GA利用時はcheckNewの引数にtrueを使用)
    if(this.checkNew(this.useGA)){
      // クッキーの有無を判断
      //クッキーあり→クッキーの内容を読み込む
      //クッキーなし→空の箱を作成
      var req_container = this.makeContainer(true, this.cookieName);
      //console.log("sent: " + req_container);
      if(!this.getCookie(this.cookieName)){
        this.setCookie(this.cookieName, req_container, this.c_expires);
      }
      //制御用cookieを新規作成
      var st_container = this.makeContainer(false);
      this.setCookie(this.cookieName2, st_container, this.c_expires);
    }
    //通常時
    //マッチした場合、
    //制御用クッキーで、変化済みflagがあれば、動作させない
    //変化済みflagが無ければ、メイン・制御両方ともインクリメント
    this.process();

    //セッション開始時はreq_containerを返す、そうじゃない場合はfalseを返す
    if(req_container){
      return req_container;
    }else{
      return false;
    }
  }
}



//コンフィグセクション
  var config = {
    data : [
    //対象とするディレクトリを正規表現で指定してください。
      /^/enq_test//,
      /^/group/neko//,
      /^/group/usagi//,
      /^/group/inu//,
      /^/group//
    ],
    cookieName : "__utmbox",
    expires : 60,
    trackername : "",
    //GAを利用する場合は、trueにしてください。
    useGA : false
  }

  var gNR = new groupNewReturn(config);
  //グローバルオブジェクトに結果を代入
  window.gnrResult =  gNR.go();
  return  window.gnrResult;
})();
Categories
Web分析一般

Pjaxとログ解析

Pjaxとは?

Pjaxとは、ごく単純化して言うと、Ajaxでコンテンツの一部だけ変更しているはずなのに、URLまでちゃんと変わっているっていうものです。
詳しくは↓で説明されています。
[JavaScript][pjax]pjax こそが pushState + Ajax の本命

Pjaxの何が嬉しいかというと、大きく2つあります。
1つは「戻る」ボタンが利用できることです。
Ajaxでページ内遷移を繰り返しているときに、戻るボタンを押してしまうと、ページごと戻ってしまいます。Pjaxを利用すると、Ajaxのアクションレベルで戻るボタンを使って戻ることができます。
2つ目は、ソーシャル関連ツールの利用しやすさです。Ajaxでページ内の一部を変更した状態のままイイネ!を押したり、はてブしたりしようとしても、URL単位で登録されてしまうので、うまくできません。Pjaxを利用すると、URLまで変更されるので、ソーシャル対応がしやすくなります。

Pjaxサイトの構築

ということで、Pjaxでテストサイトを簡単に作ってみました。
http://vivid-mist-690.heroku.com/

グローバルナビの「navi 2」~「navi 5」までのリンクがPjaxリクエスト用のリンクです。
例えば、「navi 2」をクリックすると、ボディ部がAjaxで変化すると思います。URLを見てみると、「http://vivid-mist-690.heroku.com/:data2」に変わっています。戻るボタンを押すと、元にいたページに戻ることができます。

サーバーはsinatra+herokuで構築しています。無駄にHTML5で構築しています。Pjaxの処理には、pjax用のjQueryプラグイン: jquery-pjaxを利用しています。
HTMLは↓のサイトのものをHaml化して利用させていただきました。
ありがとうございます。
http://www.finefinefine.jp/web/kiji545/

ソースコードはgithubに保存しています。
https://github.com/yosimox/pjax_test

ちなみにIEでは動きません。最新のOperaかFirefoxかChromeを利用してみてください。

Pjaxサイトのログ解析

通常、Ajaxのログ解析を行う場合は、Ajaxアクションに対して、カスタムイベントを発生させることでトラックします。
Google Analyticsの場合、aタグのオンクリックイベントに以下のようなコードをバインドします。
_gaq.push([‘_trackEvent’, ‘foo’, ‘hoge’, ‘bar]’);

Ajaxではカスタムイベントでデータを取得することが普通ですが、Pjaxの場合はイベントよりも通常のページとしてカウントする方が良いと思います。というのも、
・IE等、Pjaxが利用できないブラウザがあり、その場合は通常のページリクエストとなる。
・URLが変わるので、ページが変わると捉えた方が望ましい。

逆にページとして、カウントしたくないような小さなページ内変化はPjaxリクエストをせず、通常のAjaxイベントとして処理させるべきだと思います。

GAを利用する場合、実装はさほど難しくありません。というのも、jQueryプラグイン「jquery-pjax」に既にGAのサポートがされているからです。単純にPjaxリクエストが成功した時の、コールバック関数の中で、_gaq.push([‘_trackPageview’]);を動作させています。(161行目)
もし、カスタム変数を設定したいのであれば、その前あたりに書いておけばOKです。

どうせ、jQueryを使っているんだし、外部リンククリックの取得も合わせて設定してしまいましょう。
一つ注意する必要があるのは、Pjaxで変化した中身のリンククリックも対象としたい場合、通常の下記のような方法ではうまくバインドできません。

$('a').click(function(){
  something();
});

解決策としては、jquery-pjaxのコールバック関数の中にclickイベントをバインドするか、”click”の代わりに”live”を利用するかです。liveの方が楽にできると思います。
かなり簡単にですが、こんな感じで書いてみました。

$(function(){
    $("a").live("click", function(e){
        var linkUrl =  $(this).attr("href");
        var internalDomain = location.host;
        //console.log(linkUrl);
        if((linkUrl.match(/^https?/))&&(!linkUrl.match(internalDomain))){
        var evData = {
            "category" : "outerLink",
            "action" : document.URL,
            "label" : linkUrl
            }
           _gaq.push(['_trackEvent', evData.category, evData.action, evData.label]);
         }
    });
});

サンプルサイトのボディ部にYahoo!と書かれているリンクがあると思います。このリンクをクリックすると、トラックイベントが発生して、GAにデータが送信されます。内部リンクは送信しないようにセットしています。
グローバルナビ(navi 2など)をクリックして、ボディ部を変更しても外部リンククリックの取得は正常に行われていると思います。

Pjaxサイトの分析サイドからの利点

Pjaxの一番の利点はユーザーエクスペリエンスの向上ですが、分析サイドでも利点はありそうです。特に、URLが完全に「一意」であるため、
「ユーザーの関心の高さ」と「PVの多さ」
がほぼ一致するということが大きいです。(もちろんナビゲーションの問題もありますが)。通常のAjaxではクリック単位でイベントを計測することになるので、他のページとの比較が難しくなります。また、通常のページビューとしてカウントできることで、ページ遷移を追うことがより容易になります(ページ遷移についてはGAよりもSiteCatalystの方でメリットが大きそう)。

IEはIE9でも対応していないというPjaxの酷い欠点もありますが、対応していなければ通常のページリクエストになるだけで、分析サイドからはあまり関係がないのかなと思います。ある程度大きな規模のサイトでPjaxを使っているのはgitHubくらいしか知らないですけど、今後Pjaxはかなり熱いんじゃないでしょうか。

Categories
GoogleAnalytics

Google Analyticsと連携したアンケートフォーム

数日前から、このブログにアンケートを仕込んでいます。
このページを下の方までスクロールしてみてください。
下にピロっとアンケートフォームが出てきます。

このアンケートの回答結果はGoogleAnalyticsのサーバーへ送信されています。
これでGoogleAnalytics上で記事の評価を確認できるようになります。

アンケートの動作

このアンケートフォームはページの下の方までスクロールしたら出てくるようにしています。このアンケートを出すタイミングは調整可能です。
一度出たアンケートは上の方までスクロールさせると、消えるような仕組みにしています。このタイミングも調整できます。
アンケートのラジオボタンのどれかをクリックすると、trackEventを発生させて、GoogleAnalyticsへデータを送信しています。

設定方法

スクリプトとデザインはga_enq.jsで、フォームの設問はenq_box.txtに記載しています。
それぞれのソースコードはこんな感じです。
(ga_enq.jsはjQueryを使ってスクリプトを書いています。)

ga_enq.js
$(function() {

  var config = {
    //Path to the enquate text file
    "txtFile" : "/ga/js/enq_box.txt",
    //css configuration
    "css" : {
        "font-size" : "10px",
        "background-color" : "#0f8fff",
        "color" : "#FFFFFF"
      },
   //height of enquate form
    "enq_height" : 70,
   //height to appear
   "appear" : 200,
   //height to disappear
   "disappear" : 200,
   //Tracker name for multi-account use
   "trackerName" : ""
  }


  var content_height = $(document).height();
  var window_hight = $(window).height();
  var answered = false;

    $("body").append("<div id='enqbox'></div>");
    $("#enqbox").load(config.txtFile,
      function(){
       $("span.close a")
            .css({
              "float" : "right",
            })
            .hover(
              function(){
                  $(this).css({
                    "color": "#0f8fff",
                    "background-color" : "#ffffff"
                  });
                },
              function(){
                  $(this).css({
                   "color": "#ffffff",
                   "background-color" : "#0f8fff"
                  });
                }
              )
            .click(function(){
              $("#enqbox").hide();
              answered = true;
              return false;
          });
       $("span.close a:link").css({
           "color" : "#ffffff"
          });

       $("input[name=enq]").change(function(){
          var data = $("input[name=enq]:checked").val();
          if(data){
            var tracker = "_trackEvent";
            if(config.trackerName !== ""){
              tracker = (config.trackerName + "._trackEvent");
            }
            _gaq.push([tracker, 'enq', data, location.pathname]);
          }

          $("form div#question").hide();
          $("form div#thanks").show();
          setTimeout(function(){
            $("#enqbox").slideUp("fast")}
            , 1000 * 3);
          answered = true;
        });
      }
    ).hide()
      .css(config.css)
      .css({
        "height" : config.enq_height + "px",
        "left" : "0px",
       "width" : $(window).width(),
        "position" : "absolute"
      });


  var moveBox = function(scroll_height){
     if(content_height - window_hight - scroll_height > - config.enq_height){
       $("#enqbox").css({
            "top" : (scroll_height + window_hight  - config.enq_height) + "px"
          });
        }
    }


  $(window).scroll(function(){
    var scroll_height = $(window).scrollTop()
    moveBox(scroll_height);
    if((!answered)&&(content_height - window_hight - scroll_height < config.appear)){
      $("#enqbox").slideDown("fast");
      }
    if(scroll_height < config.disappear){
      $("#enqbox").hide();
    }
  })

});
enq_box.txt
<form action="#" id="enq_form">
<span class="close"><a href="#">[close]</a></span>
<p>&nbsp;■お役に立ちましたか?</p>
<div id="question">
<input type="radio" name="enq" value="great">とても役立った
<input type="radio" name="enq" value="good">役立った
<input type="radio" name="enq" value="soso">まあまあ
<input type="radio" name="enq" value="bad">いまいち
<input type="radio" name="enq" value="terrible">ひどい
</div>
<div id="thanks" style="display:none">
ご協力ありがとうございます!
</div>
</form>

設定方法

アカウント設定とかは通常のGAコード側で行うので、特に必要ありません。なので、このまま使っても普通に動作すると思います(ファイルのパスの設定は必要です)。ちょっと変えたいなという人には、アンケートの内容とデザインが設定できるようになっています。

アンケートの内容

アンケートフォームの内容はenq_box.txtに記載してください。普通にHTMLでラジオボタンのフォームを作成すればOKです。別に5択ではなくても問題ありません。valueの値がGoogleAnalyticsへ送信されます。

デザインなどの設定

ga_enq.jsのconfigセクションで設定できるようになっています。

“txtFile” にenq_box.txtを配置したパスを記載してください。この設定は必須です。
“css”のセクションでアンケートフォームのCSSを記載してください。
“enq_height”はアンケートフォームの高さです。
“appear”はスクロールしてアンケートが出てくるタイミングです。値が大きいと早めに出てきます。
“disappear” は値が大きいと早めにアンケートが閉じられます。
この3つはページに合わせて試行錯誤しながら、決めると良いかなと思います。
“trackerName” はマルチアカウントでGAを利用している場合に使用します。通常はカラのままでOKです。

*ただ、デザインとロジックの切り分けが実はうまくできていなくて、閉じるボタンの箇所だけconfigセクションの下の方にある$(“span.close a”)以降で設定されてしまっています。「閉じる」のデザインが気に入らない場合はここを修正してください。

インストール方法

サーバーにga_enq.jsとenq_box.txtを配置してください。ga_enq.js内でenq_box.txtのパスの設定は忘れず行ってください。
その後、HTML内にjQueryとこのga_enq.jsを呼び出すタグを記載するだけでOKです。
Google Analyticsのトラッキングコードも必要です。忘れずに記述しておいてください。

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js"></script>
<script type="text/javascript" src="/ga/js/ga_enq.js"></script>

既にサイト上でjQueryを使っている場合はjQyeryの呼び出しは必要ありません。

結果の確認方法

データはGA画面(新バージョン)の
コンテンツ>イベント>ページ
で対象のページを選択すると、
enqというイベントカテゴリが表示されると思うので、enqをクリックすると対象ページに対する評価を見ることができます。

アンケートを設置してわかったこと。

やっぱりほとんどアンケート答えてくれない。。。
あ、ちなみに今、_trackEventしか飛ばしていないですけど、その前にsetCustomVarで設定すれば、カスタム変数にも入れることができると思います。
これでアンケート回答内容によって、セグメント化ができるようなると思いますよ。きっと。

追記:
回答内容でセグメント化するにはカスタム変数をセットする必要があります。64行目の_gaq.pushの前にこんな感じのコードを追加すればOKです。

            var cstmVar = "_setCustomVar";
            if(config.trackerName !== ""){
              cstmVar = (config.trackerName + "._trackEvent");
            }
            _gaq.push([cstmVar, 5, 'enq', data, 1]);

カスタム変数はガンガン上書きされてしまいます。最後に回答した内容のみ保持される感じになってしまいますので、注意してください。
この記述を追加したバージョンは↓に置いています。
ga_enq2.js

Categories
Web分析一般

UBC Award of Achievement in Web Analytics 修了しました。

さりげなく、こんなコースを受講していました。
カナダのUBC (The University of British Columbia) と アメリカのWAA (Web Analytics Association)がコラボして提供しているオンラインのWeb Analyticsについてのコースです。
UBC Award of Achievement in Web Analytics

下の4つのモジュールで構成されています。それぞれ1ヶ月くらいのコースです。

  • Introduction to Web Analytics
  • Web Analytics for Site Optimization
  • Measuring Marketing Campaigns Online
  • Creating and Managing the Analytical Business Culture

結構人気があるみたいで、コースが埋まっていたりして、なかなか都合良く受講できなかったりします。
それもあり、結局全部終わるまで1年ちょっとくらいかかっちゃいました。

コースの感想

内容自体は基本的なことから基本的なことまで、基本的な内容をみたいな感じです。
最初のIntroduction to Web Analytics は基本的なところをまんべんなくみたいな感じなんですけど、他のコースも基本的な内容しかないような。。。
一部マニアックな内容が急に入り込んだりしてきますが(どうやってデータ取得するんだろうっていうような間接効果の分析方法とか。。。。)
4つのコース全てで、どのツールを使うとかは全然関係なく、分析の考え方が中心のカリキュラムとなっています。

教材は複数の人が作っているので、バラエティ豊富な反面、同じ内容の繰り返しがあったり、ちょっと整合性合わないなっていうところがあったりします。
あと、Tutorによって評価の基準が全然違います。ひどいくらい。基本的にゆるい先生が多いんですけど、おかしなくらい低い評価を出す人もいました。一人だけ。コースを落とすほどじゃないですけど。

当然、教材も英語だし、英語で文章を提出しなくてはいけないので、英語力がないときついです。そして仕事が忙しいタイミングと重なると地獄です(さらに引っ越しが重なったりしたので悪夢でした。。。)
でも英語の勉強にはなるんじゃないですかね。きっと。

あ、なんか悪いことばっか書いちゃいましたけど、全然悪いコースじゃないですよ!
Web Analyticsの多くのパートをカバーしているので、普段ではあまり関わっていない分野も勉強できたりします。教材の質はまちまちですけど、結構良いものも多いです。
掲示板みたいなものが用意されていて、生徒から活発に書き込みがあり、結構勉強になったりします。

普段からガリガリWeb Analyticsを実践している人にとっては当然の内容ばっかりなんですけど、そうでない人にとっては役に立つ内容ばかりだと思います。
費用も結構かかりますので、特におすすめはしませんけど、なんかネタとして楽しい感じなので、やってみるのも良いんじゃないですかね。
普通にWAAのテストを受けた方が良いような気もしますが。。。あっちも結構高いですけど。

Categories
Web分析一般

11個の素敵なKPIレポート(ダッシュボード)まとめ

ちょっと所用で、KPIレポート用のダッシュボードを調べてました。
かっこよかったり、良さそうなのがあったりだったので、まとめてみました。
Web Analytics用に作っていないものも含まれています。


http://matt-smedley.com/web-analytics-framework
上記のブログで紹介されていましたが、おそらくstratigent社が作ったものだと思われます。ゴールの評価も明確でトレンドもわかりやすい。
フォーマットの中にレコメンドアクションを含めているのが素晴らしいです。



http://www.nabler.com/services/web-analytics-dashboard.asp
これも結構普通で、わかりやすく作っています。
これくらい指標が絞れると、かなり見やすくなります。



http://blog.davidfeldt.com/2007/12/10/the-art-and-science-of-dashboards/
ちょっと趣向を変えて。
Excelとかの紙ベースではなく、ソフトウェアベースでのダッシュボードであれば、こんなものありかなと。
インパクトはかなりあります。詳しくはクリックしてネみたいな感じ。


http://numbermonger.com/
折れ線ブラフのうねり具合が素敵です。達成度を示すバーは、こんな感じでもいいですね。


http://quince.infragistics.com/Patterns/Dashboard.aspx
これも似たような感じで、もう少し詳しいものです。
サーバーとかの負荷を監視するダッシュボードなので、トレンド系はないですけど、ちょっと参考にはなりそうです。



http://www.dashboardinsight.com/dashboards/screenshots/the-business-intelligence-guru-us-unemployment-dashboard.aspx

ちょっと細かいですけど、じっくり読めば結構わかりやすい感じにはなっています。ここまで細かくすると、ダッシュボードとしてはどうなんだろうとは思いますけど。


http://www.w3support.net/index.php?db=su&id=84847

Excelで作ったにしてはかっこいいですね。
やっぱExcel2007以降だと結構変わりますね。
弊社はいまだ2003なんで。。。



http://dashboardguy.blogspot.com/2008/06/excel-template-for-dashboards.html
なんだか、わかりやすいようで、あんまりわかりやすくない感じです。
ちょっと同じようなものが並び過ぎるとわかりにくくなりますね。
上手くカテゴライズされているので、カテゴリーごとの違いを明確にした方が良いかもしれないです。



http://cursoexcelbh.wordpress.com/dashboard/

これも上の方で出てきたサーバー監視系のダッシュボードに近いです。
Excelで作るの大変そうだなー。



http://www.georgesbudget.com/exceltemplates/excel-budget-spreadsheet-checkbook-register.html
マクロで自動集計できるみたいな感じですね。わからないですけど。
シンプルで良いと思います。



http://www.kaushik.net/avinash/2008/04/the-action-dashboard-an-alternative-to-crappy-dashboards.html
最後はおなじみのAvinashのダッシュボード。
やっぱり、ダッシュボードでもちゃんと文章で説明するという姿勢が大事だと思います。このAvinashのエントリも必読。
もう一つ、↓のダッシュボード系のエントリも読む価値あります。
http://www.kaushik.net/avinash/2007/03/five-rules-for-high-impact-web-analytics-dashboards.html

Categories
GoogleAnalytics

Google Analyticsで新規セッションを判別したいの

小ネタです。
最近、あまりにも忙しくて色々無理が生じています。
さすがに放置しすぎた気がするので、ちょっと小ネタを挟みます。

カスタム変数とかカスタムイベントをセッションの初めだけ設定したいという時ってよくありますよね。GAは比較的シンプルなセッション管理の仕組みを使っているので、簡単にセッションの初めかどうかを判別することができます。このセッション管理方法が良いかどうかは別として!

基本的に「__utmb」と「__utmc」のどちらかが無ければ、新規セッションとして取り扱っているみたいです。
ということで、JavaScriptで、このcookieの値を見て、グローバル変数に結果をぶち込むことで、新規セッションかどうかの判別が可能になります。

_isNewSession.js

window._isNewSession = false;
(function(){
     var getCookie = function(key) {
        var cookies = document.cookie.split('; ');
            for (var i = 0; i < cookies.length; i++) {
                var part = cookies[i].split('=');
                    if (part[0] === key && part[1] != null) {
                    return unescape(part[1]);
                }
            }
        return null;
    }
    if((!getCookie("__utmb"))||(!getCookie("__utmc"))){
        window._isNewSession = true;
    }
})();

一応、ダウンロードできるようにしておきます。
__isNewSession

使い方

必ずGAスニペットの前で、_isNewSession.jsを読み込んでください。
カスタム変数用に利用する場合は、
if(_isNewSession){
_gaq.push([‘_setCustomVar’, ~~]);
}
と書けばセッションの初めだけ、カスタム変数を格納することができます。

<!-- _isNewSession.js -->
<script language="javascript" type="text/javascript" src="/js/_isNewSession.js"></script>

<!-- GAスニペット -->
<script type="text/javascript">
  var _gaq = _gaq || [];
  _gaq.push(['_setAccount', 'UA-xxxxxx-x']);

//CustomVar
  if(_isNewSession){
    _gaq.push(['_setCustomVar', 1, 'neko', 'inu', 2]);
  }
  _gaq.push(['_trackPageview']);

  (function() {
    var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
    ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
    var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
  })();

</script>

これでセッションの初めの時だけカスタム変数のスロット1に
name : neko
value : inu
がセッションレベルで入ります。

ちょっと応用すると、セッションレベルでのカスタム変数の上書き防止用に利用できそうです。
ユーザーレベルでは
_getVisitorCustomVar()
というメソッドが用意されていて、お手軽に上書き防止とかできるのですが、セッションレベルはcookieにもデータが格納されておらず、上書き防止が難しいです。
セッションの初めを判別することでうまーくできそうな気がします。それはまた今度。

Categories
Web分析一般

ソーシャルメディアにおける「ソーシャル」について

フェイスブックインパクトを読みました。一応。
特に感想はないですが、一つだけ。
最後の高広さんの章で、ソーシャルメディアの「ソーシャル」について説明しようとしています。
社会の最小単位=「家族」なんて、サッチャーのようなことを仰っておりましたが、うまく説明しきれずに、尻つぼみで終わっているような印象を受けました。

このブログは、ウェブ分析縛りで書いていたのですが、今日はちょっとだけ脱線して(広い意味での分析っていうことで)、ソーシャルメディアにおける「ソーシャル」について考えてみたいと思います。

高広さんも書いているように、社会学の中でも「社会」の定義には相当に議論があります。というよりも、「社会」をどう定義するかによって、その人の社会学のスタンスが決まると言った方が良いのかもしれません。込み入った話に立ち入るとボロが出るので、ここまでにしておいて、僕の考える「ソーシャル」について書いてみます。

「社会(ソサイエティ)」と似た概念で、「世界(ワールド)」という概念があります。世界とは何を意味しているのでしょうか。ウィトゲンシュタインは論理哲学論考の最初のパートで、世界についてこう語っています。

1 世界とは、起きていることすべてである。
1.1 世界は事実の全体であり,ものの全体ではない。
1.11 世界は事実によって、そしてそれらが事実のすべてであることによって、規定されている。
1.12 なぜならば、事実の全体はなにが起きているかを規定し、そしてまた、なにが起きていないかをも規定するからである。
1.13 論理空間の中にある事実、それが世界である。
1.2 世界は事実へ分解される。
1.21 その他すべてを変えずに、ひとつひとつが起きることもできるし、起きないこともできる。

そして、こう締めくくります。

7. 語りえぬことについては,沈黙するしかない。

世界は事実の全てであって、世界の外側については我々は何も知ることはできない。そして、事実とは論理空間の中にあるもの。つまり、我々の思考の限界が世界の限界であるということです。
すなわち、「世界」とは、ある個人が想像しうる全ての事実として考えられます。「事実」は、物理的に存在しているかどうかは問題ではありません。たとえば、空想の世界であっても、その人が事実として受け入れているものであれば、それは世界の一部となります。逆に、実際に地球上に存在していたとしても、その人が全く知らなければ、それは世界の外側にあるものとなります。

では、社会とは何か?「世界」とは想像しうる全ての事実であることに対し、「社会」とは想像しうるコミュニケーション可能な集団として考えます。重要なのは「想像しうる」という点です。実際にコミュニケーションが取れるかどうかは問題としません。ある集団に対して、コミュニケーションが取れると判断できるならば、その人はその集団と同一の社会に属していると考えられます。古くから、「国民国家」が社会の代表格として存在してこれたのは、コミュニケーションを可能とさせる共通言語の存在、マスメディアの存在が強く影響しています。
そういう意味では、僕の考える「社会」は、ベネディクト・アンダーソンの「国民国家」論と同じで、「想像の共同体」を指します。「共同体(コミュニティ)」は恒常的にコミュニケーションを取っている集団です。その一方、「想像の共同体」である社会は、直接的、双方的なコミュニケーションは取らないとしても、自分をその社会の中の存在として置き換え可能であれば、社会の成員として考えられます。
例えば、大企業であれば、部署の違う社員同士で直接的なコミュニケーションを取ることは少ないかもしれないですが可能です。よって、企業は「社会」として考えられます。企業の中で、同じプロジェクトメンバーであれば、恒常的にコミュニケーションを取るので、「共同体」として考えられます。

ようやくフェイスブックの話に入ります。フェイスブックでは、「friends」や「Like!」で繋がった個人・企業は同一の共同体(コミュニティ)として考えられます。そういう意味では、フェイスブックにおける「ソーシャルグラフ」の「ソーシャル」は、「社会」というよりは「コミュニティ」の形容詞として捉えられます。そして、全てのソーシャルグラフの総体がフェイスブックという「社会」と考えます。
しかし、全てのフェイスブック利用者にとって、フェイスブック全体が一つの「社会」とは限りません。フェイスブックは基本的に「テキスト中心」のコミュニケーションメディアであるため、言語がわからなければ、社会として「想像」しなくなる人もいるでしょう。英語を見たくもないという人にとっては、英語利用者は社会の外側にあります。テキストだけではなく、画像や動画もあるため、話は単純ではないですが。いずれにせよ、同じ「社会」の一員かどうかは、言語の影響も大き関わります。

そして、何より重要なことに、フェイスブックでは、ソーシャルグラフが可視化されます。ソーシャルグラフを見ることによって、その人が自分と同じ「社会」の成員かどうか判断されます。つまり、フェイスブック上ではソーシャルグラフこそが本人となります。名前は本人を示す記号にすぎません。ソーシャルグラフが本人です。もちろん、これを可能にするのは実名での登録があってこそであることは間違いありませんが。

キルケゴールの「死に至る病」での冒頭の有名な一節、

人間は精神である。精神とは何であるのか。精神とは自己である。自己とは何であるか。自己とは自己自身に関わる一つの関係である。

フェイスブックでは、このキルケゴールの抽象的な議論が、目に見えるソーシャルグラフとして可視化されます。「関係」こそがフェイスブックの本質であり、ソーシャルメディアの「ソーシャル」たるゆえんです。

マーケティング的に考えると、フェイスブックをはじめとしたソーシャルメディアでは、まず「想像の共同体」である社会の一員となる必要があります。それには、当然、フェイスブックなどユーザーと同じプラットフォーム上に参加し、コミュニケーション可能な言語(=ローカルな言語)で展開する必要があり、さらに企業の存在を知ってもらう必要があります。しかし、想像の共同体のままでは、ビジネスになりません。ビジネスへと繋げるためには、ユーザーの共同体の一員になる必要があります。ファンページで「いいね!」を押してもらい、恒常的なコミュニケーションを取れる状態にし、ユーザーとコミュニケーションを取りづける状態へと進めることが求められます。企業がユーザーのコミュニティの一員となれば、ユーザーは彼自身の別のコミュニティに対し、その企業の製品を薦めてくれることでしょう。もちろん、全て好意的な方向ではないとは思いますが。要するに、企業(または製品・ブランド)自身がユーザーのソーシャルグラフの一員として、「関係」を作ることが重要となります。なぜなら、ソーシャルグラフこそがフェイスブック上での本人であり、「関係」こそがフェイスブックの本質であるからです。いかに強固な「関係」を作るのかが、ソーシャルメディアマーケティングの役割となります。

最後は、無理矢理マーケティングに結びつけてみましたが、結論としてはむちゃくちゃ平凡です。実際、実務としてSMMをする時は、こんな抽象的な議論は大して役に立たず、地味で面倒な運用をコツコツやることが成功に繋がるんですけどね。

Categories
GoogleAnalytics

Google Analyitcsでスクロール量を取得するjQuery Plugin

ダウンロードはこちらからお願いします。

jquery.ga_scroll2.js

以前公開していたjQueryを使って、どこまでスクロールされたのかを取得するスクリプトを改良しました。

信頼と実績のアイトランス株式会社の石井社長が、社長自ら神懸かり的なリファクタリングをしていただき、ぼろぼろだったスクリプトを修正していただきました。
社長オリジナル版はこちらにあります。
jquery.ga_scroll.js

元々の設計がおかしい所があったので、直していただいたものをちょこっと修正して使いやすくしました。
もともとUser Insightをパクることを目的としていたスクリプトだったので、とりあえず取れるデータは全部取っちまえ的な考えだったのですが、GAでは使いにくい所がありました。
そこで、カスタムイベントでスクロール量(10%刻み)と滞在時間(30秒)、カスタム変数にスクロール量をセッションレベルのスコープで格納するようにしました。
たとえば、ランディングページに仕込んで、ランディングページがどこまで閲覧されて、どのくらいの時間見られたのかがカスタムイベントによってわかるようになり、カスタム変数でセグメント化することで、スクロール量とコンバージョンをクロス集計することが可能になります。
もともとは、ホイールの利用回数とか、クリック数とかも取っていたのですが、集計も面倒なので止めました。
スクロール量とクリック数だけに絞ることで使いやすくなったと思います。

ダウンロードはこちらからお願いします。
jquery.ga_scroll2.js

使い方

jqueryを読み込んだ後に、jquery.ga_scroll2.jsを読み込んで、実行させてください。

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js"></script>
<script src="js/jquery.ga_scroll2.js"></script>
<script type="text/javascript">// <![CDATA[
    $(function(){
         $.ga_scroll2();
    })
// ]]></script>

こんな感じです。

取得されるデータ

デフォルトの状態で利用すると、ページを移動するときに以下のようなデータがGoogle Analyticsへ送信されます。

カスタムイベント(スクロール)
category: 「scroll」
action : 設置したページのURL
label:スクロール量(10%刻みでのヒストグラム)
例:10-20, 40-50 など

カスタムイベント(滞在時間)
category: 「duration」
action : 設置したページのURL
label:滞在時間(30秒刻みでのヒストグラム)
例:30-60, 90-120 など

カスタム変数(スロット3)
カスタム変数にはスクロール量のデータが入ります。
スコープはセッションレベルです。
デフォルトではスロット3になっていますので、被らないように変更してください。

設定

jquery.ga_scroll2.jsファイル中にある
var defualt_options = { 〜〜
が設定箇所です。
enableをfalseにすると、機能が使えなくなります。
track_scrollもしくは、track_durationのどちらかは必ずtrueにしておいてください。

引数に設定内容を入れて、渡すこともできます。jQuery分かる人は利用してみてください。

Categories
Web分析一般

意識データと行動データ 3

意識データと行動データ 1
意識データと行動データ 2

意識データは何の役に立つのか:効果測定

ここまで、(量的な)意識データは学問としての厳密さには欠けるものの、ビジネスとして、「役に立つ」データではあると書いてきました。では、何の役に立つのでしょうか?「効果測定」と「ユーザー調査」に分けて考えてみたいと思います。
現場では、よく「効果測定」と「ユーザー調査」が混同されています。この2つは調査対象が全く異なります。「効果測定」は、何らかの施策を行った時、効果があったのかどうかを測定する方法です。「ユーザー調査」は、ターゲットとなるユーザーを調査することです。効果測定は「施策」に対する調査であり、ユーザー調査は、「ターゲットユーザー」に対する調査です。
まず、効果測定における意識データの有用性について考えます。ここではWebサイトに絞って考えます。効果測定における「効果」とは何に対する効果か。それは施策の目的に対する効果です。効果測定は施策の目的を測定し、評価することです。施策の目的はそれぞれ異なります。例えば、ECサイトの場合、商品を販売することが目的なため、販売額を測定し評価することが効果測定となります。サイトへつれてくること「だけ」が目的のネットADの場合、サイトへの流入数やCTRが評価対象となります。ECサイトなど、施策の目的が「行動」へと直接結びつく場合、行動データが非常に役に立ちます。しかし、施策の目的が行動へと結びつかないことが往々にしてあります。
Webサイトに限らず、マーケティング施策の役割として、最も包括的な概念として考えうるのは、「態度変容」です。商品について「知らない状態」から「知っている状態」への態度変容、「興味のない状態」から「興味をもった段階」への態度変容、「興味があるだけの状態」から「欲しいという状態」への態度変容、「欲しい」から実際に「購入する」への態度変容。あらゆるマーケティング施策は態度変容を起こすために行われていると言ってもいいくらいです。
上の例はAIDMAプロセスに沿って書いていますが、このプロセスに限ってみると「行動」へと繋がっているのは、最後の購入(Action)だけです。それ以外の態度変容は全て意識の中で起こっています。もちろんAIDMAプロセスがマーケティング施策の全てではなく、行動を起こすことがマーケティング施策のゴールとなることもあります。ただ、マーケティング施策のゴールの大部分は「意識の中」で起こるものであることには変わりありません。
意識の中で起こった態度変容を測るための最も一般的な方法は意識データを取得することです。量的調査の場合、大部分はアンケートになるでしょう。意識の変化をうまく行動データへと落とし込ませるというやり方もあります。例えば、一時期流行った「続きはWEBで」はその代表例でしょう。しかし、このやり方には無理があります。第一に実際に行動するのは態度変容が起こったユーザーのうち、ごく少数です。それでは施策が過小評価されてしまいます。第二に、ユーザーに無駄な負担をかけてしまいます。態度変容を起こすために施策を行うのではなく、効果測定をするために施策を行うはナンセンスです。やはり意識下での態度変容を測定するには、意識データを取得するしか方法はありません。

意識データは何の役に立つのか:ユーザー調査

ユーザー調査を行って、何か新しい発見をしたい場合は質的調査を行った方が間違いなく良い結果がでます。ただ、なんとなくアタリをつけたい場合、報告するためにデータが必要な場合など、量的データが必要になることがあります。そのような場合にも(量的な)意識データが必要とされます。そもそも行動データは取れる範囲が圧倒的に狭いため、必要な情報が無いという場合がぼとんどです。例えば、Webサイトに必要な機能は何か知りたいという場合、現在提供中の機能についてはアクセスログから類推することができますが、まだ提供していない機能については、行動データを取得することは当然不可能です。過去の行動について知りたいという場合でも、行動データを取得することはほとんど不可能ですが、アンケートであれば過去の行動について訊くことができます。ユーザーについての(量的な)データが必要な場合、意識データを使わない手はありません。

なぜ今あえて意識データか?

いや、みんなあまりにもClickstreamデータに依存しすぎじゃない?ってことです。アクセスログによる行動データが強力なのはわかっていることですが、クリックストリームに依存しすぎていて、それ以外の手法はないことになっていませんか?
Avinashはそこの所が非常によくわかっていて、Trinity Strategyを提唱しています。Avinashにとって、”Behavior”(Clickstream)は必要なデータの1/3でしかありません(OutcomesはClickstreamの可能性も大いにありますが)。”Experience”では、Customer SatisfactionやVOCなど記載されており、Surveyを重視する姿勢を見せています。Clickstreamデータはあくまでも調査・評価の一面に過ぎず、目的に応じて、調査・評価手法は使い分けるべきです。
そこまではわかっている。じゃ、実際にどうデータをとればいいのさ?っていう意見は多いと思います。Webでは行動データの取得の方が圧倒的に容易です。気軽にアンケートを行うことはできないかもしれません。いやいや、そんなことありません。気軽に行えばいいんです。そのやり方については、またどこかで(業務上、書いていいのかどうかわかりませんが。。。)。