Data science/Python

python 시각화 : Seaborn

연금(Pension)술사 2019. 6. 10. 10:24

seaborn이란 ?

 


 

Seaborn(발음: 시본)은 파이썬 데이터시각화 라이브러리이며, matplotlib라는 파이썬 시각화툴을 기반으로하고있다. Seaborn은 고수준(high-level) 인터페이스로, 통계적인 그레픽이나 디자인측면에서 손쉽게 구현이 가능하다(여기서 "고수준"은 사용자가 디테일한 수준까지 설정할필요없이, 몇가지 설정으로만 사용할 수 있다는 것이다. 반대어는 저수준으로 디테일한 수준까지 고려할 수 있음을 의미한다). 쉽게얘기하면, 그레프를 조금 더 쉽게 그려주는 페키지이다. 그레프를 통상 관계형, 범주형, 분포, 회귀, 행렬로 나누어서 설명을 한다. Seaborn은 스스로 그래프를 그리는 기능이 있어서 간편하게 사용해볼 수 있다.

 

 

그레프 크기 설정


matplotlib.pyplot.subplots()을 이용하여 서브플롯을 그릴 때, 너무 작은 서브플롯이 그려져서 보이지 않을 수 있다. 이 때는 matplotlib.pyplot.subplots()함수 내에, figsize라는 인자를 전달하면 된다. figsize은 tuple도 가능하고, list도 가능하다. 순서만 맞춰서 전달하면 된다. 가로가 12, 세로가 8인 크기로 만드록 싶으면, [12, 8], 또는 (12, 8) 둘 다 상관없다. 단위는 인치이다.

1
2
3
4
5
6
7
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
 
plt.style.use('ggplot')
fig, ax = plt.subplots(figsize=(5,6))
plt.show()
cs

