파이썬-데이터-시각화-기초-seaborn-씨본
Seaborn으로 일변량 데이터를 시각화 해보자

파이썬(Python)에는 Matplotlib(맷플롯립), Plotly(플로틀리), GGplot(지지플롯) 등 다양한 시각화 라이브러리들이 있습니다. Matplotlib은 전 세계의 데이터 과학자들이 가장 많이 사용하는 시각화 라이브러리입니다. Plotly는 자바스크립트(JavaScript) 라이브러리인 plotly.js를 기반으로 만들어져, 그래프의 특정 부분을 확대/축소하거나 저장하는 등 웹 상에서 사용자와 상호작용할 수 있는 라이브러리입니다. GGplot은 R의 ggplot2 라이브러리를 바탕으로 개발되어, 기존의 R 사용자들이 사용하기 편리한 라이브러리입니다.

그렇다면 Seaborn이란 무엇일까요? 또, 많은 시각화 도구 중에서 Seaborn을 사용하면 좋은 이유는 무엇일까요? Seaborn은 Matplotlib을 쉽게 사용하기 위해 개발된 고수준(high-level) 라이브러리입니다. Seaborn의 가장 큰 장점은 간결함입니다. Seaborn을 이용하면 비교적 짧은 코드로도 통계학의 주요 그래프를 빠르고 편리하게 만들 수 있습니다. 그래프를 세부 설정 없이 간단하고 빠르게 그리고 싶다면 Matplotlib보다 Seaborn을 사용하면 좋습니다.

Seaborn의 사용법은 기초편과 심화편으로 나뉩니다. 기초편에서는 Seaborn을 설치하고 실습을 위한 기본적인 환경 설정 방법과 변수가 1개인 1차원 데이터를 시각화하는 법을 다룹니다. 파이썬 데이터 시각화 Seaborn 사용법 심화편에서는 변량이 2개 이상인 다차원 그래프를 시각화하는 법을 알아보겠습니다. 기본편에서 다룰 전체 그래프의 개요는 다음과 같습니다.

Seaborn 1차원 데이터 시각화 로드맵
Seaborn 1차원 데이터 시각화 로드맵  - Snug Archive

그럼 Seaborn으로 1차원 데이터 시각화를 하기 전에 준비할 사항부터 알아보겠습니다.

준비

안내 사항

Seaborn으로 데이터를 시각화하기 위해서는 몇 가지 준비가 필요합니다. 첫째, 실습 환경입니다. 데이터 사이언스(Data Science)를 위한 통합개발환경(IDE)에는 대표적으로 스파이더(Spyder), 아톰(Atom), 파이참(PyCharm) 등이 있습니다. 이 글에서는 주피터 노트북(Jupyter Notebook)을 사용합니다. 주피터 노트북의 자세한 환경 설정 방법은 주피터 노트북 환경 설정하기를 참조해 주세요.

둘째, 통계 용어에 대한 간단한 이해가 필요합니다. 각 용어는 간략히 설명할 예정이나, 개념에 대한 자세한 설명이나 수식은 다루지 않습니다. 통계 용어를 참조하면서 글을 읽고 싶은 분들은 확률과 통계 핵심 개념과 용어를 함께 읽으시기를 권해드립니다.

셋째, Seaborn 함수의 종류입니다. Seaborn의 시각화 함수는 그래프 수준(figure-level)의 함수와 축 수준(axes-level)의 함수로 나뉩니다. 그래프 수준의 함수는 상위 함수로 그래프의 종류를 지정하는 파라미터를 사용해 데이터를 시각화합니다. 반면 축 수준 함수는 각 그래프의 종류에 특화된 함수입니다. 축 수준 함수는 1가지 그래프를 그리는 데 맞춤화되어 있습니다.

이 두 종류의 함수를 구분하는 기준은 Grid의 생성 여부입니다. displot, catplot, relplot 함수는 모두 그래프 수준 함수이며 seaborn.axisgrid.FacetGrid를 만듭니다. 반면, countplot, hisplot, striplot 등과 같은 함수는 축 수준 함수이며 결과로 AxesSubplot을 만듭니다. FacetGrid는 여러 그래프를 포함하는 상위 그래프로, FacetGrid에서 특정 하위 AxesSubplot 그래프만 추출해 원하는 조건을 적용할 수 있습니다.

사용하는 옵션이 서로 다른 경우도 있지만 보통 그래프 수준 함수와 축 수준 함수의 옵션은 서로 호환됩니다. 다만, Matplotlib 과의 호환성이나 한 그래프 위에 다른 그래프를 겹쳐 그릴 수 있다는 점에서는 축 수준의 함수가 그래프 수준 함수보다 조금 더 유연합니다. 여기서는 그래프 수준의 함수를 중심으로 그래프를 살펴보되, 그래프 수준으로 그릴 수 없는 그래프는 축 수준 함수로 그리겠습니다. 그러면 지금부터 Seaborn을 설치해 보겠습니다.

