비즈니스 문제를 해결하고 예측하는 데이터 사이언티스트가 되고 싶다면?
#인공지능 

선형회귀 분석의 기본 가정 (선형성, 독립성, 등분산성, 정규성)

선형회귀 분석의 네 가지 주요 가정인 선형성(Linearity), 독립성(Independence), 등분산성(Homoscedasticity), 그리고 정규성(Normality)을 자세히 알아봅시다.

2024-03-30 | 김태헌

선형회귀 분석은 데이터 분석 및 예측 모델링에서 가장 널리 사용되는 기법 중 하나입니다. 선형 회귀모델이 통계적으로 유의미하고 예측력을 갖기 위해서는 몇 가지 기본 가정을 만족해야 합니다. 본 글에서는 선형회귀 분석의 네 가지 주요 가정인 선형성(Linearity), 독립성(Independence), 등분산성(Homoscedasticity), 그리고 정규성(Normality)에 대해 파이썬 코드와 함께 자세히 살펴보겠습니다.

1. 선형성(Linearity)

선형성은 독립변수와 종속변수 간에 선형적인 관계가 있어야 함을 의미합니다. 선형회귀 분석에서 선형성이 만족되지 않으면 모델의 예측력이 떨어질 수 있습니다. 선형성은 산점도를 통해 시각적으로 확인할 수 있습니다.

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

# 데이터프레임 생성
data = pd.DataFrame({'x': [1, 2, 3, 4, 5], 
                     'y': [2, 4, 5, 4, 5]})

# 선형 회귀 모델 생성 및 학습
model = LinearRegression()
model.fit(data[['x']], data['y'])

# 회귀선 그리기
y_pred = model.predict(data[['x']])
plt.scatter(data['x'], data['y'])
plt.plot(data['x'], y_pred, color='red')
plt.show()

# 결과

결과 해석

  1. 산점도에서 데이터 포인트들이 일직선상에 완벽하게 놓여 있지는 않습니다. 이는 ‘x’와 ‘y’ 사이의 관계가 완벽한 선형은 아님을 의미합니다.
  2. 그러나 대체로 ‘x’가 증가함에 따라 ‘y’도 증가하는 경향을 보이므로, 어느 정도 선형적인 관계가 있다고 볼 수 있습니다.
  3. 빨간색 선은 선형 회귀 모델에 의해 예측된 회귀선입니다. 이 선은 데이터 포인트들의 경향성을 나타내며, ‘x’에 따른 ‘y’의 변화를 예측하는데 사용될 수 있습니다.

2. 독립성(Independence)

독립성은 관측치들 간에 상관관계가 없어야 함을 의미합니다. 이는 다중 선형회귀 분석에서 더욱 중요한데, 독립변수들 간에 높은 상관관계가 있으면 다중공선성(Multicollinearity) 문제가 발생할 수 있습니다. 이 경우 변수 선택법(Variable Selection)을 사용하여 문제를 해결할 수 있습니다.

from statsmodels.stats.outliers_influence import variance_inflation_factor
import numpy as np

# 무작위 데이터 생성
np.random.seed(2024)
data = pd.DataFrame({'x1': np.random.normal(0, 1, 50),
                     'x2': np.random.normal(0, 1, 50),
                     'x3': np.random.normal(0, 1, 50),
                     'x4': np.random.normal(0, 1, 50),
                     'y': np.random.normal(0, 1, 50)})

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

# 결과(예시)
VIF Factor features
0 1.016001 x1
1 1.265742 x2
2 1.086735 x3
3 1.158878 x4
4 1.167848 y

결과 해석

VIF (Variance Inflation Factor)는 다중 회귀 모델에서 독립 변수 간의 다중공선성을 측정하는 지표입니다. VIF 값이 1에 가까울수록 다중공선성이 없음을 의미하며, 일반적으로 VIF 값이 5 이상이면 해당 변수가 다른 변수와 높은 상관관계를 가지고 있어 다중공선성 문제가 있다고 판단합니다.

주어진 VIF 결과를 해석해보면 다음과 같습니다:

  1. x1의 VIF 값은 1.016001로, 다중공선성이 거의 없는 것으로 판단됩니다.
  2. x2의 VIF 값은 1.265742로, 약간의 다중공선성이 존재하지만 문제가 될 정도는 아닙니다.
  3. x3의 VIF 값은 1.086735로, 다중공선성이 거의 없는 것으로 판단됩니다.
  4. x4의 VIF 값은 1.158878로, 약간의 다중공선성이 존재하지만 문제가 될 정도는 아닙니다.
  5. y의 VIF 값은 1.167848로, 약간의 다중공선성이 존재하지만 문제가 될 정도는 아닙니다.

