Quiet Time

R 5장. 결정트리

R(알) 2017. 9. 8. 19:27
■ 어제까지 배운 R 수업 복습
  1. R기본수업
  2. R머신러닝 
          - 머신러닝을 이해하기 위한 R 기본문법
          - knn
          - 나이브베이즈 
          - 결정트리 
          - 회귀 (단순,다중) 
          - 신경망
          - 서포트벡터 머신
          - ...

*머신러닝의 종류3가지중에 
1.지도학습: 
      분류: knn, 나이브 베이즈 
      회귀: 

2.비지도 학습
3.강화학습

   P(비아그라|스팸)*P(돈|스팸)*P(식료품|스팸)*P(주소삭제|스팸)*P(스팸)

문제199. 나이가 20대이고 성별이 여자이고 직업이 IT이고 미혼인 여자가 공포영화를 선택할 확률?

P(20대,여자,IT,미혼 | '공포영화' ) =

P(20대 |'공포영화' ) * P(여자 |'공포영화' ) * P(IT |'공포영화' ) * P(미혼|'공포영화' )

이렇게 계산하느게 naive bayes의 전부이다. 

nm <- naiveBayes(movie[1:5], movie$장르, laplace=0)
nm

문제200. 4장의 실습예제인 스팸과 햄 메일을 구분하는 실습을 진행해서 
     아래의 결과를 도출 하시오! 







sms csv파일이 잇는데 이파일은 text(메세지)와 라벨(type)로 구성된 데이터가 있다.
라벨은 ham, spam으로 구분되어있는 라벨이다
          ↓
데이터를 클린징 하는 작업 (데이터 정제 작업) 
          ↓
메일메세지를 단어별로 구분해서 메일별로 단어가 몇번 사용되었는지 빈도수를 표형태로 만든다. 
          ↓
훈련 데이터와 테스트 데이터로 데이터를 나누고 --> 워드 클라우드 그림 
          ↓
훈련 데이터로 나이브 베이즈 모델을 만든다.
          ↓
테스트 데이터로 위에서 만든 모델로 스팸인지 햄인지를 예측 
          ↓
예측을 잘 했는지 확인한다(crosstable) 








## 예제 : 스팸 SMS 메시지 제거 ----
## 2 단계 : 데이터 준비와 살펴보기  ----

# sms 데이터 프레임으로 sms 데이터 읽기
sms_raw <- read.csv("sms_spam.csv", stringsAsFactors = FALSE)

# sms 데이터 구조
str(sms_raw)

# 팩터로 spam/ham으로 변환
sms_raw$type <- factor(sms_raw$type)

# 변수형 확인
str(sms_raw$type)
table(sms_raw$type)

# 텍스트 마이닝(tm) 패키지를 사용하여 말뭉치 생성
install.packages("tm")
library(tm)
sms_corpus <- Corpus(VectorSource(sms_raw$text))

# sms 말뭉치 확인
print(sms_corpus)
inspect(sms_corpus[1:3])
# 로케일을 us(미국)으로 변경해주는 작업을 해줘야 한다. 
Sys.setlocale(category = "LC_ALL", locale = "us")

# tm_map() 사용하여 말뭉치 정리 ( 데이터 정제 작업) 

corpus_clean <- tm_map(sms_corpus, tolower)
# 설명 : 전부 소문자로 바꾸겠다.

corpus_clean <- tm_map(corpus_clean, removeNumbers)
# 설명 : 숫자를 다 제거하겠다.

corpus_clean <- tm_map(corpus_clean, removeWords, stopwords())
# 설명 : to, and, but, or 를 제거한다.

corpus_clean <- tm_map(corpus_clean, removePunctuation)
# 설명 : 마침표(.) 제거한다. 

corpus_clean <- tm_map(corpus_clean, stripWhitespace)
# 설명 : 공백을 제거한다.

# 말뭉치 정리 확인
inspect(sms_corpus[1:3])
inspect(corpus_clean[1:3])

# 문서-용어 희소 매트릭스 생성 ( 책 150페이지의 표와 같은 형태로 변환) 
sms_dtm <- DocumentTermMatrix(corpus_clean)
sms_dtm

# 훈련과 테스트 데이터셋 생성
sms_raw_train <- sms_raw[1:4169, ] # 원래 데이터 (훈련)
sms_raw_test  <- sms_raw[4170:5559, ] # 원래 데이터 (테스트)

