close_btn
조회 수 11254 추천 수 0 댓글 2
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print Files
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print Files


#HW1. 회귀분석


rm(list=ls()) #변수제거
setwd("C:/Users/ProgrammingAddress/Desktop/투빅스/regression")
data1 <- read.csv("homework2.csv",stringsAsFactors = F)

###########################################
###########자료확인 ###############
###########################################
dim(data1) #13개의 variables와 409개의 observations로 구성되어 있다.
colnames(data1)

for(i in 1:nrow(data1)){
  for(j in 1:ncol(data1)) {
  if(is.na(data1[i,j])==1) {print(i)}}}
data1 <- data1[-67,] #67번째에 있는 결측값이 있는 행을 제거해줬다.
#종속변수는 가격, 나머지는 다 설명변수이므로 중선형 회귀모델을 이용할 것이다.
colnames(data1)[1]<-"y" #편의상 종속변수 "가격"을 y로 지정하겠다.


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

############자료 전처리 및 모델링############
############################################
m <- lm(y~., data=data1)
data2 <- data.frame(model.matrix(m))
#model.matrix(m)은 modelmatrix를 만들어주는 함수로써, factor형 변수들을 모두 dummy variable처리를 해준다. 따라서 회사명, 종류, 중량, 연료 등은 가변수 처리를 따로 해줄 필요가 없다. 그러나 년식은 범주형이지만 R에서는 숫자형으로 취급해서 따로 가변수화 시켜야 한다.

#변수 :년식 가변수 처리해주기
year <- matrix(NA,408,5)
colnames(year) <- paste0("year",2015:2011)

for ( i in 1:nrow(data2) ) {
  if(data2[i,7]=="2015") {year[i,1]=1}
  else if(data2[i,7]=="2014") {year[i,2]=1}
  else if(data2[i,7]=="2013") {year[i,3]=1}
  else if(data2[i,7]=="2012") {year[i,4]=1}
  else if(data2[i,7]=="2011") {year[i,5]=1}
  else {year[i,1:5]=0}
  }
year <- as.data.frame(year)
year[is.na(year)==1] <- 0

#가변수처리된 년식을 data2로 합쳐주기
dim(data2)
dim(year)

data2 <- data2[,-1] #modeling했었을 때 앞의 모두 1인 열 없애주기. 1은 중회귀 분석을  행렬로 표현할 때, 회귀계수(beta0)을 나타내주기 위해서 생긴 열이다.
head(data2)
data2 <- cbind(as.data.frame(data1[,1]),data2) #가격(y) 자료 포함시키기
colnames(data2)[1] <- "y"
data2 <- cbind(data2, year)
#범주형 자료 년식 없애주기
data2 <- data2[,-7]
m <-lm(y~.,data=data2)

#전처리가 다 된 data2 형태 확인하기

Cap 2016-08-04 11-58-25-902.png



library(psych)
pairs.panels(data1[names(data1)])

Cap 2016-08-04 11-47-32-355.png

#회귀분석의 기본가정에 따르면 오차항이 정규분포를 따르므로 그를 포함하고 있는  개별값 Yi도 정규분포를 따라야 한다. 하지만 그림으로 봤을 때, 전체적으로 오른쪽 꼬리가 긴 형태로 되어있다. 수정이 필요해 보인다. 잔차검정을 통해서 변수변환을 해줘야 될 수도 있다는 생각에서 넘어가도록 하자.

#독립변수간 상관관계가 높은 것들이 몇개 눈에 띈다. 다중공선성이 의심된다.
#이는 vif로 최종검정을 해주도록 하자.


#######################################
########다중공선성 판단하기############
#######################################
library("car", lib.loc="C:/Program Files/R/R-3.2.5/library")
vif(m) #토크가 독립변수간 다중공선성이 크다고 판단. 따라서 열에서 제외
reduced <- data2[,-13]

