iBetter Books
수정

산점도 (scatterplot)

민서가 팀 프로젝트 데이터를 열어보니 식당 손님들의 계산 금액과 팁 금액이 같이 기록되어 있었습니다. 강주원 선배에게 물었습니다.

"선배, 계산 금액이 많을수록 팁도 많이 주는 건지 알고 싶어요."

"그럼 산점도야. 두 숫자 값 사이의 관계를 보여주는 차트거든."

이 차트가 보여주는 것

산점도는 두 연속 변수를 각각 x축과 y축에 놓고, 각 데이터 포인트를 점 하나로 찍습니다.

점들이 왼쪽 아래에서 오른쪽 위 방향으로 모여 있으면 양의 관계입니다. x가 커질수록 y도 커진다는 뜻입니다. 반대로 오른쪽 아래 방향이면 음의 관계이고, 점들이 사방에 흩어져 있으면 관계가 없다고 볼 수 있습니다.

Matplotlib으로 산점도를 그리면 이렇습니다.

import matplotlib.pyplot as pltimport seaborn as snstips = sns.load_dataset("tips")# Matplotlib 방식fig, ax = plt.subplots()smokers = tips[tips["smoker"] == "Yes"]non_smokers = tips[tips["smoker"] == "No"]ax.scatter(non_smokers["total_bill"], non_smokers["tip"], label="No", alpha=0.7)ax.scatter(smokers["total_bill"], smokers["tip"], label="Yes", alpha=0.7)ax.set_xlabel("total_bill")ax.set_ylabel("tip")ax.legend(title="smoker")plt.title("Matplotlib 산점도")plt.show()

실행 결과

Seaborn을 쓰면 훨씬 간결합니다.

import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")sns.scatterplot(data=tips, x="total_bill", y="tip", hue="smoker")plt.title("계산 금액과 팁의 관계")plt.show()

실행 결과

hue="smoker" 하나만 추가하면 흡연 여부에 따라 색이 자동으로 구분됩니다.

점의 크기와 모양도 바꿀 수 있습니다

hue 외에 sizestyle 파라미터를 함께 쓰면 정보를 세 가지 채널로 전달할 수 있습니다.

import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")sns.scatterplot(    data=tips,    x="total_bill",    y="tip",    hue="smoker",    # 색으로 흡연 여부 구분    size="size",     # 점 크기로 테이블 인원 수 표현    style="time",    # 점 모양으로 식사 시간 구분    alpha=0.7,       # 점이 겹칠 때 투명하게 처리    palette="deep")plt.title("계산 금액 vs 팁 (다중 변수)")plt.show()

실행 결과

alpha=0.7은 점을 70% 불투명하게 만들어 겹치는 영역을 확인하기 쉽게 합니다.

자주 쓰는 파라미터 정리

파라미터 역할 예시
x, y 축에 사용할 컬럼 x="total_bill"
hue 색으로 구분할 범주 변수 hue="smoker"
size 점 크기로 표현할 변수 size="size"
style 점 모양으로 표현할 변수 style="time"
alpha 투명도 (0: 완전 투명, 1: 불투명) alpha=0.7
palette 색상 팔레트 palette="Set2"

언제 산점도를 쓸까

두 연속 변수 사이의 관계를 확인할 때 씁니다. 둘 다 숫자여야 합니다. 한쪽이 범주형이라면 박스플롯이나 바이올린 플롯이 더 적합합니다.

데이터 포인트가 수천 개를 넘어가면 점이 너무 겹쳐서 패턴을 보기 어렵습니다. 이때는 alpha를 낮추거나 2D KDE 플롯으로 전환하는 것을 고려합니다.