본문 바로가기

스파르타 코딩클럽/[강의] 머신러닝

[머신러닝 심화] 데이터 분석 프로세스 - 데이터 전처리(이상치)

이상치(Outlier)

  • 보통 관측된 데이터 범위에서 많이 벗어난 아주 작은 값 혹은 큰 값을 의미
  • ESD(Extreme Studentized Deviation)를 이용한 이상치 발견
    • 데이터가 정규분포를 따른다고 가정할 때, 평균에서 표준편차의 3배 이상 떨어진 값
    • 모든 데이터가 정규분포를 따르지 않을 수 있기 때문에 다음 상황에서는 제한됨
      ➡️ 데이터가 크게 비대칭일 때(Log변환 등을 노려볼 수 있음)
      ➡️ 샘플 크기가 작을 경우
  • IQR(Inter Quantile Range)를 이용한 이상치 발견
    • ESD와 동일하게 데이터가 비대칭적이거나 샘플사이즈가 작은 경우 제한됨
    • Box plot
      • IQR = Q3 - Q1
      • 상한 이상치 = Q3 + 1.5*IQR
      • 하한 이상치 = Q1 - 1.5*IQR
  • 조건필터링을 통한 삭제(a.k.a. boolean Indexing) : df[ df['column'] > limit_value]
  • 이상치는 주관적인 값으로, 해당 데이터를 삭제할지 말지는 분석가가 결정할 몫이다.
  • 도메인과 비즈니스 맥락에 따라 기준이 달라지며 데이터 삭제 시 품질을 좋아질 수 있지만 정보 손실을 동반하기 때문에 이상치 처리에 주의해야한다.

 

ESD 이상치 처리 실습
import numpy as np 
mean = np.mean(tips_df['total_bill'])
std = np.std(tips_df['total_bill'])
upper_limit = mean + 3*std
lower_limit = mean - 3*std
print(upper_limit, lower_limit)

## 46.43839435626422 -6.866509110362578
cond = (tips_df['total_bill'] > upper_limit)
cond

## True, False 값 출력
tips_df[cond]

## cond의 값이 True인 데이터만 출력

 

 

IQR 이상치 처리 실습(Box plot)
import seaborn as sns
sns.boxplot(tips_df['total_bill'])

q1 = tips_df['total_bill'].quantile(0.25)
q3 = tips_df['total_bill'].quantile(0.75)
iqr = q3 - q1
upper_limit2 = q3 + 1.5*iqr
lower_limit2 = q1 - 1.5*iqr 

print(q1) ## 13.3475
print(q3) ## 24.127499999999998
print(iqr) ## 10.779999999999998
print(upper_limit2) ## 40.29749999999999
print(lower_limit2) ## -2.8224999999999945
cond2 = (tips_df['total_bill'] > upper_limit2)
tips_df[cond2]