case-kの備忘録

日々の備忘録です。データ分析とか基盤系に興味あります。

Pythonで学ぶ標準化とは

異なるグループ間の比較方法として「標準化」と呼ばれる統計的手法があります。同じテストの結果を比較することはは容易ですが、異なる科目のテスト結果の比較は点数だけでは判断できません。このような場合「標準化」は有益です。今回は「標準化」の関連用語や例題を通して、実社会の課題に対しても活用できるようになることを目的に記事を書いてました。

標準化とは

標準化は異なるグループを平等に比較する際に用いられます。例えば、Aさんは異なるグループである、数学と国語のテストを受験したとします。テストの結果、Aさんは数学70点、国語50点でした。点数だけ見るとAさんは数学の方が得意に見えますが、他の生徒との平均を比べてみないとわかりません。このようなケースで標準化を使うと、異な教科[グループ]でどちらの点数が良いのか確認することができます。
標準化させるためには以下の条件を満たす必要があります。

・独立な正規分布に従うこと
・平均値を求められること
・標準偏差を求められること

上記を満たす場合、標準正規分布の統計値をZとするとZは以下の式で表現できます。
f:id:casekblog:20181009105529p:plain:w200
X : 確率変数
μ:確率変数の平均
σ : 標準偏差
このZ値を標準化と呼びます。
case-k.hatenablog.com

実際に例題を解いてみましょう。

例題

あるクラスのテスト結果は平均72.8点、標準偏差15点の正規分布に従っています。この時、88点以上の人は何%か求めよ。
この場合まず標準化した統計値Z値を求めます。標準化を行うことにより、単位や平均値などが異なるデータ同士を単純に比較できるようになります。

z = (88 - 72.8) /15
print("z score:{}".format(z))

# out put
z score:1.0133333333333334 

この統計値Z値を標準正規分布表と照らし合わせることで88点以上の人は15.6%いることが確認できます。
上記の問題は累積分布関数を用いて解くことも可能です。

積分布関数とは

確率変数Xに対してXを実装するとき以下のように表されるF(X)を累積分布関数・もしくは分布関数と呼び下記の数式で表現されます。

F(X) = P(X<x)

簡単に言うとある値以下となる確率を計算してくれるものです。例えば3以下となる確率の計算であれば、-∞~3までの確率密度を全て足し合わせたものです。この方法で求めた確率を下側確率と呼び、確率変数Xをパーセント点と呼びます。

例題

あるクラスのテスト結果は平均72.8点、標準偏差15点の正規分布に従っています。この時、88点以上の人は何%か求めよ。
積分布関数を用いて求めよ。

#累積分布関数
print("Cumulative Distribution Function{:.4f}".format(
    stats.norm.cdf(loc = 72.8, scale = 15, x = 88)))
print("answoer:{:.3f}".format(1 -0.8445))

# out put
Cumulative Distribution Function0.8445
answoer:0.155

先ほどの標準正規分布表から求めた値と同じとなりました。パーセント点を求める方法は下記となります。

# ppf [Percent Point Function]
under_prob = 1- 0.155
x = stats.norm.ppf(loc = 72.8, scale = 15, q = under_prob)
print("Percent Point Function{:.1f}".format(x))

# out put 
Percent Point Function88.0

標準化は偏差値の算出にも使われます。

偏差値とは

偏差値は以下の方法で表現されます。

偏差値 = Z値 * 10 + 50 

点数のばらつきの大きさを表す標準偏差を利用して平均点との差を正規化することで、自分の点数がその集団の中でどのくらいの位置にいるのかを客観的に比較しやすくしたものです。このように二項分布を正規分布に近似させることができれば多くのメリットがあります。
次にポアソン分布について学びます。

例題

あるクラスの数学と国語のテストの結果は次の通りでした。A君は数学が80点、国語が70点でした。A君の偏差値はどちらの科目が高いでしょうか?
数学と国語の点数はそれぞれ独立な正規分布に従います。

数学 平均点:60点 標準偏差:15点
国語 平均点:40点 標準偏差:20点

Z_math = (80 - 60) / 15
print('math z score:{:.2f}'.format(Z_math))
Z_japanese = (70 - 40) / 20
print('japanese z score:{:.2f}'.format(Z_japanese))

# out put 
print("数学の偏差値:{}".format(50+10*Z_math))
print("国語の偏差値:{}".format(50+10*Z_japanese))

標準化した値が大きいほど相対的な順位が高いことを示すので、A君の場合は数学よりも国語の方が順位は高いと言えます。

参考
14-3. 標準化したデータの使い方 | 統計学の時間 | 統計WEB