異常値の検出と除去
異常値(アウトライアー)は、データの中で他の値から大きく外れた点を指し、機械学習モデルの性能を悪化させる原因になります。データ前処理の段階で異常値を検出し、適切に除去または処理することが重要です。本記事では、Pythonを使った異常値の検出と除去の方法について解説します。
異常値とは何か
異常値は、データセット内で他のデータ点と大きく異なる値のことを指します。異常値は、測定エラーやデータの自然な変動により生じることがありますが、そのままにしておくと機械学習モデルの精度が低下する可能性があります。
異常値の検出方法
異常値の検出には、統計的な手法やグラフを使用します。以下に代表的な異常値の検出方法を紹介します。
基本統計量を用いた異常値の検出
基本統計量(平均、標準偏差、四分位範囲)を使用して、異常値を検出することができます。四分位範囲(IQR)は、異常値検出に広く使われる方法です。
import pandas as pd
# サンプルデータの作成
data = {'col1': [1, 2, 3, 4, 5, 6, 7, 8, 100]}
df = pd.DataFrame(data)
# 四分位範囲(IQR)を計算
Q1 = df['col1'].quantile(0.25)
Q3 = df['col1'].quantile(0.75)
IQR = Q3 - Q1
# 異常値を検出(1.5 * IQRより外にある値を異常値とする)
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 異常値を含む行を取得
outliers = df[(df['col1'] < lower_bound) | (df['col1'] > upper_bound)]
print(outliers)
このコードでは、四分位範囲(IQR)を使って異常値を検出しています。列col1
において、1.5倍のIQRより外にある値を異常値として判断しています。
Zスコアを用いた異常値の検出
Zスコアを使って異常値を検出する方法も一般的です。Zスコアは、データが平均から何標準偏差離れているかを示します。
from scipy import stats
# Zスコアの計算
df['z_score'] = stats.zscore(df['col1'])
# Zスコアが3以上のものを異常値とする
outliers_z = df[df['z_score'].abs() > 3]
print(outliers_z)
このコードでは、Zスコアを使って異常値を検出しています。Zスコアが3を超えるデータ点を異常値と判断しています。
ボックスプロットを使った異常値の可視化
異常値を視覚的に検出するために、ボックスプロットを使用することも効果的です。ボックスプロットは、データの分布を視覚化し、外れたデータ点を異常値として示します。
import matplotlib.pyplot as plt
# ボックスプロットの作成
plt.boxplot(df['col1'])
plt.title('Boxplot for col1')
plt.show()
このコードでは、matplotlib
を使ってボックスプロットを作成し、異常値を視覚的に確認しています。ボックスプロット上のwhiskers
の外に出ている点が異常値です。
異常値の除去方法
異常値を検出した後、それを削除するか、モデルに与える影響を最小限に抑えるために処理する必要があります。以下に異常値を削除する方法を示します。
IQRを使った異常値の除去
# 異常値を除去
df_cleaned = df[(df['col1'] >= lower_bound) & (df['col1'] <= upper_bound)]
print(df_cleaned)
このコードでは、IQRを使用して検出した異常値を除去しています。範囲内のデータのみを残して、異常値を含む行を削除しています。
Zスコアを使った異常値の除去
# Zスコアが3以下のデータのみを残す
df_cleaned_z = df[df['z_score'].abs() <= 3]
print(df_cleaned_z)
このコードでは、Zスコアが3を超えないデータのみを残し、異常値を除去しています。
異常値を処理するか、除去するかの判断
異常値をそのまま削除するか、別の方法で処理するかは、データやモデルに応じて異なります。異常値を削除することで、モデルの精度が向上する場合もありますが、逆に有益な情報を失う可能性もあります。以下の点を考慮して、異常値を処理する方法を選択しましょう。
- データの性質: 異常値が誤差である場合は削除が有効です。一方、異常値が重要な意味を持つ場合は、削除しない方が良いこともあります。
- データ量: データセットが小さい場合、異常値を除去することがデータ量の減少につながり、モデルの性能を下げる可能性があります。
- 影響度: 異常値がモデルにどの程度影響を与えるかを評価し、適切な処理方法を選択します。
まとめ
この記事では、異常値の検出と除去の方法について解説しました。IQRやZスコア、ボックスプロットなどの手法を使うことで、データ内の異常値を検出し、それに応じた適切な処理を行うことができます。異常値の処理を適切に行うことで、機械学習モデルの精度を向上させることが可能です。