データのばらつきを測る指標として、分散と標準偏差があります。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² になってしまいます。