아이티윌_데이터 분석 55기/문제풀이_통계 및 분석

#11-2. 11일차 퀴즈에 대한 문제풀이

ecosso 2026. 4. 27. 17:25

# [ cancer 데이터를 사용하여 암 종양의 악성 여부 분류 ]

1. DT, RF 모형에 대한 정확도 확인

2. 변수 중요도를 기반으로 상위 2개,  하위 2개를 선택하여 교차산점도 출력  (종속변수 색으로 구분)

3. 위 결과 생성

4. RF 모형의 매개변수 튜닝 결과 해석

 

cancer <- read.csv('cancer.csv')

 

 # Python에서는 관계없으나 R에서 랜덤포레스트를 진행할 시 y축이 factor로 선언되어야 한다.
cancer$diagnosis <- factor(cancer$diagnosis)


head(cancer)
summary(cancer[,-1])

> summary(cancer[,-1])
  diagnosis          radius_mean      texture_mean   perimeter_mean     area_mean      smoothness_mean   compactness_mean  concavity_mean   
 Length:569         Min.   : 6.981   Min.   : 9.71   Min.   : 43.79   Min.   : 143.5   Min.   :0.05263   Min.   :0.01938   Min.   :0.00000  
 Class :character   1st Qu.:11.700   1st Qu.:16.17   1st Qu.: 75.17   1st Qu.: 420.3   1st Qu.:0.08637   1st Qu.:0.06492   1st Qu.:0.02956  
 Mode  :character   Median :13.370   Median :18.84   Median : 86.24   Median : 551.1   Median :0.09587   Median :0.09263   Median :0.06154  
                    Mean   :14.127   Mean   :19.29   Mean   : 91.97   Mean   : 654.9   Mean   :0.09636   Mean   :0.10434   Mean   :0.08880  
                    3rd Qu.:15.780   3rd Qu.:21.80   3rd Qu.:104.10   3rd Qu.: 782.7   3rd Qu.:0.10530   3rd Qu.:0.13040   3rd Qu.:0.13070  
                    Max.   :28.110   Max.   :39.28   Max.   :188.50   Max.   :2501.0   Max.   :0.16340   Max.   :0.34540   Max.   :0.42680  
 concave_points_mean symmetry_mean    fractal_dimension_mean   radius_se        texture_se      perimeter_se       area_se        smoothness_se     
 Min.   :0.00000     Min.   :0.1060   Min.   :0.04996        Min.   :0.1115   Min.   :0.3602   Min.   : 0.757   Min.   :  6.802   Min.   :0.001713  
 1st Qu.:0.02031     1st Qu.:0.1619   1st Qu.:0.05770        1st Qu.:0.2324   1st Qu.:0.8339   1st Qu.: 1.606   1st Qu.: 17.850   1st Qu.:0.005169  
 Median :0.03350     Median :0.1792   Median :0.06154        Median :0.3242   Median :1.1080   Median : 2.287   Median : 24.530   Median :0.006380  
 Mean   :0.04892     Mean   :0.1812   Mean   :0.06280        Mean   :0.4052   Mean   :1.2169   Mean   : 2.866   Mean   : 40.337   Mean   :0.007041  
 3rd Qu.:0.07400     3rd Qu.:0.1957   3rd Qu.:0.06612        3rd Qu.:0.4789   3rd Qu.:1.4740   3rd Qu.: 3.357   3rd Qu.: 45.190   3rd Qu.:0.008146  
 Max.   :0.20120     Max.   :0.3040   Max.   :0.09744        Max.   :2.8730   Max.   :4.8850   Max.   :21.980   Max.   :542.200   Max.   :0.031130  
 compactness_se      concavity_se     concave_points_se   symmetry_se       fractal_dimension_se  radius_worst   texture_worst   perimeter_worst 
 Min.   :0.002252   Min.   :0.00000   Min.   :0.000000   Min.   :0.007882   Min.   :0.0008948    Min.   : 7.93   Min.   :12.02   Min.   : 50.41  
 1st Qu.:0.013080   1st Qu.:0.01509   1st Qu.:0.007638   1st Qu.:0.015160   1st Qu.:0.0022480    1st Qu.:13.01   1st Qu.:21.08   1st Qu.: 84.11  
 Median :0.020450   Median :0.02589   Median :0.010930   Median :0.018730   Median :0.0031870    Median :14.97   Median :25.41   Median : 97.66  
 Mean   :0.025478   Mean   :0.03189   Mean   :0.011796   Mean   :0.020542   Mean   :0.0037949    Mean   :16.27   Mean   :25.68   Mean   :107.26  
 3rd Qu.:0.032450   3rd Qu.:0.04205   3rd Qu.:0.014710   3rd Qu.:0.023480   3rd Qu.:0.0045580    3rd Qu.:18.79   3rd Qu.:29.72   3rd Qu.:125.40  
 Max.   :0.135400   Max.   :0.39600   Max.   :0.052790   Max.   :0.078950   Max.   :0.0298400    Max.   :36.04   Max.   :49.54   Max.   :251.20  
   area_worst     smoothness_worst  compactness_worst concavity_worst  concave_points_worst symmetry_worst   fractal_dimension_worst
 Min.   : 185.2   Min.   :0.07117   Min.   :0.02729   Min.   :0.0000   Min.   :0.00000      Min.   :0.1565   Min.   :0.05504        
 1st Qu.: 515.3   1st Qu.:0.11660   1st Qu.:0.14720   1st Qu.:0.1145   1st Qu.:0.06493      1st Qu.:0.2504   1st Qu.:0.07146        
 Median : 686.5   Median :0.13130   Median :0.21190   Median :0.2267   Median :0.09993      Median :0.2822   Median :0.08004        
 Mean   : 880.6   Mean   :0.13237   Mean   :0.25427   Mean   :0.2722   Mean   :0.11461      Mean   :0.2901   Mean   :0.08395        
 3rd Qu.:1084.0   3rd Qu.:0.14600   3rd Qu.:0.33910   3rd Qu.:0.3829   3rd Qu.:0.16140      3rd Qu.:0.3179   3rd Qu.:0.09208        
 Max.   :4254.0   Max.   :0.22260   Max.   :1.05800   Max.   :1.2520   Max.   :0.29100      Max.   :0.6638   Max.   :0.20750

 

 

