PythonでIQR法を使って外れ値を検出する方法

# PythonでIQR法を使って外れ値を検出する方法

**この記事のゴール**  
IQR法を使用して、データセット内の外れ値（異常値）を検出する手法をPythonで実装できるようになることが目的です。データの分布や異常値の傾向を確認し、データの信頼性を向上させるための一歩となるでしょう。

---

**目次**  
1. [IQR法による外れ値検出の手順](#IQR法による外れ値検出の手順)  
2. [Pythonでの実装例](#Pythonでの実装例)  
3. [注意点と考慮事項](#注意点と考慮事項)  
4. [参考文献](#参考文献)  

---

## IQR法による外れ値検出の手順

IQR法（Interquartile Range Method）は、データの四分位範囲を使用して外れ値を検出する方法です。以下がその手順です。

1. **データの四分位数（Q1, Q3）を計算**  
   - Q1: データの下位25%点  
   - Q3: データの上位75%点

2. **IQR（四分位範囲）の計算**  
   IQR = Q3 - Q1

3. **外れ値の範囲を定義**  
   - 下限: Q1 - 1.5 * IQR  
   - 上限: Q3 + 1.5 * IQR  
   この範囲から外れたデータポイントが外れ値となります。

---

## Pythonでの実装例

実際にIQR法を使ってデータから外れ値を検出し、視覚化するコード例を示します。

```python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# サンプルデータの生成 (正常データと意図的な外れ値を含む)
np.random.seed(42)  # 乱数シードを設定して再現性を確保
data = np.concatenate([
    np.random.normal(100, 10, 1000),  # 正常データ（平均100、標準偏差10）
    np.random.normal(50, 5, 10),      # 下側の外れ値（平均50、標準偏差5）
    np.random.normal(150, 5, 10)      # 上側の外れ値（平均150、標準偏差5）
])

# IQR法による外れ値の検出を行う関数
def detect_outliers_iqr(data):
    # 第1四分位数 (Q1) と 第3四分位数 (Q3) を計算
    q1, q3 = np.percentile(data, [25, 75])
    iqr = q3 - q1  # IQR（四分位範囲）を計算
    lower_bound = q1 - (1.5 * iqr)  # 下限を設定
    upper_bound = q3 + (1.5 * iqr)  # 上限を設定
    
    # 下限または上限を外れたデータのインデックスを取得
    outliers = np.where((data < lower_bound) | (data > upper_bound))[0]
    return outliers, lower_bound, upper_bound

# 外れ値の検出を実行
outlier_indices, lower_bound, upper_bound = detect_outliers_iqr(data)

# 結果の出力
print(f"検出された外れ値の数: {len(outlier_indices)}")
print(f"下限: {lower_bound:.2f}")
print(f"上限: {upper_bound:.2f}")

# 結果の可視化
plt.figure(figsize=(12, 6))  # グラフサイズの設定
plt.scatter(range(len(data)), data, c='blue', alpha=0.5)  # 全データポイントを青色でプロット
plt.scatter(outlier_indices, data[outlier_indices], c='red', label='Outliers')  # 外れ値を赤色でプロット
plt.axhline(y=lower_bound, color='g', linestyle='--', label='Lower bound')  # 下限を緑色の破線で表示
plt.axhline(y=upper_bound, color='g', linestyle='--', label='Upper bound')  # 上限を緑色の破線で表示
plt.xlabel('Data points')  # x軸ラベル
plt.ylabel('Values')  # y軸ラベル
plt.title('IQR Method for Outlier Detection')  # グラフタイトル
plt.legend()  # 凡例の表示
plt.show()

# 外れ値の詳細情報をデータフレームで出力
outliers_df = pd.DataFrame({
    'Index': outlier_indices,
    'Value': data[outlier_indices]
})
print("\n外れ値の詳細:")
print(outliers_df)
```

### 解説
1. **サンプルデータ生成**  
   正常なデータと意図的な外れ値を含むデータを作成します。

2. **detect_outliers_iqr関数**  
   四分位数とIQR（四分位範囲）を使って、下限と上限を計算し、その範囲外のデータを外れ値として検出します。

3. **結果の可視化**  
   グラフ上で全データポイントと外れ値を色分けして表示し、下限と上限を緑色の破線で視覚化しています。

---

## 注意点と考慮事項

1. **データの分布**  
   IQR法は、データが正規分布に近い場合に最も効果的です。極端な非正規分布や多峰性のデータでは、誤検出が増える可能性があります。

2. **閾値の調整**  
   標準的なIQR法では1.5倍IQRを使用しますが、必要に応じてこの閾値を変更することも可能です。

3. **サンプルサイズ**  
   小さなサンプルサイズでは、IQR法の外れ値検出の信頼性が低下するため、できるだけ大きなデータセットで使用することが望ましいです。

4. **多変量データ**  
   IQR法は一変量データに適していますが、多変量データの場合は、各変数に対してIQR法を個別に適用するか、より高度な手法（マハラノビス距離など）を使用することを検討します。

5. **データのコンテキストを考慮**  
   統計的に外れ値であっても、実際には重要な情報を持つ可能性があるため、データのドメイン知識を活用して判断することが重要です。

6. **他の手法との組み合わせ**  
   IQR法単独ではなく、Zスコア法や機械学習ベースの手法と併用することで、より信頼性の高い外れ値検出が可能になります。

---

## 参考文献

[1] "Pythonでの箱ひげ図とIQR法の実装," Sales Analytics, https://www.salesanalytics.co.jp/column/no00397/  
[2] "外れ値検出と処理の基本," Codexa, https://www.codexa.net/python-outlier/  
[3] "外れ値の扱いとその意義," Minitab Japan, https://www.minitab-kke.com/post/otona-statistics-vol16  
[4] "Pythonを使った異常値検出のガイド," United Code, https://note.com/united_code/n/n7c49170b882f  
[5] "IQR法の応用と限界," GMOリサーチ, https://gmo-research.ai/research-column/outlier  

---

これで、IQR法を使った外れ値検出の基礎的な手法と注意点について理解できました。IQR法は簡単に実装できるため、データ分析の最初のステップとして非常に有用です。