설치

1) 파이썬 및 pip 설치 여부 확인

Seaborn을 사용하려면 파이썬과 파이썬의 패키지 관리 매니저인 pip이 필요합니다. 사용하고 있는 시스템에 파이썬과 pip이 설치되어 있는지 확인합니다. 코드는 다음과 같습니다.

python
python -V # 파이썬 설치 여부 확인
pip -v # pip 설치 여부 확인

파이썬과 pip이 잘 설치되어 있다면 Seaborn을 설치할 준비가 된 것입니다. 그러면 이제 Seaborn 라이브러리를 설치하겠습니다.

2) 패키지 설치

터미널에 pip install이라는 명령어 다음 설치하려는 패키지의 이름인 seaborn을 입력합니다.

python
pip install seaborn # Seaborn 설치

파이썬/R 배포판인 아나콘다(Anaconda)로 작업하시는 분들은 아래와 같이 pip 명령어 대신 conda 명령어를 사용하시면 됩니다.

python
conda install seaborn # Seaborn 설치

3) 설치 확인

설치 명령어를 실행했다면 라이브러리가 실제로 잘 설치되었는지 확인해 보겠습니다. 패키지의 설치 여부를 알고 싶다면 설치된 패키지의 버전 정보를 확인하면 됩니다. 다음 코드를 입력해서 설치된 Seaborn의 버전 정보가 보이면 Seaborn이 잘 설치된 것입니다.

python
import seaborn as sns
sns.__version__ # 설치된 Seaborn 버전 정보 확인

그래프를 출력해서 설치 여부를 확인할 수도 있습니다. 코드는 아래와 같습니다.

python
# Seaborn 설치 확인: 그래프 출력
import seaborn as sns
df = sns.load_dataset('penguins')
sns.pairplot(df, hue='species') # 다른 그래프 사용 가능

Seaborn 라이브러리 설치를 완료했다면 다음은 기본적인 환경 설정 방법을 알아보겠습니다.

기본 환경 설정

기본 환경 설정은 그래프 전역에 적용되는 스타일링(styling)입니다. 코드별 환경 설정에 대한 자세한 설명은 파이썬 Matplotlib 사용법(예정)을 참조해 주세요. 코드는 다음과 같습니다.

python
# 패키지 임포트
import numpy as np # Numpy(넘파이) 패키지 임포트
import pandas as pd # pandas(판다스) 패키지 임포트
import matplotlib.pyplot as plt # Matplotlib(맷플롯립) 패키지의 pyplot 모듈을 plt로 임포트
from matplotlib import rcParams # 한글 환경 설정을 위한 rcParams 임포트
import seaborn as sns # Seaborn(씨본) 패키지 임포트
import warnings
# 한글 환경 설정
def setting_styles_basic():
rcParams['font.family'] = 'Malgun Gothic' # Windows
# rcParams['font.family'] = 'AppleGothic' # Mac
rcParams['axes.unicode_minus'] = False # 한글 폰트 사용 시, 마이너스 기호가 깨지는 현상 방지
setting_styles_basic()
# 경고창 무시
warnings.filterwarnings('ignore')

Matplotlib을 이용하지 않고 Seaborn으로 환경 설정을 할 수도 있습니다.

전체 스타일링

Seaborn에서 모든 스타일링을 한 번에 설정하려면 sns.set_theme 함수를 이용하면 됩니다.

  • set_theme: 그래프 전반 및 매체별 스케일(scale), 색상 팔레트 지정

다음 함수는 sns.set_theme의 일을 역할 분담합니다.

  • set_style: 그래프 전반 스타일 지정
  • set_context: 매체별 스케일 지정
  • set_palette: 색상 팔레트 지정

set_theme

sns.set_theme 함수는 그래프 전반에 적용되는 테마(theme)를 지정하는 함수입니다. sns.set_theme 함수를 이용하면 그래프 전역의 스타일링을 지정하는 sns.set_style 함수와 사용할 매체에 적합하도록 그래프의 스케일을 조정하는 sns.set_context 함수로 하는 일을 한 번에 할 수 있습니다. 사용 예시는 다음과 같습니다.

python
custom_params = {"axes.spines.right": False, "axes.spines.top": False}
sns.set_theme(context='notebook', # 매체: paper, talk, poster
style='darkgrid', # 기본 내장 테마
palette='deep', # 그래프 색
font='Malgun Gothic', # 글꼴 종류
font_scale=1, # 글꼴 크기
rc=custom_params) # 그래프 세부 사항
context

