古い記事
ランダムジャンプ
新しい記事
偏差値の計算式:

[偏差値] = (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);