본문 바로가기
Artificial Intelligence/60. Python

[PYTHON] 데이터 분석의 적, 이상치(Outlier) 판단 기준 3가지와 완벽 해결 방법

by Papa Martino V 2026. 4. 7.
728x90

이상치(Outlier) 판단 기준
이상치(Outlier) 판단 기준

 

 

데이터 분석과 머신러닝 모델링의 성패는 '데이터의 품질'에 달려 있습니다. 그리고 그 품질을 결정짓는 가장 큰 변수가 바로 이상치(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"
728x90