1.1 단순 선형 회귀
1. 기본 개념
단순 선형 회귀(SLR) 모델은 다음과 같이 표현됩니다:
Y = β₀ + β₁X + ε
- Y: 종속 변수(목표 값)
- X: 독립 변수(설명 변수)
- β₀: 절편(X=0일 때 Y의 기댓값)
- β₁: 기울기(X 단위 변화당 Y의 변화량)
- ε: 오차 항(모델이 설명하지 못하는 변동성)
오차 항의 실제 예시
가구 소득(Y)과 교육 기간(X)의 관계를 연구할 때, 소득은 교육 기간 외에도 직업 유형, 경력, 지역 등 다양한 요인의 영향을 받습니다. 이러한 미포함 요인들은 오차 항 ε으로 표현됩니다.
2. 이론적 배경 및 구현
교육 기간과 가구 소득 데이터를 활용한 사례:
education = [10, 12, 8, 15, 16, 18, 20, 14, 15, 11, 15, 19, 20]
income = [40, 45, 32, 50, 55, 65, 75, 48, 50, 38, 52, 70, 80]
최소제곱법 원리
잔차 제곱합(RSS)을 최소화하여 최적의 회귀 계수를 찾습니다:
RSS = Σ(yᵢ - (m·xᵢ + b))²
기울기(m)와 절편(b)에 대한 편미분을 수행:
- ∂RSS/∂b = -2Σ(yᵢ - m·xᵢ - b) = 0
- ∂RSS/∂m = -2Σxᵢ(yᵢ - m·xᵢ - b) = 0
이를 정리하면:
m = Σ[(xᵢ - x̄)(yᵢ - ȳ)] / Σ(xᵢ - x̄)²
b = ȳ - m·x̄
3. 파이썬 구현
import numpy as np
import matplotlib.pyplot as plt
# 데이터 준비
edu_years = np.array([10, 12, 8, 15, 16, 18, 20, 14, 15, 11, 15, 19, 20])
family_income = np.array([40, 45, 32, 50, 55, 65, 75, 48, 50, 38, 52, 70, 80])
# 산점도 시각화
plt.figure(figsize=(8, 5), dpi=160)
plt.scatter(edu_years, family_income, color='navy')
plt.title('교육 기간 대 가구 소득')
plt.xlabel('교육 기간(년)')
plt.ylabel('가구 소득(천 달러)')
plt.grid(True)
plt.show()
# 회귀 계수 계산 함수
def calculate_coefficients(X, Y):
mean_X = np.mean(X)
mean_Y = np.mean(Y)
covar = np.sum((X - mean_X) * (Y - mean_Y))
var = np.sum((X - mean_X) ** 2)
slope = covar / var
intercept = mean_Y - slope * mean_X
return intercept, slope
# 모델 학습
intercept_val, slope_val = calculate_coefficients(edu_years, family_income)
# 예측값 계산
predicted = intercept_val + slope_val * edu_years
# 회귀선 시각화
plt.figure(figsize=(8, 5), dpi=160)
plt.scatter(edu_years, family_income, color='teal', label='실제 데이터')
plt.plot(edu_years, predicted, color='coral', label='회귀선')
plt.xlabel('교육 기간(년)')
plt.ylabel('가구 소득(천 달러)')
plt.title('단순 선형 회귀 모델')
plt.legend()
plt.show()
# 모델 평가
SSR = np.sum((predicted - np.mean(family_income)) ** 2)
SST = np.sum((family_income - np.mean(family_income)) ** 2)
R_sq = SSR / SST
print(f'회귀 방정식: Y = {intercept_val:.2f} + {slope_val:.2f}X')
print(f'결정 계수(R²): {R_sq:.4f}')