1. 다중회귀분석의 이해 및 실습
1. 다중회귀분석 개요
- 정의: 독립변수가 2개 이상일 때, 여러 변수가 종속변수에 동시에 미치는 영향을 분석하는 방법
- 활용 예시
- 근무경력 + 교육수준 → 월수입
- 광고비 + 제품가격 → 매출액
- 단순회귀와의 차이
- 단순회귀: 독립변수 1개
- 다중회귀: 독립변수 2개 이상
2. 다중회귀모형식
$$ \hat{Y} = a + b_1X_1 + b_2X_2 + ... + b_kX_k $$
- $a$ (절편): 모든 독립변수가 0일 때 Y 값
- $b_i$ (기울기): $X_i$가 한 단위 증가할 때, 다른 변수를 고정했을 때 Y의 변화량
- 예시 해석: “근무경력을 1년 늘리면, 교육수준이 동일할 때 월수입은 평균적으로 b₁만큼 증가한다.”
3. 다중공선성 (Multicollinearity)
- 정의: 독립변수들 사이의 상관관계가 매우 높은 경우
- 문제점: 회귀계수 추정이 불안정해지고, 해석이 왜곡될 수 있음
- 판단 기준: VIF(분산팽창계수)
- VIF ≥ 10 → 다중공선성 문제 가능
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.987 → 근무경력과 교육수준이 월수입 변동의 98.7% 설명
- F-검정(p-value): 0.05 미만 → 모형 전체가 유의함
- t-검정(p-value): 각 변수의 회귀계수가 유의한지 확인
- VIF: 10 이상이면 다중공선성 문제 → 이 경우 변수 선택, 변수 변환, 표본 확장 등의 대안 필요
✅ 정리 & 토론
- 다중회귀는 여러 요인 동시에 고려 가능 → 현실 문제에 더 적합
- 그러나 다중공선성에 주의해야 함
- 토론 질문
- 만약 “근무경력”과 “연령”을 함께 넣으면 어떤 문제가 생길까?
- $R^2$이 너무 높을 때(예: 0.99 이상) 반드시 좋은 모형이라고 할 수 있을까?
2. 더미변수를 이용한 회귀분석 실습
1. 더미변수 개요
- 정의: 회귀분석은 숫자형 변수만 다룰 수 있기 때문에, 명목형(범주형) 변수는 0과 1로 변환해야 함
- 이렇게 변환한 변수를 더미변수(Dummy Variable)라고 함
- 규칙
- 범주 개수 = $m$ → 더미변수 개수 = $m-1$
- 제외된 범주 = 기준집단(Reference Group)
- 예시 (성별)
- 성별이 두 집단(남성, 여성)일 경우 → 1개의 더미변수만 필요
- 남성 = 0, 여성 = 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. 결과 해석
- 성별_여성 coef = -10.51
- 근무경력과 교육수준이 동일할 때, 여성의 월수입이 남성보다 평균 10.51만 원 낮음
- 성별_여성 P>|t| = 0.05 이상
- 성별 차이가 통계적으로 유의하지 않음
- 즉, 이 표본에서는 성별 차이가 있다고 단정하기 어려움
4. 정리 & 토론
- 정리
- 더미변수는 범주형 변수를 회귀분석에 포함시키는 필수 도구
- 해석은 기준집단과 비교하는 방식으로 이해
- p-value를 통해 차이가 통계적으로 유의한지 확인 필요
- 토론 질문
- 만약 성별 대신 “지역(서울, 부산, 대구)”을 추가한다면 몇 개의 더미변수가 필요할까?
- 성별 변수가 유의하지 않게 나온 이유는 무엇일까? (표본 크기, 데이터 특성 등)
3. 비선형회귀분석 실습
1. 비선형 관계 개요
- 정의: X와 Y가 직선(선형)으로 설명되지 않는 경우
- 예시
- 소득이 증가할수록 만족도는 증가하지만, 증가율은 점점 줄어듦 (체감효과)
- 광고비가 늘수록 매출은 늘지만 일정 수준 이후 효과가 둔화
👉 이런 경우 로그 변환을 활용하면 관계를 직선 형태로 바꿀 수 있음
2. 변수 변환: 로그(log) 변환
- 로그 변환의 장점
- 곡선 관계를 직선에 가깝게 만듦
- 해석이 “퍼센트 변화”로 직관적
- 회귀계수 해석 (로그 변환된 종속변수)
- $Y = \ln(\text{월수입})$
- 독립변수 1 단위 증가 → 종속변수는 $100 \times b$% 변화
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. 결과 해석
- `근무경력 coef = 0.0210`
- → 근무경력이 1년 늘어날 때 월수입이 약 2.1% 증가
- `교육수준 coef`도 비슷하게 학력 1년 증가 → 월수입 % 변화로 해석 가능
- 로그 변환을 통해 비선형 관계를 선형화하여 더 직관적이고 현실적인 해석 가능
✅ 정리
- 비선형 회귀분석: 단순 선형회귀로 설명되지 않는 경우, 변수 변환(특히 로그)을 통해 해결 가능
- 로그 변환된 모형의 계수 해석: → 퍼센트 변화로 해석
- 실무 활용 예시: 임금 함수, 수요 함수, 광고효과 분석 등
📘 비선형회귀 확장 실습
1. 로그-로그 모형 (Log-Log Model)
(1) 개념
- 독립변수와 종속변수 모두 로그 변환
- 모형식: $$ \ln(Y) = a + b \ln(X) + \epsilon $$
- 해석: 기울기 $b$는 탄력성(Elasticity) 의미
- X가 1% 증가 → Y가 b% 변함
(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) 결과 해석
- `log_근무경력 coef = 0.35`라면 → 근무경력이 1% 늘어날 때 월수입이 평균적으로 0.35% 증가
- 탄력성을 바로 읽을 수 있어 경제학/경영학 연구에서 자주 활용
2. 다항회귀분석 (Polynomial Regression)
(1) 개념
- 변수와 종속변수의 관계가 곡선 형태일 때, 독립변수의 제곱항($X^2$), 세제곱항($X^3$) 등을 추가
- 모형식: $$ Y = a + b_1X + b_2X^2 + \epsilon $$
- 해석: $b_1, b_2$ 계수 부호를 보고 곡선(포물선)의 방향 해석
(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) 결과 해석
- `근무경력 coef = 양수, 근무경력_sq coef = 음수` → 근무경력 초기에는 소득이 증가하지만, 일정 시점 이후 증가율 둔화 (체감 효과)
- 실제 노동경제학에서 “경력-임금 곡선” 분석 시 자주 활용
✅ 확장 수업 정리
- 로그 변환 모형
- Y 로그 변환 → 변화율(%) 해석
- X 로그 변환까지 하면 → 탄력성 해석
- 다항회귀 모형
- 독립변수에 제곱항/세제곱항 포함 → 곡선 관계 설명
- 특히 “체감 효과”나 “포화 효과” 설명에 유용
- 토론 질문
- 임금 데이터에서 “연령” 변수를 로그 변환 vs 제곱항 추가 → 어느 쪽이 더 적합할까?
- 로그-로그 모형에서 탄력성이 1보다 크면 어떤 의미일까?
- 다항회귀에서 제곱항까지 넣으면 항상 더 좋은 모형일까? (과적합 문제 고려)
4. 질의응답 및 요약
1. 최종 정리
- 오늘 다룬 세 가지 분석 방법
- 다중회귀분석
- 독립변수 여러 개 → 종속변수에 동시에 미치는 영향 분석
- Python: `sm.OLS(y, X).fit()`
- 확인 포인트: $R^2$, F-검정, 각 변수의 p-값
- 더미변수 회귀분석
- 범주형 변수를 0/1 값으로 변환 → 기준집단과 비교 가능
- Python: `pd.get_dummies(df, drop_first=True)`
- 해석: 더미변수 계수 = 기준집단 대비 차이
- 비선형회귀분석 (로그 변환, 다항회귀 등)
- 로그 변환: 관계를 선형화, 계수는 % 변화로 해석
- 다항항 추가: 곡선 관계 설명, 체감·포화 효과 반영
- Python:
- 로그 변환: `np.log()`
- 다항항: `df['X_sq'] = df['X']2`
- 다중회귀분석
2. 학습 포인트 요약
- $R^2$: 모형 설명력
- F-검정: 모형 전체 유의성
- t-검정: 개별 변수 유의성
- VIF: 다중공선성 진단
- 더미변수: 기준집단 대비 차이 해석
- 로그계수: % 변화 해석
3. 질의응답
- 예상 질문 예시:
- 더미변수가 여러 개인 경우 해석은 어떻게 하나요?
- 로그 변환 대신 다른 방법(루트, 제곱 등)도 쓰나요?
- $R^2$ 값이 너무 높으면(예: 0.99 이상) 무조건 좋은 건가요?