Pyhtonで分散、標準偏差の公式と説明そして実装。

データ分析
Sponsored Link

分散はデータが平均値とどれだけ離れているか、データの散らばり具合を示す値です。

文で説明してもわかりにくいので、とりあえず例を見てみましょう。

二つのヒストグラムがありますが、青いヒストグラムはすべてのデータがより平均値に近くなっています。

つまり青いヒストグラムの平均値は、このデータ全体をよく表していることになりますね。

反対に赤いヒストグラムは、なだらかな線で左右に広がっていのがわかります。

両端が平均値から離れているため、平均値がこのデータを代表しているとはいいがたいですね。

データが、平均値からどれだけ散らばっているかを示す値が分散というわけです。

分散の数式は以下の通り。

この式を簡単に説明すると、分散は「データの各値と、その平均との差を2乗した値の平均」となります。

つまり、 がデータの値であり、そこから平均  を引きその答えを2乗。

それをデータ数 で割った値が分散になります。

プログラミングを勉強したい!! プログラミングに興味がある!!
そんなあなたへのおすすめ記事
無料体験あり、キャッシュバック有りプログラミングスクールおすすめはこちら

分散を求めてみる

では実際に、分散を求めてみましょう。

Pythonで分散を求めるコードをまとめると、以下のようになります。

分散を求めるためのデータは、以下の記事で使ったデータをもとにしています。

Python :平均値の求めかた、数式の意味も解説してみた。
標本を度数分布表に落とし込み、グラフにすることでその大まかな傾向が見えてきたと思います。 ではさらに、分析を行うために度数分布表の特色を数値で見ることにしましょう。 そこで、一般的に用いられるのが「平均」「分散」「標準偏差」です...

実装してみましょう。

average_sigma2 = np.sum((average-mean)**2)/N
average_sigma2
4.0

分散は 4.0 と求められました。

一行ずつ解説していきます。

まず array に格納されている、データの確認をしてみましょう。

average 
array([3, 5, 4, 1, 7])

次にarray から、1データごとに平均値を引いていきます。

平均値は「python:平均値の求め方」で求めた値を使っています。

average - mean 
array([-1.,  1.,  0., -3.,  3.])

つぎに、平均値を引いた値を二乗します。

(average - mean)**2  
array([1., 1., 0., 9., 9.])

二乗した値をすべて足していきます。

np.sum((average - mean)**2)  
20.0

それをデータの個数Nで割った商が分散になります。

np.sum((average - mean)**2)/N  
4.0

ちなみに分散を求める関数があるので、通常はこれを使います。

np.var(average, ddof=0)  
4.0

分散は4.0と求められました。

標本分散と不偏分散

分散には標本分散と不偏分散があり、上記の実装で求めた値は標本分散になります。

統計的に重要な概念なので簡単に説明します。

本当に正確な値を見つけたいのであれば、母集団すべての値を計算すればいいのですが、それは現実的に不可能なので、母集団から標本を抽出するわけです。

その抽出した標本の分散が標本分散です。

しかし標本の分散はあくまでも標本の分散であり、母集団の分散とは違う可能性があります。

そこで、標本に存在しているかもしれない偏りを補正した分散が不偏(偏りがない)分散です。

不偏分散の数式を紹介しておきますね。

標本分散と比べて、分母が  と小さくなります。

これをPythonのコードで書くと、

np.var(average, ddof=1)
5.0

不偏分散は5.0になります。

ここで、「ddof」が1と 0 の違いは何か気になりますよね。

ちなみにこの「ddof」は何かというと「Delta Degrees Of Freedom」で「デルタ自由度」と訳されます。

ちなみに数式の中で使われているのが「」の部分。

自由度がどういう意味かなんですが、すごく簡単に説明すると「自由に決めることができる値の数」です。

余計分けわかりませんよね。

例を使って説明します。

分散を求めるために使った「3, 5, 4, 1, 7」という5つのデータをすべて足すと

3+5+4+1+7 = 20

答えは20になります。

では次に答えが20になるような値を自由に決めてみます。

例として

3+5+4+1+7 = 20

使うと、最後の数字は7でなければ、20は成り立ちません。

つまり前の4つ数字は自由に決められますが、最後の数字は自由に決めることができないですよね。

お分かりでしょうか?

つまり「」は総データ数から1引いた数までは自由に決められるという意味です。

これをPython で表すと、「ddof = 1」となるわけです。

そしてこのデータセットの標本分散は「4.0」不偏分散は「5.0」になります。

標準偏差

標準偏差も分散と同じく、データのバラつき見るために用いられる値です。

分散という値があるのになぜ標準偏差を使う理由は、現実に当てはめて理解しやすい値が算出できるからです。

というのも、標準偏差は分散の平方根、逆に言うと標準偏差を二乗すれば分散になる。

例を挙げると、小学生の算数テストの標準偏差が10点だったとすると、分散は100点になってしまいます。

ちょっと理解に苦しみますよね。

分散は、統計的には正解でも現実的に受け入れるのが難しい場合があるので、通常は標準偏差を使って散らばりを表します。

ちなみに、標準偏差の公式は以下になります。

ちなみにこの公式では、データ数から1を引いていないので、標本標準偏差になります。

データ数を自由度1にした不偏標準偏差の公式が以下になります。

では実際にまず、標本標準偏差をpythonで実装してみましょう。

今回も分散で使ったデータを使います。

average_sigma2 = np.sum((average-mean)**2)/N 
average_sigma2 
4.0

以上の計算で、分散は4.0と求められました。

標準偏差は分散の平方根なので、以下のように書きます

average_sigma2 = np.sum((average - mean)**2)/N
average_sigma = np.sqrt(average_sigma2)
average_sigma 
2.0

手計算ではこうなりますが、標準偏差の関数「.std()」を使うことで、1行で書くことができます。

np.std(average, ddof = 0)
2.0

ddof つまりデルタの自由度が0なので、標本標準偏差ということがわかりますね。

不偏標準偏差を求める場合は、ddof = 1 とすることで、求められます。

np.std(average, ddof = 1)
2.23606797749979

標本標準偏差の範囲と比べて、不偏標準偏差の散らばりが多少大きいのが分かりますね。

プログラミングを勉強したい!! プログラミングに興味がある!!
そんなあなたへのおすすめ記事
無料体験あり、キャッシュバック有りプログラミングスクールおすすめはこちら

 

関連記事

pythonで相関関係と共分散を求めてみる。
相関関係とは2種類のデータの関連性を示す指標であり、例えばAとBの間に何らかの関連性があるとき、AとBは相関関係にあるといえるでしょう。 例えば、Aが増加するときBも増加する場合はAとBの間に正の相関関係があり、Aが増加するときBが減...
Python :平均値の求めかた、数式の意味も解説してみた。
標本を度数分布表に落とし込み、グラフにすることでその大まかな傾向が見えてきたと思います。 ではさらに、分析を行うために度数分布表の特色を数値で見ることにしましょう。 そこで、一般的に用いられるのが「平均」「分散」「標準偏差」です...
Sponsored Link

コメント

タイトルとURLをコピーしました