偏差値を求める

偏差値が大好きという人は少ないと思いますが、偏差値を正しく求められるくらい母集団が大きな場合に awk は便利です。 Excel では全国模試レベルの母集団に対して計算することは困難ですが、awk を使えば (実行ファイルにもよりますが) 実行ファイル込みで 100 KB 程度のサイズで計算することだって可能です。

さて、偏差値は数式による解説にも書かれているような数式で求めることができます。 データの保持方法などによってアルゴリズムも多少変わってくるかと思いますが、ここでは配列に格納して最後に END 部で処理します。 配列に格納することで多くのメモリを消費してしまいますが、単に偏差値だけを求めるようなケースは稀で、いろいろな計算をメモリに保持した状態で計算することの方が多いと思い、この方法を取っています。

#! /usr/bin/gawk -f
# standard_score.awk

# Ref.: http://ja.wikipedia.org/wiki/偏差値

{
    score[$1] = $2;
}

END {
    for (i in score) {
        print i "さんの偏差値は " get_standard_score(score, i) "です。";
    }
}

# get_standard_score(): 偏差値を返す
#   input:  偏差値を計算したい配列
#   output: 入力した配列の偏差値
function get_standard_score(arr, idx,   num_arr, sum, sub_u, u, sigma, t) {

    for (i in arr) {
        # 配列の数を計算
        num_arr++;
        # 配列の総和を計算
        sum += arr[i];
    }

    u = sum / num_arr;

    # (x - u) ^ 2 の総和を計算
    for (i in arr) {
        sub_u += (arr[i] - u) ^ 2;
    }

    sigma = sqrt(sub_u / num_arr);

    # 偏差値を計算
    t = 10 * (arr[idx] - u) / sigma + 50;
    return t;
}

ここで使うサンプルは以下のようなものです。

$ cat sample.txt
あずさ  90
ちはや  80
ゆきぽ  70
やよい  20
あみ    30
まみ    30
りつこ  100
いおり  70
まこと  60

実際に実行してみましょう。

$ gawk -f standard_score.awk sample.txt
まことさんの偏差値は 49.5862です。
あみさんの偏差値は 38.4135です。
ちはやさんの偏差値は 57.0347です。
やよいさんの偏差値は 34.6893です。
ゆきぽさんの偏差値は 53.3104です。
りつこさんの偏差値は 64.4831です。
まみさんの偏差値は 38.4135です。
あずささんの偏差値は 60.7589です。
いおりさんの偏差値は 53.3104です。

このような形で表示されます。

なかなか数値だけでは分かりにくい偏差値ですが、この数値だけにとらわれないようにしたいものです。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png