회귀분석

CHOI CHOI·2024년 6월 9일
0

파이썬 중급

목록 보기
19/30

회귀분석이란?

회귀분석은 우리가 변수들 사이의 관계를 이해하고 예측하는데 도움을 주는 통계적 방법

예) 기업이 광고에 얼마나 돈을 쓰는지 (독립 변수)와 그들의 제품이 얼마나 잘 팔리는지(종속 변수) 사이의 관게를 알고 싶다고 가정했을때, 회귀분석을 사용하면, 광고 지출이 판매량에 어떤 영향을 미치는지 숫자로 보여줄 수 있다.

회귀분석

1. 단순 선형 회귀
이것은 하나의 독립변수와 하나의 종속 변수 사이의 관계를 살펴봅니다. 마치 x와 y의 관계를 찾는것과 같다.
2. 다중 선형 회귀
여러 독립 변수(예:광고 지출, 시장 규모, 계절 등)를 사용하여 종속변수를 예측합니다.
3. 로지스틱 회귀
예/아니오 와 같은 범주형 종속 변수를 예측할 때 사용됩니다.

언제 사용하면 좋을까요?

  1. 작은 데이터 세트에도 효과적
    회귀분석은 거대한 데이터가 없어도 잘 작동한다. 큰 데이터 세트를 필요로 하는 복잡한 머신러닝 모델과 달리, 회귀모델은 상대적으로 작은 데이터로도 의미 있는 결과를 줄 수 있다. 데이터가 많지 않아도 괜찮아요!

2.간단하고 비용이 적게 드는 모델
회귀모델은 복잡하지 않다. 그래서 컴퓨터가 이해하고 계산하기에 부담이 적다. 빠른 모델 훈련과 예측이 필요할 때 안성맞춤

  1. 이해와 설명이 중요할때
    예측의 정확성 만큼 중요한 것이 데이터의 패턴을 이해하고 설명하는 것이라면, 회귀분석이 제격. 이 방법은 데이터가 어떻게 움직이는지, 왜 그런지 보여준다.

  2. 선형 관계가 강한 데이터에 적합
    만약 데이터가 선형적인 패턴을 보인다면, 회귀분석은 높은 정확도를 제공할 수 있다. 즉, 하나의 변수가 변할 때 다른 변수도 예측 가능한 방식으로 변하는 그런 데이터이다.

한계점

  • 선형 관계에만 집중
    회귀 모델은 변수들 사이에 직선 같은 선형 관계가 있다고 가정한다.
    하지만 실제 세계에서는 모든 관계가 직선처럼 간단하지 않다. 산이나 곡선처럼 구부러진 비선형 관계를 가진 데이터에는 회귀분석이 잘 맞지 않을 수 있다.

  • 단순함의 한계
    회귀분석은 비교적 간단한 모델이다. 이 단순함은 이해하기 쉽고 계산하기 편하게 만들어주지만, 때로는 데이터의 복잡한 패턴이나 관계를 완전히 포착하거나 설명하기에는 부족할 수 있다.

  • 다중 공선성 문제
    회귀분석은 다중 공선성(multicollinearity) 문제를 피하기 위해 독립 변수들 간의 상관관계를 검토해야 합니다.

회귀분석 이론

단순 선형 회귀분석

선형 회귀분석에서의 주요 구성요소는 아래와 같다

  • 독립변수 : 우리가 예측하거나 설명하고자 하는 변수.
  • 종속변수 : 우리가 예측하려는 변수로, 독립변수에 의해 영향을 받는다.
  • 회귀선 : 데이터 포인트들 사이의 관계를 나타낸다. 가장 잘 맞는 최적의 선형관계를 표현하는 선. 이 선을 통해 우리는 독립 변수가 변할 때 종소 변수가 어떻게 변할지 예측할 수 있다.

단순 회귀분석은 한 개의 독립 변수와 한 개의 종속 변수를 가지는 선형 관계를 모델링한다.

단순 회귀분석 식은 아래와 같다.
Y= a+bX+ϵ

  • X: 독립변수(independent variables)
  • Y: 종속변수(dependent variable), 이 변수의 값은 다른 변수에 의해 영향을 받습니다.
  • a: 회귀 계수, y 절편(intercept) 이라고 하며, 독립변수 X값이 0일 때 Y의 예상 값입니다.
  • b: 회귀 계수, 기울기(slop)이며, 독립변수 X가 한 단위 변할 때 종속변수 Y가 얼마나 변하는지를 나타냅니다.
  • ϵ: 오차(Error) 항으로, 모델이 설명하지 못하는 무작위 변동성을 나타냅니다.

회귀 계수를 구하는 방법은 최소제곱법(OLS)를 이용합니다.
구체적인 순서는 다음과 같다

  1. 회귀 모델 정의
  2. 오차의 제곱합 계산 : 여러 독립 변수에 대해 실제 값과 회귀 모델에 의해 예측된 갑 사이의 차이의 제곱합을 계산한다
  3. 제곱합 최소화 : 이를 최소화하는 절편과 각 독립 변수에 대한 회귀계수 값을 찾는다.