context 파라미터는 사용하는 매체에 적합한 그래프의 스케일을 조정하는 옵션입니다. 이 파라미터를 이용하면 각 매체에 적합하게 라벨과 그래프의 크기를 맞춤 설정할 수 있습니다. 선택할 수 있는 옵션은 다음과 같습니다.

  • notebook: 기본 설정
  • paper: 논문, 보고서
  • talk: 프리젠테이션
  • poster: 포스터
style

style 파라미터는 Seaborn의 기본 내장 테마(built-in themes)를 지정하는 옵션입니다. 내장 테마에는 총 5가지 테마가 있습니다.

  • darkgrid: 회색 배경색 + 그리드
  • whitegrid: 흰색 배경색 + 그리드
  • dark: 회색 배경색
  • white: 흰색 배경색
  • ticks: 흰색 배경색 + 눈금
palette

palette 파라미터는 그래프의 색을 지정하는 옵션입니다. 사용할 수 있는 기본 색상 팔레트는 총 6가지(deep, muted, pastel, bright, dark, colorblind)입니다. 특정 팔레트를 선택하려면 sns.color_palette 함수를, 선택한 팔레트의 색상을 확인하고 싶다면 sns.palplot 함수를 이용하면 됩니다.

python
palette = sns.color_palette('deep')
sns.palplot(palette)
font, font_scale

fontfont_scale은 각각 글꼴의 종류와 크기를 지정하는 파라미터입니다. Matplotlib의 rcParams에서 font.familyfont.size가 하는 일과 동일한 일을 수행합니다.

python
from matplotlib import rcParams
rcParams['font.family'] = 'Malgun Gothic' # Windows
rcParams['font.size'] = 18

Matplotlib의 rcParams에서처럼 그래프의 세부 사항 전반을 조정하고 싶다면 rc 파라미터를 이용하면 됩니다.

rc

rc 파라미터는 축(axes), 그리드(grid), 눈금(ticks), 글꼴(font) 등 그래프의 세부 사항을 전반을 조정하는 파라미터입니다. sns.plotting_context 함수를 사용하면 현재 그래프에 적용되고 있는 설정값을 알 수 있습니다. rc 파라미터에서 사용할 수 있는 설정값은 다음과 같습니다.

python
sns.plotting_context()
# 결과
{'axes.facecolor': 'white',
'axes.edgecolor': 'black',
'axes.grid': False,
'axes.axisbelow': 'line',
'axes.labelcolor': 'black',
'figure.facecolor': 'white',
'grid.color': '#b0b0b0',
'grid.linestyle': '-',
'text.color': 'black',
'xtick.color': 'black',
'ytick.color': 'black',
'xtick.direction': 'out',
'ytick.direction': 'out',
'lines.solid_capstyle': <CapStyle.projecting: 'projecting'>,
'patch.edgecolor': 'black',
'patch.force_edgecolor': False,
'image.cmap': 'viridis',
'font.family': ['sans-serif'],
'font.sans-serif': ['DejaVu Sans',
'Bitstream Vera Sans',
'Computer Modern Sans Serif',
'Lucida Grande',
'Verdana',
'Geneva',
'Lucid',
'Arial',
'Helvetica',
'Avant Garde',
'sans-serif'],
'xtick.bottom': True,
'xtick.top': False,
'ytick.left': True,
'ytick.right': False,
'axes.spines.left': True,
'axes.spines.bottom': True,
'axes.spines.right': True,
'axes.spines.top': True}

여기서 axes.spines은 그래프의 축을 나타내거나 숨기는 옵션입니다. 따로 설정하지 않으면 Seaborn에서는 기본적으로 위(top), 아래(bottom), 왼편(left), 오른편(right) 총 4개의 축을 보여줍니다. 만일 위쪽 축과 오른쪽 축을 숨기고 싶다면 sns.despine 함수를 이용해도 됩니다. sns.despine 함수는 반드시 그래프 함수 다음에 사용해야 합니다.

python
sns.countplot(...)
sns.despine() # 위, 오른쪽 축 숨기기

만일 특정 축을 숨기고 싶다면 아래와 같이 숨기고 싶은 방향의 파라미터에 True 값을 전달하면 됩니다.

python
sns.countplot(...)
sns.despine(left=True, bottom=True) # 왼편, 아래편 축도 모두 숨기기

set_style

sns.set_style 함수로는 그래프 전반에 적용될 테마와 그래프의 세부 사항을 조정할 수 있습니다.

python
rc={'grid.color': '.5', 'grid.linestyle': ':'}
sns.set_style('whitegrid', rc=None)

