こんにちは、えんせきです。
最近、リプトンのミルクティーをまた好きになって毎日のように飲んでいます。
高校時代にコンビニで買いまくってた記憶があるのですが変わらず安定して美味しいですよね。
え、あれ10年以上前!?
つまりなにしたの?
pandasのデータフレームから1シリーズ(列)を入力すると外れ値をクリップして返してくれる関数を用意した。
Irisのデータセットに外れ値を追加して実際に除去してみる例を紹介する。
どんな関数?
- 入力: 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)の最大値がクロップされていることがわかる。