【pythonデータ前処理】複数カラムで外れ値が存在する行を削除したい

データの前処理に際して、外れ値の処理があります。

Kaggleのカーネルを読んでいて、勉強になった外れ値処理の方法がありましたので、ここにメモしておこうと思います。

▼こちらのカーネルを参照

https://www.kaggle.com/yassineghouzam/titanic-top-4-with-ensemble-modeling

 

やりたいこと

 

複数の特徴量において、外れ値を検出し、値が外れ値であるカラムが複数存在する行を削除したい。

例題)

・こんなサンプルデータがある

・特徴量A,B,Cにおいてそれぞれ1000が外れ値

・値が1000(外れ値)であるカラムが2つ以上存在している行=11行目と特定

・11行目を削除

 

方針・考え方

 

・第三四分位数と第一四分位数の差の1.5倍上下した範囲外を外れ値とみなす

・Tukeys methodとかいうらしい

 

実装

まずは例題のサンプルデータを作成します。

 

外れ値の考え方としては、第三四分位数(Q3)と第一四分位数(Q1)の差の定数倍をQ1,Q3にプラスマイナスした範囲の外にある値、とします。

例えば特徴量Aに関しての外れ値は以下のように求めます。

外れ値Xの範囲は

X < Q1 – (Q3 – Q1) * 1.5  ,  X > Q3 + (Q3 – Q1) * 1.5

となります。

特徴量Aの場合は

X < -4 , X > 16 の範囲が外れ値となり、1000のみが該当します。

最後にAが外れ値である行を取得しています。

 

では、次にこれをすべての特徴量でおこない、値が外れ値であるカラムが複数存在する行を発見する処理を書きます。

detect_outlier関数で、値が外れ値である特徴量がn個以上ある行を取得します。

最後にもとのdfからdrop_rowsを落とせば完了です。

 

おわり

特に線形回帰等においては外れ値の処理はとても効果が大きいようです。

どこから外れ値とみなすか、という点は難しいですが、一つの考え方として参考になりました。

 

最後まで読んでいただきありがとうございました。