2025년 2학기 계량분석 강의 계획

12주차: 다중회귀분석

1. 다중회귀분석의 이해 및 실습


1. 다중회귀분석 개요


2. 다중회귀모형식

$$ \hat{Y} = a + b_1X_1 + b_2X_2 + ... + b_kX_k $$


3. 다중공선성 (Multicollinearity)


4. Python 실습

import pandas as pd
import statsmodels.api as sm
from statsmodels.stats.outliers_influence import variance_inflation_factor

# 1. 데이터 생성 (가상 데이터)
data = {
    '월수입': [350, 420, 550, 600, 750, 400, 580, 850],
    '근무경력': [3, 5, 8, 10, 15, 4, 7, 20],
    '교육수준': [12, 14, 16, 16, 18, 12, 14, 18]  # 학력: 12=고졸, 14=전문대졸, 16=대졸, 18=대학원
}
df = pd.DataFrame(data)

# 2. 다중회귀분석
X = sm.add_constant(df[['근무경력', '교육수준']])
y = df['월수입']
model = sm.OLS(y, X).fit()
print(model.summary())

# 3. 다중공선성 확인 (VIF)
vif = pd.DataFrame()
vif["VIF Factor"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]
vif["features"] = X.columns
print("\n--- 다중공선성 (VIF) 결과 ---")
print(vif)

5. 결과 해석

✅ 정리 & 토론

  • 다중회귀는 여러 요인 동시에 고려 가능 → 현실 문제에 더 적합
  • 그러나 다중공선성에 주의해야 함
  • 토론 질문
    • 만약 “근무경력”과 “연령”을 함께 넣으면 어떤 문제가 생길까?
    • $R^2$이 너무 높을 때(예: 0.99 이상) 반드시 좋은 모형이라고 할 수 있을까?

2. 더미변수를 이용한 회귀분석 실습


1. 더미변수 개요


2. Python 실습

import pandas as pd
import statsmodels.api as sm

# 1. 기존 데이터 (근무경력, 교육수준, 월수입)
data = {
    '월수입': [350, 420, 550, 600, 750, 400, 580, 850],
    '근무경력': [3, 5, 8, 10, 15, 4, 7, 20],
    '교육수준': [12, 14, 16, 16, 18, 12, 14, 18] # 12=고졸, 14=전문대졸, 16=대졸, 18=대학원졸
}
df = pd.DataFrame(data)

# 2. 성별 변수 추가
df['성별'] = ['남성', '여성', '남성', '여성', '남성', '여성', '남성', '여성']

# 3. 더미변수 생성 (남성=기준집단)
df_dummies = pd.get_dummies(df, columns=['성별'], drop_first=True)

# 4. 회귀모형 구성
X_multi = sm.add_constant(df_dummies[['근무경력', '교육수준', '성별_여성']])
y_multi = df_dummies['월수입']

# 5. 회귀분석 실행
model_multi = sm.OLS(y_multi, X_multi).fit()
print("\n--- 더미변수 포함 회귀분석 결과 ---")
print(model_multi.summary())

3. 결과 해석


4. 정리 & 토론

3. 비선형회귀분석 실습


1. 비선형 관계 개요

👉 이런 경우 로그 변환을 활용하면 관계를 직선 형태로 바꿀 수 있음


2. 변수 변환: 로그(log) 변환


3. Python 실습

import numpy as np
import statsmodels.api as sm

# 1. 종속변수 '월수입'에 로그 변환 적용
df['log_월수입'] = np.log(df['월수입'])

# 2. 로그 변환된 종속변수로 회귀분석 수행
X_log = sm.add_constant(df[['근무경력', '교육수준']])
y_log = df['log_월수입']

model_log = sm.OLS(y_log, X_log).fit()
print("\n--- 로그 변환된 종속변수 회귀분석 결과 ---")
print(model_log.summary())

4. 결과 해석

✅ 정리

  • 비선형 회귀분석: 단순 선형회귀로 설명되지 않는 경우, 변수 변환(특히 로그)을 통해 해결 가능
  • 로그 변환된 모형의 계수 해석: → 퍼센트 변화로 해석
  • 실무 활용 예시: 임금 함수, 수요 함수, 광고효과 분석 등

📘 비선형회귀 확장 실습


1. 로그-로그 모형 (Log-Log Model)

(1) 개념


(2) Python 실습

# 로그-로그 모형: 근무경력과 월수입 관계
df['log_근무경력'] = np.log(df['근무경력'])
df['log_월수입'] = np.log(df['월수입'])

X_loglog = sm.add_constant(df[['log_근무경력', '교육수준']])  # 교육수준은 그대로 사용
y_loglog = df['log_월수입']

model_loglog = sm.OLS(y_loglog, X_loglog).fit()
print("\n--- 로그-로그 모형 회귀 결과 ---")
print(model_loglog.summary())

(3) 결과 해석


2. 다항회귀분석 (Polynomial Regression)

(1) 개념


(2) Python 실습

# 근무경력의 제곱항 추가
df['근무경력_sq'] = df['근무경력']  2

X_poly = sm.add_constant(df[['근무경력', '근무경력_sq', '교육수준']])
y_poly = df['월수입']

model_poly = sm.OLS(y_poly, X_poly).fit()
print("\n--- 다항회귀 결과 ---")
print(model_poly.summary())

(3) 결과 해석

✅ 확장 수업 정리

  • 로그 변환 모형
    • Y 로그 변환 → 변화율(%) 해석
    • X 로그 변환까지 하면 → 탄력성 해석
  • 다항회귀 모형
    • 독립변수에 제곱항/세제곱항 포함 → 곡선 관계 설명
    • 특히 “체감 효과”나 “포화 효과” 설명에 유용
  • 토론 질문
    • 임금 데이터에서 “연령” 변수를 로그 변환 vs 제곱항 추가 → 어느 쪽이 더 적합할까?
    • 로그-로그 모형에서 탄력성이 1보다 크면 어떤 의미일까?
    • 다항회귀에서 제곱항까지 넣으면 항상 더 좋은 모형일까? (과적합 문제 고려)

4. 질의응답 및 요약


1. 최종 정리


2. 학습 포인트 요약


3. 질의응답