データの前処理に際して、外れ値の処理があります。
Kaggleのカーネルを読んでいて、勉強になった外れ値処理の方法がありましたので、ここにメモしておこうと思います。
▼こちらのカーネルを参照
https://www.kaggle.com/yassineghouzam/titanic-top-4-with-ensemble-modeling
やりたいこと
例題)

・こんなサンプルデータがある
・特徴量A,B,Cにおいてそれぞれ1000が外れ値
・値が1000(外れ値)であるカラムが2つ以上存在している行=11行目と特定
・11行目を削除
方針・考え方
・第三四分位数と第一四分位数の差の1.5倍上下した範囲外を外れ値とみなす
・Tukeys methodとかいうらしい
実装
まずは例題のサンプルデータを作成します。
1 2 3 4 5 6 7 8 9 10 |
import pandas as pd import numpy as np #サンプルデータの作成 A = [1,2,3,4,5,6,7,8,9,10,1000] B = [10,9,8,7,6,5,4,3,2,1,1000] C = [1000,1,2,3,4,5,6,7,8,9,10] ID = list((range(100,111))) df = pd.DataFrame({"ID":ID,"A":A,"B":B,"C":C}) |
外れ値の考え方としては、第三四分位数(Q3)と第一四分位数(Q1)の差の定数倍をQ1,Q3にプラスマイナスした範囲の外にある値、とします。
例えば特徴量Aに関しての外れ値は以下のように求めます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Q1 = np.percentile(df["A"],25) Q3 = np.percentile(df["A"],75) IQR = Q3-Q1 outlier_step = 1.5*IQR outlier_A = df[(df["A"] < Q1-outlier_step) | (df["A"] > Q3+outlier_step)] print("Q1 : " + str(Q1)) print("Q3 : " + str(Q3)) print("IQR : " + str(IQR)) print("outlier_step : " + str(outlier_step)) print(outlier) ''' Q1 : 3.5 Q3 : 8.5 IQR : 5.0 outlier_step : 7.5 ''' |
外れ値Xの範囲は
X < Q1 – (Q3 – Q1) * 1.5 , X > Q3 + (Q3 – Q1) * 1.5
となります。
特徴量Aの場合は
X < -4 , X > 16 の範囲が外れ値となり、1000のみが該当します。
最後にAが外れ値である行を取得しています。
では、次にこれをすべての特徴量でおこない、値が外れ値であるカラムが複数存在する行を発見する処理を書きます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
import collections def detect_outlier(df,n,features): outlier_list = [] for col in features: Q1 = np.percentile(df[col],25) Q3 = np.percentile(df[col],75) IQR = Q3-Q1 outlier_step = 1.5*IQR #外れ値が存在する行インデックスの取得 outlier_list_col = df[(df[col] < Q1-outlier_step) | (df[col] > Q3+outlier_step)].index outlier_list.extend(outlier_list_col) #{外れ値が存在する行:出現回数}という辞書をつくる outlier_list = collections.Counter(outlier_list) multiple_outliers = list( k for k, v in outlier_list.items() if v >= n) return multiple_outliers drop_rows = detect_outlier(df,2,["A","B","C"]) print(drop_rows) ''' [10] ''' |
detect_outlier関数で、値が外れ値である特徴量がn個以上ある行を取得します。
最後にもとのdfからdrop_rowsを落とせば完了です。
おわり
特に線形回帰等においては外れ値の処理はとても効果が大きいようです。
どこから外れ値とみなすか、という点は難しいですが、一つの考え方として参考になりました。
最後まで読んでいただきありがとうございました。