더보기

[ 내 답변 ]

 

# DT 모델

df1 <- cancer[,-1]

cancer_sample  <- sample(1:nrow(df1), round(nrow(df1)*0.7))
cancer_train <- cancer[cancer_sample,]
cancer_test <- cancer[-cancer_sample,]


mdt <- rpart(diagnosis~., cancer_train)
mdt

> mdt
n= 398 

node), split, n, loss, yval, (yprob)
      * denotes terminal node

 1) root 398 142 Benign (0.643216080 0.356783920)  
   2) perimeter_worst< 106.1 245  10 Benign (0.959183673 0.040816327)  
     4) concave_points_worst< 0.1456 236   3 Benign (0.987288136 0.012711864) *
     5) concave_points_worst>=0.1456 9   2 Malignant (0.222222222 0.777777778) *
   3) perimeter_worst>=106.1 153  21 Malignant (0.137254902 0.862745098)  
     6) perimeter_worst< 117.45 40  20 Benign (0.500000000 0.500000000)  
      12) texture_worst< 26.925 22   4 Benign (0.818181818 0.181818182) *
      13) texture_worst>=26.925 18   2 Malignant (0.111111111 0.888888889) *
     7) perimeter_worst>=117.45 113   1 Malignant (0.008849558 0.991150442) *


prp(mdt, type = 4, extra = 3)

 

# DT 모델 -> 예측

pre_dt_tr <- predict(mdt, newdata = cancer_train, type = 'class')
sum(pre_dt_tr == cancer_train$diagnosis) / nrow(cancer_train) * 100

> sum(pre_dt_tr == cancer_train$diagnosis) / nrow(cancer_train) * 100
[1] 96.98492

 

