Perlで相関係数を求めるプログラムを作る。

開発環境はWindows 7 Professional(32bit)+Perl 5.24.0。

相関係数は、2つのデータの共分散を、各データの標準偏差の掛け算で割って求めます。調べたいデータのまとまりを、それぞれ配列に入れて、それぞれに対して、共分散と、標準偏差を求めています。下記の2つの配列の場合、それぞれ同じデータが入っているので、結果は1となります。

use strict;
use warnings;

my @data1 = (73.3,74.3,69.0,53.0,75.4,72.4,48.9,65.7);
my @data2 = (73.3,74.3,69.0,53.0,75.4,72.4,48.9,65.7);

print (covarience(\@data1,\@data2) / (s_d(\@data1) * s_d(\@data2)));

# 標準偏差を求めるプログラム
sub s_d{

my $e_data1 = 0; # data1の平均値

my $d_data1 = 0; # data1のある1つのデータの偏差

my $v_data1 = 0; # data1のある1つのデータの分散

my $a1 = shift;

my @data1 = @$a1;

    for(my$i=0;$i<@data1;$i++){
        $e_data1 += $data1[$i];
    }
        $e_data1 = $e_data1 / @data1;

    for(my$i=0;$i<@data1;$i++){
        $d_data1 = $data1[$i] - $e_data1;
        $v_data1 += $d_data1 * $d_data1;
    }

    return sqrt($v_data1 / @data1);
}

# 2つの同じ数のデータ配列を入力したら共分散を返すプログラム
sub covarience{

my $e_data1 = 0; # data1の平均値
my $e_data2 = 0; # data2の平均値

my $d_data1 = 0; # data1のある1つのデータの偏差
my $d_data2 = 0; # data2のある1つのデータの偏差

my $c_data = 0; # 二つのデータの共分散

my($a1,$a2) = @_;

my @data1 = @$a1;
my @data2 = @$a2;

if(@data1 != @data2){ return -1; }

    for(my$i=0;$i<@data1;$i++){
        $e_data1 += $data1[$i];
        $e_data2 += $data2[$i];
    }

    $e_data1 = $e_data1 / @data1;
    $e_data2 = $e_data2 / @data2;

    for(my$i=0;$i<@data1;$i++){
        $d_data1 = $data1[$i] - $e_data1;
        $d_data2 = $data2[$i] - $e_data2;
        $c_data += $d_data1 * $d_data2;
    }

    return $c_data / @data1;

}