
데이터 분석과 머신러닝 모델링의 성패는 '데이터의 품질'에 달려 있습니다. 그리고 그 품질을 결정짓는 가장 큰 변수가 바로 이상치(Outlier)입니다. 이상치는 측정 오류, 시스템 결함, 혹은 실제로 발생한 희귀한 사건일 수 있습니다. 이를 단순히 삭제할 것인가, 아니면 조정할 것인가를 결정하기 위해서는 명확한 통계적 판단 기준이 필요합니다. 본 포스팅에서는 실무에서 가장 신뢰받는 3가지 이상치 탐지 기법과 이를 파이썬으로 해결하는 최적의 전략을 다룹니다.
1. 이상치(Outlier) 판단을 위한 3가지 핵심 통계 기준
무엇을 이상치로 볼 것인가는 주관적 판단이 아닌 데이터의 분포와 특성에 근거해야 합니다.
① IQR(Interquartile Range) 방식: 사분위수 기반 해결
데이터의 중앙 50% 범위를 기준으로 합니다. 데이터의 하위 25% 지점(Q1)과 상위 25% 지점(Q3) 사이의 거리인 IQR을 구한 뒤, Q1에서 1.5배 IQR보다 작거나 Q3에서 1.5배 IQR보다 큰 값을 이상치로 규정합니다. 정규분포를 따르지 않는 데이터에도 적용 가능하여 실무 활용도가 가장 높습니다.
② Z-Score(표준 점수) 방식: 정규분포 기반 판단
데이터가 평균으로부터 표준편차의 몇 배만큼 떨어져 있는지를 나타냅니다. 보통 Z-Score의 절대값이 3 이상(평균에서 $3\sigma$ 밖)인 경우를 이상치로 간주합니다. 데이터가 가우시안 정규분포를 따를 때 가장 정확한 방법입니다.
③ Isolation Forest: 머신러닝 기반 탐지 차이
통계적 공식이 아닌 알고리즘을 사용합니다. 이상치는 정상 데이터보다 수가 적고 특성값이 다르다는 점을 이용하여, 데이터를 무작위로 분할할 때 고립(Isolate)되는 속도가 빠를수록 이상치 점수를 높게 부여합니다. 다차원 변수 간의 복합적인 이상치를 찾아낼 때 효과적입니다.
2. 이상치 탐지 기법별 장단점 및 선택 기준 비교
데이터의 특성에 맞는 최적의 탐지 기법을 선택하기 위한 비교 분석표입니다.
| 판단 기법 | 적용 원리 | 장점 | 단점 및 한계 |
|---|---|---|---|
| IQR Method | 사분위수 기반 ($1.5 \times IQR$) | 분포와 무관하게 사용 가능, 직관적 | 극단적인 값에 의해 범위가 왜곡될 수 있음 |
| Z-Score | 평균 및 표준편차 기반 ($3\sigma$ 기준) | 수학적 근거가 명확함 | 평균 자체가 이상치에 영향을 받음 |
| Box Plot | 시각적 탐지 (IQR 기반) | 빠른 시각적 확인 가능 | 대량의 데이터 분석 시 자동화가 어려움 |
| Isolation Forest | 의사결정 나무 고립 방식 | 다변량(Multivariate) 데이터에 강점 | 결과에 대한 통계적 설명력이 상대적으로 낮음 |
3. 개발자를 위한 실무 이상치 처리 Python Example 7선
현업 데이터 파이프라인에서 즉시 사용 가능한 실전 파이썬 코드 예제입니다.
Example 1: NumPy를 이용한 IQR 기반 이상치 필터링 함수
import numpy as np
import pandas as pd
def detect_outliers_iqr(data):
q1 = np.percentile(data, 25)
q3 = np.percentile(data, 75)
iqr = q3 - q1
lower_bound = q1 - (1.5 * iqr)
upper_bound = q3 + (1.5 * iqr)
return [x for x in data if x < lower_bound or x > upper_bound]
sample_data = [10, 12, 12, 13, 12, 11, 14, 13, 15, 10, 100, 102]
print("Detected IQR Outliers:", detect_outliers_iqr(sample_data))
Example 2: Scipy를 활용한 Z-Score 이상치 제거 해결
from scipy import stats
df = pd.DataFrame({'val': [10, 11, 12, 11, 10, 12, 100]})
z_scores = np.abs(stats.zscore(df['val']))
# Z-score가 3보다 작은 데이터만 유지 (정상 데이터 필터링)
df_clean = df[z_scores < 3]
print("Cleaned Data:\n", df_clean)
Example 3: 시각적 탐지를 위한 Matplotlib BoxPlot 구현
import matplotlib.pyplot as plt
data = np.random.normal(50, 5, 100)
data = np.append(data, [10, 90]) # 인위적 이상치 추가
plt.boxplot(data)
plt.title("Visualizing Outliers with Boxplot")
plt.show()
Example 4: Isolation Forest를 이용한 다변량 이상치 탐지
from sklearn.ensemble import IsolationForest
X = [[1, 1], [1, 2], [2, 1], [10, 10]] # [10, 10]은 이상치 후보
clf = IsolationForest(contamination=0.1, random_state=42)
preds = clf.fit_predict(X)
# -1은 이상치, 1은 정상치
for i, pred in enumerate(preds):
if pred == -1:
print(f"Index {i} is an outlier: {X[i]}")
Example 5: 이상치를 상한/하한값으로 대체(Winsorization)하는 방법
# 이상치를 삭제하지 않고 최대/최소값 경계값으로 클리핑
df_clip = pd.Series([1, 2, 3, 4, 100])
q1, q3 = df_clip.quantile([0.25, 0.75])
iqr = q3 - q1
lower = q1 - 1.5 * iqr
upper = q3 + 1.5 * iqr
df_clipped = df_clip.clip(lower, upper)
print("Clipped Data (Winsorized):\n", df_clipped)
Example 6: 결측값(NaN)과 이상치가 섞인 복합 데이터 해결
# 이상치를 NaN으로 변환 후 보간법(Interpolation) 적용
def replace_outliers_with_nan(df, col):
q1 = df[col].quantile(0.25)
q3 = df[col].quantile(0.75)
iqr = q3 - q1
df.loc[(df[col] < (q1 - 1.5 * iqr)) | (df[col] > (q3 + 1.5 * iqr)), col] = np.nan
return df.interpolate()
df_mixed = pd.DataFrame({'score': [50, 52, 48, 200, 51]})
print("After Interpolation:\n", replace_outliers_with_nan(df_mixed, 'score'))
Example 7: 그룹별(GroupBy) 이상치 판단 및 처리 전략
# 전체 기준이 아닌 카테고리별 기준 적용 (예: 직급별 연봉 이상치)
df_group = pd.DataFrame({
'category': ['A', 'A', 'A', 'B', 'B', 'B'],
'value': [10, 12, 100, 50, 55, 500]
})
def get_group_outliers(group):
q1, q3 = group.quantile([0.25, 0.75])
iqr = q3 - q1
return group[(group < q1 - 1.5 * iqr) | (group > q3 + 1.5 * iqr)]
outliers = df_group.groupby('category')['value'].apply(get_group_outliers)
print("Outliers by Category:\n", outliers)
4. 결론: 이상치 처리가 모델의 신뢰도를 결정한다
이상치 판단은 단순히 "데이터를 지우는 작업"이 아닙니다. 비즈니스 도메인에 따라 이상치는 사기 탐지(Fraud Detection)나 장애 예측과 같이 가장 중요한 정보가 될 수도 있습니다. 따라서 무조건적인 삭제보다는 데이터의 분포(IQR, Z-Score)와 알고리즘의 특성(Isolation Forest)을 고려하여 해결 전략을 세워야 합니다. 본 포스팅에서 다룬 7가지 실무 예제를 바탕으로 여러분의 데이터셋에 가장 적합한 판단 기준을 수립해 보시기 바랍니다. 정밀한 전처리가 곧 정밀한 예측으로 이어집니다.
5. 내용 출처 및 참고 문헌
- Python Data Science Handbook by Jake VanderPlas - "Data Manipulation with Pandas"
- Statistical Methods for Reliability Data by Meeker and Escobar
- Scikit-learn User Guide: "Novelty and Outlier Detection" (scikit-learn.org)
- Towards Data Science: "A Brief Overview of Outlier Detection Techniques"
'Artificial Intelligence > 60. Python' 카테고리의 다른 글
| [PYTHON] 데이터 스케일링 핵심 방법 2가지와 Standard vs Min-Max 차이 및 해결 전략 7선 (0) | 2026.04.07 |
|---|---|
| [PYTHON] 머신러닝의 필수 관문: 원-핫 인코딩(One-hot Encoding)이 필요한 3가지 이유와 해결 방법 (0) | 2026.04.07 |
| [PYTHON] 모델 성능 예측의 핵심 : 훈련 데이터와 테스트 데이터를 나누는 3가지 방법과 해결 전략 (0) | 2026.04.07 |
| [PYTHON] 데이터 불균형(Imbalance) 해결을 위한 3가지 샘플링 방법과 성능 최적화 전략 (0) | 2026.04.07 |
| [PYTHON] Monkey Patching의 위험성 3가지 해결 방법과 유닛 테스트 활용의 차이 (0) | 2026.04.07 |