分散(variance)は、データの散らばり具合を「平均 からの差の二乗の平均」として定量化する指標である。代表値が「分布の中心」を表すなら、分散は「分布の広がり」を表す代表的な量となる。中心と広がりがあれば、分布の最も基本的な姿(正規分布なら完全に決まる)が記述できる。

  • 母分散: sigma2 = E[(X - mu)^2]
  • 標本分散: s2 = sum((xi - x_bar)^2) / (n - 1)

ここで mux_bar平均 を表す。X は確率変数、E[ ] は期待値。標本分散の分母が n - 1 になっているのは「不偏推定量にするため」で、標本平均自体を 1 つ計算に使った分の自由度を引いている(不偏推定の話は後述)。

なぜ二乗するのか

分散の定義に「二乗」が入っているのは、単に大きい値が欲しいからではなく、複数の数学的な要請が同時に効いているためである。

  • 符号の打ち消しを避ける: 平均からの差 xi - mu をそのまま足し合わせると、正と負が打ち消し合って常にゼロになる。絶対値 |xi - mu| を使う手もあるが(これは平均絶対偏差、MAD)、絶対値は微分不可能で数学的扱いが面倒
  • 大きな逸脱を強調する: 二乗するので、平均から大きく離れた値ほど寄与が増える。差 2 → 4 倍の寄与差 10 → 100 倍の寄与。これにより「分布の裾の重さ」が分散に反映される
  • L2 損失と直接対応する: 分散は最小二乗推定の損失関数と同じ形をしている。線形回帰や PCA などの主要な手法が「分散を最小化・最大化する」枠組みで定式化できるのはこのため
  • 加法性が成り立つ: 独立な確率変数 XY について Var(X + Y) = Var(X) + Var(Y) が成り立つ。これは絶対値ベースの散らばり指標では成り立たない便利な性質

絶対値ベースの代替(平均絶対偏差、四分位範囲)は外れ値に強いが、数学的扱いやすさを犠牲にする。「外れ値に弱いが扱いやすい分散」と「外れ値に強いが扱いにくい絶対値系」というトレードオフがある、と理解しておくと判断軸が立ちやすい。

前提・注意

  • データは数値であることが前提
  • 外れ値の影響を強く受ける
  • 単位が二乗になる(元の単位のまま比較できないので、直感的な大きさは標準偏差で見る)

利点

  • ばらつきを定量的に測れる
  • 数学的に扱いやすい(加法性がある)
  • 標準偏差など他の指標の基盤になる

欠点

  • 外れ値に弱い
  • 単位が直感的でない

Python での実例

以下は、平均(算術平均)が同じで分散が異なる分布を比較する例。

import numpy as np
import matplotlib.pyplot as plt

rng = np.random.default_rng(0)
values1 = rng.normal(loc=0.0, scale=1.0, size=500)
values2 = rng.normal(loc=0.0, scale=3.0, size=500)

plt.figure(figsize=(6, 4))
plt.hist(values1, bins=30, color="#59a14f", alpha=0.55, edgecolor="white", label="sigma=1")
plt.hist(values2, bins=30, color="#e15759", alpha=0.45, edgecolor="white", label="sigma=3")
plt.title("Variance comparison")
plt.xlabel("Value")
plt.ylabel("Count")
plt.legend()
plt.tight_layout()
plt.show()

出力:

variance_hist

分散分解を可視化する

「全体の分散 = 群内分散の平均 + 群間平均の分散」を、3 群の合成データで確認する。

groups = ["A", "B", "C"]
group_means = [3.0, 6.0, 9.0]
data_by_group = {g: rng.normal(m, 1.0, 80) for g, m in zip(groups, group_means)}
all_data = np.concatenate(list(data_by_group.values()))

total = all_data.var()
within = np.mean([v.var() for v in data_by_group.values()])
between = np.mean([(m - all_data.mean()) ** 2 for m in group_means])
print(f"total = {total:.2f}, within = {within:.2f}, between = {between:.2f}")
plt.savefig("variance_decomposition.svg", bbox_inches="tight")

出力:

total = 7.05, within = 1.00, between = 6.00

群内分散と群間分散の和が全体分散にほぼ一致する

左の図は 3 群(A, B, C)の生データで、各群の中での散らばり(群内分散, 平均 ≈ 1.0)と、群の平均値同士の散らばり(群間分散 ≈ 6.0)の 2 つに分けて見える。右の棒グラフはその数値で、全体分散 7.05 ≈ 群内 1.00 + 群間 6.00 と分解されている。

ANOVA(分散分析)はこの分解を使って「群間分散が群内分散より十分大きいか」を検定するもので、決定木の分割基準(回帰木の MSE 減少)も同じ発想で動いている。「特徴量で分割したら、分割後の群内分散の和が分割前より小さくなるか」を測れば、良い分割かどうかが判定できる、というのが核心となる。

平均化が分散を縮める(バギングの原理)

加法性 Var(X + Y) = Var(X) + Var(Y)(独立時)から派生する重要な結果として、n 個の独立な予測値を平均すると分散が 1/n に縮む、という性質がある。

