【Pythonデータサイエンス入門】簡単に偏差値を計算してみよう

環境

macOS Sierra 10.12.6
ターミナル
Anaconda
Python 3.6.4

Anacondaをインストールすればデータサイエンスに必要なライブラリが使えるので、
ぜひインストールしましょう。

Anacondaのインストール手順についてはこちら
MacにAnacondaをインストールする

偏差値とは。偏差値の求め方

「偏差値」の公式
変量xにおいて、標準偏差をs、平均値をmとするとき、
z = 50 + (10 * (x - m) / s)
で表すことのできる変量zを偏差値と呼びます。

よく受験において聞くのが「偏差値」ですね。
これは日本の教育でのみ使われている数値だそうですが、日本人では知らない人はいないと言えるほどメジャーな数字ですよね。

この偏差値を出すためには、標準偏差平均値といった言葉の理解が必要です。

Pythonで簡単に偏差値を計算してみる

いつもどおり結論から。
deviation.pyというモジュール名で作成した。

from statistics import mean  # mean()を使うためインポート
import math  # math.sqrt()を使うためインポート


# この辞書の中身を必要に応じて変えるだけでいい。
students = {"佐藤": 89, "鈴木": 50, "渡部": 100, "斎藤": 82, "相沢": 71,
            "倉田": 90, "高橋": 32, "田中": 51, "森井": 94, "尾高": 59,
            "小林": 65, "清水": 60, "伊藤": 61, "山本": 56, "中村": 68,
            "加藤": 75, "吉田": 54, "佐々木": 72, "山田": 81, "山口": 50,
            "松本": 53, "井上": 46, "木村": 80, "林": 73}


def de_mean(x):
    # mean(x)はxの平均を出す
    # mean([1, 2, 3, 4, 5])は3となる
    x_bar = mean(x)  # x_barにはxの平均が入る
    return [x_i - x_bar for x_i in x]  # 要素と平均の差を格納したリストを返す


def sum_of_squares(n):
    # リストの要素の2乗を返す
    return sum(i**2 for i in n)


def variance(x):
    # 分散を求める
    n = len(x)
    deviations = de_mean(x)
    return sum_of_squares(deviations) / n


def standard_dev(x):
    # 標準偏差を求める。分散の正の平方根。
    return math.sqrt(variance(x))


# students辞書の点数の値のところをリスト化
score_list = students.values()
# sutudents辞書の点数たちの平均を求める
heikin = sum(list(score_list)) / len(list(score_list))
# 名前をキー、値を偏差値とした辞書をつくるため、空辞書作成
stu_hensachi_dict = {}

for name, score in students.items():
    z = 50 + (10 * (score - heikin) / standard_dev(score_list))
    stu_hensachi_dict[f'{name}'] = z

# 偏差値が高い順にソートする
sorted_students = sorted(stu_hensachi_dict.items(), key=lambda x: x[1],
                         reverse=True)
for i, n in enumerate(sorted_students):
    print(f'{i + 1}位は{sorted_students[i][0]}で、偏差値は{sorted_students[i][1]:.0f}')

print(f'ちなみに平均点は{heikin:.1f}点')

実行すると、

1位は渡部で、偏差値は70
2位は森井で、偏差値は66
3位は倉田で、偏差値は64
4位は佐藤で、偏差値は63
5位は斎藤で、偏差値は59
6位は山田で、偏差値は58
7位は木村で、偏差値は58
8位は加藤で、偏差値は55
9位は林で、偏差値は53
10位は佐々木で、偏差値は53
11位は相沢で、偏差値は52
12位は中村で、偏差値は50
13位は小林で、偏差値は49
14位は伊藤で、偏差値は46
15位は清水で、偏差値は46
16位は尾高で、偏差値は45
17位は山本で、偏差値は43
18位は吉田で、偏差値は42
19位は松本で、偏差値は42
20位は田中で、偏差値は40
21位は鈴木で、偏差値は40
22位は山口で、偏差値は40
23位は井上で、偏差値は37
24位は高橋で、偏差値は29
ちなみに平均点は67.2点

deviation.pyの解説、考え方

特に難しいところはないです。
平均と標準偏差を出して、偏差値を求める公式に当てはめるだけ。

中村さんは68点、平均点は小数点以下1桁までで67.2点、そして偏差値50というのが確認できます。

平均だと偏差値50だなと受験を乗り切った方なら思い出せますよね。

名前のリストと点数のリストを別々で持つよりも、一つの辞書で管理したほうが都合がいいし明解だと思います。
ちなみにこの記事を読んでいるあなたがもし先生なら、studentsの辞書を自分の生徒たちの名前と点数にするだけで偏差値を出すことができます。偏差値というのはあくまで一方向から見える値にすぎないですが、簡単に求めることができるのが面白みですね。

deviation.pyでは辞書の処理についていろいろ出てきていますね。
もしfor文などで出てくる辞書の扱い方に疑問があれば、こちらも参考にして下さい→ http://pycarnival.com/dict/

ほとんど解説すべきことはソースコードのコメントに書いてしまったので改めて書くことがあまりないですね(笑)。

フォーマットではf-stringsを使っています。
f-stringsはPython3.6で追加された新機能なので、3.6以前のバージョンの人は注意して下さい。f-stringsがあまりにも便利で直感的でわかりやすいため、私のお気に入りのメソッドです。