set_context

sns.set_context 함수로는 그래프의 스케일을 지정할 수 있습니다.

python
sns.set_context('notebook', font_scale=1.25, rc={'grid.color': '.6'})

set_palette

sns.set_palette 함수로는 그래프의 색상 팔레트를 지정할 수 있습니다.

python
sns.set_palatte('colorblind')

그래프별 스타일링

그래프별 스타일링을 하려면 sns.set 함수를 이용하면 됩니다.

축 범위 제한하기: xlim, ylim

Seaborn에서 x축과 y축의 범위를 설정하려면 xlim, ylim 파라미터를 이용하면 됩니다.

python
sns.countplot(...).set(xlim=(1, 10), ylim=(0, 20))

축 라벨 숨기기: xlabel, ylabel

Seaborn에서 축에 있는 라벨을 숨기려면 xlabel, ylabel 파라미터를 이용하면 됩니다.

python
ax = sns.heatmap(...)
ax.set(xlabel="", ylabel="")

축 위치 바꾸기

축 위치를 조정하려면 ax.axis.tick_top 함수를 이용하면 됩니다.

python
ax = sns.heatmap(...)
ax.xaxis.tick_top() # x축 아래에서 위로 옮기기
ax.yaxis.tick_left # y축 왼쪽에서 오른쪽으로 옮기기

그래프 크기 조정하기

Seaborn에서 개별 그래프의 크기를 조정하려면 rc 파라미터를 이용하면 됩니다.

python
sns.barplot(...)
sns.set(rc={'figure.figsize':(10,7)})

설치와 기본 환경 설정을 모두 마쳤다면 이제 데이터를 로딩(loading)해오겠습니다.

데이터

Seaborn에서는 데이터를 외부에서 가져올 수도 있고, 내장 데이터(built-in data)를 사용할 수도 있습니다.

1) 데이터 선택

외부 데이터

외부 데이터를 가져와서 사용하려면 pandas를 이용하면 됩니다. CSV 파일과 엑셀 파일을 DataFrame 객체로 불러오는 코드는 다음과 같습니다.

python
import pandas as pd
df = pd.read_csv('data.csv') # CSV 파일 가져오기
# 또는
df = pd.read_excel('data.xlsx') # 엑셀 파일 가져오기

pandas에서 데이터를 로딩하는 자세한 방법은 Python pandas 데이터 생성, 로딩 및 저장, 색인 관리하는 법에서 '로딩 및 저장' 편을 참조해 주세요. 여기서는 Seaborn의 내장 데이터를 사용하겠습니다.

내장 데이터

Seaborn에는 다양한 내장 데이터셋이 있습니다. 패키지 내에 어떤 내장 데이터셋이 있는지 알아보려면 sns.get_dataset_names 함수를 이용하면 됩니다. 코드는 다음과 같습니다.

python
sns.get_dataset_names()
# 결과
['anagrams', 'anscombe', 'attention', 'brain_networks', 'car_crashes', 'diamonds',
'dots', 'exercise', 'flights', 'fmri', 'gammas', 'geyser', 'iris', 'mpg',
'penguins', 'planets', 'taxis', 'tips', 'titanic']

이 데이터셋 중에서 몇 가지를 선택해서 데이터를 가져와 보도록 하겠습니다.

2) 데이터 로딩

내장 데이터를 로딩하려면 sns.load_dataset 함수를 사용하면 됩니다. pandas를 이용해 가져온 외부 데이터와 마찬가지로 sns.load_dataset 함수로 불러온 데이터 형식도 DataFrame 객체입니다. 여기서는 다음 데이터셋을 불러와 보겠습니다.

python
df_titanic = sns.load_dataset('titanic') # 타이타닉호 데이터
df_iris = sns.load_dataset('iris') # 붓꽃 데이터
df_penguins = sns.load_dataset('penguins') # 펭귄 데이터
df_tips = sns.load_dataset('tips') # 팁 데이터
df_diamonds = sns.load_dataset('diamonds') # 다이아몬드 데이터
df_planets = sns.load_dataset('planets') # 행성 데이터

3) 데이터 구조 파악

데이터셋이 잘 준비되었다면 데이터의 구조를 간단히 살펴보겠습니다. pandas에서 데이터를 확인하는 자세한 방법을 알고 싶으시다면 Python pandas 데이터 확인, 정렬, 선택하는 법에서 "데이터 확인" 부분을 참조해 주세요.

python
df.shape # DataFrame의 열과 행의 개수 출력하기
df.head() # DataFrame의 첫 부분 출력하기
df['class'] # 열 이름이 'class'인 부분의 모든 데이터 레코드 가져오기

