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)