빠른 링크
선형 회귀: 추세 찾기
다중 회귀: 3차원 이상으로 확장하기
비선형 회귀: 곡선 맞추기
로지스틱 회귀: 이진 분류 맞추기
간단히 데이터를 모으는 것만으로는 충분하지 않습니다. 스프레드시트에 데이터를 채울 수는 있지만 그걸 바탕으로 행동할 수 없다면 무용지물입니다. 회귀분석은 데이터에서 관계를 찾아내는 가장 강력한 통계 도구 중 하나이며, 파이썬은 이를 훨씬 유연하고 빠르게 수행하도록 도와줍니다. 연필과 자를 내려놓고 파이썬을 켜세요. 아래 예제로 시작하는 방법을 단계별로 안내합니다.
선형 회귀: 추세 찾기
설명: 선형 회귀는 두 변수 간의 관계를 직선으로 모델링합니다. 한 변수를 독립변수(x), 다른 하나를 종속변수(y)라 합니다. 그래프에서는 일반적으로 x축에 독립변수, y축에 종속변수를 놓고 산점도를 그린 뒤 최적의 직선을 찾습니다.
데이터 예: 뉴욕시 레스토랑 팁(tips) 데이터셋을 사용해 총 청구액(total_bill)과 팁(tip) 사이의 관계를 확인합니다. 이 데이터셋은 Seaborn에 포함되어 있습니다.
필요한 라이브러리(예시): Seaborn(시각화), Pingouin(통계적 회귀), Jupyter 노트북(시각 확인)
기본 코드:
import seaborn as sns
# 데이터 불러오기
tips = sns.load_dataset('tips')
# Jupyter에서 그래프를 인라인으로 보려면
%matplotlib inline
# 산점도
sns.relplot(x='total_bill',y='tip',data=tips)
산점도가 비교적 직선 형태를 보인다면 양의 선형관계가 있을 가능성이 높습니다. Seaborn의 regplot으로 회귀선을 그려보면 직선 적합 상태를 눈으로 확인할 수 있습니다.
sns.regplot(x='total_bill',y='tip',data=tips)
통계적으로는 Pingouin의 linear_regression을 사용해 계수와 적합도를 구합니다:
import pingouin as pg
pg.linear_regression(tips['total_bill'],tips['tip']).round(2)
해석 포인트:
- 결정계수 r²: 설명력(종속변수 분산 중 독립변수가 설명하는 비율). 예시에서 r²가 0.46이면 약간 낮은 편은 아니며, √r²(≈0.68)는 두 변수 사이에 양의 상관관계가 있음을 시사합니다. (원저자의 수치는 예시 데이터의 결과입니다.)
- 회귀식: y = m x + b 형태로 표현됩니다. 예를 들면 tip = 0.11 * total_bill + 0.92.
예측 함수(파이썬):
def tip(total_bill):
return 0.92 + 0.11 * total_bill
# 예시: $100 청구서에 대한 팁 예측
# tip(100)
참고: 위 코드에서 들여쓰기는 파이썬 문법상 중요합니다(네 칸 스페이스 또는 탭 한 번이 표준).
검증 및 진단(간단한 체크리스트):
- 잔차 플롯(residual plot)을 확인해 잔차의 랜덤 분포를 검증한다(이상적으론 패턴이 없어야 함).
- 정규성: 잔차의 분포가 대략 정규분포인지 확인한다(Shapiro-Wilk 또는 Q-Q 플롯).
- 등분산성(평균제곱오차가 일정한지): heteroscedasticity 여부를 확인한다.
- 영향치와 이상치: Cook의 거리, 레버리지 포인트 등으로 영향 관측치 확인.
언제 실패하는가(대표적인 한계):
- 관계가 본질적으로 비선형일 때 선형 모델은 부적절합니다.
- 강한 이상치가 모델을 왜곡시킬 수 있습니다.
- 상호작용이나 교란변수(Confounder)가 있을 때 단순 선형 회귀는 편향된 결과를 줍니다.
대안 및 보완:
- 강건(robust) 회귀(예: Theil–Sen, RANSAC)로 이상치 영향 줄이기
- 비선형 관계가 의심되면 다항 회귀 또는 스플라인, GAM(Generalized Additive Models) 고려
- 해석과 예측을 분리: 예측 성능이 목표라면 회귀 외 머신러닝 모델(랜덤포레스트, 그라디언트 부스팅)도 고려
간단 실습(테스트 케이스):
- 입력: total_bill 배열 [10, 20, 50, 100]
- 기대 동작: tip 함수는 각각의 청구서에 대해 논리적(양수) 예측을 반환하고, bill이 증가하면 tip도 증가해야 함.
다중 회귀: 변수 여러 개를 한 번에
설명: 다중 선형 회귀는 여러 독립변수를 사용해 종속변수를 예측합니다. 2차원 평면의 직선 대신 다차원 공간의 평면(또는 초평면)을 맞춥니다. 시각화는 어려울 수 있지만 해석과 예측에는 매우 유용합니다.
예: 같은 tips 데이터에서 총 청구액(total_bill)과 파티 크기(size)를 함께 사용해 팁을 예측합니다.
pg.linear_regression(tips[['total_bill','size']],tips['tip']).round(2)
결과 해석:
- 회귀 계수가 각각 total_bill과 size에 대해 주어집니다. 예: tip = 0.67 + 0.09total_bill + 0.19size.
- r²가 단일 변수 모델과 동일하게 나올 수 있습니다(중복 정보 또는 상관성 때문).
추가 고려사항:
- 다중공선성(Multicollinearity): 독립변수들끼리 강하게 상관되어 있으면 계수의 분산이 커집니다. VIF(분산팽창요인)를 확인하세요.
- 변수 선택(Feature selection): 불필요한 변수를 줄이면 과적합을 줄이고 해석성을 높입니다(전진선택, 후진소거, LASSO 등).
- 정규화(Regularization): Ridge나 Lasso로 계수 크기를 제어하면 예측 성능과 일반화 능력이 향상될 수 있습니다.
역할별 체크리스트(데이터 수명주기 관점):
- 데이터 수집자: 입력 데이터 품질(결측, 스케일, 단위)을 점검합니다.
- 데이터 분석가: EDA(탐색적 데이터 분석) → 변수 변환(로그, 표준화) → 상관분석을 수행합니다.
- ML 엔지니어: 모델 검증(교차검증), 배포 전 안정성 테스트를 수행합니다.
비선형 회귀: 곡선 맞추기
설명: 데이터가 직선으로 설명되지 않을 때 비선형 모델(예: 다항식)을 사용해 곡선을 맞춥니다. 여기서는 2차 다항식(포물선)을 예로 들어 설명합니다.
데이터 생성 예제(NumPy를 사용):
import numpy as np
import pandas as pd
# x를 -100부터 100까지 1000개 점으로 생성
x = np.linspace(-100,100,1000)
# 2차 방정식으로 y 생성
y = 4*x**2 + 2*x + 3
df = pd.DataFrame({'x':x,'y':y})
df.head()
산점도를 확인하면 전형적인 포물선 모양이 보입니다:
sns.relplot(x='x',y='y',data=df)
Seaborn의 regplot에는 order 옵션이 있어 다항식 차수를 지정할 수 있습니다. 2차로 지정하면 포물선이 맞춰집니다:
sns.regplot(x='x',y='y',order=2,data=df)
수학적으로는 x² 항을 추가해 선형 회귀 형태로 풀 수도 있습니다(설계 행렬에 x^2 컬럼 추가).
df['x2'] = df['x']**2
pg.linear_regression(df[['x','x2']],df['y']).round(2)
참고: 인공적으로 만든 데이터이므로 r²가 1로 완벽하게 맞아떨어질 수 있지만, 실제 데이터에서는 노이즈와 측정오차 때문에 r²가 1이 되는 경우는 거의 없습니다.
대안:
- 고차 다항식은 과적합되기 쉽습니다. 스플라인(Splines), 로컬 회귀(LOESS), GAM이 더 부드럽고 안정적인 적합을 제공합니다.
- 비선형성의 원인이 변수 상호작용이면 상호작용 항을 명시적으로 추가하세요.
테스트 및 수용 기준:
- 모델이 적합 후 잔차가 랜덤하게 분포하는가?
- 과적합 여부를 교차검증으로 판단할 때 훈련/검증 성능 차이가 크지 않은가?
로지스틱 회귀: 이진 결과 모델링
설명: 종속변수가 이진(예/아니오, 0/1)인 경우 로지스틱 회귀로 성공 확률을 모델링합니다. 출력은 확률(0~1)이며, 기준값(예: 0.5)을 넘으면 1로 예측합니다.
예제: Titanic 데이터에서 운임(fare)이 생존(survived)에 영향을 미치는지 시각화합니다.
titanic = sns.load_dataset('titanic')
titanic.head()
Seaborn의 lmplot은 logistic=True로 로지스틱 곡선을 그릴 수 있습니다:
sns.lmplot(x='fare',y='survived',logistic=True,data=titanic)
Pingouin의 logistic_regression을 사용하면 통계적 유의성(p-value)과 계수를 확인할 수 있습니다:
pg.logistic_regression(titanic['fare'],titanic['survived']).round(2)
해석 포인트:
- p값(pval)은 귀무가설(해당 독립변수가 예측에 기여하지 않는다)을 기각할지 말지를 판단합니다. 예시에서 p값이 0.0으로 표기되면 강한 예측력을 시사합니다(실제 값은 포맷팅 때문에 0.00으로 출력될 수 있음).
- 회귀 계수의 부호는 독립변수가 생존 확률에 미치는 방향을 알려줍니다(양수 → 확률 증가, 음수 → 확률 감소).
대체 모델 및 보완:
- 비선형성이 크거나 변수 상호작용이 복잡하면 결정트리, 랜덤포레스트, 부스팅계열(예: XGBoost) 같은 비선형 모델을 고려하십시오.
- 클래스 불균형(예: 1/0 비율이 매우 치우침)에서는 재표본화(oversampling/undersampling), 클래스 가중치 조정, 평가 지표(정밀도/재현율/F1)를 사용하세요.
검증 지표:
- 정확도(accuracy) 외에 AUC-ROC, 정밀도(precision), 재현율(recall), F1 점수를 참고하세요.
모델 진단과 실무 팁
회귀 모델을 신뢰할 수 있게 만들려면 다음 절차를 권장합니다(짧은 SOP):
- 데이터 준비: 결측 처리, 단위 통일, 이상치 탐지.
- EDA: 산점도, 상관행렬, 그룹별 통계, 상호작용 시각화.
- 피처 엔지니어링: 로그 변환, 표준화, 다항 항 생성 등.
- 모델링: 단순→다중→비선형 순으로 실험.
- 검증: 교차검증, 잔차 분석, 안정성 테스트.
- 문서화 및 배포: 모델 가정, 성능, 제한사항을 명확히 기록.
진단 체크리스트(요약):
- 잔차의 랜덤성 확인
- 정규성 및 등분산성 확인
- 다중공선성(VIF) 확인
- 이상치 및 영향점 확인
- 교차검증으로 일반화 능력 점검
위험과 완화책(리스크 매트릭스 요약):
- 이상치: 강건 회귀 또는 제거/대체
- 과적합: 규제(Regularization), 교차검증, 모델 단순화
- 데이터 편향: 표본 재수집 또는 가중치 부여
의사결정 도표: 어떤 회귀를 선택할까
아래 Mermeid 흐름도는 간단한 판단 기준입니다.
flowchart TD
A[종속변수 유형 확인] --> B{이진인가?}
B -- 예 --> C[로지스틱 회귀]
B -- 아니오 --> D{관계가 선형으로 보이는가?}
D -- 예 --> E[선형/다중 회귀]
D -- 아니오 --> F{대략적인 곡선인가?}
F -- 예 --> G[다항 회귀 / 스플라인 / GAM]
F -- 아니오 --> H[비모수 또는 머신러닝 모델'랜덤포레스트 등' 고려]
C --> I[불균형? -> 클래스 가중치/재표본화]
E --> J[다중공선성? -> VIF 확인, 정규화]
실무용 체크리스트 및 템플릿
간단한 실무 템플릿(모델 보고서에 포함할 내용):
- 데이터 요약: 샘플 수, 결측값, 주요 변수 통계
- 모델 종류 및 하이퍼파라미터
- 훈련/검증 성능(교차검증 결과)
- 잔차 진단(플롯 포함)
- 주요 계수와 해석
- 제한사항 및 권장 후속 작업
역할별 체크리스트(요약):
- 데이터 분석가: EDA, 변수 변환, 시각화, 기초 모델
- 데이터 엔지니어: 데이터 파이프라인, 스케일링, 재현성 보장
- ML 엔지니어: 배포 가능한 모델 포맷, 입력 검증, 모니터링
짧은 용어집 (한 줄 요약)
- 독립변수: 설명 변수, 예측에 사용되는 입력
- 종속변수: 목표 변수, 예측하려는 출력
- r²: 결정계수, 모델이 설명하는 분산 비율
- 잔차: 예측값과 실제값의 차이
- VIF: 다중공선성 평가 지표
반례와 한계(언제 조심해야 하는가)
- 인과관계가 아닌 상관관계: 회귀분석은 상관관계와 예측에는 강하지만 인과관계를 증명하지 않습니다. 실험설계 또는 도구변수(Instrumental variables)가 필요할 수 있습니다.
- 측정오차: 독립변수의 측정오차는 계수를 편향시킬 수 있습니다.
- 시간의존성: 시계열 데이터에서는 자기상관을 고려하지 않은 회귀는 잘못된 결론을 낳습니다.
추가 접근법(대안)
- 규제 기반 모델: Ridge, Lasso는 과적합을 억제합니다.
- 트리 기반 모델: 비선형 관계와 변수 상호작용을 자동으로 처리합니다.
- 베이지안 회귀: 불확실성을 정량화하고 사전 지식을 통합할 수 있습니다.
연습 문제(실습 과제)
- tips 데이터셋에서 성별(sex)이 팁에 미치는 영향을 total_bill을 통제한 상태로 분석하세요. 결과를 해석하고 p값을 확인하세요.
- titanic 데이터에서 age도 포함하여 fare와 age가 생존에 미치는 영향을 다변량 로지스틱 회귀로 분석하고 변수 중요도를 설명하세요.
- 인공적인 잡음을 추가한 후(예: y에 작은 난수를 더함) 2차 다항 회귀를 적합하고 r²가 어떻게 변하는지 관찰하세요.
실행 예시(첫 연습문제):
# 예시 코드
pg.linear_regression(tips[['total_bill','size']],tips['tip']).round(2)
결론 요약
파이썬은 회귀분석을 빠르고 반복 가능하게 해주는 훌륭한 도구입니다. Seaborn은 탐색적 시각화에, Pingouin은 간단한 통계 분석에 유용합니다. 모델을 적용할 때는 항상 가정(선형성, 정규성, 등분산성 등)을 점검하고, 이상치·다중공선성·과적합에 유의하세요. 필요한 경우 강건한 방법이나 비선형 모델로 전환하는 유연성이 중요합니다.
중요: 회귀모델의 출력은 해석과 함께 비즈니스 맥락에 맞게 사용해야 합니다. 예측 모델이 실제 의사결정에 사용될 때는 배포 후 모니터링과 재평가가 필수입니다.
요약(핵심 포인트):
- 선형 회귀는 단순하고 해석이 쉬움.
- 다중 회귀는 여러 요인을 동시에 고려하지만 다중공선성에 주의.
- 비선형 회귀는 곡선적 관계를 포착하지만 과적합을 조심.
- 로지스틱 회귀는 이진 결과를 확률로 모델링.
추가 리소스: Seaborn과 Pingouin 공식문서, 통계 교재의 회귀분석 장, 그리고 교차검증과 모델 선택 관련 자료를 참고하세요.