
지난 시간에는 파이썬의 Seaborn 라이브러리를 이용해 변수가 1개인 단변량 데이터(univariate data)를 시각화하는 법을 살펴보았습니다. 이번 시간에는 변수가 2개인 이변량 데이터(bivariate data)와 3개 이상인 다변량 데이터(multivariate data)를 시각화는 법을 알아보겠습니다. Seaborn 사용을 위한 기본 환경 설정 방법과 그래프 스타일링, 1차원 데이터를 시각화하는 방법을 알고 싶은 분들은 파이썬 데이터 시각화 Seaborn 사용법 기초편을 먼저 읽으시기를 추천드립니다.
다변량 데이터를 시각화하는 그래프의 종류는 다음과 같습니다.
- 다차원 범주형 데이터 시각화
- 빈도 막대그래프(병렬): catplot(kind='count')
- 빈도 막대그래프(다중, 누적): countplot
- 요약 통계값 막대그래프: barplot
- 요약 통계값 포인트그래프: pointplot
- 상자그 림: boxplot, boxenplot, violinplot
- 다차원 수치형 데이터 시각화
- 점그래프(dot plot): stripplot, swarmplot
- 선분그래프(rug plot): rugplot
- 히스토그램(histogram): histplot
- 밀도그림(density plot): kdeplot
- 경험적 누적분포함수(empirical cumulative distribution function): ecdfplot
- 다차원 데이터 관계 시각화
- 선그래프(line plot): lineplot
- 산점도(scatter plot): scatterplot
- 결합/주변분포도(joint/marginal distribution plot): jointplot
- 산점도 행렬(scatter plot matrix): pairplot
- 상관 행렬(correlation matrix): heatmap, clustermap
- 회귀 그래프(regression plot): regplot, lmplot, residplot