데이터셋이 잘 준비되었다면 이제 본격적으로 시각화를 해보겠습니다. 기본편에서 시각화할 데이터는 1차원 데이터입니다. 1차원 데이터란 속성(attribute)이 1개인 데이터입니다. Numpy 배열에서 원소를 한 줄로 나타낼 수 있는 데이터, 엑셀에서 열(columns)이 1개인 데이터, 독립변수(independent variable) 또는 변량(variate)이 1개인 데이터라고도 볼 수 있습니다.

1차원 데이터는 수치형과 범주형으로 나뉩니다. 수치형은 변수가 실숫값인 연속적 변수(continous variables)입니다. 이산적 변수(discrete variables)도 수치형에 포함됩니다. 범주형은 변수가 카테고리(category)처럼 분류된 질적 변수(qualitative variables)를 의미합니다. 그럼 1차원 범주형 데이터부터 시각화해 보겠습니다.

1차원 데이터 시각화: 범주형

일변량 범주형 자료를 시각화하는 데는 막대그래프(bar graph)와 파이 차트(pie chart)를 이용합니다. 다만, Seaborn에는 파이 차트를 그리는 기능이 없습니다. 파이 차트를 그리려면 Matplotlib을 이용해야 합니다. 자세한 방법은 파이썬 Matplotlib 사용법(예정)을 참조해 주세요. 여기서는 Seaborn으로 막대그래프를 그리는 법을 살펴보겠습니다.

1) 수직 막대그래프

Seaborn으로 막대그래프를 그리는 함수는 sns.countplot입니다. 이 함수는 각 범주에 속하는 데이터의 빈도(개수)를 막대의 높이로 표시합니다. 먼저 수직 막대그래프부터 그려보겠습니다.

기본

Seaborn으로 수직 막대그래프를 그리는 기본 코드는 다음과 같습니다.

python
sns.countplot(df_titanic['class']) # 코드1
sns.countplot(x=df_titanic['class']) # 코드1
sns.countplot(x='class', data=df_titanic) # 코드1

코드1에 아래와 같이 옵션을 추가할 수도 있습니다.

  • color: 막대 색 지정
  • edgecolor: 막대 테두리색 지정
  • palette: 그래프 색 지정
  • alpha: 그래프 투명도 지정
  • linewidth: 그래프 굵기 지정

palette의 다양한 옵션은 Seaborn 공식 홈페이지 color palette에서 확인하실 수 있습니다.

python
sns.countplot(x='class', data=df_titanic, color='skyblue') # 코드2
sns.countplot(x='class', data=df_titanic, palette='Set3') # 코드3
sns.countplot(x='class', data=df_titanic, # 코드4
facecolor=(0, 0, 0, 0),
linewidth=5,
edgecolor=sns.color_palette('dark', 3))

코드를 실행하면 다음과 같은 결과가 출력됩니다.

countplot 함수로 그린 수직 막대그래프
countplot 함수로 그린 수직 막대그래프  - Snug Archive

sns.countplot 함수 외에도 sns.catplot 함수를 이용할 수도 있습니다. sns.catplot 함수는 수치형 변수와 범주형 변수의 관계를 나타내는 함수이지만, 여기에 kind='count' 옵션을 추가하면 코드1과 동일한 결과를 얻을 수 있습니다.

python
sns.catplot(x='class', kind='count', data=df_titanic) # 코드1
catplot 함수로 그린 수직 막대그래프
catplot 함수로 그린 수직 막대그래프  - Snug Archive

내림차순 정렬

만일 막대그래프를 내림차순으로 정렬하고 싶다면 order 파라미터에 df.value_counts().index 코드를 더해주면 됩니다. df.value_counts().index는 변수의 값을 빈도가 높은 순으로 정렬해줍니다. 예시 코드는 다음과 같습니다.

python
sns.countplot(x='class', data=df_titanic,
order=df_titanic['class'].value_counts().index)
내림차순으로 정렬한 수직 막대그래프
내림차순으로 정렬한 수직 막대그래프  - Snug Archive

요약값 표시

각 막대 위에 요약값을 숫자로 표시하고 싶다면 그래프를 변수에 할당한 뒤 ax.bar_label(ax.containers[0]) 코드를 추가하면 됩니다.

python
ax = sns.countplot(df_titanic['class'])
ax.bar_label(ax.containers[0])
요약값을 표시한 수직 막대그래프
요약값을 표시한 수직 막대그래프  - Snug Archive

색깔 강조

특정 막대의 색깔을 강조할 수도 있습니다. 예를 들어 가장 빈도수가 높은 막대만 다른 색으로 표시하고 싶다면 numpysns.barplot 함수를 이용하면 됩니다. 예시 코드는 다음과 같습니다.