sms_dtm_train <- sms_dtm[1:4169, ] # 정제후의 표현태 변경한 데이터(훈련)
sms_dtm_test  <- sms_dtm[4170:5559, ] # 정제후의 표형태 변경한 데이터(테스트) 

sms_corpus_train <- corpus_clean[1:4169] # 정제후의 데이터 (훈련)
sms_corpus_test  <- corpus_clean[4170:5559] # 정제후의 데이터 (테스트)

# 스팸 비율 확인
prop.table(table(sms_raw_train$type)) #훈련데이터의   스팸 : 80%  햄 : 20% 
prop.table(table(sms_raw_test$type))  #테스트데이터의 스팸 : 80%  햄 : 20%

# 단어 클라우드 시각화 (워드 클라우드로 햄의 단어가 무엇이고 
#                    스팸의 단어가 무엇인지 확인하는 작업) 
# R 을 2.15.3(2013-03-01) 로 설치하고 아래 패키지를 install 해야함
install.packages("Rcpp")
install.packages("wordcloud")



library(wordcloud)

wordcloud(sms_corpus_train, min.freq = 30, random.order = FALSE)

# 훈련 데이터를 스팸과 햄으로 구분
spam <- subset(sms_raw_train, type == "spam")
ham  <- subset(sms_raw_train, type == "ham")

wordcloud(spam$text, max.words = 40, scale = c(3, 0.5))
wordcloud(ham$text, max.words = 40, scale = c(3, 0.5))

# 빈번한 단어에 대한 속성 지시자
findFreqTerms(sms_dtm_train, 5) # 5개 이상사용된 단어만 다시 추출
sms_dict <- Dictionary(findFreqTerms(sms_dtm_train, 5))
sms_train <- DocumentTermMatrix(sms_corpus_train, list(dictionary = sms_dict))
sms_test  <- DocumentTermMatrix(sms_corpus_test, list(dictionary = sms_dict))

# 개수를 팩터로 변환 (라벨의 1과 0으로 변경하고 1과 0을 yes와 no로 변경하는 작업) 
convert_counts <- function(x) {
  x <- ifelse(x > 0, 1, 0)
  x <- factor(x, levels = c(0, 1), labels = c("No", "Yes"))
}

# apply() convert_counts()를 사용한 훈련/테스트 데이터 추출
sms_train <- apply(sms_train, MARGIN = 2, convert_counts)
sms_test  <- apply(sms_test, MARGIN = 2, convert_counts)

## 3 단계 : 데이터로 모델 훈련 ----
install.packages("e1071")
library(e1071)
sms_classifier <- naiveBayes(sms_train, sms_raw_train$type)
sms_classifier

## 4 단계 : 모델 성능 평가 ----
sms_test_pred <- predict(sms_classifier, sms_test)

install.packages("gmodels")
library(gmodels)
CrossTable(sms_test_pred, sms_raw_test$type,
           prop.chisq = FALSE, prop.t = FALSE, prop.r = FALSE,
           dnn = c('predicted', 'actual'))

## 5 단계 : 모델 성능 향상 ----
sms_classifier2 <- naiveBayes(sms_train, sms_raw_train$type, laplace = 1)
sms_test_pred2 <- predict(sms_classifier2, sms_test)
CrossTable(sms_test_pred2, sms_raw_test$type,
           prop.chisq = FALSE, prop.t = FALSE, prop.r = FALSE,
           dnn = c('predicted', 'actual'))



문제201. mushroom dataset을 활용한 나이브 베이즈 분석을 하시오 ! 



install.packages('rpart')
library(rpart)

tree1 <- rpart(mushroom[,1] ~. , data= mushroom[,-1] , control=rpart.control(minsplit=2) )

plot(tree1, compress = T , uniform = T , margin=0.1)

text(tree1, use.n = T , col = "blue")

□ 5장 . 결정트리 (p164)
  • 머신러닝의 종류 3가지
1.지도학습 : 
     - 분류 : knn, naivebayes, decision tree
     - 회귀 : 회귀(6장)

2.비지도학습
3.강화학습

■ 5장. 목차 
 1.결정트리란?
 2.엔트로피와 정보획득량
 3.결정트리 실습1(은행의 대출 위험 기업 확인) 
 4.결정트리 실습2(배드민턴 데이터와 자동차 평가)