pre_dt_te <- predict(mdt, newdata = cancer_test, type = 'class')
sum(pre_dt_te == cancer_test$diagnosis) / nrow(cancer_test) * 100

> sum(pre_dt_te == cancer_test$diagnosis) / nrow(cancer_test) * 100
[1] 91.81287

 

# 변수 중요도 확인
mdt$variable.importance

> mdt$variable.importance
     perimeter_worst         radius_worst           area_worst 
          141.507392           126.656276           125.468223 
      perimeter_mean            area_mean          radius_mean 
          118.577151           113.824940           113.824940 
      symmetry_worst concave_points_worst        texture_worst 
           11.137680            10.148834             9.898990 
      concavity_mean         texture_mean           texture_se 
            8.937904             7.699214             7.149270 
   compactness_worst      concavity_worst        smoothness_se 
            5.638241             5.638241             3.299663 
        concavity_se 
            2.255296 

 

# 상위 2개 변수 (perimeter_worst, radius_worst)
# 하위 2개 변수 (concavity_se, smoothness_se)
# 시각화
plot_dt <- cancer[,c('perimeter_worst','radius_worst','concavity_se', 'smoothness_se')]
pairs(plot_dt, col = as.numeric(cancer$diagnosis))


 

# RF 모형
df1 <- cancer[,-1]

cancer_sample  <- sample(1:nrow(df1), round(nrow(df1)*0.7))
cancer_train <- cancer[cancer_sample,]
cancer_test <- cancer[-cancer_sample,]

mrf <- randomForest(diagnosis ~., data = cancer_train)
mrf

> mrf

Call:
 randomForest(formula = diagnosis ~ ., data = cancer_train) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 5

        OOB estimate of  error rate: 4.77%
Confusion matrix:
          Benign Malignant class.error
Benign       250         7  0.02723735
Malignant     12       129  0.08510638

 

 

# 변수 중요도 확인

pre_rf_tr <- predict(mrf, newdata = cancer_train, type = 'class')
sum(pre_rf_tr == cancer_train$diagnosis) / nrow(cancer_train) * 100

> sum(pre_rf_tr == cancer_train$diagnosis) / nrow(cancer_train) * 100
[1] 100

 

pre_rf_te <- predict(mrf, newdata = cancer_test, type = 'class')
sum(pre_rf_te == cancer_test$diagnosis) / nrow(cancer_test) * 100

> sum(pre_rf_te == cancer_test$diagnosis) / nrow(cancer_test) * 100
[1] 97.66082

 

 

# RF 모형의 매개변수 튜닝 결과 해석

vscore_tr <- c() ; vscore_te <- c()

for (i in 1:500) {
  mrf <- randomForest(diagnosis ~., data = cancer_train, ntree = i)
  
  pre_rf_tr <- predict(mrf, newdata = cancer_train, type = 'class')
  pre_rf_te <- predict(mrf, newdata = cancer_test, type = 'class')
  
  vscore_tr <- c(vscore_tr, sum(pre_rf_tr == cancer_train$diagnosis) / nrow(cancer_train) * 100)
  vscore_te <- c(vscore_te, sum(pre_rf_te == cancer_test$diagnosis) / nrow(cancer_test) * 100)
}

plot(1:500, vscore_tr, type = 'o', col = 'red', ylim = c(91, 100),
     xlab = 'ntree', ylab = 'accuracy')
lines(1:500, vscore_te, type = 'o', col = 'blue')
legend('bottomright', c('train_score', 'test_score'), lty = 1, col = c('red', 'blue'),
       inset = c(0.01, 0.03))

 

▲ 150-200에서 test_score 변동폭이 줄어들기 시작함. 따라서 ntree는 200 정도로 지정하는 것이 좋음

 

 

vscore_tr <- c() ; vscore_te <- c()

for (i in 1:ncol(cancer[,-1])) {
  mrf <- randomForest(diagnosis ~., data = cancer_train, mtry = i)
  
  pre_rf_tr <- predict(mrf, newdata = cancer_train, type = 'class')
  pre_rf_te <- predict(mrf, newdata = cancer_test, type = 'class')
  
  vscore_tr <- c(vscore_tr, sum(pre_rf_tr == cancer_train$diagnosis) / nrow(cancer_train) * 100)
  vscore_te <- c(vscore_te, sum(pre_rf_te == cancer_test$diagnosis) / nrow(cancer_test) * 100)
}

