ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Chapter 04-3 seaborn 라이브러리 자유자재로 사용하기
    Do it! 판다스 입문 2022. 6. 20. 14:34

    04-2에서는 seaborn 라이브러리의 tips 데이터 집합만 사용했지만 이번에는 seaborn 라이브러리 자체를 활용하여 그래프도 그려보겠습니다. seaborn 라이브러리를 활용하면 matplotlib보다 좀 더 화려한 그래프를 그릴 수 있습니다.

     

     

    다변량 그래프 그리기 - 히스토그램

    1. 지금부터는 seaborn 라이브러리를 sns라는 이름으로 줄여 사용하겠습니다. 다시 tips 데이터 집합을 불러옵니다.

    import seaborn as sns

    tips = sns.load_dataset("tips")

     

    2. seaborn 라이브러리로 히스토그램을 그리려면 subplots, distplot 메서드를 사용하면 됩니다. 먼저 subplots 메서드로 기본 틀을 만들고 distplot 메서드에 total_bill 열 데이터를 전달하면 히스토그램을 그릴 수 있습니다.

    ax = plt.subplots( )
    ax = sns.distplot(tips['total_bill'])
    ax.set_title('Total Bill Histogram with Density Plot')

     

    3. 이때 distplot 메서드를 사용하면 히스토그램과 밀집도 그래프를 같이 그립니다. 만약 밀집도 그래프를 제외하고 싶다면 kde 인잣값을 False로 설정하면 됩니다.

    ax = plt.subplots( )
    ax = sns.distplot(tips['total_bill'], kde=False)
    ax.set_title('Total Bill Histogram')
    ax.set_xlabel('Total Bill')
    ax.set_ylabel('Frequency')

     

    4. 밀집도 그래프만 나타내려면 hist 인자를 False로 지정하면 됩니다.

    ax = plt.subplots( )
    ax = sns.distplot(tips['total_bill'], hist=False)
    ax.set_title('Total Bill Histogram')
    ax.set_xlabel('Total Bill')
    ax.set_ylabel('Frequency')

     

    5. 실무 환경에서는 데이터 시각화를 더 효율적으로 하기 위해 여러 그래프를 한 번에 출력하는 경우가 많습니다. 다음은 히스토그램과 밀집도를 그리는 distplot 메서드에 rug 인자를 추가하여 양탄자(rug) 그래프까지 그린 것입니다.

    ax = plt.subplots( )
    ax = sns.distplot(tips['total_bill'], rug=True)
    ax.set_title('Total Bill Histogram with Density and Rug Plot')
    ax.set_xlabel('Total Bill')

     

    6. 이번에는 히스토그램과 비슷하게 생긴 count 그래프를 그려보겠습니다. count 그래프는 이산값을 나타낸 그래프입니다. 다음은 countplot 메서드에 tips 데이터프레임의 day 열 데이터를 넣어 count 그래프를 그린 것입니다.

    ax = plt.subplots( )
    ax = sns.countplot('day', data=tips)
    ax.set_title('Count of days')
    ax.set_xlabel('Day of the Week')
    ax.set_ylabel('Frequency')

     

     

    다양한 종류의 이변량 그래프 그리기

    1. seaborn 라이브러리로 산점도 그래프 그리기

    seaborn 라이브러리는 matplotlib 라이브러리보다 다양한 방법으로 산점도 그래프를 그릴 수 있습니다. 산점도 그래프를 그리려면 seaborn 라이브러리의 regplot 메서드를 사용해야 합니다. regplot 메서드를 사용하면 산점도 그래프와 회귀선을 함께 그릴 수 있습니다. 만약 회귀선을 제거하려면 fit_reg 인자를 False로 지정하면 됩니다.

    ax = plt.subplots( )
    ax = sns.regplot(x='total_bill', y='tip', data=tips)
    ax.set_title('Scatterplot of Total Bill and Tip')
    ax.set_xlabel('Total Bill')
    ax.set_ylabel('Tip')

    ax = plt.subplots( )
    ax = sns.regplot(x='total_bill', y='tip', data=tips, fit_reg=False)
    ax.set_title('Scatterplot of Total Bill and Tip')
    ax.set_xlabel('Total Bill')
    ax.set_ylabel('Tip')

     

    2. 이번에는 산점도 그래프와 히스토그램을 한 번에 그려주는 jointplot 메서드를 사용해 보겠습니다. x, y 인자에 원하는 열 이름을 지정하고 data 인잣값으로 데이터프레임을 지정하면 그래프를 그릴 수 있습니다.

    joint = sns.jointplot(x='total_bill', y='tip', data=tips)
    joint.set_axis_labels(xlabel='Total Bill', ylabel='Tip')
    joint.fig.suptitle('Joint Plot of Total Bill and Tip', fontsize=10, y=1.03)

     

    3. 산점도 그래프는 점이 겹쳐 보일 경우 점을 구분하기 어렵다는 단점이 있습니다. 만약 산점도 그래프의 데이터를 구분하기 쉽게 그리고 싶다면 육각 그래프(hexbin)를 사용하면 됩니다. 육각 그래프는 2차원 표면에 육각형으로 데이터를 쌓아 표현하는 그래프입니다. 그래서 특정 데이터의 개수가 많아지면 점점 진한 색으로 표현됩니다. 육각 그래프는 과정 2에서 사용한 jointplot 메서드를 그대로 사용합니다. 대신 kind 인잣값을 hex로 지정하면 됩니다.

    hexbin = sns.jointplot(x="total_bill", y="tip", data=tips, kind="hex")
    hexbin.set_axis_labels(xlabel='Total Bill', ylabel='Tip')
    hexbin.fig.suptitle('Hexbin Joint Plot of Total Bill and Tip', fontsize=10, y=1.03)

     

    4. 이차원 밀집도 그리기

    이번에는 이차원 밀집도를 그려볼까요? 이차원 밀집도는 kdeplot 메서드로 만들 수 있습니다. 다음은 total_bill, tip 열 데이터를 전달하여 이차원 밀집도를 그린 것입니다. 이때 shade 인잣값을 True로 지정하면 그래프에 음영 효과를 줄 수 있습니다.

    ax = plt.subplots( )
    ax = sns.kdeplot(data=tips['total_bill'],
                    data2=tips['tip'],
                    shade=True)
    ax.set_title('Kernel Density Plot of Total Bill and Tip')
    ax.set_xlabel('Total Bill')
    ax.set_ylabel('Tip')

     

    5. 바 그래프 그리기

    이번에는 바 그래프를 그려보겠습니다. 바 그래프는 지정한 변수의 평균을 계산하여 그릴 수 있습니다. 다음은 시간에 따라 지불한 비용의 평균을 바 그래프로 나타낸 것입니다.

    ax = plt.subplots( )
    ax = sns.barplot(x='time', y='total_bill', data=tips)
    ax.set_title('Bar plot of average total bill for time of day')
    ax.set_xlabel('Time of day')
    ax.set_ylabel('Average total bill')

     

    6. 박스 그래프 그리기

    박스 그래프도 그려보겠습니다. 박스 그래프는 최솟값, 1분위수, 중간값, 3분위수, 최댓값, 이상치 등 다양한 통계량을 한 번에 표현하는 그래프입니다.

    ax = plt.subplots( )
    ax = sns.boxplot(x='time', y='total_bill', data=tips)
    ax.set_title('Boxplot of total bill by time of day')
    ax.set_xlabel('Time of day')
    ax.set_ylabel('Total Bill')

     

    7. 박스 그래프는 다양한 통계 수치를 확인하기 위해 자주 사용하는 그래프지만 데이터 분산이 모호하게 표현됩니다. 이런 경우에는 박스 그래프에 커널 밀도를 추정한 바이올린 그래프를 사용하면 됩니다. 쉽게 말해 과정 6의 박스 형태를 바이올린 형태로 바꾸면 바이올린 그래프가 됩니다. 바이올린 그래프는 violinplot 메서드를 사용하여 그릴 수 있습니다.

    ax = plt.subplots( )
    ax = sns.violinplot(x='time', y='total_bill', data=tips)
    ax.set_title('Violin plot of total bill by time of day')
    ax.set_xlabel('Time of day')
    ax.set_ylabel('Total Bill')

     

    8. 관계 그래프 그리기

    마지막으로 관계 그래프를 그려보겠습니다. 관계 그래프는 지금까지 설명한 그래프를 종합한 그래프라고 생각하면 됩니다. 관계 그래프는 pairplot 메서드에 데이터프레임을 넣는 방법으로 간단하게 그릴 수 있습니다.

    fig = sns.pairplot(tips)

     

    9. 이때 관계 그래프는 중복된 정보가 표현된다는 단점이 있습니다. 즉, 관계 그래프의 절반(대각선을 기준으로 위)은 나머지 절반(대각선을 기준으로 아래)과 같습니다. 이런 경우에는 중복된 그래프가 그려지는 위치를 직접 사용하여 원하는 그래프로 교체하면 됩니다.

     

    map_upper 메서드는 대각선을 기준으로 위쪽에 그릴 그래프를 지정합니다. 반대로 map_lower 메서드는 대각선을 기준으로 아래쪽에 그릴 그래프를 지정합니다. map_diag는 대각선을 중심으로 그래프를 그립니다. 다음은 이차원 밀집도를 대각선 기준으로 아래쪽에, 산점도 그래프는 대각선을 기준으로 위쪽에 그린 것입니다. 히스토그램과 밀집도는 대각선을 중심으로 그려집니다.

    pair_grid = sns.PairGrid(tips)
    pair_grid = pair_grid.map_upper(sns.regplot)
    pair_grid = pair_grid.map_lower(sns.kdeplot)
    pair_grid = pair_grid.map_diag(sns.distplot, rug=True)
    plt.show( )

     

     

    다변량 그래프 그리기

    matplotlib 라이브러리로 다변량 그래프를 그렸던 것을 기억하나요? 이번에는 seaborn 라이브러리로 다변량 그래프를 그려보겠습니다.

     

    1. seaborn 라이브러리로 바이올린 그래프 그리기 - 색상 추가

    먼저 바이올린 그래프를 그리되 그래프의 색상을 추가하겠습니다. 색상을 추가하는 방법은 아주 간단합니다. violinplot 메서드에 hue 인잣값으로 색상에 사용할 열 이름을 추가하면 됩니다.

    ax = plt.subplots( )
    ax = sns.violinplot(x='time', y='total_bill', hue='sex', data=tips, split=True)

     

    2. 산점도, 관계 그래프 그리기 - 색상 추가

    산점도 그래프, 관계 그래프를 그리는 경우에도 마찬가지 방법으로 색상을 추가할 수 있습니다.

    scatter = sns.lmplot(x='total_bill', y='tip', data=tips, hue='sex', fit_reg=False)

    fig = sns.pairplot(tips, hue='sex')

     

    3. 산점도 그래프의 크기와 모양 조절하기

    이번에는 산점도 그래프의 크기와 모양을 조절해 보겠습니다. 다음은 산점도 그래프의 점 크기를 조절하여 표현한 것입니다. 산점도 그래프의 점 크기를 조절하려면 scatter_kws에 딕셔너리 형태로 인잣값을 전달하면 됩니다. 여기서는 크기만 조절하기 위해 's': tips['size']를 딕셔너리에 담아 전달했습니다.

    scatter = sns.lmplot(x='total_bill', y='tip', data=tips, fit_reg=False, hue='sex',
                         scatter_kws={'s': tips['size']*10})

     

    4. 만약 산점도 그래프의 점을 다른 기호로 표현하고 싶다면 markers 인잣값에 표현하고자 하는 기호를 리스트에 담아 전달하면 됩니다.

    scatter = sns.lmplot(x='total_bill', y='tip', data=tips, fit_reg=False, hue='sex',
                         markers=['o', 'x'], scatter_kws={'s': tips['size']*10})

     

    5. lmplot 메서드로 4개의 데이터 그룹에 대한 그래프 한 번에 그리기

    다음은 앤스콤 4분할 그래프를 lmplot 메서드로 그린 것입니다. x와 y 인자에는 앤스콤 데임터 집합의 x, y 열을 전달하고 data 인자에는 데이터프레임(anscombe)을 전달했습니다. 그런데 그래프를 자세히 살펴보면 4개의 데이터 그룹이 한꺼번에 산점도 그래프로 그려진것을 알 수 있습니다. 그룹별로 그래프를 나누어 그리려면 어떻게 해야 할까요?

    anscombe_plot = sns.lmplot(x='x', y='y', data=anscombe, fit_reg=False)

     

    6. 그룹별로 그래프를 나누어 그리려면 lmplot 메서드에 추가로 col, col_warp 인자를 설정해야 합니다. 다음은 lmplot 메서드를 사용해 데이터 그룹별로 그래프를 그린 것입니다. col_wrap 인자에는 그래프를 그릴 열의 최댓값을 지정하고 col 인자에는 데이터 그룹을 구분할 열(dataset)을 지정했습니다.

    anscombe_plot = sns.lmplot(x='x', y='y', data=anscombe, fit_reg=False,
                              col='dataset', col_wrap=2)

     

     

    * FacetGrid 클래스로도 그룹별 그래프를 그릴 수 있습니다.

    만약 lmplot 메서드를 사용하는 방법이 복잡하게 느껴진다면 FacetGrid 클래스를 사용하여 간편하게 그래프를 그릴 수도 있습니다. 이번에는 tips 데이터 집합을 사용하여 그래프를 그려보겠습니다.

     

    1. 먼저 FacetGrid에 데이터프레임과 그룹을 구분할 열 이름을 전달하여 객체를 생성합니다. 그런 다음 객체(facet)의 map 메서드에 그래프의 종류(distplot)와 x축으로 지정할 열 이름을 순서대로 전달하면 히스토그램, 밀집도, 양탄자 그래프를 그릴 수 있습니다.

    facet = sns.FacetGrid(tips, col='time')
    facet.map(sns.distplot, 'total_bill', rug=True)

     

    2. 다변량 그래프도 그려볼까요? 다음은 tips 데이터 집합의 day 열로 그룹을 구분하여 그래프를 그린 것입니다.

    facet = sns.FacetGrid(tips, col='day', hue='sex')
    facet = facet.map(plt.scatter, 'total_bill', 'tip')
    facet = facet.add_legend( )

     

    3. 이번에는 더 많은 변수를 사용하여 그래프를 그려보겠습니다. 다음은 time, smoker 열을 사용하여 산점도 그래프를 그린 것입니다. time, smoker 열은 각각 2개의 값을 가지고 있습니다(Dinner / Lunch, Yes / No). 따라서 2행 2열의 격자가 만들어집니다.

    facet = sns.FacetGrid(tips, col='time', row='smoker', hue='sex')
    facet.map(plt.scatter, 'total_bill', 'tip')

     

     

     

     

     

    출처: "판다스 입문"

Designed by Tistory.