ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [seaborn] 산점도에 회귀선 회귀식 추가하기 :: sns.lmplot sns.regplot
    직접 해보기/Python 2024. 6. 29. 17:12
    728x90
    반응형

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

    • 예시가 될 데이터셋은 Kaggle에서 가져온 Flight Price Prediction 입니다.
    • 좌석(class) 이코노미석인 데이터셋만 걸러서, 비행까지 남은일수(days_left)와 가격(price)간의 관계를 알아보니
      상관계수 약 -0.56로 상당한 음의 상관관계를 보여주고 있네요.
    • 산점도와 회귀선까지 시각화해서 두 칼럼간의 관계를 좀더 분석해보겠습니다.
    # 패키지 불러오기
    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')
    
    # 좌석(class) 이코노미석인 데이터셋만 선택
    df_economy = df[df['class']=='Economy']
    
    # 비행기 출발까지 남은일수(days_left)와 가격(price)간의 상관관계 알아보기
    df_economy.corr(numeric_only=True)['days_left']


    1️⃣  sns 산점도 + 선형회귀 직선 그리기  ::  sns.lmplot

    • seaborn의 lmplot() 메소드로 산점도와 선형회귀 직선을 함께 그릴 수 있습니다.
    # lmplot으로 산점도+회귀선 그리기
    sns.lmplot(
        data = df_economy, x = 'days_left', y = 'price',               # 데이터 지정
        scatter_kws = {'color':'orange', 'alpha':0.5}, markers = '+',  # 산점도 디자인
        line_kws = {'color':'green'}                                   # 회귀선 디자인
    )

     

    • col 혹은 row 요소를 추가해서, 또다른 범주형 데이터를 기준으로 분리해서 서브플롯을 여러개 그릴수도 있습니다.
    • 아래는 col = 'stops' 를 추가하여, 경유횟수에 따라 그래프를 나눠 그려본 결과입니다. 
      경유하지 않는 경우(맨 왼쪽)은 상관관계가 비교적 약해보이는데, 경유횟수가 많아질수록 음의 상관관계가 강해지는 것 같아요.
    # 경유횟수(stops)에 따라 나눠서 그래프 여러개 그리기
    sns.lmplot(
        data = df_economy, x = 'days_left', y = 'price',               # 데이터 지정
        scatter_kws = {'color':'orange', 'alpha':0.5}, markers = '+',  # 산점도 디자인
        col = 'stops',                                                 # 특정 카테고리로 분리해서 서브플롯 생성
        line_kws = {'color':'green'}                                   # 회귀선 디자인
    )


    2️⃣  선형회귀 직선에 회귀식 추가하기  ::  sns.regplot + scipy

    • 회귀직선의 회귀식을 알고 싶다면, scipy 패키지를 불러와서 직선의 기울기와 절편값을 가져오면 됩니다.
    • 다만, 이때는 lmplot 대신 regplot으로 산점도+회귀선을 작성해야 직선의 정도들을 가져올 수 있습니다.
    • 사용하는 scipy의 메소드는 scipy.stats.linregress() 입니다. 아래 코드를 참고해주세요.
    # 그래프 스타일 및 한글출력 설정
    sns.set_theme(
        style = 'ticks',             # 그래프 배경 지정
        font = 'NanumBarunGothic',   # 한글 폰트 지정
        rc = {'axes.unicode_minus' : False}
    )
    # regplot으로 산점도+회귀식 그리기
    regplot1 = sns.regplot(
        data = df_economy, x = 'days_left', y = 'price',          # 데이터 지정
        scatter_kws = {'color':'grey', 'alpha':0.5}, marker='+',  # 산점도 디자인
        line_kws = {'color':'red'}                                # 회귀선 디자인
    )
    # 회귀직선에서 기울기, 절편값 가져오기
    slope, intercept, r, p, sterr = scipy.stats.linregress(
        x = regplot1.get_lines()[0].get_xdata(),
        y = regplot1.get_lines()[0].get_ydata()
    )
    # 그래프에 회귀식 추가 출력
    plt.text(
        x = 25, y = 35000,                                            # 회귀식 출력할 위치 지정
        s = 'y = '+str(round(slope,2))+'x + '+str(round(intercept,2)) # 회귀식 구성 (소수점 둘째자리까지 반올림)
    )
    # 축 범위, 축 이름, 그래프 제목 지정하기
    regplot1.set(
        xlabel = '출발까지 남은일수 (days_left)',
        ylabel = '가격 (price)',
    )


     

     

    728x90
    반응형