■ 1.결정트리란?

 학습 데이터를 가지고 아래와 같은 트리구조의 학습 모델을 만들어서
 새로운 테스트 데이터에 대한 라벨을 예측하는 알고리즘

 그림 : 5장. 결정트리 이미지 첫번째  


■ 결정트리가 사용되는 곳?
 1.지원자에게 거절된 이유를 명시해야하는 신용등급 모델
      예 : 은행 대출, 회사 인사 채용

 2.변심이 심한 고객이나 고객 만족은 관리하는 부서와 광고부서에서 공유되어야 하는 시장조사
      예: 스킨샵 쿠폰반응

 3.연구 측정, 증상, 매우 드문 질병 진행 과정을 바탕으로한 질병 관찰 
     예: 지방간 

■ 결정트리의 장단점 
 - 장점: 1.모든 문제에 적합한 분류기
        2.결측치, factor, number를 잘 처리할 수 있다.
        3.가장 중요한 속성만 사용
        4.다른 복잡한 모델보다 높은 효율

 - 단점: 1.모델이 쉽게 오버피팅 되거나 언더피팅이 됨
        2.훈련데이터에 약간의 변경이 잇어도 결정트리에 큰 변화를 준다.


■ 최적의 구분 선택 (p170)
  결정트리를 만들때 가장 먼제 해야할 것은 컬럼(변수)들중 가장 중요한 
  컬럼(변수)를 찾는것 이다. 중요한 변수는 정보획득량이 가장 높은 변수를
  말한다.
               ↓
     정보획득량이 높은 변수를 알아내려면 뭘 먼저 알아야 하는가?
               ↓
     엔트로피(entrophy) 함수

■  엔트로피(entrophy) 함수(불확실성)

     "데이터의 불확실성이 얼마나 되는가 ? "

     이 값이 커지면 커질수록 불확실성이 커진다

 예: 1. 확률(p) ====> x 축
     2.엔트로피(불확실성) ----> y 축 (공식 : -p * log(p) ) 

> -0.60 * log2(0.60) - 0.40 * log2(0.40)
[1] 0.9709506
> curve(-x * log2(x) - (1 - x) * log2(1 - x), col="red", xlab = "x", ylab = "Entropy", lwd=4)


설명 : 부자거나(x축 1) 부자가 아니거나 (x축 0)이면 
       불확실성 (엔트로피) y 축이 0이다.

  • 결정트리를 구하려면 ?
          어떤 컬럼을 가장 먼저 물어볼것인가를 결정해야한ㄷ
          정보획득량이 높은 컬럼을 가장 먼저 물어보게해야한다.
      정보획득량 = 분할전 엔트로피 - 분할후 엔트로피

문제202. 아래의 데이터 프레임을 만드시오 ! 


x <- data.frame(
cust_name=c('SCOTT','SMITH','ALLEN','JONES','WARD'),
card_yn=c('Y','Y','N','Y','Y'),
review_yn=c('Y','Y','N','N','Y'),
before_buy_yn=c('Y','Y','Y','N','Y'),
buy_yn=c('Y','Y','N','Y','Y') )


문제203. 위의 구매 데이터의 정보 획득량을 구하시오 

install.packages("FSelector")
library(FSelector)

weights<- information.gain(buy_yn~.,x)
print(weights )
 



문제204. skin.csv를 내려받고 R로 로드한 후에 skin데이터셋 변수들의 
        정보획득량을 구하시오  ~

skin <- read.csv("skin.csv",header = T)
weights<- information.gain(cupon_react~.,skin )
print(weights )



문제205. 위의 정보를 가지고 결정트리를 그리시오 

install.packages('rpart')
library(rpart)

tree1 <- rpart(cupon_react~. , data= skin, control=rpart.control(minsplit=2) )

plot(tree1, compress = T , uniform = T , margin=0.1)

text(tree1, use.n = T , col = "blue")


문제206. 지방간 데이터의 정보획득량을 구하시오 

fatliver<- read.csv("fatliver2.csv",header =T)
weights<- information.gain(FATLIVER~.,fatliver)
print(weights)



tree1 <- rpart(FATLIVER ~. , data= fatliver , control=rpart.control(minsplit=2) )

plot(tree1, compress = T , uniform = T , margin=0.1)

text(tree1, use.n = T , col = "blue")


 




