📚 背景知識(読んでから問題へ)
分散(Variance)とは何か?
「データのばらつき」を数値で表したもの。
例えば、2つのクラスのテスト結果を考える:
- クラスA: 60, 61, 60, 59, 60(全員ほぼ同じ)
- クラスB: 20, 40, 60, 80, 100(バラバラ)
どちらも 平均は60点。でも「ばらつき」は全然違う。これを数値化したのが分散。
計算方法:
- 平均を求める
- 各データから平均を引く(=「ズレ」= 偏差)
- 偏差を2乗する(マイナスを消すため)
- 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 解説
「偏差の2乗の平均」が分散。
なぜ2乗するか → マイナスとプラスの偏差が打ち消し合うのを防ぐため。
(-50 + 50 = 0 になってしまうが、2500 + 2500 = 5000 となって「ばらつき」が残る)
全データを小さい順に並べたとき、真ん中50%のデータの「幅」がIQR。
「真ん中の幅の1.5倍以上離れたデータは外れ値」という経験則。
Kaggleのデータ前処理でこの方法はよく使われる。
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での実践的な使い方
- EDA(探索的データ分析)の必須ステップ: コンペ開始直後に外れ値を確認
- Target変数の外れ値: 家の価格予測などで $100M の家があると予測が狂う → 対数変換や除外が有効
- 特徴量エンジニアリング: 外れ値をフラグ変数として追加(
is_outlier= 1/0)する手法も有用
⚠️ よくある誤解・ミス
| 誤解・ミス | なぜ起こるか | 正しい理解 |
|---|---|---|
| 「外れ値は必ず削除すべき」 | 異常値=ゴミと思い込む | 外れ値が重要な情報の場合もある(不正検知など) |
| 分散と標準偏差を混同する | 両方「ばらつき」を表す | 単位が異なる。標準偏差は元データと同じ単位 |
| 平均だけ確認してばらつきを無視する | 初心者が最初にやりがちなミス | 平均±標準偏差で全体像を把握する |
🚀 次のステップ
- 発展: Z スコアによる外れ値検出(
(x - 平均) / 標準偏差> 3 を外れ値とする方法) - 次回予告: 分散・標準偏差・外れ値 — コーディング応用(pandasで実データに適用)