본문 바로가기
[업무 지식]/Statistics

[선형회귀] Regression

by 에디터 윤슬 2024. 11. 12.

단순선형회귀

  • 한 개의 변수에 의한 결과를 예측
  • 하나의 독립변수(x)와 하나의 종속변수(y) 간의 관계를 직선으로 모델링하는 방법

  • 데이터가 직선적 경향을 따를 때 사용
  • 데이터가 선형적이지 않을 경우 부적합
  • 독립변수의 변화에 따라 종속변수가 어떻게 변화하는지 설명하고 예측 가능
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score

# 예시 데이터 생성
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

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

# 단순선형회귀 모델 생성 및 훈련
model = LinearRegression()
model.fit(X_train, y_train)

# 예측
y_pred = model.predict(X_test)

# 회귀 계수 및 절편 출력
print("회귀 계수:", model.coef_)
print("절편:", model.intercept_)

# 회귀 계수: [[2.9902591]]
# 절편: [4.20634019]
# 이 값은 학습된 선형 회귀 방정식이 다음과 같음을 의미합니다:
y = 4.206 + 2.990⋅X
# 모델 평가
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("평균 제곱 오차(MSE):", mse)
print("결정 계수(R2):", r2)

# 평균 제곱 오차(MSE): 0.9177532469714291
# 결정 계수(R2): 0.6521157503858556
# 시각화
plt.scatter(X, y, color='blue')
plt.plot(X_test, y_pred, color='red', linewidth=2)
plt.title('linear regeression')
plt.xlabel('X : cost')
plt.ylabel('Y : sales')
plt.show()

  • 데이터 생성
    • np.random.seed(0): 난수 생성기의 시드를 고정하여 실행할 때마다 동일한 결과를 얻을 수 있도록 합니다.
    • X: 0에서 2 사이의 랜덤한 값 100개를 생성합니다.
    • y: 선형 방정식 y=4+3X+ϵ에 따라 출력값을 생성합니다. 여기서 ϵ은 정규 분포를 따르는 잡음(오차)입니다. 즉, y는 와 선형 관계를 가지며 약간의 노이즈가 추가된 값입니다.
  • 데이터 분할
    • train_test_split(): 데이터를 훈련 데이터와 테스트 데이터로 나눕니다.
    • test_size=0.2: 데이터의 20%는 테스트용으로 사용하고, 80%는 훈련용으로 사용합니다.
    • random_state=42: 데이터를 분할할 때 무작위성을 고정하여 결과가 항상 동일하게 나오도록 합니다.
  • 모델 생성 및 훈련
    • LinearRegression(): 선형 회귀 모델을 생성합니다.
    • model.fit(X_train, y_train): 훈련 데이터를 사용하여 모델을 학습시킵니다.
  • 예측 및 평가
    • model.predict(X_test): 학습된 모델을 사용하여 테스트 데이터에 대한 예측값을 계산합니다.
    • 평균 제곱 오차(MSE): 실제 값과 예측 값 간의 차이를 제곱하여 평균한 값입니다. 값이 작을수록 모델이 더 정확하다는 의미입니다.
    • 결정 계수(R²): 모델이 데이터를 얼마나 잘 설명하는지를 나타냅니다. 값이 1에 가까울수록 좋은 모델입니다.
  • 회귀 계수 및 절편 출력
    • 회귀 계수(coefficient): 독립 변수 X의 기울기(선형 회귀식에서 기울기).
    • 절편(intercept): 회귀선이 Y축과 만나는 지점 (선형 회귀식에서 상수항).

