close_btn
조회 수 1412 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print Files
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print Files
 
#회귀분석코드
rm(list=ls())

# 데이터
library(caret)
library(MASS)
data(Boston)
str(Boston)

##### 변수설명 ########################################
# crim : per capita crime rate by town.
# zn :proportion of residential land zoned for lots over 25,000 sq.ft.
# indus :proportion of non-retail business acres per town.
# chas : Charles River dummy variable (= 1 if tract bounds river; 0 otherwise).
# nox : nitrogen oxides concentration (parts per 10 million).
# rm : average number of rooms per dwelling.
# age : proportion of owner-occupied units built prior to 1940.
# dis : weighted mean of distances to five Boston employment centres.
# rad : index of accessibility to radial highways.
# tax : full-value property-tax rate per \$10,000.
# ptratio : pupil-teacher ratio by town.
# black : 1000(Bk - 0.63)^2 where Bk is the proportion of blacks by town.
# lstat : lower status of the population (percent).
# medv : median value of owner-occupied homes in \$1000s.
#######################################################
##### 회귀분석하기 #####
### medv(본인 소유의 주택가격(중앙값) 단위: $1,000)을 예측해주세요

#데이터 탐색
head(Boston,10)
table(is.na(Boston))
#전부 연속형 변수, 잘못 나온 자료형은 없는듯하다

#데이터 탐색
str(Boston)
summary(Boston)
#이상치가 몇개 보이는데 나중에 생각하기로 하자.

#산점도를 그릴려고 했으나 잘 안보인다
plot(Boston[-14],Boston[14])

#창을 만들어서 산점들을 확인하자
for(i in 1:(length(Boston)-1)){
  if(i%%9==0| i==1){ # i가 9로 나누어떨어지거나 1이면
    x11() #새창을 열어서
    par(mfrow=c(3,3)) # palet를 3x3으로 나눠라
  }
  plot(Boston[,i],Boston[,14],main = colnames(Boston)[i])
}
plot(Boston[,4],Boston[,14],jitter=0.3)

#나름대로 해석한 결과
#crim : 음의관계
#zm : 양의관계
#indus : ??
#chas : ??
#nox : 음의관계
#rm : 양의관계
#age : ?? (곡선으로 추정)
#dis : ?? (곡선으로 추정)
#rad : ??
#tax : ??
#ptratio : 음의관계
# black : ??
#lstat : 음의관계

#dummy변수의 경우 구분하기 어려워서 jitter로 흩뿌려보았다
library(ggplot2)
ggplot(Boston, aes(chas,medv)) + geom_jitter()

lm1 <- lm(medv~.,data= Boston)
summary(lm1)
#의외로 모델이 괜찮다
#F 적합성 p값 2.2e-16로 모형은 매우 유의하다
# 변수는 indus와 age 빼고 다 유의하게 나왔다.
#indus와 age는 곡선모양으로 변환이 필요해보인다

par(mfrow=c(2,2))
plot(lm1)
#1) 첫 번째 그래프 : Residuals vs Fitted plot
#즉 x축에 모형의 적합된 예측값, y축에는 잔차 표시. 선형회귀에서 오차는 평균이 0이고 분산이 일정한 정규분포를 가정하므로 잔차의 평균은 0을 중심으로 일정하게 분포되야하고 특정한 패턴이나 크게 벌어지는 값이 없어야 함.
#2) 두 번째 그래프 : Normal Q-Q plot
#잔차가 정규분포를 따르는지 확인하기 위한 Q-Q plot으로 직선 주변에 분포하여야 함.
#3) 세 번째 그래프 : Scale-Location plot
#x축에 모형의 적합된 예측값, y축에는 표준화 잔차(Standardized residuals)를 표시, 이상점(outlier)을 탐지할 수 있는 그래프로 빨간색 추세선이 0인 직선이 가장 이상적이며 크게 벗어난 값은 이상점일 확률이 있음. 0에서 멀리 떨어진 값이 있으면 표준화 잔차가 크고 회귀 직선이 적합하지 못하다는 의미.
#4) 네 번째 그래프 : Residuals vs Leverage plot
#여기서 레버리지는 설명변수가 얼마나 극단에 치우쳐 있는지를 말함. 대부분 값들이 1~10일 때 어느 한 값이 1000을 갖는다면 그 1000을 갖는 점은 레버리지 값이 큰 것이며, 점들이 한쪽에 몰려있을수록 모형이 잘 적합되는 것임. 우측 상단과 우측 하단에는 선으로 쿡의 거리(Cook’s Distance)가 표시. 우측 상단과 우측 하단에 쿡의 거리가 큰 값들이 위치. 쿡의 거리가 0.5이상인 빨간 점선을 벗어나면 무시할 수 없는 예측치를 크게 벗어난 관측값임.
#대체로 괜찮다, 다만 이상치는 조금 있는 듯하다

