다중회귀분석(Multiple Regression)

주울·2022년 12월 8일

데이터분석

목록 보기
6/7

데이터 mtcars를 이용하여 다중회귀분석을 해보자.

데이터 확인

# mpg : mileage per gallon(연비) <- 종속변수
# wt : weight of cars 
# vs : Engine(0=V-shaped, 1=straight)
# gear : Number of forward gears
View(mtcars)
input = mtcars[,c("mpg","vs","gear","wt")] # 변수 추출
head(input)
dim(input) # 총 32개
summary(input)
str(input)
library(descr)
freq(input$vs)
freq(input$gear)

연속변수 분포 확인

## 연속형 변수 mpg,wt의 분포를 확인해보자.

hist(input$mpg, breaks = seq(10,40,by=1))
hist(input$wt, breaks = seq(1,6,by=0.1)) 

연속변수 정규성 검정

## 연속형 변수 mpg,wt의 정규성 검정을 해보자.

shapiro.test(input$mpg) # 0.05보다 큼->정규분포
shapiro.test(input$wt) # 0.05보다 큼->정규분포
#mpg = b0 + b1*vs + b2*gear + b3*wt

상관관계 분석

## 연속형 변수들과 종속변수 간의 상관관계를 분석해보자.

plot(input$wt,input$mpg) #차의 무게와 연비는 반비례. 보기편하게 종속을 y축으로 두기(상관은없음)
plot(input)
a = cor(input$mpg, input$wt) # == cor.test(input$mpg, input$wt)
a #-0.86 -> 굉장히 강한 음의 상관관계.
a^2 #0.75 -> 설명력에 해당.

단순 선형 회귀 분석

## 종속변수와의 단순선형회귀분석을 각 독립변수마다 해보자.

res = lm(mpg ~ wt, data=input)
summary(res) #r-squared 값이 0.75(설명력) / 무게 1증가 시, 연비 -5.3
res = lm(mpg ~ vs, data=input) #vs(바이너리)가 mpg에 미치는 영향. 엔진 v-shape에 비해 straight이 연비를 7.9만큼 높인다.
summary(res)
res = lm(mpg ~ gear, data=input) #gear는 3,4,5있었음. -> factor와의 차이도 보자.
summary(res)
res = lm(mpg ~ factor(gear), data=input)
summary(res) # 기어가 3인경우에 비해 기어가 4인경우는 8.4 증가. 기어가 3인 경우에 비해 기어가 5인 경우가 5.27 증가
# 기어 3,4 차이와 기어 4,5 차이가 비슷하면 factor안해도 됨.

t-test(GLM은 t-test, anova 다 포함하는 개념이다.)

## vs는 바이너리 범주형 변수이므로, vs로 두 그룹을 나누어 t-test를 해보자.

var.test(mpg ~ vs, data=input, conf.level=0.95) # 등분산 검정-> 0.05보다 큼->등분산맞음.
t.test(mpg ~ vs, data=input, var.equal=TRUE, conf.level=0.95) #위의res 결과와 같이 보기.

ANOVA 검정

## gear 변수가 3,4,5 이므로 gear를 기준으로 세그룹으로 나누어 anova 검정을 해보자.

bartlett.test(mpg ~ gear, data=input) #등분산 검정->0.05보다 큼->등분산맞음.
out = aov(mpg ~ factor(gear), data=input)
summary(out)
TukeyHSD(out) #위의 res 결과와 같이 보기
plot(TukeyHSD(out))
aggregate(mpg ~ gear, data=input, mean) # 그룹별 평균 확인하기

fomula를 만들고 변수선택 후, 최종 fomula를 만들자.

## 1. formula 만들기

res = lm(mpg ~ wt + vs + factor(gear), data=input) # 종속변수(연속형) 먼저 쓰기.
summary(res)

##2. 변수선택(다 들어가는것이 좋을지): AIC(Akaike's an information criterion)는 작을수록 설명력이 좋은 것.

step(res) #stepwise. lm으로 식 만들고 step 사용
res = lm(mpg ~ wt, data=input)
step(res) #gear없이 두 개의 변수로 이루어진것이 더 좋다는 것을 확인할 수 있음.(AIC가 더 작아짐.)
step(res, direction="forward") # 다 넣었을 때 AIC값. 필요한 것부터 빼는 것
step(res, direction="backward") #필요없는 것부터 뺌
step(res, direction="both")
# 최종적으로 mpg = 33.0 - 4.4*wt + 3.1*vs 로 결정

## 3. VIF(Variance Inflation Factor) 확인(다중공선성): x끼리 연관이 높아서 생기는 문제를 해결

install.packages("car")
library(car)
res = lm(mpg ~ wt + vs + factor(gear), data=input)
vif(res) #10이상이면 빼야됨.
m = lm(mpg ~ ., data=input)
vif(m)
vif_values = vif(m)
barplot(vif_values, main ="VIF Values", horiz=TRUE, col="steelblue")

0개의 댓글