アラカン"BOKU"のITな日常

文系システムエンジニアの”BOKU”が勉強したこと、経験したこと、日々思うことを書いてます。

勉強の練習問題として、分散・標準偏差・変動係数・偏差値他代表値の計算をEXCELとpythonでやってみた

統計のお勉強をはじめて、1週間ほど。

 

代表値についての章が終わりました。

 

その練習問題として、学校のクラスの試験の得点を入力して、偏差値を計算したり、平均点・中央値・最頻値などを求めるなどして分析するEXCELブックを作りました。

 

こんなイメージのもんです。

f:id:arakan_no_boku:20180129230131j:plain

f:id:arakan_no_boku:20180129230200j:plain

 

ようするに、B列に氏名、C列に得点を入力していくと(一応、1クラス50名迄に今はしてます)、平均点・中央値・偏差値とか得点レンジごとの人数を度数にとったヒストグラムとかを書きます。

 

EXCELの関数で簡単にできてしまうレベルのもんですが、意外に気に入ってます。

 

こんなんでも、学校の先生とかで使ってみようと思ってくれる人が一人くらいはいるかもしれないな・・と思ったので、とりあえずダウンロードできるようにしときます。

github.com

 

試験点数分析ブック.xlsxの方です。

 

シートに保護はかけてますが、パスワードも設定してないので、ダウンロードして好きにしてもらえばいいかな・・と。

 

とまあ・・それはさておき

 

EXCELを使うと簡単で楽ですけど、統計もプログラミングの一つの素養と考えたら、pythonとかでも使えないと片手落ちではあります。

 

なので、上記EXCELのサンプルに使った得点データ(適当に50人分作ったサンプル)を使って、EXCELでやったのと似たようなことを、これも勉強がてら、pythonでやってみようかと思います。

 

平均、中央値、最頻値、分散、標準偏差、変動係数、偏差値を求めてみます。

 

元データは、こんな感じのndarrayです。

na_score

[[58. 95. 63. 55. 29. 17. 57. 58. 17. 55. 24. 47. 70. 50. 81. 41. 28. 61.
79. 71. 74. 34. 45. 80. 65. 85. 62. 63. 80. 73. 72. 65. 45. 57. 70. 63.
78. 65. 49. 63. 75. 24. 68. 38. 52. 84. 34. 66. 52. 61.]]

 

平均

numpyのaverageを使う。

n_average = round(np.average(na_score),0)

 

中央値

numpyのmedianを使う。

n_median = round(np.median(na_score),1)

 

最頻値

これはなかったので自作。

カウントして、数の一番多いのを返しているだけです。

def mode(na_score):
    l = na_score.tolist()
    c = Counter(l[0])
    m = c.most_common(1)
    return m[0][0]

n_mode = mode(na_score)

 

分散

numpyのvarを使う。

n_var = np.var(na_score)

 

標準偏差

numpyのstdを使う。

n_std = np.std(na_score)

 

変動係数

平均と標準偏差をもとめて、標準偏差を平均で割ってます。

n_average = round(np.average(na_score),0)
n_std = np.std(na_score)
n_hrt = n_std / n_average

 

偏差値

平均と標準偏差を求めて、(得点-平均)÷標準偏差 で各点を標準化します。

それを仮に Z とすると、50+10Z が偏差値です。

以下はNdArrayを.flatで一次元にして、すべての点数に対して偏差値を求めて表示する・・って感じで。

n_average = round(np.average(na_score),0)
n_std = np.std(na_score)
for k in na_score.flat:
    n_dev = round(50 + 10 * ((k - n_average) / n_std),1)
    print("{0}:{1}".format(k,n_dev)) 

 

これを出力するとこんな感じになります。

58.0:50.0
95.0:70.1
63.0:52.7
55.0:48.4
29.0:34.2
17.0:27.7
57.0:49.5
58.0:50.0

 

このへんくらいなら、それほど難しくはないですね。

 

うん。