선형회귀분석은 **연속형 종속변수(Y)**와 한 개 이상의 독립변수(X) 사이의 관계를 모델링하는 가장 기본적이고 널리 쓰이는 통계·머신러닝 기법입니다.
1. 개요
1.
기본 개념
•
선형회귀는 독립변수(예측변수) 가 종속변수(결과변수) 에 미치는 영향을 직선(또는 초평면) 형태로 모델링하는 기법입니다.
X1,X2,…,XkX_1, X_2, \dots, X_k
YY
•
예: “공부 시간(X)이 시험 점수(Y)에 미치는 영향,” “광고비(X)가 판매량(Y)에 미치는 영향” 등.
2.
단순회귀 vs 다중회귀
•
단순회귀(Simple Regression): 독립변수가 1개 →
Y=β0+β1X1+εY = \beta_0 + \beta_1 X_1 + \varepsilon
•
다중회귀(Multiple Regression): 독립변수가 2개 이상 →
Y=β0+β1X1+β2X2+⋯+βkXk+εY = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \cdots + \beta_k X_k + \varepsilon
3.
결과 해석
•
βi\beta_i는 독립변수 가 1 단위 증가할 때, 종속변수 YY가 평균적으로 얼마나 변하는지를 나타냄(다른 변수 일정할 때).
XiX_i
•
β0\beta_0는 X=0일 때 Y의 예상값(절편).
2. 주요 가정(전제조건)
선형회귀분석은 **최소제곱법(OLS)**을 사용할 때, 다음과 같은 가정이 충족된다는 전제를 둡니다:
1.
선형성(Lineaity)
•
독립변수(X)와 종속변수(Y) 사이가 선형적 관계를 가져야 함(잔차플롯으로 확인).
2.
독립성(Independence)
•
오차(잔차)들은 서로 독립적(자기상관이 없어야 함; 시계열 데이터인 경우 Durbin-Watson 검사 등).
3.
등분산성(Homoscedasticity)
•
모든 X에 대해 잔차의 분산이 동일해야 함(잔차도표에서 패턴이 없어야 함).
4.
정규성(Normality)
•
잔차(오차항)가 정규분포를 따른다고 가정(잔차 히스토그램, Q-Q plot 등 확인).
5.
다중공선성(Multicollinearity) 최소
•
독립변수들 간 상관관계가 매우 높으면(이 크면) 계수 추정 불안정 → VIF(Variance Inflation Factor)로 점검.
∣r∣|r|
만약 이 가정들이 크게 위배되면, 회귀 계수의 추정·해석에 문제가 발생할 수 있습니다. 필요에 따라 변환(로그 변환 등), 다른 모형 선택, 이상치 제거, 강건회귀(Robust regression) 등을 고려합니다.
3. 수학적 배경
3.1 최소제곱법(Ordinary Least Squares, OLS)
•
목표: 실제 종속변수 와 예측값 간 오차제곱합(Sum of Squared Errors, SSE)을 최소화하는 계수를 찾음
yiy_i
y^i\hat{y}_i
β\beta
SSE=∑i=1n(yi−y^i)2,y^i=β0+β1xi1+⋯+βkxik\text{SSE} = \sum_{i=1}^{n}(y_i - \hat{y}_i)^2
\quad,\quad
\hat{y}_i = \beta_0 + \beta_1 x_{i1} + \cdots + \beta_k x_{ik}
•
미분을 통해 해를 구하면, 행렬식으로는
β\beta
=(XTX)−1XTy\boldsymbol{\hat{\beta}} = (X^T X)^{-1} X^T y
(X는 독립변수 행렬, y는 종속변수 벡터)
3.2 결정계수(R2R^2)와 분산분석(ANOVA)
•
결정계수(R2R^2): 모델이 종속변수의 변동을 얼마나 설명하는지(0~1 사이)
R2=1−SSESST,SST=∑(yi−yˉ)2R^2 = 1 - \frac{\text{SSE}}{\text{SST}}
\quad,\quad \text{SST} = \sum (y_i - \bar{y})^2
•
F-검정: 전체 회귀모형 유의성 검정
F=SSR/kSSE/(n−k−1),SSR=∑(y^i−yˉ)2F = \frac{\text{SSR}/k}{\text{SSE}/(n-k-1)}
\quad,\quad \text{SSR} = \sum (\hat{y}_i - \bar{y})^2
◦
SSR(회귀제곱합) / SSE(잔차제곱합) / SST(총제곱합)의 관계
4. 실행 절차
1.
데이터 준비
•
종속변수(Y)와 독립변수(X) 정리
•
범주형 변수(명목형)는 더미변수(One-hot Encoding) 처리 필요
2.
데이터 탐색/시각화
•
X-Y 산점도, 상관분석, 이상치 탐색
3.
모형 적합(회귀분석 수행)
•
최소제곱법(OLS)으로 추정
β\beta
4.
가정검토
•
잔차도표(등분산성, 선형성), 잔차정규성(Q-Q plot), Durbin-Watson(독립성), VIF(다중공선성) 등
5.
모델 평가
•
결정계수(), 수정된 , 유의성 검정(F-test, t-test), AIC/BIC 등
R2R^2
R2R^2
6.
해석 & 보고
•
β\beta 계수의 크기, 방향(+, -), 유의성, 신뢰구간 제시
•
예측 모델로도 활용 시, RMSE, MAE, 교차검증 등 성능평가 가능
5. Python 예시 코드
아래 예시는 단순 선형회귀와 다중 선형회귀를 각각 실행하는 간단한 데모입니다.
•
statsmodels → **통계적 해석(t-값, p-값, 신뢰구간, ANOVA표 등)**에 유리
•
sklearn → 예측 성능, 머신러닝 파이프라인에 편리
5.1 단순선형회귀 예시
import numpy as np
import pandas as pd
import statsmodels.api as sm
import statsmodels.formula.api as smf
import matplotlib.pyplot as plt
# -------------------------------------------------
# 1) 예시 데이터 생성
# -------------------------------------------------
np.random.seed(42)
N = 50
X = np.linspace(0, 10, N) # 0부터 10까지 고르게 분포
true_beta0 = 5.0 # 실제 절편
true_beta1 = 2.0 # 실제 기울기
noise = np.random.normal(0, 2, N) # 평균=0, 표준편차=2인 오차
Y = true_beta0 + true_beta1 * X + noise
df = pd.DataFrame({'X': X, 'Y': Y})
# -------------------------------------------------
# 2) 단순선형회귀 (StatsModels)
# -------------------------------------------------
model = smf.ols('Y ~ X', data=df).fit() # Y=β0 + β1*X
print(model.summary())
# -------------------------------------------------
# 3) 예측 결과 시각화
# -------------------------------------------------
df['Y_pred'] = model.predict(df[['X']])
plt.scatter(df['X'], df['Y'], label='Observed', color='blue')
plt.plot(df['X'], df['Y_pred'], label='Fitted line', color='red')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()
Python
복사
결과 해석
1.
회귀계수(Intercept, X)
•
coef 테이블에서 Intercept가 절편 , X가 기울기 .
β0\beta_0
β1\beta_1
•
t-검정 및 p-value로 유의성 확인.
2.
결정계수(R-squared)
•
모델이 Y의 변동을 얼마나 설명하는지 지표.
5.2 다중선형회귀 예시
import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# -------------------------------------------------
# 1) 예시 데이터 생성 (X1, X2 -> Y)
# -------------------------------------------------
np.random.seed(123)
N = 100
X1 = np.random.normal(10, 5, N) # 평균=10, 표준편차=5
X2 = np.random.normal(50, 10, N) # 평균=50, 표준편차=10
true_beta0 = 3.0
true_beta1 = 1.5
true_beta2 = 0.5
noise = np.random.normal(0, 5, N) # 오차
Y = true_beta0 + true_beta1 * X1 + true_beta2 * X2 + noise
df_multi = pd.DataFrame({'X1': X1, 'X2': X2, 'Y': Y})
# -------------------------------------------------
# 2) StatsModels를 이용한 다중회귀
# -------------------------------------------------
model_multi = smf.ols('Y ~ X1 + X2', data=df_multi).fit()
print(model_multi.summary())
# -------------------------------------------------
# 3) Scikit-Learn을 이용한 다중회귀
# -------------------------------------------------
X_features = df_multi[['X1', 'X2']]
y_target = df_multi['Y']
lin_reg = LinearRegression()
lin_reg.fit(X_features, y_target)
y_pred = lin_reg.predict(X_features)
mse = mean_squared_error(y_target, y_pred)
rmse = np.sqrt(mse)
print("\n[Scikit-Learn 결과]")
print(f"Intercept: {lin_reg.intercept_:.3f}")
print(f"Coef X1, X2: {lin_reg.coef_}")
print(f"RMSE: {rmse:.3f}")
Python
복사
결과 해석
1.
StatsModels
•
summary()에서 각 계수 , t-검정, p-값, 결정계수(R-squared), 수정된 R-squared, F-검정, AIC/BIC 등을 확인.
βi\beta_i
2.
Scikit-Learn
•
회귀계수는 .coef_ , 절편은 .intercept_로 접근
•
MSE, RMSE 등 예측 성능 평가 지표를 쉽게 계산
•
추가적으로 교차검증, 파이프라인, 하이퍼파라미터 튜닝 등에 확장하기 편리
6. 결과 해석 및 보고
1.
회귀계수
•
βi\beta_i가 양(+)이면 X가 증가할수록 Y도 증가(양의 상관), 음(-)이면 반대.
•
p-value가 유의수준(예: 0.05)보다 작으면, 해당 변수 효과가 통계적으로 유의.
2.
F-검정(모형 유의성)
•
전체 모델이 유의미한지 확인. p < 0.05 → “X들이 Y를 유의하게 설명한다”
3.
결정계수(R^2), 수정된 R^2
•
모델 설명력. 다중회귀에서는 수정된 R^2(Adjusted R^2)를 주로 봄(변수 개수에 대한 보정).
4.
잔차분석
•
잔차 vs 적합값(혹은 vs 독립변수) 플롯에서 패턴이 없어야 등분산성·선형성 확인
•
잔차 정규성(히스토그램, Q-Q plot)
•
Durbin-Watson(독립성), VIF(공선성) 등
5.
해석 예
•
“X1이 1 단위 증가하면 Y가 평균적으로 만큼 증가한다(유의수준 0.05에서 통계적으로 유의).”
β1\beta_1
•
“R^2 = 0.85로, 이 모델은 Y 변동의 약 85%를 설명한다.”
7. 한계 및 주의사항
1.
가정 위배 시 해석 문제
•
이상치가 많거나, 비선형 관계가 강하면 OLS 추정 왜곡
•
변환(로그, 제곱 등)이나 다른 모델(비선형회귀, GAM, 랜덤포레스트 등) 고려
2.
설명 vs 예측
•
통계 분석(설명) 목적인지, 머신러닝(예측) 목적인지에 따라 평가 지표, 교차검증, 정규화 등이 달라짐
3.
인과관계 한계
•
회귀분석이 상관관계를 잘 보여주지만, 인과관계는 연구설계(실험 등)가 보강되어야 확실히 주장 가능
4.
다중공선성
•
독립변수들 간 상관이 높으면 계수 해석 불안정(회귀계수 방향이 뒤집히거나 p-value가 이상해질 수 있음)
8. 요약
•
*선형회귀분석(Linear Regression)**은 연속형 종속변수를 독립변수의 선형 조합으로 설명·예측하는 가장 기초적인 통계/머신러닝 기법입니다.
•
기본 전제(선형성·독립성·등분산성·정규성)가 어느 정도 충족되어야 모델 추정값()과 해석이 유효합니다.
β\beta
•
결과 해석 시에는 회귀계수(크기·방향·유의성), 결정계수(R^2), 잔차분석 등을 종합적으로 확인해야 합니다.
•
Python에서는 statsmodels 라이브러리를 통해 통계적 해석(검정, 신뢰구간, ANOVA table)까지 상세히 볼 수 있고, **scikit-learn*을 사용하면 예측 성능 평가와 확장(교차검증, 파이프라인)에 용이합니다.
이러한 내용을 종합적으로 숙지하면, 실무나 연구에서 **“X변수가 Y를 얼마나 잘 설명하고, 예측 가능한지”**를 파악하기 위해 선형회귀분석을 효과적으로 적용할 수 있습니다.