이미지 로딩 중...
AI Generated
2025. 11. 21. · 5 Views
Seaborn 고급 시각화 완벽 가이드
데이터 분석의 꽃, Seaborn으로 전문가 수준의 시각화를 만들어보세요. 통계 차트부터 다변량 분석까지, 실무에서 바로 써먹을 수 있는 고급 기법들을 쉽고 친근하게 알려드립니다.
목차
- FacetGrid로 다차원 데이터 한눈에 보기
- Heatmap으로 상관관계 시각화하기
- Violin Plot으로 분포의 디테일 파악하기
- Pair Plot으로 모든 변수 관계 한 번에 탐색하기
- Joint Plot으로 두 변수의 관계와 분포 동시에 보기
- Swarm Plot으로 모든 개별 데이터 포인트 표시하기
- Reg Plot으로 회귀 분석 시각화하기
- Count Plot으로 범주형 데이터 빈도 시각화하기
- Clustermap으로 계층적 군집화 시각화하기
- KDE Plot으로 연속적인 확률 밀도 시각화하기
- Point Plot으로 시간에 따른 평균 변화 추적하기
- Cat Plot으로 모든 범주형 시각화 통합하기
1. FacetGrid로 다차원 데이터 한눈에 보기
시작하며
여러분이 고객 데이터를 분석하는데, 성별, 연령대, 지역별로 구매 패턴을 비교해야 하는 상황을 상상해보세요. 한 번에 하나씩 그래프를 그리다 보면 20개가 넘는 그래프를 그려야 하고, 비교하기도 어렵습니다.
이런 문제는 실제 데이터 분석 현장에서 매일 발생합니다. 여러 조건을 동시에 비교하려면 일일이 필터링하고, 각각 그래프를 그리고, 또 배치해야 하는 번거로움이 있죠.
시간도 오래 걸리고 실수하기도 쉽습니다. 바로 이럴 때 필요한 것이 FacetGrid입니다.
마치 사진첩에 사진들을 자동으로 정리해주는 것처럼, 여러 조건의 그래프들을 한 번에 깔끔하게 배치해줍니다.
개요
간단히 말해서, FacetGrid는 데이터를 여러 조건으로 나누어 자동으로 여러 개의 그래프를 격자 형태로 배치해주는 도구입니다. 왜 이게 필요할까요?
실무에서는 단순히 전체 데이터의 평균만 보는 것이 아니라, 각 그룹별로 어떤 차이가 있는지 비교해야 합니다. 예를 들어, 남성과 여성의 구매 패턴이 연령대별로 어떻게 다른지 한눈에 보고 싶을 때 매우 유용합니다.
기존에는 for 반복문을 돌면서 각 조건마다 subplot을 만들고 하나씩 그려야 했다면, 이제는 단 몇 줄의 코드로 모든 그래프를 자동으로 생성할 수 있습니다. FacetGrid의 핵심 특징은 첫째, 자동으로 데이터를 분할하고, 둘째, 일관된 스타일로 여러 그래프를 배치하며, 셋째, 각 그래프에 적절한 제목과 레이블을 자동으로 붙여준다는 점입니다.
이러한 특징들이 데이터 분석의 효율성을 10배 이상 높여줍니다.
코드 예제
import seaborn as sns
import matplotlib.pyplot as plt
# 팁 데이터셋 로드
tips = sns.load_dataset('tips')
# FacetGrid 생성: 성별(col)과 흡연여부(row)로 분할
g = sns.FacetGrid(tips, col='sex', row='smoker',
height=3, aspect=1.2, margin_titles=True)
# 각 서브플롯에 산점도 적용
g.map(plt.scatter, 'total_bill', 'tip', alpha=0.6, s=50)
# 레이블 추가
g.set_axis_labels('총 금액 ($)', '팁 ($)')
g.add_legend()
plt.show()
설명
이것이 하는 일: FacetGrid는 데이터프레임의 특정 컬럼 값에 따라 데이터를 자동으로 그룹화하고, 각 그룹마다 동일한 형태의 그래프를 생성하여 격자 모양으로 배치합니다. 첫 번째로, sns.FacetGrid(tips, col='sex', row='smoker')는 데이터를 성별(열 방향)과 흡연 여부(행 방향)로 나눕니다.
이렇게 하면 2x2 = 4개의 서브플롯이 자동으로 생성되죠. height=3은 각 그래프의 높이를, aspect=1.2는 가로세로 비율을 설정합니다.
그 다음으로, g.map(plt.scatter, 'total_bill', 'tip')이 실행되면서 각 서브플롯에 산점도가 그려집니다. map 함수는 마치 스탬프처럼, 모든 서브플롯에 동일한 그래프를 찍어내는 역할을 합니다.
alpha=0.6으로 점들을 약간 투명하게 만들어 겹치는 부분을 볼 수 있게 했습니다. 마지막으로, set_axis_labels와 add_legend가 각 그래프에 일관된 축 레이블과 범례를 추가하여 최종적으로 전문가 수준의 시각화를 완성합니다.
여러분이 이 코드를 사용하면 4개의 그룹(남성-흡연, 남성-비흡연, 여성-흡연, 여성-비흡연)의 패턴을 한눈에 비교할 수 있습니다. 예를 들어 남성 흡연자가 가장 높은 팁을 주는지, 여성 비흡연자의 평균 계산서는 얼마인지 즉시 파악할 수 있죠.
보고서를 작성할 때도 하나의 이미지로 여러 인사이트를 전달할 수 있어 효과적입니다.
실전 팁
💡 hue 매개변수를 추가하면 각 서브플롯 내에서 또 다른 차원의 데이터를 색상으로 구분할 수 있습니다. 3차원 이상의 복잡한 관계도 표현 가능합니다.
💡 margin_titles=True를 설정하면 제목이 바깥쪽 여백에 표시되어 그래프 영역을 더 넓게 사용할 수 있습니다.
💡 map 대신 map_dataframe을 사용하면 더 복잡한 커스텀 함수를 적용할 수 있어 고급 시각화가 가능합니다.
💡 sharex=False, sharey=False로 설정하면 각 서브플롯이 독립적인 축 범위를 가져 세밀한 패턴을 볼 수 있습니다.
💡 despine()을 호출하면 불필요한 테두리를 제거하여 더 깔끔하고 현대적인 디자인을 만들 수 있습니다.
2. Heatmap으로 상관관계 시각화하기
시작하며
여러분이 주식 포트폴리오를 관리하는데, 10개 종목이 서로 어떻게 연관되어 있는지 알고 싶다고 상상해보세요. 45개의 상관계수를 일일이 읽어가며 비교하는 것은 거의 불가능에 가깝습니다.
이런 문제는 금융, 마케팅, 의료 등 모든 데이터 분석 분야에서 발생합니다. 변수들 간의 관계를 숫자로만 보면 패턴을 발견하기 어렵고, 중요한 인사이트를 놓치기 쉽습니다.
특히 변수가 많아질수록 이 문제는 심각해집니다. 바로 이럴 때 필요한 것이 Heatmap입니다.
마치 날씨 지도처럼 색깔로 온도를 표현하듯이, 숫자들의 크기를 색상의 진하기로 표현해서 패턴을 즉시 파악할 수 있게 해줍니다.
개요
간단히 말해서, Heatmap은 2차원 데이터를 색상으로 표현하여 값의 크기를 직관적으로 보여주는 시각화 기법입니다. 왜 이게 필요할까요?
사람의 뇌는 숫자보다 색상을 훨씬 빠르게 처리합니다. 100개의 숫자를 읽는 데는 몇 분이 걸리지만, Heatmap으로 표현하면 단 몇 초 만에 가장 큰 값, 가장 작은 값, 그리고 패턴을 찾을 수 있습니다.
예를 들어, 고객 세그먼트별 구매 패턴을 분석할 때 어떤 그룹이 어떤 제품을 선호하는지 한눈에 파악할 수 있습니다. 기존에는 표 형태의 숫자를 스크롤하면서 큰 값을 찾아야 했다면, 이제는 진한 색상이 있는 곳만 보면 됩니다.
Heatmap의 핵심 특징은 첫째, 많은 양의 데이터를 압축하여 표현하고, 둘째, 색상 그라데이션으로 연속적인 값의 변화를 보여주며, 셋째, 행과 열의 레이블을 통해 정확한 위치를 파악할 수 있다는 점입니다. 이러한 특징들이 복잡한 데이터에서 숨겨진 패턴을 발견하는 데 결정적인 역할을 합니다.
코드 예제
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# 샘플 데이터: 과목 간 성적 상관관계
subjects = ['수학', '과학', '영어', '국어', '역사']
correlation_matrix = np.random.rand(5, 5)
correlation_matrix = (correlation_matrix + correlation_matrix.T) / 2 # 대칭 행렬 생성
np.fill_diagonal(correlation_matrix, 1) # 대각선은 1로 설정
# Heatmap 생성: annot=True로 숫자 표시, cmap으로 색상 팔레트 지정
plt.figure(figsize=(8, 6))
sns.heatmap(correlation_matrix, annot=True, fmt='.2f',
cmap='coolwarm', center=0.5, square=True,
xticklabels=subjects, yticklabels=subjects,
cbar_kws={'label': '상관계수'})
plt.title('과목 간 성적 상관관계', fontsize=14, pad=15)
plt.tight_layout()
plt.show()
설명
이것이 하는 일: Heatmap은 행렬 형태의 숫자 데이터를 받아서, 각 셀의 값을 색상의 진하기로 변환하여 시각적으로 표현합니다. 첫 번째로, np.random.rand(5, 5)로 5x5 상관관계 행렬을 생성합니다.
실제로는 데이터프레임의 .corr() 메서드로 상관계수를 계산하겠지만, 여기서는 예시를 위해 랜덤 값을 사용했습니다. 대칭 행렬로 만들고 대각선을 1로 설정하는 이유는 실제 상관관계 행렬의 특성을 반영하기 위함입니다.
그 다음으로, sns.heatmap()이 실행되면서 마법이 일어납니다. annot=True는 각 셀에 실제 숫자를 표시하고, fmt='.2f'는 소수점 둘째 자리까지만 보여줍니다.
cmap='coolwarm'은 낮은 값은 파란색, 높은 값은 빨간색으로 표현하는 색상 팔레트를 지정합니다. 세 번째 단계에서, center=0.5는 색상 팔레트의 중간점을 0.5로 설정하여 그 값을 기준으로 색상이 나뉩니다.
square=True는 각 셀을 정사각형으로 만들어 보기 좋게 만들고, cbar_kws는 컬러바에 레이블을 추가합니다. 마지막으로, xticklabels와 yticklabels로 각 행과 열에 과목 이름을 붙여서, 어떤 과목들이 서로 연관되어 있는지 즉시 알 수 있게 합니다.
여러분이 이 코드를 사용하면 25개의 숫자 조합을 단 1초 만에 이해할 수 있습니다. 진한 빨간색 셀을 보면 "아, 이 두 과목은 강한 양의 상관관계가 있구나"를 바로 알 수 있죠.
마케팅에서는 제품 간 동시 구매 패턴을, 금융에서는 자산 간 상관관계를 분석할 때 이 기법이 필수적입니다. 보고서에서도 하나의 Heatmap이 여러 페이지의 표를 대체할 수 있습니다.
실전 팁
💡 linewidths=0.5, linecolor='white'를 추가하면 셀 사이에 흰색 선이 생겨 각 값을 더 명확하게 구분할 수 있습니다.
💡 vmin과 vmax 매개변수로 색상 범위를 고정하면 여러 Heatmap을 비교할 때 일관된 기준을 유지할 수 있습니다.
💡 mask 매개변수로 특정 영역(예: 상관관계 행렬의 상삼각)을 숨기면 중복 정보를 제거하여 더 깔끔한 시각화를 만들 수 있습니다.
💡 robust=True를 사용하면 이상치의 영향을 줄여 대부분 데이터의 패턴을 더 잘 볼 수 있습니다.
💡 cmap으로 'RdYlGn_r'(빨강-노랑-초록 역순)을 사용하면 낮은 값은 빨강, 높은 값은 초록으로 표현되어 성적이나 성과 지표에 직관적입니다.
3. Violin Plot으로 분포의 디테일 파악하기
시작하며
여러분이 세 지역의 집값을 비교하려는데, 박스플롯으로 보니 중앙값과 사분위수만 나와서 실제 분포가 어떤 모양인지 감이 안 오는 경험을 해보셨나요? A지역과 B지역의 중앙값은 비슷한데, 실제로는 A지역은 집값이 고르게 분포되어 있고 B지역은 극단적으로 양극화되어 있을 수 있습니다.
이런 문제는 데이터의 분포를 요약 통계량만으로 판단할 때 발생합니다. 평균, 중앙값, 사분위수는 중요하지만, 실제 데이터가 어떤 모양으로 퍼져있는지는 보여주지 못합니다.
같은 평균을 가진 데이터도 완전히 다른 패턴을 가질 수 있죠. 바로 이럴 때 필요한 것이 Violin Plot입니다.
바이올린처럼 생긴 이 그래프는 박스플롯과 커널 밀도 추정을 결합하여 분포의 모양까지 보여줍니다.
개요
간단히 말해서, Violin Plot은 데이터의 분포를 좌우 대칭의 밀도 곡선으로 표현하면서, 동시에 박스플롯의 요약 통계량도 함께 보여주는 시각화 기법입니다. 왜 이게 필요할까요?
실무에서는 데이터가 정규분포를 따르는지, 이봉분포(두 개의 봉우리)인지, 아니면 치우쳐 있는지를 파악하는 것이 매우 중요합니다. 예를 들어, 고객의 구매 금액 분포가 이봉분포라면 실제로는 두 개의 다른 고객 그룹이 존재한다는 뜻일 수 있습니다.
이런 인사이트는 평균만 봐서는 절대 알 수 없죠. 기존에는 히스토그램과 박스플롯을 따로 그려서 비교해야 했다면, 이제는 하나의 Violin Plot으로 모든 정보를 한눈에 볼 수 있습니다.
Violin Plot의 핵심 특징은 첫째, 커널 밀도 추정으로 부드러운 분포 곡선을 생성하고, 둘째, 폭이 넓은 부분은 데이터가 많이 몰려있는 구간을 의미하며, 셋째, 여러 그룹을 나란히 배치하여 쉽게 비교할 수 있다는 점입니다. 이러한 특징들이 데이터 과학자들이 Violin Plot을 선호하는 이유입니다.
코드 예제
import seaborn as sns
import matplotlib.pyplot as plt
# 팁 데이터셋 로드
tips = sns.load_dataset('tips')
# Violin Plot 생성: 요일별 총 금액 분포 비교
plt.figure(figsize=(10, 6))
sns.violinplot(data=tips, x='day', y='total_bill',
hue='sex', split=True, inner='quartile',
palette='pastel', order=['Thur', 'Fri', 'Sat', 'Sun'])
# 그래프 꾸미기
plt.title('요일 및 성별에 따른 총 금액 분포', fontsize=14, pad=15)
plt.xlabel('요일', fontsize=12)
plt.ylabel('총 금액 ($)', fontsize=12)
plt.legend(title='성별', loc='upper right')
plt.grid(axis='y', alpha=0.3, linestyle='--')
plt.tight_layout()
plt.show()
설명
이것이 하는 일: Violin Plot은 각 그룹의 데이터에 대해 커널 밀도 추정을 수행하여 분포의 모양을 부드러운 곡선으로 그리고, 그 위에 사분위수 정보를 중첩하여 표시합니다. 첫 번째로, sns.violinplot(data=tips, x='day', y='total_bill')는 x축에 요일, y축에 총 금액을 배치하여 각 요일별로 하나의 바이올린을 생성합니다.
이렇게 하면 목요일부터 일요일까지 4개의 바이올린이 나란히 그려지죠. 그 다음으로, hue='sex', split=True가 실행되면서 각 바이올린이 반으로 나뉩니다.
왼쪽 반은 여성, 오른쪽 반은 남성의 분포를 나타내어, 한 요일 내에서도 성별 차이를 직접 비교할 수 있습니다. inner='quartile'은 바이올린 내부에 사분위수를 선으로 표시하여 중앙값과 25%, 75% 지점을 한눈에 볼 수 있게 합니다.
세 번째로, palette='pastel'은 부드러운 파스텔 색상을 사용하여 보기 편하게 만들고, order는 요일을 시간 순서대로 정렬합니다. 이렇게 하면 시간의 흐름에 따른 패턴을 더 쉽게 파악할 수 있죠.
마지막으로, 그리드와 레이블을 추가하여 전문적인 시각화를 완성합니다. y축 그리드는 값을 읽기 쉽게 하고, 명확한 제목과 축 레이블은 보고서에 바로 사용할 수 있는 수준을 만듭니다.
여러분이 이 코드를 사용하면 단순히 "토요일 평균이 가장 높다"를 넘어서 "토요일 남성 고객은 이봉분포를 보이는데, 이는 저가 메뉴와 고가 메뉴를 선호하는 두 그룹이 존재한다"와 같은 깊은 인사이트를 얻을 수 있습니다. 바이올린이 넓은 부분은 그 가격대의 고객이 많다는 뜻이므로, 가격 전략을 수립할 때 매우 유용한 정보가 됩니다.
실전 팁
💡 inner='box'로 변경하면 바이올린 내부에 작은 박스플롯이 표시되어 이상치까지 함께 볼 수 있습니다.
💡 scale='count'를 사용하면 바이올린의 폭이 각 그룹의 샘플 수에 비례하여, 데이터 양의 차이도 시각적으로 표현됩니다.
💡 cut=0으로 설정하면 실제 데이터 범위를 벗어나는 밀도 추정을 하지 않아 더 정확한 분포를 볼 수 있습니다.
💡 bw_adjust 매개변수로 밴드위드를 조정하면 곡선의 부드러움을 제어할 수 있습니다. 기본값 1보다 크면 더 부드럽고, 작으면 더 울퉁불퉁합니다.
💡 dodge=False로 설정하면 hue 그룹이 좌우로 나뉘지 않고 중첩되어 표시되어, 분포의 직접 비교가 가능합니다.
4. Pair Plot으로 모든 변수 관계 한 번에 탐색하기
시작하며
여러분이 붓꽃 데이터로 머신러닝 모델을 만들기 전에 4개의 특성(꽃잎 길이, 꽃잎 폭, 꽃받침 길이, 꽃받침 폭)이 서로 어떤 관계인지 파악해야 한다고 상상해보세요. 모든 조합을 일일이 scatter plot으로 그리려면 몇 개나 그려야 할까요?
바로 6개입니다. 변수가 10개라면 45개를 그려야 합니다!
이런 문제는 탐색적 데이터 분석(EDA) 단계에서 항상 마주치는 도전입니다. 변수 간의 관계를 모르고 모델을 만들면 중요한 특성을 놓치거나, 다중공선성 문제에 빠질 수 있습니다.
하지만 모든 조합을 손으로 그리는 것은 비현실적이죠. 바로 이럴 때 필요한 것이 Pair Plot입니다.
단 한 줄의 코드로 모든 변수 쌍의 관계를 격자 형태로 배치하여 보여줍니다.
개요
간단히 말해서, Pair Plot은 데이터셋의 모든 수치형 변수 쌍에 대해 산점도를 자동으로 생성하고, 대각선에는 각 변수의 분포를 히스토그램이나 KDE로 표시하는 시각화 도구입니다. 왜 이게 필요할까요?
머신러닝 모델을 만들기 전 가장 중요한 단계가 바로 EDA입니다. Pair Plot을 사용하면 몇 초 만에 어떤 변수들이 강한 선형 관계를 가지는지, 어떤 변수로 클래스를 잘 분리할 수 있는지, 이상치는 어디에 있는지를 한눈에 파악할 수 있습니다.
예를 들어, 부동산 가격 예측 모델을 만들 때 면적, 방 개수, 층수 등의 관계를 먼저 이해하면 더 나은 특성 엔지니어링이 가능합니다. 기존에는 각 변수 쌍마다 코드를 작성하고 subplot을 일일이 배치해야 했다면, 이제는 sns.pairplot(df) 단 한 줄이면 됩니다.
Pair Plot의 핵심 특징은 첫째, 모든 변수 조합을 자동으로 생성하고, 둘째, 대각선과 비대각선을 다르게 처리하며, 셋째, hue 매개변수로 클래스별 색상을 구분하여 분류 문제의 인사이트를 제공한다는 점입니다. 이러한 특징들이 데이터 과학자의 EDA 시간을 90% 이상 단축시켜줍니다.
코드 예제
import seaborn as sns
import matplotlib.pyplot as plt
# 붓꽃 데이터셋 로드
iris = sns.load_dataset('iris')
# Pair Plot 생성: 종(species)별로 색상 구분
pairplot = sns.pairplot(iris, hue='species',
diag_kind='kde', markers=['o', 's', 'D'],
palette='husl', corner=False,
plot_kws={'alpha': 0.6, 's': 50},
diag_kws={'linewidth': 2})
# 제목 추가
pairplot.fig.suptitle('붓꽃 데이터셋 전체 변수 관계 분석',
fontsize=14, y=1.02)
plt.show()
설명
이것이 하는 일: Pair Plot은 데이터프레임의 모든 수치형 컬럼 조합에 대해 자동으로 산점도를 생성하고, 각 변수의 단변량 분포를 대각선에 배치합니다. 첫 번째로, sns.pairplot(iris, hue='species')는 iris 데이터의 4개 수치형 변수(sepal_length, sepal_width, petal_length, petal_width)에 대해 4x4=16개의 서브플롯을 자동으로 생성합니다.
hue='species'는 세 종류의 붓꽃(setosa, versicolor, virginica)을 서로 다른 색상으로 표시하여 클래스 간 차이를 드러냅니다. 그 다음으로, diag_kind='kde'가 실행되면서 대각선 위치(같은 변수끼리의 만남)에는 산점도 대신 커널 밀도 추정 곡선이 그려집니다.
이를 통해 각 변수의 분포 모양과 종별 차이를 볼 수 있죠. markers=['o', 's', 'D']는 각 종에 원, 사각형, 다이아몬드 모양을 할당하여 색맹인 사람도 구분할 수 있게 합니다.
세 번째로, plot_kws와 diag_kws는 비대각선과 대각선 플롯의 스타일을 각각 제어합니다. alpha=0.6으로 점을 투명하게 만들어 겹치는 부분을 볼 수 있고, s=50은 점의 크기를, linewidth=2는 KDE 선의 두께를 설정합니다.
마지막으로, corner=False는 전체 격자를 보여줍니다(True로 하면 대각선 아래만 표시). palette='husl'은 균일하게 분산된 색상을 사용하여 구분이 쉽습니다.
여러분이 이 코드를 사용하면 16개의 플롯에서 엄청난 인사이트를 얻을 수 있습니다. 예를 들어, petal_length와 petal_width의 산점도를 보면 세 종이 명확하게 분리되는 것을 볼 수 있어 "꽃잎 특성이 종을 구분하는 데 매우 유용하다"는 것을 즉시 알 수 있습니다.
반면 sepal_width는 겹치는 부분이 많아 단독으로는 분류에 적합하지 않다는 것도 바로 파악됩니다. 이런 정보는 특성 선택과 모델 설계에 직접적으로 활용됩니다.
실전 팁
💡 corner=True로 설정하면 대각선 아래쪽만 표시되어 중복을 제거하고 더 큰 플롯을 볼 수 있습니다.
💡 kind='reg'를 사용하면 각 산점도에 회귀선이 자동으로 추가되어 선형 관계의 강도를 바로 볼 수 있습니다.
💡 vars 매개변수로 특정 변수들만 선택하면 관심 있는 변수들만 집중적으로 분석할 수 있습니다.
💡 height와 aspect 매개변수로 각 서브플롯의 크기를 조절하여 고해상도 보고서용 이미지를 만들 수 있습니다.
💡 x_vars와 y_vars를 다르게 설정하면 직사각형 형태의 플롯을 만들어 독립변수와 종속변수의 관계만 집중할 수 있습니다.
5. Joint Plot으로 두 변수의 관계와 분포 동시에 보기
시작하며
여러분이 광고비와 매출의 관계를 분석하는데, 산점도만 보니 전체적인 경향은 보이는데 각 변수의 분포가 어떤지, 이상치는 어디에 있는지 파악하기 어려운 경험을 해보셨나요? 그래프를 여러 개 그려서 비교하려니 번거롭습니다.
이런 문제는 이변량 분석에서 흔히 발생합니다. 두 변수의 관계만 보면 한쪽 변수의 분포를 놓치고, 분포만 보면 관계를 놓칩니다.
결과적으로 불완전한 분석이 되어 잘못된 결론을 내릴 수 있죠. 바로 이럴 때 필요한 것이 Joint Plot입니다.
중앙에는 두 변수의 관계를, 상단과 우측에는 각각의 분포를 자동으로 배치하여 완전한 이변량 분석을 제공합니다.
개요
간단히 말해서, Joint Plot은 중앙에 두 변수의 산점도(또는 다른 이변량 플롯)를 배치하고, 상단과 우측 여백에 각 변수의 단변량 분포를 히스토그램이나 KDE로 표시하는 통합 시각화입니다. 왜 이게 필요할까요?
회귀 분석이나 상관관계 분석을 할 때, 각 변수가 어떻게 분포되어 있는지 아는 것이 매우 중요합니다. 예를 들어, 한쪽 변수가 심하게 치우쳐 있다면 로그 변환이 필요할 수 있고, 이상치가 있다면 제거하거나 처리해야 할 수 있습니다.
Joint Plot은 이 모든 정보를 한 화면에 제공하여 더 현명한 의사결정을 할 수 있게 합니다. 기존에는 scatter plot, histogram x 2를 따로 그리고 배치해야 했다면, 이제는 Joint Plot 하나로 모든 것을 해결할 수 있습니다.
Joint Plot의 핵심 특징은 첫째, 세 개의 축을 자동으로 정렬하여 일관된 스케일을 유지하고, 둘째, 다양한 kind(scatter, hex, kde, reg 등)를 지원하며, 셋째, 상관계수나 회귀선 같은 통계 정보를 자동으로 추가할 수 있다는 점입니다. 이러한 특징들이 이변량 분석의 표준 도구로 만들었습니다.
코드 예제
import seaborn as sns
import matplotlib.pyplot as plt
# 팁 데이터셋 로드
tips = sns.load_dataset('tips')
# Joint Plot 생성: 총 금액과 팁의 관계
joint = sns.jointplot(data=tips, x='total_bill', y='tip',
kind='reg', height=8, ratio=5,
marginal_kws={'bins': 30, 'fill': True},
joint_kws={'scatter_kws': {'alpha': 0.5, 's': 40},
'line_kws': {'color': 'red', 'linewidth': 2}})
# 제목과 레이블 추가
joint.fig.suptitle('총 금액과 팁의 관계 분석', fontsize=14, y=1.02)
joint.set_axis_labels('총 금액 ($)', '팁 ($)', fontsize=12)
plt.tight_layout()
plt.show()
설명
이것이 하는 일: Joint Plot은 중앙 축에 두 변수의 관계를 표현하는 플롯을 그리고, 상단과 우측에 각 변수의 히스토그램이나 KDE를 자동으로 배치하여 완전한 이변량 분석 화면을 구성합니다. 첫 번째로, sns.jointplot(data=tips, x='total_bill', y='tip', kind='reg')는 총 금액을 x축, 팁을 y축에 놓고 회귀 플롯을 생성합니다.
kind='reg'는 산점도에 회귀선을 추가하고 신뢰구간을 음영으로 표시하여, 두 변수 간의 선형 관계를 시각적으로 보여줍니다. 그 다음으로, height=8은 전체 플롯의 크기를, ratio=5는 중앙 플롯과 여백 플롯의 크기 비율을 설정합니다.
ratio가 클수록 중앙 플롯이 커지고 여백 플롯이 작아집니다. 보통 5~7 정도가 균형잡힌 비율입니다.
세 번째로, marginal_kws는 상단과 우측의 분포 플롯 스타일을 제어합니다. bins=30은 히스토그램의 막대 개수를, fill=True는 막대를 채워서 표시합니다.
joint_kws는 중앙 플롯의 스타일을 세밀하게 조정하는데, 점의 투명도와 크기, 회귀선의 색상과 두께를 각각 설정합니다. 마지막으로, set_axis_labels로 축 레이블을 한글로 바꾸고, suptitle로 전체 제목을 추가합니다.
y=1.02는 제목을 약간 위로 올려 상단 히스토그램과 겹치지 않게 합니다. 여러분이 이 코드를 사용하면 한눈에 여러 인사이트를 얻습니다.
중앙의 회귀선은 "총 금액이 높을수록 팁도 증가한다"는 양의 상관관계를 보여주고, 상단 히스토그램은 "대부분의 계산서가 1020달러 범위"라는 것을, 우측 히스토그램은 "팁은 24달러가 가장 많다"는 것을 즉시 알려줍니다. 또한 회귀선에서 멀리 떨어진 점들은 이상치로, "적은 금액인데 팁을 많이 준 경우"나 "많은 금액인데 팁을 거의 안 준 경우"를 바로 발견할 수 있습니다.
실전 팁
💡 kind='hex'로 변경하면 점 대신 육각형 빈도로 표시되어 데이터가 많을 때 겹침 문제를 해결할 수 있습니다.
💡 kind='kde'를 사용하면 밀도 등고선으로 표현되어 연속적인 분포의 모양을 부드럽게 볼 수 있습니다.
💡 marginal_kws에 kde=True를 추가하면 히스토그램 위에 KDE 곡선이 중첩되어 더 풍부한 정보를 제공합니다.
💡 hue 매개변수로 범주형 변수를 지정하면 그룹별로 색상을 구분하여 더 깊은 분석이 가능합니다(Seaborn 최신 버전에서 지원).
💡 xlim과 ylim으로 축 범위를 제한하면 이상치를 제외한 주요 데이터 영역만 확대하여 볼 수 있습니다.
6. Swarm Plot으로 모든 개별 데이터 포인트 표시하기
시작하며
여러분이 세 팀의 판매 실적을 비교하는데, 박스플롯으로 보니 통계량은 나오지만 실제로 각 팀원이 얼마나 팔았는지, 몇 명이나 되는지 감이 안 오는 경험을 해보셨나요? 평균은 비슷한데 실제로는 A팀은 모두 고르게 팔았고, B팀은 한두 명만 엄청 많이 팔아서 평균을 올린 것일 수 있습니다.
이런 문제는 데이터를 요약할 때 개별 관측치의 정보를 잃어버리기 때문에 발생합니다. 특히 데이터 개수가 많지 않을 때는 각 점이 중요한 의미를 가질 수 있는데, 박스플롯이나 바 차트로는 이를 볼 수 없습니다.
바로 이럴 때 필요한 것이 Swarm Plot입니다. 벌떼처럼 모든 점을 하나하나 표시하되, 겹치지 않게 좌우로 퍼뜨려서 개수와 분포를 동시에 보여줍니다.
개요
간단히 말해서, Swarm Plot은 모든 개별 데이터 포인트를 범주별로 분리하여 표시하되, y값이 같은 점들은 자동으로 좌우로 퍼뜨려서 겹치지 않게 배치하는 시각화 기법입니다. 왜 이게 필요할까요?
데이터 개수가 수백 개 이하일 때는 각 관측치가 어디에 위치하는지 보는 것이 매우 중요합니다. 예를 들어, 신약 임상시험에서 환자 10명의 반응을 분석할 때, 평균만 보는 것보다 각 환자의 값을 모두 보는 것이 훨씬 유의미합니다.
또한 데이터의 개수 자체도 점의 개수로 바로 알 수 있어서 샘플 크기가 충분한지도 즉시 판단할 수 있습니다. 기존에는 strip plot으로 점을 찍으면 많이 겹쳐서 보기 어렵고, jitter를 추가하면 실제 y값을 정확히 알기 어려웠다면, Swarm Plot은 이 두 가지 문제를 동시에 해결합니다.
Swarm Plot의 핵심 특징은 첫째, 모든 점이 실제 y값에 정확히 위치하고, 둘째, 겹치지 않게 자동으로 배치되며, 셋째, 점의 밀집도로 분포의 모양을 직관적으로 파악할 수 있다는 점입니다. 이러한 특징들이 소규모 데이터셋의 시각화에 최적입니다.
코드 예제
import seaborn as sns
import matplotlib.pyplot as plt
# 팁 데이터셋 로드
tips = sns.load_dataset('tips')
# 그림 크기 설정
plt.figure(figsize=(10, 6))
# Swarm Plot 생성: 요일별 팁 분포
sns.swarmplot(data=tips, x='day', y='tip', hue='time',
palette='Set2', size=6, alpha=0.7,
order=['Thur', 'Fri', 'Sat', 'Sun'])
# 배경에 Violin Plot 추가하여 분포 모양 강조
sns.violinplot(data=tips, x='day', y='tip',
color='lightgray', alpha=0.3, inner=None,
order=['Thur', 'Fri', 'Sat', 'Sun'])
# 그래프 꾸미기
plt.title('요일 및 시간대별 팁 분포 (개별 데이터 포인트)', fontsize=14, pad=15)
plt.xlabel('요일', fontsize=12)
plt.ylabel('팁 ($)', fontsize=12)
plt.legend(title='시간대', loc='upper right')
plt.grid(axis='y', alpha=0.3, linestyle='--')
plt.tight_layout()
plt.show()
설명
이것이 하는 일: Swarm Plot은 각 범주에 속한 모든 데이터 포인트를 y축 위치는 실제 값 그대로 유지하면서, x축 방향으로는 겹치지 않게 자동으로 조정하여 벌집 모양으로 배치합니다. 첫 번째로, sns.swarmplot(data=tips, x='day', y='tip')는 요일별로 모든 팁 데이터를 점으로 표시합니다.
같은 요일 내에서 비슷한 팁 금액을 가진 점들은 좌우로 퍼져서 배치되므로, 마치 벌떼가 모여있는 것처럼 보입니다. 이렇게 하면 각 요일마다 몇 개의 데이터가 있는지, 어느 금액대가 많은지 한눈에 보입니다.
그 다음으로, hue='time'이 실행되면서 점심(Lunch)과 저녁(Dinner) 시간대를 서로 다른 색상으로 구분합니다. 이를 통해 같은 요일 내에서도 시간대별 차이를 즉시 파악할 수 있죠.
size=6은 점의 크기를, alpha=0.7은 투명도를 설정하여 점이 많이 몰려있어도 뒤의 점들이 보이게 합니다. 세 번째로, 배경에 violinplot을 추가하는 고급 기법을 사용했습니다.
color='lightgray', alpha=0.3으로 회색의 반투명한 바이올린을 먼저 그리고, 그 위에 Swarm Plot을 중첩하면 전체 분포의 모양도 보면서 개별 점들도 함께 볼 수 있습니다. 마지막으로, order로 요일을 시간 순서대로 정렬하고, 그리드와 레이블을 추가하여 전문적인 시각화를 완성합니다.
여러분이 이 코드를 사용하면 "목요일 점심에는 데이터가 얼마 없구나", "토요일 저녁에 5달러 이상 팁을 준 사람이 특히 많네", "금요일은 점심과 저녁의 분포가 비슷하구나" 같은 세밀한 인사이트를 얻을 수 있습니다. 각 점이 하나의 거래를 나타내므로, 특정 이상치를 발견하면 실제 데이터로 돌아가서 그 거래가 무엇인지 조사할 수도 있습니다.
이는 데이터 품질 검증에도 매우 유용합니다.
실전 팁
💡 데이터가 300개를 넘으면 점들이 너무 밀집되어 보기 어려우니, 대신 violin plot이나 box plot을 사용하세요.
💡 dodge=True로 설정하면 hue 그룹들이 좌우로 완전히 분리되어 표시되어 비교가 더 쉬워집니다.
💡 warn_thresh 매개변수로 경고 임계값을 조정하면 큰 데이터셋에서도 강제로 사용할 수 있지만, 성능이 느려질 수 있습니다.
💡 orient='h'로 수평 방향으로 바꾸면 범주 이름이 길 때 레이블을 읽기 편합니다.
💡 box plot이나 violin plot과 함께 사용하면 통계적 요약과 개별 데이터를 동시에 보여줘서 최고의 시각화를 만들 수 있습니다.
7. Reg Plot으로 회귀 분석 시각화하기
시작하며
여러분이 온도와 아이스크림 판매량의 관계를 분석하는데, 산점도만 그리니 대략 비례하는 것 같긴 한데 정확히 어느 정도의 관계인지, 통계적으로 유의미한지 판단하기 어려운 경험을 해보셨나요? 엑셀로 회귀선을 그리고 R-squared를 계산하려니 번거롭습니다.
이런 문제는 두 변수 간의 관계를 정량화해야 할 때 항상 발생합니다. 눈으로 보기에 관계가 있어 보여도 통계적으로 증명하지 못하면 의사결정에 사용할 수 없습니다.
특히 비즈니스 현장에서는 "대충 비례하는 것 같아요"보다 "온도가 1도 올라갈 때마다 판매량이 평균 15개 증가합니다"가 훨씬 설득력 있죠. 바로 이럴 때 필요한 것이 Reg Plot입니다.
산점도에 회귀선과 신뢰구간을 자동으로 추가하여 관계의 강도와 방향을 한눈에 보여줍니다.
개요
간단히 말해서, Reg Plot은 두 연속형 변수 간의 선형 회귀선을 계산하고, 산점도 위에 회귀선과 95% 신뢰구간을 함께 표시하는 통계적 시각화 도구입니다. 왜 이게 필요할까요?
실무에서는 "X가 증가하면 Y도 증가한다"를 넘어서 "X가 1단위 증가할 때 Y는 평균적으로 얼마나 변하는가"를 알아야 합니다. 예를 들어, 마케팅 예산과 매출의 관계를 분석할 때 Reg Plot을 사용하면 "광고비 100만원을 추가 투자하면 매출이 약 500만원 증가할 것"이라는 구체적인 예측을 할 수 있습니다.
신뢰구간은 이 예측의 불확실성도 함께 보여줍니다. 기존에는 numpy나 scipy로 회귀 계수를 계산하고, matplotlib으로 선을 그리고, 신뢰구간을 수동으로 계산해야 했다면, 이제는 sns.regplot()한 줄이면 모든 것이 자동으로 완성됩니다.
Reg Plot의 핵심 특징은 첫째, 선형 회귀를 자동으로 수행하고, 둘째, 신뢰구간을 음영으로 표시하여 예측의 불확실성을 시각화하며, 셋째, 로버스트 회귀나 다항 회귀도 지원한다는 점입니다. 이러한 특징들이 통계 분석과 시각화를 하나로 통합합니다.
코드 예제
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
# 샘플 데이터 생성: 공부 시간과 점수
np.random.seed(42)
study_hours = np.random.uniform(1, 10, 100)
scores = 30 + 5 * study_hours + np.random.normal(0, 5, 100)
data = {'공부_시간': study_hours, '점수': scores}
# Reg Plot 생성
plt.figure(figsize=(10, 6))
sns.regplot(x='공부_시간', y='점수', data=data,
scatter_kws={'alpha': 0.5, 's': 60, 'color': 'steelblue'},
line_kws={'color': 'red', 'linewidth': 2},
ci=95, order=1)
# 통계 정보 추가 (상관계수)
from scipy.stats import pearsonr
corr, pval = pearsonr(study_hours, scores)
plt.text(1.5, 75, f'상관계수: {corr:.3f}\np-value: {pval:.4f}',
fontsize=11, bbox=dict(boxstyle='round', facecolor='wheat', alpha=0.5))
# 그래프 꾸미기
plt.title('공부 시간과 시험 점수의 관계', fontsize=14, pad=15)
plt.xlabel('공부 시간 (시간)', fontsize=12)
plt.ylabel('시험 점수', fontsize=12)
plt.grid(alpha=0.3, linestyle='--')
plt.tight_layout()
plt.show()
설명
이것이 하는 일: Reg Plot은 주어진 x, y 데이터에 대해 최소제곱법으로 선형 회귀선을 계산하고, 그 주변에 부트스트랩 방법으로 신뢰구간을 추정하여 음영으로 표시합니다. 첫 번째로, 샘플 데이터를 생성합니다.
30 + 5 * study_hours + np.random.normal(0, 5, 100)는 "기본 점수 30점에서 시작하여, 공부 시간마다 평균 5점씩 오르고, 개인차로 표준편차 5점의 노이즈가 있다"는 관계를 시뮬레이션합니다. 실제 데이터와 비슷한 패턴이죠.
그 다음으로, sns.regplot(x='공부_시간', y='점수')가 실행되면서 모든 점을 산점도로 그리고, 자동으로 회귀선을 계산하여 그립니다. scatter_kws로 점의 스타일(투명도, 크기, 색상)을, line_kws로 선의 스타일(색상, 두께)을 각각 제어합니다.
ci=95는 95% 신뢰구간을 의미하며, 이는 "100번 중 95번은 실제 회귀선이 이 구간 안에 있다"는 뜻입니다. 세 번째로, order=1은 1차 다항식(직선)을 사용한다는 의미입니다.
만약 order=2로 바꾸면 2차 곡선(포물선)으로 피팅됩니다. 비선형 관계를 분석할 때 유용합니다.
마지막으로, scipy의 pearsonr로 피어슨 상관계수와 p-value를 계산하여 텍스트로 추가합니다. 상관계수는 -1~1 사이 값으로 관계의 강도를, p-value는 통계적 유의성을 나타냅니다.
이 정보를 함께 표시하면 보고서에 바로 사용할 수 있습니다. 여러분이 이 코드를 사용하면 "공부 시간이 1시간 증가할 때마다 점수가 약 5점 오른다"는 정량적 인사이트를 얻을 수 있습니다.
회귀선의 기울기가 바로 이 값이죠. 또한 신뢰구간이 넓은 부분(데이터가 적은 끝 부분)은 예측의 불확실성이 크다는 것을 보여주어, 보수적인 의사결정을 할 수 있게 합니다.
상관계수가 0.9 이상이고 p-value가 0.05 미만이면 통계적으로 유의미한 강한 관계라고 결론 내릴 수 있습니다.
실전 팁
💡 robust=True로 설정하면 이상치에 덜 민감한 로버스트 회귀를 사용하여 더 안정적인 결과를 얻을 수 있습니다.
💡 logx=True나 logy=True를 사용하면 로그 스케일로 변환하여 지수적 관계를 선형으로 표현할 수 있습니다.
💡 order=2 이상으로 설정하면 다항 회귀를 수행하여 곡선 관계도 모델링할 수 있지만, 과적합에 주의하세요.
💡 truncate=True로 설정하면 회귀선이 데이터 범위를 벗어나지 않아 외삽의 위험을 줄일 수 있습니다.
💡 scatter=False로 설정하면 산점도 없이 회귀선만 그려져서, 여러 회귀선을 비교할 때 유용합니다.
8. Count Plot으로 범주형 데이터 빈도 시각화하기
시작하며
여러분이 설문조사 결과를 분석하는데, "선호하는 색상"이 빨강, 파랑, 초록, 노랑 중 어느 것이 가장 많은지 알고 싶다고 상상해보세요. 데이터프레임에서 value_counts()로 숫자를 세고, 또 별도로 바 차트를 그려야 하니 번거롭습니다.
이런 문제는 범주형 데이터를 분석할 때 매일 발생합니다. 단순히 개수를 세는 것은 쉽지만, 이를 시각적으로 비교하기 좋게 만들려면 추가 작업이 필요합니다.
또한 여러 범주를 동시에 비교하거나, 하위 그룹별로 나누어 보려면 더 복잡해집니다. 바로 이럴 때 필요한 것이 Count Plot입니다.
범주형 변수의 각 값이 몇 번 나타나는지 자동으로 세어서 막대 그래프로 표시해줍니다.
개요
간단히 말해서, Count Plot은 범주형 변수의 각 카테고리별 빈도(개수)를 자동으로 계산하고, 이를 세로 또는 가로 막대 그래프로 표시하는 시각화 도구입니다. 왜 이게 필요할까요?
실무에서는 고객 세그먼트별 개수, 제품 카테고리별 판매 건수, 요일별 방문자 수 등 범주형 데이터의 분포를 파악하는 일이 매우 많습니다. 예를 들어, 앱의 사용자 유입 경로를 분석할 때 "검색, SNS, 직접 방문, 추천" 중 어느 경로가 가장 많은지 Count Plot으로 즉시 확인할 수 있습니다.
이는 마케팅 예산 배분에 직접적인 근거가 됩니다. 기존에는 pandas로 개수를 세고, matplotlib으로 바 차트를 그리고, 레이블을 정렬하는 등 여러 단계를 거쳐야 했다면, 이제는 sns.countplot()한 줄로 완성됩니다.
Count Plot의 핵심 특징은 첫째, 자동으로 각 카테고리의 빈도를 계산하고, 둘째, hue 매개변수로 하위 그룹을 색상으로 구분하며, 셋째, order 매개변수로 원하는 순서대로 정렬할 수 있다는 점입니다. 이러한 특징들이 범주형 데이터 분석을 매우 간편하게 만듭니다.
코드 예제
import seaborn as sns
import matplotlib.pyplot as plt
# 타이타닉 데이터셋 로드
titanic = sns.load_dataset('titanic')
# Count Plot 생성: 승선 항구별 승객 수 (생존 여부로 색상 구분)
plt.figure(figsize=(10, 6))
ax = sns.countplot(data=titanic, x='embark_town', hue='survived',
palette='Set1', order=['Southampton', 'Cherbourg', 'Queenstown'],
edgecolor='black', linewidth=1.2)
# 막대 위에 숫자 표시
for container in ax.containers:
ax.bar_label(container, fontsize=10, padding=3)
# 그래프 꾸미기
plt.title('승선 항구별 승객 수 및 생존 여부', fontsize=14, pad=15)
plt.xlabel('승선 항구', fontsize=12)
plt.ylabel('승객 수', fontsize=12)
plt.legend(title='생존', labels=['사망', '생존'], loc='upper right')
plt.grid(axis='y', alpha=0.3, linestyle='--')
plt.tight_layout()
plt.show()
설명
이것이 하는 일: Count Plot은 지정된 범주형 컬럼의 모든 고유값에 대해 자동으로 개수를 세고, 각 카테고리를 x축에, 개수를 y축에 배치하여 막대 그래프를 생성합니다. 첫 번째로, sns.countplot(data=titanic, x='embark_town')는 타이타닉 데이터의 승선 항구 컬럼을 읽어서 Southampton, Cherbourg, Queenstown 각각이 몇 번 나타나는지 자동으로 계산합니다.
이는 내부적으로 value_counts()와 비슷한 작업을 하지만, 결과를 바로 시각화합니다. 그 다음으로, hue='survived'가 실행되면서 각 항구별 막대가 생존(1)과 사망(0)으로 나뉩니다.
이제 하나의 항구에 두 개의 막대가 나란히 생기며, 각 항구에서 얼마나 많은 사람이 살았고 죽었는지 즉시 비교할 수 있습니다. palette='Set1'은 생존과 사망을 빨강과 파랑 같은 대비되는 색으로 표현합니다.
세 번째로, order로 항구의 순서를 명시적으로 지정합니다. 기본값은 알파벳 순서인데, 논리적인 순서(예: 승객 수가 많은 순)나 지리적 순서로 바꾸면 더 직관적입니다.
edgecolor와 linewidth는 각 막대에 검은색 테두리를 추가하여 경계를 명확하게 합니다. 마지막으로, bar_label로 각 막대 위에 정확한 숫자를 표시합니다.
이는 Matplotlib 3.4 이상에서 지원되는 기능으로, 시각적 비교와 정확한 값을 동시에 제공합니다. 여러분이 이 코드를 사용하면 "Southampton에서 탑승한 승객이 가장 많지만, 생존율은 가장 낮다"는 인사이트를 즉시 얻을 수 있습니다.
막대의 높이 비교로 절대적 개수를, 색상 비율로 상대적 생존율을 동시에 파악할 수 있죠. 이런 정보는 "어떤 항구가 위험했는가"를 분석할 때 핵심 근거가 됩니다.
비즈니스에서는 "어느 채널이 가입자를 많이 데려오지만 이탈률이 높은가" 같은 질문에 답할 수 있습니다.
실전 팁
💡 orient='h'로 설정하면 가로 막대가 되어 카테고리 이름이 길 때 레이블을 읽기 편합니다.
💡 stat='percent'로 변경하면 절대 개수 대신 백분율로 표시되어 비율 비교가 쉬워집니다(최신 버전에서 지원).
💡 dodge=False로 설정하면 hue 그룹들이 나란히 배치되지 않고 쌓여서 전체 개수 비교가 쉬워집니다.
💡 order를 데이터의 value_counts() 결과 순서로 지정하면 자동으로 빈도 순으로 정렬됩니다.
💡 saturation 매개변수로 색상의 채도를 조절하면 더 부드럽거나 선명한 시각 효과를 만들 수 있습니다.
9. Clustermap으로 계층적 군집화 시각화하기
시작하며
여러분이 100명의 고객과 20개의 제품에 대한 구매 데이터를 분석하는데, 어떤 고객들이 비슷한 구매 패턴을 보이는지, 어떤 제품들이 함께 구매되는지 파악하고 싶다고 상상해보세요. 100x20=2000개의 숫자를 보면서 패턴을 찾는 것은 불가능에 가깝습니다.
이런 문제는 고차원 데이터에서 숨겨진 그룹을 발견해야 할 때 발생합니다. 단순히 Heatmap만 그리면 색깔은 보이지만 어떤 것들이 비슷한지, 몇 개의 그룹이 있는지 알기 어렵습니다.
수동으로 정렬하려면 어떤 순서가 좋을지 판단하기 어렵죠. 바로 이럴 때 필요한 것이 Clustermap입니다.
계층적 군집화 알고리즘으로 자동으로 비슷한 행과 열을 그룹화하고, Heatmap과 덴드로그램을 함께 표시하여 데이터 구조를 한눈에 보여줍니다.
개요
간단히 말해서, Clustermap은 Heatmap에 계층적 군집화를 적용하여 비슷한 행과 열을 자동으로 재배치하고, 상단과 좌측에 덴드로그램(나무 모양 다이어그램)을 추가하여 계층 구조를 시각화하는 고급 기법입니다. 왜 이게 필요할까요?
실무에서는 고객 세그먼테이션, 유전자 발현 분석, 추천 시스템 등에서 "누가 누구와 비슷한가", "무엇이 무엇과 함께 나타나는가"를 찾는 일이 핵심입니다. 예를 들어, 전자상거래에서 고객의 구매 이력을 Clustermap으로 분석하면 자동으로 "명품 선호 그룹", "가성비 추구 그룹", "건강 관심 그룹" 같은 세그먼트가 드러납니다.
이는 개인화 마케팅의 기초가 되죠. 기존에는 scipy로 군집화를 수행하고, 순서를 재배치하고, 덴드로그램을 따로 그리고, Heatmap을 따로 그려야 했다면, 이제는 sns.clustermap() 한 줄로 모든 것이 완성됩니다.
Clustermap의 핵심 특징은 첫째, 계층적 군집화로 최적의 순서를 자동으로 찾고, 둘째, 덴드로그램으로 군집의 계층 구조를 보여주며, 셋째, 색상 막대로 행이나 열의 메타데이터를 추가로 표시할 수 있다는 점입니다. 이러한 특징들이 복잡한 데이터에서 의미 있는 패턴을 발견하는 데 필수적입니다.
코드 예제
import seaborn as sns
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
# 샘플 데이터 생성: 학생별 과목 점수
np.random.seed(42)
students = [f'학생{i}' for i in range(1, 21)]
subjects = ['수학', '과학', '영어', '국어', '역사', '음악', '미술', '체육']
scores = np.random.randint(50, 100, size=(20, 8))
df = pd.DataFrame(scores, index=students, columns=subjects)
# Clustermap 생성: 학생과 과목을 자동 군집화
clustermap = sns.clustermap(df, cmap='YlOrRd',
standard_scale=1, # 열 기준 표준화
figsize=(10, 8),
cbar_kws={'label': '점수'},
linewidths=0.5, linecolor='white',
dendrogram_ratio=0.15,
row_cluster=True, col_cluster=True)
# 제목 추가
clustermap.fig.suptitle('학생 및 과목별 점수 군집 분석',
fontsize=14, y=0.98)
plt.show()
설명
이것이 하는 일: Clustermap은 각 행과 열에 대해 유클리드 거리나 상관관계를 계산하고, 계층적 군집화 알고리즘으로 비슷한 것들을 그룹화한 후, 그 순서대로 Heatmap을 재배치하며, 상단과 좌측에 덴드로그램을 추가합니다. 첫 번째로, 20명의 학생과 8개 과목에 대한 점수 데이터를 생성합니다.
실제 데이터에서는 학생마다 잘하는 과목 패턴이 다르겠지만, 여기서는 랜덤 값으로 예시를 만들었습니다. 실제 분석에서는 여러분의 실제 데이터를 사용하면 됩니다.
그 다음으로, sns.clustermap(df, cmap='YlOrRd')가 실행되면서 마법이 일어납니다. 내부적으로는 먼저 각 학생 쌍 간의 거리를 계산하고(8차원 공간에서의 유클리드 거리), 계층적 군집화를 수행하여 가장 비슷한 학생들이 가까이 오도록 순서를 재배치합니다.
과목도 마찬가지로 재배치됩니다. 세 번째로, standard_scale=1이 각 과목(열)의 점수를 평균 0, 표준편차 1로 표준화합니다.
이렇게 하면 "수학 평균 90점, 체육 평균 60점"처럼 과목마다 평균이 다를 때도 공정하게 비교할 수 있습니다. 표준화하지 않으면 평균이 높은 과목만 빨간색으로 나와서 패턴을 놓칠 수 있습니다.
마지막으로, linewidths=0.5, linecolor='white'로 각 셀 사이에 흰색 선을 그어 구분을 명확하게 하고, dendrogram_ratio=0.15로 덴드로그램의 크기를 조절합니다. 덴드로그램의 가지가 어디서 합쳐지는지를 보면 몇 개의 주요 그룹이 있는지 알 수 있습니다.
여러분이 이 코드를 사용하면 "학생 1, 5, 12는 이과 성향이 강하고", "학생 3, 8, 15는 문과 성향이 강하다" 같은 패턴을 자동으로 발견할 수 있습니다. 덴드로그램에서 큰 가지가 2~3개로 나뉜다면 그만큼의 주요 그룹이 존재한다는 뜻입니다.
마케팅에서는 고객을 자동으로 세그먼트화하고, 바이오인포매틱스에서는 유사한 유전자를 그룹화하며, 추천 시스템에서는 비슷한 취향의 사용자를 찾는 데 이 기법을 사용합니다.
실전 팁
💡 method='average' 또는 'ward'로 군집화 방법을 바꾸면 다른 계층 구조를 얻을 수 있습니다. ward가 보통 더 균형잡힌 클러스터를 만듭니다.
💡 metric='correlation'으로 거리 척도를 상관계수로 바꾸면 절대값이 아닌 패턴의 유사도로 군집화합니다.
💡 row_colors나 col_colors로 각 행/열의 카테고리를 색상 막대로 추가하면 "이 그룹은 남성이 많구나" 같은 추가 인사이트를 얻을 수 있습니다.
💡 robust=True를 사용하면 이상치의 영향을 줄여 더 안정적인 군집화 결과를 얻습니다.
💡 z_score 매개변수로 표준화 축을 제어하거나, standard_scale=None으로 표준화를 비활성화하면 원본 값의 크기를 그대로 비교할 수 있습니다.
10. KDE Plot으로 연속적인 확률 밀도 시각화하기
시작하며
여러분이 웹사이트 방문자의 체류 시간 분포를 분석하는데, 히스토그램으로 그리니 막대의 개수(bins)에 따라 모양이 너무 달라 보여서 어느 것이 진짜 분포인지 혼란스러운 경험을 해보셨나요? bins=10일 때는 매끄럽게 보이는데, bins=50으로 하면 울퉁불퉁해집니다.
이런 문제는 히스토그램의 근본적인 한계입니다. 연속적인 데이터를 인위적인 구간으로 나누기 때문에 bins 설정에 따라 완전히 다른 인상을 줄 수 있습니다.
실제 데이터는 연속적인데, 시각화는 이산적이라는 불일치가 문제죠. 바로 이럴 때 필요한 것이 KDE Plot입니다.
커널 밀도 추정(Kernel Density Estimation)이라는 통계 기법으로 부드러운 곡선을 그려서 연속적인 확률 밀도를 표현합니다.
개요
간단히 말해서, KDE Plot은 각 데이터 포인트 주변에 작은 정규분포 커널을 배치하고, 이들을 모두 합쳐서 부드러운 확률 밀도 곡선을 생성하는 시각화 기법입니다. 왜 이게 필요할까요?
실무에서는 데이터의 분포 모양을 정확히 파악하는 것이 중요합니다. 예를 들어, 서버 응답 시간 분포가 이봉분포(두 개의 봉우리)라면 실제로는 두 가지 다른 처리 경로가 존재한다는 뜻일 수 있습니다.
히스토그램으로는 bins를 잘못 설정하면 이런 미묘한 패턴을 놓칠 수 있지만, KDE Plot은 연속 곡선으로 표현하여 모든 디테일을 보존합니다. 기존에는 히스토그램의 bins를 여러 번 바꿔가며 적절한 설정을 찾아야 했다면, 이제는 KDE Plot으로 한 번에 부드럽고 정확한 분포를 볼 수 있습니다.
KDE Plot의 핵심 특징은 첫째, bins 설정에 의존하지 않고, 둘째, 부드러운 곡선으로 연속적인 확률 밀도를 표현하며, 셋째, 여러 그룹의 분포를 중첩하여 비교하기 쉽다는 점입니다. 이러한 특징들이 통계 분석과 데이터 과학에서 KDE를 필수 도구로 만들었습니다.
코드 예제
import seaborn as sns
import matplotlib.pyplot as plt
# 팁 데이터셋 로드
tips = sns.load_dataset('tips')
# KDE Plot 생성: 총 금액 분포를 시간대별로 비교
plt.figure(figsize=(10, 6))
sns.kdeplot(data=tips, x='total_bill', hue='time',
fill=True, alpha=0.4, linewidth=2.5,
palette='Set2', common_norm=False, bw_adjust=1.2)
# 참고용으로 실제 데이터 포인트를 x축에 표시 (rug plot)
sns.rugplot(data=tips, x='total_bill', hue='time',
palette='Set2', alpha=0.5, height=0.05)
# 그래프 꾸미기
plt.title('시간대별 총 금액 확률 밀도 분포', fontsize=14, pad=15)
plt.xlabel('총 금액 ($)', fontsize=12)
plt.ylabel('확률 밀도', fontsize=12)
plt.legend(title='시간대', labels=['저녁', '점심'], loc='upper right')
plt.grid(alpha=0.3, linestyle='--')
plt.xlim(0, 60)
plt.tight_layout()
plt.show()
설명
이것이 하는 일: KDE Plot은 각 데이터 포인트에 가우시안(정규분포) 커널을 중심으로 배치하고, 모든 커널을 합산하여 연속적인 확률 밀도 함수를 추정한 후, 이를 부드러운 곡선으로 그립니다. 첫 번째로, sns.kdeplot(data=tips, x='total_bill', hue='time')은 점심과 저녁 시간대의 총 금액 데이터를 각각 읽어서 두 개의 KDE 곡선을 생성합니다.
각 시간대마다 모든 데이터 포인트에 작은 종 모양(가우시안) 커널을 놓고, 이들을 모두 더하면 전체 분포 곡선이 됩니다. 그 다음으로, fill=True, alpha=0.4가 실행되면서 곡선 아래 영역이 반투명하게 채워집니다.
두 그룹의 곡선이 겹치는 부분도 볼 수 있어서 분포의 중첩 정도를 직관적으로 파악할 수 있죠. linewidth=2.5는 곡선을 굵게 만들어 명확하게 보이게 합니다.
세 번째로, common_norm=False는 각 그룹의 곡선을 독립적으로 정규화합니다. True로 하면 두 그룹을 합친 전체에 대해 정규화되어, 샘플 크기가 다를 때 공정한 비교가 됩니다.
bw_adjust=1.2는 대역폭(bandwidth)을 조정하여 곡선의 부드러움을 제어합니다. 값이 클수록 더 부드럽고, 작을수록 더 울퉁불퉁합니다.
마지막으로, rugplot을 추가하여 x축에 실제 데이터 포인트의 위치를 작은 세로선으로 표시합니다. 이를 통해 "이 부분의 곡선이 높은 이유는 실제로 데이터가 여기 많이 몰려있기 때문"을 확인할 수 있습니다.
여러분이 이 코드를 사용하면 "점심 시간대는 1520달러에 봉우리가 있고, 저녁 시간대는 더 넓게 퍼져있으며 2030달러에 봉우리가 있다"는 인사이트를 얻을 수 있습니다. 곡선의 모양으로 분포의 형태(정규분포인지, 치우쳤는지, 여러 봉우리가 있는지)를 즉시 파악할 수 있고, 두 그룹이 얼마나 겹치는지도 시각적으로 명확합니다.
이는 A/B 테스트 결과 비교, 사용자 행동 패턴 분석 등에 매우 유용합니다.
실전 팁
💡 cumulative=True로 설정하면 누적 분포 함수(CDF)를 그려서 "75% 사용자가 30초 이내에 떠난다" 같은 분위수 정보를 쉽게 읽을 수 있습니다.
💡 bw_method='scott'나 'silverman'으로 대역폭 선택 방법을 바꾸면 데이터에 더 적합한 곡선을 얻을 수 있습니다.
💡 cut=0으로 설정하면 실제 데이터 범위를 벗어나는 부분을 그리지 않아 더 정확한 시각화가 됩니다.
💡 multiple='stack'이나 'fill'로 여러 그룹을 쌓거나 100% 스택으로 표시하면 상대적 비율을 비교하기 쉽습니다.
💡 log_scale=True를 사용하면 로그 스케일로 표현되어 지수 분포나 로그정규분포를 더 잘 볼 수 있습니다.
11. Point Plot으로 시간에 따른 평균 변화 추적하기
시작하며
여러분이 월별 매출 평균을 분석하는데, 바 차트로 그리니 막대가 너무 커서 미묘한 변화 추세가 잘 안 보이는 경험을 해보셨나요? 라인 차트로 그리면 개별 데이터의 변동성은 보이는데, 통계적으로 유의미한 평균 변화인지 알기 어렵습니다.
이런 문제는 시계열 데이터나 순서가 있는 범주형 데이터에서 평균의 변화를 시각화할 때 발생합니다. 단순 평균만 보면 신뢰도를 모르고, 모든 원본 데이터를 보면 너무 복잡해집니다.
결과적으로 "이 변화가 우연인가, 의미 있는 트렌드인가"를 판단하기 어렵죠. 바로 이럴 때 필요한 것이 Point Plot입니다.
각 시점이나 카테고리의 평균을 점으로 표시하고, 선으로 연결하며, 신뢰구간을 오차 막대로 함께 보여줍니다.
개요
간단히 말해서, Point Plot은 범주형 x축의 각 값에 대해 y값의 평균을 계산하여 점으로 표시하고, 이들을 선으로 연결하며, 95% 신뢰구간을 오차 막대로 추가하는 통계적 시각화 도구입니다. 왜 이게 필요할까요?
실무에서는 시간에 따른 KPI 변화, 실험 조건별 성과 비교 등에서 "평균이 정말 변했는가, 아니면 노이즈인가"를 판단해야 합니다. 예를 들어, 신제품 출시 후 월별 고객 만족도를 추적할 때 Point Plot을 사용하면 "3월에 만족도가 올랐는데, 신뢰구간이 이전 달과 겹치지 않으므로 통계적으로 유의미한 개선"이라고 결론 내릴 수 있습니다.
기존에는 groupby로 평균을 계산하고, 표준오차를 계산하고, matplotlib으로 점과 선과 오차 막대를 각각 그려야 했다면, 이제는 sns.pointplot() 한 줄로 모든 통계 계산과 시각화가 완성됩니다. Point Plot의 핵심 특징은 첫째, 자동으로 평균과 신뢰구간을 계산하고, 둘째, 점을 선으로 연결하여 추세를 명확히 하며, 셋째, hue로 여러 그룹의 추세를 동시에 비교할 수 있다는 점입니다.
이러한 특징들이 시계열 분석과 실험 결과 비교에 최적입니다.
코드 예제
import seaborn as sns
import matplotlib.pyplot as plt
# 팁 데이터셋 로드
tips = sns.load_dataset('tips')
# Point Plot 생성: 요일별 팁 평균 변화 (시간대별로 비교)
plt.figure(figsize=(10, 6))
sns.pointplot(data=tips, x='day', y='tip', hue='time',
markers=['o', 's'], linestyles=['-', '--'],
palette='tab10', capsize=0.1, errwidth=2,
order=['Thur', 'Fri', 'Sat', 'Sun'],
dodge=0.3)
# 그래프 꾸미기
plt.title('요일 및 시간대별 평균 팁 변화 추이', fontsize=14, pad=15)
plt.xlabel('요일', fontsize=12)
plt.ylabel('평균 팁 ($)', fontsize=12)
plt.legend(title='시간대', loc='upper left', labels=['저녁', '점심'])
plt.grid(axis='y', alpha=0.3, linestyle='--')
plt.tight_layout()
plt.show()
설명
이것이 하는 일: Point Plot은 각 x 범주에 대해 y값의 평균을 계산하고, 부트스트랩이나 표준오차로 신뢰구간을 추정하며, 이를 점과 오차 막대로 표시한 후 시간 순서대로 선으로 연결합니다. 첫 번째로, sns.pointplot(data=tips, x='day', y='tip')는 각 요일(목, 금, 토, 일)마다 모든 팁 데이터의 평균을 계산합니다.
예를 들어 목요일에 20건의 데이터가 있다면, 그 20개 팁의 평균을 구하여 하나의 점으로 표시합니다. 그 다음으로, hue='time'이 실행되면서 점심과 저녁 시간대가 각각 다른 선으로 그려집니다.
markers=['o', 's']는 점심은 원, 저녁은 사각형으로 표시하고, linestyles=['-', '--']는 점심은 실선, 저녁은 점선으로 연결하여 구분을 명확히 합니다. 세 번째로, 신뢰구간이 자동으로 계산되어 각 점에서 위아래로 작은 막대(오차 막대)가 그려집니다.
capsize=0.1은 오차 막대 끝에 작은 가로선을 추가하고, errwidth=2는 오차 막대의 두께를 설정합니다. 만약 두 점의 신뢰구간이 겹치지 않으면 통계적으로 유의미한 차이가 있다고 해석할 수 있습니다.
마지막으로, dodge=0.3은 hue 그룹들을 좌우로 약간 이동시켜 겹치지 않게 합니다. 이렇게 하면 같은 요일의 점심과 저녁을 나란히 비교할 수 있습니다.
order로 요일을 시간 순서대로 정렬하여 추세를 명확히 봅니다. 여러분이 이 코드를 사용하면 "저녁 시간대는 목요일부터 토요일까지 평균 팁이 증가하다가 일요일에 약간 감소한다"는 추세를 한눈에 볼 수 있습니다.
오차 막대를 보면 "토요일 저녁의 높은 팁이 통계적으로 유의미한가"를 즉시 판단할 수 있죠. 만약 오차 막대가 크면 데이터의 변동성이 커서 확실한 결론을 내리기 어렵다는 뜻이고, 작으면 일관된 패턴이 있다는 뜻입니다.
A/B 테스트 결과를 시각화할 때도 이 방법을 사용하면 "어느 변형이 통계적으로 더 나은가"를 명확히 보여줄 수 있습니다.
실전 팁
💡 estimator=np.median으로 변경하면 평균 대신 중앙값을 사용하여 이상치의 영향을 줄일 수 있습니다.
💡 ci='sd'로 설정하면 신뢰구간 대신 표준편차를 표시하여 데이터의 분산을 직접 볼 수 있습니다.
💡 join=False로 설정하면 점들이 선으로 연결되지 않아 순서가 없는 범주형 데이터에 적합합니다.
💡 scale 매개변수로 점의 크기를 조절하면 더 강조하거나 미묘하게 표현할 수 있습니다.
💡 n_boot 매개변수로 부트스트랩 반복 횟수를 늘리면 더 정확한 신뢰구간을 얻지만 계산 시간이 늘어납니다.
12. Cat Plot으로 모든 범주형 시각화 통합하기
시작하며
여러분이 데이터 분석 보고서를 작성하는데, 어떤 때는 box plot이 적절하고, 어떤 때는 violin plot이 더 낫고, 또 어떤 때는 bar plot이 필요한 상황을 겪어보셨나요? 각각 다른 함수를 외우고 사용하려니 헷갈리고, 나중에 그래프 종류를 바꾸려면 코드를 많이 수정해야 합니다.
이런 문제는 범주형 데이터 시각화에 여러 가지 옵션이 있지만, 각각이 독립적인 함수로 구현되어 있기 때문에 발생합니다. 프로젝트 진행 중에 "이 데이터는 box plot보다 swarm plot이 더 적합하겠다"고 생각을 바꾸면 많은 코드를 고쳐야 하죠.
바로 이럴 때 필요한 것이 Cat Plot입니다. 하나의 통합 인터페이스로 모든 범주형 플롯(strip, swarm, box, violin, point, bar, count)을 kind 매개변수 하나로 전환할 수 있습니다.
개요
간단히 말해서, Cat Plot은 범주형 데이터 시각화의 통합 인터페이스로, kind 매개변수에 'strip', 'swarm', 'box', 'violin', 'point', 'bar', 'count' 중 하나를 지정하여 다양한 스타일의 그래프를 일관된 방식으로 생성하는 도구입니다. 왜 이게 필요할까요?
실무에서는 데이터의 특성과 전달하려는 메시지에 따라 최적의 시각화 방법이 다릅니다. 데이터 개수가 적으면 swarm plot이 좋고, 많으면 violin plot이 낫고, 평균 비교가 목적이면 bar plot이 적합합니다.
Cat Plot을 사용하면 데이터와 매개변수는 그대로 두고 kind만 바꿔서 여러 시각화를 빠르게 시도하고 비교할 수 있습니다. 기존에는 sns.boxplot(), sns.violinplot(), sns.barplot() 등 각각 다른 함수를 배우고 사용해야 했다면, 이제는 sns.catplot(kind='box'), sns.catplot(kind='violin')처럼 하나의 함수로 통일할 수 있습니다.
Cat Plot의 핵심 특징은 첫째, 모든 범주형 플롯을 하나의 인터페이스로 통합하고, 둘째, FacetGrid 기능이 내장되어 있어 col/row로 다차원 분석이 가능하며, 셋째, 일관된 매개변수로 모든 스타일을 제어할 수 있다는 점입니다. 이러한 특징들이 범주형 데이터 분석의 효율성을 크게 높입니다.
코드 예제
import seaborn as sns
import matplotlib.pyplot as plt
# 팁 데이터셋 로드
tips = sns.load_dataset('tips')
# Cat Plot 생성: 요일 및 시간대별 총 금액을 성별로 분할하여 분석
g = sns.catplot(data=tips, x='day', y='total_bill',
hue='time', col='sex', kind='violin',
height=5, aspect=1.2, palette='muted',
order=['Thur', 'Fri', 'Sat', 'Sun'],
split=True, inner='quartile')
# 제목 추가
g.fig.suptitle('요일, 시간대, 성별에 따른 총 금액 분포',
fontsize=14, y=1.02)
g.set_axis_labels('요일', '총 금액 ($)', fontsize=11)
g.add_legend(title='시간대')
plt.tight_layout()
plt.show()
설명
이것이 하는 일: Cat Plot은 지정된 kind에 따라 적절한 범주형 플롯 함수를 내부적으로 호출하고, col/row 매개변수가 있으면 FacetGrid를 자동으로 생성하여 여러 서브플롯으로 배치합니다. 첫 번째로, sns.catplot(data=tips, x='day', y='total_bill', kind='violin')은 요일별 총 금액을 violin plot으로 시각화합니다.
kind='violin' 대신 kind='box'로 바꾸면 box plot이 되고, kind='swarm'으로 바꾸면 swarm plot이 됩니다. 코드의 나머지 부분은 전혀 바꿀 필요가 없죠.
그 다음으로, col='sex'가 실행되면서 남성과 여성을 좌우로 분리하여 2개의 서브플롯을 자동 생성합니다. 이는 내부적으로 FacetGrid를 사용하므로, 별도로 FacetGrid 코드를 작성하지 않아도 됩니다.
height=5, aspect=1.2로 각 서브플롯의 크기를 조절합니다. 세 번째로, hue='time', split=True는 각 violin을 반으로 나누어 점심과 저녁을 좌우로 표시합니다.
inner='quartile'은 violin 내부에 사분위수를 표시하여 통계 정보를 추가합니다. 이 모든 매개변수는 kind를 바꿔도 동일하게 작동하여 일관성을 유지합니다.
마지막으로, FacetGrid 객체가 반환되므로 g.fig.suptitle()로 전체 제목을, g.set_axis_labels()로 축 레이블을 일괄 설정할 수 있습니다. 여러분이 이 코드를 사용하면 4차원 데이터(요일, 총 금액, 시간대, 성별)를 한 화면에 효과적으로 표현할 수 있습니다.
"남성은 토요일 저녁에 가장 많이 지출하지만 여성은 요일별 차이가 작다" 같은 복잡한 패턴을 즉시 발견할 수 있죠. 만약 데이터가 너무 많아서 violin plot이 어수선하다고 느끼면, kind='box'로 한 줄만 바꾸면 됩니다.
탐색 단계에서는 kind를 빠르게 바꿔가며 가장 적합한 시각화를 찾고, 최종 보고서에는 그것을 사용하는 효율적인 워크플로우를 만들 수 있습니다.
실전 팁
💡 kind='boxen'을 사용하면 더 많은 분위수를 표시하는 enhanced box plot을 그려서 데이터가 많을 때 분포를 더 자세히 볼 수 있습니다.
💡 row와 col을 동시에 사용하면 2차원 격자를 만들어 더 복잡한 다변량 분석이 가능합니다.
💡 sharex=False, sharey=False로 각 서브플롯의 축을 독립적으로 만들면 각 그룹의 세부 패턴을 더 잘 볼 수 있습니다.
💡 legend_out=True로 범례를 그래프 바깥에 배치하면 플롯 영역을 더 넓게 사용할 수 있습니다.
💡 각 kind에 특화된 매개변수(예: violin의 split, point의 markers)도 모두 catplot에서 사용할 수 있어 유연성이 매우 높습니다.
댓글 (0)
함께 보면 좋은 카드 뉴스
데이터 증강과 정규화 완벽 가이드
머신러닝 모델의 성능을 극대화하는 핵심 기법인 데이터 증강과 정규화에 대해 알아봅니다. 실무에서 바로 활용할 수 있는 다양한 기법과 실전 예제를 통해 과적합을 방지하고 모델 성능을 향상시키는 방법을 배웁니다.
ResNet과 Skip Connection 완벽 가이드
딥러닝 모델이 깊어질수록 성능이 떨어지는 문제를 해결한 혁신적인 기법, ResNet과 Skip Connection을 초급자도 이해할 수 있도록 쉽게 설명합니다. 실제 구현 코드와 함께 배워보세요.
CNN 아키텍처 완벽 가이드 LeNet AlexNet VGGNet
컴퓨터 비전의 기초가 되는 세 가지 핵심 CNN 아키텍처를 배웁니다. 손글씨 인식부터 이미지 분류까지, 딥러닝의 발전 과정을 따라가며 각 모델의 구조와 특징을 실습 코드와 함께 이해합니다.
CNN 기초 Convolution과 Pooling 완벽 가이드
CNN의 핵심인 Convolution과 Pooling을 초급자도 쉽게 이해할 수 있도록 설명합니다. 이미지 인식의 원리부터 실제 코드 구현까지, 실무에서 바로 활용 가능한 내용을 담았습니다.
TensorFlow와 Keras 완벽 입문 가이드
머신러닝과 딥러닝의 세계로 들어가는 첫걸음! TensorFlow와 Keras 프레임워크를 처음 접하는 분들을 위한 친절한 가이드입니다. 실무에서 바로 활용할 수 있는 핵심 개념과 예제를 통해 AI 모델 개발의 기초를 탄탄히 다져보세요.