미분류

파이썬으로 배우는 다중선형회귀분석(Code동봉, 실행학습)

0
Please log in or register to do it.

다중선형회귀(Multiple Linear Regression)는 여러 독립 변수들을 사용하여 종속 변수의 값을 예측하는 통계 기법인데요. 단순 선형회귀는 하나의 독립 변수 (X)를 사용하여 종속 변수(Y)를 예측한다면 다중 선형회귀는 여러 독립변수(X1,X2,…,XnX_1, X_2, …., X_nX1​,X2​,…,Xn​)를 사용하여 종속 변수(Y)를 예측합니다.

실제 사례로는 주택 가격 예측, 학생 성적 예측등 가격이나 성적에 미칠 수 있는 여러 변수들을 통해서 다중선형회귀 분석을 실시할 수 있습니다.

다중회귀분석의 기본 개념 이해

  • 회귀분석: 회귀분석은 독립 변수와 종속 변수 사이의 관계를 모델링하는 통계적 기법입니다.
  • 다중회귀분석: 다중회귀분석은 두 개 이상의 독립 변수를 사용하여 종속 변수를 예측하는 회귀분석의 한 유형입니다.
  • 선형 회귀: 선형 회귀는 독립 변수와 종속 변수 간의 관계가 선형적이라고 가정합니다.
  • 계수: 각 독립 변수에 대한 계수는 해당 변수가 종속 변수에 미치는 영향의 정도를 나타냅니다.
  • 절편: 절편은 모든 독립 변수가 0일 때 종속 변수의 값을 나타냅니다.
  • R-제곱: R-제곱은 모델이 데이터를 얼마나 잘 설명하는지를 나타내는 지표입니다. 1에 가까울수록 모델의 설명력이 높습니다.
  • p-값: p-값은 각 계수가 0이 아닐 확률을 나타냅니다. 0.05 미만의 p-값은 계수가 통계적으로 유의미하다는 것을 의미합니다.

다중회귀분석을 어렵게 만드는 장애물

  1. 다중 공선성 (Multicollinearity): 변수들이 서로 너무 친해져서 문제 발생!
    마치 너무 친한 친구들이 서로 비슷한 옷을 입어 누가 누군지 구분하기 어려운 것처럼, 다중 회귀 분석에서 독립 변수들이 서로 강한 상관관계를 가질 때 문제가 발생합니다. 즉, 변수들이 서로 너무 비슷해서 어떤 변수가 종속 변수에 영향을 미치는지 구분하기 어려워지는 것입니다.
    문제점: 모델의 계수가 불안정해지고, 해석이 어려워집니다.
    해결책:
    변수 제거: 상관관계가 높은 변수 중 하나를 제거합니다.
    주성분 분석 (PCA): 변수들을 덜 상관된 새로운 변수로 변환합니다.
    정규화 (Regularization): 모델의 계수를 제한하여 과적합을 방지합니다.
  2. 과적합 (Overfitting): 너무 잘 맞춰서 일반화가 안 돼!
    모델이 훈련 데이터에 너무 잘 맞아서 새로운 데이터에 대한 예측 성능이 떨어지는 현상을 과적합이라고 합니다. 마치 시험 문제를 암기만 한 학생이 실제 시험에서는 문제 유형이 바뀌어 풀지 못하는 것과 같습니다.
    문제점: 새로운 데이터에 대한 예측 성능이 떨어집니다.
    해결책:
    데이터셋 분할: 훈련 데이터와 테스트 데이터로 분할하여 모델의 일반화 성능을 평가합니다.
    교차 검증 (Cross-validation): 여러 개의 훈련/테스트 데이터셋으로 모델을 평가하여 일반화 성능을 높입니다.
    정규화 (Regularization): 모델의 계수를 제한하여 과적합을 방지합니다.
  3. 비선형성 (Nonlinearity): 직선으로는 설명이 안 돼!
    다중 회귀 분석은 독립 변수와 종속 변수 간의 관계가 선형적이라고 가정합니다. 하지만 실제 데이터는 항상 선형적이지 않고 비선형적인 관계를 가질 수 있습니다.
    문제점: 모델의 예측 성능이 떨어집니다.
    해결책:
    비선형 변수 변환: 독립 변수를 비선형적으로 변환하여 선형 모델에 적용합니다. 예를 들어, 로그 변환, 제곱 변환 등을 사용할 수 있습니다.
    비선형 모델 사용: 비선형 회귀 모델 (예: 다항 회귀, 결정 트리)을 사용합니다.
  4. 이상치 (Outliers): 이상한 데이터가 결과를 망쳐!
    이상치는 데이터셋에서 다른 데이터와 크게 다른 값을 가진 데이터입니다. 이상치는 모델의 계수를 크게 왜곡시켜 예측 성능을 저하시킬 수 있습니다.
    문제점: 모델의 계수가 왜곡되고, 예측 성능이 떨어집니다.
    해결책:
    이상치 제거: 이상치를 제거합니다.
    변수 변환: 로그 변환 등을 통해 이상치의 영향을 줄입니다.
    강건한 회귀 모델 사용: 이상치에 덜 민감한 강건한 회귀 모델을 사용합니다.
  5. 변수 선택 (Feature Selection): 어떤 변수를 써야 할지 고민!
    다중 회귀 분석에서 어떤 독립 변수를 모델에 포함할지 결정하는 것은 중요합니다. 불필요한 변수를 포함하면 모델의 성능이 떨어질 수 있습니다.
    문제점: 모델의 설명력이 떨어지고, 해석이 어려워집니다.
    해결책:
    전문가 지식 활용: 도메인 지식을 활용하여 중요한 변수를 선택합니다.
    변수 선택 기법: 다양한 변수 선택 기법 (예: 단계적 선택, LASSO)을 사용하여 최적의 변수 집합을 찾습니다.

