R 회귀분석 예측 - R hoegwibunseog yecheug

첨부파일에 올려놓은 homework2라는 자동차 관련 데이터로 실제 회귀분석을 해보겠습니다.

데이터는 위에 사진 처럼 생겼습니다.

가격에 대한 column을 종속변수(y 변수)로 회귀분석을 실시해 보겠습니다.

1. 연료데이터에 대해서 가솔린과 디젤에 따른 가변수 생성하기 (다른 범주형 데이터도 factor처리해주기)

2. 모델 적합하기(유의하고 결정계수가 높은 모델로)

3. 회귀진단하고 문제가 있다면 처리해주기

4. 이상치를 제거하여 결정계수 높혀주기

5. 예측구간 구하고, 실제 값이 예측구간안에 포함되는지 확인해보고, 예측구간에 포함된 비율 확인해보기

순으로 실시해 보겠습니다.

데이터를 불러서 저장해주고, 어떻게 생겼는지 확인해봅니다.

data <- read.csv("C:\\Users\\LeeDaKyeong\\Desktop\\투빅스\\homework2.csv")

head(data)

결측치가 존재하므로 결측치를 제거해 줍니다.

dim(data)

data <- data[complete.cases(data), ]

409행이었던 데이터가 결측치 제거로 인해 408행이 된 것을 알 수 있습니다.

본격적으로 회귀분석을 하기에 앞서, 

범주형 데이터들을 처리(회사명, 년식, 종류, 연료, LPG, 하이브리드, 변속기)해 줍니다.

*범주형 데이터란? 범주형 자료는 "측정 척도가 범주 집합으로 구성된 자료"로써 

(남, 여), (지구, 목성, 토성), (치타, 불곰, 호랑이, 사자), (싫음, 중간, 좋음) 처럼 

수치로 표현할 수 없는 자료를 의미합니다.

data에서 범주형인 연료 col에 대하여 가변수를 생성하여 factor처리를 해보겠습니다.

*꼭 가변수로 처리하지 않고 그냥 factor처리해 주어도 되지만 가변수를 공부하기 위해 굳!이! 해보겠습니다.

연료의 종류에는 가솔린, 디젤, LPG가 있는데 LPG에 대해서는 이미 가변수가 존재하므로 '가솔린'과 '디젤'에 대해서만 가변수를 생성하여 범주형 데이터를 처리해 보겠습니다. 

NA로 이루어진 '가솔린'과 '디젤'열을 기존의 data와 연결시켜 temp라는 새로운 데이터를 만들어 줍니다.

가솔린 <- NA

디젤 <- NA

temp <- cbind(data,가솔린, 디젤)

head(temp)

새로 생성한 가솔린 열에 연료의 종류가 가솔린 인 행은 1을, 그렇지 않은 행은 0을 넣어줍니다.

디젤 열 역시 마찬가지로 처리해 줍니다. 

temp$가솔린[temp$연료 == "가솔린"] <- 1 

temp$가솔린[is.na(temp$가솔린)] <- 0 

temp$디젤[temp$연료 == "디젤"] <- 1 

temp$디젤[is.na(temp$디젤)] <- 0 

head(temp)

이때, 1과 0은 진짜 숫자 1과 0을 의미하는 것이 아니라 범주형이므로 factor처리를 해줍니다.

temp$가솔린 <- as.factor(temp$가솔린)

temp$디젤 <- as.factor(temp$디젤)

연료변수에 대하여 가변수를 만들어 처리해 주었으므로 연료변수는 제거해 줍니다.

연료변수가 8번째 열 이므로 temp데이터에서 8번째 열을 제거해 주었습니다.

colnames(temp)

temp <- temp[,-8]

이제 나머지 범주형 데이터도 factor처리 해 주겠습니다.

temp$년식 <- as.factor(temp$년식) 

temp$LPG <- as.factor(temp$LPG)

temp$회사명 <- as.factor(temp$회사명)

temp$종류 <- as.factor(temp$종류)

temp$하이브리드 <- as.factor(temp$하이브리드)

temp$변속기 <- as.factor(temp$변속기)

전체 데이터를 가지고 회귀모형에 적합시켜 보겠습니다.

fit <- lm(가격~., data = temp)

summary(fit)

유의하지 않은 변수가 많아보입니다. 

forward, backward, stepwise 세 가지 방법의 변수 선택 방법으로 변수를 선택해보겠습니다.

1.forward

fit.con <- lm(가격~1,data = temp)

fit.forward <- step(fit.con,scope=list(lower=fit.con,upper=fit),direction = "forward")

summary(fit.forward)

forward로 선택된 최종 변수는 마력, 회사명, 종류, 배기량, 하이브리드, 중량, 변속기, 년식, 연비, 디젤, 토크 이며 수정된 결정계수는 0.8441입니다.

2. backward

fit.backward <- step(fit, scope = list(lower = fit.con, upper = fit), 

                     direction = "backward")

summary(fit.backward) #결정계수 : 0.8439