m1 <- lm(y~.,data=reduced)
vif(m1) #연료가솔린이 다중공선성이 가장 큼
reduced1 <- reduced[,-13]
m2 <- lm(y~., data=reduced1)
vif(m2)
reduced2 <- reduced1[,-17]
m3 <- lm(y~.,data=reduced2)
vif(m3)
reduced3 <- reduced2[,-18]
m4 <- lm(y~.,data=reduced3)
vif(m4)
reduced4 <- reduced3[,-7]
m5 <- lm(y~.,data=reduced4)
vif(m5)
reduced5 <- reduced4[,-15]
m6 <- lm(y~.,data=reduced5)
vif(m6)

##VIF가 가장 높은 변수를 제거해주는 단순작업이라 결과값을 생략하였다. 이제 다중공선성이 모두 제거된 변수만 남았다. 문제가 없으니 이제 이 변수들을 가지고 변수선택을 하도록 하자.


######################################
############변수 선택하기##############
######################################

#Forward Selection
fit.con <- lm(y~1,data=reduced5) #최소모형. 상수항만 있음
#최소모형에서 최대모형까지 하나씩 추가하면서 살펴보는 것
fit.forward <- step(fit.con, scope=list(lower=fit.con , upper= m6), direction = "forward" )

summary(fit.forward)
#Residual standard error: 703.8 on 396 degrees of freedom
#Multiple R-squared:  0.785, Adjusted R-squared:  0.779
#F-statistic: 131.4 on 11 and 396 DF,  p-value: < 2.2e-16


#Backward Elimination
fit.backward <- step(m6 ,scope=list(lower=fit.con,upper=m6),direction="backward")

summary(fit.backward)

#Residual standard error: 701 on 393 degrees of freedom
#Multiple R-squared:  0.7883, Adjusted R-squared:  0.7807
#F-statistic: 104.5 on 14 and 393 DF,  p-value: < 2.2e-16

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

summary(stepwise)

#Residual standard error: 703.8 on 396 degrees of freedom
#Multiple R-squared:  0.785, Adjusted R-squared:  0.779
#F-statistic: 131.4 on 11 and 396 DF,  p-value: < 2.2e-16


##adj R^2이 Backward Elimination이 가장 높다. 따라서 이 모형을 채택하도록 하자.

backwardmodel <- reduced5[,-c(6,16,17,18)] #backward elimination을 통해 제거된 독립변수를 제거해준다.(회사명현대, year2014, year2013, year2012)
fit <- lm(y~., data=backwardmodel)




##################################
###########잔차검정###############
##################################

par(mfrow=c(2,3))
plot(fit, which=c(1:6))

Cap 2016-08-04 11-28-35-820.png

#Residuals vs Fitted : liner pattern에 크게 위배되지 않으므로 선형성 가정을 만족한다고 판단한다.
#Normal Q-Q : Straight dashed line에서 약간 벗어난 점들이 보이지만 전반적으로는 정규성을 만족한다.
#Scale-Location : 등분산성을 판단하는 그림으로써, 흩어짐의 정도가 x축에 관계없이 일정해야 하는데 x가 증가함에 따라서 분산이 커지고 있다. 따라서 이것은 등분산성에 문제가 있다고 판단한다. 왼쪽으로 치우친 분포를 정규분포화 시켜주기 위해서 로그변환을 해줘야 할 것으로 판단된다.


backwardmodel[,1] <-log((backwardmodel[,1]))
logtransfit <- lm(y~., data=backwardmodel)
summary(logtransfit) #Adjusted R-squared:  0.9031


plot(logtransfit, which=c(1:6))

Cap 2016-08-04 11-28-44-557.png


#Residuals vs Fitted : liner pattern에 크게 위배되지 않으므로 선형성 가정을 만족한다고 판단한다.
#Normal Q-Q : Straight dashed line에서 약간 벗어난 점들이 보이지만 전반적으로는 정규성을 만족한다. outlierTest를 통해서 이상치를 제거해주면 더욱 더 결정계수가 좋아질 것으로 예상된다.
#Scale-Location : y축 0을 기준으로 고르게 분포되어있음을 볼 수 있다. 따라서 등분산성 가정을 만족한다.


outlierTest(logtransfit) #10번째 관측치가 아웃라이어로 판단되었다.


