type: source status: seedling title: Python Outlier Detection: IQR Method and Z-score Implementation tags: [“data-analysis”, “outlier-detection”, “iqr-method”, “z-score”, “data-quality”, “pandas”] created: 2026-04-26 url: https://medium.com/@tubelwj/python-outlier-detection-iqr-method-and-z-score-implementation-8e825edf4b32 harvested: 2026-04-26 site: Medium source_count: 1 source_type: article updated: 2026-04-26 valid_as_of: 2026-04-26
Python Outlier Detection: IQR & Z-score 방법
학습 목표 매핑
SKALA 3기 Module 2 — 데이터 분석 개요 및 기초통계 (Learning Objective 2-2)
- Objective: 데이터 품질 문제(결측치·중복·이상치) 3가지를 IQR 기법으로 탐지하고, 실무 데이터셋에서 90% 정확도로 식별 가능 (Bloom L3-L4)
- Evaluation: 정확도 평가 (탐지 성공률)
이상치 탐지 방법 비교
1. IQR 방법 (사분위수 기반)
원리:
- Q1 (25 percentile), Q3 (75 percentile) 계산
- IQR = Q3 - Q1
- 하한: Q1 - 1.5 × IQR
- 상한: Q3 + 1.5 × IQR
판정: 하한 미만 또는 상한 초과 → 이상치
Python 코드:
import numpy as np
import pandas as pd
# 사분위수 계산
Q1 = df['Income'].quantile(0.25)
Q3 = df['Income'].quantile(0.75)
IQR = Q3 - Q1
# 경계값 계산
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR
# 이상치 탐지
df['Outlier'] = (df['Income'] < lower_bound) | (df['Income'] > upper_bound)장점:
- ✅ 분포 가정 불필요 (모든 데이터에 적용 가능)
- ✅ 편향된 데이터에 강함
- ✅ 박스플롯으로 시각화 용이
단점:
- 매개변수 1.5가 임의적
2. Z-score 방법 (표준정규분포 기반)
원리:
- μ (평균), σ (표준편차)
- 일반적으로 |Z-score| > 3을 이상치로 판정
판정 기준:
- |Z| < 1.96: 95% 신뢰수준 내 (정상)
- |Z| < 2.58: 99% 신뢰수준 내
- |Z| ≥ 3: 이상치 (99.7% 범위 초과)
Python 코드:
from scipy.stats import zscore
# Z-score 계산
df['Z-Score'] = zscore(df['Income'])
# 임계값 설정
z_threshold = 3
df['Outlier_Z'] = (df['Z-Score'] > z_threshold) | (df['Z-Score'] < -z_threshold)장점:
- ✅ 통계적 근거 명확
- ✅ 표준화된 방법
단점:
- ❌ 정규분포 가정 필요
- ❌ 극단값에 민감
비교표
| 특성 | IQR | Z-score |
|---|---|---|
| 분포 가정 | 없음 (모든 데이터) | 정규분포 필수 |
| 임계값 | Q1-1.5×IQR, Q3+1.5×IQR | |Z| > 3 |
| 편향 데이터 | 강함 ✅ | 약함 ❌ |
| 극단값 영향 | 적음 | 많음 |
| 시각화 | 박스플롯 | 히스토그램 |
| 실무 추천 | ⭐⭐⭐ | ⭐⭐ |
실제 예시
샘플 데이터:
data = {'Income': [3200, 3400, 3100, 3300, 3250, 3500, 3600, 3400, 3700, 12000]} IQR 결과:
- Q1 = 3250, Q3 = 3550, IQR = 300
- 하한 = 2800, 상한 = 4000
- 12000 → True (이상치) ✓
Z-score 결과:
- Z(12000) = 3.564 > 3
- 12000 → True (이상치) ✓
두 방법 모두 동일한 이상치 식별 ✓
이상치 처리 (선택적)
대체 (Capping)
# IQR 기반 상한/하한으로 제한
df['Income_Capped'] = df['Income'].clip(lower=lower_bound, upper=upper_bound)삭제
# 이상치 행 제거
df_clean = df[~df['Outlier']]학습 설계 포인트
Cognitive Level (Bloom)
- L2 (Understand): IQR/Z-score 개념, 판정 기준 이해
- L3 (Apply): 실제 데이터에 적용하여 이상치 탐지
- L4 (Analyze): 두 방법 비교, 상황별 선택 판단
권장 실습
- IQR 계산: 간단한 데이터로 Q1, Q3, IQR, 경계값 계산
- Z-score 계산: 표준편차 기반 Z값 계산
- 실데이터 적용: 실제 판다스 DataFrame에 적용
- 정확도 검증: 탐지된 이상치의 도메인 타당성 확인 (90% 기준)
참고 자료
- Scipy zscore: https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.zscore.html
- Pandas quantile: https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.quantile.html
타 소스와의 연계
outlier-handling-velog (이상치 처리 방법) eda-exploratory-data-analysis-geeksforgeeks (EDA 전체 프로세스) eda-python-tds-prabhu (실제 데이터셋 정제 사례)