lmplot과 regplot
민서가 산점도를 보면서 말했습니다.
"점들이 대체로 오른쪽 위로 올라가는 것 같은데, 이 경향을 선 하나로 요약할 수 있을까요?"
"regplot이 바로 그걸 해줘. 데이터에 가장 잘 맞는 직선을 그려주고, 그 선 주변에 신뢰구간도 음영으로 표시해줘."
이 차트가 보여주는 것
회귀선은 데이터의 추세를 가장 잘 요약하는 직선입니다. 모든 점들로부터의 거리 합이 최소가 되도록 그려집니다. 선이 오른쪽으로 갈수록 올라가면 양의 관계, 내려가면 음의 관계입니다.
회귀선 주변의 음영은 신뢰구간입니다. "이 범위 안에 실제 추세선이 있을 가능성이 95%"라는 뜻입니다. 음영이 넓을수록 데이터의 불확실성이 크거나 샘플이 적습니다.
regplot: Axes-level 회귀 차트
import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")sns.regplot(data=tips, x="total_bill", y="tip")plt.title("계산 금액과 팁의 관계 (회귀선 포함)")plt.xlabel("계산 금액 (달러)")plt.ylabel("팁 (달러)")plt.show()
회귀선과 산점도가 한 번에 그려집니다.
신뢰구간 조정과 제거
import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")fig, axes = plt.subplots(1, 3, figsize=(15, 4))# 기본: 95% 신뢰구간sns.regplot(data=tips, x="total_bill", y="tip", ax=axes[0])axes[0].set_title("기본 (95% CI)")# 신뢰구간 없애기sns.regplot(data=tips, x="total_bill", y="tip", ci=None, ax=axes[1])axes[1].set_title("ci=None")# 99% 신뢰구간sns.regplot(data=tips, x="total_bill", y="tip", ci=99, ax=axes[2])axes[2].set_title("99% CI")plt.suptitle("신뢰구간 옵션 비교", y=1.02)plt.tight_layout()plt.show()
다항 회귀: 곡선 추세
직선이 아닌 곡선 형태의 관계도 표현할 수 있습니다. order=2이면 2차 다항식을 맞춥니다.
import seaborn as snsimport matplotlib.pyplot as pltimport numpy as np# 예시 데이터: 이차 관계rng = np.random.default_rng(42)x = np.linspace(0, 10, 80)y = 2 + 0.5 * x - 0.05 * x**2 + rng.normal(0, 0.8, 80)import pandas as pddf = pd.DataFrame({"x": x, "y": y})fig, axes = plt.subplots(1, 2, figsize=(12, 4))sns.regplot(data=df, x="x", y="y", order=1, ax=axes[0])axes[0].set_title("order=1 (선형 회귀)")sns.regplot(data=df, x="x", y="y", order=2, ax=axes[1])axes[1].set_title("order=2 (이차 다항 회귀)")plt.tight_layout()plt.show()
lmplot: Figure-level 회귀 차트
lmplot은 regplot의 Figure-level 버전입니다. col, row, hue를 조합해 여러 그룹의 회귀선을 동시에 비교할 수 있습니다.
import seaborn as snsimport matplotlib.pyplot as plttips = sns.load_dataset("tips")g = sns.lmplot( data=tips, x="total_bill", y="tip", hue="smoker", # 흡연자/비흡연자 회귀선 비교 col="time", # 식사 시간별 열 분할 height=4, aspect=1.2)g.set_titles("{col_name}")g.set_axis_labels("계산 금액 (달러)", "팁 (달러)")plt.show()
흡연자와 비흡연자의 회귀선 기울기 차이, 점심과 저녁의 패턴 차이를 한 화면에서 비교할 수 있습니다.
regplot과 lmplot의 차이
| 항목 | regplot | lmplot |
|---|---|---|
| 레벨 | Axes-level | Figure-level |
| 반환값 | Axes |
FacetGrid |
| hue | 산점도 색 구분만 | 각 hue별 별도 회귀선 |
| col/row | 불가 | 가능 |
| plt.subplots()와 함께 | 가능 | 불가 |
hue만 필요하고 그룹별 별도 회귀선이 필요 없다면 regplot을, 그룹별 회귀선 비교나 col/row 분할이 필요하면 lmplot을 씁니다.