Python에서 ols 회귀를 수행하는 방법(예제 포함)


OLS(Ordinary Least Square) 회귀는 하나 이상의 예측 변수와 반응 변수 간의 관계를 가장 잘 설명하는 선을 찾을 수 있는 방법입니다.

이 방법을 사용하면 다음 방정식을 찾을 수 있습니다.

ŷ = b0 + b1x

금:

  • ŷ : 예상된 반응값
  • b 0 : 회귀선의 원점
  • b 1 : 회귀선의 기울기

이 방정식은 예측변수와 반응변수 사이의 관계를 이해하는 데 도움이 될 수 있으며, 예측변수의 값이 주어졌을 때 반응변수의 값을 예측하는 데 사용될 수 있습니다.

다음 단계별 예제에서는 Python에서 OLS 회귀를 수행하는 방법을 보여줍니다.

1단계: 데이터 생성

이 예에서는 학생 15명에 대해 다음 두 변수가 포함된 데이터세트를 만듭니다.

  • 총 학습 시간
  • 시험 결과

시간을 예측 변수로 사용하고 시험 점수를 응답 변수로 사용하여 OLS 회귀를 수행합니다.

다음 코드는 Pandas에서 이 가짜 데이터세트를 만드는 방법을 보여줍니다.

 import pandas as pd

#createDataFrame
df = pd. DataFrame ({' hours ': [1, 2, 4, 5, 5, 6, 6, 7, 8, 10, 11, 11, 12, 12, 14],
                   ' score ': [64, 66, 76, 73, 74, 81, 83, 82, 80, 88, 84, 82, 91, 93, 89]})

#view DataFrame
print (df)

    hours score
0 1 64
1 2 66
2 4 76
3 5 73
4 5 74
5 6 81
6 6 83
7 7 82
8 8 80
9 10 88
10 11 84
11 11 82
12 12 91
13 12 93
14 14 89

2단계: OLS 회귀 수행

다음으로, statsmodels 모듈의 함수를 사용하여 시간을 예측 변수로 사용하고 점수를 응답 변수로 사용하여 OLS 회귀를 수행할 수 있습니다.

 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
model = sm. OLS (y,x). fit ()

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

                            OLS Regression Results                            
==================================================== ============================
Dept. Variable: R-squared score: 0.831
Model: OLS Adj. R-squared: 0.818
Method: Least Squares F-statistic: 63.91
Date: Fri, 26 Aug 2022 Prob (F-statistic): 2.25e-06
Time: 10:42:24 Log-Likelihood: -39,594
No. Observations: 15 AIC: 83.19
Df Residuals: 13 BIC: 84.60
Model: 1                                         
Covariance Type: non-robust                                         
==================================================== ============================
                 coef std err t P>|t| [0.025 0.975]
-------------------------------------------------- ----------------------------
const 65.3340 2.106 31.023 0.000 60.784 69.884
hours 1.9824 0.248 7.995 0.000 1.447 2.518
==================================================== ============================
Omnibus: 4,351 Durbin-Watson: 1,677
Prob(Omnibus): 0.114 Jarque-Bera (JB): 1.329
Skew: 0.092 Prob(JB): 0.515
Kurtosis: 1.554 Cond. No. 19.2
==================================================== ============================

coef 열에서 회귀 계수를 확인하고 다음과 같은 적합 회귀 방정식을 작성할 수 있습니다.

점수 = 65.334 + 1.9824*(시간)

이는 공부한 시간이 추가될 때마다 평균 시험 점수가 1.9824 점 증가한다는 것을 의미합니다.

원래 값 65,334 는 0시간 동안 공부하는 학생의 평균 예상 시험 점수를 나타냅니다.

또한 이 방정식을 사용하여 학생이 공부하는 시간을 기준으로 예상 시험 점수를 찾을 수도 있습니다.

예를 들어, 10시간 동안 공부한 학생은 시험 점수 85.158 을 획득해야 합니다.

점수 = 65.334 + 1.9824*(10) = 85.158

모델 요약의 나머지 부분을 해석하는 방법은 다음과 같습니다.

  • P(>|t|): 모델 계수와 연관된 p 값입니다. 시간 에 대한 p-값(0.000)이 0.05보다 작으므로 시간점수 사이에 통계적으로 유의미한 연관성이 있다고 말할 수 있습니다.
  • R-제곱: 시험 점수의 변동 비율이 공부한 시간에 따라 설명될 수 있음을 나타냅니다. 이 경우 점수 변동의 83.1%가 공부 시간으로 설명될 수 있습니다.
  • F-통계량 및 p-값: F-통계량( 63.91 )과 해당 p-값( 2.25e-06 )은 회귀 모델의 전반적인 중요성, 즉 모델의 예측 변수가 변동을 설명하는 데 유용한지 여부를 알려줍니다. 응답 변수에서. 이 예의 p-값은 0.05 미만이므로 모델이 통계적으로 유의미하며 시간은 점수 변화를 설명하는 데 유용한 것으로 간주됩니다.

3단계: 가장 적합한 선 시각화

마지막으로 matplotlib 데이터 시각화 패키지를 사용하여 실제 데이터 포인트에 맞는 회귀선을 시각화할 수 있습니다.

 import matplotlib. pyplot as plt

#find line of best fit
a, b = np. polyfit (df[' hours '], df[' score '], 1 )

#add points to plot
plt. scatter (df[' hours '], df[' score '], color=' purple ')

#add line of best fit to plot
plt. plot (df[' hours '], a*df[' hours ']+b)

#add fitted regression equation to plot
plt. text ( 1 , 90 , 'y = ' + '{:.3f}'.format(b) + ' + {:.3f}'.format(a) + 'x', size= 12 )

#add axis labels
plt. xlabel (' Hours Studied ')
plt. ylabel (' Exam Score ')

보라색 점은 실제 데이터 포인트를 나타내고 파란색 선은 적합 회귀선을 나타냅니다.

또한 plt.text() 함수를 사용하여 플롯의 왼쪽 상단에 적합한 회귀 방정식을 추가했습니다.

그래프를 보면 적합 회귀선이 시간 변수와 점수 변수 간의 관계를 매우 잘 포착하고 있는 것으로 보입니다.

추가 리소스

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

Python에서 로지스틱 회귀를 수행하는 방법
Python에서 지수 회귀를 수행하는 방법
Python에서 회귀 모델의 AIC를 계산하는 방법

의견을 추가하다

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