seaborn 시각화 패키지 소개

seaborn은 matplotlib을 기반으로 다양한 색상 테마와 통계용 챠트 등의 기능을 추가한 시각화 패키지이다. 당연히 matplotlib 패키지에 의존하며 통계 기능의 경우에는 statsmodels 패키지에 의존한다.

seaborn에서 제공하는 플롯의 종류는 다음과 같다.

  • 분포 플롯 (distribution plot)
  • 회귀 분석 플롯 (regression plot)
  • 카테고리 플롯 (categorical plot)
  • 행렬 플롯 (matrix plot)
  • 시계열 플롯 (time series plot)

seaborn에 대한 자세한 내용은 다음 웹사이트를 참조한다.

  • R에서 쓰는 스타일
  • 통계쪽 차트나 플롯 위주로 보강했음
  • classsical은 statsmodels를 쓰고 머신러닝은 scikit-learn을 쓸 것임

-판다스에서는 R에서 쓰는 라이브러리를 그대로 쓴다? NA는 데이터를 구하지 못했다. Not a Number 판다스가 NA를 받았을 때 몰래 정수를 float로 바꾼다.

-시계열 플롯과 라인 플롯은 다르다. -선(라인)은 각각 다른 샘플이다.

색상 테마

seaborn을 임포트하게 되면 바탕화면, axis, 색상 팔레트 등을 matplotlib에서 제공하는 기본 스타일이 아닌 seaborn에서 지정한 디폴트 스타일 집합으로 변경한다. 따라서 동일한 matplotlib 명령을 수행해도 seaborn을 임포트 한 것과 하지 않은 플롯은 다음과 같이 스타일 차이가 난다.


In [1]:
sns.set()   #스타일이 정해짐
sns.set_color_codes()

x = np.linspace(0, 2 * np.pi, 400)
y = np.sin(x ** 2)
f, axarr = plt.subplots(2, sharex=True)
axarr[0].plot(x, y)
axarr[0].set_title('Sharing X axis')
axarr[1].scatter(x, y);


분포 플롯

분포 플롯은 자료의 분포를 묘사하기 위한 것으로 matplotlib의 단순한 히스토그램과 달리 커널 밀도(kernel density) 및 러그(rug) 표시 기능 및 다차원 복합 분포 기능 등을 제공한다. 분포 플롯 명령에는 다음과 같은 것들이 있다.

  • rugplot
  • kdeplot
  • distplot
  • jointplot
  • pairplot

커널이라는 용어는 너무나도 많이 쓰이나 히스토그램에서 쓰이는 것은 하나의 값에 대해서 나타낼 때

러그(rug) 데이터 위치를 x축 위에 작은 선분으로 나타내어 실제 데이터 분포를 보여준다.


In [2]:
np.random.seed(0)
x = np.random.randn(100)

In [3]:
sns.rugplot(x);


커널 밀도(kernel density)는 커널이라고 하는 단위 플롯을 겹치는 방법으로 히스토그램보다 부드러운 형태의 분포 곡선을 보여준다. 커널 밀도 추정에 대한 자세한 내용은 scikit-learn 패키지를 참조한다.


In [4]:
sns.kdeplot(x);


C:\Anaconda3\lib\site-packages\statsmodels\nonparametric\kdetools.py:20: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
  y = X[:m/2+1] + np.r_[0,X[m/2+1:],0]*1j

seaborn의 distplot 명령은 matplotlib의 히스토그램 명령을 대체하여 많이 쓰인다. 러그와 커널 밀도 기능을 가지고 있다.


In [5]:
sns.distplot(x, kde=True, rug=True);


C:\Anaconda3\lib\site-packages\statsmodels\nonparametric\kdetools.py:20: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
  y = X[:m/2+1] + np.r_[0,X[m/2+1:],0]*1j

두 개 이상의 데이터 집합에 대한 분포를 시각화 할 때는 jointplot을 사용한다. 두 데이터 집합의 관계는 스캐터 플롯, 컨투어 플롯으로 볼 수 있으며 각 개별 데이터에 대한 히스토그램도 추가적으로 보여준다.


In [6]:
tips = sns.load_dataset("tips")
sns.jointplot(x='total_bill', y='tip', data=tips);



In [8]:
iris = sns.load_dataset("iris")
sns.jointplot("sepal_width", "petal_length", data=iris, kind="kde", space=0, color="g");  #2차원 커널을 그려서 컨투어로 표현한 것


C:\Anaconda3\lib\site-packages\statsmodels\nonparametric\kdetools.py:20: VisibleDeprecationWarning: using a non-integer number instead of an integer will result in an error in the future
  y = X[:m/2+1] + np.r_[0,X[m/2+1:],0]*1j

회귀 분석 플롯

회귀 분석 플롯은 선형 회귀 분석 결과를 묘사하기 위한 것이다. 회귀 분석 플롯 명령에는 다음과 같은 것들이 있다.

  • regplot
  • residplot
  • lmplot

