본문 바로가기
Programming/Python

Seaborn - 데이터를 시각화하는 17가지 방법

by 썽하 2020. 9. 15.

seaborn logo

데이터 시각화는 데이터 마이닝에서 매우 중요한 역할을 한다. 데이터 과학자는 시각화를 통해 데이터를 탐구하는데 대부분의 시간을 보낸다. 이 과정을 가속화하기 위해서는 모든 플롯에 대한 충분한 이해와 설명서가 필요하다.

이 글을 통해 자주 사용했던 플롯들에 대한 정리해보고자 한다.

 

Seaborn이란?

Seaborn은 matplotlib 기반의 시각화 라이브러리이다. 유익한 통계 그래픽을 그리기 위한 고급 인터페이스를 제공한다.

seaborn을 설치하기 위해서는 다음 쉘 명령어로 설치할 수 있다.

 

pip install seaborn # pip를 이용한 설치
conda install seaborn # conda를 이용한 설치

 

그리고 파이썬에서 다음과 같이 임포트 해주면 사용할 준비가 끝난다.

import seaborn as sns

내가 사용하는 버전은 다음과 같다.

sns.__version__
>> '0.11.0'

 

Dataset

내가 사용할 데이터셋은 고객이 팁을 얼마나 주는지에 대한 데이터 셋이다

다음과 같이 한 줄로 가져올 수 있다.

df = sns.load_dataset('tips')
df

 

이제 가져온 데이터로 시각화를 시작해보자.

 

Distribution Plot

Distribution Plot은 데이터의 분포를 시각화하는데 도움이 된다.(디스트리뷰션을 해석한 그대로이다.) 이 그래프를 사용하여 데이터의 평균(mean), 중위수(median), 범위(range), 분산(variance), 편차(deviation) 등을 이해할 수 있다.

 

1. Hist Plot

  • 변수에 대한 히스토그램을 표시한다.
  • 하나 혹은 두 개의 변수 분포를 나타내는 전형적인 시각화 도구로 범위에 포함화는 관측수를 세어 표시한다.

다음과 같이 사용할 수 있다.

sns.histplot(x=df['total_bill'])
# == sns.displot(x=df['total_bill'], kind='hist')

total_bill 질량 분포

sns.histplot(x=df['total_bill'], y=df['tip'])
# == sns.displot(x=df['total_bill'], y=df['tip'], kind='hist')

total_bill 과 tip에 관한 질량 분포

 

*displot은 Distribution plot의 인터페이스로 적당한 plot 종류를 인자로 줌으로써 여러 가지 그래프를 시각화해준다.

 

2. KDE Plot

  • 하나 혹은 두 개의 변수우에 대한 분표를 그린다.
  • histplot은 절대량이라면 kdeplot은 밀도 추정치를 시각화한다.
  • 그래서 결과물로는 연속된 곡선의 그래프를 얻을 수 있다

아래와 같이 사용할 수 있다.

sns.kdeplot(x=df['total_bill'])
# = sns.displot(x=df['total_bill'], kind='kde')

 

단일 변수에 대한 질량 밀도(추정) 그래프

sns.kdeplot(x=df['total_bill'], y=df['tip'])
# = sns.displot(x=df['total_bill'], y=df['tip'], kind='kde')

두개의 변수에 대한 질량 밀도(추정) 그래프

 

3. ECDF Plot

  • 누적 분포를 시각화해준다.
  • 실제 관측치의 비율을 시각화한다는 장점이 있다.
sns.ecdfplot(x=df['total_bill'])
# == sns.displot(x=df['total_bill'], kind='ecdf')

단일 변수에 대한 ecdf plot

 

4. Rug Plot

  • x축과 y축을 따라 눈금을 그려서 주변 분포도를 표시한다.
  • 개발 관측치에 대한 위치를 보여줌으로써 다른 그림들을 보완하는데 주로 쓰인다.(즉, 이 그래프만 단일로 잘 쓰지는 않는다.)

아래 예시를 보자.

sns.kdeplot(x=df["total_bill"])
sns.rugplot(x=df["total_bill"])

주황 색선이 rugplot, 파란색 선이 kdeplot이다. rugplot은 보조 그래프 정도로 참고용 이라보면 된다.

 

Categorical Plot

지금부터 설명하는 plot은 범주형(categorical) 변수를 이해하는데 도움이 된다. 일변량(univariate) 혹은 이변량(bivariate) 분석에 사용된다.

 

5. Bar Plot

  • 이변량(bivariate) 분석을 위한 plot이다.
  • x축에는 범주형 변수, y축에는 연속형 변수를 넣는다.
sns.barplot(x = df['sex'], y = df['tip'])

 

6. Count Plot

  • 범주형 변수의 발생 횟수를 샌다.
  • 일변량(univariate) 분석이다.
sns.countplot(x = df['sex'])

 

7. Box Plot

  • 최대(maximum), 최소(minimum), mean(평균), 1 사분위수(first quartile), 3 사분위수(third quartile)를 보기 위한 그래프
  • 특이치(outliar)를 발견하기에도 좋다.
  • 단일 연속형 변수에 대해 수치를 표시하거나, 연속형 변수를 기반으로 서로 다른 범주현 변수를 분석할 수 있다.
sns.boxplot(x = df['total_bill'])

 

sns.boxplot(y = df['total_bill'], x = df['smoker'])

8. Violin Plot

  • Box Plot과 비슷하지만 분포에 대한 보충 정보가 제공된다.
sns.violinplot(y = df['total_bill'], x = df['smoker'])

 

