名義尺度間の連関係数を算出するperlモジュール

データマイニングを行う際に、適当な2つの変数にどれだけの相関関係があるのか確かめたくなったとします。

それらのデータはいわゆる「名義尺度」なデータ(地域別の野球チームの好き嫌いなど)だとしましょう。

名義尺度なデータ間における連関係数と言えば「クラメール係数」。

これをぱっと算出してくれるモジュールが欲しくなったので書いてみました。

Statistics::Associations - Calculates Association Coefficients of Nominal Scale.
http://search.cpan.org/~miki/Statistics-Associations/

使い方はこう。

use strict;
use Statistics::Associations;

my $asso = Statistics::Associations->new;
my $matrix = [
    [0, 20,  0,  1,  3, 2],
    [1,  3,  1, 14, 13, 2]
];
print $asso->cramer($matrix), "\n";

これを実行すると「0.725449042456371」が返ってきます。
クラメール係数は0から1の間でそのデータの相関ぐあいを示してくれるので、この場合は「相関がそこそこ強い」と判断できます。

今度はこんなデータで試してみます。

use strict;
use Statistics::Associations;

my $asso = Statistics::Associations->new;
my $matrix = [
    [ 3, 0, 3, 1, 3, 2 ],
    [ 2, 1, 3, 1, 3, 2 ],
    [ 1, 3, 1, 2, 2, 1 ], 
];
print $asso->cramer($matrix), "\n";

これだと結果は「0.319473773670848」でした。この場合は「相関は弱い」と言えますね。

ちなみにクラメール以外にもphi係数とcontingency係数も計算できます。あとカイ2乗値も出せます。

あと、これらの係数をもとめる前段で、そもそもマトリックスを簡単に作るためのヘルパー的メソッドも用意しました。

例えばログをパースしながら条件によってデータをピックアップし、それをそのままオブジェクトに突っ込んで行くと勝手に行列が出来上がります。

use strict;
use Statistics::Associations;

my $asso = Statistics::Associations->new;
while(<LOG>){
    my @f = split(/\,/,$_);
    my $row_label = $f[3];
    my $col_label = $f[6];
    $asso->make_matrix($row_label, $col_label);
}
my $matrix = $asso->matrix;

またここからハッシュリファレンスのカタチに変換することもできるようにしておきました。
たぶん何かと便利かと。

my $hashref = $asso->convert_hashref;

さて、これで簡単に連関係数が出せるようになったので、色々な相関関係をマイニングしまくってみてください。

意外なデータ間に妙な関係が見えてくるかも?

Let's 連関!