#title 다중회귀분석 [[TableOfContents]] ==== SQL Server 2008에 데이터 입력 및 ODBC세팅 ==== {{{ --drop table 성적 create table 성적 ( 통계 int , 결석 int , 수학 int ); insert 성적 values (85, 3, 65) , (74, 7, 50) , (76, 5, 55) , (90, 1, 65) , (85, 3, 55) , (87, 3, 70) , (94, 1, 65) , (98, 2, 70) , (81, 4, 55) , (91, 2, 70) , (76, 3, 50) , (74, 4, 55); }}} ODBC세팅은 알아서 한다. 데이터 원본 이름은 sql2008로 한다. ==== R을 이용한 다중회귀분석 ==== {{{ > # SQL Server 2008 연동한 R코드: 다중회귀분석 > library("TSodbc") > con <-odbcConnect(dsn = "sql2008") > options(TSconnection = con) > #만약 데이터가 많다면 select * from 성적 tablesample(1 percent)와 같이 샘플링을 한다. > result = try(dbGetQuery(con, paste("SELECT 통계, 수학, 결석 FROM 성적"))) > model = lm(통계 ~ 수학 + 결석, result) > summary(model) Call: lm(formula = 통계 ~ 수학 + 결석, data = result) Residuals: Min 1Q Median 3Q Max -5.348 -2.274 -1.276 2.954 5.673 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 53.6832 14.1808 3.786 0.00431 ** 수학 0.6073 0.1984 3.062 0.01353 * 결석 -1.9346 0.9144 -2.116 0.06348 . --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 3.721 on 9 degrees of freedom Multiple R-squared: 0.8289, Adjusted R-squared: 0.7909 F-statistic: 21.8 on 2 and 9 DF, p-value: 0.0003544 > anova(model) #자유도, 제곱합, 제곱평균 F값, Analysis of Variance Table Response: 통계 Df Sum Sq Mean Sq F value Pr(>F) 수학 1 541.69 541.69 39.1297 0.0001487 *** 결석 1 61.97 61.97 4.4762 0.0634803 . Residuals 9 124.59 13.84 --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 > dbDisconnect(con) [1] TRUE > options(TSconnection = NULL) > odbcCloseAll() > }}} ==== 결과의 해석 ==== {{{ > summary(model) Call: lm(formula = 통계 ~ 수학 + 결석, data = result) Residuals: Min 1Q Median 3Q Max -5.348 -2.274 -1.276 2.954 5.673 Coefficients: Estimate Std. Error t value Pr(>|t|) (Intercept) 53.6832 14.1808 3.786 0.00431 ** 수학 0.6073 0.1984 3.062 0.01353 * 결석 -1.9346 0.9144 -2.116 0.06348 . --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 Residual standard error: 3.721 on 9 degrees of freedom Multiple R-squared: 0.8289, Adjusted R-squared: 0.7909 F-statistic: 21.8 on 2 and 9 DF, p-value: 0.0003544 }}} * 회귀직선이 y=통계, x1=수학, x2=결석 이라면, '''''y''''' = 53.6832 + 0.6073'''''x1''''' + -1.9346'''''x2''''' 으로 추정된다. * -1.9346'''''x2'''''으로 마이너스(-)값을 가진다는 것은 결석을 할 수록 통계성적이 나빠진다는 것을 의미한다. * 'β1=0'이라는 귀무가설에 대한 T 검정통계량은 3.062이며, 이것은 P값은 0.01353으로 유의수준 0.05에서는 귀무가설을 기각하게 된다. 즉, 유의미한 값이다. * 결정계수 R^^2^^은 아래의 anova(분산분석)의 결과에서 R^^2^^ = (541.69 + 61.97)/(541.69 + 61.97 + 124.59) = 0.8289186405이고, 조정된 R^^2^^값은 0.7909 이다. __즉, 통계성적은 수학성적과 결석횟수 2개의 변수에 의해 약 83%가 설명되어진다.__ * F 검정통계량은 21.8이며, F분포표의 α = 0.05, v1=2, v2=9의 값은 4.26이다. 즉, 21.8 > 4.26 이므로 귀무가설(β1=β2=0)은 기각한다. 즉, 유의미한 값이다. p-value가 나오므로 F분포표를 볼 필요는 없다. 유의수준 0.05 > 0.0003544 이므로 귀무가설을 기각하면 된다. * p-value가 작으면 대립가설을 지지하고, 커지면 귀무가설을 지지한다. 0.0003544는 귀무가설이 맞다고 가정했을 경우 얻어진 검정통계량보다 더 극단적인 결과가 나올 확률이다. 즉, 통계적인 수치에 근거하여 의사결정을 했을 때에 오류(1종 오류)가 나올 확률. * 유의수준 0.05라는 것은 95%만 평균에 가까운 정상으로 생각하고, 평균가 멀리 떨어진 5%는 비정상으로 생각한다는 것이다. {{{ > anova(model) #자유도, 제곱합, 제곱평균 F값, Analysis of Variance Table Response: 통계 Df Sum Sq Mean Sq F value Pr(>F) 수학 1 541.69 541.69 39.1297 0.0001487 *** 결석 1 61.97 61.97 4.4762 0.0634803 . Residuals 9 124.59 13.84 --- Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 }}} ||요인||제곱합||자유도||제곱평균||F비|| ||회귀||603.66||11||301.83||21.802950|| ||잔차||124.59||9||13.84|| || ||계||728.25||11|| || || * F 검정통계량은 21.8이며, F분포표의 α = 0.05, v1=2, v2=9의 값은 4.26이다. 즉, 21.8 > 4.26 이므로 귀무가설(β1=β2=0)은 기각한다. 즉, 유의미한 값이다. * 결정계수 R^^2^^은 아래의 R^^2^^ = 603.66/728.25 = 0.82891864 이다. * 자유도란 자유로운 정도. 랜덤한 정도. 수식에 의해 자유가 제한되지 않는 정도인데 보통 표본의 개수를 의미한다. ==== 다중공선성(Multicollinearity) ==== 다중공선성(Multicollinearity)은 입력변수들 간의 상관정도가 높은 상태를 말한다. 즉, 임의의 변수 x를 빼고서 회귀분석을 했을 때에 x의 상관정도가 너무 높아 R값이 조낸 낮게 나오는 것을 말한다. 즉, 종속변수와 조낸 끈끈한 관계다. 즉, "여자가 애를 많이 낳는다" 또는 "구매 횟수가 많은 고객들의 매출비중이 크다" 정도로 정성적으로 알 수 있다. 다중공선선은 변수간의 상관관계가 다른 변수보다 상당히 높은 경우에 나타난다. 알아보는 방법은 [공분산과 상관계수]문서의 공분산행렬 부분을 참고하라. ==== fRegression-package ==== 회귀분석 함수를 모아서리 편하게 하게 하는 뭐.. 그따위 패키지다.. http://cran.r-project.org/web/packages/fRegression/fRegression.pdf #library(fRegression) #regFit(formula, data, use = "lm", ...) #use = c("lm", "rlm", "glm","gam", "ppr", "nnet", "polymars") model = rlm(NetAMT ~ Playtime + LoginCnt, data, use = "lm") ==== Package 'SuppDists' ==== * attachment:Package_SuppDists.pdf 추가적인 분포모음이다.. 이런 것들이 있다고 한다.. Friedman ghyper ghypertypes invGauss Johnson Kendall KruskalWallis maxFratio MWC1019 NormalScore Pearson Spearman ziggurat * [http://bm2.genes.nig.ac.jp/RGM2/R_current/library/SuppDists/man/Johnson.html The Johnson distributions]