본문 바로가기

카테고리 없음

회귀

install.packages("readxl") ## 엑셀 데이터를 불러올때 유용

install.packages("lmtest") ## 다중회귀 분석할때 어떤 독립변수가 종속변수에 가장 큰 영향을 미치지??

install.packages("car") ## 다중회귀 분석에서 독립변수들 간의 상관관계 분석, 다중공선성 체크 지원

install.packages("gvlma") ## 회귀분석의 가정 체크

install.packages("QuantPsyc") ## 

library(readxl)

library(lmtest)

library(car)

library(gvlma)

library(QuantPsyc)



## Q. 회귀분석은 언제하는가?

## (1) 인과관계(원인과 결과)

## (2) 독립변수가 종속변수에게 통계적으로 유의한 영향을 주는지를

##     통계적으로 검정하는 방법

## (3) 예측(Prediction), 분류(Classification)



## Q. 회귀분석의 주요 용어들은?

## (1) 독립변수 = 설명변수(원인) : 기본은 양적 자료

## (2) 종속변수 = 반응변수(결과) : 기본은 양적 자료

## (3) 회귀모형   : 종속변수와 독립변수를 설정하는 방법

## (4) 회귀계수   : 회귀직선에서의 절편, 기울기

## (5) 최소제곱법 : 회귀계수를 추정하는 방법 (least square method)



## Q. 회귀분석의 종류는?

## (1) 단순회귀분석 : 종속변수 1개, 독립변수 1개

## (2) 다중회귀분석 : 종속변수 1개, 독립변수 2개 이상




###################################################

### I. 단순회귀분석(Simple Regression Analysis) ###

###################################################


## 데이터명       : cars

## 변수명         : speed, dist(제동거리..브레이크 밟았을때 얼마나 밀려 나가는지)



## 회귀모형       : y = beta0 + beta1*x + error

## 회귀모형(예제) : dist = beta0 + beta1*speed + error


## 1. 산점도(Scatter Plot)

## 사용법

## plot(데이터명$독립변수, 데이터명$종속변수)

plot(cars$speed, 

     cars$dist,

     xlab="Car's speed(mile per hour)",

     ylab="Car's distance(feet)")




## 2. 단순회귀분석 사용법

## 회귀분석결과물 = lm(종속변수 ~ 독립변수, data=데이터명)

## lm : linear model

## summary(회귀분석결과물)

## anova(회귀분석결과물)

cars.model = lm(dist ~ speed, data=cars)

cars.model ## intercept = betta0, speed = betta1)

summary(cars.model)




## 3. 단순회귀분석 결과의 해석

## 1단계 ##

## Q. 회귀모형은 통계적으로 타당한가?


## 귀무가설 : 회귀모형은 타당하지 않다.

## 대립가설 : 회귀모형읕 타당하다.


## 회귀분석결과물 : F-statistic: 89.57 on 1 and 48 DF,  p-value: 1.49e-12

anova(cars.model) ## 분산분석


## F통계량  : 89.567

## 자유도1  : 1

## 자유도2  : 48

## 유의확률 : 0.000


## 결론

## 자유도가 1, 48인 F분포에서

## 표본에서 관찰된 F통계량 89.567은

## 귀무가설이 참이라는 가정하에서 일어날 확률(유의확률)이

## 0.000 이므로 유의수준 0.05에서 '회귀모형은 타당하다'라는 대립가설을 채택



## 2단계 ##

## 1단계에서 결론이 대립가설인 경우에만 2단계를 진행함


## Q.독립변수는 종속변수에 통계적으로 유의한 영향을 주는가?

## 귀무가설 : 영향을 주지 않는다(beta1=0).

## 대립가설 : 영향을 준다(beta1 not equal 0).


## 회귀분석의 결과물

##                 Estimate Std. Error t value Pr(>|t|)    

##    speed         3.9324     0.4155   9.464 1.49e-12 ***


## speed의 회귀계수            : 3.9324

