# chap16_1_DecisionTree
# 분류분석
install.packages("rpart") # 분류모델 제공 패키지
library(rpart) # rpart() : 분류모델 생성
install.packages("rpart.plot")
library(rpart.plot) # prp(), rpart.plot() : rpart 시각화
install.packages('rattle')
library('rattle') # fancyRpartPlot() : node 번호 시각화
# 단계1. 실습데이터 생성
data(iris)
set.seed(415)
idx = sample(1:nrow(iris), 0.7*nrow(iris))
train = iris[idx, ] # 훈련셋
test = iris[-idx, ] # 검정셋
dim(train) # 105 5
dim(test) # 45 5
table(train$Species)
str(iris)
# 단계2. 분류모델 생성
# rpart(y변수 ~ x변수, data)
model = rpart(Species~., data=train) # iris의 꽃의 종류(Species) 분류
model
# 분류모델 시각화 - rpart.plot 패키지 제공
prp(model) # 간단한 시각화
rpart.plot(model) # rpart 모델 tree 출력
fancyRpartPlot(model) # node 번호 출력(rattle 패키지 제공)
# 단계3. 분류모델 평가
table(test$Species)
pred <- predict(model, test) # 비율 예측
range(pred) # 0 ~ 1
pred <- predict(model, test, type="class") # 분류 예측
pred
# 1) 분류모델로 분류된 y변수 보기
table(pred)
# 2) 분류모델 성능 평가
table(pred, test$Species) # (예측치, 관측치)
acc <- (16+11+16) / nrow(test)
acc # 0.9555556
##################################################
# Decision Tree 응용실습 : 암 진단 분류 분석
##################################################
# "wdbc_data.csv" : 유방암 진단결과 데이터 셋 분류
### 사용된 파일은 https://joyfuls.tistory.com/4 에서 다운 받으실 수 있습니다.
# 1. 데이터셋 가져오기
wdbc <- read.csv('C:/2_Rwork/Part-IV/wdbc_data.csv',
stringsAsFactors = FALSE)
str(wdbc)
# 2. 데이터 탐색 및 전처리
wdbc <- wdbc[-1] # id 칼럼 제외(이상치)
head(wdbc)
head(wdbc[, c('diagnosis')], 10) # 진단결과 : B -> '양성', M -> '악성'
# 목표변수(y변수)를 factor형으로 변환(더미변수)
wdbc$diagnosis <- factor(wdbc$diagnosis, levels = c("B", "M"))
wdbc$diagnosis[1:10]
summary(wdbc[-1]) # x변수 요약통계량
# 3. 정규화 : 서로 다른 특징을 갖는 칼럼값 균등하게 적용
normalize <- function(x){ # 정규화를 위한 함수 정의
return ((x - min(x)) / (max(x) - min(x)))
}
# wdbc[2:31] : x변수에 해당한 칼럼 대상 정규화 수행
wdbc_x <- as.data.frame(lapply(wdbc[2:31], normalize))
wdbc_x
summary(wdbc_x) # 0 ~ 1 사이 정규화
class(wdbc_x) # [1] "data.frame"
nrow(wdbc_x) # [1] 569
wdbc_df <- data.frame(wdbc$diagnosis, wdbc_x)
dim(wdbc_df) # 569 31
head(wdbc_df)
# 4. 훈련데이터와 검정데이터 생성 : 7 : 3 비율
idx = sample(nrow(wdbc_df), 0.7*nrow(wdbc_df))
wdbc_train = wdbc_df[idx, ] # 훈련 데이터
wdbc_test = wdbc_df[-idx, ] # 검정 데이터
dim(wdbc_train) # [1] 398 31
dim(wdbc_test) # [1] 171 31
# 5. rpart 분류모델 생성
str(wdbc_train)
model <- rpart(wdbc.diagnosis ~ ., data = wdbc_train)
model
rpart.plot(model)
# 6. 분류모델 평가
pred <- predict(model, wdbc_test, type="class")
pred # 예측치
real_value <- wdbc_test$wdbc.diagnosis # 관측치
real_value
# 교차분할표(confusion matrix)
table(real_value, pred)
# pred
#real_value B M
# B 105 8
# M 3 55
B <- 105 / (105+8)
B # 0.9292035
M <- 55 / (3 + 55)
M # 0.9482759
acc <- (105 + 55) / nrow(wdbc_test)
acc # 0.9356725
'R 과 데이터분석 > 기초 문법 ~ 머신러닝' 카테고리의 다른 글
[R 데이터분석] 18장. 연관분석 (1) | 2019.09.13 |
---|---|
[R 데이터분석] 17장. 군집분석 (0) | 2019.09.13 |
[R 데이터분석] 15장. 회귀분석 (0) | 2019.09.13 |
[R 데이터분석] 14장. 상관분석 (0) | 2019.09.13 |
[R 데이터분석] 13장. 집단간 차이 검정 (0) | 2019.09.13 |
댓글