python
values = np.array(df_titanic['class'].value_counts())
idx = np.array(df_titanic['class'].value_counts().index)
palette = ['skyblue' if (x == max(values)) else 'lightgrey' for x in values]
sns.barplot(x=idx, y=values, palette=palette)
특정 막대를 다른 색으로 강조한 수직 막대그래프
특정 막대를 다른 색으로 강조한 수직 막대그래프  - Snug Archive

2) 수평 막대그래프

Seaborn으로 일변량 범주형 자료에 대한 가로 막대그래프를 그리려면 sns.countplot 함수에 x 매개변수 대신 y매개변수를 사용하면 됩니다. 예제 코드는 다음과 같습니다.

python
sns.countplot(y='class', data=df_titanic) # 코드1
sns.catplot(y='class', kind='count', palette='ch:.25', data=df_titanic) # 코드2
countplot 함수로 그린 수평 막대그래프
countplot 함수로 그린 수평 막대그래프  - Snug Archive

지금까지 일변량 범주형 데이터를 막대그래프로 시각화하는 법을 살펴보았습니다. 이번에는 일변량 수치형 데이터를 시각화하는 법을 살펴보겠습니다.

1차원 데이터 시각화: 수치형

1) 점그래프

점그래프(동의어: dot graph, strip chart, 점도표)는 데이터의 실제 위치를 점(dots)으로 보여줍니다. 점그래프는 데이터의 실제 위치를 파악하는 데 유용합니다. Seaborn으로 점그래프를 그리려면 sns.stripplot 함수를 이용하면 됩니다. 코드는 다음과 같습니다.

python
sns.stripplot(data=df_iris, x='sepal_length')
# 또는
sns.stripplot(x=df_iris['sepal_length'])
stripplot 함수로 그린 점그래프
stripplot 함수로 그린 점그래프  - Snug Archive

sns.catplot 함수에 kind='strip' 옵션을 추가해도 동일한 결과를 얻을 수 있습니다.

python
sns.catplot(data=df_iris, x='sepal_length', kind='strip')

다만 점그래프의 경우 표현할 데이터 포인트들이 많아지면 점들이 겹쳐 보일 수 있습니다. 이때는 sns.swarmplot을 이용해 자료를 흩트려서(jittering) 점 사이의 간격을 조정하면 됩니다.

python
sns.swarmplot(data=df_iris, x='sepal_length')
swarmplot 함수로 흐트려 그린 점그래프
swarmplot 함수로 흐트려 그린 점그래프  - Snug Archive

2) 선분그래프

선분그래프(rug plot) 또는 러그 플롯은 모든 데이터 포인트를 축 위에 작은 선분(rug)으로 나타낸 그래프입니다. 선분 그래프의 각 선분은 실제 데이터들의 위치를 보여줍니다.

러그 플롯을 그리려면 sns.rugplot 함수를 이용하거나 sns.displot 함수에 rug=True 옵션을 주면 됩니다. 러그를 세부적으로 조정해야 할 때는 sns.displot 함수보다는 sns.rugplot 함수를 사용하는 것이 좋습니다.

  • height: 선분 길이 지정
  • clip_on: 선분 축 밖에 그리기 지정
  • lw: 선분 얇기 지정
  • alpha: 선분 투명도 지정
python
# 코드1: 선분 그리기
sns.displot(data=df_tips, x='total_bill', rug=True)
# 코드2: 높이 조정한 선분 그리기
sns.rugplot(data=df_tips, x='total_bill', height=.1)
# 코드3: 선분 축 밖에 그리기
sns.rugplot(data=df_tips, x='total_bill', height=-.02, clip_on=False)
# 코드4: 선분 얇게 그리기 & 투명도 추가
sns.rugplot(data=df_diamonds, x='carat', lw=1, alpha=.005)
rugplot 함수로 그린 다양한 선분그래프
rugplot 함수로 그린 다양한 선분그래프  - Snug Archive

데이터가 많아질 경우 점그래프 또는 선분그래프만으로 데이터의 분포를 파악하기 어렵습니다. 데이터 포인트가 서로 겹쳐 보이기 때문입니다. 이때 사용하면 좋은 도구가 히스토그램입니다.

3) 히스토그램

히스토그램은 데이터를 몇 개의 구간으로 나눈 후 각 구간에 포함된 데이터의 개수 또는 도수(frequency)를 그림으로 나타낸 것입니다. 데이터가 구간으로 처리되기 때문에, 많은 데이터의 분포를 파악하는 데 유용합니다.

기본