##### 5장 : 결정 트리와 규칙(Decision tree and Rules)을 사용한 분류 -------------------
#### Part 1: 결정 트리 -------------------
## 결정 트리 이해 ----
# 두 부분 분류의 엔트로피 계산
-0.60 * log2(0.60) - 0.40 * log2(0.40)
curve(-x * log2(x) - (1 - x) * log2(1 - x),
      col="red", xlab = "x", ylab = "Entropy", lwd=4)
## 예제 : 위험 은행 대출 식별 ----
## 2 단계 : 데이터 준비와 살펴보기 ----
credit <- read.csv("credit.csv")
str(credit)
# 지원자의 두 특성 확인
table(credit$checking_balance)
table(credit$savings_balance)
# 대출의 두 특성 확인
summary(credit$months_loan_duration)
summary(credit$amount)
# 분류 변수 확인
table(credit$default)
# 훈련과 테스트 데이터에 대한 무작위 샘플 생성
# 예제와 같은 무작위 수열을 사용하기 위해 set.seed 사용
set.seed(12345)
credit_rand <- credit[order(runif(1000)), ]
# credit과 credit_rand 데이터 프레임간 비교
summary(credit$amount)
summary(credit_rand$amount)
head(credit$amount)
head(credit_rand$amount)
# 데이터 프레임 나누기
credit_train <- credit_rand[1:900, ]
credit_test  <- credit_rand[901:1000, ]
# 분류 변수의 비율 확인
prop.table(table(credit_train$default))
prop.table(table(credit_test$default))
## 3 단계 : 데이터로 모델 훈련 ----
# 가장 단순한 결정 트리 생성
library(C50)
credit_model <- C5.0(credit_train[-17], credit_train$default)
# 트리 정보 출력
credit_model
# 트리에 대한 상세 정보 출력
summary(credit_model)
## 4 단계 : 모델 성능 평가 ----
# 테스트 데이터에 대한 예측 팩터 벡터 생성
credit_pred <- predict(credit_model, credit_test)
# 예측과 실제 분류의 교차표
library(gmodels)
CrossTable(credit_test$default, credit_pred,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))
## 5 단계 : 모델 성능 향상 ----
## 결정 트리의 정확성 부스팅
# 10 trials과 부스트드 결정 트리
credit_boost10 <- C5.0(credit_train[-17], credit_train$default,
                       trials = 10)
credit_boost10
summary(credit_boost10)
credit_boost_pred10 <- predict(credit_boost10, credit_test)
CrossTable(credit_test$default, credit_boost_pred10,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))
# 100 trials과 부스트드 결정 트리
credit_boost100 <- C5.0(credit_train[-17], credit_train$default,
                        trials = 100)
credit_boost_pred100 <- predict(credit_boost100, credit_test)
CrossTable(credit_test$default, credit_boost_pred100,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))
## 가중치 매트릭스 생성
# 가중 비용 매트릭스
error_cost <- matrix(c(0, 1, 4, 0), nrow = 2)
error_cost
# 트리에 비용 매트릭스 적용
credit_cost <- C5.0(credit_train[-17], credit_train$default,
                    costs = error_cost)
credit_cost_pred <- predict(credit_cost, credit_test)
CrossTable(credit_test$default, credit_cost_pred,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))
#### Part 2: 규칙 학습기 -------------------


> table(credit$checking_balance)

    < 0 DM   > 200 DM 1 - 200 DM    unknown
       274         63        269        394
> table(credit$savings_balance)

     < 100 DM     > 1000 DM  100 - 500 DM 500 - 1000 DM       unknown
          603            48           103            63           183

설명 : 대출 신청사의 에금계좌와 적금계좌의 예금정도를 확인해서 예금액이 많을 수록 대출이 안전하다고 가정할 수 있다.


> summary(credit$months_loan_duration)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
    4.0    12.0    18.0    20.9    24.0    72.0

설명 : 대출 기간이 짧게는 4달에서 기게는 72개월까지 분포가 됨

> summary(credit$amount)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max.
    250    1366    2320    3271    3972   18420 

설명 : 대출 금액은 독일돈으로 205 마르크 ~ 184020 마르크 
     100 마르크가 6~ 7만원 정도 한다

table(credit$default)
#분류 변수 확인 ( default 가 라벨인데 대출금 상환했는지 상환안했는지 ) 
table(credit$default)
no yes
700 300

설명 : 대출자가 협의한 반납기간 안에 대출금을 반납했는지 안했는지 나타냄.
      채무이행자가 300명 , 채무불이행자가 700명

