NumPy:分散と標準偏差を求める(var, std)

データのばらつきを測る指標として、分散と標準偏差があります。NumPy では var()std() で簡単に計算できます。

分散:var

分散は、各データが平均からどれだけ離れているかを表す指標です。偏差(各値と平均の差)の2乗の平均として計算されます。

import numpy as np

data = np.array([2, 4, 4, 4, 5, 5, 7, 9])

variance = np.var(data)
print(variance)  # 4.0

計算過程を手動で書くと以下のようになります。

mean = np.mean(data)  # 平均: 5.0
deviations = data - mean  # 偏差
squared = deviations ** 2  # 偏差の2乗
variance = np.mean(squared)  # 平均
print(variance)  # 4.0

標準偏差:std

標準偏差は分散の平方根です。元のデータと同じ単位で解釈できるため、分散よりも直感的に理解しやすい指標です。

data = np.array([2, 4, 4, 4, 5, 5, 7, 9])

std = np.std(data)
print(std)  # 2.0

# 分散の平方根と一致
print(np.sqrt(np.var(data)))  # 2.0

標本分散と母分散

統計学では、全体(母集団)から一部(標本)を取り出して分析することが多いです。このとき、分散の計算方法が2種類あります。

母分散(N で割る)

母集団全体のデータがある場合。NumPy のデフォルト(ddof=0)

標本分散(N-1 で割る)

標本から母集団の分散を推定する場合。ddof=1 を指定

ddof は「自由度の調整」を意味し、分母から引く値を指定します。

data = np.array([2, 4, 4, 4, 5, 5, 7, 9])

# 母分散(デフォルト、N=8で割る)
print(np.var(data))  # 4.0

# 標本分散(N-1=7で割る)
print(np.var(data, ddof=1))  # 4.571428...

標準偏差も同様です。

# 母標準偏差
print(np.std(data))  # 2.0

# 標本標準偏差
print(np.std(data, ddof=1))  # 2.138...

データが標本である場合は ddof=1 を使うのが一般的です。

多次元配列での使用

2次元配列では、axis 引数で計算する軸を指定できます。

a = np.array([[1, 2, 3],
              [4, 5, 6]])

# 全体の分散
print(np.var(a))  # 2.9166...

# 列ごとの分散(axis=0)
print(np.var(a, axis=0))  # [2.25 2.25 2.25]

# 行ごとの分散(axis=1)
print(np.var(a, axis=1))  # [0.6666... 0.6666...]

行ごと・列ごとの統計量が必要なときに便利です。

使い分けのまとめ

分散と標準偏差はどちらもばらつきを表しますが、標準偏差のほうが元のデータと同じスケールなので解釈しやすいです。例えば、身長データ(cm)の標準偏差は「平均からのばらつきが約○cm」と読めます。分散は2乗しているため、単位が cm² になってしまいます。