programming/파이썬으로 배우는 통계학

[파이썬/통계] Python 통계 : 정규 선형모델 /연속형 독립변수가 하나인 모델(단순회귀)

Jofresh 2023. 5. 16. 17:20
728x90
반응형

 

필요한 라이브러리 임포트

# 수치 계산에 사용하는 라이브러리
import numpy as np
import pandas as pd
import scipy as sp
from scipy import stats

# 그래프를 그리는 라이브러리
from matplotlib import pyplot as plt
import seaborn as sns
sns.set()

# 통계 모델을 추정하는 라이브러리(워크닝이 나올 수도 있습니다)
import statsmodels.formula.api as smf
import statsmodels.api as sm

# 표시 자릿수 지정
%precision 3
# 그래프를 jupyter Notebook 내에 표시하도록 하기 위한 지정
%matplotlib inline

데이터 가져오기

beer = pd.read_csv("5-1-1-beer.csv")
print(beer.head())

5-1-1-beer.csv
0.00MB

- 이번 분석 데이터는 가공의 맥주 매상 데이터입니다.

 

산포도로 본 기온와 맥주 매상의 관계

seaborn 라이브러리의 jointplot 함수를 사용하여 "temperature"과 "beer" 변수 간의 관계를 시각화하는 것입니다.

jointplot 함수는 두 변수 간의 관계를 표현하는 그래프를 생성합니다. "temperature"을 x축에, "beer"를 y축에 배치하고, 데이터는 "beer" 데이터프레임에서 가져오도록 지정합니다. 그래프의 색상은 "black"으로 설정됩니다.

jointplot 함수를 실행하면 주어진 데이터에 대한 산점도와 히스토그램이 함께 표시되는 그래프가 생성됩니다. 이를 통해 "temperature"과 "beer" 변수 간의 상관 관계, 분포 등을 시각적으로 파악할 수 있습니다.

 

statsmodels에 의한 모델링

 

아래 코드는 statsmodels 라이브러리의 ols 함수를 사용하여 선형 회귀 모델을 적합하는 것입니다.

ols 함수는 최소자승법(Ordinary Least Squares)을 이용하여 선형 회귀 모델을 적합하는 함수입니다. 주어진 데이터인 "beer" 데이터프레임에서 "beer"를 종속변수로, "temperature"을 독립변수로 설정하여 선형 회귀 모델을 구축합니다.

formula 매개변수를 통해 종속변수와 독립변수의 관계를 지정합니다. "beer ~ temperature"은 "beer"가 "temperature"에 종속되는 선형 관계임을 의미합니다.

data 매개변수를 통해 모델링에 사용할 데이터를 지정합니다. 이 경우 "beer" 데이터프레임을 사용합니다.

.fit() 메서드를 호출하여 모델을 데이터에 적합시킵니다. 이렇게 하면 선형 회귀 모델이 생성되고, lm_model 변수에 저장됩니다.

lm_model을 통해 생성된 선형 회귀 모델은 데이터를 기반으로 최적화된 회귀 계수, 절편 등의 정보를 포함하고 있습니다. 이를 통해 모델의 예측, 변수의 중요도 평가, 가설 검정 등을 수행할 수 있습니다.

 

추정 결과 표시와 계수 검정

lm_model.summary() 코드는 statsmodels의 선형 회귀 모델 결과를 요약하여 출력하는 것입니다.

출력 결과는 OLS(Ordinary Least Squares) 회귀 분석 결과를 보여줍니다. 이 결과를 통해 모델의 적합성, 계수의 유의성, 설명력 등을 확인할 수 있습니다. 아래는 출력 결과의 주요 항목들입니다:

Dep. Variable: 종속 변수의 이름입니다.

 


R-squared: 결정 계수(R-squared)는 모델이 종속 변수의 변동성을 얼마나 잘 설명하는지를 나타내는 지표입니다. 0부터 1까지의 값을 가지며, 높을수록 모델이 데이터를 잘 설명한다고 할 수 있습니다.

 


Adj. R-squared: 조정된 결정 계수(Adjusted R-squared)는 독립 변수의 수와 데이터의 크기에 따른 편향을 보정한 결정 계수입니다. 모델의 복잡성을 고려한 적합성 지표입니다.

 


F-statistic: F-통계량은 모델이 유의하게 종속 변수를 설명하는지를 나타내는 지표입니다. 클수록 모델이 유의미하다고 할 수 있습니다.

 


Prob (F-statistic): F-통계량의 유의 확률입니다. 작은 값일수록 모델이 유의미하다고 할 수 있습니다.

 


coef: 독립 변수의 회귀 계수(coefficient)와 해당 계수의 표준 오차(std err)입니다. 각 독립 변수의 중요도와 유의성을 평가하는 데 사용됩니다.

 


