【Perl】TSVデータから相関係数を計算する簡単なスクリプト【エクセル互換】
2015-01-16-2
[Programming][学び]
コマンドラインでささっと相関係数を計算するスクリプトを作りました。
いつもの通り「車輪の再発明」は気にしない!
入力フォーマットはTSVです。
オプションで計算に使いたいカラムを指定できるようにしました(2個以上)。
なお、エクセルの「相関」と同じです(同じ結果が出ます)。
■プログラム(skks.pl):
■実行例
テストファイル(skks-test.txt): TSV。
実行結果:
【参考】エクセルでの結果:
変数xとyの間の関係を表現する相関係数:

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

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


xとyの共分散:

相関係数の計算では 1/n は省略してもよいのでプログラムではそうしています。
以上、「人文・社会科学の統計学」(p.41)より。実行例のテストファイルもこの本から。
■人文・社会科学の統計学 (基礎統計学): 東京大学教養学部統計学教室

いつもの通り「車輪の再発明」は気にしない!
入力フォーマットは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)より。実行例のテストファイルもこの本から。
■人文・社会科学の統計学 (基礎統計学): 東京大学教養学部統計学教室

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