본문 바로가기
R 과 데이터분석/기초 문법 ~ 머신러닝

[R 데이터분석] 16장. 분류분석

by JoyfulS 2019. 9. 13.

# 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

댓글