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

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

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

分散(Variance)とは何か?

「データのばらつき」を数値で表したもの。

例えば、2つのクラスのテスト結果を考える:

  • クラスA: 60, 61, 60, 59, 60(全員ほぼ同じ)
  • クラスB: 20, 40, 60, 80, 100(バラバラ)

どちらも 平均は60点。でも「ばらつき」は全然違う。これを数値化したのが分散。

計算方法:

  1. 平均を求める
  2. 各データから平均を引く(=「ズレ」= 偏差)
  3. 偏差を2乗する(マイナスを消すため)
  4. 2乗した偏差を全部足して、データ数で割る

クラスAの分散 ≈ 0.4(ほとんどばらついていない)

クラスBの分散 = 800(すごくばらついている)

標準偏差(Standard Deviation)とは?

分散の「平方根」。分散は単位が「点²」になってしまうので、

元の単位(「点」)に戻すために√(ルート)をとる。

クラスBの場合: √800 ≈ 28.3点

→「平均60点から±28点くらいのばらつきがある」と解釈できる

外れ値(Outlier)とは?

他のデータから大きく離れた異常値。

例: テスト結果が 60, 62, 58, 61, 200 → 200点は明らかにおかしい

IQR法(四分位範囲)による外れ値検出:

  • Q1 = 下位25%のデータ値
  • Q3 = 上位75%のデータ値
  • IQR = Q3 - Q1(真ん中50%のデータ幅)
  • 外れ値判定: Q1 - 1.5×IQR より小さい、または Q3 + 1.5×IQR より大きい値

📝 問題

以下の設問に答えよ。

問1(概念理解)

次の2つのデータセットについて答えよ:

データA: [100, 100, 100, 100, 100]
データB: [50, 75, 100, 125, 150]

(1) データAとデータBの平均をそれぞれ求めよ

(2) データAの分散を求めよ(計算過程を書くこと)

(3) データBの分散を求めよ(計算過程を書くこと)

(4) 「分散が大きい = ○○が大きい」の○○を埋めよ


問2(外れ値判定)

あるECサイトの1日あたりの購買金額データがある:

purchases = [500, 800, 750, 900, 600, 700, 850, 750, 680, 50000]

IQR法を使って、このデータに外れ値が含まれているかを確認したい。

(1) Q1(第1四分位数)を求めよ

(2) Q3(第3四分位数)を求めよ

(3) IQR を求めよ

(4) 外れ値の判定基準(上限・下限)を求めよ

(5) 外れ値となるデータ値を答えよ


問3(実践的解釈)

機械学習モデルを作る前に外れ値を確認することが重要です。

なぜ外れ値がモデルの精度に悪影響を与えるのか、以下のキーワードを使って説明せよ:

キーワード: 「平均」「モデルが引っ張られる」「予測精度」


🔍 ヒント(段階的開示)

ヒント1(方向性)

問1の分散計算: 各データから平均を引いた値を「偏差」と呼ぶ。

それぞれの偏差を2乗して、全部足して、データ数で割ると分散になる。

ヒント2(アプローチ)

問2のIQR法:

  • numpy の np.percentile(data, 25) で Q1 が求まる
  • np.percentile(data, 75) で Q3 が求まる
  • 外れ値の下限 = Q1 - 1.5 × IQR
  • 外れ値の上限 = Q3 + 1.5 × IQR
ヒント3(計算骨格)
import numpy as np