Var((X_1 + X_2 + ... + X_n) / n) = (1/n^2) × n × Var(X_i) = Var(X_i) / n

これがランダムフォレストやバギング(bagging, bootstrap aggregating)の理論的根拠となる。

rng = np.random.default_rng(1)
n_trials = 5000
for n in [1, 4, 16, 64, 256]:
    samples = rng.normal(0.0, 1.0, (n_trials, n)).mean(axis=1)
    print(f"n={n:3d}: var = {samples.var():.4f}")
plt.savefig("variance_averaging.svg", bbox_inches="tight")

出力:

n=  1: var = 0.9956
n=  4: var = 0.2447
n= 16: var = 0.0608
n= 64: var = 0.0149
n=256: var = 0.0038

n を増やすほど平均推定の分散が 1/n の速さで縮む

ヒストグラムが n を 1, 4, 16, 64, 256 と増やしたときの「平均値の分布」で、n が増えるほど真の値(0)の周りに鋭く集中していく。分散は 1/n の速さで縮むので、64 個の平均で分散は 1/64 ≈ 0.016 まで小さくなっている。バギングが「個別モデルの分散を抑える」効果を持つのは、この原理が背景にある。前提となる「独立性」が崩れる(個別モデルが似た予測をする)と効果が薄れる点が実装上の落とし穴で、ランダムフォレストが特徴量サンプリングで相関を下げているのも同じ理由となる。


分散の分解と加法性

分散には数学的に重要な性質がいくつかあり、応用統計の多くがこれらに支えられている。

1. 分散分解(全体分散 = 群内分散 + 群間分散)

データを複数のグループ(クラスや特徴量の値ごと)に分けたとき、全体の分散は次のように分解できる。

Var(全体) = E[Var(X|Group)] + Var(E[X|Group])
         ↑                  ↑
         群内分散の平均     群間平均の分散

これは ANOVA(分散分析)の核心であり、機械学習では「特徴量がどれだけ目的変数のばらつきを説明するか」を評価する基盤となる。決定木の分割評価(不純度の減少)も同じ発想を使っている。

2. 加法性(独立変数の和の分散)

独立な確率変数 XY について、

Var(X + Y) = Var(X) + Var(Y)
Var(aX + b) = a^2 * Var(X)

線形結合の分散がこのように単純に計算できるのは、分散が「二乗ベース」であるおかげである。中心極限定理(標本平均の分布が正規分布に近づく)の証明にもこの加法性が使われている。

共分散への橋渡し

分散は 1 変数の散らばりを表すが、2 変数の関係を見る場合は 共分散(covariance) に拡張される。

Cov(X, Y) = E[(X - mu_x)(Y - mu_y)]

Cov(X, X) = Var(X) なので、共分散は分散の 2 変数版と見ることができる。さらに、共分散を両者の標準偏差 で割って正規化したものが 相関係数 となる。分散 → 共分散 → 相関係数 という階段は、統計学の基礎構造を成している。

数学での使いどころ

数学・統計では分散は以下で使われる。

  • ばらつきの尺度(中心だけでなく広がりを見る)
  • 分散分解(ANOVA、決定木の分割評価、変動の説明力)
  • 共分散・相関係数 の土台
  • 不偏推定量・最尤推定の理論(推定量の分散で精度を測る)
  • 大数の法則・中心極限定理(標本平均の分散が sigma2 / n に縮む)

機械学習での使いどころ

機械学習では分散は前処理・学習アルゴリズム・評価のあらゆる場面で頻出する。

  • 特徴量のスケール確認: 分散が極端に大きい/小さい特徴量はモデルを歪めるので、事前に確認
  • 標準化: 分散 1 に揃える前処理。LogisticRegressionkNN など多くのモデルで必須
  • 低分散特徴量の除外: VarianceThreshold で「ほとんど動かない特徴量」を捨てる
  • PCA の主成分の重要度: 各主成分は元データを「分散が最大になる方向」へ射影したもの。主成分の固有値 = その軸上での分散
  • 決定木の分割評価(回帰木): 分割前後の分散減少量を「不純度の減少」として使う
  • バギング・RandomForest の効果: 独立な木の平均で予測の分散を 1/n に縮める
  • バイアス-バリアンストレードオフ: モデルの誤差を「バイアス² + 分散 + ノイズ」に分解する古典的枠組み。過学習 はモデルの分散が大きい状態
  • 推定値の信頼区間: 推定量の標準誤差は標準偏差で表すが、根拠は分散

具体的な利用例:

  • 特徴量選択の初手: VarianceThreshold(threshold=0.01) でほぼ定数の特徴量を捨てる
  • A/B テストの効果検定: 群間平均の差を群内分散で割って t 値を計算する
  • アンサンブル学習: 個別モデルの予測の分散を平均で抑える

適さないケース

  • 外れ値が多いデータ(ロバストな指標が必要)
  • 単位をそのまま解釈したい場合(標準偏差のほうが直感的)