#이상치 제거하기
library(car)
outlierTest(lm1)

#이상치 369,372,373행 제거
Boston2<-Boston[-c(369,372,373),]

#이상치 제거된채로 다시 모델 만들기
lm2<-lm(medv~.,data= Boston2)
summary(lm2)
summary(lm1)
#모델이 Adjusted R-squared: 0.7719 로 더 안좋아졌다

#stepwise실시
fit.con <- lm(medv~ 1,data= Boston)
fit.full<- lm1
lm3<-step(lm1, list(lower=fit.con, upper=fit.full) ,direction = "both",data= Boston)
summary(lm3)
#조정결정계수가 0.7348 로 미세하게 나아졌으나, 다른 방법을 생각해보기로 한다
#제거된 변수가 좋은 변수일 수도 있기 때문

summary(lm1)
attach(Boston)

#유의하지 않은 변수 indus와 age를 변형시켜 보았다
#correlaion을 기준으로 indus는 로그변환 age는 제곱을 시켰다
plot(indus,medv)
plot(age,medv)
cor(indus,medv)
cor(age,medv)
cor(log(indus),medv)
cor(log(age),medv)
cor(indus^2,medv)
cor(age^2,medv)
age2<-age^2
indus_log<-log(indus)
Boston4<-Boston
Boston4$age2<-age2
Boston4$indus_log<-indus_log
head(Boston4)

lm5<-lm(medv~.,data=Boston4)
#수정된 결정계수 0.7462로 미세하게 증가

summary(lm5)

#회귀 진단
## shapiro.test 정규성검정
<-resid(lm5)
shapiro.test(e)
hist(e)
#정규성 따르지 않음

#다중공선성 발생 
vif(lm5)
Boston5<-Boston4
Boston5$age<-NULL
Boston5$indus<-NULL
head(Boston5)
lm6<-lm(medv~.,data=Boston5)
vif(lm6)

options(max.print=4000)

# 영향력 관측값 제거
a<-influence.measures(lm6)
table(a$is.inf)
b<-summary(a)
d<-rownames(b)
Boston6<-Boston5[-as.numeric(d),]
lm7<-lm(medv~.,data=Boston6)
summary(lm7)

#정규성을 아직도 따르지 않는다
e2 <-resid(lm7)
shapiro.test(e2)
hist(e2)
str(Boston6)

#변수를 줄여보자
cor1<-cor(Boston6[,-12],Boston6[,12])
cor_or<-cor1[order(abs(cor1),decreasing = T),]
#correatlion을 기준으로 4개로 줄여보았다  
head(cor_or,4)
cor_or7<-names(head(cor_or,4))
Boston7<-cbind(Boston6[,cor_or7],medv=Boston6$medv)
lm8<-lm(medv~.,data=Boston7)
summary(lm8)
e3 <-resid(lm8)
shapiro.test(e3)
hist(e3)
#아직도 정규성을 안따른다

#indus_log와 lstat를 곱하여 상호작용 변수를 추가해보았다 
lstat_induslog<-Boston7$indus_log*Boston7$lstat
Boston8<-Boston7
Boston8$lstat_induslog<-lstat_induslog
head(Boston8)
lm9<-lm(medv~.,data=Boston8)
summary(lm9)
e4 <-resid(lm9)
shapiro.test(e4)
hist(e4)

