ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Pandas] 이상치 확인, 이상치 처리하기 :: Z-score 방법, IQR 방법
    직접 해보기/Python 2024. 7. 1. 15:41
    728x90
    반응형

    ✅ 이상치 (Outlier)

    이상치 (Outlier) 관측된 데이터의 일반적인 범위에서 많이 벗어난 값, 즉 너무 작은 값이나 너무 큰 값
    기준을 정해서 이상치를 처리하는 것은 필수! 이상치가 모델링 및 의사결정에 영향을 미칠 수 있기 때문.
    Z-score 방법 평균값 기반으로 이상치를 탐지하는 방법
    • 평균, 표준편차를 이용해서 특정 데이터가 평균값으로부터 얼마나 멀리 떨어져있는지 계산
         → 특정 임계값을 넘어가면 이상치로 판단

    IQR 방법 중앙 기반으로 이상치를 탐지하는 방법
    사분위수, IQR을 이용해서 특정 데이터가 중앙값으로부터 얼마나 멀리 떨어져있는지 계산
         → 박스플롯의 최솟값, 최댓값을 넘어가면 이상치로 판단

    0️⃣  패키지 & 데이터프레임 불러오기

    • 예시가 될 데이터셋은 Kaggle에서 가져온 Flight Price Prediction 입니다.
    # 패키지 불러오기
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    # 데이터셋 불러오기
    df = pd.read_csv('./Clean_Dataset.csv', encoding='cp949')
    df = df.drop([df.columns[0]], axis=1)


    1️⃣  Z-score 방법

    • Z-score 방법으로 이상치를 탐지하고 처리하는 방법은 아래와 같습니다.
    (1) 각 데이터의 Z-score 계산 데이터를 표준화(Standardization) 즉, 평균=0 표준편차=1인 정규분포에 매핑시킴.
    (2) Z-score가 임계값을 넘어가는지 판단 일반적으로 Z-score의 절댓값이 2~3보다 크면 이상치로 판단함.
    • 아래는 Z-score 방법으로 이상치를 삭제하는 함수입니다. 임계값은 데이터 특성과 상황에 따라 정할 수 있습니다.
    # Z-score로 이상치 탐지하고 처리하는 함수
    # 입력값: 데이터프레임, 이상치 처리할 칼럼 이름, 임계값
    def drop_outliers_zscore(df, column, threshold):
        
        # 각 데이터의 Z-score 계산
        z_scores = (df[column] - df[column].mean()) / df[column].std()
        
        # Z-score의 절댓값이 threshold 이하인 데이터만 남기기 (초과이면 이상치이므로 제외)
        df_drop_outliers = df[abs(z_scores) <= threshold]
        
        return df_drop_outliers

     

     

    • 칼럼은 'price', 임계값은 3으로 두고 이상치를 제외해봤어요. 원래 데이터프레임에서 602개 행이 삭제됐습니다.
    • 어떤 데이터가 삭제됐는지 한눈에 보려면 시각화해보는 것이 좋습니다.
      이상치 처리 전후 각각 히스토그램을 그려보니, 약 90000 넘어가는 너무 높은 값들이 제외된 것 같네요.


    2️⃣  IQR 방법

    • IQR 방법으로 이상치를 탐지하고 처리하는 방법은 아래와 같습니다.
    (1) 중앙값 관련 수치들 계산 데이터의 사분위수를 구하고, IQR=제3사분위수-제1사분위수 를 계산함.
    (2) 임계값을 넘어가는 데이터 판단 제3사분위수 + 1.5xIQR 보다 크거나, 제1사분위수 - 1.5xIQR 보다 작으면 이상치로 판단함.
    • IQR 방법으로 이상치를 삭제하는 함수입니다.
    # IQR로 이상치 탐지하고 처리하는 함수
    # 입력값: 데이터프레임, 이상치 처리할 칼럼 이름
    def drop_outliers_iqr(df, column):
        
        # 1.5*IQR 계산하기
        q1 = df[column].quantile(0.25)
        q3 = df[column].quantile(0.75)
        iqr = (q3 - q1) * 1.5
        
        # 이상치 제외한 결과만 남기기
        df_drop_outliers = df[(df[column] <= (q3 + iqr)) & (df[column] >= (q1 - iqr))]
        
        return df_drop_outliers

     

    • 마찬가지로 칼럼을 'price' 로 두고 이상치를 제외해봤습니다. 원래 데이터프레임에서 123개 행이 삭제됐습니다.
      아래와 같이 박스플롯 상에 찍혔던 이상치들이 전부 제외된 것을 확인할 수 있습니다.
    • 이상치로 판별된 데이터가 Z-score방법보다 적습니다. 확실히 중앙값이 평균보다 이상치에 덜 민감한 모습이네요.


     

    728x90
    반응형