Menu
CoddyTech

外れ値の扱い方

CoddyのMachine Learningジャーニー「機械学習のための統計」セクションの一部。レッスン 27/64。

10戸のアパートではそれぞれ約10 m³の水を使用していましたが、漏水により1戸の使用量が64になりました。これを除外するか、最も近いフェンスの値で上限を設定できます。

3行で示した10戸のアパートの水使用量。維持:10付近の9個の点と64の漏水値、平均15.2。除外:漏水値を削除、平均9.8。上限設定:漏水値を14のフェンスまで引き下げ、平均10.2

np.clip(a, low, high) は配列全体の値を上限・下限で制限します:

water = np.array([8, 11, 9, 10, 12, 9, 64, 10, 11, 8])
low, high = 6.0, 14.0  # IQRの外れ値判定の境界値
dropped = water[(water >= low) & (water <= high)]
capped = np.clip(water, low, high)
print(len(dropped), len(capped))
print(capped)

これは次のように出力されます:

9 10
[ 8. 11.  9. 10. 12.  9. 14. 10. 11.  8.]

モデルはその外れ値に引きずられるため、学習前に判断しましょう。誤植は修正するか削除し、実際の極端な値は残すか上限を設定します。黙って削除してはいけません。いくつ変更したかを伝えましょう。

challenge icon

チャレンジ

中級

サイクリングアプリには、15回の走行の平均速度がspeedsに記録されており、そのうち2つは不自然に見えます。開始コードでは、IQRの境界値がlowとhighに格納されています。

  1. 境界値の範囲内(両端を含む)の速度を使ってdroppedとcappedを作成します。
  2. keep、drop、capそれぞれについて、走行回数、平均値、2桁の小数に丸めた.std()を1行ずつ出力します。
  3. 上限処理によって変更された走行回数を出力します。

別のライダーの10回の走行について:

Keep: 10 rides, mean 21.38, std 6.58
Drop: 9 rides, mean 19.2, std 0.77
Cap: 10 rides, mean 19.45, std 1.04
Capping changed 1 of 10 rides

自分で試してみよう

import numpy as np


# 配列のIQRの下限と上限のフェンスを返す
def iqr_fences(a):
    q1 = np.percentile(a, 25)
    q3 = np.percentile(a, 75)
    iqr = q3 - q1
    return q1 - 1.5 * iqr, q3 + 1.5 * iqr


speeds = np.array([24.5, 22.8, 26.1, 23.9, 3.1, 25.4, 21.7, 24.2, 27.3, 78.4, 23.1, 25.8, 22.4, 24.9, 26.6])
low, high = iqr_fences(speeds)

# 以下にコードを記述してください
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

機械学習のための統計のすべてのレッスン

自分で練習してみよう: Pythonオンラインコンパイラ