#############################
#######이상치 제거###########
#############################
dim(backwardmodel)
lastmodel <- backwardmodel[-10,]
dim(lastmodel) #10번째 관측치가 제거되었다.
lastfit <- lm(y~., data=lastmodel)
summary(lastfit) #Adjusted R-squared가 0.9043으로 전보다 약간 더 향상되었다.



##################################
########예측률 구하기#############
##################################
pre_y<- predict(lastfit, newdata = lastmodel, interval = "predict")
pre_y<- as.data.frame(pre_y)
dim(pre_y)
rate <- as.data.frame(rep(NA,407))
rate <- cbind(pre_y, rate)
rate <- cbind(lastmodel[,1],rate)
colnames(rate) <- c("realnum","fittedvalue","lower","upper","check")
head(rate,2)
#realnum fittedvalue    lower    upper check
#1 9.061840    9.314340 8.990204 9.638476    NA
#2 9.319195    9.249549 8.925917 9.573181    NA

#각 열의 정보:실제값, 예측값, 하한, 상한, 예측성공 유무(예측값이 개별값의 95%신뢰구간 안에 포함되어 있으면 성공)


for (i in 1: nrow(rate)) {
  + if (rate[i,1]>= rate[i,3] & rate[i,1] <= rate[i,4]) {rate[i,5]=1}
  else {rate[i,5]=0}
}
#lastmodel자료에 rate[,5]열을 추가
lastmodel <- cbind(lastmodel,rate[,5])
table(rate[,5])
#  0   1
# 19 388
388/(19+388) #예측률이 약 95.3%가 나온다.


List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 우수 코드 게시판 이용 관련 공지사항 DataMarket 2014.05.21 39699
» 투빅스 5&6기 2주차과제 1번 회귀분석 -6기 한동훈 2 file 투빅스6기한동훈 2016.08.04 11254
52 투빅스 5&6기 2주차 과제 2번 마방진 만들기 - 6기 임진주 4 file 진주 2016.08.04 10967
51 투빅스 5&6기 1주차 과제 2번 재석 2016.07.28 9426
50 5&6기 1주차 과제 1번 - 6기 이윤섭 겨뽀 2016.07.28 10131
49 투빅스 5&6기 1주차 과제코드 Alan 2016.07.27 9566
48 크롤링 - 전국 이디야 매장정보를 중심으로 (5기 이승은) 2 file 켜져있는멀티탭 2016.03.26 26758
47 crawling - 5기 이제형 4 trevor 2016.03.24 14421
46 PCA (주성분 분석) - 5기 이제형 trevor 2016.03.09 14764
45 NBA data 회귀분석 / Adult data 로지스틱 회귀분석, 나이브베이즈, 의사결정나무 - 5기 정현재 2 file 정현재 2016.03.03 17955
44 NBA 회귀분석 / adult 로지스틱회귀, 나이브베이즈, 의사결정나무 - 5기 최도현 3 file 알빈 2016.03.03 20291
43 K-Means Funtion (5기 이제형) 3 trevor 2016.02.25 13758
42 박이삭_기초스터디__반복문 및 apply함수 및 데이터프레임다루기 지니상 2016.02.12 10694
41 최도현_기초스터디_R기초 지니상 2016.02.12 11386
40 양우식_기초스터디_dplyr_sqldf 지니상 2016.02.12 12180
39 이정민_기초스터디_stringr패키지 지니상 2016.02.12 17669
38 고가영_기초스터디_파일불러오기 및 Rmarkdown 지니상 2016.02.12 13572
37 입출금 처리 프로그램 (4주차 과제) - 5기 방정훈 file Alan 2016.02.10 12438
36 연관성 분석(3주차 과제) & KNN 함수만들기(3주차 과제) - 4기 김선지 순지 2016.02.09 13676
35 연관성 분석(3주차 과제) - 5기 이정민 1 file 쩡마 2016.02.07 14129
34 KNN 함수만들기 (3주차 과제) - 5기 방정훈 Alan 2016.02.03 14404
Board Pagination ‹ Prev 1 ... 2 3 4 5 6 7 ... 8 Next ›
/ 8

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5