IT Learning

実践形式でITのお勉強

Python

【Python】標準偏差と分散の計算

投稿日:2019年6月16日 更新日:

目的

以前の記事で四分位偏差によりデータの分散度の計算を行いましたが、四分位偏差ではデータの代表値である四分位数のみを使用しており、データ全体の特性を反映しきれていないという短所があります。

そこで今回はより一般的に分散度の評価に使用される標準偏差について実際のデータを使っての標準偏差をpythonで計算してみたいと思います。

標準偏差

早速ですが、標準偏差の定義式は以下になります。

$$s=\sqrt{\frac{1}{n} \sum_{i=0}^n (\overline{x}-x_i)^2}$$

ここで\(s\)は標準偏差、\(\overline{x}\)はデータの算術平均、\(x_i\)が\(i\)番目のデータ、\(n\)がデータ数になります。

式の解釈としては、データの算術平均とあるデータの差の二乗の値をすのてのデータについて足し合わせ、その平方根をとっています。
わざわざ二乗して平方根をとっているのは足し合わせた際にプラスの値とマイナスの値で打ち消しあってしまわないようにするためです。

式を見るとわかるように、標準偏差は\(i=0~n\)まで全てのデータの情報が式に包含されていることになります。
そのため、四分位偏差に比べ、データ全体の特性を反映できている分散度の評価指標となっています。
これが一般的な分散度として標準偏差が利用される理由の一つでもあります。

Pythonによる標準偏差の計算

これをpythonで計算してみます。

まずは実データの準備です。

今回もkaggleからアボカドのAveragePriceのデータを使わせていただきます。https://www.kaggle.com/neuromusic/avocado-prices

提供元: https://hassavocadoboard.com/

上記データのAveragePriceに対し、標準偏差を計算してみます。

データの先頭5行は以下のような形です。


データの読み込みから標準偏差計算までのコードは次のようになります。

import pandas as pd

#データ読み込み
df = pd.read_csv('C:\\avocado.csv',engine  ='python')

#標準偏差の計算
df['AveragePrice'].std() #0.40267655549555004

上記を見てわかる通り、たった3行というコードで計算することができました。
標準偏差のデメリットとしては四分位偏差に比べて演算が複雑、ということがありますが、pythonのようなライブラリが豊富な言語で実装する場合には全くデメリットを感じません。

分散

データの分散度を測る指標として標準偏差のほかに分散があります。
ただ、分散は単に標準偏差の2乗で定義されます。
標準偏差でなく、分散を求めるメリットとして計算式が単純であることが言えます。

分散の定義式は以下になります。

$$s^2= \frac{1}{n} \sum_{i=0}^n (\overline{x}-x_i)^2 $$

上記の右辺を展開すると次のようになります。

$$\frac{1}{n} \sum_{i=0}^n x_i^2-2\overline{x}\frac{1}{n} \sum_{i=0}^n x_i +\overline{x}^2$$

ここで第二項に現れる\( \frac{1}{n} \sum_{i=0}^n x_i \)は算術平均\(\overline{x}\)を計算する式ですので、第二項は\(-2\overline{x}^2\)に置き換えられます。

つまり、分散の式は以下で表すことができます。

$$s^2= \frac{1}{n} \sum_{i=0}^n x_i^2 -\overline{x}^2$$

各データの二乗平均から算術平均の二乗を引けば分散が算出できることになります。

これをpythonで書くと、以下のようなコードとなります。

#各データの二乗平均を計算
df['AveragePrice'].apply(lambda x:x*x).mean()-df['AveragePrice'].mean()*df['AveragePrice'].mean()

#0.16213952301460144

このように学術的な観点からは式がきれいになることが分散の素晴らしい点ではあります。
が、pythonで実データの計算をする場合はnumpyのvar()メソッドで簡単に計算できるので、実装上はそこまでメリットがあるわけではありません。

#varメソッドによる分散の計算
df['AveragePrice'].var() #0.16214840834576077

当たり前ですが、式をそのまま当てはめ計算しても、varメソッドで計算しても同じ値になることが確認できました。

Related

-Python

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です