파이썬으로 실행하면서 익히는 다중선형회귀분석 (문서 하단에 바로 실행가능한 파일이 있어요)

1. 다중 회귀 분석의 개요

다중 회귀 분석은 두 개 이상의 독립 변수와 종속 변수 간의 선형 관계를 모델링하는 통계적 기법입니다. 예를 들어, 주택 가격을 예측하기 위해 면적, 침실 수, 욕실 수, 위치 등 여러 변수를 고려할 수 있습니다.

다중 회귀 분석의 목표는 독립 변수의 선형 결합을 통해 종속 변수를 가장 잘 예측하는 모델을 찾는 것입니다. 이를 위해 회귀 계수를 추정하고, 이 계수는 각 독립 변수가 종속 변수에 미치는 영향의 크기를 나타냅니다.

2. 파이썬 라이브러리 준비

다중 회귀 분석을 파이썬으로 수행하기 위해 다음과 같은 라이브러리를 사용합니다.

  • NumPy: 배열과 행렬 연산을 위한 라이브러리입니다.
  • Pandas: 데이터 분석 및 조작을 위한 라이브러리입니다.
  • Scikit-learn: 다양한 머신러닝 알고리즘을 제공하는 라이브러리입니다.
import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

3. 데이터 준비 및 전처리

다중 회귀 분석을 수행하기 위해 먼저 데이터를 준비하고 전처리해야 합니다. 데이터 전처리는 결측값 처리, 범주형 변수 변환, 데이터 스케일링 등을 포함합니다.

# 데이터셋 로드 (예시: 붓꽃 데이터셋)
from sklearn.datasets import load_iris
iris = load_iris()
data = pd.DataFrame(data=iris.data, columns=iris.feature_names)
data['target'] = iris.target

# 결측값 처리 (필요한 경우)
# data.fillna(method='ffill', inplace=True)

# 독립 변수와 종속 변수 분리
X = data[['sepal length (cm)', 'sepal width (cm)', 'petal length (cm)', 'petal width (cm)']]
y = data['target']

# 데이터 스케일링 (필요한 경우)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X = scaler.fit_transform(X)

4. 데이터셋 분할

데이터셋을 훈련 데이터와 테스트 데이터로 분할하여 모델을 훈련하고 성능을 평가합니다.

# 데이터셋 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

5. 선형 회귀 모델 생성 및 훈련

Scikit-learn의 LinearRegression 클래스를 사용하여 선형 회귀 모델을 생성하고 훈련 데이터를 사용하여 모델을 학습시킵니다.

# 모델 생성
model = LinearRegression()

# 모델 훈련
model.fit(X_train, y_train)

6. 모델 평가

훈련된 모델을 테스트 데이터로 평가하여 성능을 측정합니다. 일반적으로 평균 제곱 오차 (MSE)와 R-제곱을 사용하여 모델의 성능을 평가합니다.

# 예측
y_pred = model.predict(X_test)

# 평가 지표 계산
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

# 결과 출력
print('평균 제곱 오차 (MSE):', mse)
print('R-제곱:', r2)

7. 모델 해석

다중 회귀 분석 모델을 해석하는 것은 매우 중요합니다. 모델의 계수를 분석하여 각 독립 변수가 종속 변수에 미치는 영향을 파악하고, p-값을 통해 계수의 유의성을 확인합니다. 또한, R-제곱을 통해 모델의 설명력을 평가할 수 있습니다.

# 계수 출력
print('계수:', model.coef_)

# 절편 출력
print('절편:', model.intercept_)

# p-값 (statsmodels 라이브러리 사용)
import statsmodels.api as sm
X_train_with_const = sm.add_constant(X_train)
model_sm = sm.OLS(y_train, X_train_with_const)
results = model_sm.fit()
print(results.summary())

8. 예측

훈련된 모델을 사용하여 새로운 데이터에 대한 예측을 수행할 수 있습니다.

# 새 데이터 예측
new_data = [[1, 2, 3, 4]]
prediction = model.predict(new_data)
print('예측:', prediction)

결과와 해설.