## speed의 회귀계수의 표준오차 : 0.4155

## t통계량                     : 9.464

## 유의확률                    : 0.000


## 결론

## 자유도가 49인 t분포에서

## 표본에서 관찰된 t통계량 9.464는

## 귀무가설이 참이라는 가정하에서 일어날 확률(유의확률)이

## 0.000 이므로 유의수준 0.05에서

## '독립변수는 종속변수에게 통계적으로 유의한 영향을 준다' 라는 대립가설을 채택.



## 3단계

## 2단계에서 결론이 대립가설인 경우에만 3단계를 진행함


## Q. 독립변수는 종속변수에게 어떠한 영향을 주는가?


## 회귀분석의 결과물

##                 Estimate  

##    speed         3.9324


## speed의 회귀계수 : 3.9324


## speed의 기본단위가 1 증가하면 dist는 약 3.932정도 증가한다.

## speed가 1 mph 증가하면 dist는 약 3.9324 feet 정도 증가한다.



## 4단계

## Q. 회귀모형의 설명력 = 독립변수의 설명력은 얼마인가?


## 회귀분석의 결과물

## Multiple R-squared:  0.6511


## 결정계수(Coefficient of determination) = R^2 = 0.6511


## 결론

## 회귀모형의 설명력은 약 65.1% 이다.

## speed가 dist의 다름을 약 65.1% 설명하고 있다.



## 5단계 

## Q. 회귀모형은 예측(Prediction)은?


## 회귀분석의 결과물

##             Estimate    

## (Intercept) -17.5791  

## speed         3.9324


## beta0의 추정치 = 절편의 추정치   : -17.5791

## beta1의 추정치 = 기울기의 추정치 : 3.9324


## 회귀 추정식 : dist = -17.5791 + 3.9324*speed


## 어떤 자동차의 speed가 200이면

## dist = -17.5791 + 3.9324*200 = 468.9009로 예측함

dist = -17.5791 + 3.9324*200; dist

predict(cars.model, newdata=data.frame(speed=200)) ## cars.model : 회귀모형, newdata : argument

predict(cars.model, newdata=data.frame(speed=c(100, 200, 300))) ## 여러개를 보고 싶을때





## 4. 예측치에 대한 신뢰구간의 시각화

dist_confidence = predict(cars.model, 

                         newdata=data.frame(speed=cars$speed), 

                         interval="confidence")

dist_confidence


dist_confidence2 = predict(cars.model, 

                          newdata=data.frame(speed=200), 

                          interval="confidence")

dist_confidence2


matplot(cars$speed, dist_confidence, type="n")

matlines(cars$speed, dist_confidence, lty=c(1, 2, 2), col="red") ## 1: 실선, 2 : 점선




## 5. 잔차분석(Residual Analysis)

## 단순회귀분석을 위한 가정(Assumption)들은 만족하는지를 확인

## 잔차(Residual)

## (1) 정규성(Normality)

## (2) 등분산성(Homoscedasticity)

## (3) 독립성(Independence)

## (4) 선형성(Linearity)



## (1) 정규성(Normality)

## 종속변수가 정규분포를 따른다면,

## 잔차(residual value) 또한 정규분포를 따르며, 평균은 0 이다.

## i. Normal Q-Q plot :

##    x축은 잔차의 사분위수(Quartiles),

##    y축은 잔차의 표준화.

##    정규성 가정을 만족한다면 Normal Q-Q plot는 직선에 가까운 그래프가 되어야 한다.

##    직선을 벗어나는 점들이 많으면 정규성 가정이 깨질 가능성이 높다.

qqnorm(cars.model$residuals)

qqline(cars.model$residuals)


## ii. Shapiro-Wilk test

##     잔차에 대해서 정규성 검정을 한다.

shapiro.test(cars.model$residuals)



## (2) 등분산성(Homoscedasticity

## x축 : 독립변수 또는 종속변수의 추정치

