ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 4. 판다스를 활용한 이상치 처리(boxplot, IQR)
    Data & ML & AI/Pandas & Scikit-Learn 2022. 5. 29. 14:56
    반응형

    데이터 분석과 모델학습에 있어 이상치(outlier)가 단 한개라 하더라도 큰 영향을 미칠 수 있기 때문에 처리해줄 필요가 있습니다.
    일반적으로 이상치는 제거하는 방식으로 처리합니다.

    이상치를 확인할 수 있는 가장 쉬운 방식 중 하나는 boxplot을 그려보는 것입니다.

     

    1. box plot으로 이상치 확인하기

    stock_market.csv
    0.04MB

    # matplotlib
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    import matplotlib.font_manager as fm
    
    plt.rcParams['axes.unicode_minus'] = False  # matplotlib 마이너스기호 표시
    plt.rc('font', family='NanumGothic')  # matplotlib 한글폰트 표시
    
    # pandas
    import pandas as pd
    
    # data
    df = pd.read_csv('stock_market.csv')
    
    df.boxplot(column=['Dividend','PBR'])

    특히 PBR에서 상 하로 , 하로 극단적인 값들이 보입니다.

    칼럼 몇개만 선정하여 그려볼 수도 있습니다.
    여기서는 그래프가 어느정도 눈에 들어오도록 2개의 칼럼만 임의로 선택해 진행했습니다.

     

    그리고 이상치 처리후 변화양상을 보기 위해, 히스토그램도 함께 살펴보겠습니다.

    original_df = df[['Dividend','PBR']]
    original_df.hist(bins=20, figsize=(10,5))

     

    2. 이상치 처리

    이상치를 처리하는 기준과 방법은 분야과 분석자의 주관에 따라 크게 다릅니다.
    여기서는 일반적으로 쉽게 처리하는 방식 중 하나인 IQR(Inter-Quartile Range)를 기준으로 이상치를 제거하겠습니다.

     

    IQR = Q3(3사분위수)-Q1(1사분위수)
    제거기준 = (Q3 + IQR * 1.5 보다 큰 값) & (Q1 - IQR * 1.5 보다 작은 값)

     

    1) Q1, Q3, IQR 정의하기

    Q1 = df[['Dividend','PBR']].quantile(q=0.25)
    Q3 = df[['Dividend','PBR']].quantile(q=0.75)
    print(Q1)
    print(Q3)
    Dividend    1.01
    PBR         0.43
    Name: 0.25, dtype: float64
    Dividend    3.4600
    PBR         1.3675
    Name: 0.75, dtype: float64
    IQR = Q3-Q1
    IQR
    Dividend    2.4500
    PBR         0.9375
    dtype: float64

    2) 이상치 데이터 제거하기 (이상치가 아닌 데이터만 채택하기)

    IQR_df = df[(df['Dividend'] <= Q3['Dividend']+1.5*IQR['Dividend']) & (df['Dividend'] >= Q1['Dividend']-1.5*IQR['Dividend'])]
    IQR_df = IQR_df[(IQR_df['PBR'] <= Q3['PBR']+1.5*IQR['PBR']) & (IQR_df['PBR'] >= Q1['PBR']-1.5*IQR['PBR'])]
    IQR_df = IQR_df[['Dividend','PBR']]
    
    print('original_df :', len(original_df))
    print('IQR_df :', len(IQR_df))
    original_df : 250
    IQR_df : 173

    250개 데이터 중, 이상치 제거 과정에서 살아남은 데이터 개수는 173개입니다.

     

    IQR_df.boxplot()

    IQR_df.hist(bins=20, figsize=(10,5))

    특히 PBR에서 극단적으로 크거나 작은 값이 사라진 것을 확인할 수 있습니다.

    반응형

    댓글

Designed by Tistory.