다중선형 회귀분석

다중 회귀분석은 여러개의 독립변수와 한 개의 종속변수를 가지는 선형관계를 모델링한다

다중회귀분석 식
Y=a+b1X1+b2X2+...+bnXn+ϵ

회귀 식의 해석
회귀 식을 통해 데이터에서 관찰되는 관계의 강도와 방향을 이해할 수 있다.
예를 들어, 기울기 b의 값이 양수이면 x와 y가 양의 관계를 가진다는 것을 의미하며, 값이 클수록 관계가 강해진다. 반대로 b가 음수면 음의 관계를 나타낸디. 회귀 식은 또한 예측 목적으로 사용된다. 독립 변수 X의 새로운 값을 식에 대입하여, 해당하는 종속 변수 Y의 예상 값을 계산할 수 있다.

회귀분석 기본 가정

회귀 모델을 적용하기 전에 검토하고, 필요한 경우 조정하거나 다른 분석 방법을 고려해야한다. 데이터가 이러한 가정을 충족하지 않을 경우, 변환을 적용하거나 다른 종류의 회귀 모델을 사용하는 것을 고려할 수 있다.

선형성

종속변수(가격, 무게 등)와 독립변수(시간, 온도 등) 사이에는 직선과 같은 관계가 있어야 한다. 즉, 한 변수가 변할 때 다른 변수도 예측 가능한 방식으로 변해야한다.
-> 이 가정이 충족되지 않으면, 회귀 모델은 실제 데이터의 패턴을 잘못 해석할 수 있다.

오차의 독립성

모델의 예측과 실제 값 사이의 차이(오차)가 서로 영향을 주지 않아야 한다. 예를 들어, 오늘의 오차가 내일의 오차에 영향을 주면 안된다.
-> 오차가 서로 관련되어 있으면, 모델이 특정 패턴이나 추세를 놓칠 수 있다.

오차의 정규분포

오차는 '정규 분포'를 따라야 한다. 즉, 오차가 특정한 '종모양'의 패턴을 보여야한다.
-> 이 가정을 통해 통계적 추정과 검정이 더 정확하고 신뢰할 수 있게 된다.

오차의 등분산성

오차의 크기가 독립변수의 값에 관계없이 일정해야한다. 즉, 독립변수가 어떤 값이든 오차의 분산이 같아야 한다.
-> 이 가정이 위반된다면, 모델이 데이터의 일부 영역에서는 잘 작동하지만 다른 영역에서는 잘 작동하지 않을 수 있다.

다중공선성

독립 변수들이 서로 너무 강하게 연과되어 있지 않아야한다. 즉, 하나의 독립 변수가 다른 독립 변수를 예측하는데 사용되지 않아야한다.
-> 다중공선성이 높으면, 어떤 독립 변수가 종속 변수에 영향을 미치는지 정확하게 파악하기 어렵다.

회귀 모형 평가

회귀 모형 적합도 평가

  • 결정 계수
    R-제곱은 모델이 데이터의 변동성을 얼마나 잘 설명하는지를 나타내는 지표이다.
    값은 0과 1사이에서 변하며, 1에 가까울수록 모델이 데이터를 더 잘 설명한다는 의미
    하지만, 무조건 높은 R-제곱이 좋은 모델을 의미하지는 않으며, 과적합의 가능성도 고려해야한다.

  • 조정된 결정 계수
    독립 변수의 수가 증가할 때 R-제곱의 증가를 보장한다
    독립 변수의 수를 고려하여 R-제곱을 조정한 값으로, 불필요한 변수가 모델에 추가될 때 패널티를 부여

  • 표준오차
    회귀선과 실제 데이터 포인트 간의 평균거리를 나타낸ㄷ
    표준오차가 작을수록 모델의 예측이 실제 값에 더 가깝다는 의미

  • F-통계량
    모델의 전체 유의성을 평가한다
    F-통계량이 크고, 관련P-값이 작을수록 모델이 통계적으로 유의미하다고 간주된다.

  • AIC 및 BIC
    모델의 복잡성과 적합도를 함께 고려하는 지표이다
    값이 작을수록 저 돟은 모델로 평가

회귀계수에 대한 T검정

이 검정의 주요 목적은 회귀 모델에서 각 독립변수가 종속 변수에 미치는 영향이 통계적으로 유의미한디를 평가하는 것이다. 구체적으로 다음과 같은 이유로 t검정을 수행한다

  • 통계적 유의성 판단 : t검정은 각 독립 변수의 회귀계수가 0인지 아닌지를 판단. 회귀계수가 0이라면, 해당 변수는 종속 변수에 영향을 미치지 않는 것으로 간주된다.
  • 신뢰 구간 추정 : t 검정은 회귀계수의 신뢰구간을 계산하는데 사용된다. 신뢰 구간은 회귀계수가 특정한 범위 안에 있을 확률을 제공한다
  • 변수 선택 : 회귀 모델에서 어떤 변수들이 결과에 중요한 영향을 미치는지 결정하는데 t 검정 결과가 사용될 수 있다. 통계적으로 유의미하지 않는 변수는 모델에서 제외할 수 있다.
  • 모델의 예측력 평가 : t검정은 모델의 전체적인 예측력을 평가하는데 도움을 준다. 모든 독립 변수의 계수가 유의미하다면, 모델은 데이터를 잘 설명할 가능성이 높다.