## y축 : 잔차 또는 표준화 잔차

## 분산이 일정하다는 가정을 만족한다면

## 잔차의 값이 0을 기준으로 위/아래로 랜덤random)하게 분포되어 있어야 한다.

## 일정한 패턴을 가지면 등분산성은 깨진다.

plot(cars$speed, cars.model$residuals)

plot(cars.model$fitted.values, cars.model$residuals)

car::ncvTest(cars.model) ## 등분산검정(귀무: 등분산이다, 대립 : 이분산이다)


## (3) 독립성(Independence)

## 종속변수는 서로 독립적이어야 한다. 

## 관찰값들 사이에 상관관계가 있을 경우,

## 오차항들이 서로 독립이라는 조건을 검토해 보아야 한다. 

## 만일 오차항들이 서로 독립이라면, 잔차들은 무작위로 흩어져 있을 것이고, 

## 그렇지 않다면 무작위로 흩어져 있지 않아 오차항들 사이에 상관관계가 있다고 할 수 있을 것이다. 


## i. 더빈-왓슨 통계량(Durbin-Watson Statistics)

## 오차항의 독립성을 평가하는 한 측도로 더빈-왓슨(Durbin-Watson) 통계량이 있다. 

## DW 통계량은 잔차들의 상관계수를 측정함

## DW 통계량이 2에 가까우면 인접 오차항들 사이에 상관관계가 없는 것을 의미하며, 

## DW 통계량이 4에 가까우면 음의 상관관계가 있고

## DW 통계량이 0에 가까우면 양의 상관관계가 있는 것으로 평가한다.


## 귀무가설 : 각 오차들은 서로 독립이다.

## 대립가설 : 각 오차들은 서로 독립이 아니다.

## lmtest::dwtest(회귀분석결과물)

lmtest::dwtest(cars.model)



## (4) 선형성(Linearity)

## 종속변수와 독립변수가 선형관계에 있다면

## 잔차와 독립변수 사이에 어떤 체계적인 관계가 있으면 안 된다. 

plot(cars$speed, cars.model$residuals)



##########################################

## 회귀모형에 대한 전반적인 검정       ###

##########################################

## 검정결과 = gvlma::gvlma(회귀분석결과물)

## summary(검정결과)

gvlma.result = gvlma::gvlma(cars.model)

summary(gvlma.result)


## 해석

## Call:

## gvlma(x = cars.model) 


##                     Value     p-value     Decision

## Global Stat        15.801    0.003298   Assumptions NOT satisfied!

##     Skewness        6.528    0.010621   Assumptions NOT satisfied!

##     Kurtosis        1.661    0.197449   Assumptions acceptable.

## Link Function       2.329    0.126998   Assumptions acceptable.

## Heteroscedasticity  5.283    0.021530   Assumptions NOT satisfied!


## i.   Global Stat        : 회귀모형에 대한 전반적인 가정에 대한 검정 결과

## ii.  Skewness           : 정규성   검정 

## iii. Kurtosis           : 정규성   검정

## iv.  Link function      : 선형성   검정

## V.   Heteroscedasticity : 등분산성 검정




## 6. 영향력

## 잔차(residual) vs 영향력(leverage) 그래프에서는 

## 주의를 기울여야 하는 개개의 관찰치에 대한 정보를 제공한다. 

## i. 이상치(outlier) 

## ii. 큰 지레점(high leverage point) 

## iii. 영향관측치(influential observation)

## 를 확인할 수 있다.


## i. 이상치(outlier)

## 회귀모형으로 잘 예측되지 않는 관측치(즉 아주 큰 양수/음수의 residual)

## 표준화 제외 잔차(Studentized Deleted Residual) : 절대값이 2보다 크면 이상치거나 영향치

## DFFITS(Diffrence of Fits) : 2*루트((독립변수의 개수 + 1) / 데이터의 개수)) 보다 크면 이상치거나 영향치

