好きなガンダムのセリフ,何ですか ?

カテゴリ
ブックマーク数
このエントリーを含むはてなブックマーク はてなブックマーク - 好きなガンダムのセリフ,何ですか ?
このエントリーをはてなブックマークに追加

こんにちは。検索グループ解析チームの nabokov7 です。
今回は、ライブドアLislogというサービスのデータをちょっと拝借して、「クラスタリング」という解析手法を紹介したいと思います。

ちなみにこの Lislog というサービスは,ぱっと見ただの投票サービスのようですが (実際そういう使い方もできるんですが),ユーザ一人一人がどれかひとつのアイテムに投票するのではなく,各ユーザが自分なりの「俺的○○ベスト10」や「俺的○○の10のリスト」などを公開・共有し,その結果「全体の人気ランキング」が集計される,という点で通常の投票サイトとは少し違っています。

(従って,リスログの「全体のランキング」とはただの投票数ランキングではなく,「より多くのユーザのリストで高いランクになったアイテムほど,全体のランキングでも上位になる」というアルゴリズムになっています。)

ここへクラスタリングを導入すると、またひと味違った切り口からデータを見ることができます。

みそ汁の具の派閥を探る !

まずは解析結果をご覧下さい。

これは『みそ汁の具、人気ランキング』に参加しているユーザが選んだ,おのおののランキングを元に,ユーザをグループ分けしてみたものです。同じ趣向のユーザが同じグループになるように,全ユーザを4つのグループに自動的に分類させてみました。(7月16日現在のデータを用いて作成しています。)

各グループ(クラスタ)の特色が見えてくるでしょうか。

  • 最初のグループ cluster #0 に所属するユーザの共通点は「みそ汁の具として油揚げ、ワカメ、豆腐などを好む」ということです。また、表示には出ていませんが、この人達は「あさり、納豆などを比較的好まない」という共通点ももっていることが分かっています。「みそ汁に余計な匂いをつけるな !」という叱責が聞こえてきそうな、正統派ミソシラーのためのクラスタですね。
  • いっぽう cluster #1 には、まさしくそのあさりや納豆を好む人達が集まっています。クサいもの好きクラスタです。ブルーチーズとかも好きなんじゃないですか ?
  • cluster #2 はワカメを中心に比較的守備範囲が広く,雑食系で他のクラスタほど強い指向性がないのですが、強いて言えばワカメやしじみなど,海のもの寄りの傾向があるようです。また、表示にはでていませんが、納豆に加えて油揚げの人気が他と比べて低いのも特徴です。
  • cluster #3 はなんといってもしめじ好きなのが最大の特徴なのですが、ほかにも茄子、にらなど、少し毛色の変わったものが目立ちます。もしかしたら歯ごたえにこだわりがあるのかも ??
どうでしょう? クラスタリングがなにをするものか、なんとなく分かって頂けたでしょうか。

このようにクラスタリングは,自動的にグルーピングをすることによって隠れた法則を発見する,といった目的に利用されます。

  • いくつのグループに分割するかは,(基本的には)予め指定してやる必要がある
  • 分類結果を解釈したり,各グループに適切なラベル付けをするのは人がやらないと難しい
といった難点もありますが,解析がうまくいって,予想外の特徴や相関がきれいにあぶりだされてきたときには感動さえ覚えます。
ちょっとした魔法みたいでしょう ?

もう少し詳しく

ちなみに上の解析は、もう少し詳しく言うと以下のような手順を踏んでいます:

  • このランキングに参加しているユーザそれぞれについて,そのユーザが1位に選んだアイテムに5点,2位のアイテムに4点,... 5位のアイテムに1点,というふうに点数をつけます。
  • これをユーザ毎に並べ,以下のようなマトリックスを作成します。
    豆腐ワカメ油揚げなめこネギ … 
    ユーザ1543 … 
    ユーザ245 … 
    ユーザ354 … 
     … 
    上はつまり,↑ユーザ1は豆腐を1位,なめこを2位,ネギを3位に選び,ユーザ2は油揚げを1位,豆腐を2位に選んだ,... という意味になります。
  • このマトリックスをクラスタリング用のライブラリに通し,同じ趣向をもつユーザ同士が同じグループになるように分類させます。

※好きな具を2つ以上選んだユーザのみを対象とし,それぞれ5位以下は無視しています
※上記のマトリックスは (ユーザ数xアイテム数) の大きさがありますが,この例のようにデータの大半がnullである場合 (= sparse matrix) は,null部分を省いたデータのみを扱うことになるので,計算に必要な容量は投票数分だけで済みます。

今回利用したのはClutoというライブラリと,その perlバインディングであるStatistics::Cluto です。使い方などは後の方に書きますが,その前にもうひとつ。

好きなガンダムのセリフで性格判断 !

おなじくリスログにある『ガンダムの好きなセリフ』についても同じ解析をしてみました。

