본문 바로가기
ML & DL/시각화 도구

Seaborn tutorial (1-1) : relplot() - scatter plot

by 별준 2020. 11. 4.

* v0.11.0 기준으로 작성되었습니다.

 Seaborn

seaborn은 data visualization(데이터 시각화)을 위한 파이썬 라이브러리입니다. seaborn은 matplotlib이라는 파이썬 시각화 라이브러리를 기반으로 구성되어 있으며, 쉽고 편리하게 그래프를 그리도록 high-level의 인터페이스를 제공하고 있습니다.

 

예를 들면, 아래와 같이 그래프를 그릴 수 있죠.

# Import seaborn
import seaborn as sns

# Apply the default theme
sns.set_theme()

# Load an example dataset
tips = sns.load_dataset("tips")

# Create a visualization
sns.relplot(
    data=tips,
    x="total_bill", y="tip", col="time",
    hue="smoker", style="smoker", size="size",
)

 

또한, matplotlib을 기반으로 하였기 때문에 matplotlib과 섞어서 사용이 가능한데, 자세한 내용은 API를 설명하면서 언급해보도록 하겠습니다. 

 

이 게시글에서는 statistical relationships을 시각화하기 위한 API인 relplot(), scatterplot(), lineplot()에 대해서 알아보도록 하겠습니다.

- Functions for visualizing statistical relationships

통계를 시각화하기 위한, Relational plots을 그리기 위한 API는 relplot(), scatterplot(), lineplot()이 있습니다. 

아래는 공식 문서 API reference의 내용입니다.

 

Relational Plot

 

relplot(*
[, x, y, hue, size, style, data, …])

Figure-level interface for drawing relational plots onto a FacetGrid.

scatterplot(*
[, x, y, hue, style, size, …])

Draw a scatter plot with possibility of several semantic groupings.

lineplot(*
[, x, y, hue, size, style, data, …])

Draw a line plot with possibility of several semantic groupings.

 

Relational Plot을 위한 함수는 위와 같이 3개가 존재합니다. 가장 많이 사용되는 함수는 replot() 함수인데, 이 함수는 설명에 나와있듯이 figure-level의 interface입니다.

 

그렇다면 figure-level이 무엇이냐 ?

아까전에 seaborn은 matplotlib을 기반으로 구성되어 있다고 했는데, figure-level은 matplotlib과 별개로 seaborn 자체의 figure를 만들어서 plotting하는 것이라고 볼 수 있습니다. 정확하게는 이야기하면 seaborn의 FacetGrid로 Return합니다.

이렇게 FacetGrid를 반환하는 함수를 figure-level function이라고 합니다.

 

반대로 matplotlib을 베이스로하는 axes-level function이 있습니다.

axes-level function은 matplotlib.axes.Axes를 반환하며, matplotlib의 data type을 반환하기 때문에 matplotlib 메소드를 사용해서 섞어서 사용이 가능하게 됩니다.

 

위 API에서 relplot()은 figure-level function이며, scatterplot(), lineplot()은 axes-level function입니다. 

이 게시글에서 주로 사용해볼 함수는 relplot()인데, 이 함수는 scatter plot과 line plot을 사용해서 plotting할 수 있으며, FacetGird와 axes-level function인 scatterplot()과 lineplot() 중에 하나를 결합해서 그래프를 그리게 됩니다.

 

예제를 통해서 보겠지만, relplot을 사용하고 매개변수 kind="scatter"나 kind="line"을 통해서 그래프 종류를 선택할 수 있고, kind 매개변수를 지정하지 않으면 scatter가 기본으로 적용됩니다. 간단하게 사용하기에는 그냥 relplot()만 알고있어도 충분히 그래프를 그리는 것에는 문제가 없을 것 같고, 색상이나 추가적인 커스터마이징이 많이 필요한 경우에 matplotlib의 메소드와 함께 사용하면 될 것 같습니다.

 

seaborn 공식 사이트에 있는 튜토리얼을 가지고 relplot()에 대해 알아보도록 하겠습니다.

- Tutorial

데이터는 보통 numpy나 pandas에서 사용되는 data type을 사용하므로, 필요한 패키지들을 우선 import 해줍니다. 5 line의 set_theme는 plot의 style을 지정해주며, 자세한 내용은 공식 문서를 참조바랍니다.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_theme(style="darkgrid")