# 問2
purchases = [500, 800, 750, 900, 600, 700, 850, 750, 680, 50000]
Q1 = np.percentile(purchases, 25)
Q3 = np.percentile(purchases, 75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
outliers = [x for x in purchases if x < lower or x > upper]

模範解答

問1

(1) 平均:

  • データA: (100+100+100+100+100) / 5 = 100
  • データB: (50+75+100+125+150) / 5 = 500 / 5 = 100

(2) データAの分散:

偏差: [100-100, 100-100, 100-100, 100-100, 100-100] = [0, 0, 0, 0, 0]

偏差の2乗: [0, 0, 0, 0, 0]

分散 = (0+0+0+0+0) / 5 = 0

(3) データBの分散:

偏差: [50-100, 75-100, 100-100, 125-100, 150-100] = [-50, -25, 0, 25, 50]

偏差の2乗: [2500, 625, 0, 625, 2500]

分散 = (2500+625+0+625+2500) / 5 = 6250 / 5 = 1250

(4) 分散が大きい = ばらつき(散らばり) が大きい


問2

import numpy as np

purchases = [500, 800, 750, 900, 600, 700, 850, 750, 680, 50000]

Q1 = np.percentile(purchases, 25)   # 662.5
Q3 = np.percentile(purchases, 75)   # 837.5
IQR = Q3 - Q1                        # 175.0

lower_bound = Q1 - 1.5 * IQR         # 662.5 - 262.5 = 400.0
upper_bound = Q3 + 1.5 * IQR         # 837.5 + 262.5 = 1100.0

outliers = [x for x in purchases if x < lower_bound or x > upper_bound]
# → [50000]

print(f"Q1: {Q1}")           # 662.5
print(f"Q3: {Q3}")           # 837.5
print(f"IQR: {IQR}")         # 175.0
print(f"下限: {lower_bound}") # 400.0
print(f"上限: {upper_bound}") # 1100.0
print(f"外れ値: {outliers}") # [50000]

(1) Q1 = 662.5

(2) Q3 = 837.5

(3) IQR = 175.0

(4) 下限: 400.0 / 上限: 1100.0

(5) 外れ値: 50000(おそらくデータ入力ミスまたは異常な注文)


問3(模範回答例)

外れ値(例: 50,000円の購入)が1件あるだけで、平均 が大きく引き上げられる。

線形回帰などの機械学習モデルは「全データの誤差を最小化」しようとするため、

外れ値に対応しようと モデルが引っ張られ 、通常のデータへの当てはまりが悪化する。

結果として、一般的なユーザーの購買行動を予測する 予測精度 が下がってしまう。


🪜 Step-by-Step 解説

1
分散の計算構造を理解する

「偏差の2乗の平均」が分散。

なぜ2乗するか → マイナスとプラスの偏差が打ち消し合うのを防ぐため。

(-50 + 50 = 0 になってしまうが、2500 + 2500 = 5000 となって「ばらつき」が残る)

2
IQR法の意味を理解する

全データを小さい順に並べたとき、真ん中50%のデータの「幅」がIQR。

「真ん中の幅の1.5倍以上離れたデータは外れ値」という経験則。

Kaggleのデータ前処理でこの方法はよく使われる。

3
np.percentile の使い方

np.percentile(data, 25) = データを小さい順に並べたとき下から25%の位置の値。

np.percentile(data, 75) = 上から25%の位置の値(=下から75%の位置)。


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

分散の公式をシンプルに表現すると:

分散 = 「各データと平均のズレ²」の平均

標準偏差との関係:

標準偏差 = √分散

データBの場合: √1250 ≈ 35.4

→「データBの値は平均100から±35点くらいばらついている」と言える

IQR法の1.5という数字の由来:

正規分布(釣り鐘型の分布)に従うデータでは、

1.5×IQR 以外に出る確率は約0.7%。

「滅多に出ない = 外れ値」として扱うのが慣習。


🏆 Kaggleでの実践的な使い方

  1. EDA(探索的データ分析)の必須ステップ: コンペ開始直後に外れ値を確認
  2. Target変数の外れ値: 家の価格予測などで $100M の家があると予測が狂う → 対数変換や除外が有効
  3. 特徴量エンジニアリング: 外れ値をフラグ変数として追加(is_outlier = 1/0)する手法も有用

⚠️ よくある誤解・ミス

誤解・ミスなぜ起こるか正しい理解
「外れ値は必ず削除すべき」異常値=ゴミと思い込む外れ値が重要な情報の場合もある(不正検知など)
分散と標準偏差を混同する両方「ばらつき」を表す単位が異なる。標準偏差は元データと同じ単位
平均だけ確認してばらつきを無視する初心者が最初にやりがちなミス平均±標準偏差で全体像を把握する

🚀 次のステップ

  • 発展: Z スコアによる外れ値検出((x - 平均) / 標準偏差 > 3 を外れ値とする方法)
  • 次回予告: 分散・標準偏差・外れ値 — コーディング応用(pandasで実データに適用)

🎯 自己評価

自分の回答

気づき・メモ