たつをの ChangeLog : 2015-01-16

今週の平日のランチの記録。

平日ランチ

■1/13(火) 自席:焼肉

社内売り弁当。チキン南蛮と焼肉弁当。650円。写真なし。

■1/14(水) 自宅:カレー

ガパオ食堂のお弁当。500円。

■1/15(木) 自席:カツ丼

社内売り弁当。カツ丼。500円。

■1/16(金) 社食:カツカレー

社員食堂「BASE6」[2014-01-31-1]でボウルメニュー「カツカレー」。

コマンドラインでささっと相関係数を計算するスクリプトを作りました。
いつもの通り「車輪の再発明」は気にしない!

入力フォーマットはTSVです。
オプションで計算に使いたいカラムを指定できるようにしました(2個以上)。
なお、エクセルの「相関」と同じです(同じ結果が出ます)。

■プログラム(skks.pl):
#!/usr/bin/env perl
use strict;
use warnings;
use Getopt::Long;
use List::Util qw(sum);

my $fields = "";
GetOptions(
    "fields=s" => \$fields, # select only these fields (origin 1)
    );
my @flds = map {$_ - 1} split(/,/, $fields);
my @cols;
while (<>) {
    chomp;
    next if not /^[\d-]/;
    my @c = $fields ? (split/\t/)[@flds] : split/\t/;
    push @{$cols[$_]}, $c[$_] for (0..$#c);
}

for (my $i = 0; $i < @cols; $i++) {
    for (my $j = 0; $j < $i; $j++) {
        printf "%.4f", skks($cols[$i], $cols[$j]);
        print (($j < $i-1) ? "\t" : "\n");
    }
}

sub skks {
    my (@cs) = @_;
    my (@av, @vr);
    foreach my $i (0, 1) {
        $av[$i] = (sum @{$cs[$i]}) / @{$cs[$i]};
        $vr[$i] += ($_ - $av[$i])**2 for @{$cs[$i]};
    }
    my $cv = sum map {($cs[0][$_] - $av[0]) *
        ($cs[1][$_] - $av[1])} (0..$#{$cs[0]});
    return $cv / (sqrt($vr[0]) * sqrt($vr[1]));
}

■実行例

テストファイル(skks-test.txt): TSV。
身長	性別	自宅
176	1	0
173	1	1
175	1	0
170	1	0
173	1	1
170	0	0
165	0	1
164	0	1
165	0	0
160	0	1

実行結果:
% ./skks.pl -f 1,2 skks-test.txt
0.8484

% ./skks.pl -f 2,3 skks-test.txt
-0.2000

% ./skks.pl -f 1,3 skks-test.txt
-0.4143

% ./skks.pl -f 1,2,3 skks-test.txt
0.8484
-0.4143	-0.2000

【参考】エクセルでの結果:
エクセルで相関を計算

相関係数の定義


変数xとyの間の関係を表現する相関係数:


大きさnの2次元データ:


xとyのそれぞれの標本平均と標本分散:



xとyの共分散:


相関係数の計算では 1/n は省略してもよいのでプログラムではそうしています。

以上、「人文・社会科学の統計学」(p.41)より。実行例のテストファイルもこの本から。

人文・社会科学の統計学 (基礎統計学): 東京大学教養学部統計学教室

この記事に言及しているこのブログ内の記事

たつをの ChangeLog
Powered by chalow