set.seed(12345)
credit_rand <- credit[order(runif(1000)), ]

runif(10)
order(runif(1000))

설명 : runif(10)이라고 하면 0과 1사이의 10개의 숫자가 랜덤으로 출력된다.
order(runif(1000)) 라고 하면 무작위 숫자가 1000개가 출력된다. 
credit[order(runif(1000)),] 하면 행을 무작위로 섞어서 결과를 출력해준다.

서머리는 같지만 잘 섞였음 

#분류 변수의 비율 확인
       no       yes
0.7022222 0.2977778
> prop.table(table(credit_test$default))

  no  yes
0.68 0.32

위의 데이터에 결정트리 기계학습ㅇ르 하려는 목적?

  지금 채무 불이행자가 70% 가 되는데  이 채무 불이행자의 수치를 낮추는것이 (30%로 떨어짐) 이 기계학습의 목표이다.

## 3단계 : 데이터로 모델 훈련
# 가장 단수한 결정 트리 생성
install.packages("C50")
library(C50)
credit_model <- C5.0(credit_train[-17], credit_train$default)
                      

summary(credit_model)


Evaluation on training data (900 cases):

        Decision Tree
      ----------------
      Size      Errors

        66  125(13.9%)   <<

       (a)   (b)    <-classified as
      ----  ----
       609    23    (a): class no
       102   166    (b): class yes
설명: 13.9% 의 오차로 125개를 잘못 분류했다.
     23개는 실제값은 no이지만 yes로 잘못 분류했고 
     102개는 실제값은 yes이지만 no로 잘못분류했다. 

credit_pred <- predict(credit_model, credit_test)
cbind(credit_test, credit_pred)

CrossTable(credit_test$default, credit_pred,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))



               | predicted default
actual default |        no |       yes | Row Total |
---------------|-----------|-----------|-----------|
            no |        57 |        11 |        68 |
               |     0.570 |     0.110 |           |
---------------|-----------|-----------|-----------|
           yes |        16 |        16 |        32 |
               |     0.160 |     0.160 |           |
---------------|-----------|-----------|-----------|
  Column Total |        73 |        27 |       100 |
---------------|-----------|-----------|-----------|

57 + 16 = 73, 11 + 16 = 27
73% 는 정확히 예측 
27% 는 정확히 예측하지 못함 

## 5 단계 : 모델 성능 향상 ----
## 결정 트리의 정확성 부스팅
# 10 trials과 부스트드 결정 트리
credit_boost10 <- C5.0(credit_train[-17], credit_train$default,
                       trials = 10)
credit_boost10
summary(credit_boost10)

Evaluation on training data (900 cases):

Trial        Decision Tree
-----      ----------------
      Size      Errors

   0        66  125(13.9%)
   1        40  205(22.8%)
   2        46  196(21.8%)
   3        45  193(21.4%)
   4        68  163(18.1%)
   5        62  175(19.4%)
   6        56  186(20.7%)
   7        62  188(20.9%)
   8        66  156(17.3%)
   9        49  200(22.2%)
boost             31( 3.4%)   <<

       (a)   (b)    <-classified as
      ----  ----
       626     6    (a): class no
        25   243    (b): class yes

credit_boost_pred10 <- predict(credit_boost10, credit_test)
CrossTable(credit_test$default, credit_boost_pred10,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))
# 100 trials과 부스트드 결정 트리
credit_boost100 <- C5.0(credit_train[-17], credit_train$default,
                        trials = 100)
credit_boost_pred100 <- predict(credit_boost100, credit_test)
CrossTable(credit_test$default, credit_boost_pred100,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))


               | predicted default
actual default |        no |       yes | Row Total |
---------------|-----------|-----------|-----------|
            no |        61 |         7 |        68 |
               |     0.610 |     0.070 |           |
---------------|-----------|-----------|-----------|
           yes |        15 |        17 |        32 |
               |     0.150 |     0.170 |           |
---------------|-----------|-----------|-----------|
  Column Total |        76 |        24 |       100 |
---------------|-----------|-----------|-----------|

## 가중치 매트릭스 생성
# 가중 비용 매트릭스
error_cost <- matrix(c(0, 1, 4, 0), nrow = 2)
error_cost
# 트리에 비용 매트릭스 적용
credit_cost <- C5.0(credit_train[-17], credit_train$default,
                    costs = error_cost)
