파이썬 Python

[Python] 파이썬 판다스 사분위수 활용 데이터 이상치 제거

sseozytank 2022. 9. 15.

 

Latest Covid-19 Data in Asia.csv
0.00MB

 

| 이상치는 무엇이고, 왜 제거해야 하는 걸까? 

이상치(특이치)란 다른 관측치와 크게 다른 데이터 포인트. 어떤 의사결정을 하는데 필요한 데이터를 분석할 경우 이상치에 의해 통계분석 결과가 바뀔 수 있기 때문에 치환하거나 제거하는 것이 좋다. (본문에서는 사분위수를 활용해 이상치를 제거하는 경우만 다룬다)

 

- 유저 5명의 키가 (160,162,164,169,221)라면 평균 키가 175.2가되는 불상사가 발생한다! 

 

| 이상치는 어떻게 판단할까? 

대표적인 방법으로 사분위수 기반 이상치 판단법이 있다.

https://www.jmp.com/ko_kr/statistics-knowledge-portal/exploratory-data-analysis/box-plot.html

 

사분위수 범위를 이용해서 구하는 방법이 있다. 

25%(Q1)와 75%(Q3)를 기준으로 Q3-Q1의 범위를 구해준다. (IQR)

이 후 상한선 (Q3+1.5IQR) , 하한선 (Q1-1.5IQR)을 기준으로 이를 넘어가거나 작은 값은 이상치로 판별하는 방법이다. 

 

이외 식스시그마등을 활용하는 방법도 있지만, 이번 글에서는 사분위수를 이용한 이상치 제거만 다루도록 한다. 

 

| 파이썬으로 어떻게 구현할까? 

반복 작업이 귀찮아서 함수를 구현해놨다. 이상치를 제거하고 싶은 데이터 프레임과, 컬럼명을 입력하면 이상치를 제거해준다. 

(함수를 여러번 돌리면 계속해서 이상치기준을 바꿔가며 돌리니 주의!)

import pandas as pd
import seaborn as sns

df=pd.read_csv('Latest Covid-19 Data in Asia.csv')

df.describe()

 

현재 데이터의 형태가 이렇게 되어있다. 

이제 컬럼 하나를 정해서 이상치를 제거해보자. Active Cases 가 맘에 들어서 이 컬럼을 선택했다. 

 

현재 Active Cases의 데이터 분포는 다음과 같이 되어있다. 

sns.boxplot(y='Active Cases', data=df)

def detect_outliers(df,columns):
    q1=df[columns].quantile(0.25)
    q3=df[columns].quantile(0.75)
    iqr=q3-q1
    
    boundary=1.5*iqr
    
    index1=df[df[columns] > q3+boundary].index
    index2=df[df[columns] < q1-boundary].index 
    
    df[columns]=df[columns].drop(index1)
    df[columns]=df[columns].drop(index2)
    
    return df
detect_outliers(df,'Active Cases')

이 후 다시 박스플랏을 그려보면 

다음과 같이 이상치가 많이 사라진 것을 확인할 수 있다!  첫 박스플랏 같은 경우는 Y축 최고 눈금이 40만이었는데, 지금은 8만으로 줄어든 것을 확인할 수 있다! 

 

간단한 이상치 제거 끝. 

 

댓글