logo

다중회귀분석

다중 선형 회귀 모형의 도입 배경

  • 현실 세계의 현상은 단 하나의 요인, 즉 단순 선형 회귀만으로 완벽하게 설명하기 어려움
  • 여러 독립변수와 종속변수의 관계를 동시에 추정할 필요가 있음
  • 예: 선박의 무게를 예측하기 위해 길이, 폭, 속도 등 다양한 제원을 종합적으로 고려
    • 종속변수: 선박의 무게
    • 독립변수: 길이, 폭, 속도 등

다중 선형 회귀 모형

  • 다중 선형 회귀 모형은 단순 선형 회귀를 확장하여 2개 이상의 독립변수를 포함하는 모형
Y=β0+β1X1+β2X2++βkXk+ϵ
  • Y: 종속변수
  • X1,X2,: 독립변수
  • β1,β2,: 각 독립변수에 해당하는 회귀계수, 즉 편회귀계수
  • β0: y절편
  • ϵ: 오차항

통계적 통제

  • 특정 회귀계수 βi는 다른 변수가 일정하다고 가정하여 해석
  • 다른 변수가 같을 때 Xi가 1단위 증가하면 예측되는 Y의 평균 변화량
  • 관찰 자료의 통계적 통제만으로 인과관계가 성립하지는 않음
  • 실험적 통제
    • 실제로 다른 변수를 고정
  • 통계적 통제
    • 일정한 가정 하에 다른 변수가 고정되었을 때의 결과를 추정

파이썬 실습: 다중 선형 회귀 모형 적합

  • statsmodels의 수식 기반 방식(formula.api) 활용
  • ~ 기호 우측에 여러 독립변수를 + 기호로 나열하여 다중 회귀식을 구성
from statsmodels.formula.api import ols
import pandas as pd

df_ship = pd.read_excel("ship.xlsx")

ols("weight ~ length + beam", data=df_ship).fit().summary()
  • R2: 0.497
  • 수정 R2: 0.486
  • length: -109.6387, p-value 0.079
  • beam: 1715.6569, p-value < 0.001

speed를 추가한 모형을 적합.

ols("weight ~ length + beam + speed", data=df_ship).fit().summary()
  • R2: 0.514
  • 수정 R2: 0.499
  • length: -99.2415, p-value 0.108
  • beam: 1660.5702, p-value < 0.001
  • speed: -376.4271, p-value 0.067
  • 다른 변수를 통제했을 때 beam만 5% 유의수준에서 유의

독립변수 간 상관관계

df_ship[["length", "beam", "speed", "weight"]].corr()

lengthbeam의 상관계수는 0.960654. 두 변수가 비슷한 정보를 포함하여 다중공선성 가능성이 큼.

모델 결과 요약표 주요 항목

  • 일반 결정계수(R2)
    • 모델 자체의 설명력
    • 변수를 추가해도 감소하지 않음
    • 모델 간 비교에는 한계가 있음
  • 수정된 결정계수(Adjusted R2)
    • 변수의 개수가 불필요하게 늘어날 때 그만큼 패널티를 수식에 반영
    • 모델 간 비교에 사용
  • F-statistic, Prob(F-statistic)
    • 모든 기울기가 0이라는 귀무가설 검정
    • Prob(F-statistic)이 0.05보다 작으면 귀무가설 기각
  • coef
    • 각각 투입된 독립변수의 편회귀계수
    • 부호를 통해 직관적인 증감 패턴을 분석
  • P>|t|
    • 다른 변수를 통제했을 때 개별 회귀계수가 0인지 검정하는 p-value

표준화

  • 다중회귀분석에서 독립변수의 단위가 다르면 회귀계수 크기를 비교하기 어려움
  • 표준화를 하면 평균은 0, 표준편차는 1이 됨
표준편차X평균
  • 표준화를 통해 변수의 단위를 제거하여 회귀계수의 상대적 크기 비교 가능
  • scale 함수를 이용하여 표준화할 수 있음
model = ols(
    "weight ~ scale(length) + scale(beam) + scale(speed)",
    data=df_ship,
).fit()

model.summary()
  • scale(length): -4629.4848
  • scale(beam): 약 12210
  • scale(speed): -1471.9580
  • 절댓값이 가장 큰 표준화 계수는 beam

신규 선박 중량 예측

  • ship_predict.xlsx: 신규 선박 제원 정보
  • 모델 학습에 사용한 독립변수(length, beam, speed)가 포함되어 있어야 함
  • 학습된 다중 회귀 모델 model로 신규 데이터의 중량을 예측
  • 예측값은 학습 데이터의 관계를 기준으로 계산된 추정치
df_pred = pd.read_excel("ship_predict.xlsx")
df_pred["predicted_weight"] = model.predict(df_pred)

다중공선성

  • 다중공선성(Multicollinearity)은 다중 선형 회귀 모델 내부에서 독립변수들끼리 매우 강한 선형 상관관계를 띠는 현상
  • 서로 겹치는 정보가 많아 각 회귀계수를 분리하여 추정하기 어려워짐
  • 모델의 신뢰성 훼손, 추정치의 분산 팽창 등이 발생할 수 있음
  • 심한 경우 회귀계수의 부호가 논리와 정반대로 뒤집히기도 함
  • Variance Inflation Factor(VIF)
    • 특정 독립변수가 나머지 여러 독립변수들에 의해 어느 정도 설명되는지 측정하는 수치 지표
    • 특정 독립변수 Xi를 종속변수로 두고 나머지 X들로 회귀분석했을 때 산출된 Ri2를 이용
VIFi=1Ri21
  • 판단 기준
    • VIF가 1에 가까울수록 다중공선성이 없음
    • 실무적으로 VIF > 10이면 다중공선성 문제가 심각하다고 평가하고 변수 제외 등 조치를 고려

분산팽창지수 계산

import patsy
from statsmodels.stats.outliers_influence import variance_inflation_factor

design_matrix = patsy.dmatrix(
    " ~ length + beam + speed",
    df_ship,
    return_type="dataframe",
)

pd.DataFrame({
    "variable": design_matrix.columns[1:],
    "VIF": [
        variance_inflation_factor(design_matrix.values, i)
        for i in range(1, design_matrix.shape[1])
    ],
})
변수 VIF
length 13.07
beam 13.04
speed 1.01

lengthbeam의 VIF가 10보다 큼. length를 제외하고 다시 적합.

ols("weight ~ beam + speed", data=df_ship).fit().summary()
  • R2: 0.501
  • 수정 R2: 0.491
  • beam: 1056.1652, p-value < 0.001
  • speed: -406.5725, p-value 0.049

퀴즈

문제 1 / 8맞음: 0힌트: 0틀림: 0채점중: 0남음: 8

다중 선형 회귀 모형을 사용하는 주된 이유로 가장 적절한 것은?

  • 여러 독립변수와 종속변수의 관계를 동시에 추정하기 위해
  • 각 독립변수에 별도의 단순회귀만 적용하기 위해
  • 종속변수만 표준화하여 평균 차이를 검정하기 위해
  • 변수 추가만으로 인과관계를 입증하기 위해

퀴즈를 풀려면 대화형 기능을 불러와야 합니다.