파이썬 데이터 시각화 Seaborn 사용법 기초편
1차원 데이터 시각화
파이썬(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으로 데이터를 시각화하기 위해서는 몇 가지 준비가 필요합니다. 첫째, 실습 환경입니다. 데이터 사이언스(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
이 설치되어 있는지 확인합니다. 코드는 다음과 같습니다.
pythonpython -V # 파이썬 설치 여부 확인pip -v # pip 설치 여부 확인
파이썬과 pip
이 잘 설치되어 있다면 Seaborn을 설치할 준비가 된 것입니다. 그러면 이제 Seaborn 라이브러리를 설치하겠습니다.
2) 패키지 설치
터미널에 pip install
이라는 명령어 다음 설치하려는 패키지의 이름인 seaborn
을 입력합니다.
pythonpip install seaborn # Seaborn 설치
파이썬/R 배포판인 아나콘다(Anaconda)로 작업하시는 분들은 아래와 같이 pip
명령어 대신 conda
명령어를 사용하시면 됩니다.
pythonconda install seaborn # Seaborn 설치
3) 설치 확인
설치 명령어를 실행했다면 라이브러리가 실제로 잘 설치되었는지 확인해 보겠습니다. 패키지의 설치 여부를 알고 싶다면 설치된 패키지의 버전 정보를 확인하면 됩니다. 다음 코드를 입력해서 설치된 Seaborn의 버전 정보가 보이면 Seaborn이 잘 설치된 것입니다.
pythonimport seaborn as snssns.__version__ # 설치된 Seaborn 버전 정보 확인
그래프를 출력해서 설치 여부를 확인할 수도 있습니다. 코드는 아래와 같습니다.
python# Seaborn 설치 확인: 그래프 출력import seaborn as snsdf = 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' # MacrcParams['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
함수로 하는 일을 한 번에 할 수 있습니다. 사용 예시는 다음과 같습니다.
pythoncustom_params = {"axes.spines.right": False, "axes.spines.top": False}sns.set_theme(context='notebook', # 매체: paper, talk, posterstyle='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
함수를 이용하면 됩니다.
pythonpalette = sns.color_palette('deep')sns.palplot(palette)
font, font_scale
font
와 font_scale
은 각각 글꼴의 종류와 크기를 지정하는 파라미터입니다. Matplotlib의 rcParams
에서 font.family
와 font.size
가 하는 일과 동일한 일을 수행합니다.
pythonfrom matplotlib import rcParamsrcParams['font.family'] = 'Malgun Gothic' # WindowsrcParams['font.size'] = 18
Matplotlib의 rcParams
에서처럼 그래프의 세부 사항 전반을 조정하고 싶다면 rc
파라미터를 이용하면 됩니다.
rc
rc
파라미터는 축(axes), 그리드(grid), 눈금(ticks), 글꼴(font) 등 그래프의 세부 사항을 전반을 조정하는 파라미터입니다. sns.plotting_context
함수를 사용하면 현재 그래프에 적용되고 있는 설정값을 알 수 있습니다. rc
파라미터에서 사용할 수 있는 설정값은 다음과 같습니다.
pythonsns.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
함수는 반드시 그래프 함수 다음에 사용해야 합니다.
pythonsns.countplot(...)sns.despine() # 위, 오른쪽 축 숨기기
만일 특정 축을 숨기고 싶다면 아래와 같이 숨기고 싶은 방향의 파라미터에 True
값을 전달하면 됩니다.
pythonsns.countplot(...)sns.despine(left=True, bottom=True) # 왼편, 아래편 축도 모두 숨기기
set_style
sns.set_style
함수로는 그래프 전반에 적용될 테마와 그래프의 세부 사항을 조정할 수 있습니다.
pythonrc={'grid.color': '.5', 'grid.linestyle': ':'}sns.set_style('whitegrid', rc=None)
set_context
sns.set_context
함수로는 그래프의 스케일을 지정할 수 있습니다.
pythonsns.set_context('notebook', font_scale=1.25, rc={'grid.color': '.6'})
set_palette
sns.set_palette
함수로는 그래프의 색상 팔레트를 지정할 수 있습니다.
pythonsns.set_palatte('colorblind')
그래프별 스타일링
그래프별 스타일링을 하려면 sns.set
함수를 이용하면 됩니다.
축 범위 제한하기: xlim, ylim
Seaborn에서 x축과 y축의 범위를 설정하려면 xlim
, ylim
파라미터를 이용하면 됩니다.
pythonsns.countplot(...).set(xlim=(1, 10), ylim=(0, 20))
축 라벨 숨기기: xlabel, ylabel
Seaborn에서 축에 있는 라벨을 숨기려면 xlabel
, ylabel
파라미터를 이용하면 됩니다.
pythonax = sns.heatmap(...)ax.set(xlabel="", ylabel="")
축 위치 바꾸기
축 위치를 조정하려면 ax.axis.tick_top
함수를 이용하면 됩니다.
pythonax = sns.heatmap(...)ax.xaxis.tick_top() # x축 아래에서 위로 옮기기ax.yaxis.tick_left # y축 왼쪽에서 오른쪽으로 옮기기
그래프 크기 조정하기
Seaborn에서 개별 그래프의 크기를 조정하려면 rc
파라미터를 이용하면 됩니다.
pythonsns.barplot(...)sns.set(rc={'figure.figsize':(10,7)})
설치와 기본 환경 설정을 모두 마쳤다면 이제 데이터를 로딩(loading)해오겠습니다.
데이터
Seaborn에서는 데이터를 외부에서 가져올 수도 있고, 내장 데이터(built-in data)를 사용할 수도 있습니다.
1) 데이터 선택
외부 데이터
외부 데이터를 가져와서 사용하려면 pandas를 이용하면 됩니다. CSV 파일과 엑셀 파일을 DataFrame 객체로 불러오는 코드는 다음과 같습니다.
pythonimport pandas as pddf = pd.read_csv('data.csv') # CSV 파일 가져오기# 또는df = pd.read_excel('data.xlsx') # 엑셀 파일 가져오기
pandas에서 데이터를 로딩하는 자세한 방법은 Python pandas 데이터 생성, 로딩과 저장, 색인 관리하는 법에서 '로딩 및 저장' 편을 참조해 주세요. 여기서는 Seaborn의 내장 데이터를 사용하겠습니다.
내장 데이터
Seaborn에는 다양한 내장 데이터셋이 있습니다. 패키지 내에 어떤 내장 데이터셋이 있는지 알아보려면 sns.get_dataset_names
함수를 이용하면 됩니다. 코드는 다음과 같습니다.
pythonsns.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 객체입니다. 여기서는 다음 데이터셋을 불러와 보겠습니다.
pythondf_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 데이터 확인, 정렬, 선택하는 법에서 "데이터 확인" 부분을 참조해 주세요.
pythondf.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으로 수직 막대그래프를 그리는 기본 코드는 다음과 같습니다.
pythonsns.countplot(df_titanic['class']) # 코드1sns.countplot(x=df_titanic['class']) # 코드1sns.countplot(x='class', data=df_titanic) # 코드1
코드1에 아래와 같이 옵션을 추가할 수도 있습니다.
- color: 막대 색 지정
- edgecolor: 막대 테두리색 지정
- palette: 그래프 색 지정
- alpha: 그래프 투명도 지정
- linewidth: 그래프 굵기 지정
palette
의 다양한 옵션은 Seaborn 공식 홈페이지 color palette에서 확인하실 수 있습니다.
pythonsns.countplot(x='class', data=df_titanic, color='skyblue') # 코드2sns.countplot(x='class', data=df_titanic, palette='Set3') # 코드3sns.countplot(x='class', data=df_titanic, # 코드4facecolor=(0, 0, 0, 0),linewidth=5,edgecolor=sns.color_palette('dark', 3))
코드를 실행하면 다음과 같은 결과가 출력됩니다.
sns.countplot
함수 외에도 sns.catplot
함수를 이용할 수도 있습니다. sns.catplot
함수는 수치형 변수와 범주형 변수의 관계를 나타내는 함수이지만, 여기에 kind='count'
옵션을 추가하면 코드1과 동일한 결과를 얻을 수 있습니다.
pythonsns.catplot(x='class', kind='count', data=df_titanic) # 코드1
내림차순 정렬
만일 막대그래프를 내림차순으로 정렬하고 싶다면 order
파라미터에 df.value_counts().index
코드를 더해주면 됩니다. df.value_counts().index
는 변수의 값을 빈도가 높은 순으로 정렬해줍니다. 예시 코드는 다음과 같습니다.
pythonsns.countplot(x='class', data=df_titanic,order=df_titanic['class'].value_counts().index)
요약값 표시
각 막대 위에 요약값을 숫자로 표시하고 싶다면 그래프를 변수에 할당한 뒤 ax.bar_label(ax.containers[0])
코드를 추가하면 됩니다.
pythonax = sns.countplot(df_titanic['class'])ax.bar_label(ax.containers[0])
색깔 강조
특정 막대의 색깔을 강조할 수도 있습니다. 예를 들어 가장 빈도수가 높은 막대만 다른 색으로 표시하고 싶다면 numpy
와 sns.barplot
함수를 이용하면 됩니다. 예시 코드는 다음과 같습니다.
pythonvalues = 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)
2) 수평 막대그래프
Seaborn으로 일변량 범주형 자료에 대한 가로 막대그래프를 그리려면 sns.countplot
함수에 x
매개변수 대신 y매개변수를 사용하면 됩니다. 예제 코드는 다음과 같습니다.
pythonsns.countplot(y='class', data=df_titanic) # 코드1sns.catplot(y='class', kind='count', palette='ch:.25', data=df_titanic) # 코드2
지금까지 일변량 범주형 데이터를 막대그래프로 시각화하는 법을 살펴보았습니다. 이번에는 일변량 수치형 데이터를 시각화하는 법을 살펴보겠습니다.
1차원 데이터 시각화: 수치형
1) 점그래프
점그래프(동의어: dot graph, strip chart, 점도표)는 데이터의 실제 위치를 점(dots)으로 보여줍니다. 점그래프는 데이터의 실제 위치를 파악하는 데 유용합니다. Seaborn으로 점그래프를 그리려면 sns.stripplot
함수를 이용하면 됩니다. 코드는 다음과 같습니다.
pythonsns.stripplot(data=df_iris, x='sepal_length')# 또는sns.stripplot(x=df_iris['sepal_length'])
sns.catplot
함수에 kind='strip'
옵션을 추가해도 동일한 결과를 얻을 수 있습니다.
pythonsns.catplot(data=df_iris, x='sepal_length', kind='strip')
다만 점그래프의 경우 표현할 데이터 포인트들이 많아지면 점들이 겹쳐 보일 수 있습니다. 이때는 sns.swarmplot
을 이용해 자료를 흩트려서(jittering) 점 사이의 간격을 조정하면 됩니다.
pythonsns.swarmplot(data=df_iris, x='sepal_length')
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)
데이터가 많아질 경우 점그래프 또는 선분그래프만으로 데이터의 분포를 파악하기 어렵습니다. 데이터 포인트가 서로 겹쳐 보이기 때문입니다. 이때 사용하면 좋은 도구가 히스토그램입니다.
3) 히스토그램
히스토그램은 데이터를 몇 개의 구간으로 나눈 후 각 구간에 포함된 데이터의 개수 또는 도수(frequency)를 그림으로 나타낸 것입니다. 데이터가 구간으로 처리되기 때문에, 많은 데이터의 분포를 파악하는 데 유용합니다.
기본
Seaborn에서 변수가 1개인 단변량 히스토그램을 만들려면 sns.histplot
함수를 이용하면 됩니다. 커널밀도추정(Kernel Density Estimation, KDE) 방법으로 스무딩(smoothing)한 히스토그램의 확률밀도함수(Probability Density Function, PDF)를 함께 그리고 싶다면 kde=True
옵션을 주면 됩니다. 코드는 다음과 같습니다.
pythonsns.histplot(df_penguins, x='flipper_length_mm') # 코드1sns.histplot(df_penguins['flipper_length_mm'], kde=True) # 코드2
sns.displot
함수를 이용해도 동일한 결과를 얻을 수 있습니다.
pythonsns.displot(df_penguins, x='flipper_length_mm') # 코드1sns.displot(df_penguins['flipper_length_mm'], kde=True) # 코드2
pythonsns.displot(df_diamonds, x='carat', kde=True)
sns.displot
함수의 초기 기본 설정은 kind='hist'
입니다. sns.displot
함수에 kind
옵션을 지정하지 않으면 해당 함수는 히스토그램을 그립니다.
특정 조건
pandas를 이용하면 데이터를 조건별로 선택할 수 있습니다. 다음 코드는 'species'가 'Adelie'인 펭귄의 'flipper_length_mm'를 관측한 값에 대해 히스토그램을 그리는 예제입니다.
pythonsns.histplot(df_penguins[df_penguins['species'] == 'Adelie']['flipper_length_mm'])
등급 수와 등급 폭: bins, binwidth
히스토그램에서는 등급의 수 또는 등급의 폭에 따라 그래프의 모양이 달라집니다. 등급수는 bins
옵션으로, 등급폭은 binwidth
옵션으로 지정합니다.
pythonsns.histplot(df_penguins, x='flipper_length_mm', bins=10) # 등급수: 10sns.histplot(df_penguins, x='flipper_length_mm', binwidth=3) # 등급폭: 3
등급명, 등급명 위치, 등급 사이 공간: 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)
4) 커널밀도추정으로 구한 확률밀도함수
기본
커널밀도추정(Kernel density function) 방법을 이용해 확률밀도함수(probability density function)를 그리려면 sns.kdeplot
함수를 이용하면 됩니다. 여기에 평활량(bandwidth)을 조정하려면 bw_adjust
옵션을 사용하면 됩니다. 이 옵션의 크기에 따라 확률밀도함수의 부드러움(smoothness) 정도가 달라집니다. 코드는 다음과 같습니다.
pythonsns.kdeplot(data=df_penguins, x='flipper_length_mm') # 코드1sns.kdeplot(data=df_penguins, x='flipper_length_mm', bw_adjust=.25) 코드 2
sns.displot
함수에 kind='kde'
옵션을 주어도 동일한 결과를 얻을 수 있습니다.
pythonsns.displot(penguins, x='flipper_length_mm', kind='kde') # 코드1sns.displot(penguins, x='flipper_length_mm', kind='kde', bw_adjust=.25) # 코드2
범위 제한: cut
연속적 변수가 무한히 커지지 않는 경우에는 cut
이라는 매개변수를 사용해 양 끝의 데이터 포인트 범위를 제한하는 것이 좋습니다.
pythonsns.kdeplot(df_tips, x='total_bill', kind='kde') # 코드1sns.kdeplot(df_tips, x='total_bill', kind='kde', cut=0) # 코드2
색상: shade
KDE 밀도 곡선 아래에 색을 채우고 싶다면 shade=True
옵션을 주면 됩니다.
5) 경험적 누적분포함수
경험적 누적분포함수(empirical cumulative distribution function, ECDF)는 n개의 데이터 포인트 각각에서 1/n 씩 점프하는 계단 함수입니다. 간단히 CDF라고도 합니다. ECDF 그래프를 그리려면 sns.ecdfplot
함수를 이용하면 됩니다.
pythonsns.ecdfplot(df_penguins, x='flipper_length_mm')
sns.displot
함수에 kind='ecdf'
옵션을 주어도 동일한 결과를 얻을 수 있습니다.
pythonsns.displot(df_penguins, x='flipper_length_mm', kind='ecdf')
6) 상자 그림
boxplot
상자 그림(동의어: box plot, 박스 플롯, 박스 그래프, 상자 그래프)은 데이터의 5가지 통계량(최솟값, 제1 사분위, 제 2사분위, 제 3사분위, 최댓값)을 나타내는 그래프입니다. 상자그림은 데이터의 전체적인 분포와 이상치를 확인하는 데 유용합니다. 상자그림을 그리려면 sns.boxplot
함수를 이용하면 됩니다.
pythonsns.boxplot(data=df_iris, x='sepal_length')
sns.catplot
함수에 kind='box'
옵션을 주어도 동일한 결과를 얻을 수 있습니다.
pythonsns.catplot(data=df_iris, x='sepal_length', kind='box')
boxenplot
데이터셋의 데이터 범위가 클 경우에는 sns.boxenplot
을 사용할 수 있습니다. sns.boxenplot
은 데이터를 더 많은 분위로 나누어 크기가 큰 데이터셋의 범주를 상자그림으로 표현해 줍니다.
pythonsns.boxenplot(data=df_diamonds, x='price')
sns.catplot
함수에 kind='boxen'
옵션을 사용해도 됩니다.
pythonsns.catplot(data=df_diamonds, x='price', kind='boxen')
violinplot
상자 그림과 커널밀도추정으로 구한 확률밀도함수를 합쳐서 그리려면 sns.violinplot
을 이용하면 됩니다.
pythonsns.violinplot(data=df_iris, x='sepal_length')
pythonsns.catplot(data=df_iris, x='sepal_length', kind='violin')
위 그래프에서 가운데 흰색 점은 중앙값(median)을 나타냅니다. 또한, 흰색 점을 둘러싼 두꺼운 선은 사분위 범위를, 두꺼운 선에서 양 끝으로 이어지는 얇은 선은 95% 신뢰 구간을 나타냅니다.
지금까지 파이썬 Seaborn 라이브러리로 1차원 데이터를 시각화하는 법을 알아보았습니다. 다음 시간에는 파이썬 데이터 시각화 Seaborn 사용법 심화편에서 다차원 데이터를 시각화하는 법을 알아보겠습니다. 모두 수고 많으셨습니다.
참고 문헌
- [1] 데이터 사이언스 스쿨, 「파이썬편 5장 데이터 시각화: Seaborn을 사용한 데이터 분포 시각화」, 데이터 사이언스 스쿨, "https://datascienceschool.net/"
- [2] 아무튼워라벨, 「정규화(Normalization) 쉽게 이해하기」, 아무튼워라벨, "https://hleecaster.com/ml-normalization-concept/"
- [3] 아무튼워라벨, 「[seaborn] 바이올린 플롯」, 아무튼워라벨, "https://hleecaster.com/python-seaborn-violinplot/"
- [4] Codeacademy Team, 「Seaborn Styling, Part 1: Figure Style and Scale」, Codecademy, "https://www.codecademy.com/article/seaborn-design-i"
- [5] Codeacademy Team, 「Seaborn Styling, Part 2: Color」, Codecademy, "https://www.codecademy.com/article/seaborn-design-ii"
- [6] Mahbubul Alam, 「Seaborn can do the job, then why Matplotlib?」, Towards Data Science, "https://towardsdatascience.com/seaborn-can-do-the-job-then-why-matplotlib-dac8d2d24a5f"
- [7] Seaborn, 「seaborn: statistical data visualization」, Seaborn, "https://seaborn.pydata.org/index.html"
- [8] StackOverflow, 「How to set a different color to the largest bar in a seaborn barplot」, StackOverflow, "https://stackoverflow.com/questions/31074758/how-to-set-a-different-color-to-the-largest-bar-in-a-seaborn-barplot"