Day 007 — 分散・標準偏差・外れ値(理論編)

2026-04-16 白 / Phase 1 理論 分散・標準偏差・外れ値

📚 背景知識(読んでから問題へ)

「ばらつき」を数値で表す

前回コードで計算した分散・標準偏差を、今日は なぜそう定義されているのか の視点で理解する。


分散(Variance)とは?

データが「平均からどれだけ離れているか」を数値化したもの。

データ: [2, 4, 4, 4, 5, 5, 7, 9]
平均: 5

各データの「ズレ」:
2-5 = -3
4-5 = -1
4-5 = -1
4-5 = -1
5-5 =  0
5-5 =  0
7-5 = +2
9-5 = +4

全部足すと 0 になる(プラスとマイナスが打ち消し合う)。

→ 解決策: ズレを2乗してから足す

(-3)² + (-1)² + (-1)² + (-1)² + 0² + 0² + 2² + 4²
= 9 + 1 + 1 + 1 + 0 + 0 + 4 + 16 = 32

分散 = 32 ÷ 8 = 4.0

標準偏差(Standard Deviation)とは?

分散は「2乗した単位」になっている(点数なら「点²」)。

元の単位に戻すために√(平方根)をとる のが標準偏差。

標準偏差 = √4.0 = 2.0

「データは平均から平均して±2.0ほどばらついている」と読める。

正規分布との関係

データが釣り鐘型(正規分布)に近い場合:

  • 平均 ± 1σ(標準偏差)の範囲に 約68% のデータが含まれる
  • 平均 ± 2σ の範囲に 約95% が含まれる
  • 平均 ± 3σ の範囲に 約99.7% が含まれる

3σから外れたデータ = 外れ値 として扱うことが多い(3σルール)

IQR法(外れ値検出のもう1つの方法)

IQR = Q3(75パーセンタイル)- Q1(25パーセンタイル)

下限 = Q1 - 1.5 × IQR
上限 = Q3 + 1.5 × IQR

この範囲を超えたデータ = 外れ値

3σルールより正規分布を仮定しないため、Kaggleではこちらがよく使われる。


📝 問題

以下の4つの問題に答えてください(コードではなく「言葉・概念」で答える問題です)。


Q1. データ A と データ B がある。

データA: [10, 10, 10, 10, 10]
データB: [5, 8, 10, 12, 15]

2つの平均は同じ(10)です。

分散・標準偏差はどちらが大きい? またその理由を1文で説明してください。


Q2. 「分散は標準偏差の2乗である」← この文は正しい?間違い?

理由も答えてください。


Q3. 30人の生徒のテストスコアがあり、平均=70点、標準偏差=10点とする。

3σルールを使うと、「外れ値の疑いがある」のはどの範囲のスコアか?


Q4. 以下のどちらの方法が「外れ値検出」に適しているか理由とともに答えてください。

  • 方法X: 3σルール(平均 ± 3標準偏差)
  • 方法Y: IQR法(Q1 - 1.5×IQR 〜 Q3 + 1.5×IQR)

判断の根拠: データが右に大きく偏った(歪んだ)分布(例: 収入データ)の場合。


🔍 ヒント(段階的開示)

ヒント1(方向性)

Q1は「ばらつきの大きさ」を考える。全員が同じ値 vs バラバラな値。

Q2は「標準偏差と分散の定義の順序」を思い出す。

Q3は「平均 ± 3σ」に70と10を代入するだけ。

Q4は「3σルールが前提とすること」を考える。

ヒント2(アプローチ)
  • Q1: データAは全員が平均から「ズレ0」。データBは平均から離れたデータがある。
  • Q2: 分散 = 標準偏差² が正しいのか、標準偏差 = 分散² が正しいのかを考える。
  • Q3: 70 - 3×10 = ? / 70 + 3×10 = ?
  • Q4: 3σルールは「正規分布(釣り鐘型)」を前提とする。歪んだデータには何が起きるか?
ヒント3(ほぼ答えに近い誘導)
  • Q1: データAの分散は0(全員同じ値)、データBの分散は > 0。
  • Q2: 「標準偏差 = √分散」なので「分散 = 標準偏差²」→ 問題文の言い方は正しい。
  • Q3: 40点未満 or 100点超が外れ値の疑い。
  • Q4: 歪んだ分布では3σルールが「外れ値でないものを外れ値と判定」しやすい → IQR法が適切。

模範解答

Q1.

データBの方が分散・標準偏差が大きい。

理由: データAは全員が平均10と同じ値なので「ズレ」が0、つまりばらつきが全くない(分散=0)。データBは5〜15まで散らばっているため、ズレの2乗和が大きくなる。

Q2.

正しい。