t: 독립 변수의 t-통계량(t-statistic)입니다. 계수의 유의성을 평가하는 지표로, 절댓값이 크면 해당 계수가 유의미하다고 할 수 있습니다.

 


P>|t|: t-통계량의 유의 확률입니다. 작은 값일수록 해당 계수가 유의미하다고 할 수 있습니다.

 


[0.025, 0.975]: 회귀 계수의 신뢰 구간(confidence interval)입니다. 보통 95% 신뢰 구간이 제공됩니다.

 


AIC, BIC: 정보 기준(Akaike Information Criterion, Bayesian Information Criterion)은 모델의 복잡도와 적합성을 평가하는 지표입니다. 낮을수록 모델이 더 적합하다고 할 수 있습니다.

- 해석

기온에 대한 계수(coef)는 유의미하게 0과 다르다고 판단할 수 있습니다. 기온이 맥주 매상에 영향을 끼친다는 것을 알 수 있습니다. 기온이 오르면 좋을지 내려가면 좋을지는 계수(coef)값을 보면 알 수 있습니다. 이 값이 0.7654로 양수이므로 기온이 오르면 맥주 매상이 오른다고 판단할 수 있습니다.

이 정도의 해석은 산포도를 본 시점에서 어느정도 알 수 있습니다. 하지만 독립변수가 많아지는 등 복잡한 모델이 되는 경우에는 모델을 구축하고 그 계수를 보는 편이 해석하기 쉽습니다.

 

AIC를 이용한 모델 선택

 

마지막 AIC 코드는 AIC(Akaike Information Criterion) 값을 계산하는 방법 중 하나입니다. AIC는 통계 모델의 적합도와 복잡도를 평가하는 지표입니다.

AIC는 아래의 식을 사용하여 계산됩니다:

AIC = -2 * (log-likelihood - (파라미터 개수 + 1))

여기서 log-likelihood는 모델의 로그 우도입니다. lm_model.llf는 선형 회귀 모델 lm_model에서 추정된 로그 우도 값을 나타냅니다. lm_model.df_model은 모델의 파라미터 개수를 나타내는 자유도입니다.

따라서 주어진 코드는 -2 * (lm_model.llf - (lm_model.df_model + 1))을 계산하여 선형 회귀 모델의 AIC 값을 구하는 것입니다. AIC 값이 낮을수록 모델이 더 적합하다고 해석할 수 있습니다.

 

seaborn을 이용한 회귀직선 그래프

회귀직선은 모델에 의한 종속변수의 추측값을 직선으로 표시한 것입니다. 종속변수가 연속형 변수일 경우에는 전통적으로 회귀라고 부르기 때문에 회귀라는 이름을 사용했습니다. 비선형모델의 경우에는 회귀곡선이라고도 부릅니다.

 

아래 그래프는 산포도에 회귀직선을 덧그린 그래프입니다. 

 

모델을 이용한 예측

모델의 계수를 추정할 수 있으므로 이를 사용하면 예측을 할 수 있습니다. 이를 위해 추정된 모델에 predict함수를 적용합니다.

 

- 온도가 높을 때 기대값이 더 높습니다. (0도 vs 20도)

그리고 predict 함수를 사용하지 않고 예측해도 기대값은 동일한 것을 알 수 있습니다!

 

잔차 계산

마지막으로 모델의 평가 방법을 설명하겠습니다. 모델의 평가는 주로 잔차를 체크해서 합니다. 정규선형모델의 경우에는 잔차가 '평균이 0인 정규분포'를 따르는 것이므로 모델이 그 분포를 따르고 있는지 체크하게 됩니다. 잔차는 다음과 같이 계산해서 얻을 수 있습니다.

 

결정 계수

summary 함수의 출력에 있는 R-squared는 결정 계수라 불리는 지표입니다. 결정계수는 가지고 있는 데이터에 대해 모델을 적용했을 때의 적합도를 평가하는 지표입니다.

 

모델에 의한 추측치가 종속변수의 실제값과 일치하면 R제곱은 1이됩니다.

위 코드는 결정 계수(Coefficient of Determination)를 계산하는 방법 중 하나입니다. 결정 계수는 모델이 종속 변수의 변동성을 얼마나 잘 설명하는지를 나타내는 지표입니다.

결정 계수는 아래의 식을 사용하여 계산됩니다:

결정 계수 = 설명된 변동의 제곱합 / 총 변동의 제곱합

여기서 설명된 변동의 제곱합은 모델로부터 예측된 값과 평균값 간의 제곱합을 나타내며, 총 변동의 제곱합은 실제 값과 평균값 간의 제곱합을 나타냅니다.

