회귀분석은 우리가 변수들 사이의 관계를 이해하고 예측하는데 도움을 주는 통계적 방법
예) 기업이 광고에 얼마나 돈을 쓰는지 (독립 변수)와 그들의 제품이 얼마나 잘 팔리는지(종속 변수) 사이의 관게를 알고 싶다고 가정했을때, 회귀분석을 사용하면, 광고 지출이 판매량에 어떤 영향을 미치는지 숫자로 보여줄 수 있다.
1. 단순 선형 회귀
이것은 하나의 독립변수와 하나의 종속 변수 사이의 관계를 살펴봅니다. 마치 x와 y의 관계를 찾는것과 같다.
2. 다중 선형 회귀
여러 독립 변수(예:광고 지출, 시장 규모, 계절 등)를 사용하여 종속변수를 예측합니다.
3. 로지스틱 회귀
예/아니오 와 같은 범주형 종속 변수를 예측할 때 사용됩니다.
2.간단하고 비용이 적게 드는 모델
회귀모델은 복잡하지 않다. 그래서 컴퓨터가 이해하고 계산하기에 부담이 적다. 빠른 모델 훈련과 예측이 필요할 때 안성맞춤
이해와 설명이 중요할때
예측의 정확성 만큼 중요한 것이 데이터의 패턴을 이해하고 설명하는 것이라면, 회귀분석이 제격. 이 방법은 데이터가 어떻게 움직이는지, 왜 그런지 보여준다.
선형 관계가 강한 데이터에 적합
만약 데이터가 선형적인 패턴을 보인다면, 회귀분석은 높은 정확도를 제공할 수 있다. 즉, 하나의 변수가 변할 때 다른 변수도 예측 가능한 방식으로 변하는 그런 데이터이다.
선형 관계에만 집중
회귀 모델은 변수들 사이에 직선 같은 선형 관계가 있다고 가정한다.
하지만 실제 세계에서는 모든 관계가 직선처럼 간단하지 않다. 산이나 곡선처럼 구부러진 비선형 관계를 가진 데이터에는 회귀분석이 잘 맞지 않을 수 있다.
단순함의 한계
회귀분석은 비교적 간단한 모델이다. 이 단순함은 이해하기 쉽고 계산하기 편하게 만들어주지만, 때로는 데이터의 복잡한 패턴이나 관계를 완전히 포착하거나 설명하기에는 부족할 수 있다.
다중 공선성 문제
회귀분석은 다중 공선성(multicollinearity) 문제를 피하기 위해 독립 변수들 간의 상관관계를 검토해야 합니다.
선형 회귀분석에서의 주요 구성요소는 아래와 같다
단순 회귀분석은 한 개의 독립 변수와 한 개의 종속 변수를 가지는 선형 관계를 모델링한다.
단순 회귀분석 식은 아래와 같다.
Y= a+bX+ϵ
회귀 계수를 구하는 방법은 최소제곱법(OLS)를 이용합니다.
구체적인 순서는 다음과 같다
다중 회귀분석은 여러개의 독립변수와 한 개의 종속변수를 가지는 선형관계를 모델링한다
다중회귀분석 식
Y=a+b1X1+b2X2+...+bnXn+ϵ
회귀 식의 해석
회귀 식을 통해 데이터에서 관찰되는 관계의 강도와 방향을 이해할 수 있다.
예를 들어, 기울기 b의 값이 양수이면 x와 y가 양의 관계를 가진다는 것을 의미하며, 값이 클수록 관계가 강해진다. 반대로 b가 음수면 음의 관계를 나타낸디. 회귀 식은 또한 예측 목적으로 사용된다. 독립 변수 X의 새로운 값을 식에 대입하여, 해당하는 종속 변수 Y의 예상 값을 계산할 수 있다.
회귀 모델을 적용하기 전에 검토하고, 필요한 경우 조정하거나 다른 분석 방법을 고려해야한다. 데이터가 이러한 가정을 충족하지 않을 경우, 변환을 적용하거나 다른 종류의 회귀 모델을 사용하는 것을 고려할 수 있다.
종속변수(가격, 무게 등)와 독립변수(시간, 온도 등) 사이에는 직선과 같은 관계가 있어야 한다. 즉, 한 변수가 변할 때 다른 변수도 예측 가능한 방식으로 변해야한다.
-> 이 가정이 충족되지 않으면, 회귀 모델은 실제 데이터의 패턴을 잘못 해석할 수 있다.
모델의 예측과 실제 값 사이의 차이(오차)가 서로 영향을 주지 않아야 한다. 예를 들어, 오늘의 오차가 내일의 오차에 영향을 주면 안된다.
-> 오차가 서로 관련되어 있으면, 모델이 특정 패턴이나 추세를 놓칠 수 있다.
오차는 '정규 분포'를 따라야 한다. 즉, 오차가 특정한 '종모양'의 패턴을 보여야한다.
-> 이 가정을 통해 통계적 추정과 검정이 더 정확하고 신뢰할 수 있게 된다.
오차의 크기가 독립변수의 값에 관계없이 일정해야한다. 즉, 독립변수가 어떤 값이든 오차의 분산이 같아야 한다.
-> 이 가정이 위반된다면, 모델이 데이터의 일부 영역에서는 잘 작동하지만 다른 영역에서는 잘 작동하지 않을 수 있다.
독립 변수들이 서로 너무 강하게 연과되어 있지 않아야한다. 즉, 하나의 독립 변수가 다른 독립 변수를 예측하는데 사용되지 않아야한다.
-> 다중공선성이 높으면, 어떤 독립 변수가 종속 변수에 영향을 미치는지 정확하게 파악하기 어렵다.
결정 계수
R-제곱은 모델이 데이터의 변동성을 얼마나 잘 설명하는지를 나타내는 지표이다.
값은 0과 1사이에서 변하며, 1에 가까울수록 모델이 데이터를 더 잘 설명한다는 의미
하지만, 무조건 높은 R-제곱이 좋은 모델을 의미하지는 않으며, 과적합의 가능성도 고려해야한다.
조정된 결정 계수
독립 변수의 수가 증가할 때 R-제곱의 증가를 보장한다
독립 변수의 수를 고려하여 R-제곱을 조정한 값으로, 불필요한 변수가 모델에 추가될 때 패널티를 부여
표준오차
회귀선과 실제 데이터 포인트 간의 평균거리를 나타낸ㄷ
표준오차가 작을수록 모델의 예측이 실제 값에 더 가깝다는 의미
F-통계량
모델의 전체 유의성을 평가한다
F-통계량이 크고, 관련P-값이 작을수록 모델이 통계적으로 유의미하다고 간주된다.
AIC 및 BIC
모델의 복잡성과 적합도를 함께 고려하는 지표이다
값이 작을수록 저 돟은 모델로 평가
이 검정의 주요 목적은 회귀 모델에서 각 독립변수가 종속 변수에 미치는 영향이 통계적으로 유의미한디를 평가하는 것이다. 구체적으로 다음과 같은 이유로 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
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)