준비
실습을 위해서는 개발 환경(development environments)과 데이터가 필요합니다. 먼저 개발 환경부터 알아보겠습니다.
기본 환경 설정
글에서는 개발 환경으로 주피터 노트북(Jupyter notebook)을 사용했습니다. 여기서는 시각화 실습을 하는데 필요한 최소한의 설정만 적용하겠습니다. 코드별 자세한 설명은 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')
다음으로는 그래프의 스케일(scale)을 조정하겠습니다. 스케일 조정은 sns.set_context 함수를 이용해 설정할 수 있습니다. Seaborn의 다양한 스타일링 방법은 파이썬 데이터 시각화 Seaborn 사용법 기초편의 스타일링 부분을 참조해 주세요. 코드 실행 결과는 그래프 전역에 적용됩니다. 코드는 다음과 같습니다.
pythonsns.set_context('paper', # notebook, talk, posterrc={'font.size':15,'xtick.labelsize':15,'ytick.labelsize':15,'axes.labelsize':15})
실습을 위한 기본적인 환경 설정을 마쳤다면 다음은 데이터를 준비할 차례입니다.
데이터
실습을 위해서 Seaborn의 내장 데이터를 load_dataset() 함수를 이용해 로딩해 오겠습니다. 특정 데이터셋은 Sklearn(사이킷런)에서 불러와 pandas의 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') # 행성 데이터df_flights = sns.load_dataset('flights') # 비행 데이터from sklearn.datasets import load_winewine_data = load_wine()df_wines = pd.DataFrame(data=wine_data.data, # 와인 데이터columns=wine_data.feature_names)
그럼 지금부터 다변량 데이터를 시각화하는 법을 살펴보겠습니다. 다변량 데이터는 변량이 2개인 이변량 데이터와 변량이 3개 이상인 데이터를 포함합니다. 다변량 데이터를 그래프로 표현할 때는 색상으로 구분하는 hue, 캔버스로 구분하는 col, 점 크기로 구분하는 size 등의 파라미터를 이용해 시각화 차원을 넓혀나갈 수 있습니다. 먼저 다변량 범주형 데이터를 시각화해 보겠습니다.
다차원 데이터 시각화: 범주형
다변량 범주형 자료를 시각화하는 Seaborn의 그래프는 빈도 막대그래프(병렬, 다중, 누적)가 있습니다.
1) 빈도 막대그래프: countplot()
빈도 막대그래프(카운트플롯)은 범주형 데이터의 개수를 표현합니다.
병렬 빈도 막대그래프
병렬 막대그래프는 두 변량에 대한 빈도 막대그래프 2개를 각각의 캔버스(canvas)에 병렬로 나열한 그래프입니다. Seaborn으로 병렬 빈도 막대그래프를 그리려면 catplot() 함수에 kind='count' 와 col 옵션을 추가하면 됩니다. countplot() 함수로는 병렬 막대그래프를 그릴 수 없습니다.
pythonsns.catplot(x='class',col='who', # 캔버스 분리하기kind='count', # 빈도 막대그래프 그리기data=df_titanic)

다중 빈도 막대그래프
다중 빈도 막대그래프는 countplot() 또는 catplot()에 hue 파라미터를 설정해서 그릴 수 있습니다. hue 옵션은 변량을 색상으로 구분하는 파라미터입니다. 먼저 수직 다중 빈도 막대그래프부터 그려보겠습니다.
수직 다중 빈도 막대그래프
countplot() 함수 또는 caplot() 함수로 수직 다중 빈도 막대그래프를 그리려면 해당 함수의 x 파라미터에 가로축 범주로 사용할 DataFrame의 열 이름을 입력하고, hue 파라미터에 다른 색상으로 구분할 DataFrame의 열 이름을 입력하면 됩니다. 코드는 다음과 같습니다.
pythonsns.countplot(x='class', hue='who', data=df_titanic) # 코드1# 또는# 코드2sns.catplot(x='class', hue='who', kind='count',palette='pastel', # 색상 팔레트 지정: {'man': 'b', 'woman': 'g', 'child': 'r'}edgecolor='.6', # 막대 테두리 색상 투명도 지정data=df_titanic)

histplot() 함수에 multiple='dodge' 옵션을 주어도 다중 빈도 막대그래프를 그릴 수 있습니다. histplot() 함수는 수치형 자료를 히스토그램으로 만들 때 사용하는 함수이지만, 히스토그램의 막대 사이에 간격을 주고 x축 눈금을 없애면 히스토그램을 일반 막대그래프처럼 만들 수 있습니다. 예시 코드는 다음과 같습니다.
pythonax = sns.histplot(x='sex', hue='survived',multiple='dodge', # 다중 막대그래프 그리기shrink=.8, # 막대 사이 간격 조정data=df_titanic)ax.tick_params(bottom=False) # x축 눈금 숨기기

이번에는 수평 다중 막대그래프를 그려보겠습니다.
수평 다중 빈도 막대그래프
수평 다중 막대그래프를 그리고 싶다면 수직 다중 막대그래프를 그릴 때 사용한 함수에 x 파라미터 대신 y 파라미터를 사용하면 됩니다.
pythonsns.countplot(y='class', hue='who', data=df_titanic) # 코드1# 또는sns.catplot(y='class', hue='who', kind='count',palette='pastel', edgecolor='.6',data=df_titanic) # 코드2

누적 빈도 막대그래프
Seaborn으로 누적 빈도 막대그래프를 만들려면 histplot() 함수에 multiple='stack' 옵션을 주면 됩니다.
수직 누적 빈도 막대그래프
pythonax = sns.histplot(x='sex', hue='survived',multiple='stack', # 누적 막대그래프 그리기shrink=.8, # 막대 사이 간격 조정data=df_titanic)ax.tick_params(bottom=False) # x축 눈금 안 보이게 하기

수평 누적 빈도 막대그래프
수평 누적 빈도 막대그래프를 그리려면 x 파라미터 대신 y 파라미터를 사용하면 됩니다.
pythonax = sns.histplot(y='sex', hue='survived',multiple='stack', # 누적 막대그래프 그리기shrink=.8, # 막대 사이 간격 조정palette='pastel', # 색상 팔레트 지정data=df_titanic);ax.tick_params(left=False) # y축 눈금 안 보이게 하기

2) 요약 통계량 막대그래프: barplot()
요약 통계량 막대그래프는 범주형 자료에 대한 수치형 데이터를 부트스트랩 샘플링(원본 데이터와 동일한 크기의 샘플을 여러 번 복원 추출)하여 얻은 표본들의 평균과 그 평균의 신뢰구간(confidence interval)을 나타낸 막대그래프입니다. 신뢰구간은 막대 위 검정색 오차 막대(error bar)로 표현됩니다. 요약 통계값 막대그래프를 그리려면 barplot() 함수를 사용하면 됩니다. catplot() 함수에 kind='bar' 옵션을 주어도 됩니다.
기본적으로는 복원 샘플링된 표본들의 평균과 95% 신뢰구간이 표현되지만 estimator 파라미터와 ci 파라미터로 각각 요약 통계값과 신뢰구간을 지정할 수 있습니다. 옵션은 다음과 같습니다.
- estimator: 중앙값
np.median, 합계np.sum등- ci: 신뢰구간 지정(기본값: 95),
sd로 설정 시 표준편차(standard deviation)로 변경 가능,None으로 설정 시 오차 막대 제거- n_boot: 부트스트랩 샘플링 횟수(기본값: 1000)
먼저 수직 요약 막대그래프를 그리는 법부터 알아보겠습니다.
기본
수직 요약 막대그래프
수직 평균 막대그래프를 그리는 코드는 다음과 같습니다.
pythonsns.barplot(x='day', y='total_bill', data=df_tips)# 또는sns.catplot(x='day', y='total_bill', kind='bar', data=df_tips)

수평 요약 막대그래프
만일 요약 막대그래프를 수평으로 그리고 싶다면 barplot() 함수에 orient='h' 옵션을 추가하면 됩니다.
pythonsns.barplot(x='total_bill', y='day', orient='h', data=df_tips)

다중 요약 막대그래프
barplot() 함수에 hue 파라미터를 추가하면 색상으로 구분되는 다중 요약 막대그래프를 그릴 수 있습니다.
수직 다중 요약 막대그래프
다음은 변량이 3개인 데이터를 수직 다중 요약 막대그래프로 표현하는 예시 코드입니다.
pythonsns.barplot(x='day', y='total_bill',hue='smoker', data=df_tips)

수평 다중 요약 막대그래프
수평 다중 요약 막대그래프를 그리고 싶으면 orient=h 파라미터값을 추가하면 됩니다.
pythonsns.barplot(x='total_bill', y='day',hue='smoker', orient='h', data=df_tips)

누적 요약 막대그래프
누적 요약 막대그래프를 그리고 싶다면 barplot() 함수에 dodge=False을 추가하면 됩니다. Seaborn에서 누적 막대그래프는 평균값을 나타내는 막대의 최댓값 위에 다른 평균값을 나타내는 막대를 쌓아서 만드는 것이 아니라 그래프 자체를 서로 겹쳐서 그린 것입니다.
pythonsns.barplot(x='day', y='total_bill',hue='smoker', dodge=False,data=df_tips)

누적 요약 막대그래프는 barplot() 함수를 연이어 사용해서 그릴 수도 있습니다.
pythons1 = sns.barplot(x='species', y='sepal_length',color='coral', ci=None, data=df_iris)s2 = sns.barplot(x='species', y='petal_length',color='powderblue', ci=None, data=df_iris)

위 그래프에서 막대의 y축값(색칠된 부분)은 각각 sepal_length의 평균과 petal_length의 평균을 나타냅니다.
3) 포인트 플롯: pointplot()
포인트플롯은 막대그래프와 동일한 정보를 제공합니다. 대신 평균값을 막대 대신 점(point)으로 표현합니다. 포인트플롯은 pointplot() 함수를 사용해서 그립니다. 포인트플롯은 한 화면에 여러 그래프를 비교할 때 유용합니다.
pythonsns.pointplot(x='day', y='total_bill', data=df_tips)# 또는sns.catplot(x='day', y='total_bill', kind='point', data=df_tips)

만일 신뢰구간이 아니라 표준편차를 표현하고 싶다면 ci='sd'를 추가하면 됩니다. 선과 포인트를 다른 모양으로 표현할 수도 있습니다. 예시 코드는 다음과 같습니다.
pythonsns.pointplot(x='class', y='survived', hue='sex',palette={'male': 'g', 'female': 'm'},markers=['^', 'o'], # 마커 지정linestyles=['-', '--'], # 선 스타일 지정data=df_titanic)

4) 상자그림: boxplot(), boxenplot(), violinplot()
상자그림(박스플롯)은 데이터의 분위를 5가지 요약 수치(five-number summary)로 제공하는 도표입니다.
- 제3사분위수 (Q3): 전체 데이터 중 상위 25%에 해당하는 값, 박스의 위쪽 경계선으로 표시
- 제2사분위수 (Q2 또는 중앙값): 전체 데이터의 50%에 해당하는 값(중앙값), 박스 내부의 선으로 표시
- 제1사분위수 (Q1): 전체 데이터 중 하위 25%에 해당하는 값, 박스의 아래쪽 경계선으로 표시