## DFBETAS(Difference of Betas) : 2 또는 2 / 루트(데이터의 개수) 보다 크면 이상치거나 영향치

rstudent(cars.model)[rstudent(cars.model) >= 2]

car::outlierTest(cars.model) ##이상치 여부를 판단했는데, 49번째 있는 값이 이상치 이다.


## ii. 큰 지레점(high leverage point)

## 비정상적인 예측변수의 값에 의한 관측치. 

## 즉 예측변수측의 이상치로 볼 수 있다. 

## 종속변수의 값은 관측치의 영향력을 계산하는 데 사용하지 않는다.

car::leveragePlots(cars.model)

plot(hatvalues(cars.model), type = "h")


## iii. 영향관측치(influential observation)

## 통계 모형 계수 결정에 불균형한 영향을 미치는 관측치로 

## Cook’s distance라는 통계치로 확인할 수 있다.

cooks.distance(cars.model)







######################################################

### II. 다중회귀분석(Multiple Regression Analysis) ###

######################################################


## 데이터명       : attitude

## 변수명         : rating, complaints, privileges, learning, raises, critical, advance


## Y rating     numeric Overall rating

## X[1] complaints numeric Handling of employee complaints

## X[2] privileges numeric Does not allow special privileges

## X[3] learning numeric Opportunity to learn

## X[4] raises     numeric Raises based on performance

## X[5] critical numeric Too critical

## X[6] advance numeric Advancement



## 회귀모형       : y = beta0 + beta1*x1 + beta2*x2 + beta3*x3 + beta4*x4  + beta5*x5 * beta6*x6 + error

## 회귀모형(예제) : 

## rating = beta0 + beta1*complaints + beta2*privileges + beta3*learning + 

##                  beta4*raises  + beta5*critical * beta6*advancel + error



## 1. 산점행렬도(Scatter Plot Matrix)

## 사용법

## plot(데이터명)

plot(attitude)




## 2. 다중회귀분석 사용법

## 회귀분석결과물 = lm(종속변수 ~ 독립변수1 + ... + 독립변수k, data=데이터명)

## summary(회귀분석결과물)

## anova(회귀분석결과물)

attitude.model = lm(rating ~ complaints+privileges+learning+raises+critical+advance, data=attitude)

attitude.model = lm(rating ~ ., data=attitude)

summary(attitude.model)


##데이터명[,] => 데이터명[행,열] // slicing

##데이터명2 = 데이터명[,1:4] //첫번째~세번째 열을 갖는 데이터명2 생성 

##데이터명2 = 데이터명[,c(1,3,4,10)]

##데이터명2 = 데이터명[,c("변수명", "변수명")]


## 3. 다중회귀분석 결과의 해석

## 1단계 ##

## Q. 회귀모형은 통계적으로 타당한가?


## 귀무가설 : 회귀모형은 타당하지 않다.

## 대립가설 : 회귀모형읕 타당하다.


## 회귀분석결과물 : F-statistic:  10.5 on 6 and 23 DF,  p-value: 1.24e-05

anova(attitude.model)


## F통계량  : 7.068

## 자유도1  : 6

## 자유도2  : 23

## 유의확률 : 0.000


## 결론

## 자유도가 6, 23인 F분포에서

## 표본에서 관찰된 F통계량 7.068은

## 귀무가설이 참이라는 가정하에서 일어날 확률(유의확률)이

## 0.000 이므로 유의수준 0.05에서 '회귀모형은 타당하다'라는 대립가설을 채택



## 2단계 ##

## 1단계에서 결론이 대립가설인 경우에만 2단계를 진행함


## Q.독립변수는 종속변수에 통계적으로 유의한 영향을 주는가?

## 귀무가설 : 영향을 주지 않는다(beta1=0, ..., beta6=0).

## 대립가설 : 영향을 준다(beta1 ~ beta6 not equal 0).


## 회귀분석의 결과물

##             Estimate   Std. Error t value Pr(>|t|)    

