PythonのPandasの外れ値について

Pandasの外れ値,イメージ

AI実装検定のご案内

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の外れ値についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次