반응형
심심해서 해보는 틈틈이 Python으로 하는 통계 분석을 정리해볼까 한다.
첫번째는 다중회귀분석을 아래와 같이 수행했다.
데이터는 아래의 주소를 참조했다.
import pandas as pd
import statsmodels.formula.api as sm
from statsmodels.sandbox.regression.predstd import wls_prediction_std
# csv 파일을 가져옴
df = pd.read_csv("c:/Temp/baseball.csv")
# 데이터의 칼럼명을 변경
df.columns = ["battingAvg", "score_atBat", "double_atBat", "triples_atBat", "homerun_atBat", "strike_atBat"]
print df.head()
# 회귀분석 수행
result = sm.ols(formula = 'score_atBat ~ battingAvg + strike_atBat + triples_atBat', data = df).fit()
# 요약결과 출력
print result.summary()
# 회귀계수 출력
print('Parameters : ', result.params)
# R squared 출력
print('Rsquaured : ', result.rsquared)
# 회귀계수에 대한 P-value 출력
print('Pvalue :', result.pvalues)
# 모형의 적합값 출력
print('Predicted values', result.predict())
result.summary()의 결과는 다음과 같이 출력된다.
OLS Regression Results
==============================================================================
Dep. Variable: score_atBat R-squared: 0.725
Model: OLS Adj. R-squared: 0.705
Method: Least Squares F-statistic: 35.97
Date: Wed, 02 Dec 2015 Prob (F-statistic): 1.47e-11
Time: 15:07:51 Log-Likelihood: 108.32
No. Observations: 45 AIC: -208.6
Df Residuals: 41 BIC: -201.4
Df Model: 3
Covariance Type: nonrobust
=================================================================================
coef std err t P>|t| [95.0% Conf. Int.]
---------------------------------------------------------------------------------
Intercept -0.1161 0.034 -3.380 0.002 -0.185 -0.047
battingAvg 0.8576 0.117 7.311 0.000 0.621 1.094
strike_atBat 0.1696 0.070 2.414 0.020 0.028 0.312
triples_atBat 0.7748 0.665 1.165 0.251 -0.569 2.118
==============================================================================
Omnibus: 1.239 Durbin-Watson: 2.046
Prob(Omnibus): 0.538 Jarque-Bera (JB): 1.138
Skew: 0.227 Prob(JB): 0.566
Kurtosis: 2.367 Cond. No. 205.
==============================================================================
위 결과에서 R-squared 값은 72.5%로 설명력이 높으며 모형에 대한 p-value 또한 0.05보다 낮으므로 통계적으로 유의하다.
단, triples_atBat의 p-value가 0.05보다 높으므로 유의하지 않다. 이 경우 해당 독립변수를 제외하고 모형을 재 수행하는 것이 바람직하다.
다음과 같이 모형에서 triple_atBat을 제외하고 다시 실행한다.
# 회귀분석 수행
result = sm.ols(formula = 'score_atBat ~ battingAvg + strike_atBat ', data = df).fit()
# 요약결과 출력
print result.summary()
수정한 모형에 대한 result.summary()의 결과는 다음과 같이 출력된다.
OLS Regression Results
==============================================================================
Dep. Variable: score_atBat R-squared: 0.716
Model: OLS Adj. R-squared: 0.702
Method: Least Squares F-statistic: 52.83
Date: Sun, 14 Apr 2019 Prob (F-statistic): 3.42e-12
Time: 22:53:51 Log-Likelihood: 107.59
No. Observations: 45 AIC: -209.2
Df Residuals: 42 BIC: -203.8
Df Model: 2
Covariance Type: nonrobust
================================================================================
coef std err t P>|t| [0.025 0.975]
--------------------------------------------------------------------------------
Intercept -0.1263 0.033 -3.790 0.000 -0.194 -0.059
battingAvg 0.9292 0.100 9.267 0.000 0.727 1.132
strike_atBat 0.1591 0.070 2.274 0.028 0.018 0.300
==============================================================================
Omnibus: 1.253 Durbin-Watson: 2.008
Prob(Omnibus): 0.535 Jarque-Bera (JB): 1.221
Skew: 0.284 Prob(JB): 0.543
Kurtosis: 2.427 Cond. No. 35.7
==============================================================================
첫번쨰 결과와 비교했을 때 R-squared 값과 p-value가 여전히 유의미한 결과인데 각 독립변수도 p-value가 0.05보다 낮은 통계적으로 유의미한 결과가 나왔다.
두 독립변수 battingAvg와 strike_atBat은 score_atBat에 선형적인 관계를 가지고 있으며 각각 1씩증가 할때 score_atBat에 0.9292, 0.1591만큼의 영향력을 가진다고 볼 수 있다.
'Data Analysis > Python' 카테고리의 다른 글
Python : Data Handling(수정) (0) | 2015.12.10 |
---|---|
[Python] jdbc로 Database(Oracle) 접근하기 (2) | 2015.12.03 |
Python : Numpy Intall 하기 (0) | 2015.11.02 |
Spotfire & Python : 특정일자를 Input Field에 설정하기 (0) | 2015.08.30 |
Spotfire & Python : 특정값이 일치할 때 해당 행의 다른 값을 가져오기 (6) | 2015.08.20 |
댓글