定義: 標準偏差 = √分散 → 両辺を2乗すると 分散 = 標準偏差²

Q3.

外れ値の疑いがある範囲: 40点未満 または 100点超

  • 下限: 70 - 3×10 = 40
  • 上限: 70 + 3×10 = 100

Q4.

方法Y(IQR法)が適切。

理由: 3σルールは正規分布(左右対称の釣り鐘型)を前提としている。収入データのような右歪みの分布では「平均が右に引っ張られる」ため、3σルールを使うと正常なデータを外れ値と誤判定しやすい。IQR法は中央50%のデータ(Q1〜Q3)を基準にするため、分布の形状に依存しない。


🪜 Step-by-Step 解説

1
分散が0になるケースを理解する
import numpy as np
A = [10, 10, 10, 10, 10]
B = [5, 8, 10, 12, 15]
print(np.var(A))  # → 0.0
print(np.var(B))  # → 10.0
print(np.std(B))  # → 3.16...

「ばらつきゼロ」は分散=0で完璧に表現できる。

2
標準偏差と分散の変換を確認する
std_B = np.std(B)       # 3.162...
var_B = np.var(B)       # 10.0
print(std_B ** 2)       # → 10.0 (= var_B)  ✓
print(var_B ** 0.5)     # → 3.162... (= std_B) ✓
3
3σルールを適用する
mean = 70
std = 10
lower = mean - 3 * std  # 40
upper = mean + 3 * std  # 100
print(f"外れ値候補: {lower}点未満 または {upper}点超")
4
IQR法が頑健な理由
import numpy as np
# 右歪みの収入データ(万円)
income = [200, 250, 300, 320, 350, 400, 450, 500, 600, 5000]  # 5000は外れ値

# 3σルール
mean = np.mean(income)   # 837万円(外れ値に引っ張られる)
std = np.std(income)
print(f"3σ上限: {mean + 3*std:.0f}万円")   # 非常に大きな値になる

# IQR法
q1 = np.percentile(income, 25)   # 306.25
q3 = np.percentile(income, 75)   # 487.5
iqr = q3 - q1
lower = q1 - 1.5 * iqr           # 31.25
upper = q3 + 1.5 * iqr           # 762.5
print(f"IQR上限: {upper:.1f}万円")  # 5000は外れ値として検出

📐 数学・統計の補足(文系向け)

なぜ「2乗」してから「√」するの?

これは「符号を消してから元に戻す」という操作。

  • 絶対値(||)を使う方法もあるが、絶対値は微分できないためMLでは都合が悪い
  • 2乗なら微分できる → アルゴリズムで計算しやすい
  • という理由で「2乗して√」が標準になった

σ(シグマ)って何?

σ = sigma(ギリシャ文字)= 標準偏差の記号。

「1σ = 標準偏差1個分の距離」という意味で使う。

「3σ外れ」=「平均から標準偏差3個分以上離れている」。


🏆 Kaggleでの実践的な使い方

import pandas as pd
import numpy as np

df = pd.read_csv('train.csv')

# 数値カラムの外れ値をIQR法で検出
def detect_outliers_iqr(series):
    q1 = series.quantile(0.25)
    q3 = series.quantile(0.75)
    iqr = q3 - q1
    lower = q1 - 1.5 * iqr
    upper = q3 + 1.5 * iqr
    return series[(series < lower) | (series > upper)]

# SalePrice列の外れ値を確認(House Pricesコンペ)
outliers = detect_outliers_iqr(df['SalePrice'])
print(f"外れ値の件数: {len(outliers)}")
print(outliers)

Kaggleでの判断基準:

  1. 外れ値を削除すべきか残すべきかはドメイン知識で判断
  2. テストデータにも外れ値がある場合は削除せず、変換(log変換など)で対処することが多い
  3. EDAで外れ値のパターンを可視化してから判断するのが鉄則

⚠️ よくある誤解・ミス

誤解・ミスなぜ起こるか正しい理解
「外れ値は必ず削除する」外れ値=ノイズと思い込むテストデータにも外れ値があればモデルに含める必要がある
標準偏差と分散を混同どちらも「ばらつき」の指標分散=標準偏差²。単位が元データと同じなのは標準偏差
3σルールを全データに適用簡単だから歪んだ分布にはIQR法を使う
分散が小さい=良いデータ直感ケース次第。特徴量の分散が小さすぎると予測に使えない(低分散フィルタリング)

🚀 次のステップ

  • 発展: log変換で外れ値の影響を減らす方法(House PricesのSalePriceで実践)
  • 次回予告: 確率の基礎(確率とは何か / 同様に確からしい)へ進む(テーマ3)

🎯 自己評価

自分の回答

気づき・メモ