Python에서 가중치 최소 제곱 회귀를 수행하는 방법


선형 회귀 분석의 주요 가정 중 하나는 잔차가 예측 변수의 각 수준에서 등분산으로 분포된다는 것입니다. 이 가정을 등분산성(homoscedasticity) 이라고 합니다.

이 가정이 존중되지 않으면 잔차에 이분산성이 존재한다고 합니다. 이런 일이 발생하면 회귀 결과를 신뢰할 수 없게 됩니다.

이 문제를 해결하는 한 가지 방법은 가중치 최소 제곱 회귀를 사용하는 것입니다. 이는 오류 분산이 낮은 관측치 가 오류 분산이 큰 관측치에 비해 더 많은 정보를 포함하기 때문에 더 많은 가중치를 받도록 관측치에 가중치를 할당하는 것입니다.

이 튜토리얼에서는 Python에서 가중치 최소 제곱 회귀를 수행하는 방법에 대한 단계별 예를 제공합니다.

1단계: 데이터 생성

먼저, 수업 시간에 16명의 학생이 공부한 시간과 최종 시험 성적에 대한 정보가 포함된 다음 pandas DataFrame을 만들어 보겠습니다.

 import pandas as pd

#createDataFrame
df = pd. DataFrame ({' hours ': [1, 1, 2, 2, 2, 3, 4, 4, 4, 5, 5, 5, 6, 6, 7, 8],
                   ' score ': [48, 78, 72, 70, 66, 92, 93, 75, 75, 80, 95, 97,
                             90, 96, 99, 99]})

#view first five rows of DataFrame
print ( df.head ())

   hours score
0 1 48
1 1 78
2 2 72
3 2 70
4 2 66

2단계: 단순 선형 회귀 모델 피팅

다음으로, statsmodels 모듈의 함수를 사용하여 시간을 예측 변수로 사용하고 점수를 응답 변수로 사용하여 간단한 선형 회귀 모델을 피팅합니다.

 import statsmodels.api as sm

#define predictor and response variables
y = df[' score ']
X = df[' hours ']

#add constant to predictor variables
X = sm. add_constant (x)

#fit linear regression model
fit = sm. OLS (y,x). fit ()

#view model summary
print ( fit.summary ())

                            OLS Regression Results                            
==================================================== ============================
Dept. Variable: R-squared score: 0.630
Model: OLS Adj. R-squared: 0.603
Method: Least Squares F-statistic: 23.80
Date: Mon, 31 Oct 2022 Prob (F-statistic): 0.000244
Time: 11:19:54 Log-Likelihood: -57.184
No. Observations: 16 AIC: 118.4
Df Residuals: 14 BIC: 119.9
Model: 1                                         
Covariance Type: non-robust                                         
==================================================== ============================
                 coef std err t P>|t| [0.025 0.975]
-------------------------------------------------- ----------------------------
const 60.4669 5.128 11.791 0.000 49.468 71.465
hours 5.5005 1.127 4.879 0.000 3.082 7.919
==================================================== ============================
Omnibus: 0.041 Durbin-Watson: 1.910
Prob(Omnibus): 0.980 Jarque-Bera (JB): 0.268
Skew: -0.010 Prob(JB): 0.875
Kurtosis: 2.366 Cond. No. 10.5

모델 요약에서 모델의 R 제곱 값이 0.630 임을 알 수 있습니다.

관련 항목: 좋은 R 제곱 값이란 무엇입니까?

3단계: 가중치 최소제곱 모델 피팅

다음으로, statsmodels WLS() 함수를 사용하여 분산이 낮은 관측값이 더 많은 가중치를 받도록 가중치를 설정하여 가중치 최소 제곱을 수행할 수 있습니다.

 #define weights to use
wt = 1/smf. ols (' fit.resid.abs() ~ fit.fittedvalues ', data=df). fit (). fitted values **2

#fit weighted least squares regression model
fit_wls = sm. WLS (y, X, weights=wt). fit ()

#view summary of weighted least squares regression model
print ( fit_wls.summary ())

                            WLS Regression Results                            
==================================================== ============================
Dept. Variable: R-squared score: 0.676
Model: WLS Adj. R-squared: 0.653
Method: Least Squares F-statistic: 29.24
Date: Mon, 31 Oct 2022 Prob (F-statistic): 9.24e-05
Time: 11:20:10 Log-Likelihood: -55.074
No. Comments: 16 AIC: 114.1
Df Residuals: 14 BIC: 115.7
Model: 1                                         
Covariance Type: non-robust                                         
==================================================== ============================
                 coef std err t P>|t| [0.025 0.975]
-------------------------------------------------- ----------------------------
const 63.9689 5.159 12.400 0.000 52.905 75.033
hours 4.7091 0.871 5.407 0.000 2.841 6.577
==================================================== ============================
Omnibus: 2,482 Durbin-Watson: 1,786
Prob(Omnibus): 0.289 Jarque-Bera (JB): 1.058
Skew: 0.029 Prob(JB): 0.589
Kurtosis: 1.742 Cond. No. 17.6
==================================================== ============================

결과에서 이 가중치 최소 제곱 모델의 R 제곱 값이 0.676 으로 증가한 것을 확인할 수 있습니다.

이는 가중 최소 제곱 모델이 단순 선형 회귀 모델보다 시험 점수의 변동을 더 많이 설명할 수 있음을 나타냅니다.

이는 가중 최소 제곱 모델이 단순 선형 회귀 모델에 비해 데이터에 더 잘 맞는다는 것을 알려줍니다.

추가 리소스

다음 튜토리얼에서는 Python에서 다른 일반적인 작업을 수행하는 방법을 설명합니다.

Python에서 잔차 플롯을 만드는 방법
Python에서 QQ 플롯을 만드는 방법
Python에서 다중 공선성을 테스트하는 방법

의견을 추가하다

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