주어진 코드에서 mu는 "beer" 변수의 평균을 나타내고, y는 실제 "beer" 값들을 나타냅니다. lm_model.predict()를 통해 선형 회귀 모델로부터 예측된 값들을 yhat에 저장합니다.

따라서 첫번째 코드는 (sp.sum((yhat - mu)**2)) / (sp.sum((y - mu)**2))을 계산하여 선형 회귀 모델의 결정 계수를 구하는 것입니다. 결정 계수는 0과 1 사이의 값을 가지며, 1에 가까울수록 모델이 종속 변수를 잘 설명한다고 해석할 수 있습니다.

 

잔차 그래프

위 코드는 선형 회귀 모델의 잔차(residuals)에 대한 시각화를 수행하는 것입니다.

첫 번째 코드인 sns.distplot(resid, color='black')은 잔차의 분포를 히스토그램으로 나타내는 코드입니다. resid는 선형 회귀 모델의 잔차를 나타내는 변수입니다. sns.distplot 함수를 사용하여 잔차의 분포를 시각화하고, color='black'로 지정하여 검은색으로 표시합니다.

두 번째 코드인 sns.jointplot(lm_model.fittedvalues, resid, joint_kws={"color": "black"}, marginal_kws={"color": "black"})은 모델 예측값과 잔차의 관계를 나타내는 코드입니다. lm_model.fittedvalues는 선형 회귀 모델로부터 예측된 종속 변수의 값입니다. resid는 잔차를 나타내는 변수입니다. sns.jointplot 함수를 사용하여 예측값과 잔차의 산점도를 표시하고, joint_kws와 marginal_kws를 사용하여 그래프의 색상을 검은색으로 지정합니다.

이렇게 시각화된 히스토그램과 산점도를 통해 잔차의 분포와 모델의 적합도를 확인할 수 있습니다. 히스토그램은 잔차의 분포를 보여주며, 산점도는 예측값과 잔차 간의 관계를 시각화하여 모델의 적합성을 평가할 수 있습니다.

 

Q-Q플롯

위 코드는 잔차(residuals)의 정규성을 검사하기 위해 QQ plot을 그리는 것입니다.

sm.qqplot(resid, line="s") 코드는 statsmodels 패키지의 qqplot 함수를 사용하여 잔차의 QQ plot을 그리는 것입니다. resid는 선형 회귀 모델의 잔차를 나타내는 변수입니다. line="s"는 기대되는 분위수와 실제 분위수 사이에 직선을 그리는 옵션입니다.

qqplot 함수는 잔차를 정규분포의 분위수와 비교하여 정규성을 평가하는 도구입니다. QQ plot은 잔차가 정규분포에 얼마나 근사하는지를 시각적으로 확인할 수 있는 그래프입니다. 만약 잔차가 정규분포를 따른다면, 점들이 직선에 가깝게 분포할 것입니다.

위 코드는 잔차(residuals)를 작은 순서대로 정렬하는 것입니다.

resid.sort_values() 코드는 잔차를 작은 값부터 큰 값 순서로 정렬하는 것입니다. sort_values() 함수를 사용하여 잔차를 정렬하고, 결과를 resid_sort 변수에 저장합니다.

resid_sort.head() 코드는 정렬된 잔차 중에서 처음 5개의 값을 출력하는 것입니다. head() 함수를 사용하여 처음 5개 값을 확인할 수 있습니다.

이를 통해 잔차를 작은 값부터 순서대로 확인할 수 있습니다. 

 

 

위 코드는 전체 데이터에서 가장 작은 값을 몇 퍼센트에 위치하는지 계산하는 것입니다.

1 / 31 코드는 1을 31으로 나누는 연산을 수행하는 것입니다. 이 경우, 데이터의 개수가 31개인 것을 가정하고 있습니다. 따라서 결과는 0.03225806451612903가 됩니다.

이 값을 퍼센트로 환산하면 약 3.23%입니다. 즉, 전체 데이터에서 가장 작은 값은 하위 3.23%에 위치한다고 해석할 수 있습니다.

 

위 코드는 잔차(residuals)를 이용하여 이론상의 누적 확률을 계산하는 것입니다.

nobs = len(resid_sort) 코드는 잔차의 개수를 nobs 변수에 저장하는 것입니다. len(resid_sort)를 통해 잔차의 개수를 구합니다.

cdf = np.arange(1, nobs + 1) / (nobs + 1) 코드는 1부터 nobs까지의 값을 생성하고, 각 값을 (nobs + 1)로 나누어 이론상의 누적 확률을 계산합니다. np.arange(1, nobs + 1)은 1부터 nobs까지의 값을 생성하는 함수입니다.