backward로 선택된 최종 변수는 회사명, 년식, 종류, 연비, 토크, 하이브리드, 배기량, 중량, 변속기, 디젤 이며 수정된 결정계수는 0.8439입니다.

3. stepwise

fit.both <- step(fit.con, scope = list(lower = fit.con, upper = fit), direction = "both")

summary(fit.both)

stepwise로 선택된 최종 변수는 회사명, 종류, 배기량, 하이브리드, 중량, 변속기, 년식, 연비, 디젤, 토크 이며 수정된 결정계수는 0.8439입니다.

forward 변수선택이 수정된 결정계수가 가장 높으므로 fit.forward 모형을 선택하겠습니다.

fit <- lm(가격 ~ 마력 + 회사명 + 종류 + 배기량 + 하이브리드 + 

            중량 + 변속기 + 년식 + 연비 + 디젤 + 토크, data = temp)

이번에는 만든 모형이 회귀분석의 가정을 잘 따르는지 회귀진단을 해보겠습니다.

먼저 다중공선성에 대해 알아보겠습니다.

페키지 설치, library 실행 후 각 변수들간 산점도를 확인합니다.

library("car")

library("psych")

pairs.panels(temp[names(temp)])

사진에는 잘 안보이지만 연비-마력, 마력-토크 등에서 상관관계가 높게나와 다중공선성이 의심됩니다.

진짜 다중공선성이 있는 변수가 무엇이 있는지 vif함수로 알아보겠습니다.

vif(fit) 

가장 오른쪽 열에 2~2.5를 넘는 변수에 토크, 마력, 배기량, 디젤, 연비 등이 있습니다.

우선 가장 큰 값을 가지고 있는 토크변수를 빼고 다시 회귀모형에 적합시켜보겠습니다.

fit1 <- lm(가격 ~ 마력 + 회사명 + 종류 + 배기량 + 하이브리드 + 중량 + 변속기 + 년식 + 연비 + 디젤, data = temp)

vif(fit1)

아직 2보다 큰 수가 있으므로 가장 큰 값을 가지는 중량을 빼고 다시 모형에 적합시켜 보겠습니다.

fit2 <- lm(가격 ~ 마력 + 회사명 + 종류 + 배기량 + 하이브리드 + 변속기 + 년식 + 연비 + 디젤, data = temp)

vif(fit2)

역시 같은 방법으로 배기량을 제거해 보겠습니다.

fit3 <- lm(가격 ~ 마력 + 회사명 + 종류  + 하이브리드 + 변속기 + 년식 + 연비 + 디젤, data = temp)

vif(fit3)

이제 모두 2를 넘지 않으므로 이 모형을 선택하도록 하겠습니다.

summary(fit3) 

나머지 가정에 대해서도 회귀진단을 해보겠습니다.

par(mfrow=c(2,2))

plot(fit3)

우선 눈에 띄는 이상치를 처리해 보겠습니다.

위 그래프에서 보여지는 3,4,10번 데이터를 지우고 다시 회귀모형에 적합시켜 보겠습니다.

fit <- lm(가격 ~ 마력 + 회사명 + 종류  + 하이브리드 + 변속기 + 년식 + 연비 + 디젤, data = temp[-c(3,4,10),])

summary(fit)

이상치 제거 후 결정계수가 많이 좋아 진 것을 볼 수 있습니다.

다시 plot을 그려 회귀진단을 해보겠습니다.

par(mfrow=c(2,2))

plot(fit)

선형성, 정규성(살짝 애매하지만 넘어가도록 하겠습니다.), 등분산성이 어느정도 만족하므로 

최종모형을 fit로 선택하겠습니다.

이제 구해 놓은 회귀모형으로 가격을 예측하고 실제 값과 비교해 보겠습니다.

predict함수를 사용하여 예측합니다.

pre <- predict(fit, newdata = temp)

pre <- as.data.frame(pre)

head(pre)

이번에는 점이 아닌 하한과 상한이 존재하는 예측구간을 구해보겠습니다.

pre <- predict(fit, newdata = temp, interval = "predict")

pre <- as.data.frame(pre)

head(pre)

잘 예측 되었는지 비교하기 위해 오른쪽에 실제 값을 붙여주겠습니다.

pre <- cbind(pre, temp$가격)

head(pre)

잘 예측 되었는지 한눈에 확인 할 수 있도록 

실제 값이 포함되면 T, 그렇지 않으면 F를 가지는 tf열을 추가하고,

얼마나 잘 예측 되었는지 비율을 알아 보겠습니다.

tf <- NA

pre <- cbind(pre, tf)

pre$tf[pre$`temp$가격`>= pre$lwr & pre$`temp$가격` <= pre$upr] <- T

pre$tf[is.na(pre$tf)] <- F

head(pre)

sum(pre$tf=="TRUE")/dim(pre)[1] 

예측에 성공하는 비율이 약 0.94으로, 성공적인 회귀분석을 마치겠습니다.

출처 : TOBIGS

회귀분석/ R/ R Studio/ lm/ predict/ 회귀진단/

다중공선성/ 정규성/ 선형성/ 자동차데이터/

다중선형회귀분석

Toplist

최신 우편물

태그