안녕하세요, 왕초보 코린이를 위한 코딩유치원에 오신 것을 환영합니다.
코딩유치원에서는 파이썬 기초부터 사무자동화, 웹크롤링, 데이터 분석 등의 다양한 패키지까지 초보자도 알기 쉽도록 내용을 정리해 놓았습니다.
업무는 물론 투자에도 도움이 될만한 전자공시시스템(DART)나 텔레그램(Telegram) 관련 패키지도 배울 수 있으니 많은 관심 부탁드립니다.
<seaborn 관련 글>
2021.08.08 - [파이썬 패키지/데이터시각화] - [Python/Seaborn] 데이터 시각화 라이브러리_1편. Seaborn 소개
이번 시간에는 예전에 배워봤던 matplotlib 기반으로 만들어진, 하지만 더 강력한 데이터 시각화 기능을 가지고 있는 seaborn에 대해서 배워보겠습니다.
오늘부터 seaborn의 그래프들을 공식문서에 소개된 차례대로 공부해보겠습니다.
공식문서에 나오는 그래프를 아래와 같이 정리해보았으니, seaborn의 큰그림을 그릴 때 도움이 되시리라 생각합니다.
그래프 종류 (대분류) | 그래프 종류 (소분류) | 설명 | |
1 | Relational plots | relplot, scatterplot, lineplot | 두가지 변수(x, y)의 관계를 나타내기 위한 그래프 |
2 | Distribution plots | displot, hisplot, kdeplot, ecdfplot, rugplot, distplot | 변수 하나(x or y) 혹은 변수 두개 (x,y)의 값 분포를 나타내기 위한 그래프 |
3 | Categorical plots | catplot, stripplot, swarmplot, boxplot, violinplot, boxenplot, pointplot, barplot, countplot | 범주형 변수 (ex. Male/Female, Yes/No)와 연속형 변수(숫자) 간의 관계를 나타내기 위한 그래프 |
4 | Regression plots | Implot, regplot, residplot | 회귀(regression) 분석 결과를 relational p lots과 함께 나타내주는 그래프 |
5 | Matrix plots | heatmap, clustermap | 연속형 변수(숫자) 간의 관계 비율을 2차원 메트릭스로 만들고 그 비율에 따라 색을 입혀서 시각화 |
6 | Multi-plot grids | FacetGrid, pairplot, PairGrid, jointplot, JointGrid | 여러 그래프를 함께 그려 한눈에 비교하기 위한 그래프 |
모든 그래프를 한 번에 공부하기엔 너무 양이 많으므로, 이번 시간에는 Relational plots과 Distribution plots에 대해서만 다루어보겠습니다. 데이터 셋은 지난 시간에 배웠던 데이터 셋 중, tips에 대한 데이터 셋을 이용할 예정입니다.
그래프를 그려보기 위해서 관련 라이브러리와 데이터 셋을 불러오겠습니다. 이번 시간에도 개발환경은 역시 Jupyter Notebook입니다.
# 관련 라이브러리 불러오기
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns
# 데이터 셋 불러오기
tips = sns.load_dataset("tips")
tips
Relational plots
가장 먼저 배워볼 그래프는 관계형 그래프(Relational plots) 입니다. 우리가 흔히 아는 Line 그래프도 x와 y의 관계를 그려주는 관계형 그래프의 한 종류입니다.
Relational plots에는 크게 라인 그래프(lineplot)와 산점도 그래프(scatterplot)으로 나뉘며, 이 둘을 합친 개념인 relplot이 있습니다.
나중에 자세히 설명드리겠지만 relplot의 파라미터로 kind="scatter" 혹은 "line"을 입력해주시면 두 그래프를 relplot을 이용하여 동일하게 사용가능합니다. 즉, replot = lineplot + scatterplot인 것이죠!
1. scatterplot
먼저 sctterplot을 알아보겠습니다. scatterplot을 그려주기 위해서는 3가지 파라미터가 꼭 필요합니다.
- x축 데이터 컬럼명
- y축 데이터 컬럼명
- 데이터 셋
ax = sns.scatterplot(x='total_bill', y='tip', data=tips)
우리는 해당 그래프로 레스토랑에서 전체 식사비용(total_bill)에 따른 팁(tip)을 얼마나 지불했는지를 파악할 수 있습니다.
색 구분 옵션 (hue)
scatterplot은 정말 다양한 파라미터를 설정해줄 수 있지만 핵심적이라고 생각하는 hue와 style, 두 가지만 설명드리겠습니다.
hue는 의미에 따라서 점의 색깔을 다르게 표시하는 기능을 갖고 있습니다. 코드로 확인해보시죠.
ax = sns.scatterplot(x='total_bill', y='tip', hue='time' data=tips)
hue 파라미터에 범주형 데이터(Lunch/Dinner)의 컬럼명('time')을 입력함으로써 점심/저녁 식사에 따라 데이터를 구분해줄 수 있습니다.
왼쪽 위를 보면 자동으로 범례(Legend)가 들어가 있네요. matplotlib에서는 따로 설정을 해주어야 했는데 말이죠.
모양 구분 옵션 (style)
데이터를 하나 더 추가하여 더욱 세분화 해서 표현하고 싶으시다면 style 파라미터를 이용해보세요.
hue가 색이었다면 style은 마커의 모양을 의미합니다.
ax = sns.scatterplot(x='total_bill', y='tip', hue='day', style='time', data=tips)
2. lineplot
line 그래프는 데이터가 연속적일 경우 주로 사용합니다. tip 데이터 셋은 연속데이터가 아니므로 새로운 데이터 셋을 가져와보겠습니다.
해당 데이터셋은 fmri라는 데이터 셋으로, fmri(기능적 자기 공명영상)은 혈류와 관련된 변화를 감지하여 뇌 활동을 측정한 데이터입니다.
데이터 셋의 의미를 깊게 파악하기보다는 lineplot의 기능을 간단히 설명드리고 넘어가도록 하겠습니다.
먼저 데이터 셋을 불러와줍니다.
fmri = sns.load_dataset('fmri')
fmri
lineplot으로 'timepoint'와 'signal'의 관계를 그려볼텐데 데이터 셋을 얼핏 보면 timepoint 값 중에 18이 여러개 있는 것을 보았을 때, 우리가 흔히 아는 라인 그래프랑은 다르게 나올 것 같네요.
ax = sns.lineplot(x='timepoint', y='signal', data=fmri)
x에 대한 y값이 여러개여서 아래와 같이 하나의 선이 아닌 범위(?) 그래프가 그려졌습니다.
이러한 그래프는 seaborn 라인 그래프의 장점으로, 짙은 선은 추정 회귀선(Estimated regression line), 옅은 하늘색 영역은 신뢰구간(Confidence interval)을 나타냅니다.
lineplot 역시 hue와 style 파라미터를 설정해줄 수 있습니다. Marker도 나타낼 수 있습니다.
ax = sns.lineplot(x='timepoint', y='signal', hue='event', style='event', markers=True, data=fmri)
3. relplot
relplot은 앞서 설명했듯이 파라미터로 kind="scatter" 혹은 "line"을 입력해주시면 두 그래프를 relplot을 이용하여 동일하게 사용가능합니다. 기본값은 "scatter" 이므로 라인 그래프를 그리고 싶을 때만 설정값을 넣어주시면 됩니다.
ax = sns.relplot(x='total_bill', y='tip', kind='scatter', hue='time', data=tips)
단순히 lineplot과 scatterplot을 합쳐놓은거라면 굳이 relplot라는 함수를 만들어 놓은 이유는 없겠죠?
나중에 배우겠지만 relplot은 return 값이 FaceGrid고, lineplot와 scatterplot는 return 값이 AxesSubplot이라고 합니다.
쉽게 말해 relplot은 여러 그래프를 한 번에 그려줄 수 있고, 나머지 두 함수는 그래프 하나씩만 표현 할 수 있답니다.
<참고 자료>
https://seaborn.pydata.org/generated/seaborn.relplot.html#seaborn.relplot