areum

[ML] Linear Regression(선형 회귀) 본문

Programming/Machine Learning

[ML] Linear Regression(선형 회귀)

armmy 2023. 3. 24. 10:27
728x90

선형 회귀 정의


선형회귀란 종속 변수 Y와 1개 이상의 독립변수 X와의 선형 상관관계를 모델링하는 회귀분석 기법입니다. 

독립변수의 개수가 1개인 경우 단순 선형 회귀라고 하며, 독립변수가 2개 이상인 경우는 다중 선형 회귀라고 합니다.

오늘 분석할 내용은 독립변수가 1개인 단순 선형 회귀입니다.

 

연령별 혈압 예측하기


1. 기본적으로 사용하는 패키지와 CSV파일을 불러옵니다.

     (CSV파일의 출처는 제공해드리지 못하는점 양해부탁드립니다 ㅠ)

from sklearn.linear_model import LinearRegression
import pandas as pd
import numpy as np
from sklearn.datasets import make_regression
import statsmodels.api as sm
import matplotlib.pyplot as plt

df = pd.read_csv("Age_SBP.csv")

2. plot을 통해 연령대별 혈압이 어떠한지 파악해보도록 하겠습니다.

X = df["AGE"]
y = df["VITALSBP"]
plt.plot(X, y, 'o')

3. statsmodels(OLS)

model = sm.OLS.from_formula("y ~ X", data=df)
result = model.fit()
print(result.summary())

 

 OLS회귀분석 결과 해석

 

분석결과 해석
No. Observations Number of observations, 관찰표본 수, 즉 총 표본 수
Df Residuals 잔차의 자유도, 젠체 표본 수에서 측정되는 변수들(종속변수 및 독립변수)의 개수를 뺀 것
Df Residuals = 표본수 - (종속변수 개수 + 독립변수 개수)
Df Model 독립변수의 개수
R-squared 결정계수, 전체 데이터 중 해당 회귀모델이 설명할 수 있는 데이터의 비율, 회귀식의 설명력
1에 가까울수록 성능이 좋다.
Adj. R-squared 모델에 도움이 되는 데이터에 따라 조정된 결정 계수
F-statistic F통계량으로 도출된 회귀식이 적절한지 파악할 수 있다. 
0과 가까울수록 적정한 것.
Prob (F-statistic) 회귀식이 유의미한지 판단.
0.05이하일 경우 변수끼리 매우 관련있다고 판단.
AIC
표본의 개수와 모델의 복잡성을 기반으로 모델을 평가
수치가 낮을수록 좋음
BIC
AIC와 유사하나 패널티를 부여하여 AIC보다 모델 평가 성능이 더 좋다.
수치가 낮을수록 좋음
coef 회귀계수
std err 계수 추정치의 표준오차
값이 작을수록 좋음
t t-test, 독립변수와 종속병수 사이의 상관관계
값이 클수록 상관도가 높음
P>|t| 독립변수들의 유의 확룰
0.05보다 작아야 유의미함
[0.025 0.975] 회귀 계수의 신뢰 구간
Omnibus 디아코스티노 검정, 비대칭도와 첨도를 결합한 정규성 테스트
값이 클 수록 정규분포에 따름
Prob(Omnibus) 디아코스티노 검정이 유의한지 판단
0.05보다 작아야 유의미함
Skew 왜도, 평균 주위의 잔차들의 대칭하는지를 보는 것
0에 가까울수록 대칭
Kurtosis 첨도, 잔차들의 분포 모양
3에 가까울수록 정규분포
Durbin-Watson 더빈왓슨 정규성 검정이며, 잔차의 독립성 여부를 판단
1.5 ~ 2.5사이일때 잔차는 독립적이라고 판단, 0이나 4에 가까울수록 잔차들은 자기상관을 가지고 있다고 판단
Jarque-Bera (JB) 자크베라 정규성 검정
값이 클 수록 정규분포의 데이터를 사용했다는 것.
Cond. No. 다중공선성 검정. 독립변수간 상관관계가 있는지 보는 것
10이상이면 다중공선성이 있다고 판단

4. 수치 검증해보기

print("TSS = ", result.uncentered_tss)
print("ESS = ", result.mse_model)
print("RSS = ", result.ssr)
print("ESS + RSS = ", result.mse_model + result.ssr)
print("R squared = ", result.rsquared)