【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);
この記事に言及しているこのブログ内の記事