@mwxdxx

Pythonで偏差値の計算をした話

May 7, 2021

はいどうも、みれいさんです。
今回はなんか見出しとか使ってそれっぽくしていきたいなと思います。

始まり

事の発端は5月4日の深夜11時10分頃。
タイムラインを見るとふとこんなツイートが目に留まりました。

1.偏差値の求め方

偏差値(ここでは学力偏差値のこと)とは何かというと、自分の学力が平均と比較してどれくらいなのか示す値です。日本では平均を50としたものが用いられています。
で、これをどうやって求めるかなんですが、Wikipediaに式が載っておりました。

日本での基準はAが10、Bが50となります。
で、わたしは当初標準偏差をBにしてしまい、その結果69.999の壁が立ちはだかる…はずだったのですが、あろうことか更に計算式をミスってしまい壁は489.999となりました。

実際の画像

で、計算式を間違えていた事に気づき、ようやく正常に69.999の壁にぶち当たりました。

正常な間違いログ(?)

その時の間違ったソースコードがこちらです。
で、偏差値75とか取る人の存在を思い出し、標準偏差について調べてみることにしました。

正確には思い出したんじゃなくて気付かされました

2.標準偏差について

標準偏差って何よ、という話ですがだいたい数値がどれだけ散らばっているかを表す値だと思っていただければ大丈夫です。
偏差値では散らばり具合を元に平均からの差を求めるわけです。
んでもって、Pythonでは以下のコードを使用して求めることができます。

import numpy as np
data=[1,2,3,4,5]
print(np.std(data))

色はPython 3.9.0 IDLE基準です

Pythonのnumpyというモジュールに登録されたnp.stdという関数で値を求めることができます。
つまりnp.stdを偏差値を求めるコードの標準偏差部分に挿入すればいいだけです。
で、完成したコードがこちら!

ちょっとコードの解説をしていきましょう。

3.コード解剖

from decimal import Decimal, ROUND_HALF_UP
import numpy as np

ここではモジュールの読み込みをしています。
上の行を「Import Decimal, ROUND_HALF_UP from decimal」と読み替えてあげると英語で(だいたい)意味が通るようになります。
要は「decimalというモジュールからDecimalとROUND_HALF_UPを読み込む」「numpyというモジュールをnpとして読み込む」ということです。npとして読み込む、というのは以降np.なんちゃらと入力するとnumpyのことになるということです。

i=130546921
j=0
k=[100]
l=0

ここでは変数に値を代入しています。iが人数、jが偏差値、kが全員の点数のまとめ、lは下のループ用のカウンタです。
人数が最初から130546921人になっているのは途中で計算の仕方を変えたからです。裏で動かしてループするより数値から近づき方を分析して手入力したほうがはやくね?ってことに気づいたので、今急遽計算のループ部分を削除しました。

print("Initializing...")
for l in range(i-1):
   k.append(0)

ここでは人数-1回ループさせています。人数に合うようにkに0点を追加しています。先程のk=[なんちゃら]というのは「リスト」という機能を使うときの書き方で、複数の値を1つの名前で扱うことができます。それぞれの値を取り出す時はk[数字]とします。数字は0から順につけられたデータが入っている番号を入力します。

print("Calculating...")
j=10*((100-100/i)/np.std(k))+50
if int(Decimal(str(j)).quantize(Decimal('0'), rounding=ROUND_HALF_UP)) >= 114514:
    print("We did!")
print("result i:"+str(i)+" j:"+str(j))

ここが計算部分です。先程の式「偏差値=10×{(自分の点数-平均)÷標準偏差}+50」をプログラムに落とし込んで、その次のifでは四捨五入して114514以上であれば「やったね!」と表示し、最後に結果を表示しています。

実際に実行すると画像の一番下のような感じになります。
このjの値を使って目標人数からどれだけ離れているかを推測し、iを入力して実行していきます。

4.結果

さあ、みなさんが一番気になっているであろう結果
地道に入力を重ねたどり着きました。
発表します。

100点満点を取り、自分以外が全員0点をとった場合、自分の偏差値が四捨五入して114514になる最低人数は…

131018930人です!!!!!!!!!!

いやー、ついにたどり着きましたよ。3日かかった。
というわけで明日からこの雑学、学校で友達に、会社で同僚に、披露してみてはいかがでしょうか?

5.おわりに

本業プログラマーじゃなくてモーショングラフィッカー(仕事は学生)なのにそこそこガチにPython書いてて草なんだ

以上です。ではまた~

この問題を生み出した神(フォローしなさい):https://twitter.com/muro_PC_JISAKer