저번 포스팅 에서 머신러닝에 대해서 공부해 보았다. 회귀 분석은 머신러닝(지도학습)에 포함되는 개념이라고 볼 수 있다.
회귀분석에는 선형 회귀, 로지스틱 회귀, 다항 회귀, 릿지& 라쏘 회귀, ElasticNet 회귀, 시계열회귀, 베이지안 회귀 등이 있다. 요번 포스팅에서는 선형 회귀에 대해 알아보려고 한다.
선형 회귀 분석이란? 관찰된 데이터를 기반으로 두 변수 간의 관계를 모델링하는 통계적 기법 중 하나이다. 이는 종속 변수(예측하고자 하는 변수)와 하나 이상의 독립 변수(예측에 사용되는 변수) 간의 선형 관계를 설명하고 예측하는 데 사용된다.
1. 선형 관계
- 선형 회귀는 독립 변수와 종속 변수 간의 관계를 직선 형태로 모델링하는 것이다.
- 단일 선형 회귀는 하나의 독립 변수로 종속 변수를 예측하는 반면, 다중 선형 회귀는 여러 독립 변수로 종속 변수를 예측한다.
2. 회귀식- 모델을 표현하는 방정식으로, 일반적으로 독립 변수들과 그에 상응하는 계수들로 표현된다.
- 단순 선형 회귀의 경우, 식은 y = ax + b 형태이다.
- 중학교 때 배웠던 직선의 방적이다. a는 절편, b는 기울기이다.- 다중 선형 회귀의 경우, 식은 y = b0 + b1x1 + b2x2 + ... + bn*xn 형태이다.
- 가장 합리적인 추세선이란? 오차의 제곱이 최소화되는 추세선이다.
3. 최소제곱법
최소제곱법(Least Squares Method)은 회귀 분석에서 사용되는 주요 기법 중 하나이다. 최소제곱법은 추세선을 구하기 위해 사용되는 방법이라고 할 수 있다. 회귀선(또는 모델)을 생성할 때 실제 데이터와 모델로 예측한 값 사이의 잔차(오차)의 제곱을 최소화하여 최적의 모델을 찾는 것을 목표로 한다.
이 방법을 영어로 OLS(Ordinary Least Square)라고도 한다.
실제 값 - 예측 값
선형 회귀 분석은 몇 가지 가정에 기반하여 데이터에 대한 모델링을 시도한다. 이러한 가정들이 만족되어야 회귀 분석 결과가 신뢰할 만한 것으로 간주된다.
1. 선형성
2. 정규성
3. 독립성
4. 등분산성
5. 다중공선성
단순 선형 회귀는 개념을 이해하기 쉽고 해석하기 쉽지만, 현실 세계의 많은 경우에는 다중 선형 회귀를 사용하여 복잡한 관계를 더 잘 설명할 수 있다.
선형 회귀 분석을 지원하는 python 라이브러리는 많지만, 나는 이중 두가지에 대해 설명하고 예시 코드를 리뷰하려고 한다.
ols는 statsmodels 라이브러리에 있는 방법이다. ols는 선형 회귀의 기초를 형성하며, 회귀 분석에서 주로 사용되는 방법중 하나이다. ols를 사용하면 통계적인 요소들(계수의 유의성, 모델의 적합성 등)을 포함한 선형 회귀 분석 결과를 쉽게 얻을 수 있다. ols는 주어진 데이터에 대한 선형 회귀 모델을 적합시키는 방법 중 하나로, 가장 일반적으로 사용되며 직관적으로 이해하기 쉽다.
import numpy as np
import statsmodels.api as sm
# 예제 데이터 생성
np.random.seed(0)
X = np.random.rand(100, 1) # 독립 변수
y = 2 * X.squeeze() + np.random.normal(size=100) # 종속 변수
# 상수항 추가
X = sm.add_constant(X)
# OLS 모델 생성 및 피팅
model = sm.OLS(y, X).fit()
# 모델 요약 정보 출력
print(model.summary())
numpy
를 사용하여 랜덤한 독립 변수 X
와 그에 해당하는 종속 변수 y
를 생성한다.add_constant
함수를 사용하여 독립 변수에 상수항(절편)을 추가힌다.statsmodels
의 OLS
함수를 사용하여 X
와 y
를 이용해 OLS 모델을 생성한다.fit
함수를 사용하여 모델을 피팅(적합)한다.summary
메서드를 사용하여 모델 요약 정보를 출력한다.이 코드를 실행하면, OLS에 의해 추정된 회귀 모델의 요약 정보(summary)가 출력된다. 이 정보에는 모델의 R-squared(결정 계수), 회귀 계수(coefficient), p-value 등이 포함된다. 이를 통해 모델의 적합성과 변수들 간의 관계에 대한 정보를 확인할 수 있다.
(이에 대한 자세한 설명은 다음 포스팅에서 하도록 하겠다.) -> ols summary 자세히 보기
scikit-learn은 머신러닝을 위한 가장 널리 사용되는 라이브러리 중 하나이다. 선형 회귀뿐만 아니라 다양한 머신러닝 모델을 제공한다. sklearn.linear_model.LinearRegression은 선형 회귀를 수행하는 클래스입니다. 이외에도 Ridge, Lasso 등의 변형된 회귀 모델도 지원한다.
ols와 명확하게 다른 점 하나는 cikit-learn은 summary를 제공하지 않는다는 점이다.
from sklearn.linear_model import LinearRegression
from sklearn.datasets import make_regression
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error, r2_score
import matplotlib.pyplot as plt
# 데이터 생성 (가상 데이터)
X, y = make_regression(n_samples=100, n_features=1, noise=10, random_state=42)
# 데이터 분할 (학습용 데이터와 테스트용 데이터)
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)
# 성능 측정 (MSE 및 R-squared)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
# 결과 출력
print(f"Mean Squared Error (MSE): {mse}")
print(f"R-squared (R2): {r2}")
# 시각화
plt.scatter(X_test, y_test, color='black')
plt.plot(X_test, y_pred, color='blue', linewidth=3)
plt.show()
make_regression
함수를 사용하여 가상의 회귀용 데이터를 생성한다.train_test_split
함수로 데이터를 학습용과 테스트용으로 분할한다. 여기선 train 80%, test 20%의 비율로 분할하였다.LinearRegression
클래스를 사용하여 선형 회귀 모델을 생성하고, fit
메서드로 학습 데이터에 모델을 적합시킨다.mean_squared_error
및 r2_score
를 통해 모델의 성능을 측정한다.기본 가정은 위에서 설명한 가정 다섯 가지인 선형성, 정규성, 독립성 , 등분산성 , 다중공선성을 말한다.
회귀 분석의 기본 가정을 확인하기 위해 일반적으로 다양한 방법과 통계적 도구를 사용합니다. 여기에는 회귀 모델의 적합성을 검증하고 가정을 충족하는지 확인하는 다양한 방법이 있습니다. 아래의 코드는 Python을 사용하여 회귀 모델의 기본 가정을 확인하는 방법을 보여줍니다.
import statsmodels.api as sm
import numpy as np
import matplotlib.pyplot as plt
# 임의의 데이터 생성
np.random.seed(0)
X = np.random.rand(100, 1) # 독립 변수
y = 2 * X.squeeze() + np.random.randn(100) # 종속 변수 (잡음 추가)
# 선형 회귀 모델 적합
X_with_const = sm.add_constant(X) # 절편 추가
model = sm.OLS(y, X_with_const).fit()
# 기본 가정 확인
# 1. 선형성 확인
plt.scatter(X, y)
plt.plot(X, model.predict(X_with_const), color='red') # 적합된 선형 모델 그래프
plt.title('선형성 확인')
plt.xlabel('독립 변수')
plt.ylabel('종속 변수')
plt.show()
# 2. 정규성 확인 (잔차의 정규성 확인)
residuals = model.resid
sm.qqplot(residuals, line='s')
plt.title('잔차의 정규성 확인')
plt.show()
# 3. 독립성 확인 (잔차의 자기상관 확인)
sm.graphics.tsa.plot_acf(residuals, lags=30)
plt.title('잔차의 자기상관 확인')
plt.show()
# 4. 등분산성 확인 (잔차의 등분산성 확인)
plt.scatter(model.fittedvalues, residuals)
plt.xlabel('적합된 값')
plt.ylabel('잔차')
plt.title('잔차의 등분산성 확인')
plt.show()
# 5. 다중공선성 확인 (VIF를 통한 다중공선성 확인)
from statsmodels.stats.outliers_influence import variance_inflation_factor
vif = [variance_inflation_factor(X_with_const.values, i) for i in range(X_with_const.shape[1])]
print('다중공선성 (VIF):', vif)
최소제곱법 이미지 : https://thebook.io/080289/0117/