Day 005 — 分散・標準偏差・外れ値

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

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

「バラツキ」を数値で表す

前回(記述統計入門)では「平均・中央値・最頻値」でデータを 1つの代表値 で要約しました。

でも同じ平均でも、実態は全然違うことがあります。

クラステスト点数平均
A組70, 72, 68, 71, 6970点
B組50, 90, 40, 100, 7070点

平均は同じ70点でも、A組は「みんな似た点数」、B組は「バラバラ」です。

この「バラツキ具合」を数値で表すのが 分散標準偏差 です。


分散(variance)

分散 = 各データと平均の差(偏差)を2乗して、平均した値

直感的には「データが平均からどのくらいズレているか」の大きさ。

A組の平均 = 70
A組の偏差: (70-70)², (72-70)², (68-70)², (71-70)², (69-70)²
         = 0, 4, 4, 1, 1
分散 = (0 + 4 + 4 + 1 + 1) ÷ 5 = 2.0
B組の平均 = 70
B組の偏差: (50-70)², (90-70)², (40-70)², (100-70)², (70-70)²
         = 400, 400, 900, 900, 0
分散 = (400 + 400 + 900 + 900 + 0) ÷ 5 = 520.0

→ A組(2.0) << B組(520.0)。B組の方がずっとバラついていることが数値で確認できます。

なぜ2乗するの?

偏差をそのまま足すと正と負が相殺されてゼロになってしまうため、2乗でまず正の値にします。

(例: -20 と +20 はどちらも「20点ズレている」という情報を持つ)


標準偏差(standard deviation)

標準偏差 = 分散の平方根(√分散)

分散は「点数²」という単位になってしまい、元のデータと比べにくいです。

√を取って元の単位(点数)に戻したのが標準偏差。

A組: 標準偏差 = √2.0 ≈ 1.41点
B組: 標準偏差 = √520.0 ≈ 22.8点

「A組は平均70点で、だいたい ±1.4点の範囲に収まっている」

「B組は平均70点で、だいたい ±22.8点バラついている」という読み方をします。


外れ値(outlier)

外れ値 = 他のデータと比べて極端に大きい/小さい値

一般的な目安: 平均 ± 3×標準偏差 の範囲から外れたものを外れ値と呼ぶことが多い。

前回のKaggle問題(購入金額15000円)はまさに外れ値でした。

外れ値があると:

  • 平均を大きく歪める(前回確認済み)
  • 標準偏差も大きく膨らむ(バラツキが実態より大きく見える)

📝 問題

以下の3つの設問に答えてください(コードなし・文章で回答)。

問1: 分散と標準偏差の使い分け

以下の2つの説明のうち、正しいものはどちらですか? また、なぜもう一方が誤りなのかも説明してください。

A: 分散は常に標準偏差より大きい値になる

B: 分散の単位と元データの単位は異なる。標準偏差は元データと同じ単位になる


問2: データを見ずに標準偏差を推定する

以下の2つのデータセットを見て、どちらの標準偏差が大きいか、計算なしで直感的に答えてください。

データ X: [10, 11, 10, 9, 10, 11, 9, 10]

データ Y: [1, 20, 5, 15, 2, 18, 3, 16]

理由も1文で説明してください。


問3: Kaggle実践

あなたはTitanicコンペで特徴量エンジニアリングを行っています。

Age(年齢)列の標準偏差が 14.5 でした。

以下の2人の乗客について、どちらが「年齢的に外れ値に近い」か答えてください。

  • 乗客A: 年齢 2歳(平均年齢: 29.7歳)
  • 乗客B: 年齢 60歳(平均年齢: 29.7歳)

「平均 ± 2×標準偏差」を外れ値の目安として計算してください。


🔍 ヒント(段階的開示)

ヒント1(方向性)

問1は「単位」がキーワードです。例えば「身長(cm)」のデータの分散は「cm²」になります。

問2は数字を眺めて「どちらが平均から遠いか」を直感的に判断してみましょう。

問3は「平均 ± 2×標準偏差」の範囲を実際に計算すると答えが出ます。

ヒント2(アプローチ)

問1: 分散と標準偏差の大小関係は常に成立するわけではない(分散が1未満のケースを考えてみましょう)。

問2: データXは全て10の近くに集中。データYは1から20まで広がっている。

問3: 外れ値の範囲を計算してみましょう。

下限 = 平均 - 2 × 標準偏差 = 29.7 - 2 × 14.5 = ?
上限 = 平均 + 2 × 標準偏差 = 29.7 + 2 × 14.5 = ?
ヒント3(解答の骨格)

問1: Bが正しい。Aが誤りな理由→ 分散が0.5の場合、標準偏差は√0.5 ≈ 0.71 > 0.5 になる。

問2: データY の方が大きい。理由: データXは全て9〜11に収まっているが、Yは1〜20と大きく散らばっているから。

問3: 下限 = 0.7、上限 = 58.7。乗客A(2歳)は範囲内、乗客B(60歳)は上限58.7を超えているため、Bの方が外れ値に近い。