plot(1:ncol(cancer[,-1]), vscore_tr, type = 'o', col = 'red', ylim = c(91, 100),
     xlab = 'ntree', ylab = 'accuracy')
lines(1:ncol(cancer[,-1]), vscore_te, type = 'o', col = 'blue')
legend('bottomright', c('train_score', 'test_score'), lty = 1, col = c('red', 'blue'),
       inset = c(0.01, 0.03))

 

▲ 3-4에서 accuracy 가 최대이므로 mtry는 4 정도 지정하는 것이 좋음

 

 # ####

mrf

> mrf

Call:
 randomForest(formula = diagnosis ~ ., data = cancer_train) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 5

        OOB estimate of  error rate: 4.77%
Confusion matrix:
          Benign Malignant class.error
Benign       250         7  0.02723735
Malignant     12       129  0.08510638

 

randomForest(diagnosis ~ ., data = cancer_train, ntree = 200, mtry = 4)  

> randomForest(diagnosis ~ ., data = cancer_train, ntree = 200, mtry = 4)   

Call:
 randomForest(formula = diagnosis ~ ., data = cancer_train, ntree = 200,      mtry = 4) 
               Type of random forest: classification
                     Number of trees: 200
No. of variables tried at each split: 4

        OOB estimate of  error rate: 4.27%
Confusion matrix:
          Benign Malignant class.error
Benign       253         4  0.01556420
Malignant     13       128  0.09219858

 

[ 문제풀이 ]

 

# 데이터 로딩
cancer <- read.csv('cancer.csv')
cancer$diagnosis <- factor(cancer$diagnosis)

# 불필요한 변수 제거거
cancer$id <- NULL

# 데이터  탐색
# 1) 기술통계량
summary(cancer)

