데이터 사이언스 - 3. 데이터 핸들링과 전처리 (3.3 이상치 탐색 및 처리)

2025. 3. 20. 12:08데이터 분석/데이터 사이언스

3.3 이상치 탐색 및 처리

이상치(Outlier)는 다른 데이터와 크게 벗어난 값으로, 데이터 분석 및 모델 성능에 영향을 줄 수 있다.
이상치는 측정 오류, 데이터 입력 오류, 특이한 현상으로 인해 발생할 수 있으며, 적절한 처리가 필요하다.

이 장에서는 이상치를 탐색하는 방법(IQR, Z-score, Boxplot)과 처리 방법(삭제, 대체, 변환)을 다룬다.


3.3.1 이상치 탐색 (Outlier Detection)

이상치를 탐색하는 주요 방법으로 사분위수 범위(IQR), Z-score, Boxplot을 활용할 수 있다.


① 사분위수 범위(IQR, Interquartile Range) 활용

IQR은 데이터의 1사분위수(Q1)와 3사분위수(Q3) 사이의 범위를 이용하여 이상치를 탐색하는 방법이다.

  • Q1 (1사분위수): 데이터의 하위 25% 지점
  • Q3 (3사분위수): 데이터의 상위 75% 지점
  • IQR (Q3 - Q1): 중간 50% 데이터의 범위
  • 이상치 기준: Q1 - 1.5 * IQR보다 작거나, Q3 + 1.5 * IQR보다 큰 값
import pandas as pd
import numpy as np

# 샘플 데이터 생성
data = {'Score': [80, 85, 90, 100, 110, 120, 150, 200, 250]}
df = pd.DataFrame(data)

# IQR 계산
Q1 = df["Score"].quantile(0.25)  # 1사분위수 (25%)
Q3 = df["Score"].quantile(0.75)  # 3사분위수 (75%)
IQR = Q3 - Q1  # IQR 계산

# 이상치 기준
lower_bound = Q1 - 1.5 * IQR
upper_bound = Q3 + 1.5 * IQR

# 이상치 탐색
outliers = df[(df["Score"] < lower_bound) | (df["Score"] > upper_bound)]
print("이상치:\n", outliers)

IQR을 활용한 이상치 탐색

  • 데이터가 IQR 범위를 벗어나면 이상치로 판단
  • 데이터가 정규분포를 따르지 않을 경우에도 효과적

② Z-score 활용 (표준 점수 기준 이상치 탐색)

Z-score는 데이터가 평균에서 얼마나 떨어져 있는지(표준편차 기준) 측정하는 방법이다.
이상치 기준:

  • Z-score > 3 또는 Z-score < -3 → 이상치
from scipy import stats

# Z-score 계산
df["Z-score"] = stats.zscore(df["Score"])

# 이상치 탐색 (절대값이 3보다 큰 값)
outliers = df[np.abs(df["Z-score"]) > 3]
print("이상치:\n", outliers)

Z-score 활용

  • 데이터가 정규분포를 따를 때 효과적
  • 평균과 표준편차를 기준으로 이상치 판단

③ Boxplot(상자그림) 활용

Boxplot(상자그림)은 데이터의 분포를 시각적으로 확인하는 방법으로, 이상치를 쉽게 탐색할 수 있다.

import matplotlib.pyplot as plt
import seaborn as sns

# 박스플롯 시각화
sns.boxplot(x=df["Score"])
plt.title("Boxplot을 활용한 이상치 탐색")
plt.show()

Boxplot에서 이상치는?

  • 박스 밖(수염 범위를 벗어난 점들)이 이상치
  • 이상치가 많은 경우, 데이터가 왜곡되었을 가능성이 있음

3.3.2 이상치 처리 방법 (삭제, 대체, 변환)

이상치를 처리하는 방법에는 삭제, 대체, 변환이 있으며, 데이터 특성에 맞게 적절한 방법을 선택해야 한다.


① 이상치 삭제 (Removing Outliers)

이상치가 적고, 제거해도 데이터 손실이 크지 않다면 drop()을 사용하여 삭제할 수 있다.

# 이상치 제거 (IQR 기준)
df_cleaned = df[(df["Score"] >= lower_bound) & (df["Score"] <= upper_bound)]
print(df_cleaned)

삭제하는 경우

  • 이상치가 데이터의 오류로 인해 발생
  • 이상치 데이터가 매우 적어 분석에 영향을 미치지 않는 경우

주의:
데이터가 적거나 이상치가 중요한 의미를 가질 수 있는 경우(예: 금융 거래 이상 탐지) 삭제는 신중해야 한다.


② 이상치 대체 (Replacing Outliers with Mean, Median, Mode)

이상치를 평균, 중앙값, 최빈값으로 대체하면 데이터 손실 없이 처리가 가능하다.

# 이상치를 중앙값(median)으로 대체
median_value = df["Score"].median()
df["Score"] = np.where((df["Score"] < lower_bound) | (df["Score"] > upper_bound),
                       median_value, df["Score"])

print(df)

대체하는 경우

  • 이상치가 많아서 삭제하면 데이터가 부족한 경우
  • 데이터가 정규분포를 따를 때 평균으로 대체
  • 데이터가 왜곡된 경우 중앙값(median)으로 대체

③ 이상치 변환 (Log, Square Root Transformation)

이상치가 너무 크거나 작아 데이터가 비대칭적(왜곡)인 경우, 로그 변환(Log Transform)이나 제곱근 변환(Square Root Transform)을 사용하면 효과적이다.

# 로그 변환 (Log Transformation)
df["Log_Score"] = np.log1p(df["Score"])  # log(1 + x) 변환

# 제곱근 변환 (Square Root Transformation)
df["Sqrt_Score"] = np.sqrt(df["Score"])

print(df)

변환하는 경우

  • 이상치가 너무 크거나 작아 데이터 분포가 비대칭적인 경우
  • 머신러닝 모델의 성능을 높이기 위해 데이터 정규화를 원할 때

주의

  • 로그 변환(Log Transformation)은 음수 값이 있으면 적용할 수 없음
  • 변환을 사용하면 데이터 해석이 어려워질 수 있음

3.3.3 이상치 탐색 및 처리 방법 비교

방법 적용 방식 사용 예시
IQR 사분위수(Q1, Q3)를 활용 정규분포가 아닌 데이터
Z-score 평균과 표준편차 활용 정규분포 데이터
Boxplot 시각화로 이상치 탐색 이상치의 분포 확인
삭제 (drop) 이상치 데이터 제거 이상치가 적고, 중요하지 않은 경우
대체 (fillna, median) 평균, 중앙값으로 대체 삭제하면 데이터 손실이 큰 경우
변환 (log, sqrt) 로그 변환, 제곱근 변환 데이터 분포가 왜곡된 경우

결론

이상치는 데이터 분석 및 머신러닝 모델 성능에 영향을 줄 수 있으므로 적절한 방법으로 탐색하고 처리하는 것이 중요하다.

  • IQR, Z-score, Boxplot을 활용하여 이상치를 탐색
  • 이상치가 많지 않다면 삭제(drop)
  • 데이터 손실을 방지하려면 중앙값(median) 또는 평균(mean)으로 대체
  • 데이터 분포가 왜곡된 경우 로그 변환(Log Transform) 등을 활용

이상치를 올바르게 처리하면 데이터 분석의 신뢰성을 높이고, 머신러닝 모델의 성능을 향상시킬 수 있다.