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) 등을 활용
이상치를 올바르게 처리하면 데이터 분석의 신뢰성을 높이고, 머신러닝 모델의 성능을 향상시킬 수 있다.
'데이터 분석 > 데이터 사이언스' 카테고리의 다른 글
데이터 사이언스 - 3. 데이터 핸들링과 전처리 (3.5 범주형 데이터 인코딩) (0) | 2025.03.20 |
---|---|
데이터 사이언스 - 3. 데이터 핸들링과 전처리 (3.4 데이터 정규화 및 변환) (0) | 2025.03.20 |
데이터 사이언스 - 3. 데이터 핸들링과 전처리 (3.2 결측치 처리 (Missing Values)) (0) | 2025.03.20 |
데이터 사이언스 - 3. 데이터 핸들링과 전처리 (3.1 데이터 불러오기 및 저장) (0) | 2025.03.20 |
데이터 사이언스 - 2. Python을 활용한 데이터 분석 기초 (2.2 데이터 분석 필수 라이브러리) (0) | 2025.03.20 |