지난 번 글에서 파이썬의 시각화 라이브러리 맷플랏립(Matplotlib)의 기본 사용법에 대해 알아봤다면 이번 글에서는 씨본(Seaborn)이라는 또 다른 파이썬 시각화 라이브러리에 대해 배워보자.
씨본은 맷플랏집을 기반으로 만들어졌지만 다양한 색상 테마와 통계용 차트 기능이 추가되어 맷플랏립보다 처음부터 있어 보이는 그래프를 만들 수 있다고 했다. 맷플랏립이 데이터프레임에서 데이터를 직접 선택하거나 계산해서 그래프를 그리는 반면, 씨본은 이미 통계용 그래프로 만들어져 있어 어떤 통계적 차트인지 그 성격을 잘 알고 사용하는 것이 다라고 할 수 있다. (* 단, 더 잘 꾸미는 것은 별도)
이번 글에서는 원하는 씨본 그래프를 적재적소에 사용할 수 있도록 다양한 씨본 그래프의 기본적인 개념과 사용법에 대해 알아보도록 하자.
씨본을 연습할 데이터로 씨본에서 제공하는 내장 데이터인 붓꽃 데이터(Iris dataset)를 불러와 보자. 붓꽃 데이터는 붓꽃의 꽃받침너비, 꽃받침높이, 꽃잎너비, 꽃잎길이 등의 4가지 특성에 따라 붓꽃을 최종적으로 3가지 종으로 분류하는 데이터 셋이다.
먼저 1차원 그래프이다. 1차원 그래프는 특정 한 개 컬럼의 데이터의 분포를 알 수 있는 그래프로, 참고로 데이터 분석에 있어 데이터 유형은 몇 개의 한정된 값을 가지는 범주형 데이터(Categorical Data)와 실수형 값을 가진 수치형 데이터(Numerical Data)로 나눌 수 있는데, 주로 수치형 데이터의 분포를 파악하기 위해 사용할 수 있다.
러그플롯은 데이터의 실제 위치를 x축 위의 작은 선분(rug)로 나타내어 데이터의 분포를 보여준다.
커널밀도(kernel density)는 데이터 분포를 직사각형으로 나타내는 히스토그램보다 부드러운 곡선의 형태로 나타내는 곡선 히스토그램이라 할 수 있다.
디스트플롯은 히스토그램과 함께 앞서 본 러스, 커널밀도를 표시하느 기능도 있어 데이터 분포를 살피는 데 있어 가장 많이 사용된다.
카운트플롯은 특정 컬럼의 데이터(고유값)가 나온 횟수를 세어주는 그래프로, 판다스에서 value_counts() 함수의 기능이라 할 수 있다. 데이터 별로 나온 개수를 세어주는 거니까 주로 범주형 데이터를 가진 컬럼에 대해 사용할 수 있을 것이다.
2차원 그래프는 두 데이터의 상관관계를 시각적으로 파악할 수 있는 그래프로, 먼저 두 데이터 모두 수치형 데이터인 경우 스캐터플롯을 사용해 두 데이터의 각각의 분포는 물론 두 데이터의 상관관계도 파악할 수 있다. 씨본에서는 jointplot을 사용해 인수 가운데 kind를 ‘scatter’로 설정함으로써 스캐터플롯을 그릴 수 있다.
pairplot은 데이터프레임 전체를 인수로 받아 각 칼럼의 조합에 대해 스캐터플롯을 그린다. 데이터 프레임에 실수형이 아닌 범주형 데이터가 섞여 있어도 그래프는 그려지지만 두 개 모두 실수형인 경우 스캐터플롯이 그려지고 그 외의 경우 살펴보면 알겠지만 별 의미없는 그래프가 될 수 있다. 같은 컬럼이 만나는 대각선에는 스캐터플롯 대신 히스토그램이 그려진다.
둘 다 모두 한정된 데이터 값을 가지는 범주형 데이터라면? heatmap을 사용해 상관관계를 알아볼 수 있다. heatmap은 말그대로 ‘열지도’로 해당되는 데이터가 많거나 높은 경우 색으로 직관적으로 할 수 있는 시각화 그래프이다.
붓꽃 데이터는 모두 실수형 데이터와 1개의 범주형 데이터를 가지고 있어 또 다른 데이터 세트인 플라이트 데이터를 불어와서 히트맵을 그려보자. 데이터를 불러왔다면 앞서 한 것처럼 그냥 컬럼을 지정해 사용하는 것이 아니라 나타내고자 하는 두 개의 범주형 데이터를 중심으로 새로운 피봇 테이블을 만들고 해당 데이터 프레임 전체를 히트맵 인수로 넣어주어야 한다. (* 자세한 내용은 아래 연습하러 가기 링크를 누르고 실습할 수 있다.)
아니면 숫자 쌍에 대해 상관관계를 반환하는.corr() 함수를 사용해 컬럼 간 상관관계를 (정말 간단히) 계산한 뒤 히트맵을 그릴 수도 있다. 이 경우 데이터 프레임 전체 혹은 원하는 컬럼들을 선택해 히트맵을 그릴 수 있는데 데이터프레임 전체를 선택한다고 해도 수 데이터를 가진 컬럼들만을 분석해 상관관계를 보여준다.
여기서 수 데이터란 실수형 데이터를 가진 비단 수치형 컬럼 뿐만 아니라 몇 가지 값으로 한정된 범주형 컬럼이라도 숫자 데이터로 이뤄진 컬럼이라면 같이 분석해 준다. 두 데이터의 상관계수는 -1에서 1까지 표시되는데 1에 가까울 수록 두 데이터 간 상관관계가 높다는 뜻이다.
마지막으로 하나는 범주형 데이터, 하나는 수치형 데이터인 경우 2차원 그래프이다. 이는 범주형 데이터의 값에 따라 실수형 데이터의 값들의 통계적 수치를 표시할 수 있는 그래프로 barplot, boxplot, violinplot, swamplot 등이 있다.
barplot은 범주형 데이터의 값에 따라 실수형 데이터의 평균과 표준편차를 표시하는 막대 그래프이다.
boxplot은 범주형 데이터의 값에 따라 실수형 데이터의 중앙값과 사분범위를 나타내는 그래프이다. 박스는 실수값의 분포에서 1사분위수(1Q)와 3사분위수(3Q)를 뜻하고 박스 내부의 가로선은 중앙값이다. 3Q와 1Q의 차이를 IQR(사분범위)이라고 하는데 박스 외부의 세로선은 1사분위 수에서 1.5 x IQR 만큼 낮은 값과 3사분위수에서 1.5 x IQR 만큼 높은 값까지 범위를 표시한 것이다. 이를 벗어나는 그 바깥의 점은 이상치(outlier)로 일일히 점으로 표시한다.
violinplot은 범주형 데이터 값에 따라 실수형 데이터의 분포를 세로 방향의 커널밀도 히스토그램으로 그려주는 데 왼쪽과 오른쪽이 대칭이 되도록하여 바이올린처럼 보인다.
swamplot은 범주형 데이터 값에 따라 실수형 데이터의 분포를 스캐터플롯처럼 점으로 찍어 나타내준다.
끝으로 앞서 배운 2차원 그래프에 인수를 추가함으로써 3차원 그래프를 그릴 수 있다. 즉, 2차원 실수형 또는 2차원 복합형에는 hue 파라미터에 범주형 데이터를 추가할 수 있고, 2차원 범주형 데이터로 이뤄진 그래프인 히트맵에는 hue에 실수형 데이터를 추가해 실수값의 변화를 볼 수 있다. 'hue'는 색깔이라는 뜻으로 데이터에 색깔을 다르게 한다는 뜻이다.
* 씨본 라이브러리 연습하러 가기
https://www.kaggle.com/kyungapark/practicing-seaborn-with-iris-dataset
* 참고자료
1. 씨본 (https://seaborn.pydata.org/)
2. 데이터사이언스 스쿨, 씨본을 사용한 데이터 분포 시각화