close_btn
조회 수 11627 추천 수 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 41264
87 투빅스 7&8기 6주차 과제 TF-IDF 문서유사도 측정 - 8기 최서현 최서현 2017.08.31 8103
86 투빅스 7&8기 5주차 과제 Selenium Crawling - 8기 김강열 김강열 2017.08.24 7365
85 투빅스 7&8기 5주차 과제 Image Augmentation - 8기 김민정 김소희 최수정 황다솔 file 민정e 2017.08.24 7264
84 투빅스 7&8기 5주차 과제 Beautiful Soup 이용한 Crawling - 8기 류호성 file 류호성 2017.08.24 7293
83 투빅스 7&8기 4주차 과제 tree, RF, bagging, boosting 이용 분석 - 8기 조양규 file dial123 2017.08.17 7633
82 투빅스 7&8기 4주차 과제 의사결정나무&랜덤포레스트 - 8기 김강열 김강열 2017.08.17 7575
81 투빅스 7&8기 3주차 과제 클러스터링 구현 - 8기 권문정 김강열 이현경 조양규 1 이현경 2017.08.10 8185
80 투빅스 7&8기 3주차 과제 PCA - 8기 이현경 file 이현경 2017.08.12 7191
79 투빅스 7&8기 2주차 과제 연관성 분석 - 8기 조양규 file dial123 2017.08.03 8345
78 투빅스 7&8기 2주차 과제 나이브베이즈 구현 - 8기 이현경 file 이현경 2017.08.03 8125
77 투빅스 7&8기 2주차 과제 로지스틱/Ridge/Lasso&알고리즘 - 8기 김강열 file 김강열 2017.08.03 7797
76 투빅스 7&8기 1주차 과제 알고리즘 - 8기 김강열 file 김강열 2017.07.27 7424
75 투빅스 7&8기 1주차 과제 회귀분석 - 8기 황다솔 file 다솔 2017.07.27 7637
74 투빅스 6&7기 8주차 과제 PCA(주성분 분석) - 7기 이동수 1 탱탱볼 2017.03.18 10321
73 투빅스 6&7기 8주차 과제 LBP 알고리즘 구현 - 7기 이광록 1 file 2017.03.16 9554
72 투빅스 6&7기 8주차 과제 SVM - 7기 이광록 1 file 2017.03.16 10344
71 투빅스 6&7기 6주차 과제 소멸언어 분류 예측 데이터분석 - 이동수(7기) 2 file 탱탱볼 2017.03.02 11957
70 투빅스 6&7기 5주차 과제 의사결정나무&앙상블 - 7기 최희정 2 file 히둥 2017.02.23 15497
69 투빅스 6&7기 4주차 과제 K-means 분석 및 구현 - 7기 이광록 2 2017.02.19 11069
68 투빅스 6&7기 4주차 과제 KNN 구현 - 전종섭(7기) 2 뻐엉 2017.02.16 10906
Board Pagination ‹ Prev 1 ... 2 3 4 5 6 7 8 9 ... 10 Next ›
/ 10

나눔글꼴 설치 안내


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

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

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5