IT/기타

이상치(Outliers) 처리 방법

IT 블로거 2025. 2. 24. 00:10
300x250

이상치는 데이터에서 다른 값들과 현저히 차이가 나는 값으로, 모델 성능을 저하시킬 수 있습니다.
이상치는 잘못된 데이터일 수도 있지만, 중요한 정보일 수도 있으므로 적절한 처리 방법을 선택해야 합니다.

이상치 탐색 방법

1. 기초 통계량 활용 (IQR, 표준편차)
  • 이상치를 탐색하는 가장 기본적인 방법은 기초 통계량을 활용하는 것입니다.

  • IQR (Interquartile Range, 사분위 범위) 이용
   ✔︎ IQR(사분위 범위) 방법은 데이터의 1사분위(Q1)와 3사분위(Q3) 사이의 범위를 기반으로 이상치를 탐색합니다.
   ✔︎ 일반적으로 Q1 - 1.5 × IQR 미만 또는 Q3 + 1.5 × IQR 초과인 데이터가 이상치로 간주됩니다.

import pandas as pd
import numpy as np

# 예제 데이터 생성
df = pd.DataFrame({'Value': [10, 12, 13, 12, 11, 10, 100, 14, 13, 12, 11, 200]})

# IQR 계산
Q1 = df['Value'].quantile(0.25)  # 1사분위수
Q3 = df['Value'].quantile(0.75)  # 3사분위수
IQR = Q3 - Q1  # 사분위 범위

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

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

 

[결과] IQR을 활용하여 100과 200이 이상치로 판별됨.

2. 표준편차(Z-Score) 활용
  • 표준편차를 사용하여 평균에서 멀리 떨어진 데이터(±3 표준편차 초과)를 이상치로 간주할 수 있습니다.
  • 평균으로부터 3 표준편차 이상 벗어난 데이터를 이상치로 간주

import numpy as np
import pandas as pd

from scipy import stats

# 예제 데이터 생성
df = pd.DataFrame({'Value': [10, 12, 13, 12, 11, 10, 100, 14, 13, 12, 11, 200]})

# Z-Score 계산
df['Z_Score'] = np.abs(stats.zscore(df['Value']))

# 이상치 탐색 (Z-Score > 3)
outliers = df[df['Z_Score'] > 3]
print("이상치 데이터:\n", outliers)

3. 시각화를 활용한 이상치 탐색

  • Boxplot (상자 그림)
Boxplot을 이용하면 이상치를 쉽게 시각적으로 확인할 수 있습니다.

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np

# 예제 데이터 생성
df = pd.DataFrame({'Value': [10, 12, 13, 12, 11, 10, 100, 14, 13, 12, 11, 200]})

# Boxplot 시각화
plt.figure(figsize=(6, 4))
sns.boxplot(y=df['Value'])
plt.title("Boxplot of Value")
plt.show()

  • Scatter Plot : 산점도를 통해 이상치를 확인할 수도 있습니다.

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import numpy as np
# 예제 데이터 생성
df = pd.DataFrame({'Value': [10, 12, 13, 12, 11, 10, 100, 14, 13, 12, 11, 200]})


plt.figure(figsize=(6, 4))
plt.scatter(range(len(df)), df['Value'])
plt.xlabel("Index")
plt.ylabel("Value")
plt.title("Scatter Plot of Values")
plt.show()



이상치 처리 방법


1. 이상치를 탐색한 후, 데이터의 특성과 분석 목적에 맞게 적절한 방법을 선택하여 처리해야 합니다.

2. 이상치 제거 : 이상치를 제거하면 데이터의 크기가 줄어들지만, 중요한 정보가 손실될 수 있음.

# 이상치가 아닌 데이터만 남김
df_cleaned = df[(df['Value'] >= lower_bound) & (df['Value'] <= upper_bound)]
print(df_cleaned)

3. 이상치 대체 (평균, 중앙값) : 이상치를 평균(mean) 또는 중앙값(median)으로 대체할 수 있습니다.

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



4. 이상치 변환 (로그 변환, 윈저라이징)
  • 이상치를 보정하여 데이터의 분포를 정규화할 수도 있습니다.
  • 로그 변환 (Log Transformation)

df['Log_Value'] = np.log1p(df['Value'])  # 로그 변환 적용


5. 윈저라이징(Winsorizing)
  • 윈저라이징(Winsorizing)은 이상치를 일정 값으로 제한하는 방법입니다.
  • 이상치를 완전히 제거하지 않고, 특정 범위 내로 변환하여 극단적인 영향을 줄일 수 있음.

from scipy.stats.mstats import winsorize

df['Winsorized'] = winsorize(df['Value'], limits=[0.05, 0.05])  # 상위/하위 5% 조정


6. 머신러닝 기반 이상치 탐지
  • Isolation Forest
  • 머신러닝을 활용하면 비선형적 이상치도 탐지 가능.

from sklearn.ensemble import IsolationForest

iso_forest = IsolationForest(contamination=0.1)  # 이상치 비율 10%
df['Outlier'] = iso_forest.fit_predict(df[['Value']])

# 이상치 데이터 확인
outliers = df[df['Outlier'] == -1]
print(outliers)


7. 이상치를 그대로 유지하는 경우
• 금융 사기 탐지, 고장 예측 등에서는 이상치가 중요한 정보가 될 수도 있음.
• 예를 들어, 신용카드 거래 데이터에서 이상치가 사기 거래일 가능성이 있음.


이상치 탐색 및 처리 방법

방법 설명 코드 예제
IQR 방법 사분위 범위를 이용해 이상치 판별  `df[(df[‘Value’] < lower_bound)
Z-Score 방법 평균에서 3표준편차 이상 벗어난 데이터 탐색 df[df['Z_Score'] > 3]
Boxplot 시각화 이상치를 그래픽으로 탐색 sns.boxplot(y=df['Value'])
이상치 제거 이상치를 삭제 df_cleaned = df[(df['Value'] >= lower_bound) & (df['Value'] <= upper_bound)]
중앙값 대체 상치를 중앙값으로 변경 df['Value'] = np.where(df['Value'] > upper_bound, median_value, df['Value'])
로그 변환 데이터 분포를 정규화 df['Log_Value'] = np.log1p(df['Value'])
윈저라이징 극단값을 제한된 범위로 변경 winsorize(df['Value'], limits=[0.05, 0.05])
Isolation Forest 머신러닝 기반 이상치 탐지  iso_forest.fit_predict(df[['Value']])

관련 블로그

 

파이썬 데이터 분석 절차

파이썬을 활용한 데이터 분석은 데이터 수집 → 데이터 전처리 → 탐색적 데이터 분석(EDA) → 모델링 및 분석 → 시각화 및 인사이트 도출의 과정을 거칩니다. 데이터 수집 (Data Collection)1. 데이

make2t.tistory.com

 

300x250