【Perl】標準偏差と偏差値の計算
2010-07-28-4 
[Programming][Algorithm]
偏差値
の計算式:

標準偏差
の計算式:

偏差値計算スクリプト(Perl):
実行例:
ワンライナー(標準偏差):
追記150908:
- 数式の画像も載せました。
- ワンライナーを足しました。
- ss.pl で標準偏差を出力するよう微修正。
追記100729: 標準偏差の計算が効率的ではないとご指摘を頂きました。ありがとうございます。修正しました。
修正前のコード:
 [偏差値] = (X - [平均値]) / [標準偏差] * 10 + 50
標準偏差
[標準偏差] = √ Σ(([個々の値]i - [平均値])^2 / [総数])
偏差値計算スクリプト(Perl):
#!/usr/bin/perl
use strict;
use warnings;
my @dat;
while (<>) {
    chomp;
    push @dat, $_;
}
# my @dat = map {int(rand(100))} (1..10);
my $num = @dat;
my $ave; # 平均点
$ave += $_ for @dat;
$ave /= @dat;
my $sd; # 標準偏差
$sd += ($_ - $ave)**2 for @dat;
$sd = sqrt($sd/$num);
print "標準偏差\t$sd\n";
print "点数\t偏差値\n";
foreach my $x (@dat) {
    my $ss = ($x - $ave) / $sd * 10 + 50; # 偏差値
    print "$x\t$ss\n";
}
実行例:
% cat a.txt 12 67 25 37 52 40 13 29 5 93 % ./ss.pl a.txt 標準偏差 25.8884143971777 点数 偏差値 12 40.2272886968473 67 61.4723132689184 25 45.2488399593368 37 49.8841180477887 52 55.6782156583535 40 51.0429375699017 13 40.613561870885 29 46.7939326554875 5 37.5233764785837 93 71.5154157938974
ワンライナー(標準偏差):
perl -nle '$s+=$_;$v[$.]=$_;END{$a=$s/$.;
for(1..$.){$r+=($v[$_]-$a)**2}
print sqrt($r/$.)}' a.txt
ワンライナー(偏差値):
perl -nle '$s+=$_;$v[$.]=$_;END{$a=$s/$.;
for(1..$.){$r+=($v[$_]-$a)**2}$sd=sqrt($r/$.);
for(1..$.){print$v[$_]," ",($v[$_]-$a)/$sd*10+50}}' a.txt
変更履歴
追記150908:
- 数式の画像も載せました。
- ワンライナーを足しました。
- ss.pl で標準偏差を出力するよう微修正。
追記100729: 標準偏差の計算が効率的ではないとご指摘を頂きました。ありがとうございます。修正しました。
修正前のコード:
$sd += ($_ - $ave/$num)**2 for @dat; $sd = sqrt($sd);
この記事に言及しているこのブログ内の記事
 