결과인 cdf는 0부터 1까지의 범위를 갖는 이론상의 누적 확률을 나타내는 배열입니다. 이 배열은 잔차의 순서를 고려하여 각 잔차 값이 전체 데이터에서 차지하는 이론상의 누적 확률을 나타냅니다.

위 코드는 누적 확률에 대응하는 퍼센트점을 계산하는 것입니다.

ppf = stats.norm.ppf(cdf) 코드는 scipy.stats 모듈의 norm 클래스를 사용하여 누적 확률값(cdf)에 대응하는 퍼센트점을 계산합니다. stats.norm.ppf() 함수는 정규 분포의 퍼센트점을 계산하는 함수입니다.

결과인 ppf는 각 누적 확률값(cdf)에 대응하는 퍼센트점을 나타내는 배열입니다. 이 배열은 정규 분포에서 해당 누적 확률에 대응하는 값들로 구성됩니다. 퍼센트점은 해당 누적 확률값을 가지는 분포의 분위수를 의미합니다.

위 코드는 이론상의 퍼센트점과 실제 잔차를 이용하여 Q-Q 플롯을 그리는 것입니다.

첫 번째 줄의 코드인 fig = sm.qqplot(resid, line="s")는 statsmodels 패키지의 qqplot 함수를 사용하여 잔차의 QQ plot을 그리는 것입니다. resid는 잔차를 나타내는 변수입니다. line="s"는 기대되는 분위수와 실제 분위수 사이에 직선을 그리는 옵션입니다. 이 코드를 통해 기존에 그렸던 QQ plot이 저장되는 fig 변수를 생성합니다.

두 번째 줄의 코드인 plt.plot(stats.norm.ppf(cdf), resid_sort, "o", color="black")는 이론상의 퍼센트점과 실제 잔차를 플롯하는 코드입니다. stats.norm.ppf(cdf)는 이론상의 퍼센트점을 계산하여 x축으로 사용합니다. resid_sort는 정렬된 잔차를 y축으로 사용합니다. "o"는 점 형태의 마커를 나타내며, color="black"로 지정하여 검은색으로 표시합니다. 이를 통해 이론상의 퍼센트점과 실제 잔차를 플롯하여 Q-Q 플롯을 구성할 수 있습니다.

위 코드를 실행하면 기존에 그렸던 QQ plot과 함께 이론상의 퍼센트점과 실제 잔차를 플롯한 그래프가 나타납니다. 이를 통해 잔차가 정규분포에 얼마나 근사하는지를 시각적으로 확인할 수 있습니다.

 

추정 결과 표시

위 코드는 선형 회귀 모델의 추정 결과를 출력하는 것입니다.

lm_model.summary() 코드는 statsmodels 패키지에서 제공하는 선형 회귀 모델 객체(lm_model)의 summary() 메서드를 호출하여 추정 결과를 요약하여 출력합니다.

출력된 결과는 다음과 같은 정보를 포함할 수 있습니다:

Dep. Variable: 종속 변수의 이름
Model: 모델의 유형과 세부 정보
Method: 모델 추정에 사용된 최소자승법(Least Squares) 등의 방법
Date: 모델 추정을 수행한 날짜와 시간
Time: 모델 추정을 수행한 시간
No. Observations: 관찰값의 수
Df Residuals: 잔차의 자유도
Df Model: 모델의 자유도
Covariance Type: 공분산 행렬의 유형
coef: 각 독립 변수의 추정된 계수와 표준 오차
t: 각 계수에 대한 t-통계량과 p-value
R-squared: 결정 계수 (모델의 설명력)
Adj. R-squared: 조정된 결정 계수
F-statistic: F-통계량과 p-value (모델의 유의성 검정)
Log-Likelihood: 로그 우도
AIC: 아카이케 정보 기준
BIC: 베이즈 정보 기준
Omnibus: 잔차의 정규성 검정 결과 (Omnibus 검정)
Durbin-Watson: 잔차의 자기상관 검정 결과 (Durbin-Watson 검정)
Jarque-Bera (JB): 잔차의 정규성 검정 결과 (Jarque-Bera 검정)
Skew: 잔차의 왜도 (정규성 검정 결과의 왜도)
Prob(Omnibus): Omnibus 검정의 p-value
Prob(JB): Jarque-Bera 검정의 p-value
Kurtosis: 잔차의 첨도 (정규성 검정 결과의 첨도)
Cond. No.: 조건수 (다중공선성의 존재 여부를 나타내는 지표)
이를 통해 추정된 선형 회귀 모델의 특성과 유의성 검정, 설명력 등의 정보를 확인할 수 있습니다.

728x90
반응형