模範解答

問1

正しいのはB

Bの説明: 「体重(kg)」の分散は「kg²」という単位になる。

標準偏差は√を取ることで元のデータと同じ「kg」単位に戻る。

これが「標準偏差の方が直感的に解釈しやすい」理由。

Aが誤りな理由: 分散が1未満のとき、標準偏差(√分散)の方が大きくなる。

  • 例: 分散 = 0.25 → 標準偏差 = √0.25 = 0.5 > 0.25

→「分散は常に標準偏差より大きい」は誤り。


問2

データYの方が標準偏差が大きい

理由: データXは全て9〜11に収まっており、平均(10)からのズレが最大1。

データYは1〜20と幅広く散らばっており、平均(約10)から大きくズレている値が多い。

検証(参考):

import numpy as np
X = [10, 11, 10, 9, 10, 11, 9, 10]
Y = [1, 20, 5, 15, 2, 18, 3, 16]
print(np.std(X))  # → 0.71
print(np.std(Y))  # → 7.19

問3

外れ値の目安(平均 ± 2×標準偏差)を計算:

下限 = 29.7 - 2 × 14.5 = 29.7 - 29.0 = 0.7 歳
上限 = 29.7 + 2 × 14.5 = 29.7 + 29.0 = 58.7 歳
  • 乗客A(2歳): 0.7 ≤ 2 ≤ 58.7 → 範囲内(外れ値ではない)
  • 乗客B(60歳): 60 > 58.7 → 範囲を超えている

乗客B(60歳) の方が外れ値に近い。


🪜 Step-by-Step 解説

1
問1の考え方(単位問題)

身長データ [160, 170, 165] cm で考えると:

  • 平均 = 165 cm
  • 偏差² = (160-165)²=25, (170-165)²=25, (165-165)²=0
  • 分散 = (25+25+0)/3 = 16.67 cm²(←cmの2乗!)
  • 標準偏差 = √16.67 ≈ 4.08 cm(←元の単位に戻る)

「身長の標準偏差が4cmです」は直感的に理解できるが、

「身長の分散が16.67cm²です」は直感的に理解しにくい。

2
問3の外れ値判定(± 2σ ルール)

σ(シグマ)は標準偏差の記号。「± 2σ」とはよく使われる外れ値の目安。

正規分布(釣り鐘型)に従うデータの場合:

  • ± 1σ の範囲: 全データの約68%が含まれる
  • ± 2σ の範囲: 全データの約95%が含まれる
  • ± 3σ の範囲: 全データの約99.7%が含まれる

つまり ± 2σ を超えるのは全体の約5%しかいない → 「外れ値候補」と判断する。


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

「2乗して√する」のはなぜ遠回りに見えるのか?

「絶対値を使えばいいじゃないか(|偏差| の平均)」という発想はもっともです。

これを「平均絶対偏差(MAD)」と言い、実際に使われることもあります。

でも2乗する方が主流な理由:

  1. 微分(変化の計算)がしやすい → 機械学習のモデル最適化と相性が良い
  2. 正規分布の数学的性質と綺麗に対応する

文系的には「2乗して√はセット操作、結果は元の単位に戻る」と覚えれば十分です。


🏆 Kaggleでの実践的な使い方

外れ値の自動検出(IQRルール)

Kaggleでは「± 2σ」より IQR(四分位範囲) を使った外れ値検出が安定しています:

import pandas as pd
import numpy as np

df = pd.read_csv("titanic.csv")
age = df["Age"].dropna()

Q1 = age.quantile(0.25)   # 下位25%の値
Q3 = age.quantile(0.75)   # 上位75%の値
IQR = Q3 - Q1             # 中央50%のデータ幅

lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR

outliers = age[(age < lower) | (age > upper)]
print(f"外れ値候補: {len(outliers)}件")

IQRルールは外れ値に強い(標準偏差自体が外れ値で歪むため)。

上位Kagglerのコードでもこのパターンが頻出。


⚠️ よくある誤解・ミス

誤解・ミスなぜ起こるか正しい理解
「標準偏差が大きい = 悪いデータ」バラツキ = ノイズのイメージバラツキが大きいことは情報量が多いともいえる。善悪ではなくデータの特性
np.std() の結果が教科書と違うnumpyは母標準偏差(÷n)がデフォルト標本標準偏差(÷n-1)は np.std(data, ddof=1)
「外れ値は除去すべき」と思い込む外れ値 = 異常値のイメージデータ入力ミスなら除去、本物の事象なら除去してはいけない。判断が必要
標準偏差でなく分散を使って比較「どちらでも同じ」と思う分散は単位が2乗で直感的でない。比較・報告には標準偏差を使う

🚀 次のステップ

  • 発展: ヒストグラムを描いて分布の形を確認し、「正規分布に近いか」を視覚的に判断する
  • 次回予告: テーマ3「確率の基礎(確率とは何か)」へ(3問連続理解で昇格)

🎯 自己評価

自分の回答

気づき・メモ