다중선형회귀

  • 두 개 이상의 변수에 의한 결과를 예측
  • 두 개 이상의 독립변수(x1, x2, x3...)와 하나의 종속변수(y) 간의 관계를 모델링

  • 특징
    • 여러 변수의 영향을 동시에 분석 가능
    • 변수 간의 다중공선성 문제 발생할 수 있다
  • 다중공선성
    • Multicollinearity는 회귀분석에서 독립변수들간에 높은 상관관계가 있는 경우
    • 회귀분석 모델의 성능과 해석에 여러 문제를 일으킬 수 있다
    • 독립변수들이 강하게 상관되어 있으면 각 변수의 개별적인 효과를 분리하기 어려워 회귀의 해석을 어렵게 만든다
    • 다중공선성으로 인해 중요한 변수가 통계적으로 유의하게 나타나지 않을 수 있다
    • 상관계수를 계산하여 높은(약 0.7) 변수가 있는지 확인할 수 있다
    • 분산팽창계수(VIF)를 계산하여 VIF 값이 10보다 높은지 확인하는 방법으로 다중공선성 판단 가능
    • 높은 계수를 가진 변수 중 하나를 제거할 수 있다.
    • 혹은 주성분분석(PCA)과 같은 변수를 효과적으로 줄이는 차원 분석 방법을 적용하여 해결할 수 있다
 # 예시 데이터 생성
data = {'TV': np.random.rand(100) * 100,
        'Radio': np.random.rand(100) * 50,
        'Newspaper': np.random.rand(100) * 30,
        'Sales': np.random.rand(100) * 100}
df = pd.DataFrame(data)
df

# 독립 변수(X)와 종속 변수(Y) 설정
X = df[['TV', 'Radio', 'Newspaper']]
y = df['Sales']

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

# 다중선형회귀 모델 생성 및 훈련
model = LinearRegression()
model.fit(X_train, y_train)

# 예측
y_pred = model.predict(X_test)

# 회귀 계수 및 절편 출력
print("회귀 계수:", model.coef_)
print("절편:", model.intercept_)

# 회귀 계수: [-0.02208636 -0.04524956  0.36955755]
# 절편: 47.47458066489462


이 결과는 다음과 같은 회귀식을 의미합니다:

Sales=−0.078⋅TV+0.361⋅Radio−0.588⋅Newspaper+53.341
즉:
TV 광고비가 판매량에 약간의 음의 영향을 미치고,
라디오 광고비는 판매량에 긍정적인 영향을 미치며,
신문 광고비는 판매량에 부정적인 영향을 미친다고 해석할 수 있습니다.
# 모델 평가
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("평균 제곱 오차(MSE):", mse)
print("결정 계수(R2):", r2)

# 평균 제곱 오차(MSE): 953.8458662397383
# 결정 계수(R2): -0.14044120780448188
  • 독립변수와 종속변수 설정
    • 독립 변수(X): TV, 라디오, 신문 광고비.
    • 종속 변수(y): 판매량(Sales).
  • 데이터분할
    • 데이터를 훈련용과 테스트용으로 나눕니다.
      • test_size=0.2: 데이터의 20%는 테스트용으로 사용하고, 80%는 훈련용으로 사용합니다.
      • random_state=42: 데이터 분할 시 무작위성을 고정하여 실행할 때마다 동일한 결과를 얻을 수 있도록 합니다.
  • 다중선형회귀 모델 생성 및 훈련
    • LinearRegression(): 선형 회귀 모델을 생성합니다.
    • model.fit(X_train, y_train): 훈련 데이터를 사용하여 모델을 학습시킵니다.
  • 예측
    • 학습된 모델을 사용하여 테스트 데이터에 대한 예측값을 계산합니다.
  • 회귀계수 및 절편 출력
    • 회귀 계수(coefficient): 각 독립 변수(TV, Radio, Newspaper)의 기울기(계수)를 나타냅니다.
    • 절편(intercept): 회귀선이 Y축과 만나는 지점입니다.
  • 모델 평가
    • MSE가 비교적 큰 값을 가지며(953), R² 값이 음수(-0.14)인 것은 모델이 데이터를 제대로 설명하지 못하고 있음을 의미합니다.
    • R² 값이 음수라는 것은 예측 성능이 매우 낮다는 것을 의미하며, 이는 모델이 실제로는 상관관계가 없는 데이터를 학습했거나 적절한 변수를 선택하지 못했음을 시사합니다.