credit_cost_pred <- predict(credit_cost, credit_test)
CrossTable(credit_test$default, credit_cost_pred,
           prop.chisq = FALSE, prop.c = FALSE, prop.r = FALSE,
           dnn = c('actual default', 'predicted default'))
#### Part 2: 규칙 학습기 -------------------






badminton <- read.csv("badminton.csv",header=T)
install.packages("C50")
library(C50)
x <- badminton [1:4]
y <- badminton [,5]
model <- C5.0(x,y) 
model
summary(model)
plot(model)
p <- predict(model,x,type="class")
sum(p==y)/length(p)




문제207. **이가 첫번째로 발표한 차 평가에 관련한 결정트리 실습 코드에 
         예측하는 predict을 추가해서 실제 라벨과 예측 라벨의 
          차이를 한눈에 보여주는 CrossTable결과를 출력하시오 
car_evaluation <- read.csv("car_evaluation.csv",head=T)
head(car_evaluation)

install.packages("C50")
library(C50)
x <- car_evaluation[,2:7]
y <- car_evaluation[,1]     #기준이 되는 컬럼
model <- C50::C5.0(x,y)
model
summary(model)
plot(model)


또는


x <- car_evaluation[,2:7]
build_tree <- C5.0(car_evaluation$buyingprice~.,data=x)
summary(build_tree)
plot(build_tree)


p <- predict(model,x,type="class")
sum(p==y)/length(p)

CrossTable(car_evaluation[,1] ,p)

> CrossTable(car_evaluation[,1] ,p)
Error in CrossTable(car_evaluation[, 1], p) :
  함수 "CrossTable"를 찾을 수 없습니다
> library(gmodels)
경고메시지(들):
패키지 ‘gmodels’는 R 버전 3.4.1에서 작성되었습니다
> CrossTable(car_evaluation[,1] ,p)


   Cell Contents
|-------------------------|
|                       N |
| Chi-square contribution |
|           N / Row Total |
|           N / Col Total |
|         N / Table Total |
|-------------------------|


Total Observations in Table:  1728


                    | p
car_evaluation[, 1] |      high |       low |       med |     vhigh | Row Total |
--------------------|-----------|-----------|-----------|-----------|-----------|
               high |        46 |        13 |        49 |       324 |       432 |
                    |    16.480 |    29.484 |     0.146 |     1.528 |           |
                    |     0.106 |     0.030 |     0.113 |     0.750 |     0.250 |
                    |     0.451 |     0.062 |     0.237 |     0.268 |           |
                    |     0.027 |     0.008 |     0.028 |     0.188 |           |
--------------------|-----------|-----------|-----------|-----------|-----------|
                low |         0 |       121 |        53 |       258 |       432 |
                    |    25.500 |    90.461 |     0.030 |     6.546 |           |
                    |     0.000 |     0.280 |     0.123 |     0.597 |     0.250 |
                    |     0.000 |     0.579 |     0.256 |     0.213 |           |
                    |     0.000 |     0.070 |     0.031 |     0.149 |           |
--------------------|-----------|-----------|-----------|-----------|-----------|
                med |        10 |        75 |        79 |       268 |       432 |
                    |     9.422 |     9.906 |    14.349 |     3.935 |           |
                    |     0.023 |     0.174 |     0.183 |     0.620 |     0.250 |
                    |     0.098 |     0.359 |     0.382 |     0.221 |           |
                    |     0.006 |     0.043 |     0.046 |     0.155 |           |
--------------------|-----------|-----------|-----------|-----------|-----------|
              vhigh |        46 |         0 |        26 |       360 |       432 |
                    |    16.480 |    52.250 |    12.813 |    10.930 |           |
                    |     0.106 |     0.000 |     0.060 |     0.833 |     0.250 |
                    |     0.451 |     0.000 |     0.126 |     0.298 |           |
                    |     0.027 |     0.000 |     0.015 |     0.208 |           |
--------------------|-----------|-----------|-----------|-----------|-----------|
       Column Total |       102 |       209 |       207 |      1210 |      1728 |
                    |     0.059 |     0.121 |     0.120 |     0.700 |           |
--------------------|-----------|-----------|-----------|-----------|-----------|


내일 : 6장. 회귀분석 
      7장 .신경망 (앞부분 까지)






스킨데이터 트리 그리기 !