EnsekiTT Blog

EnsekiTTが書くブログです。

PythonのPandasで外れ値を四分位範囲を用いてクリップする話

こんにちは、えんせきです。
最近、リプトンのミルクティーをまた好きになって毎日のように飲んでいます。
高校時代にコンビニで買いまくってた記憶があるのですが変わらず安定して美味しいですよね。
え、あれ10年以上前!?

つまりなにしたの?

pandasのデータフレームから1シリーズ(列)を入力すると外れ値をクリップして返してくれる関数を用意した。
Irisのデータセットに外れ値を追加して実際に除去してみる例を紹介する。
f:id:ensekitt:20180214223451j:plain

どんな関数?

  • 入力: Pandas DataFrameのシリーズ(1列のみ)、バイアス(1.5がデフォルト)
  • 出力: 外れ値除去済のシリーズ
  • 処理: 四分位範囲を計算してそこからバイアス倍分外側の値をバイアス倍分までにクリップする

コード

def replace_outlier(series, bias=1.5):
    #四分位数
    q1 = series.quantile(.25)
    q3 = series.quantile(.75)
    iqr = q3 - q1

    #外れ値の基準点
    outlier_min = q1 - (iqr) * bias
    outlier_max = q3 + (iqr) * bias

    print("outlier_min :" + str(outlier_min) + ", outlier_max :" + str(outlier_max))

    #外れ値をクリップする
    series = series.clip(outlier_min, outlier_max)
    return series

動作の確認

>>>import pandas as pd
>>>from sklearn import datasets

>>>iris = datasets.load_iris()
>>>iris_df = pd.DataFrame(iris.data, columns=iris.feature_names)

# 外れ値を突っ込む
# sepal length (cm)に12センチとかの値を1つ突っ込む
>>>iris_df['sepal length (cm)'][iris_df.index==10] = 12.0
>>>iris_df.describe()

	sepal length (cm)	sepal width (cm)	petal length (cm)	petal width (cm)
count	150.000000	150.000000	150.000000	150.000000
mean	5.887333	3.054000	3.758667	1.198667
std	0.967894	0.433594	1.764420	0.763161
min	4.300000	2.000000	1.000000	0.100000
25%	5.100000	2.800000	1.600000	0.300000
50%	5.800000	3.000000	4.350000	1.300000
75%	6.400000	3.300000	5.100000	1.800000
max	12.000000	4.400000	6.900000	2.500000

>>>#ここでさっきの関数を適用している
>>>iris_df['sepal length (cm)'] = replace_outlier(iris_df['sepal length (cm)'])
outlier_min :3.1499999999999986, outlier_max :8.350000000000001

>>>iris_df.describe()
	sepal length (cm)	sepal width (cm)	petal length (cm)	petal width (cm)
count	150.000000	150.000000	150.000000	150.000000
mean	5.863000	3.054000	3.758667	1.198667
std	0.852148	0.433594	1.764420	0.763161
min	4.300000	2.000000	1.000000	0.100000
25%	5.100000	2.800000	1.600000	0.300000
50%	5.800000	3.000000	4.350000	1.300000
75%	6.400000	3.300000	5.100000	1.800000
max	8.350000	4.400000	6.900000	2.500000
>>> # ちゃんとsepal length (cm)の最大値がクロップされていることがわかる。
クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 4.0 国際 ライセンスの下に提供されています。