코드 정리

데이터 생성

import numpy as np
import statsmodels.api as sm
import matplotlib.pyplot as plt

# 가상의 데이터 생성
np.random.seed(0)  # 결과의 일관성을 위해 시드 설정
X = np.random.rand(100, 1) * 100  # 독립 변수 (0~100 사이의 값 100개)
y = 3 * X + np.random.randn(100, 1) * 30  # 종속 변수 (기울기는 3, 잡음 추가)
X_sm = sm.add_constant(X)

# 데이터와 회귀선 시각화
plt.scatter(X, y, color='skyblue')  # 원본 데이터 산점도
plt.title('Simple Linear Regression')
plt.xlabel('X')
plt.ylabel('y')
plt.show()

모델학습

from sklearn.linear_model import LinearRegression

model = LinearRegression()
model.fit(X, y)

모델 예측

# 예측 및 모델 평가
y_pred = model.predict(X)

# 데이터와 회귀선 시각화
plt.scatter(X, y, color='skyblue')  # 원본 데이터 산점도
plt.plot(X, y_pred, color='red')  # 회귀선
plt.title('Simple Linear Regression')
plt.xlabel('X')
plt.ylabel('y')
plt.show()

회귀분석 예제 코드

# 상수항 추가
X_sm = sm.add_constant(X)

# OLS (Ordinary Least Squares) 모델 생성 및 학습
model = sm.OLS(y, X_sm)
results = model.fit()

모델 예측

# 요약 결과 출력
print(results.summary())

# 데이터와 회귀선 시각화
plt.scatter(X, y, color='skyblue')  # 원본 데이터 산점도 (하늘색)
plt.plot(X, results.predict(X_sm), color='lightcoral')  # 회귀선 (밝은 주황색)
plt.title('Simple Linear Regression with Statsmodels')
plt.xlabel('X')
plt.ylabel('y')
plt.show()

검증 코드

선형성 검증

predicted_values = results.predict(X_sm)
plt.scatter(predicted_values, y)
plt.xlabel("Predicted Values")
plt.ylabel("Actual Values")
plt.title("Predicted vs. Actual Values")
plt.show()

오차의 독립성 검증

print('Durbin-Watson:', sm.stats.durbin_watson(results.resid), '\n')
print(results.summary()) # Durbin-Watson 확인

오차의 정규성 검증

from scipy import stats

# 잔차 계산
residuals = results.resid

# Shapiro-Wilk 테스트
shapiro_test = stats.shapiro(residuals)
print("Shapiro-Wilk Test:\nStatistic:", shapiro_test[0], "\np-Value:", shapiro_test[1])

# Kolmogorov-Smirnov(K-S) 검정
ks_test = stats.kstest(residuals, 'norm')
print("Kolmogorov-Smirnov Test:\nStatistic:", ks_test[0], "\np-Value:", ks_test[1])
# Q-Q Plot
plt.figure(figsize=(6, 4))
sm.qqplot(residuals, line='s')
plt.title('Normal Q-Q Plot')
plt.show()

오차의 등분산성 검증

from statsmodels.stats.diagnostic import het_breuschpagan, het_goldfeldquandt

# 잔차 계산
residuals = results.resid

# Breusch-Pagan 테스트
bp_test = het_breuschpagan(residuals, results.model.exog)
print("Breusch-Pagan Test:\nStatistic:", bp_test[0], "\np-Value:", bp_test[1])
plt.scatter(predicted_values, results.resid)
plt.xlabel("Predicted Values")
plt.ylabel("Residuals")
plt.title("Predicted Values vs. Residuals")
plt.axhline(y=0, color='r', linestyle='--')
plt.show()

다중공선성 코드 예시

테이터 생성

import pandas as pd

# 데이터셋 생성
np.random.seed(0)
X1 = np.random.rand(100) * 10  # 첫 번째 독립 변수
X2 = X1 + np.random.normal(0, 1, 100) * 2  # 두 번째 독립 변수, X1과 강한 상관 관계
X3 = np.random.rand(100) * 10  # 세 번째 독립 변수, 상대적으로 독립적
y = 5 + 2 * X1 + 3 * X2 + 7 * X3 + np.random.normal(0, 2, 100)  # 종속 변수

# DataFrame으로 변환
df = pd.DataFrame({'X1': X1, 'X2': X2, 'X3': X3, 'y': y})
df

VIF

from statsmodels.stats.outliers_influence import variance_inflation_factor

# VIF 계산
X = df[['X1', 'X2', 'X3']]
X = sm.add_constant(X)
vif_data = pd.DataFrame()
vif_data["feature"] = X.columns
vif_data["VIF"] = [variance_inflation_factor(X.values, i) for i in range(X.shape[1])]

print(vif_data)
profile
뭐가 됐든 데이터분석가

0개의 댓글