Seaborn에서 변수가 1개인 단변량 히스토그램을 만들려면 sns.histplot 함수를 이용하면 됩니다. 커널밀도추정(Kernel Density Estimation, KDE) 방법으로 스무딩(smoothing)한 히스토그램의 확률밀도함수(Probability Density Function, PDF)를 함께 그리고 싶다면 kde=True 옵션을 주면 됩니다. 코드는 다음과 같습니다.

python
sns.histplot(df_penguins, x='flipper_length_mm') # 코드1
sns.histplot(df_penguins['flipper_length_mm'], kde=True) # 코드2

sns.displot 함수를 이용해도 동일한 결과를 얻을 수 있습니다.

python
sns.displot(df_penguins, x='flipper_length_mm') # 코드1
sns.displot(df_penguins['flipper_length_mm'], kde=True) # 코드2
histplot 함수로 만든 단변량 히스토그램
histplot 함수로 만든 단변량 히스토그램  - Snug Archive
python
sns.displot(df_diamonds, x='carat', kde=True)
히스토그램과 커널밀도추정으로 구한 확률밀도함수
히스토그램과 커널밀도추정으로 구한 확률밀도함수  - Snug Archive

sns.displot 함수의 초기 기본 설정은 kind='hist'입니다. sns.displot 함수에 kind 옵션을 지정하지 않으면 해당 함수는 히스토그램을 그립니다.

특정 조건

pandas를 이용하면 데이터를 조건별로 선택할 수 있습니다. 다음 코드는 'species'가 'Adelie'인 펭귄의 'flipper_length_mm'를 관측한 값에 대해 히스토그램을 그리는 예제입니다.

python
sns.histplot(df_penguins[df_penguins['species'] == 'Adelie']['flipper_length_mm'])

등급 수와 등급 폭: bins, binwidth

히스토그램에서는 등급의 수 또는 등급의 폭에 따라 그래프의 모양이 달라집니다. 등급수는 bins 옵션으로, 등급폭은 binwidth 옵션으로 지정합니다.

python
sns.histplot(df_penguins, x='flipper_length_mm', bins=10) # 등급수: 10
sns.histplot(df_penguins, x='flipper_length_mm', binwidth=3) # 등급폭: 3
bins와 binwidth로 조정한 히스토그램
bins와 binwidth로 조정한 히스토그램  - Snug Archive

등급명, 등급명 위치, 등급 사이 공간: bins=리스트, discrete=True, shrink

히스토그램은 주로 연속적 자료를 시각화할 때 쓰이지만, 종종 이산적 자료(discrete data)를 시각화하는 데도 사용합니다. 이산적 자료는 막대그래프로 표현합니다. 단, 히스토그램을 막대그래프로 변형할 때는 다음과 같은 조정이 필요합니다.

  • 등급 명시
  • 등급명이 막대의 중앙에 오도록 위치
  • 변수가 연속적이지 않고 이산적이라는 것을 알려주기 위해 등급과 등급 사이에 여유 두기

이를 도와주는 옵션이 각각 bins=리스트, discrete=True, shrink입니다. 각 옵션이 수행하는 일은 다음과 같습니다.

  • bins=리스트: 그래프의 x축에 명시할 등급을 직접 지정
  • discrete=True: 각 등급이 막대 중앙에 오도록 위치
  • shrink: 각 막대 사이에 공간을 마련

예제 코드와 실행 결과는 다음과 같습니다.

python
# 코드1: 기본 설정(눈금의 위치 조정 필요)
sns.histplot(df_tips, x='size')
# 코드2: 등급 한계 지정
sns.histplot(df_tips, x='size', bins=[1, 2, 3, 4, 5, 6, 7])
# 코드3: 각 등급명을 막대그래프 중앙으로 이동
sns.histplot(df_tips, x='size', discrete=True)
# 코드4: 등급명 중앙으로 이동한 뒤 등급 간 공간 마련
sns.histplot(df_tips, x='size', discrete=True, shrink=.8)
등급명과 등급명의 위치, 등급 사이의 공간을 조정한 히스토그램
등급명과 등급명의 위치, 등급 사이의 공간을 조정한 히스토그램  - Snug Archive

4) 커널밀도추정으로 구한 확률밀도함수

기본

커널밀도추정(Kernel density function) 방법을 이용해 확률밀도함수(probability density function)를 그리려면 sns.kdeplot 함수를 이용하면 됩니다. 여기에 평활량(bandwidth)을 조정하려면 bw_adjust 옵션을 사용하면 됩니다. 이 옵션의 크기에 따라 확률밀도함수의 부드러움(smoothness) 정도가 달라집니다. 코드는 다음과 같습니다.

