PythonのPandasにおける「外れ値(Outlier)」の扱いは、データの前処理において非常に重要です。
外れ値は、統計的に他のデータポイントと大きく異なる値のことで、機械学習モデルの精度を著しく下げたり、分析結果を歪めたりする原因になります。
ここでは、Pandasを用いた外れ値の検出・可視化・処理方法について、以下のトピックに分けて詳しく解説します。
目次
外れ値の概要とは?
外れ値とは、データ分布から大きく逸脱している値のことです。
例えば年収のデータで、ほとんどが500万〜1000万円の中にあるのに、1億円のデータがあると、それは外れ値とみなされる可能性があります。
外れ値が発生する原因の一例
- データ入力ミス(例:0を多く打ってしまった)
- 異常なユーザーの行動(例:大量にクリックするボット)
- センサーの誤作動
- 例外的に成功・失敗した事例(ビジネス上では重要)
外れ値の検出方法
統計的手法(標準偏差を使う)
平均からの標準偏差が大きいものを外れ値とする方法です。
import pandas as pd
# データ例
df = pd.DataFrame({'score': [100, 105, 98, 101, 99, 300]})
# 平均と標準偏差
mean = df['score'].mean()
std = df['score'].std()
# 閾値を設定して検出(例:±2σ)
outliers = df[(df['score'] > mean + 2 * std) | (df['score'] < mean - 2 * std)]
print(outliers)
四分位範囲(IQR)を使う方法
より頑健で、極端な値に影響されにくい方法です。
Q1 = df['score'].quantile(0.25)
Q3 = df['score'].quantile(0.75)
IQR = Q3 - Q1
# 外れ値の条件
outliers = df[(df['score'] < Q1 - 1.5 * IQR) | (df['score'] > Q3 + 1.5 * IQR)]
print(outliers)
ポイント
- IQR法はスキュー(偏り)のあるデータにも強いため、実務でもよく使われます。
Zスコアを用いる方法(scipyと組み合わせ)
from scipy import stats
z_scores = stats.zscore(df['score'])
df['z_score'] = z_scores
outliers = df[df['z_score'].abs() > 3] # Zスコアが±3を超えたら外れ値
print(outliers)
外れ値の可視化
Boxプロットで視覚的に確認
import seaborn as sns
import matplotlib.pyplot as plt
sns.boxplot(x=df['score'])
plt.show()
- 箱の外にある点(●)が外れ値
- 視覚的に外れ値の存在を一目で把握できます。
外れ値の処理方法
外れ値をどう扱うかは、分析目的によって異なります。
代表的な処理方法を紹介します。
- 削除(drop)する
- 中央値や平均値で置き換える
- 上限・下限でクリップ(切り詰め)
- ラベリングする(異常値フラグを立てる)
実務上の注意点
- 自動的に削除しないこと:外れ値が実は重要なビジネスインサイトを持っているケースもある(例:VIP顧客、バグの兆候など)。
- 外れ値の定義は文脈依存:同じ数値でも、用途によって外れ値かどうかが変わります。
- 対象となる列の分布を必ず確認する:正規分布か、偏っているかを確認することで、どの手法を使うべきか見えてきます。
補足:機械学習との関係
- モデルによっては外れ値に弱い(例:線形回帰、k近傍法など)
- ランダムフォレストや勾配ブースティングは外れ値に強い傾向がある
- 外れ値検出自体を目的としたモデル(異常検知)もある(Isolation Forest, One-Class SVMなど)
まとめ
方法 | 特徴 | 向いているケース |
---|---|---|
標準偏差法 | シンプル | 正規分布に近いデータ |
IQR法 | 頑健で安定 | スキューのあるデータ |
Zスコア | 統計的に明確 | モデル入力前のスクリーニング |
可視化 | 分布の直感把握 | 初期分析時 |
以上、PythonのPandasの外れ値についてでした。
最後までお読みいただき、ありがとうございました。