(참고:https://matplotlib.org/stable/api/figure_api.html?highlight=figsize)

 

 

스타일 지정(seaborn.set_style, seaborn.set, seaborn.set_theme)


 

seaborn에서는 set_style, set, set_theme이라는 함수를 제공한다. 각각의 기능은 다음과 같다.

1. set(context, style, palette, font, font_scale, color_code, rc): set_theme과 동일한 함수이다. 스타일, 팔레트, 글꼴, 글꼴 크기 등을 설정. 이는 앞으로 그리게 되는 모든 플롯의 그림에 영향을 준다. 즉, 환경변수 설정이다. (추후 버전에서 삭제될 얘정이다)

 

2. set_theme(context, style, palette, font, font_scale, color_code, rc): 이 함수를 사용하면 앞으로 그려지는 plot들의 테마들이 일괄적으로 세팅된다. 이 함수를 사용하면 python.matploblib 내의 rcParams system을 변경하게되는데, 이렇게되면 전체적인 플롯들의 테마(글꼴, 팔레트 등)이 일률적으로 변경된다. 파라미터는 다음과 같다. 

Parameter 

- context: string. or dict. 배율조정. 그림 사이즈의 크기가 아니라 그레프의 배율이 커진다.

- style: string. or dict. {None, 'darkgrid', 'white grid', 'dark', 'white', 'ticks'} 중 하나 가 들어간다.

- set(style='darkgrid')라고 해도되지만, 다음에 소개할 set_style('whitegrid')함수를 사용해도 된다. set하나 가지고, 축을 변경할 수도 있지만, set_axis을 이용해도 된다. 

 

3. set_style(style, rc): 은 set_theme과 동일하나 일부 특성만 조작을 할 수 있는 함수이다. "배경색", "배경 내 격자무늬(=그리드)"의 사용여부를 기본으로 사용할 것인지 말것인지에 대한 설정을 할 수 있다.

 

 

- 예제, TimesNewRoman으로 폰트 변경

1
sns.set_style({'font.family':'serif''font.serif':['Times New Roman']})
cs

 

- 예제, background을 흰색으로 변경

1
sns.set_style('whitegrid')
cs

 

 

- 예제, background을 흰색 + ticks(눈금자)를 없애는 스타일

1
sns.set_style('ticks')
cs

 

seaborn.axes_Style(style, rc)

플롯의 미적 스타일에 대한 매개변수를 반환한다. 예를 들어, 내가 사용하고 싶은 스타일이 어떤 파라미터에, 어떤 인자값이 들어있는지 확인하는 용도이다.

1
2
3
4
5
6
7
8
sns.axes_style(style='darkgrid')
#{'figure.facecolor': 'white',
# 'axes.labelcolor': '.15',
# 'xtick.direction': 'out',
# 'ytick.direction': 'out',
# 'xtick.color': '.15',
# 'ytick.color': '.15',
# 'axes.axisbelow': True,....
cs

 

seaborn.set_context(ocntext=None, font_scale, rc=None):

플롯팅 컨텍스트 파라미트. 레이블의 크기, 선에만 영향을주고, 그레프의 전반적인 스타일에 영향을 미치지 않는다. 모든 그림들의 크기를 크리거나

- context: dict. None {paper, notebook, talk, poster}

- font_scale: 폰트 사이즈. 기본값 1.5

 

 

 

컬러 팔레트


데이터에 따라, 알아서 그레프의 색상을 알아서 지정해주고 싶을 때 사용한다.

 

seaboard.set_pallete(palette, n_colors= None)

seaboard.set_pallete('dark',3): 다크 그리드의 색상 3개를 뽑아온다. 보통 색상의 순서는 Blue, green, red, cyan, magenta.. 순서대로 간다. 

1
2
sns.set_palette('deep'5)
sns.scatterplot('petal_length''petal_width', data = iris
cs

 

 

Cubehelix : 프린터기가 흑백인 경우, 일반 컬러를 출력하면, 색상구별이 안되는 경우가 있다. 이를 해결하기 위해서,  색상별로 greyscale을 점점 더 높혀가거나 낮혀가서 할 수 있는 함수이다.

 

 

그레프 그리기


seaborn 함수의 그래프가 그려지는 Axes(marplotlib의 axesSubplot) 객체를 반환하기 떄문에, 서브플롯으로 나눈 축 영역에 그레프를 그릴 수 있다.

 

 

Scatterplot

1
2
import seaborn as sns
sns.scatterplot(x='Sepal.Length', y='Sepal.Width', data=df)
cs

 

- hue: strata을 정할 수 있음.

1
2
import seaborn as sns
sns.scatterplot(x='Sepal.Length', y='Sepal.Width', data=df, hue='Species', style='Species')
cs

 

 

Lineplot

회귀선은 아니고, 데이터들의 평균으로 하는 것 같고, 데이터들의 표준편차 

- markers = True : 점을 다르게 표시할 것인지에 대한 파라미터

- dashes = Fasle : 선을 다르게 표시할 것인지에 대한 파라미터

1
2
import seaborn as sns
sns.lineplot(x='Sepal.Length', y='Sepal.Width', data=df)s')
cs

 

 

Subplots을 이용해서 여러 그레프 그리기

1
2
3
4
5
6
7
x= 'Sepal.Length'
y= 'Sepal.Width'
fig, axes = plt.subplots(ncols=2)
plt.subplots_adjust(wspace=0.3)
sns.scatterplot(x=x, y=y, data=df, ax=axes[0])
sns.lineplot(x=x, y=y, data=df, ax=axes[1])
plt.show()
cs

 

- plt.subplots_adjust(wspace = 0.3) : 컬럼끼리이 그레프를 얼마나 떨어지

 

 

범주형 그레프


stripplot은 변수 하나가 범주형인 산점도, boxplot처럼 x 가 범주형 변수일 때 사용한다. 

1
sns.stripplot(x='Species', y=y, data=df)
cs

 

seaborn.swarmplot: swarmplot도 stripplot과 비슷한데, 어느정도 퍼져있는지를 잘 알아볼 수 있게 가로로 퍼짐형태를 나타내준다.

1
sns.swarmplot(x='Species', y=y, data=df)
cs

 

seaborn.barplot: x는 마찬가지로 범주형이고, strata을 지정할 수 있다. 가는 선은 포인트 추정치인데, 신뢰구간과 유사하다. 

1
2
df = sns.load_dataset("titanic")
sns.barplot(x='sex', y='survived', hue='class', data= df)
cs

 

 

seaborn.countplot: 각 범주 구간의 갯수만 파악

 

1
sns.countplot(x='deck', data=df)
cs

 

seaborn.pointplot 점 추정치 및 신뢰구간을 표시한다. 

 

 

seaborn.boxplot: pointplot의 점추정치가아니라 y가 연속형변수일 때 사용할 수 있는 그레프다. Quantile에 대한 정보 outlier, tail 등에 

대한 정보를 담고 있어 유용하다.

1
sns.boxplot(x='class', y='age', hue='sex', data=df)
cs

 

seaborn.violineplot: boxplot과 커널밀도추정치(KDE, kernel Density Estimation).

히스토그램은 몇개의 구간으로 나누냐에 따라 분포가 달라질 수 있는데, KDE를 이용하여 이를 완만하게 그릴 수 있다.

1
sns.violinplot(x='class', y='age', hue='sex', data=df)
cs

 

분포형 그레프

 

 

pairplot: 쌍관계 그래프를 그림. 데이터를 처음 볼 때, 변수들끼리 어느정도 관련성이 있는지를 산점도로 나타내고 싶을 때 사용한다.

변수가 너무 많아서 그레프가 너무 크면, 사이즈를 무척 크게 그려서, 저장한 다음에 나중에 이미지 뷰어로 보는 것도 추천한다.

1
2
df = sns.load_dataset('iris')
sns.pairplot(df, hue='species', palette='husl')
cs

 

 

 

jointplot: 이변량 그래프와 단변량 그레프를 동시에 볼 수 있는 그레프이다. subplots 영역 안에 그릴 수는 없다. 덧붙여서 그리고 싶으면 jointplot을 객체로 받고, 그 그레프에 다시 그려야한다. 이하 예시를 보자.

1
sns.jointplot(df.sepal_length, df.sepal_width, kind='kde')
cs

 

 

distplot: 단변량분포를 그린다. 커널밀도함수도 같이표현할 수 있다.

1
sns.distplot(df.sepal_length,)
cs

 

 

Regression graph


 

lmplot: Linear model plot의 약어라고 생각되는 플롯이다. 회귀곡선도 그리고, 신뢰구간도 그려준다. 단점은 실제 회귀식은 알수는 없다.

1
sns.lmplot(x='sepal_length', y='sepal_width', hue= 'species', data=df)
cs

 

 

regplot: 두 변수를 이용하여 선형 회귀 모형을 만들고, 그레프로 표현.

1
sns.regplot(x='sepal_length', y='sepal_width', data=df)
cs

 

 

Matrix plot

cluster map: 데이터를 이용해서 계측적으로 군집된 히트맵으로 그림. 몇개의 군집할 것인가를 쉽게 결정할 수 있다. y 축의 계층을 이용해서 군집할 수 있다. 색깔은 근접도를 의미한다. 

1
2
df = df.drop('species', axis=1)
sns.clustermap(df)
cs

 

 

 

heatmap(data, vmin=None, vmax=None, cmap=None, annot=None)

vmin, vmax는 최대 최소값을 지정할수 있는 값 인자이다. cmap은 컬러맵을 의미하며, 아래의 예시와 같이 컬러맵에 대한 내용을 string 또는 리스트로 지정해주면된다. 변수들간의 상관계수를 색으로 인코딩하여 행렬로 표시한다. vmin, vmax=은 최대 최소를 의미한다. 상관계수는 1 annot =True이면 값 안에 숫자를 입력함

1
sns.heatmap(df.corr(), vmin=-1, vmax=1, annot=True, cmap='YlGnBu')
cs

 

 

Seaborn Grid


Seaborn에서 Multi-plot grid로 조건부 관계를 여러가지를 동시에 플롯팅 할 수 있는 것을 의미한다.

FacetGrid, PairGrid, JointGrid 이렇게 세 가지 정도로 나눌 수 있다.

 

FacetGrid(data, row, col, hue) : 다중 플롯 그리드를 만들어서 여러가지 쌍 관계를 표현하기 위한 그리드 Class이다. 도화지에 축을 나누는것과 같다. 

1
2
3
4
5
6
7
import seaborn as sns
sns.set()
iris = sns.load_dataset('iris')
 
= sns.FacetGrid(iris, col='species', hue='species')
g.map(plt.hist, 'sepal_length')
g.set_axis_labels('sepal_length''Count')
cs
 
우선 facetGrid 객체를 만들어야하는데 (=도화지를 나눠야하는데), 나누는 기준을 설정해야한다. 나누는 기준(조건)을 지정해줘야하기때문에
Facetgrid을 "Multi-plot grid for plotting conditional relationships "라고 하는 것 같다. 
  • 5라인: col, hue가 있는데 이는 데이터를 어떤 서브셋으로 나눌건지를 정하는 것이 된다. 즉 컬럼은 붓꽃의 종류로 나누고, 이에 대한 hue(starta)도 붓꽃의  종류로 나누겠다는 것이다. 
  • 6라인: 마든 Facetgrid 객체(g)에 'map' 함수를 이용해서 어떤 그레프를 그릴것인지 명시하고, 변수명을 적는다.
  • 7라인: set_axis_labels(x_var=None, y_var=None). 축에 대한 라벨을 적을 수 있는데, x축을 sepal_length라고 명명하고, y축을 count라고 명명한다는 것이다.

 

 

 

 

PairGrid(data, hue=None, hue_order=None,....) : 쌍(pair) 관계 그레프를 그리기 위한 서브 플롯그리드를 생성

1
2
grid_obj = sns.PairGrid(iris)
grid_obj.map(sns.scatterplot)
cs

 

  • Line 1: PairGird(data, hue=None..). Grid객체를 만드는데 iris 데이터를 이용해서 사용할 것임을 명명
  • Line 2: 만들어진 그리드 객체(grid_obj)에 어떤 그레프를 그릴것인지 map함수를 이용해서 그림.

 

 

JointGird(x, y): 이변량그래프와 단변량 그래프를 함께 나타내기위한 그리드를 생성


1
2
grid_obj = sns.JointGrid(iris.sepal_length, iris.sepal_width)
grid_obj.plot(sns.regplot, sns.distplot)
cs

 

  • Line 1: JointGrid 객체를 만들 것인데, 이에 필요한 데이터를 인자로 넣어 생성, x에 sepal_length , y에 sepal_width을 대입할 것임
  • Line 2: plot(joint_function, marginal_function) 을 할 때, 이변량 그레프는 어떤 것을 그리고, 일변량 그레프는 어떤 것을 그릴것인지 정함. joint_function은 이변량 그레프를 어떤것을 그릴것인지 의미. marginal function은 이변량 그레프 외의 가장자리에 어떤 그레프를 그릴 것인지를 의미

 

 

 

 

map_lower(): 대각선의 아랫쪽에 그레프를 그림

map_upper(): 대각선의 윗쪽 그레프를 그림

 

 

 

 

2019/05/30 - [Data science] - Python 시각화 - 기본

반응형