> summary(cancer)
     diagnosis    radius_mean      texture_mean   perimeter_mean     area_mean      smoothness_mean   compactness_mean  concavity_mean    concave_points_mean symmetry_mean    fractal_dimension_mean
 Benign   :357   Min.   : 6.981   Min.   : 9.71   Min.   : 43.79   Min.   : 143.5   Min.   :0.05263   Min.   :0.01938   Min.   :0.00000   Min.   :0.00000     Min.   :0.1060   Min.   :0.04996       
 Malignant:212   1st Qu.:11.700   1st Qu.:16.17   1st Qu.: 75.17   1st Qu.: 420.3   1st Qu.:0.08637   1st Qu.:0.06492   1st Qu.:0.02956   1st Qu.:0.02031     1st Qu.:0.1619   1st Qu.:0.05770       
                 Median :13.370   Median :18.84   Median : 86.24   Median : 551.1   Median :0.09587   Median :0.09263   Median :0.06154   Median :0.03350     Median :0.1792   Median :0.06154       
                 Mean   :14.127   Mean   :19.29   Mean   : 91.97   Mean   : 654.9   Mean   :0.09636   Mean   :0.10434   Mean   :0.08880   Mean   :0.04892     Mean   :0.1812   Mean   :0.06280       
                 3rd Qu.:15.780   3rd Qu.:21.80   3rd Qu.:104.10   3rd Qu.: 782.7   3rd Qu.:0.10530   3rd Qu.:0.13040   3rd Qu.:0.13070   3rd Qu.:0.07400     3rd Qu.:0.1957   3rd Qu.:0.06612       
                 Max.   :28.110   Max.   :39.28   Max.   :188.50   Max.   :2501.0   Max.   :0.16340   Max.   :0.34540   Max.   :0.42680   Max.   :0.20120     Max.   :0.3040   Max.   :0.09744       
   radius_se        texture_se      perimeter_se       area_se        smoothness_se      compactness_se      concavity_se     concave_points_se   symmetry_se       fractal_dimension_se  radius_worst  
 Min.   :0.1115   Min.   :0.3602   Min.   : 0.757   Min.   :  6.802   Min.   :0.001713   Min.   :0.002252   Min.   :0.00000   Min.   :0.000000   Min.   :0.007882   Min.   :0.0008948    Min.   : 7.93  
 1st Qu.:0.2324   1st Qu.:0.8339   1st Qu.: 1.606   1st Qu.: 17.850   1st Qu.:0.005169   1st Qu.:0.013080   1st Qu.:0.01509   1st Qu.:0.007638   1st Qu.:0.015160   1st Qu.:0.0022480    1st Qu.:13.01  
 Median :0.3242   Median :1.1080   Median : 2.287   Median : 24.530   Median :0.006380   Median :0.020450   Median :0.02589   Median :0.010930   Median :0.018730   Median :0.0031870    Median :14.97  
 Mean   :0.4052   Mean   :1.2169   Mean   : 2.866   Mean   : 40.337   Mean   :0.007041   Mean   :0.025478   Mean   :0.03189   Mean   :0.011796   Mean   :0.020542   Mean   :0.0037949    Mean   :16.27  
 3rd Qu.:0.4789   3rd Qu.:1.4740   3rd Qu.: 3.357   3rd Qu.: 45.190   3rd Qu.:0.008146   3rd Qu.:0.032450   3rd Qu.:0.04205   3rd Qu.:0.014710   3rd Qu.:0.023480   3rd Qu.:0.0045580    3rd Qu.:18.79  
 Max.   :2.8730   Max.   :4.8850   Max.   :21.980   Max.   :542.200   Max.   :0.031130   Max.   :0.135400   Max.   :0.39600   Max.   :0.052790   Max.   :0.078950   Max.   :0.0298400    Max.   :36.04  
 texture_worst   perimeter_worst    area_worst     smoothness_worst  compactness_worst concavity_worst  concave_points_worst symmetry_worst   fractal_dimension_worst
 Min.   :12.02   Min.   : 50.41   Min.   : 185.2   Min.   :0.07117   Min.   :0.02729   Min.   :0.0000   Min.   :0.00000      Min.   :0.1565   Min.   :0.05504        
 1st Qu.:21.08   1st Qu.: 84.11   1st Qu.: 515.3   1st Qu.:0.11660   1st Qu.:0.14720   1st Qu.:0.1145   1st Qu.:0.06493      1st Qu.:0.2504   1st Qu.:0.07146        
 Median :25.41   Median : 97.66   Median : 686.5   Median :0.13130   Median :0.21190   Median :0.2267   Median :0.09993      Median :0.2822   Median :0.08004        
 Mean   :25.68   Mean   :107.26   Mean   : 880.6   Mean   :0.13237   Mean   :0.25427   Mean   :0.2722   Mean   :0.11461      Mean   :0.2901   Mean   :0.08395        
 3rd Qu.:29.72   3rd Qu.:125.40   3rd Qu.:1084.0   3rd Qu.:0.14600   3rd Qu.:0.33910   3rd Qu.:0.3829   3rd Qu.:0.16140      3rd Qu.:0.3179   3rd Qu.:0.09208        
 Max.   :49.54   Max.   :251.20   Max.   :4254.0   Max.   :0.22260   Max.   :1.05800   Max.   :1.2520   Max.   :0.29100      Max.   :0.6638   Max.   :0.20750  


# 2) 교차산점도(Y분류의 좋은 설명변수 확인)
plot(cancer[,2:6], col = cancer$diagnosis)  # 종속변수를 color로 표현하려면
plot(cancer[,7:11], col = cancer$diagnosis) # R에서는 반드시 factor로 선언해야함

 

 

# 3) 이상치
boxplot(cancer[,2:3])

 

# 분류분석의 경우에는 이상치가 존재하여도 이상치에 민감하지 않은 모델을 이용하면 되나, 회귀분석의 경우에는 이상치의 영향을 심하게 받기 때문에 이상치 확인/제거가 필요하다.

 

# 4) 각 변수의 유의성

Y(범주형, 클래스 2개) <-> X(수치형)의 관계는 

