分析の質はデータの質。クレンジングと外れ値検出の実践テクニック。
データって、最初からきれいに揃ってることってあんまりないよね?
そうなのよ。
データクレンジングは実務時間の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 のとき、上限の閾値は?
- 5 + 1.5×2 = 8
- 5 + 2×2 = 9
- 100
- 5
こたえを見る
正解: 1. 5 + 1.5×2 = 8
Q3 + 1.5 × IQR = 5 + 1.5 × 2 = 8。 これより大きい値(=100)が外れ値と判定されます。 IQR法の閾値計算は典型的な計算問題です。