2014/05/29(木)Perl Data Language 統計編 #04 「平均、分散、標準偏差」

データ↓
http://www.tokyo-tosho.co.jp/download/DL02122.zip

問1.1の5)はPDL::Stats を使うと一撃。ですが、勉強にならないので一応普通に計算した場合も載せました。分散を計算するには平均を計算しないといけないので、そこで自由度が1減ると考えて不偏分散を使って計算しました。(統計検定2級のテキストを参照)

#!/usr/bin/env perl

use strict;
use warnings;
use feature qw/say/;
use PDL::Lite;
use PDL::Stats;
use PDL::IO::Misc ();
use DDP filters => { -external => [ 'PDL' ] };

my $infile = 'weather.csv';
my $colnum = 1;
my $heikin_kion = PDL->rcols($infile, { COLSEP => ',', INCLUDE => qr/[0-9]/ }, $colnum);

say "  平均:" . sprintf("%.3f", $heikin_kion->avg);
say "  分散:" . sprintf("%.3f", $heikin_kion->var_unbiased);
say "標準偏差:" . sprintf("%.3f", $heikin_kion->stdv_unbiased);
print "\n";


say "専用メソッドを使わずに分散と標準偏差を計算";

my $avg = $heikin_kion->avg;
my $sum = 0;

for my $i (0 .. $heikin_kion->nelem - 1)
{
    my $hensa = $heikin_kion->at($i) - $avg;
    $sum += $hensa ** 2;
}

my $variance = $sum / ($heikin_kion->nelem - 1);

say "  分散:" . sprintf("%.3f", $variance);
say "標準偏差:" . sprintf("%.3f", sqrt $variance);
  平均:5.055
  分散:1.669
標準偏差:1.292

専用メソッドを使わずに分散と標準偏差を計算
  分散:1.669
標準偏差:1.292