Python

Python初心者向け:分散/標準偏差を基本から解説します

スポンサーリンク

▶ まずデータの概要をつかむなら、以下の記事を参考にしてください。基本統計量をまとめて算出する方法をご紹介しています。

はじめに

今回は分散と標準偏差を扱います。分散には標本分散と不偏分散、標準偏差には標本標準偏差と不偏標準偏差とがあります。ややこしいのは、使うライブラリによってdefaultで計算するものが異なる点です。pandasとnumpyでdefaultで異なるので、特にこの辺を意識して整理しておきましょう。

標本分散と不偏分散

分散は、「データが平均値からどれだけ離れているか」をあらわします。定義は次の式となります。

この分散は、正確には標本分散と呼ばれます。標本分散は母集団の分散(母分散)と比べて分散を過小評価してしまう、というバイアスがあります。これを修正したものが不偏分散となります。その定義式は次のようになります。

不偏分散は、 標本分散の期待値が母分散に一致するように標本分散の算出式にN/(N-1)をかけたものです。したがって、不偏分散は一致性と不偏性をもつ推定量となります。

標本標準偏差と不偏標準偏差

標準偏差は、分散の平方根をとったものです。分散に標本分散と不偏分散があるように、標準偏差にも標本標準偏差と不偏標準偏差があります。

numpyとpandas<

numpyにもpandasにも分散や標準偏差を計算するメソッドが用意されています。分散は、numpyでもpandasでもvar()メソッドで求めることができますが、それぞれがdefaultで計算するものが異なるので注意が必要です。

それではさっそくみていきましょう。

# ライブラリのインポート
import pandas as pd
import numpy as np

# テストデータ
test_data_numpy=np.array([1,3,5,7,9])
test_data_pandas=pd.Series([1,3,5,7,9])

このデータの分散を求めてみましょう。まずは、var()メソッドを使わずに計算してみましょう。

mean=test_data_pandas.mean()

std_manual=0
for i in test_data_pandas:
    std_manual+=(mean-i)**2

print('標本分散の値は%.1f'%(std_manual/(5))) 
print('不偏分散の値は%.1f'%(std_manual/(5-1)))

このように標本分散と不偏分散を求めることができました。次に、numpyとpandasのvar()メソッドで求めてみましょう。

print('numpyは%.1f'%test_data_numpy.var())
print('pandasは%.1f'%test_data_pandas.var())

つまり、numpyでは標本分散、pandasでは不偏分散となります。numpyで不偏分散を求めたいときには、ddof=1を指定することで求めることができます。

print('numpyで不偏分散を求めると%.1f'%test_data_numpy.var(ddof=1))

同じようにpandasで標本分散を求めるときには、ddof=0を指定することで算出できます。

print('npandasで標本分散を求めとは%.1f'%test_data_pandas.var(ddof=0))

標準偏差でも同じことが起こります。

print('numpyは%.1f'%test_data_numpy.std())
print('pandasは%.1f'%test_data_pandas.std())

numpyでddof=1を指定すれば、pandasと同じ値となります。確認しておきましょう。

print('numpyで不偏標準偏差を求めると%.1f'%test_data_numpy.std(ddof=1))
スポンサーリンク

まとめ

いかがでしょうか?この辺はややこしいですね。メソッド名が同じvar()やstd()なのにその中身の計算が異なります。よく整理しておきましょう。

▶ 最頻値に関する記事をあります。こちらから参照してください。

▶ 四分位数やこれを使った外れ値の除外に関する記事もあります。

▶ 一気にデータの概要を把握する方法があります。こちらの記事をどうぞ。

Python初心者向け:分散/標準偏差を基本から解説します

コメント

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