iBetter Books
수정

선 그래프 (lineplot)

이번에 민서가 들여다본 데이터는 fMRI 실험 결과였습니다. 시간(timepoint)에 따라 뇌 신호(signal)가 어떻게 변하는지 기록된 데이터였는데, 같은 시간대에 여러 피험자의 측정값이 함께 들어 있었습니다.

"선배, 이거 x축에 시간, y축에 신호를 그리면 되는데, 같은 시점에 값이 여러 개 있어요."

강주원 선배가 대답했습니다.

"그러면 lineplot을 써봐. 여러 값이 있는 시점에서는 자동으로 평균을 잡고, 신뢰구간까지 그려줘."

이 차트가 보여주는 것

선 그래프는 x축에 놓인 순서(시간, 단계, 조건)에 따라 y값이 어떻게 변하는지 추적합니다. 값이 올라가고 내려가는 흐름을 한눈에 파악할 수 있습니다.

Seaborn의 lineplot은 같은 x 위치에 여러 y값이 있을 때 자동으로 평균을 계산하고, 그 평균 주변에 95% 신뢰구간을 음영으로 표시합니다.

import seaborn as snsimport matplotlib.pyplot as pltfmri = sns.load_dataset("fmri")sns.lineplot(data=fmri, x="timepoint", y="signal", hue="event")plt.title("시간에 따른 뇌 신호 변화")plt.show()

실행 결과

그래프를 보면 선 주변에 반투명한 음영 영역이 보입니다. 이것이 신뢰구간입니다.

신뢰구간의 직관적 이해

신뢰구간을 수학 없이 이해하는 방법이 있습니다.

"이 음영 범위 안에 실제 평균이 있을 가능성이 95%입니다."

실험을 100번 반복했을 때, 95번은 실제 평균이 이 범위 안에 들어온다는 뜻입니다. 음영이 넓을수록 데이터의 변동성이 크거나 샘플 수가 적다는 신호입니다.

신뢰구간 옵션 조정

기본값은 95% 신뢰구간(부트스트랩)이지만, 필요에 따라 바꿀 수 있습니다.

import seaborn as snsimport matplotlib.pyplot as pltfmri = sns.load_dataset("fmri")fig, axes = plt.subplots(1, 3, figsize=(15, 4))# 기본: 95% 신뢰구간sns.lineplot(data=fmri, x="timepoint", y="signal", hue="event", ax=axes[0])axes[0].set_title("기본 (95% CI)")# 표준편차 범위로 표시sns.lineplot(    data=fmri, x="timepoint", y="signal", hue="event",    errorbar=("sd", 1), ax=axes[1])axes[1].set_title("표준편차 범위")# 신뢰구간 없애기sns.lineplot(    data=fmri, x="timepoint", y="signal", hue="event",    errorbar=None, ax=axes[2])axes[2].set_title("신뢰구간 없음")plt.tight_layout()plt.show()

실행 결과

Matplotlib과의 비교

Matplotlib으로 같은 그래프를 그리려면 직접 평균을 계산하고, 신뢰구간을 계산해서 fill_between으로 그려야 합니다.

import seaborn as snsimport matplotlib.pyplot as pltimport numpy as npfmri = sns.load_dataset("fmri")fig, axes = plt.subplots(1, 2, figsize=(12, 4))# Matplotlib 방식 (직접 집계)for event, group in fmri.groupby("event"):    means = group.groupby("timepoint")["signal"].mean()    sems = group.groupby("timepoint")["signal"].sem()    axes[0].plot(means.index, means.values, label=event)    axes[0].fill_between(        means.index,        means.values - 1.96 * sems,        means.values + 1.96 * sems,        alpha=0.3    )axes[0].legend()axes[0].set_title("Matplotlib (직접 계산)")# Seaborn 방식 (자동 집계)sns.lineplot(data=fmri, x="timepoint", y="signal", hue="event", ax=axes[1])axes[1].set_title("Seaborn (자동)")plt.tight_layout()plt.show()

실행 결과

자주 쓰는 파라미터 정리

파라미터 역할 예시
x, y 축에 사용할 컬럼 x="timepoint"
hue 색으로 구분할 변수 hue="event"
errorbar 오차 범위 표시 방식 errorbar=None, errorbar=("sd", 1)
estimator 집계 함수 estimator="mean" (기본)
markers 각 점에 마커 표시 markers=True
dashes 선 스타일 구분 dashes=True

언제 선 그래프를 쓸까

x축에 순서나 연속성이 있을 때 씁니다. 시간, 실험 단계, 온도 변화 같은 경우입니다. 순서 없이 범주만 있다면 barplot이 더 적합합니다.