外れ値とその対策方法について

外れ値とは?

外れ値とは、データセットの中で他のデータポイントと比べて極端に異なる値のことを指します。これらの値は統計指標を歪め、機械学習モデルの性能に悪影響を与える可能性があります。

この記事では、外れ値の検出とその対策方法について見ていきたいと思います。今回はScikit-learnライブラリに含まれるIrisデータセットを利用します。

Irisデータセットは、アヤメ属の3種類の花(Iris setosa, Iris versicolor, Iris virginica)に関する特徴量を含んでいます。各種類の花について50個のサンプルがあり、合計で150個のサンプルが含まれています。

Irisデータセットを読み込んでおきます。

from sklearn.datasets import load_iris
import pandas as pd
import numpy as np

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

外れ値の検出

Zスコア(Z-score)

Zスコアは、統計学やデータ分析において、特定のデータポイントが平均からどれだけ離れているかを標準偏差の単位で示す指標です。一般的にZスコアが3以上または-3以下のデータポイントは外れ値と見なされます。

import numpy as np
from scipy.stats import zscore

z_scores = np.abs(zscore(data))
threshold = 3
outliers = (z_scores > threshold).any(axis=1)

outlier_data = data[outliers]

下記のサンプルが外れ値があるサンプルとして検出されました。

IQR (四分位範囲)

IQRは、データセットの上位四分位数(Q3)と下位四分位数(Q1)の差によって計算されます。外れ値は、定義された範囲(通常、IQRの1.5倍)外の点として識別されます。

def calculate_iqr_outliers(column):
    Q1 = column.quantile(0.25)
    Q3 = column.quantile(0.75)
    IQR = Q3 - Q1
    return (column < Q1 - 1.5 * IQR) | (column > Q3 + 1.5 * IQR)

outliers = data.apply(calculate_iqr_outliers, axis=0)
outlier_data = data[outliers.any(axis=1)]

下記のサンプルが外れ値があるサンプルとして検出されました。

外れ値の対策

外れ値を削除する

検出した外れ値を含むサンプルを削除します。デメリットとしては、データの一部を失うことになることです。

filtered_data = data[~outliers.any(axis=1)]

外れ値の変換

対数変換やBox-Cox変換などで変換する事で外れ値の影響を軽減します。

log_transformed_data = np.log1p(data)

外れ値の補完

外れ値を中央値や平均値などで置き換えます。
下記は外れ値を中央値で置き換えています。

def replace_outliers_with_median(df):
    for column in df.columns:
        outliers = calculate_iqr_outliers(df[column])
        median = df[column].median()
        df.loc[outliers, column] = median
    return df

data_replaced = replace_outliers_with_median(data.copy())

下記で外れ値で検出した値について確認してみます。

data_replaced[outliers.any(axis=1)]

sepal width (cm)について、外れ値が中央値の3.0で置き換えられています。