結果はこちら
リスログオープン当初からの人気リストなのでサンプル数も多く、きれいに分かれたと思います。

  • cluster #0 のあなた:
    全体的に,上から目線のセリフが目立ちます。斜に構えてフッと鼻で笑ったりするタイプでしょうか ? シャアのセリフ支持率が高いのも特徴ですね。
  • cluster #1 のあなた:
    他のクラスタにくらべて比較的ストレートな表現が少なく、間接的な,含みのある表現を好むようです。他の3クラスタではポピュラーな「ザクとは違うのだよ、ザクとは...」をあえて選ばなかった人達が多いのも特徴です。
  • cluster #2 のあなた:
    cluster #3 の人達が戦争について思索にふけるなか、ひとり戦場でノリノリです。トリガーハッピーとかお祭り好きという言葉が似合いそうです。
  • cluster #3 のあなた:
    自分が置かれた境遇や戦争の意義について思いを巡らすセリフが目立ちます。そしてそんな自分に酔っているフシもありますね。熱血漢なのかもしれません。

あなたはどのクラスタですか ?

結論

これからは「好きなガンダムのセリフで性格診断」の時代ですよ。血液型なんて非科学的な話題はプログラマには似合わないゾ !

合コンやパーティーでは、「血液型なに ?」よりも、「好きなガンダムのセリフ、なに ?」で会話の糸口をわしづかみだ !!

...


コードやインストール方法など、より詳しくは以下に:

Statistics::Cluto インストール方法

Statistics::Cluto のインストールには,事前に Cluto 本体についてくるライブラリ libcluto.a が必要です。このあたりで cpanシェルからのインストールには失敗する可能性が高いので,以下に手動インストールの手順を書いておきます。linux または Mac OSX ならたいてい動くはずです。

まず,Cluto ダウンロードページ からcluto-2.1.2a.tar.gzをダウンロードし,自分の環境に合った libcluto.a (linux なら Linux-i686/libcluto.a に, intel版macなら Darwin-i386/libcluto.a にあります) を,適当な場所にコピーしておきます。

次にここから Statistics-Cluto-0.01.tar.gz をダウンロードし,以下のようにしてインストールします。

 perl Makefile.PL LIBS='-L/(libcluto.aを保存したディレクトリ)/libcluto.a -lcluto'
 make && make test
 sudo make install

今回の例で使用したプログラム(一部簡略化)

 #!/usr/local/bin/perl

 use strict; 
 use Statistics::Cluto;
 
 # 表示する特徴(カラム)の数と、閾値
 my $nfeatures = 10;
 my $threshold = 0.05;
 
 # 希望する分割数
 my $nclusters = 4; 
 
 # 各行(クラスタの要素になる)の見出し
 my $rowlabels = [ 'ユーザ1', 'ユーザ2', 'ユーザ3', ... (中略) ... ];
  
 # 各カラム(クラスタの特徴になる)の見出し
 my $collabels =  [  'なめこ',  '油揚げ',  '豆腐',  'ワカメ',  'たまねぎ',  ...(中略) ... ];
 
 # 元データ
 my $rowval =  [
    # ↓ 1行目にユーザ1のデータ。
    #    2カラム目('油揚げ')が5点、3カラム目('豆腐')が3点、... 
    #    というように、データがあるところだけマークしていく。(sparse matrix 形式)
    [ 2, 5,  3, 3,  6, 4 ... ], 

    # ↓2行目にユーザ2のデータ。1カラム目('なめこ')が5点、2カラム目('油揚げ')が4点、... 
    [ 1, 5,  2, 4, ... ],
 
    ...(中略)... 

 ];
  
 my $c = new Statistics::Cluto;
 my $nrows = scalar @$rowlabels;
 my $ncols = scalar @$collabels;

 # マトリックスのセットアップ 
 $c->set_sparse_matrix($nrows, $ncols, $rowval);
 # 解析オプション設定
 $c->set_options({
     rowlabels=>$rowlabels,
     collabels=>$collabels,
     nclusters => $nclusters,
     nfeatures => $nfeatures,

     # 行方向と列方向のスコア調整方法。調査対象にあわせてオプションを使い分けてみて下さい。
     colmodel=>CLUTO_COLMODEL_IDF, 
     rowmodel=>CLUTO_ROWMODEL_NONE,

     pretty_format => 1,
 });

 # クラスタリング実行 
 my $clusters = $c->VP_ClusterRB;
 # クラスタの各種情報を取得
 my $stats = $c->V_GetClusterStats;
 my $features = $c->V_GetClusterFeatures;
 
 # 結果を簡易表示
 for my $i (0..$#$clusters) {
     print "?ncluster $i:";
 
     print "?n?nfeatures:?n";
     print join("?n",
                map sprintf("?t%s (%d%%)", $_->{collabel}, $_->{internalwgt}*100),
                grep $_->{internalwgt} >= $threshold,
                @{$features->[$i]->{descriptive}});
 
     print "?n?nmembers:?n?t";
     print join(', ', map $_->{rowlabel}, @{$clusters->[$i]})."?n";
 }

※詳細は perldoc Statistics::Cluto および Cluto についてくるマニュアルを参照してください。
※また,Cluto 本体はフリーですが,商用サービスへの利用には事前に承諾が必要とあります。使用の際はライセンスに注意して下さい。本格的にクラスタリングをサービス化する場合はRなどを用いるのがより一般的かなと思います。