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; }