모든 변수의 VIF 값이 1에 가깝고, 5보다 훨씬 작으므로 이 데이터셋에서는 다중공선성 문제가 크지 않다고 볼 수 있습니다. 따라서 주어진 변수들을 그대로 사용하여 회귀 분석을 진행해도 무방할 것으로 판단됩니다.

3. 등분산성(Homoscedasticity)

등분산성은 잔차의 분산이 독립변수의 값에 상관없이 일정해야 함을 의미합니다. 등분산성이 만족되지 않으면 이분산성(Heteroscedasticity)이 나타나며, 이는 회귀계수의 표준오차에 영향을 미칩니다. 등분산성은 잔차 그래프를 통해 확인할 수 있습니다.

from sklearn.linear_model import LinearRegression
import pandas as pd
import matplotlib.pyplot as plt

# 데이터프레임 생성
data = pd.DataFrame({'x': [1, 2, 3, 4, 5], 'y': [2, 4, 8, 16, 32]})

# 선형 회귀 모델 생성 및 학습
model = LinearRegression()
model.fit(data[['x']], data['y'])

# 잔차 그래프 그리기
y_pred = model.predict(data[['x']])
residuals = data['y'] - y_pred
plt.scatter(data['x'], residuals)
plt.axhline(y=0, color='red', linestyle='-')
plt.xlabel('x')
plt.ylabel('Residuals')
plt.title('Residual Plot')
plt.show()

결과 해석

  1. 잔차는 실제 값과 모델의 예측값의 차이를 의미합니다. 잔차가 0에 가까울수록 모델의 예측이 정확하다는 것을 의미합니다.
  2. 그래프에서 빨간색 실선은 y=0을 나타내는 기준선입니다. 이 선을 중심으로 잔차들이 고르게 분포해야 이상적입니다.
  3. 그래프를 보면 ‘x’ 값이 증가함에 따라 잔차의 절대값이 점점 커지는 패턴을 확인할 수 있습니다. 이는 ‘x’ 값이 클수록 모델의 예측 오차가 커진다는 것을 의미합니다.
  4. 잔차들이 기준선을 중심으로 균등하게 분포하지 않고, 특정한 패턴을 보이고 있습니다. 이는 선형 회귀 모델이 데이터를 잘 설명하지 못하고 있음을 나타냅니다.

4. 정규성(Normality)

정규성은 잔차가 정규분포를 따라야 함을 의미합니다. 정규성이 크게 위배되면 회귀계수의 유의성 검정에 문제가 생길 수 있습니다. 정규성은 Q-Q 플롯이나 정규성 검정(예: Shapiro-Wilk 검정)을 통해 확인할 수 있습니다.

from scipy.stats import shapiro

# 데이터 생성
data = pd.DataFrame({'x': [1, 2, 3, 4, 5], 
                     'y': [2, 4, 8, 16, 32]})

# 선형 회귀 모델 생성 및 학습
model = LinearRegression()
model.fit(data[['x']], data['y'])

# 잔차 계산
residuals = data['y'] - model.predict(data[['x']])

# Shapiro-Wilk 검정
_, p_value = shapiro(residuals)
print(f'Shapiro-Wilk p-value: {p_value:.3f}')

# 결과
Shapiro-Wilk p-value: 0.303

Shapiro-Wilk 검정은 데이터가 정규 분포를 따르는지 여부를 판단하는 통계적 검정 방법입니다. 이 검정의 귀무가설은 “데이터가 정규 분포를 따른다”이고, 대립가설은 “데이터가 정규 분포를 따르지 않는다”입니다.

주어진 코드에서 선형 회귀 모델의 잔차에 대해 Shapiro-Wilk 검정을 수행한 결과, p-value는 0.303으로 나타났습니다. 일반적으로 p-value가 유의 수준(일반적으로 0.05)보다 크면 귀무가설을 기각할 수 없습니다.

따라서 p-value가 0.303이므로 유의 수준 0.05에서 귀무가설을 기각할 수 없습니다. 즉, 이 결과는 잔차가 정규 분포를 따른다는 가정을 기각할 수 없음을 의미합니다. (단, 표본의 크기(5개)가 작으므로 신뢰할 수 있는 수준은 아닐 수 있습니다)

정리

위의 네 가지 기본 가정을 모두 만족해야 선형 회귀모델이 통계적으로 유의미하고 예측력을 갖출 수 있습니다. 만약 이 가정들이 위배된다면 변수 변환, 아웃라이어 제거, 변수 선택 등의 방법을 통해 문제를 해결해야 합니다. 또한, 가정 진단 과정을 통해 선형 회귀분석의 적절성을 판단하고, 필요하다면 다른 분석 기법을 고려해야 합니다.