iBetter Books
수정

JointGrid와 jointplot

pairplot이 변수 여러 개의 관계를 넓게 훑어봤다면, jointplot은 두 변수의 관계를 깊게 파고듭니다.

"부리 길이와 부리 깊이, 이 두 변수만 집중해서 보고 싶어요. 산점도도 보고 싶고, 각 변수의 분포도 같이 보고 싶어요."

민서의 요구를 들은 강주원 선배가 바로 코드 한 줄을 입력했습니다.


jointplot: 결합 분포와 주변 분포를 한 화면에

jointplot은 중앙에 두 변수의 결합 분포(산점도, KDE 등)를 그리고, 위쪽과 오른쪽에 각 변수의 주변 분포(히스토그램, KDE)를 함께 보여줍니다.

# 파일: jointplot_basic.pyimport seaborn as snsimport matplotlib.pyplot as pltpenguins = sns.load_dataset("penguins")# 기본 jointplot: 중앙에 산점도, 변두리에 히스토그램sns.jointplot(    data=penguins,    x="bill_length_mm",    y="bill_depth_mm")plt.show()

실행 결과

상관계수(r)와 p값이 자동으로 표시됩니다. 두 변수 사이에 통계적 관계가 있는지 바로 확인할 수 있습니다.


hue로 그룹 구분하기

# 파일: jointplot_hue.pyimport seaborn as snsimport matplotlib.pyplot as pltpenguins = sns.load_dataset("penguins")# hue로 종별 색상 구분sns.jointplot(    data=penguins,    x="bill_length_mm",    y="bill_depth_mm",    hue="species")plt.show()

실행 결과

hue를 추가하면 흥미로운 현상이 드러납니다. 전체적으로 보면 부리 길이와 깊이가 음의 상관관계처럼 보이지만, 종별로 나눠보면 각 종 안에서는 양의 상관관계를 보입니다. 이를 심슨의 역설이라고 하며, 그룹을 구분하지 않으면 놓치기 쉬운 패턴입니다.


kind 옵션으로 차트 유형 바꾸기

중앙 차트의 유형을 바꿀 수 있습니다.

# 파일: jointplot_kinds.pyimport seaborn as snsimport matplotlib.pyplot as pltpenguins = sns.load_dataset("penguins")fig, axes = plt.subplots(1, 3, figsize=(15, 5))# kind="scatter" (기본값): 산점도g1 = sns.jointplot(    data=penguins,    x="bill_length_mm",    y="bill_depth_mm",    kind="scatter")g1.figure.suptitle("scatter", y=1.02)# kind="kde": KDE 등고선g2 = sns.jointplot(    data=penguins,    x="bill_length_mm",    y="bill_depth_mm",    kind="kde")g2.figure.suptitle("kde", y=1.02)# kind="hist": 2D 히스토그램g3 = sns.jointplot(    data=penguins,    x="bill_length_mm",    y="bill_depth_mm",    kind="hist")g3.figure.suptitle("hist", y=1.02)plt.show()

실행 결과

kind 옵션의 전체 목록입니다.

kind 설명 언제 쓰나
"scatter" 산점도 (기본값) 개별 데이터 포인트 확인
"kde" KDE 등고선 밀도 분포의 형태 파악
"reg" 회귀선 + 산점도 선형 관계 강조
"hist" 2D 히스토그램 데이터 수가 많을 때
"hex" 육각형 빈 차트 데이터 수가 매우 많을 때

reg 옵션으로 회귀선 추가하기

# 파일: jointplot_reg.pyimport seaborn as snsimport matplotlib.pyplot as pltpenguins = sns.load_dataset("penguins").dropna()# kind="reg": 회귀선과 신뢰 구간 함께 표시sns.jointplot(    data=penguins,    x="bill_length_mm",    y="bill_depth_mm",    kind="reg",    line_kws={"color": "red"})plt.show()

실행 결과

회귀선과 함께 95% 신뢰 구간도 표시됩니다. 발표에서 "두 변수 사이에 선형 관계가 있다"는 주장을 시각적으로 뒷받침할 때 유용합니다.


JointGrid로 세밀하게 제어하기

jointplot이 자동으로 처리해주는 것들을 직접 제어하고 싶을 때 JointGrid를 사용합니다.

# 파일: jointgrid_custom.pyimport seaborn as snsimport matplotlib.pyplot as pltpenguins = sns.load_dataset("penguins")# JointGrid 생성g = sns.JointGrid(    data=penguins,    x="bill_length_mm",    y="bill_depth_mm")# 중앙: 산점도, 변두리: 히스토그램g.plot(sns.scatterplot, sns.histplot)plt.show()

실행 결과

plot() 메서드는 중앙 차트와 변두리 차트를 함께 설정합니다. 첫 번째 인수가 중앙, 두 번째 인수가 변두리(위쪽과 오른쪽 모두)입니다.


중앙과 변두리를 다르게 지정하기

# 파일: jointgrid_separate.pyimport seaborn as snsimport matplotlib.pyplot as pltpenguins = sns.load_dataset("penguins")g = sns.JointGrid(    data=penguins,    x="bill_length_mm",    y="bill_depth_mm")# 중앙, 변두리(x축 위), 변두리(y축 오른쪽)를 각각 다르게 지정g.plot_joint(sns.kdeplot, fill=True, cmap="Blues")g.plot_marginals(sns.histplot, kde=True)plt.show()

실행 결과

plot_joint()는 중앙 차트만, plot_marginals()는 위쪽과 오른쪽 주변 차트만 설정합니다.


크기 조절하기

# 파일: jointplot_size.pyimport seaborn as snsimport matplotlib.pyplot as pltpenguins = sns.load_dataset("penguins")# height: 전체 높이(인치), ratio: 중앙과 주변의 비율sns.jointplot(    data=penguins,    x="bill_length_mm",    y="bill_depth_mm",    hue="species",    height=7,    ratio=3    # 중앙이 주변보다 3배 크게)plt.show()

실행 결과

ratio가 클수록 중앙 차트가 차지하는 비율이 커집니다.


민서의 정리

세 가지 그리드 도구를 정리해봅니다.

도구 목적 사용 상황
FacetGrid 조건별 차트 격자 "요일별로, 성별로 나눠서 보고 싶다"
PairGrid / pairplot 변수 쌍 관계 전체 "변수들이 서로 어떤 관계인지 탐색하고 싶다"
JointGrid / jointplot 두 변수의 결합·주변 분포 "이 두 변수의 관계를 깊이 보고 싶다"

민서가 발표 자료를 펼쳤습니다. "이제 어떤 차트를 어디에 배치할지는 알겠어요. 근데 색깔이 아직도 기본 스타일이라 좀 밋밋한데..."

"그럼 이제 테마랑 색상을 손볼 시간이야."