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^2n(\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個のデータのうち標本平均の制約を使うと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 を使っているため、厳密な不偏推定が必要な場面では注意が必要です。