티스토리 뷰
statsmodels 라이브러리를 활용하여 선형 회귀 분석을 해보자.
1. 사용법
공식문서를 보면 알 수 있듯이 설치 후에 import 하여 사용 가능하다. 설치 명령어는 아래와 같다.
$ pip install statsmodels
2. 선형회귀분석
선형 회귀 분석을 하려면, 아래의 가정을 따라야 한다.
독립변수(X)는 이름 그대로 독립적인 형태여야 한다. 변수들끼리 상관관계가 있다면 결과는 왜곡될 수밖에 없다. 예를 들면, 특정 변수와 다른 변수가 선형 관계라면, 비슷한 변수가 두번 학습하게 되므로 정확한 결과를 기대하기 힘들다. 따라서 상관관계가 있는 변수는 제거해 줘야 한다.
변수들은 정규분포를 가진다는 가정이 전제되어야 한다. 정규분포를 가지지 않고 한쪽으로 치우친다면 당연히 정확한 결과를 기대하기가 힘들다. 따라서 정규성을 가지지 않는 변수는 정규성을 가질 수 있도록 로그나 지수의 방법으로 치환하여 범위를 늘리거나 줄이는 방식으로 정규분포를 만드는 것도 한 가지 방법이라고 할 수 있다.
종속변수(Y)와 독립변수(X)는 선형 상관관계를 가지는 것을 가정한다. 선형이 아니라면 다른 회귀분석 방법을 사용하거나 기존의 변수를 변경시켜 줘야 한다.
3. 실습
우선은 가장의 데이터를 만들어 보겠다.
import pandas as pd
a = [1, 3, 2, 6, 7, 5, 8, 12, 35, 62]
b = [10, 21, 32, 43, 53, 63, 73, 82, 99, 103]
data = pd.DataFrame(
{'a': a,
'b': b
}
)
print(data.head())
'''
a b
0 1 10
1 3 21
2 2 32
3 6 43
4 7 53
'''
선형 회귀 모델이기 때문에 우리가 만드는 식의 형태는 "a = B0 + B1 * b"의 형태가 될 것이다. 이러한 점을 참고하여 statsmodel을 적용해 보자.
데이터를 뽑는 방법은 아래와 같은 두 가지 방법이 있다. 첫 번째 방법은 x, y를 지정한 후에 각각 대입하는 방법이다.
# 방법 1
import statsmodels.api as sm
x = data.a.values
y = data.b.values
model = sm.OLS(y, x)
result = model.fit()
print(result.summary())
'''
OLS Regression Results
=======================================================================================
Dep. Variable: y R-squared (uncentered): 0.678
Model: OLS Adj. R-squared (uncentered): 0.642
Method: Least Squares F-statistic: 18.97
Date: Sun, 14 Mar 2021 Prob (F-statistic): 0.00184
Time: 18:43:59 Log-Likelihood: -50.311
No. Observations: 10 AIC: 102.6
Df Residuals: 9 BIC: 102.9
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
x1 2.3144 0.531 4.355 0.002 1.112 3.516
==============================================================================
Omnibus: 6.359 Durbin-Watson: 0.382
Prob(Omnibus): 0.042 Jarque-Bera (JB): 2.391
Skew: -1.120 Prob(JB): 0.302
Kurtosis: 3.847 Cond. No. 1.00
==============================================================================
Notes:
[1] R² is computed without centering (uncentered) since the model does not contain a constant.
[2] Standard Errors assume that the covariance matrix of the errors is correctly specified.
'''
추가
'''
sm.add_constant(x)
를 하면 상수항에 컬럼에 추가가 된다.
ex
const age anaemia ... sex smoking time
0 1.0 75.0 0 ... 1 0 4
1 1.0 55.0 0 ... 1 0 6
2 1.0 65.0 0 ... 1 1 7
3 1.0 50.0 1 ... 1 0 7
4 1.0 65.0 1 ... 0 0 8
위의 열을 보면 일반 데이터프레임에 const항이 추가된 것을 알 수 있다.
'''
x = data.a.values
y = data.b.values
x = sm.add_constant(x)
model = sm,OLS(y, x)
두 번째 방법은 form_formula를 사용하여 ~를 기준으로 데이터 a, b를 넣고 콤마(,) 뒤에 데이터 프레임을 넣어주는 방법이다.
import statsmodels.api as sm
reg = sm.OLS.from_formula("a ~ b", data).fit()
print(reg.summary())
'''
OLS Regression Results
==============================================================================
Dep. Variable: a R-squared: 0.603
Model: OLS Adj. R-squared: 0.554
Method: Least Squares F-statistic: 12.17
Date: Sun, 14 Mar 2021 Prob (F-statistic): 0.00822
Time: 18:44:18 Log-Likelihood: -38.730
No. Observations: 10 AIC: 81.46
Df Residuals: 8 BIC: 82.06
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
Intercept -13.3957 8.891 -1.507 0.170 -33.899 7.107
b 0.4749 0.136 3.488 0.008 0.161 0.789
==============================================================================
Omnibus: 3.301 Durbin-Watson: 0.714
Prob(Omnibus): 0.192 Jarque-Bera (JB): 1.200
Skew: 0.843 Prob(JB): 0.549
Kurtosis: 3.192 Cond. No. 141.
==============================================================================
Notes:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
'''
4. 풀이
R-squared
모형이 데이터에 잘 맞는 정도를 보여주는 지표중 하나이다. R 제곱이라는 뜻으로 위의 데이터에는 0.603으로 표현되는 것을 알 수 있다. 쉽게 말하면 얼마나 선형적인가(a = B0 + B1 * weight)를 표현한 수치라고 할 수 있다. 범위는 0에서 1 사이의 값으로 0이면 모델의 설명력이 전혀 없는 상태이고, 1에 가까울수록 모델이 데이터를 잘 성명해 주는 상태라고 할 수 있다. 보통은 0.4 이상이면 괜찮은 모델이라 할 수 있다.
coef(coefficient, 계수)
데이터로부터 얻은 계수의 추정치이다. 출력 값에서 coef 부분을 보면 intercept가 -13.3957이고 b가 0.4749라는 것을 알 수 있다. 이것을 선형 회귀분석 모델 식에 넣어보면 'a = -13.3957 + 0.4749 * b'라는 식이 만들어진 거라고 생각하면 된다. 이는 b가 1 상승할 때마다 a가 0.4749 증가한다고 해석 할 수 있다.
P>|t| (유의 확률)
독립변수의 유의 확률로 보통은 독립변수가 95%의 신뢰도를 가져야 유의미하다 판단하고 유의 확률은 0.05보다 작은 값이 산출된다. 즉, 0.05보다 작으면 독립 변수가 종속 변수에 영향을 미치는 것이 유의미하다고 보면 된다.
p-value(유의 확률, significance probability)는 '귀무가설(Null hypothesis)이 맞는다고 가정할 때 얻은 결과보다 극단적인 결과(관측 결과)가 나타날 확률'로 정의됩니다. 일반적으로 p-value < 0.05 혹은 0.01을 기준으로 합니다. 계산된 p-value가 기준값보다 작은 경우 귀무가설을 기각하는 것으로 즉, 극단적으로 귀무가설이 일어날 확률이 매우 낮은 상태를 의미합니다.
No.observations
위의 결과를 보면 10개의 데이터 쌍을 가지고 회귀 분석을 하였다는 것을 표현한 것이다.
Df Model
위의 예에서 예측 변수가 b 하나 이므로 Df Model은 1이다. Df Model은 예측 변수의 개수이다. 보통 회귀분석에서 전처 파라미터에 종속변수를 포함하기 때문에 전체 변수에서 하나를 뺸 값이 Df Model이 된다.
Df Residuals
전체 관찰 데이서 수에서 회귀 모형의 전체 파라미터의 수를 뺀 값이다. "No.observations - (Df Model + 1)"으로 표현 가능하다.
Durbin-Watson(더 빈 왓슨, DW검정)
위의 예시에서는 0.714로 나타나 있다. 잔차의 독립성을 확인할 수 있는 수치다.
- 0이면 잔차들이 양의 자기 상관을 가진다.
- 2이면 자기 상관이 없는 독립성을 가진다.
- 4이면 잔차들이 음의 자기 상관을 가진다.
보통 1.5에서 2.5 사이이면 독립으로 판단하고 회귀 모형이 적합하다는 것을 의미한다. 만약 0이나 4에 가깝다면 잔차들이 자기상관을 가지고 있다는 의미이므로 t, F, R제곱을 실제보다 증가시켜 유의미하지 않은 결과를 유의미한 결과로 왜곡하게 한다.
정리하면, R-squeared가 0.4 이상이고, p-value가 0.05 보다 작다면 유의한 결과가 나왔다고 할 수 있다.
'데이터분석' 카테고리의 다른 글
columns 별 중요도 확인하기 (0) | 2021.06.03 |
---|---|
[kaggle] 의료데이터_심부전증 예방하기 (0) | 2021.04.30 |
의료데이터 분석하기 입문 (0) | 2021.04.28 |
[데이터 분석] 비전공자를 위한 ACF(Autocorrelation Function) 설명하기 (0) | 2021.04.07 |
[데이터분석] 비전공자를 위한 QQ-Plot 설명하기 (0) | 2021.04.05 |
- Total
- Today
- Yesterday
- BFS
- next.config.js
- typescript
- react
- vuejs
- pandas
- 자료구조
- mongoDB
- JavaScript
- Python
- 자연어처리
- Deque
- Vue
- useHistory 안됨
- TensorFlow
- nodejs
- UserCreationForm
- Queue
- django
- logout
- error:0308010C:digital envelope routines::unsupported
- read_csv
- NextJS
- 클라우데라
- DFS
- react autoFocus
- login
- nextjs autoFocus
- useState
- Express
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |