본문 바로가기

Data Handling/Data Preprocessing

IQR 방식을 이용한 이상치 데이터(Outlier) 제거

* 해당 포스팅은 파이썬 머신러닝 완벽 가이드(권철민, 2019) 교재를 참고하여 공부하며 작성한 글입니다.

 

 

이상치 데이터(Outlier)는 모델의 성능을 떨어뜨리는 불필요한 요소이기 때문에 꼭 제거해주어야 합니다.

그렇다면 어떻게 이상치 데이터를 찾을 수 있을까요?

 

1차적으로 EDA 과정에서 그래프를 통해 발견할 수 있습니다.

하지만 이 방법은 소수의 데이터가 평균으로부터 눈에 띄게 떨어진 경우에만 가능하다는 한계가 있습니다.

따라서 "어디까지가 이상치 데이터다" 라고 판단하는 기준이 필요하게 되는데요,

여러가지 방법들 중 오늘은 IQR(Inter Quantile Range) 방식에 대해서 정리해보겠습니다. 

 

IQR 방식은 사분위(Quantile) 개념으로부터 출발합니다. 

전체 데이터들을 오름차순으로 정렬하고, 정확히 4등분(25%, 50%, 75%, 100%)으로 나눕니다.

여기서 75% 지점의 값과 25% 지점의 값의 차이를 IQR이라고 합니다!! 

 

https://towardsdatascience.com/understanding-boxplots-5e2df7bcbd51

 

이 IQR에 1.5를 곱해서 75% 지점의 값에 더하면 최댓값, 25% 지점의 값에서 빼면 최솟값으로 결정합니다.

이 때, 결정된 최댓값보다 크거나 최솟값보다 작은 값을 이상치 라고 간주합니다.

개념은 알았으니 이제 코드로 구현해볼까요?!

 

import numpy as np

def get_outlier(df=None, column=None, weight=1.5):
  # target 값과 상관관계가 높은 열을 우선적으로 진행
  quantile_25 = np.percentile(df[column].values, 25)
  quantile_75 = np.percentile(df[column].values, 75)

  IQR = quantile_75 - quantile_25
  IQR_weight = IQR*weight
  
  lowest = quantile_25 - IQR_weight
  highest = quantile_75 + IQR_weight
  
  outlier_idx = df[column][ (df[column] < lowest) | (df[column] > highest) ].index
  return outlier_idx

# 함수 사용해서 이상치 값 삭제
oulier_idx = get_outlier(df=df, column='A', weight=1.5)
df.drop(outlier_idx, axis=0, inplace=True)