양성과 악성 집단의 모평균이 유의하게 다른지를 통해 판단 가능 -> t.test 진행

 

H0 : 두 집단의 평균이 같다.

H1 : 두 집단의 평균이 다르다.

 

t.test(cancer$radius_mean ~ cancer$diagnosis)$p.value

> t.test(cancer$radius_mean ~ cancer$diagnosis)$p.value
[1] 1.684459e-64

 

f1 <- function(x) {
  t.test(x ~ cancer$diagnosis)$p.value
}
apply(cancer[,-1],2,f1)

> apply(cancer[,-1],2,f1)
            radius_mean            texture_mean          perimeter_mean               area_mean 
           1.684459e-64            3.019055e-25            1.023141e-66            3.284366e-52 
        smoothness_mean        compactness_mean          concavity_mean     concave_points_mean 
           5.573331e-19            9.607863e-42            3.742121e-58            3.127316e-71 
          symmetry_mean  fractal_dimension_mean               radius_se              texture_se 
           5.957651e-15            7.667216e-01            1.491133e-30            8.354171e-01 
           perimeter_se                 area_se           smoothness_se          compactness_se 
           6.868553e-29            2.983568e-26            1.052970e-01            6.341807e-12 
           concavity_se       concave_points_se             symmetry_se    fractal_dimension_se 
           1.266514e-11            4.042197e-24            8.871223e-01            4.220238e-02 
           radius_worst           texture_worst         perimeter_worst              area_worst 
           3.556557e-71            5.198708e-30            1.032730e-72            4.937924e-54 
       smoothness_worst       compactness_worst         concavity_worst    concave_points_worst 
           3.474376e-24            1.749835e-38            9.852484e-59            1.061454e-96 
         symmetry_worst fractal_dimension_worst 
           6.562499e-19            2.041904e-12 

 

모든 변수에 있어 p-value가 매우 낮은 것을 확인하였다.

 

# H0 : μ₁ = μ₂

# H1 : μ₁ != μ₂

 

이므로 양성, 음성에 있어 모든 변수에 차이가 있음을 확인할 수 있다.

따라서 두 집단에 유의미한 값의 차이가 발생하기 때문에 초기 단계에서 특정 변수의 제거를 고려할 필요는 없다.

 

 => 모든 변수들의 t.test 결과에 있어 유의확률이 0.05보다 작게 나왔으므로 영가설을 기각하면서 각 변수들이 임의 양성/악성 분류에 영향을 줄 것으로 예상된다.

 

# step4) 모델링
# 1) 데이터 분리
set.seed(0)
rn <- sample(1:nrow(cancer), nrow(cancer) * 0.7)

> rn
  [1] 398 129 509 471 299 270 187 307 277 494 330  37 105
 [14] 485 382 326 559 422 111 404 532 506 343 121  40 537
 [27] 375 248 198 378  39 435 390 280 526  45 402  22 193

 

cancer_train <- cancer[rn, ]
cancer_test <- cancer[-rn, ]

 

# 2) 모델링

# Python은 가능하나, R은 모델 내부에서의 seed 고정이 되지 않는다.
# 또한 R은 seed가 외부에서 고정이 되나 풀리는 문제가 있어 seed 고정 이후에 학습을 진행하는 것이 좋다.

 

library(rpart)
library(rpart.plot)
library(randomForest)

set.seed(32)
m_dt <- rpart(diagnosis ~., data = cancer_train)

> m_dt
n= 398 

node), split, n, loss, yval, (yprob)
      * denotes terminal node

 1) root 398 141 Benign (0.64572864 0.35427136)  
   2) area_worst< 871.8 275  24 Benign (0.91272727 0.08727273)  
     4) concave_points_worst< 0.13185 238   4 Benign (0.98319328 0.01680672) *
     5) concave_points_worst>=0.13185 37  17 Malignant (0.45945946 0.54054054)  
      10) texture_mean< 20.675 23   6 Benign (0.73913043 0.26086957)  
        20) smoothness_mean< 0.10835 16   1 Benign (0.93750000 0.06250000) *
        21) smoothness_mean>=0.10835 7   2 Malignant (0.28571429 0.71428571) *
      11) texture_mean>=20.675 14   0 Malignant (0.00000000 1.00000000) *
   3) area_worst>=871.8 123   6 Malignant (0.04878049 0.95121951)  
     6) concavity_worst< 0.2237 7   2 Benign (0.71428571 0.28571429) *
     7) concavity_worst>=0.2237 116   1 Malignant (0.00862069 0.99137931) *

 


