다중회귀분석¶
- 주어진 데이터를 이용하여 다중선형회귀 문제를 해결하시오.
In [100]:
import pandas as pd
df =pd.read_csv('data/data_6_3_2.csv')
df.head(3)
Out[100]:
Ozone | Solar | Wind | Temp | Month | Day | |
---|---|---|---|---|---|---|
0 | 41.0 | 190.0 | 7.4 | 67 | 5 | 1 |
1 | 36.0 | 118.0 | 8.0 | 72 | 5 | 2 |
2 | 12.0 | 149.0 | 12.6 | 74 | 5 | 3 |
문제 1.¶
- 선형회귀 모델을 만들어 독립변수 Ozone의 회귀계수(Regression coefficient)를 구하시오.
- 독립변수 : Solar(태양 에너지), Wind(바람의 세기), Ozone(오존 농도)
- 종속변수 : Temp(온도)
In [101]:
df.columns
Out[101]:
Index(['Ozone', 'Solar', 'Wind', 'Temp', 'Month', 'Day'], dtype='object')
In [102]:
import statsmodels
import statsmodels.formula.api as smf
ols_formula = 'Temp ~ Ozone + Solar + Wind'
model = smf.ols(ols_formula, data = df).fit()
model.summary().tables[1]
Out[102]:
coef | std err | t | P>|t| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
Intercept | 72.4186 | 3.216 | 22.522 | 0.000 | 66.044 | 78.793 |
Ozone | 0.1720 | 0.026 | 6.516 | 0.000 | 0.120 | 0.224 |
Solar | 0.0073 | 0.008 | 0.948 | 0.345 | -0.008 | 0.022 |
Wind | -0.3229 | 0.233 | -1.384 | 0.169 | -0.785 | 0.139 |
In [103]:
ozone_coef_1 = model.params['Ozone']
print(round(ozone_coef, 3))
print(f'Ozone coef: {model.summary().tables[1].data[2][1]}')
0.172
Ozone coef: 0.1720
- Ozone의 회귀계수는 0.1720.
- 번외)
- Solar와 Wind의 p-value가 유의수준보다 높아서 귀무가설이 채택되고 기울기가 0에 가깝다.
- p-value가 가장 높은 Sola를 제외하고 회귀분석을 다시 진행한다.
In [104]:
ols_formula = 'Temp ~ Ozone + Wind'
model = smf.ols(ols_formula, data = df).fit()
model.summary().tables[1]
Out[104]:
coef | std err | t | P>|t| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
Intercept | 74.1803 | 2.965 | 25.017 | 0.000 | 68.306 | 80.055 |
Ozone | 0.1761 | 0.024 | 7.362 | 0.000 | 0.129 | 0.224 |
Wind | -0.3783 | 0.221 | -1.713 | 0.089 | -0.816 | 0.059 |
- Wind의 p-value가 유의미하게 낮아지는 동시에 기울기가 0.17이 되었다.
- 이후 더 정확한 분석을 위해 R과 SPSS으로 다시 분석한다.
문제 2.¶
- Solar와 Ozone은 고정, Wind가 증가함에 따라 Temp가 감소하는지 검증하기 위한 다중선형회귀 분석을 수행하여 Wind의 회귀계수에 대한 p-value를 구하시오. (유의수준 0.05)
In [105]:
import statsmodels
from statsmodels.formula.api import ols
ols_formula = 'Temp ~ Ozone + Solar + Wind'
model = smf.ols(ols_formula, data = df).fit()
print(round(model.pvalues['Wind'], 3))
print(f'Wind p-vlaue: {model.summary().tables[1].data[4][4]}')
0.169
Wind p-vlaue: 0.169
문제 3.¶
- Solar가 150, Wind가 7.5, Ozone이 45일 경우, 예측 값과 그에 대한 95% 신뢰구간을 구하시오.
In [109]:
new_data = pd.DataFrame({'Ozone': [45], 'Solar': [150], 'Wind': [7.5]})
prediction = model.get_prediction(new_data)
summary = prediction.summary_frame(alpha = 0.05)
print(summary)
mean mean_se mean_ci_lower mean_ci_upper obs_ci_lower \
0 78.826312 0.864464 77.112614 80.540011 65.171661
obs_ci_upper
0 92.480964
- prediction = model.get_prediction(new_data): 훈련된 회귀모델 model을 사용하여 새로운 데이터를 예측함
- summary = prediction.summary_frame(alpha = 0.05): 얻은 예측값으로 요약통계를 작성함
In [124]:
mean_value = summary.loc[0, 'mean']
lower_bound = summary.loc[0, 'mean_ci_lower'] #prediction.conf_int()[0][0]
upper_bound = summary.loc[0, 'mean_ci_upper'] #prediction.conf_int()[0][1]
print(f'예측값은 {mean_value}')
print(f'95% 신뢰구간은 [{lower_bound}, {upper_bound}]')
예측값은 78.82631230227963
95% 신뢰구간은 [77.11261368775142, 80.54001091680784]
'데이터분석' 카테고리의 다른 글
오차 행렬 - 정확도, 정밀도, 재현도, 특이도, F1 Score (0) | 2024.02.20 |
---|---|
[selenium] 동적 웹크롤링 루틴 (0) | 2024.02.17 |
[통계분석] 단순선형회귀분석, 카이제곱검정 (0) | 2024.01.19 |
[통계분석] 2표본 가설검정, 등분산 검정 (0) | 2024.01.18 |
[통계분석] 정규성 검정, 가설검정의 기본, 단일표본 가설검정 (0) | 2024.01.18 |