python
sns.kdeplot(data=df_penguins, x='flipper_length_mm') # 코드1
sns.kdeplot(data=df_penguins, x='flipper_length_mm', bw_adjust=.25) 코드 2

sns.displot 함수에 kind='kde'옵션을 주어도 동일한 결과를 얻을 수 있습니다.

python
sns.displot(penguins, x='flipper_length_mm', kind='kde') # 코드1
sns.displot(penguins, x='flipper_length_mm', kind='kde', bw_adjust=.25) # 코드2
kdeplot 함수로 그린 확률밀도함수
kdeplot 함수로 그린 확률밀도함수  - Snug Archive

범위 제한: cut

연속적 변수가 무한히 커지지 않는 경우에는 cut이라는 매개변수를 사용해 양 끝의 데이터 포인트 범위를 제한하는 것이 좋습니다.

python
sns.kdeplot(df_tips, x='total_bill', kind='kde') # 코드1
sns.kdeplot(df_tips, x='total_bill', kind='kde', cut=0) # 코드2
양 끝의 데이터 포인트 범위를 제한한 확률밀도함수
양 끝의 데이터 포인트 범위를 제한한 확률밀도함수  - Snug Archive

색상: shade

KDE 밀도 곡선 아래에 색을 채우고 싶다면 shade=True 옵션을 주면 됩니다.

5) 경험적 누적분포함수

경험적 누적분포함수(empirical cumulative distribution function, ECDF)는 n개의 데이터 포인트 각각에서 1/n 씩 점프하는 계단 함수입니다. 간단히 CDF라고도 합니다. ECDF 그래프를 그리려면 sns.ecdfplot 함수를 이용하면 됩니다.

python
sns.ecdfplot(df_penguins, x='flipper_length_mm')
ecdfplot 함수로 그린 경험적 누적분포함수
ecdfplot 함수로 그린 경험적 누적분포함수  - Snug Archive

sns.displot 함수에 kind='ecdf' 옵션을 주어도 동일한 결과를 얻을 수 있습니다.

python
sns.displot(df_penguins, x='flipper_length_mm', kind='ecdf')

6) 상자 그림

boxplot

상자 그림(동의어: box plot, 박스 플롯, 박스 그래프, 상자 그래프)은 데이터의 5가지 통계량(최솟값, 제1 사분위, 제 2사분위, 제 3사분위, 최댓값)을 나타내는 그래프입니다. 상자그림은 데이터의 전체적인 분포와 이상치를 확인하는 데 유용합니다. 상자그림을 그리려면 sns.boxplot 함수를 이용하면 됩니다.

python
sns.boxplot(data=df_iris, x='sepal_length')
boxplot 함수로 그린 상자 수염 그림
boxplot 함수로 그린 상자 수염 그림  - Snug Archive

sns.catplot 함수에 kind='box' 옵션을 주어도 동일한 결과를 얻을 수 있습니다.

python
sns.catplot(data=df_iris, x='sepal_length', kind='box')

boxenplot

데이터셋의 데이터 범위가 클 경우에는 sns.boxenplot을 사용할 수 있습니다. sns.boxenplot은 데이터를 더 많은 분위로 나누어 크기가 큰 데이터셋의 범주를 상자그림으로 표현해 줍니다.

python
sns.boxenplot(data=df_diamonds, x='price')
boxenplot 함수로 그린 상자그림
boxenplot 함수로 그린 상자그림  - Snug Archive

sns.catplot 함수에 kind='boxen' 옵션을 사용해도 됩니다.

python
sns.catplot(data=df_diamonds, x='price', kind='boxen')

violinplot

상자 그림과 커널밀도추정으로 구한 확률밀도함수를 합쳐서 그리려면 sns.violinplot을 이용하면 됩니다.

python
sns.violinplot(data=df_iris, x='sepal_length')
violinplot 함수로 그린 바이올린 플롯
violinplot 함수로 그린 바이올린 플롯  - Snug Archive
python
sns.catplot(data=df_iris, x='sepal_length', kind='violin')

위 그래프에서 가운데 흰색 점은 중앙값(median)을 나타냅니다. 또한, 흰색 점을 둘러싼 두꺼운 선은 사분위 범위를, 두꺼운 선에서 양 끝으로 이어지는 얇은 선은 95% 신뢰 구간을 나타냅니다.

지금까지 파이썬 Seaborn 라이브러리로 1차원 데이터를 시각화하는 법을 알아보았습니다. 다음 시간에는 파이썬 데이터 시각화 Seaborn 사용법 심화편에서 다차원 데이터를 시각화하는 법을 알아보겠습니다. 모두 수고 많으셨습니다.

참고 문헌

...

©2023 Snug Archive. All rights reserved.

Contact me at snugarchive@gmail.com.