set.seed(32)
m_rt <- randomForest(diagnosis~., data = cancer_train)

> m_rt

Call:
 randomForest(formula = diagnosis ~ ., data = cancer_train) 
               Type of random forest: classification
                     Number of trees: 500
No. of variables tried at each split: 5

        OOB estimate of  error rate: 5.03%
Confusion matrix:
          Benign Malignant class.error
Benign       250         7  0.02723735
Malignant     13       128  0.09219858

 

# step5) 평가
pre_dt_tr <- predict(m_dt, newdata = cancer_train, type = 'class')
pre_dt_te <- predict(m_dt, newdata = cancer_test, type = 'class')

pre_rf_tr <- predict(m_rt, newdata = cancer_train, type = 'class')
pre_rf_te <- predict(m_rt, newdata = cancer_test, type = 'class')

sum(pre_dt_tr == cancer_train$diagnosis) / nrow(cancer_train) * 100
sum(pre_dt_te == cancer_test$diagnosis) / nrow(cancer_test) * 100

> sum(pre_dt_tr == cancer_train$diagnosis) / nrow(cancer_train) * 100
[1] 97.48744
> sum(pre_dt_te == cancer_test$diagnosis) / nrow(cancer_test) * 100
[1] 93.56725


sum(pre_rf_tr == cancer_train$diagnosis) / nrow(cancer_train) * 100
sum(pre_rf_te == cancer_test$diagnosis) / nrow(cancer_test) * 100

> sum(pre_rf_tr == cancer_train$diagnosis) / nrow(cancer_train) * 100
[1] 100
> sum(pre_rf_te == cancer_test$diagnosis) / nrow(cancer_test) * 100
[1] 96.49123

 

 

# step6) 결과 해석
sort(m_dt$variable.importance, decreasing = T)

> sort(m_dt$variable.importance, decreasing = T)
          area_worst         radius_worst      perimeter_worst            area_mean          radius_mean 
         126.8699341          123.7755455          120.7464595          110.3665281          109.3350652 
      perimeter_mean concave_points_worst      concavity_worst    compactness_worst         texture_mean 
         108.3036023           21.8097209           15.1208332           11.9667767            9.5088132 
 concave_points_mean       concavity_mean        texture_worst     compactness_mean      smoothness_mean 
           9.0112085            8.0609980            6.7920094            5.6892789            4.1374224 
          texture_se       compactness_se            radius_se        symmetry_mean fractal_dimension_se 
           3.3960047            2.0376028            1.7731810            1.7731810            0.9392475

 

cols <- c('area_worst', 'radius_worst', 'symmetry_mean', 'fractal_dimension_se')
plot(cancer[,cols], col = cancer$diagnosis)

 

# step7 ) 튜닝
vscore_tr <- c() ; vscore_te <- c()

for (i in 1:ncol(cancer[,-1])) {
  m_rf <- randomForest(diagnosis ~., data = cancer_train, mtry = i)
  
  pre_rf_tr <- predict(m_rf, newdata = cancer_train, type = 'class')
  pre_rf_te <- predict(m_rf, newdata = cancer_test, type = 'class')
  
  vscore_tr <- c(vscore_tr, sum(pre_rf_tr == cancer_train$diagnosis) / nrow(cancer_train) * 100)
  vscore_te <- c(vscore_te, sum(pre_rf_te == cancer_test$diagnosis) / nrow(cancer_test) * 100)
}

plot(1:30, vscore_tr, type = 'o', col = 'red')
lines(1:30, vscore_te, type = 'o' ,col = 'blue')