Python/Pandas

[Pandas] 파이썬 IQR 기반 이상치(outlier) 탐지 및 제거 방법

jimmy_AI 2022. 5. 30. 23:04
반응형

파이썬 판다스 이상값 찾기, 처리 예제

파이썬의 데이터프레임 내에서 각 열 내에서 이상치(outlier)를 찾아보고

이를 제거해보는 방법을 간단한 예제를 통하여 이해하기 쉽게 다루어보도록 하겠습니다.

 

여기서는 IQR을 기반으로 이상치를 탐지하는 예시를 다루었으며,

이상치의 기준은 아래와 같습니다.

 

Q3 : 100개의 데이터로 가정 시, 25번째로 높은 값에 해당합니다.

Q1 : 100개의 데이터로 가정 시, 75번째로 높은 값에 해당합니다.

IQR : Q3 - Q1의 차이를 의미합니다.

이상치 : Q3 + 1.5 * IQR보다 높거나 Q1 - 1.5 * IQR보다 낮은 값을 의미합니다.

 

참고로, outlier의 경계 기준은 데이터의 분포와 사용하는 상황에 맞게 조절할 수 있습니다.

 

이해를 돕기 위하여 아래와 같이 100명의 학생들의 국어, 수학 점수 정보가

포함되어있는 간단한 데이터프레임 df를 생각해보겠습니다.

 

 

Step 1 : 컬럼별 Q3, Q1, IQR 값 구하기(quantile 함수 이용)

먼저, 각 열별의 Q3, Q1 및 IQR 값을 미리 구해두는 것이 좋습니다.

이는 백분위수를 구해주는 quantile 함수를 적용하여 쉽게 구할 수 있으며,

아래 코드처럼 데이터프레임 전체 혹은 특정 열에 대하여 모두 적용이 가능합니다.

q3 = df.quantile(0.75) # df['국어'].quantile(0.75) 처럼 특정 열만 적용 가능
q1 = df.quantile(0.25)

iqr = q3 - q1

위에서 구한 Q3, Q1, IQR 값을 출력해본 결과의 예시는 다음과 같습니다.

(기본적으로 Series 형태로 반환됩니다.)

 

반응형

Step 2 : 각 값의 이상치 여부 판별하기(apply 함수 이용)

앞 과정에서 구한 Q3, Q1 및 IQR가 저장된 Series를 활용하여

특정 열에 대하여 각 데이터의 outlier 여부 판별을 진행할 수 있습니다.

 

apply 함수를 통하여 각 값의 이상치 여부를 한 번에 쉽게 구할 수 있으며,

'국어' 열에 대하여 이상값 여부 판별 결과를 구하여 저장한 예시는 아래와 같습니다.

(outlier 경계 기준을 바꾸고 싶은 경우에는 if문 내의 식을 바꿔서 적용해주시면 됩니다.)

# '국어' 열에 대하여 이상치 여부를 판별해주는 함수
def is_kor_outlier(df):
    kor_score = df['국어']
    if kor_score > q3['국어'] + 1.5 * iqr['국어'] or kor_score < q1['국어'] - 1.5 * iqr['국어']:
        return True
    else:
        return False

# apply 함수를 통하여 각 값의 이상치 여부를 찾고 새로운 열에 결과 저장
df['국어_이상치여부'] = df.apply(is_kor_outlier, axis = 1) # axis = 1 지정 필수

df

 

 

Step 3 : 이상치 행 제거하기

이제 앞 스텝에서 구한 이상치 정보를 바탕으로 이상치 행을 제거해보겠습니다.

 

이는 loc 함수를 이용한 조건 필터링을 통하여 이상치 여부가 False로 판별된 행들만 남긴 뒤,

outlier 여부를 구했던 열을 제거해주시면 원래 데이터프레임에서 이상치 행만 제거된 결과를

얻을 수 있게 됩니다.

# 이상치인 행은 제거하여 필터링
df_trim = df.loc[df['국어_이상치여부'] == False]

# 이상치여부를 나타내는 열 제거
del df_trim['국어_이상치여부']

df_trim

2개의 이상치 행이 제거된 모습(2번 인덱스 행도 사라졌습니다.)을 살펴볼 수 있었습니다.