## complaints   0.61319    0.16098   3.809   0.000903 ***

## privileges  -0.07305    0.13572  -0.538   0.595594    

## learning     0.32033    0.16852   1.901   0.069925  

## raises       0.08173    0.22148   0.369   0.715480    

## critical     0.03838    0.14700   0.261   0.796334    

## advance     -0.21706    0.17821  -1.218   0.235577


## compliants의 회귀계수       : 0.61319

## speed의 회귀계수의 표준오차 : 0.16098

## t통계량                     : 3.809

## 유의확률                    : 0.000903


## 결론1

## 자유도가 29인 t분포에서

## 표본에서 관찰된 t통계량 3.809는

## 귀무가설이 참이라는 가정하에서 일어날 확률(유의확률)이

## 0.001 이므로 유의수준 0.05에서

## 'complaints이라는 독립변수는 ratings라는 종속변수에게 통계적으로 유의한 영향을 준다' 라는 대립가설을 채택.


## 결론2

## 결론1과 같이 해석하면 privileges, learning, raises, critical, advance는 ratings에

## 통계적으로 유의한 영향을 주지 않는다.


## 회귀모형에 통계적으로 유의한 독립변수만 넣고, 다시 회귀분석을 하던가

## 아니면 변수선택 방법을 고려한다.

## 이 부분은 다시 언급하기로 하고, 일단 다음 단계로 넘어가 본다.



## 3단계

## 2단계에서 결론이 대립가설인 경우에만 3단계를 진행함


## Q. 독립변수는 종속변수에게 어떠한 영향을 주는가?


## 회귀분석의 결과물

##                 Estimate  

##    complaints   0.61319


## complaints의 회귀계수 : 0.61319


## complaints는 다른 독립변수들이 고정되어 있을 때에

## complaints의 기본단위가 1 증가하면 rating는 약 0.613 정도 증가한다.




## 4단계

## Q. 회귀모형의 설명력 = 독립변수의 설명력은 얼마인가?


## 회귀분석의 결과물

## Adjusted R-squared:  0.6628


## 수정된 결정계수(Adjusted coefficient of determination) = adj R^2 = 0.6628


## 결론

## 회귀모형의 설명력은 약 66.3% 이다.

## 6개의 독립변수들이 ratings라는 종속변수를 약 66.3% 설명하고 있다.



## 5단계 

## Q. 회귀모형은 예측(Prediction)은?


## 회귀분석의 결과물

##             Estimate 

## (Intercept) 10.78708

## complaints   0.61319

## privileges  -0.07305    

## learning     0.32033  

## raises       0.08173    

## critical     0.03838    

## advance     -0.21706



## 회귀 추정식 : 

## ratings = -10.78708 + 0.61319*complaints + 0.07305*privileges + 0.32033*learning + 0.08173*raises +

##           0.03838*critical - 0.21706*advance 


## 어떤 사람의 complaints, privileges, learning, raises, critical, advance이 모두 10 이라면  

## ratings = -10.78708 + 0.61319*10 + 0.07305*10 + 0.32033*10 + 0.08173*10 +

##           0.03838*10 - 0.21706*10 = -1.69088

ratings =  -10.78708 + 0.61319*10 + 0.07305*10 + 0.32033*10 + 0.08173*10 + 0.03838*10 - 0.21706*10; ratings

predict(attitude.model, newdata=data.frame(complaints=10,

                                           privileges=10,

                                           learning=10,

                                           raises=10,

                                           critical=10,

                                           advance=10))



##################################

### 변수선택 방법              ###

##################################


## 1. All

## 2. Backward

## 3. Forward

## 4. Stepwise



## step(회귀분석결과물, direction=c("both", "backward", "forward"))

attitude.model.both     = step(attitude.model, direction="both") ## both = stepwize


attitude.model.backward = step(attitude.model, direction="backward")


attitude.model.forward  = step(attitude.model, direction="forward")


attitude.model2 = lm(rating ~ complaints + learning, data=attitude)

