ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [seaborn] 데이터프레임으로 박스플롯 그리기 :: sns.boxplot
    직접 해보기/Python 2024. 6. 27. 22:37
    728x90
    반응형

    ✅ 박스플롯 (Box plot)

    박스플롯 (Box plot) matplotlib 메소드 seaborn 메소드
    중앙값을 포함한 사분위수를 시각화하는 통계분석 도구
    •박스플롯으로 볼 수 있는 통계량
       - 제1사분위수(25%), 중앙값(50%), 제3사분위수(75%)
       - IQR (InterQuartile Range) = 제3사분위수 - 제1사분위수
       - 최솟값 = 제1사분위수 - 1.5*IQR 보다 큰 값들 중 최솟값
       - 최댓값 = 제3사분위수 + 1.5*IQR 보다 작은 값들 중 최댓값
       - 이상치 = 위 최댓값과 최솟값을 넘어가는 값들
    plt.boxplot() sns.boxplot()

    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️⃣  sns 박스플롯 그리기  ::  sns.boxplot

    • 박스플롯 생성: sns.boxplot(data=데이터프레임, x=범주, y=수치)
    # 박스플롯 생성
    sns.boxplot(data=df, x='arrival_time', y='price')

     

    • 박스플롯을 보니 시간대별로 최솟값, 제1사분위수, 중앙값은 크게 차이나지 않고 비슷한 편이네요.
    • 이른아침과 심야 비행편이 눈에 띄게 낮은 가격대에 분포하고 있습니다. 제3사분위수가 다른 시간대에 비해 상당히 낮네요. 
      아래와 같이 평균값을 도출해봐도 꽤 낮은 가격입니다. 다만 박스플롯에서 보이듯이 높은 가격의 이상치도 많습니다.

     


    2️⃣  박스플롯 커스터마이징

    • 아래와 같이 다양한 요소로 박스플롯의 디자인요소를 커스텀할 수 있습니다.
    • boxplot 생성 시 hue 요소를 추가하여, 분류할 카테고리 변수를 추가할 수도 있습니다.
    # 그래프 스타일 및 한글출력 설정
    sns.set_theme(
        style = 'whitegrid',                   # 그래프 배경 지정
        font = 'NanumBarunGothic',             # 한글 폰트 지정
        rc = {'figure.figsize' : (12,6),       # 그래프 크기 지정
              'axes.unicode_minus' : False}
    )
    # 박스플롯 생성
    boxplot = sns.boxplot(
        data=df, x='arrival_time', y='price',  # 데이터 지정 
        hue='class',                           # 색상으로 구분할 카테고리 변수 
        width=.5,                              # 박스 두께
        fliersize = 2,                         # 이상치 점 크기
        palette=plt.cm.Set3.colors             # 색상 팔레트 지정
    )
    # 축 범위, 축 이름, 그래프 제목 지정하기
    boxplot.set(
        xlabel = '출발시간 (arrival_time)',
        ylabel = '가격 (price)',
        title = '출발시간에 따른 좌석별 가격 박스플롯'
    )

     

    • 출발시간에서 좌석클래스로 한번더 카테고리를 나누고 보니
      이코노미석은 시간대별로 차이가 그렇게 크지 않고, 분포도 넓지 않은 편입니다.
      그에 비하면 비즈니스석은 시간대에 따라 차이가 약간 있는 편이고, 가격 분포가 상당히 넓습니다.
    • 위에서 좌석을 나누기 전에는 이른아침과 심야시간 가격대가 낮고, 높은 이상치가 많은 편이었는데
      이렇게 나누고 보니 높은 이상치는 비즈니스석 가격이었던 것 같네요. 

     

     

    728x90
    반응형