n で割ると何が起きるか
統計や機械学習の入門書を読むと、標本から分散を計算するとき n ではなく n-1 で割ることが当たり前のように書かれています。でも「なぜ?」という理由は後回しにされがちです。
まず n で割った場合に何が起きるか確認します。母集団の真の分散(母分散)を \sigma^2 と書くとき、n で割った量 s_n^2 を使うと、その期待値は次のようになります。
E\!\left[s_n^2\right] = \frac{n-1}{n}\,\sigma^2
つまり s_n^2 は常に \sigma^2 よりも小さい値を返し続けます。データが 10 個なら真の値の 90%、データが 3 個なら 67% しか推定できません。このような推定量を 偏った(バイアスのある)推定量 と呼びます。
直感的な理由——標本は「内側」に引き寄せられる
なぜ小さく見えるのでしょうか。直感的な説明から入ります。
母集団全体の平均を 母平均 \mu と呼びます。しかし標本を取るとき、私たちは \mu を知りません。代わりに標本データから計算した 標本平均 \bar{x} を使います。
ここに問題があります。\bar{x} は \mu とは一般に一致しません。標本を引くたびにランダムにズレます。
このズレが分散計算を狂わせます。各データ点 x_i の「散らばり」を測るとき、本来は \mu からの距離 (x_i - \mu)^2 を見るべきです。ところが \mu が不明なので (x_i - \bar{x})^2 で代用します。
\bar{x} は定義上 x_i たちの平均なので、x_i が大きければ \bar{x} も少し大きく、x_i が小さければ \bar{x} も少し小さくなります。つまり \bar{x} は常に x_i の方向に引き寄せられています。結果として (x_i - \bar{x})^2 は (x_i - \mu)^2 よりも体系的に小さくなってしまいます。n で割るとこのバイアスがそのまま残ります。
数学的証明——E[s²] を展開する
もう少し踏み込んで、この「(n-1)/n 倍」という係数がどこから来るかを確かめます。
n で割った標本分散を定義します。
s_n^2 = \frac{1}{n}\sum_{i=1}^{n}(x_i - \bar{x})^2
各 (x_i - \bar{x}) を (x_i - \mu) - (\bar{x} - \mu) と書き直して展開すると、次が得られます。
\sum_{i=1}^{n}(x_i - \bar{x})^2 = \sum_{i=1}^{n}(x_i - \mu)^2 - n(\bar{x} - \mu)^2
両辺の期待値を取ります。\sum(x_i-\mu)^2 の期待値は n\sigma^2、n(\bar{x}-\mu)^2 の期待値は n \cdot \text{Var}(\bar{x}) = n \cdot \frac{\sigma^2}{n} = \sigma^2 です。
E\!\left[\sum(x_i-\bar{x})^2\right] = n\sigma^2 - \sigma^2 = (n-1)\sigma^2
よって
E[s_n^2] = \frac{1}{n}(n-1)\sigma^2 = \frac{n-1}{n}\sigma^2
これがバイアスの正体です。n-1 で割れば
E\!\left[\frac{1}{n-1}\sum(x_i-\bar{x})^2\right] = \sigma^2
となり、期待値が母分散に一致する 不偏推定量 が得られます。この n-1 で割った量を 不偏分散 と呼び、s^2 と書きます。また、この補正を考案者の名前からベッセルの補正(Bessel's correction)と呼びます。
自由度の視点——n-1 個しか「動けない」
もう一つ、自由度という観点からも同じ結論に到達できます。
n 個のデータ点 x_1, \ldots, x_n を自由に選んだとします。しかし「\bar{x} を計算して使う」と決めた瞬間に、次の制約が一つ発生します。
\sum_{i=1}^{n}(x_i - \bar{x}) = 0
x_1, \ldots, x_{n-1} を好きな値にしたとき、x_n は上の等式を満たすよう自動的に決まります。独立に動かせるデータは n-1 個 だけです。この「独立に動かせる個数」を自由度(degrees of freedom)と呼びます。
分散は散らばりの大きさを自由度で規格化したもの、と考えると、n ではなく n-1 で割るのが自然な帰結になります。
まとめ
- n で割る標本分散 s_n^2 は母分散 \sigma^2 の (n-1)/n 倍しか推定できない(バイアスあり)。
- バイアスの原因は「\bar{x} が x_i の方向に引き寄せられるため、(x_i - \bar{x})^2 が (x_i - \mu)^2 より小さくなる」こと。
- 数学的には E[s_n^2] = \frac{n-1}{n}\sigma^2 が証明でき、n-1 で割ると期待値が \sigma^2 に一致する(不偏推定量)。
- 自由度の観点では、\bar{x} という制約を 1 つ使うと動かせるデータは n-1 個になるため、n-1 で割るのが理にかなっています。
Python / NumPy での注意点
NumPy の np.var() と np.std() はデフォルトで n 除算(偏り有り)を使います。推定目的で使う場合は ddof=1 を指定して不偏分散にします。
import numpy as np
x = np.array([2.0, 5.0, 8.0, 4.0, 6.0])
# 標本分散(n で割る — 偏りあり)
print(np.var(x)) # ddof=0 がデフォルト
# 不偏分散(n-1 で割る — 偏りなし)
print(np.var(x, ddof=1)) # ddof = "Delta Degrees of Freedom"
pandas の DataFrame.var() は逆に ddof=1 がデフォルトです。どちらを使っているかをドキュメントで必ず確認してください。機械学習の前処理では sklearn.preprocessing.StandardScaler が内部で ddof=0 を使っているため、厳密な不偏推定が必要な場面では注意が必要です。