9. Strip Plot

  • 연속형 변수와 범주형 변수 사이의 그래프이다.
  • 산점도(scatter plot)로 표시되는데, 범주형 변수의 인코딩을 추가로 사용한다.
sns.stripplot(y = df['total_bill'], x = df['smoker'])

 

10. Swarm Plot

  • Strip plot과 violin plot의 조합이다.
  • 데이터 포인트 수와 함께 각 데이터의 분포도 제공한다.
sns.swarmplot(y = df['total_bill'], x = df['smoker'])

딱 보면 알 수 있듯 Strip Plot에 비해 분포도를 확인하기 쉽다.

 

Matrix Plot

시각화를 위해 2차원 행렬 데이터를 사용하는 특별한 유형의 plot이다. 매트릭스 데이터에서는 사이즈가 크기 때문에 패턴을 분석하고 생성하기 어렵다. 다음에 오는 plot은 매트릭스 데이터에 색상을 제공함으로써 조금 더 분석하기 쉽게 도와준다.

 

11. Heat Map

  • Heat map을 통해 데이터 간의 수치에 따라 색상을 입힘으로써 직관적인 통찰을 얻을 수 있다.

우리의 데이터에는 3개의 numerical variables들이 있다. 이것들 사이의 상관 행렬(correlation matrix)을 만들어보자.

우리는 단지 3x3=9개의 값만 있지만 5x5=25개만 넘어가도 모든 값을 한눈에 읽고 이해하기는 어렵다.

색상을 입히는 게 얼마큼 해석이 쉬워지는지 알아보자.

sns.heatmap(df.corr(), annot = True, cmap = 'viridis')

결측 값(missing value)도 그래프로 확인하는 할 수 있다.

sns.heatmap(df.isnull(),yticklabels=False,cbar=False,cmap='viridis')

아쉽게도 이번 예시에서는 결측 값이 없다. 만약 결측 값이 있으면 보라색이 아닌 다른 색으로 그림에 표기가 된다.

 

12. Cluster Map

  • 행렬 데이터를 가지고 있고, 유사성에 따라 몇몇 특징들을 그룹화하기 원한다면 Cluster Map을 사용하면 된다.
sns.clustermap(df.corr(), annot=True, cmap='viridis')

유사도가 높은 것들 순서대로 계층적으로 클러스터(Hiearchical Clustering)가 형성된다.

 

Multi-plot Grid

Grid plot은 시각화에 대한 제어력을 높이고 코드 한 줄로 다양한 그래프를 표시한다.

 

13. Facet Grid

  • 어떠한 조건에 따라 그래프를 각각 확인해보고 싶을 때 사용한다.
  • 성별과 흡연 여부에 따라서 얼마만큼 지불을 하는지 알고 싶다면 다음과 같이 실행하면 된다.
sns.FacetGrid(df, col = 'smoker', row = 'sex').map(sns.distplot, 'total_bill')

성별 / 흡연 여부에 따라서 총 4개의 그래프가 그려졌다.

 

14. Joint Plot

  • 두 변수에 대한 displot의 조합이다.
  • 두 변수에 분포에 대한 분석을 할 수 있다.
  • 두 displot 사이에 scatter plot이 추가되어 분포를 추가로 확인할 수 있다.
  • scatter plot 대신 hex plot으로 정의할 수도 있다.
sns.jointplot(x=df['total_bill'], y=df['tip'], kind = 'scatter')

sns.jointplot(x=df['total_bill'], y=df['tip'], kind = 'hex')

 

15. Pair Plot

  • 데이터셋을 통째로 넣으면 숫자형 특성에 대하여 각각에 대한 히스토그램과 두 변수 사이의 scatter plot을 그린다.
  • 이 한 줄이면 데이터를 한눈에 보기 쉬워서 애용한다.
  • 다른 기능이나 유연성이 더 필요하다면 pairgrid를 사용하면 된다.
sns.pairplot(df)

 

Regression Plot

Regression plot은 지금까지 봐온 plot과는 개념이 조금 다른데, regression 머신러닝의 결과를 그래프에 표기해준다.

즉 데이터를 있는 그대로 보여주기보다는, 머신러닝 결과와 함께 보여주는 것이다.

 

16. Reg Plot

  • Regression 결과를 그래프로 보여준다.
sns.regplot(x = 'tip', y = 'total_bill', data = df)

 

17. LM Plot

  • 이 plot은 regplot()과 faceGrid를 결합한 것이다.
  • hue에 들어간 컬럼의 값을 구분하여 따로따로 모델링하여 결과를 보여준다.
  • regression을 위한 여러 가지 옵션들이 있다.(자세한 내용은 공식 Documentation을 참고_)
sns.lmplot(x = 'tip', y = 'total_bill', data = df, hue = 'sex')

정리하자면

이번 글에서는 seaborn을 이용한 17가지 시각화 방법을 살펴보았다.

나는 데이터 시각화가 우리에게 이해와 데이터 해석 능력을 높여준다고 믿는다. 데이터를 표현하고 결측 값(missing value)을 확인하고, 특이치(outlier)를 식별하고 이상 징후를 탐지하는 등 만족스러운 결과를 가져올 수 있다.

데이터 분석가들은 데이터를 조사하고 정보를 추출해야 하는 사람들이다. 그 일을 하기 위해서는 효율적인 도구가 필요하다. 이글과 seaborn이 데이터 과학자에게 영양분이 되었으면 한다.

 

Referenece

 

'Programming > Python' 카테고리의 다른 글

Jupyter 환경에서 pip 패키지 설치하기  (0) 2020.09.25

댓글