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