✅ 이상치 (Outlier)
이상치 (Outlier) |
• 관측된 데이터의 일반적인 범위에서 많이 벗어난 값, 즉 너무 작은 값이나 너무 큰 값 • 기준을 정해서 이상치를 처리하는 것은 필수! 이상치가 모델링 및 의사결정에 영향을 미칠 수 있기 때문.
|
Z-score 방법 |
• 평균값 기반으로 이상치를 탐지하는 방법 • 평균, 표준편차를 이용해서 특정 데이터가 평균값으로부터 얼마나 멀리 떨어져있는지 계산 → 특정 임계값을 넘어가면 이상치로 판단 |
IQR 방법 |
• 중앙값 기반으로 이상치를 탐지하는 방법 • 사분위수, IQR을 이용해서 특정 데이터가 중앙값으로부터 얼마나 멀리 떨어져있는지 계산 → 박스플롯의 최솟값, 최댓값을 넘어가면 이상치로 판단 |
0️⃣ 패키지 & 데이터프레임 불러오기
- 예시가 될 데이터셋은 Kaggle에서 가져온 Flight Price Prediction 입니다.
# 패키지 불러오기
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# 데이터셋 불러오기
df = pd.read_csv('./Clean_Dataset.csv', encoding='cp949')
df = df.drop([df.columns[0]], axis=1)
1️⃣ Z-score 방법
- Z-score 방법으로 이상치를 탐지하고 처리하는 방법은 아래와 같습니다.
(1) 각 데이터의 Z-score 계산 |
데이터를 표준화(Standardization) 즉, 평균=0 표준편차=1인 정규분포에 매핑시킴. |
(2) Z-score가 임계값을 넘어가는지 판단 |
일반적으로 Z-score의 절댓값이 2~3보다 크면 이상치로 판단함. |
- 아래는 Z-score 방법으로 이상치를 삭제하는 함수입니다. 임계값은 데이터 특성과 상황에 따라 정할 수 있습니다.
# Z-score로 이상치 탐지하고 처리하는 함수
# 입력값: 데이터프레임, 이상치 처리할 칼럼 이름, 임계값
def drop_outliers_zscore(df, column, threshold):
# 각 데이터의 Z-score 계산
z_scores = (df[column] - df[column].mean()) / df[column].std()
# Z-score의 절댓값이 threshold 이하인 데이터만 남기기 (초과이면 이상치이므로 제외)
df_drop_outliers = df[abs(z_scores) <= threshold]
return df_drop_outliers
- 칼럼은 'price', 임계값은 3으로 두고 이상치를 제외해봤어요. 원래 데이터프레임에서 602개 행이 삭제됐습니다.
- 어떤 데이터가 삭제됐는지 한눈에 보려면 시각화해보는 것이 좋습니다.
이상치 처리 전후 각각 히스토그램을 그려보니, 약 90000 넘어가는 너무 높은 값들이 제외된 것 같네요.
2️⃣ IQR 방법
- IQR 방법으로 이상치를 탐지하고 처리하는 방법은 아래와 같습니다.
(1) 중앙값 관련 수치들 계산 |
데이터의 사분위수를 구하고, IQR=제3사분위수-제1사분위수 를 계산함. |
(2) 임계값을 넘어가는 데이터 판단 |
제3사분위수 + 1.5xIQR 보다 크거나, 제1사분위수 - 1.5xIQR 보다 작으면 이상치로 판단함. |
- IQR 방법으로 이상치를 삭제하는 함수입니다.
# IQR로 이상치 탐지하고 처리하는 함수
# 입력값: 데이터프레임, 이상치 처리할 칼럼 이름
def drop_outliers_iqr(df, column):
# 1.5*IQR 계산하기
q1 = df[column].quantile(0.25)
q3 = df[column].quantile(0.75)
iqr = (q3 - q1) * 1.5
# 이상치 제외한 결과만 남기기
df_drop_outliers = df[(df[column] <= (q3 + iqr)) & (df[column] >= (q1 - iqr))]
return df_drop_outliers
- 마찬가지로 칼럼을 'price' 로 두고 이상치를 제외해봤습니다. 원래 데이터프레임에서 123개 행이 삭제됐습니다.
아래와 같이 박스플롯 상에 찍혔던 이상치들이 전부 제외된 것을 확인할 수 있습니다.
- 이상치로 판별된 데이터가 Z-score방법보다 적습니다. 확실히 중앙값이 평균보다 이상치에 덜 민감한 모습이네요.