summary(attitude.model2)


attitude.model2 = lm(rating ~ complaints, data=attitude)

summary(attitude.model2)



attitude.model.3 = step(attitude.model2, direction="both")

attitude.model.4 = step(attitude.model2, direction="backward")

attitude.model.5 = step(attitude.model2, direction="forward")


attitude.model.final = lm(rating ~ complaints, data=attitude)

summary(attitude.model.final)


## Q1. 회귀모형은 타당한가?

## 유의확률이 0.000 이므로 유의수준 0.05에서 회귀모형은 통계적으로 타당하다.


## Q2. complaints는 rating에 통계적으로 유의한 영향을 주는가?

## 유의확률이 0.000 이므로 유의수준 0.05에서 

## complaints는 rating에 통계적으로 유의한 영향을 준다.


## Q3. 어떠한 영향을 주는가?

## complaints의 기본단위가 1 증가하면

## rating은 약 0.755 정도 증가한다.


## Q4. 회귀모형은 설명력은?

## 약 67.0% 설명하고 있다.


## Q. complaints가 10이면 rating은 얼마로 예측되는가?

predict(attitude.model.final, newdata=data.frame(complaints=10))

## 21.922



## 연습문제 ##

## 데이터   : iris

## 변수명   : ID, SepalLength, SepalWidth, PetalLength, PetalWidth, Species

## 회귀모형 : SepalLength = beta0 + beta1*SepalWidth + beta2*PetalLength + beta3*PetalWidth


iris2 = readxl::read_excel(path="c:/ohyoonkyung/iris.xlsx",

                  sheet=1, ##python이 0부터 시작하는 것과 반대로 R은 1부터 시작한다

                  col_names=TRUE)

iris.model = lm(SepalLength ~ SepalWidth + PetalLength + PetalWidth, data=iris2)

summary(iris.model)


iris.model.both = step(iris.model, direction="both")

iris.model.backward = step(iris.model, direction="backward")

iris.model.forward = step(iris.model, direction="forward")


summary(iris.model)



###############################################

### 다중공선성(Multicolinearity)            ###

###############################################

## car::vif(회귀분석결과물)

car::vif(iris.model)


iris.model2 = lm(SepalLength ~ SepalWidth + PetalLength, data=iris2)

car::vif(iris.model2)

summary(iris.model2)


iris.model3 = lm(SepalLength ~ SepalWidth + PetalWidth, data=iris2)

car::vif(iris.model3)

summary(iris.model3)



### adjusted Rs가 petalLength를 쓸때가 더 크기 때문에 petalLength를 쓰겠다.


###############################################

### 독립변수들의 영향력 크기 비교           ###

###############################################

## 표준화된 회귀계수 구하기

## QuantPsyc::lm.beta(회귀분석결과물)

QuantPsyc::lm.beta(iris.model2)


## 표준화된 회귀계수의 절대값이 가장 큰 독립변수가

## 종속변수에게 가장 큰 영향을 준다.

## PetalLength(1.003) > SepalWidth(0.312)


###################################

### 독립변수에 질적 자료 넣기 ####

##################################


View(iris2)


iris.model.dummy = lm(SepalLength ~ ., data = iris2)

summary(iris.model.dummy)

### setosa가 나오지 않음 => setosa를 기준으로 하겠다


survey = data.frame(id=1:4, gender = c("f", "m", "m", "f"))

View(survey)

survey$d.gender = ifelse(survey$gender == "m",

                         0, 1)

View(survey)


iris2$d.species1 = ifelse(iris2$Species == "versicolor", 1, 0)

iris2$d.species2 = ifelse(iris2$Species == "virginica", 1, 0)


iris3 = iris2[,-6] ## -붙으면 6번째 있는 열 빼고 만든 것

View(iris3)

iris3 = iris2[,-1]

iris.model4 = lm(SepalLength~ ., data = iris3)

summary(iris.model4)






반응형