データクレンジングと外れ値検出(IQR・3σ)

データの質を上げるクレンジング技術と、IQR/3σ法による外れ値検出を学びます。

分析の質はデータの質。クレンジングと外れ値検出の実践テクニック。

白峰 リリ(普段) 白峰 リリ

データって、最初からきれいに揃ってることってあんまりないよね?

神楽 モニカ 先生(笑顔) 神楽 モニカ 先生

そうなのよ。
データクレンジングは実務時間の60〜80%を占めると言われるほど重要なの。 主な作業は (1)欠損値処理、(2)重複削除、(3)外れ値検出、(4)型変換、(5)文字列の正規化、の5つね。

import pandas as pd
import numpy as np

# (1) 重複行の確認・削除
print(df.duplicated().sum())     # 重複行数
df = df.drop_duplicates()

# (2) 文字列の正規化
df['email'] = df['email'].str.lower().str.strip()
df['name'] = df['name'].str.replace(' ', ' ', regex=False)  # 全角→半角空白

# (3) 型変換
df['ordered_at'] = pd.to_datetime(df['ordered_at'])
df['age'] = pd.to_numeric(df['age'], errors='coerce')  # 失敗はNaNに

# (4) IQR で外れ値検出
Q1 = df['amount'].quantile(0.25)
Q3 = df['amount'].quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
outliers = df[(df['amount'] < lower) | (df['amount'] > upper)]

# (5) 3σ法で外れ値検出 (正規分布を仮定)
mu, sigma = df['amount'].mean(), df['amount'].std()
outliers_3sigma = df[(df['amount'] < mu - 3 * sigma) |
                     (df['amount'] > mu + 3 * sigma)]
紅林 かえで(普段) 紅林 かえで

IQR法は箱ひげ図と同じ仕組みで、Q1-1.5·IQR〜Q3+1.5·IQRの範囲外を外れ値と見なします。 ロバストな手法ですね。

藍沢 しずく(普段) 藍沢 しずく

3σ法は?

紅林 かえで(普段) 紅林 かえで

平均±3標準偏差の外を外れ値とする方法です。 正規分布を仮定できる場合に有効で、±3σの範囲に99.7%が含まれるので、外側は0.3%程度の異常値ということになります。

白峰 リリ(普段) 白峰 リリ

IQRと3σって、どっち使えばいいの?

神楽 モニカ 先生(普段) 神楽 モニカ 先生

データが正規分布に近いなら3σ、 歪みがあったり外れ値が複数あったりする場合はIQRがロバストで安全よ。 実務ではIQRをおすすめするわ。

紅林 かえで(普段) 紅林 かえで

外れ値は『機械的に削除すべき』ではありません。 入力ミスなら削除や修正、本当に大きな値なら除外せず別途分析、というふうに性質を見極めて判断することが大事ですね。

藍沢 しずく(びっくり) 藍沢 しずく

外れ値=即削除、ではないんですねぇ。

神楽 モニカ 先生(普段) 神楽 モニカ 先生

そうなのよ。
外れ値こそ、実は重要な情報を持っている場合があるの。 削除する前にビジネス文脈で確認することを心がけてね。

確認クイズ

データ {2, 3, 4, 5, 100} に対しIQR法で外れ値判定する。Q1=3, Q3=5, IQR=2 のとき、上限の閾値は?

  1. 5 + 1.5×2 = 8
  2. 5 + 2×2 = 9
  3. 100
  4. 5
こたえを見る

正解: 1. 5 + 1.5×2 = 8

Q3 + 1.5 × IQR = 5 + 1.5 × 2 = 8。 これより大きい値(=100)が外れ値と判定されます。 IQR法の閾値計算は典型的な計算問題です。

🔖 この記事の関連書籍

Amazonアソシエイトリンクを含みます。他分野は おすすめ書籍ページ へ。