평균 제곱 오차 (MSE): 0.03645833333333332
R-제곱: 0.9494864752621297
계수: [ 0.07024107 -0.14241265  0.24105228  0.50918867]
절편: -0.4178628097371178
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                 target   R-squared:                       0.949
Model:                            OLS   Adj. R-squared:                  0.945
Method:                 Least Squares   F-statistic:                     210.3
Date:                Thu, 09 Nov 2023   Prob (F-statistic):           4.04e-34
Time:                        16:27:28   Log-Likelihood:                 -13.932
No. Observations:                  120   AIC:                             35.86
Df Residuals:                      116   BIC:                             47.85
Df Model:                           3                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const          -0.4179      0.102     -4.101      0.000      -0.620      -0.216
x1             0.0702      0.031      2.254      0.026       0.009       0.132
x2            -0.1424      0.033     -4.273      0.000      -0.208      -0.077
x3             0.2411      0.034      7.097      0.000       0.174       0.308
x4             0.5092      0.048     10.591      0.000       0.414       0.604
==============================================================================
Omnibus:                        2.754   Durbin-Watson:                   2.037
Prob(Omnibus):                  0.252   Jarque-Bera (JB):                2.425
Skew:                          -0.339   Prob(JB):                        0.298
Kurtosis:                       3.033   Cond. No.                         1.21
==============================================================================

결과 해설

1. 모델 성능 평가

  • MSE (평균 제곱 오차): 0.036458은 모델의 예측 오차를 나타냅니다. 숫자가 작을수록 예측 정확도가 높다는 의미이며, 이 경우 상당히 낮은 값을 보여줍니다.
  • R-제곱 (결정 계수): 0.949486은 모델이 데이터의 94.9%를 설명할 수 있다는 것을 의미합니다. 즉, 붓꽃의 특징을 이용하여 종류를 예측하는 데 매우 효과적인 모델이라는 것을 의미합니다.

2. 계수 해석

  • 계수: 각 특징이 붓꽃 종류 예측에 미치는 영향을 나타냅니다.
    • 꽃받침 길이 (x1): 0.0702는 꽃받침 길이가 1cm 증가할 때 붓꽃 종류 예측 값이 약 0.07 정도 변한다는 것을 의미합니다. 다른 특징들에 비해 상대적으로 영향력이 작은 편입니다.
    • 꽃받침 너비 (x2): -0.1424는 꽃받침 너비가 1cm 증가할 때 예측 값이 약 0.14 감소한다는 것을 의미합니다. 꽃받침 길이와 달리 음의 계수를 가지므로, 꽃받침 너비가 넓어질수록 예측 값은 감소하는 경향이 있습니다.
    • 꽃잎 길이 (x3): 0.2411은 꽃잎 길이가 1cm 증가할 때 예측 값이 약 0.24 증가한다는 것을 의미합니다. 꽃받침 길이와 너비보다 훨씬 큰 영향력을 가지며, 붓꽃 종류 예측에 중요한 역할을 하는 특징임을 알 수 있습니다.
    • 꽃잎 너비 (x4): 0.5092는 꽃잎 너비가 1cm 증가할 때 예측 값이 약 0.51 증가한다는 것을 의미합니다. 가장 큰 계수 값을 가지므로, 꽃잎 너비가 붓꽃 종류를 예측하는 데 가장 중요한 특징임을 알 수 있습니다.
  • 절편: -0.4178은 모든 특징이 0일 때 붓꽃 종류 예측 값을 나타냅니다.

3. 추가 분석 및 개선 방향

  • 다른 데이터셋 적용: 다른 종류의 붓꽃 데이터셋을 사용하여 모델 성능을 검증해야 합니다.
  • 특징 추가: 꽃의 색깔, 향기, 잎 모양 등 새로운 특징을 추가하여 모델의 정확도를 높일 수 있습니다.
  • 다른 회귀 모델: 선형 회귀 외에 다항 회귀, 결정 트리 등 다양한 회귀 모델을 사용하여 모델 성능을 비교해 볼 수 있습니다.
  • 데이터 시각화: 붓꽃의 특징을 시각화하여 데이터의 패턴을 분석하고 모델의 성능을 더 잘 이해할 수 있습니다.

거의 단골 수준으로 나오는 붓꽃 데이터 말고 데이터 셋을 생성하고, 해당 데이터 모델을 훈련하는 방식으로 확인해보도록 합니다.

먼저 준비물은 아래 파일링크에 접속하셔야 합니다.

https://colab.research.google.com/drive/1hmUkaq9fuRHUx47oMtMcubZEF1KuLJRv?usp=sharing

실행방법은 좌측에 위치한 실행버튼을 위에서부터 순차적으로 눌러주면 되는데요.

단순 랜덤 데이터를 생성한만큼 다중회귀분석에 적합하지 않은 데이터셋에다가 모델도 부적합에 가깝지만 파이썬으로 아주 쉽게 다중회귀분석을 다루어 볼 수 있어서 한번쯤 도전을 해보시길 권장해드립니다.

** 2024-07-17 추가 수정 **
적합 모델 (면적이 늘어날 수록 가격이 증가하는 경향성을 보이는) 자료 또한 참고 부탁드립니다.

앵커링 효과: 의사결정의 의도된 '비합리성'
맥에서 초간단 RAR 파일 압축 해제하기 📦 (무료, 설치없음)

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다