본문 바로가기

💻프로그래밍/python

파이썬 데이터 이상치(outlier) 제거 방법, 박스플롯(Boxplot) IQR

반응형

 

00. 이상치(Outlier)

데이터 분석을 할 때 데이터 전처리에 많은 시간을 할애하게 된다. 데이터 전처리 단계에서 해야 하는 것은 여러 가지가 있겠지만 그중 데이터 이상치 처리에 대해 정리하고자 한다. 데이터에 이상치가 많이 포함되어 있을 경우, 모델의 성능을 저하시킬 수 있기 때문에 이를 처리해주는 것이 필요하다. (이때, 이상치라고 해서 무조건 제거해야하는것은 아니고 해당 도메인에 맞게 판단하는 것이 필요함)

 

 

01. 박스플롯(Boxplot)을 통한 이상치 확인

그렇다면 내가 가지고 있는 데이터셋에 이상치가 있는지 어떻게 확인할 수 있으며 무엇을 기준으로 해당 데이터 값을 이상치라고 판단할 수 있을까?

 

이를 위해서는 박스플롯(Boxplot)을 알면 좋은데,

위 그림과 같이 상자 수염 도표를 이용하여 데이터의 분포와 패턴을 파악하거나

해당 데이터셋에 이상치가 있는지 시각적으로 나타낸 것을 '박스 플롯(Box plot)'이라고 한다. 

 

 

박스 플롯의 사분위 범위(IQR)를 이용하여 이상치 포함 여부를 확인할 수 있으며, 이때 사분위 범위는 Q3-Q1의 값을 의미한다.(위의 그림에서 분홍색 박스 범위에 해당됨) 이상치 판단 기준은 Q1 - 1.5*IQR 미만에 해당되는 값 또는 Q3 + 1.5*IQR초과에 해당되는 값으면 보통 이상치로 볼 수 있다.(위의 그림에서 초록색 데이터) 하지만 조금 더 정확히는 해당 부분에 위치해있더라도 이상치가 아닐 가능성도 있기 때문에 도메인 지식을 통해 해당 데이터의 특성을 파악해야 조금 더 정확하게 처리할 수 있다.

 

 

02.  이상치 제거(파이썬 코드)

 

위의 액티그래피 데이터를 변형한 샘플 데이터이다. 액티 그리피는 휴대용 장치를 통해 신체의 움직임을 측정하고 기록하는 것인데, 일반적으로 애플 워치과 같은 형태로 손목에 착용하여 인간의 활동상태에 대해 측정할 수 있다. x, y, z 축으로 구성되어있으며 아무런 움직임이 없을 경우 0 값으로 표시되며, 값의 절댓값이 커질수록 큰 움직임이 발생했다고 해석하면 된다.

 

 

전체 데이터프레임중, 하나의 칼럼(X축 가속도계)에 대해 boxplot을 그려 데이터의 분포 및 이상치를 확인해 보았을 때 빨간색으로 표시한 부분들이 이상치라고 볼 수 있다.

 

 

Q1 = df[['x_acc', 'y_acc', 'z_acc']].quantile(q=0.25)
Q3 = df[['x_acc', 'y_acc', 'z_acc']].quantile(q=0.75)
print(Q1)
print(Q3)

 

 

 

 

IQR = Q3-Q1
IQR

 

IQR_df = df[(df['x_acc'] <= Q3['x_acc']+1.5*IQR['x_acc']) & (df['x_acc'] >= Q1['x_acc']-1.5*IQR['x_acc'])]
IQR_df = IQR_df[(IQR_df['y_acc'] <= Q3['y_acc']+1.5*IQR['y_acc']) & (IQR_df['y_acc'] >= Q1['y_acc']-1.5*IQR['y_acc'])]
IQR_df = IQR_df[(IQR_df['z_acc'] <= Q3['z_acc']+1.5*IQR['z_acc']) & (IQR_df['z_acc'] >= Q1['z_acc']-1.5*IQR['z_acc'])]

IQR_df = IQR_df[['x_acc','y_acc','z_acc']]

print('original_df :', len(df))
print('IQR_df :', len(IQR_df))

 

반응형