#그러나 다중공선성 발생
vif(lm9)

#이번엔 lstat와 ptratio를 곱하여 상호작용 변수를 추가해보았다  
ls_pt<-Boston7$lstat*Boston7$ptratio
Boston9<-Boston7
Boston9$ls_pt<-ls_pt
head(Boston9)
lm10<-lm(medv~.,data=Boston9)
summary(lm10)
e5 <-resid(lm10)
shapiro.test(e5)
hist(e5)

#또 다시  다중공선성 발생
vif(lm10)

#결국 선택한 최종 모델
summary(lm8)

#최종모델로 medv예측
#train과 test 7대 3으로 나눔
set.seed(164)
idx = createDataPartition(Boston7$medv, p = 0.7, list = F)
banktrain = Boston7[idx,]
banktest = Boston7[-idx,]
lm8<-lm(medv~.,data=banktrain)

#예측한 값
pree<-predict(lm8,banktest)

#rmse는 4가 나왔다
rmse <- function(yi, yhat_i){ sqrt(mean((yi - yhat_i)^2)) }
rmse (pree,banktest$medv)
 
cs

List of Articles
번호 제목 글쓴이 날짜 조회 수
공지 R 소스 공유 게시판 이용 관련 공지사항 1 DataMarket 2014.05.21 30717
130 투빅스 9&10기 8주차 CNN - 10기 장유영 장유영 2018.09.20 1269
129 투빅스 9기&10기 7주차 알고리즘 - 10기 이민주 file 이민주 2018.09.18 916
128 투빅스 9&10기 8주차 HOONCHEOLNET for Rock, Scissors, paper - 10기 신훈철 file Henris 2018.09.17 835
127 투빅스 9&10기 7주차 Pytorch Tutorial - 10기 장유영 장유영 2018.09.17 818
126 투빅스 9&10기 6주차 tensorflow MNIST- 10기 이준걸 file 이준걸 2018.09.17 877
125 투빅스 9&10기 6주차 tensorflow- 10기 박규리 file 귤스 2018.09.03 914
124 투빅스 9기&10기 4주차 K-means - 10기 임진혁 진혁 2018.08.25 964
123 투빅스 9&10기 5주차 NLP Basic - 10기 장유영 장유영 2018.08.22 1002
122 투빅스 9&10기 4주차 PCA-mnist - 10기 강인구 file kaig 2018.08.16 1301
121 투빅스 9기&10기 4주차 PCA Facebook data - 10기 이준걸 file 이준걸 2018.08.16 1143
120 투빅스 9기&10기 4주차 K-means - 10기 이준걸 file 이준걸 2018.08.16 1061
119 투빅스 9기&10기 4주차 Gibbs Sampling - 10기 이준걸 file 이준걸 2018.08.16 1019
118 투빅스 9기&10기 4주차 알고리즘 - 9기 김수지 file 김수지 2018.08.14 1076
117 투빅스 9&10기 3주차 Ensemble - 10기 정윤호 UNOVATE 2018.08.08 1156
116 투빅스 9&10기 3주차 Support Vector Machine - 10기 장유영 file 장유영 2018.08.08 1214
115 투빅스 9&10기 2주차 KNN, LDA - 10기 박성진 file chad4545 2018.08.01 1240
114 투빅스 9&10기 2주차 Naive Bayes - 10기 장유영 2 file 장유영 2018.08.01 1324
113 투빅스 9&10기 1주차 Dynamic Programming - 10기 강인구 kaig 2018.07.25 1219
» 투빅스 9&10기 1주차 Regression - 10기 박규리 file 귤스 2018.07.25 1412
111 투빅스 9&10기 1주차 Logistic Regression - 10기 박성진 file chad4545 2018.07.25 1322
Board Pagination ‹ Prev 1 2 3 4 5 6 ... 7 Next ›
/ 7

나눔글꼴 설치 안내


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

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

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5