regplot 명령은 내부적으로 회귀 분석을 실시하고 그 결과를 시각화한다. 데이터 자체는 스케터 플롯으로, 회귀 분석 결과는 라인플롯으로, 신뢰구간은 fill 플롯으로 그린다.


In [9]:
sns.regplot(x="total_bill", y="tip", data=tips);


residplot은 잔차항(residual)를 스캐터 플롯으로 그린다.


In [10]:
sns.residplot(x="total_bill", y="tip", data=tips);


lmplot 명령을 사용하면 여러가지 회귀 분석 결과를 하나의 그림에 보일 수 있다.


In [14]:
sns.lmplot(x="total_bill", y="tip", hue="smoker", data=tips);



In [15]:
sns.lmplot(x="total_bill", y="tip", col="smoker", data=tips);


카테고리 플롯

카테고리 플롯은 1차원 카테고리 값 자료의 분포를 묘사하기 위한 것이다. 카테고리 플롯 명령에는 다음과 같은 것들이 있다.

  • barplot
  • countplot
  • boxplot
  • pointplot
  • violinplot
  • stripplot
  • swarmplot

barplot 은 기본적인 바 차트를 생성한다.


In [16]:
sns.barplot(x="day", y="total_bill", hue="sex", data=tips);


countplot은 카테고리의 다른 데이터 갯수를 시각화한다.


In [17]:
titanic = sns.load_dataset("titanic")
sns.countplot(x="class", hue="who", data=titanic);


boxplotpointplot은 카테고리 인자에 따라 분포의 특성이 어떻게 바뀌는지를 보여준다.


In [20]:
sns.boxplot(x="day", y="total_bill", hue="smoker", data=tips);



In [23]:
sns.pointplot(x="time", y="total_bill", hue="smoker", data=tips, dodge=True);   # dodge는 살짝 띄우라는 의미


boxplotpointplot이 중앙값, 표준 편차 등, 분포의 간략한 특성만 보여주는데 반해 violinplot, stripplot. swarmplot 등은 카테고리값에 따른 각 분포의 전체 형상을 보여준다는 장점이 있다. stripplotswarmplot 은 보통 boxplot이나 violinplot과 같이 사용된다.


In [24]:
sns.violinplot(x="day", y="total_bill", hue="smoker", data=tips, palette="muted");



In [25]:
sns.violinplot(x="day", y="total_bill", hue="sex",
              data=tips, palette="Set2", split=True,
              scale="count", inner="quartile");



In [26]:
sns.stripplot(x="day", y="total_bill", hue="smoker",
             data=tips, jitter=True,
             palette="Set2", split=True);



In [31]:
sns.boxplot(x="tip", y="day", data=tips, whis=np.inf)
sns.stripplot(x="tip", y="day", data=tips, jitter=True, color=".3");   #jitter 조금씩 왔다갔다가 하게 해서 눈에 띄게끔



In [32]:
sns.swarmplot(x="day", y="total_bill", hue="sex", data=tips);



In [35]:
sns.violinplot(x="day", y="total_bill", data=tips, inner=None)
sns.swarmplot(x="day", y="total_bill", data=tips, color="white", edgecolor="gray");


행렬 플롯

행렬 플롯은 2차원 카테고리 값 자료의 분포를 묘사하기 위한 것이다. 행렬 플롯 명령에는 다음과 같은 것들이 있다.

  • heatmap
  • clustermap

heatmap 명령은 카테고리 값에 따른 자료의 수를 세고 이를 matplotlib 패키지의 imshow와 유사한 형태로 보여준다.


In [36]:
flights = sns.load_dataset("flights")
flights = flights.pivot("month", "year", "passengers")
sns.heatmap(flights, annot=True, fmt="d");


clustermap 명령은 히트맵에 계층 클러스터링(hierarchical clustering) 결과를 덴드로그램(dendrogram)으로 추가한다.

계층 클러스터링에 대해서는 다음 웹사이트를 참조한다.


In [38]:
sns.clustermap(flights);   #최대한 모양이 비슷한 애들끼리 옆에다 두어서 섞게 만들었다.


시계열 플롯

시계열 플롯은 시계열 자료를 묘사하기 위한 것이다. matplotlib의 단순한 라인 플롯에 불확정 범위를 표시하는 기능 등을 추가하였으며 주로 같은 시계열 모형에서 샘플링 된 복수개의 시계열을 묘사하는데 사용된다.

  • tsplot

In [39]:
np.random.seed(22)
x = np.linspace(0, 15, 31)
data = np.sin(x) + np.random.rand(10, 31) + np.random.randn(10, 1)
sns.tsplot(data=data)


Out[39]:
<matplotlib.axes._subplots.AxesSubplot at 0xcf1eb70>

In [40]:
sns.tsplot(data=data, err_style="boot_traces", n_boot=500);



In [41]:
sns.tsplot(data=data, ci=[68, 95], color="m");