1. scatter plots

seaborn에 scatter plot은 다양한 방법으로 그릴 수 있습니다. 가장 기본적인 방법은 관계를 보고자하는 두 변수가 numeric일 때, scatterplot()을 사용하는 것입니다. (categorical하는 변수들의 scatter plot은 다음에 보도록 하겠습니다.)

위에서 언급했지만, scatterplot()은 relplot()의 default이며, relplot()의 매개변수 kind="scatter"를 사용해서 지정할 수도 있습니다.

 

우선 예제에 필요한 데이터를 읽어봅시다. 

tips = sns.load_dataset("tips")
tips.head()

seaborn에 내장되어 있는 dataset으로 tip에 관련된 데이터입니다.

 

기본적으로 total_bill에 따른 tip 정도를 비교하는 scatter plot을 그려봅시다. 사용되는 매개변수는 직관적으로 무엇인지 확인이 가능합니다. x는 x축의 사용되는 변수, y는 y축으로 사용되는 변수이며, data는 사용되는 dataset입니다. 사용할 수 있는 dataset으로는 pandas.DataFrame, numpy.ndarray, mapping or sequence가 가능합니다.(참고로 tips의 type은 pandas의 DataFrame입니다)

sns.relplot(x="total_bill", y="tip", data=tips)

 

2차원에서 points를 통해서 그래프를 그렸지만, points에 색을 입혀서 다른 변수를 추가할 수 있습니다. points 색깔을 입히는 방법은 'hue semantic'을 사용하면 되며, hue 매개변수에 사용되는 변수를 지정해주면 됩니다.

sns.relplot(x="total_bill", y="tip", hue="smoker", data=tips)

여기서는 smoker정보를 추가했으며, tip을 낸 사람이 흡연자인지 아닌지 확인할 수 있는 정보입니다. 또한, 이러한 class 구분을 강조하기 위해서 마커 스타일을 변경할 수 있는데, 이것은 style 매개변수를 통해서 가능합니다. 

sns.relplot(x="total_bill", y="tip", hue="smoker", style="smoker", data=tips)

hue와 style 매개변수를 사용했는데, 각각 다른 변수를 사용해서 총 4개의 변수를 그래프에 나타낼 수 있습니다. 하지만 그래프가 조잡해질 수도 있으므로 주의해서 사용해야합니다. 예제에서는 style에 time 변수를 추가해서, tip을 낸 시간대의 정보를 마커로 구분해서 나타내고 있습니다.

sns.relplot(x="total_bill", y="tip", hue="smoker", style="time", data=tips)

지금까지 smoker나 time 변수 값이 카테고리였기 때문에, 기본적으로 qualitative palette가 적용되었습니다. 만약 hue semantic이 numeric(수치)일 경우에는 기본 색상이 sequential palette로 변경되며, 그라데이션으로 색이 지정됩니다.

sns.relplot(x="total_bill", y="tip", hue="size", data=tips)

이렇게 적용되는 color palette는 커스터마이징이 가능합니다. 아래는 palette 매개변수에 string으로 값을 지정해서 color_palette()를 통해 색상을 지정했습니다. 커스터마이징하기 시작하면 조금 복잡해지기 때문에, 개인적으로는 표시해야되는 정보들이 너무 많지 않다면 그냥 기본으로 사용해도 무관해보입니다.

sns.relplot(x="total_bill", y="tip", hue="size", palette="ch:r=-.5,l=.75", data=tips)

각 point의 크기도 조절이 가능한데, size 매개변수를 통해서 가능합니다.

sns.relplot(x="total_bill", y="tip", size="size", data=tips)

포인트의 크기는 matplotlib.pyplot.scatter()와는 다르게, 값에 따라 크기가 지정되는 것이 아닙니다.

무슨 말이냐면, 만약 1과 40이 있다면 40의 포인트 크기가 1보다 40배 큰 것이 아니라는 것입니다. 대신, 포인트 넓이의 범위를 지정해서 크기를 커스터마이징할 수 있습니다. sizes 매개변수를 통해서 적용할 수 있습니다.

sns.relplot(x="total_bill", y="tip", size="size", sizes=(15, 200), data=tips)

 

다음 게시글에서 이어서 lineplot을 알아보도록 하겠습니다.

댓글