1 Pendahuluan

Data Scientist seringkali menggunakan beberapa algoritma machine learning untuk mengungkap pola-pola yang tersembunyi dalam rangka mendapatkan insigth dari suatu data. Pada level analisis yang tinggi, beberapa algoritma tersebut secara garis besar dapat dibagi menjadi dua bagian berdasarkan bagaimana “mereka” belajar yaitu supervised learning dan unsupervised learning.

Pendekatan supervised learning adalah algoritma yang paling sering digunakan dalam dunia data science dibandingkan dengan unsupervised learning. Analisis regresi linier berganda maupun logistik yang notabene sudah tidak asing lagi di dengar adalah salah satu contoh dari supervised learning.

Perbedaan kedua algorima tersebut terletak pada bagaimana mereka belajar untuk membuat suatu prediksi maupun klasifikasi. Dalam supervised learning, algoritma tersebut seolah-olah dilatih terlebih dahulu agar dapat melakukan prediksi maupun klasifikasi.

Pendekatan supervised learning mempuyai input dan output yang dapat dibuat menjadi suatu model hubungan matematis sehingga mampu melakukan prediksi dan klasifikasi berdasarkan data yang telah ada sebelumnya.

Misalkan pada suatu kasus seorang dokter atau sebuah rumah sakit yang ingin melakukan ramalan tentang data diagnois penyakit menggunakan analisis deret waktu. Analisis deret waktu (layaknya model regresi) menggunakan data sebelumnya untuk menggunakan prediksi. Data pada periode sebelumnya itulah yang disebut dengan data latih atau data training.

Sehingga dengan data training tersebut akan diperoleh suatu model regresi yang selanjutnya akan digunakan untuk melakukan peramalan. Jadi kesimpulannya adalah supervised learning menggunakan data latih (data training) dalam melakukan prediksi maupun klasifikasi. Beberapa algoritma yang termasuk dalam supervised learning adalah sebagai berikut :

  • Regresi Linier Berganda
  • Analisis Deret Waktu
  • Decision Tree dan Random Forest
  • Naive Bayes Classifier
  • Nearest Neighbor Classifier
  • Artificial Neural Network
  • Support Vector Machine

Berbeda dengan analisis Unsupervised Learning, pendekatannya tidak menggunakan data latih atau data training untuk melakukan prediksi maupun klasifikasi. Berdasarkan model matematisnya, algoritma ini tidak memiliki target variabel. Salah satu tujuan dari algoritma ini adalah mengelompokkan objek yang hampir sama dalam suatu area tertentu.

Dengan kata lain, jika kita memiliki target variabel (Y) maka kita dapat menggunakan pendekatan supervised learning sedangkan jika kita memiliki target variabel, maka kita dapat menggunakan unsupervised learning. Supervised learning membutuhkan data training (harus dilatih terlebih dahulu) sedangkan unsupervised learning tidak membutuhkan data training (tidak perlu dilatih terlebih dahulu).

Pada analisis kali ini akan menggunakan pendekatan metode Supervised Learning (Classfication Machine Learning) untuk memprediksi (mendiagnosa) penyakit kanker payudara yang di alami seorang pasien berdasarkan data yang telah dilaporkan oleh Dr. William H. Wolberg yang mana datasetnya bisa didapatkan di https://archive.ics.uci.edu/ml/datasets/breast+cancer+wisconsin+(original).Metode pendekatan Supervised Learning yang akan dilakukan terdiri dari Klasifikasi Naive Bayes, Decision Tree dan Random Forest.

2 Eksplorasi Data

2.1 Garis Besar Data

Dataset untuk analisis ini adalah data breastcancer (kanker payudara) sebanyak 699 observasi dan 11 variabel. Dimana 1 variabel kategorik, 1 target class dan 9 variabel bebas. Dari data ini akan diprediksi apakah pasien baru terdiagnosa kanker payudara atau tidak berdasarkan 9 variabel prediksi. Berikut adalah deskripsi dari data breastcancer:

  • Id : Sample Code Number

  • Cl.thickness : Clump Thickness

  • Cell.size : Uniformity of Cell Size

  • Cell.shape : Uniformity of Cell Shape

  • Marg.adhesion : Marginal Adhesion

  • Epith.c.size : Single Epithelial Cell Size

  • Bare.nuclei : Bare.nuclei

  • Bl.cromatin : Bland Chromatin

  • Normal.nucleoli : Normal Nucleoli

  • Mitoses : Mitoses

  • Class : Class

2.2 Load Library

Sebelum menganalisa baiknya kita siapkan dahulu library yang diperlukan dalam analisis kali ini.

#Dataset breast cancer yang sudah tersedia di packages R-Studio
library(mlbench)

#Packages yang memiliki fungsi untuk split data, igunakan untuk membagi,
#dataset menjadi data latihan dan datauji.
library(caTools) 

#Packages memiliki fungsi untuk pelatihan dan ploting model
library(caret)
## Loading required package: lattice
## Loading required package: ggplot2
#Packages untuk remove NA values
library(mice) 
## 
## Attaching package: 'mice'
## The following objects are masked from 'package:base':
## 
##     cbind, rbind
#Packages untuk mengimplementasikan klasifikasi Naive Bayes
library(e1071)

#Packages untuk mengimplementasikan Decision
library(rpart) 

#Packages untuk implementasi Random Forest
library(randomForest) 
## randomForest 4.6-14
## Type rfNews() to see new features/changes/bug fixes.
## 
## Attaching package: 'randomForest'
## The following object is masked from 'package:ggplot2':
## 
##     margin

2.3 Load Dataset

data("BreastCancer")

2.4 Ekplorasi Dataset

Dataset terdiri dari 699 observasi dan kelas targetnya adalah Kanker Payudara yaitu variabel yang menentukan apakah pengamatan memiliki tumor ganas.

str(BreastCancer)
## 'data.frame':    699 obs. of  11 variables:
##  $ Id             : chr  "1000025" "1002945" "1015425" "1016277" ...
##  $ Cl.thickness   : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 5 5 3 6 4 8 1 2 2 4 ...
##  $ Cell.size      : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 1 1 2 ...
##  $ Cell.shape     : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 2 1 1 ...
##  $ Marg.adhesion  : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 5 1 1 3 8 1 1 1 1 ...
##  $ Epith.c.size   : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 2 7 2 3 2 7 2 2 2 2 ...
##  $ Bare.nuclei    : Factor w/ 10 levels "1","2","3","4",..: 1 10 2 4 1 10 10 1 1 1 ...
##  $ Bl.cromatin    : Factor w/ 10 levels "1","2","3","4",..: 3 3 3 3 3 9 3 3 1 2 ...
##  $ Normal.nucleoli: Factor w/ 10 levels "1","2","3","4",..: 1 2 1 7 1 7 1 1 1 1 ...
##  $ Mitoses        : Factor w/ 9 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 5 1 ...
##  $ Class          : Factor w/ 2 levels "benign","malignant": 1 1 1 1 1 2 1 1 1 1 ...
levels(BreastCancer$Class)
## [1] "benign"    "malignant"

Dari level diatas dapat dilihat target variabel terdiri dari dua kategori yaitu Benign dan Malignant. Positif target pada analisa ini adalah Malignant. Mari kita lihat struktur data secara keseluruhan.

summary(BreastCancer)
##       Id             Cl.thickness   Cell.size     Cell.shape 
##  Length:699         1      :145   1      :384   1      :353  
##  Class :character   5      :130   10     : 67   2      : 59  
##  Mode  :character   3      :108   3      : 52   10     : 58  
##                     4      : 80   2      : 45   3      : 56  
##                     10     : 69   4      : 40   4      : 44  
##                     2      : 50   5      : 30   5      : 34  
##                     (Other):117   (Other): 81   (Other): 95  
##  Marg.adhesion  Epith.c.size  Bare.nuclei   Bl.cromatin  Normal.nucleoli
##  1      :407   2      :386   1      :402   2      :166   1      :443    
##  2      : 58   3      : 72   10     :132   3      :165   10     : 61    
##  3      : 58   4      : 48   2      : 30   1      :152   3      : 44    
##  10     : 55   1      : 47   5      : 30   7      : 73   2      : 36    
##  4      : 33   6      : 41   3      : 28   4      : 40   8      : 24    
##  8      : 25   5      : 39   (Other): 61   5      : 34   6      : 22    
##  (Other): 63   (Other): 66   NA's   : 16   (Other): 69   (Other): 69    
##     Mitoses          Class    
##  1      :579   benign   :458  
##  2      : 35   malignant:241  
##  3      : 33                  
##  10     : 14                  
##  4      : 12                  
##  7      :  9                  
##  (Other): 17

Dari ringkasan diatas kita jumpai sebanyak 16 NA values, yang artinya akan kita hilangkan dalam proses pembersihan data.

3 Data Cleaning

Nilai yang hilang (NA) adalah masalah umum dalam sebuah dataset, ada beberapa cara untuk mengatasi nilai-nilai yang hilang seperti menghilangkan pengamatan, mengganti nilai-nilai yang hilang dengan mean dari variabel tersebut. Analisa ini akan menggunakan packages (library mice) untuk menghapus 16 NA Values dan menggantinya dengan nilai yang paling sesuai dengan mempertimbangkan nilai dari 9 varibel lainnya, sedangkan kolom ID tidak akan kita masukkan dalam analisa karena tidak diperlukan dalam membuat model analisa.

#Menghapus kolom id dan NA Values dengan packages mice
dataset_impute <- mice(BreastCancer[,2:10],  print = FALSE)

#Menambahkan target ke dataset BreastCancer tanpa NA Values
BreastCancer <- cbind(BreastCancer[,11, drop = FALSE], 
                mice::complete(dataset_impute, 1)) 

Cek ulang dataset, apakah sudah sesuai atau belum.

summary(BreastCancer)
##        Class      Cl.thickness   Cell.size     Cell.shape  Marg.adhesion
##  benign   :458   1      :145   1      :384   1      :353   1      :407  
##  malignant:241   5      :130   10     : 67   2      : 59   2      : 58  
##                  3      :108   3      : 52   10     : 58   3      : 58  
##                  4      : 80   2      : 45   3      : 56   10     : 55  
##                  10     : 69   4      : 40   4      : 44   4      : 33  
##                  2      : 50   5      : 30   5      : 34   8      : 25  
##                  (Other):117   (Other): 81   (Other): 95   (Other): 63  
##   Epith.c.size  Bare.nuclei   Bl.cromatin  Normal.nucleoli    Mitoses   
##  2      :386   1      :411   2      :166   1      :443     1      :579  
##  3      : 72   10     :133   3      :165   10     : 61     2      : 35  
##  4      : 48   2      : 32   1      :152   3      : 44     3      : 33  
##  1      : 47   5      : 30   7      : 73   2      : 36     10     : 14  
##  6      : 41   3      : 29   4      : 40   8      : 24     4      : 12  
##  5      : 39   8      : 21   5      : 34   6      : 22     7      :  9  
##  (Other): 66   (Other): 43   (Other): 69   (Other): 69     (Other): 17

Terlihat kolom ID dan NA Values sudah hilang. Mari kita lanjutkan ke analisa lanjutan.

4 Split Dataset

Split data dilakukan untuk membagi data menjadi datatest (latih), datauji dan dataprediksi dengan pembagian pembagian data 70%:30%. Pengambilan data secara acak menggunakan nilai seed 150. Penggunaan seed dilakukan agar hasil pengacakan tetap. Setiap nilai seed akan melakukan pengacakan yang berbeda sehingga hasil dari setiap nilai seed juga akan berbeda (misal dalam akurasi).

set.seed(150)
 
#Splitting datalatih dan datauji
split=sample.split(BreastCancer, SplitRatio = 0.7) 

#Dataset latih
training_set=subset(BreastCancer,split==TRUE)       

#Dataset Uji
test_set=subset(BreastCancer,split==FALSE)          
dim(training_set) 
## [1] 490  10
dim(test_set)
## [1] 209  10
#Menghilangkan Varibel Target
topredict_set<-test_set[2:10] 

dim(topredict_set)
## [1] 209   9

Sekarang dataset sudah siap digunakan.

5 Pembuatan Model

Langkah selanjutnya adalah merancang model klasifikasi menggunakan algoritma yang berbeda dan membandingkan akurasi model dari seluruh model yang telah dibuat yaitu algoritma Naive Bayes, Decision Tree dan RandomForest.

5.1 Naive Bayes

#Pembuatan Model NaiveBayes 
model_naive<- naiveBayes(Class ~ ., data = training_set)  

#Prediksi kelas target pada dataset validasi (topredict)
preds_naive <- predict(model_naive, newdata = topredict_set) 

(conf_matrix_naive <- table(preds_naive, test_set$Class))   
##            
## preds_naive benign malignant
##   benign       129         2
##   malignant      6        72

Hasil confusionmatrix menunjukkan bahwa klasifikasi Naive Bayes memperkirakan 129 kasus kanker jinak dengan benar dan dua prediksi salah. Demikian pula, model memprediksi 72 kasus kanker ganas dengan benar dan 6 prediksi salah. Bagimana tingkat akurasinya?? Mari kita lihat dibawah ini.

confusionMatrix(conf_matrix_naive) 
## Confusion Matrix and Statistics
## 
##            
## preds_naive benign malignant
##   benign       129         2
##   malignant      6        72
##                                              
##                Accuracy : 0.9617             
##                  95% CI : (0.926, 0.9833)    
##     No Information Rate : 0.6459             
##     P-Value [Acc > NIR] : <0.0000000000000002
##                                              
##                   Kappa : 0.9173             
##                                              
##  Mcnemar's Test P-Value : 0.2888             
##                                              
##             Sensitivity : 0.9556             
##             Specificity : 0.9730             
##          Pos Pred Value : 0.9847             
##          Neg Pred Value : 0.9231             
##              Prevalence : 0.6459             
##          Detection Rate : 0.6172             
##    Detection Prevalence : 0.6268             
##       Balanced Accuracy : 0.9643             
##                                              
##        'Positive' Class : benign             
## 

Dari output model klaisifikasi Naive Bayes terlihat bahwa tingkat akurasi model sebesar 96,17%

5.2 Decision Tree

Selanjutnya mari kita uji dataset menggunakan klasifikasi Decision Tree.

library(partykit)
## Loading required package: grid
## Loading required package: libcoin
## Loading required package: mvtnorm
dt_model <- ctree(Class~ .,training_set)
plot(dt_model)

plot(dt_model, type="simple")

Kita bisa melihat banyaknya pembagian/daun (width) dan banyak lapisan/tingkatan (depth) nya. Dimana :

  • [1] adalah Root Node atau akar
  • [2], [3] dan [4] adalah Internal Nodes atau cabang. Cabang ini ditunjukkan dengan adanya panah yang mengarah ke mereka, dan ada panah yang mengarah dari mereka.
  • [5], [6], [7], [8] dan [9] adalah Leaf Nodes atau daun. Daun ditunjukkan dengan panah yang mengarah ke mereka, namun tidak ada panah yang mengarah dari mereka.

Dengan fungsi dibawah ini kita bisa melihat total daun yaitu 5 buah dan jumlah tingkatannya yang mana tingkat pertama adalah cell.size, kedua bare.nucleioli, ketiga normal.nucleioli dan mitoses.

dt_model
## 
## Model formula:
## Class ~ Cl.thickness + Cell.size + Cell.shape + Marg.adhesion + 
##     Epith.c.size + Bare.nuclei + Bl.cromatin + Normal.nucleoli + 
##     Mitoses
## 
## Fitted party:
## [1] root
## |   [2] Cell.size <= 3
## |   |   [3] Bare.nuclei in 1, 2, 3, 4, 5
## |   |   |   [4] Normal.nucleoli in 1, 2, 3, 6, 7, 8
## |   |   |   |   [5] Mitoses in 1, 5: benign (n = 308, err = 0.0%)
## |   |   |   |   [6] Mitoses in 2, 3, 7: benign (n = 8, err = 25.0%)
## |   |   |   [7] Normal.nucleoli in 4, 5, 10: malignant (n = 7, err = 14.3%)
## |   |   [8] Bare.nuclei in 6, 7, 8, 9, 10: malignant (n = 15, err = 6.7%)
## |   [9] Cell.size > 3: malignant (n = 152, err = 4.6%)
## 
## Number of inner nodes:    4
## Number of terminal nodes: 5
width(dt_model)
## [1] 5
depth(dt_model) 
## [1] 4

Setelah kita latih data train maka kita bisa gunakan langsung pada data test.

predict(dt_model, head(test_set[,-1]))
##         3         4        10        13        14        20 
##    benign malignant    benign malignant    benign    benign 
## Levels: benign malignant
pred <- predict(dt_model, test_set[,-1])
(conf_matrix_dtree <- table(pred, test_set$Class))
##            
## pred        benign malignant
##   benign       127         5
##   malignant      8        69

Hasil confusionmatrix menunjukkan bahwa klasifikasi Decision Tree dapat memperkirakan 127 kasus kanker jinak dengan benar dan 5 prediksi salah. Demikian pula, model memprediksi 69 kasus kanker ganas dengan benar dan 6 prediksi salah. Terlihat kenaikan false positif pada model klasifikasi ini. Untuk melihat tingkat akurasi kita lakukan lagi fungsi confisionmatrix pada klasifikasi Desicion Tree.

predict(dt_model, head(test_set[,-1]), type="prob")
##        benign malignant
## 3  1.00000000 0.0000000
## 4  0.04605263 0.9539474
## 10 1.00000000 0.0000000
## 13 0.14285714 0.8571429
## 14 1.00000000 0.0000000
## 20 1.00000000 0.0000000

Dari tingkat probabilitas diatas bisa kita lihat bahwa data pasien pada urutan ke-3 memiliki probabilitas 100% kanker jinak sedangkan nomor urut 13 memiliki probibilitas tinggi (85%) sebagai pasien dengan kanker payudara ganas.

caret::confusionMatrix(pred, test_set[,1])
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       127         5
##   malignant      8        69
##                                              
##                Accuracy : 0.9378             
##                  95% CI : (0.896, 0.9665)    
##     No Information Rate : 0.6459             
##     P-Value [Acc > NIR] : <0.0000000000000002
##                                              
##                   Kappa : 0.8652             
##                                              
##  Mcnemar's Test P-Value : 0.5791             
##                                              
##             Sensitivity : 0.9407             
##             Specificity : 0.9324             
##          Pos Pred Value : 0.9621             
##          Neg Pred Value : 0.8961             
##              Prevalence : 0.6459             
##          Detection Rate : 0.6077             
##    Detection Prevalence : 0.6316             
##       Balanced Accuracy : 0.9366             
##                                              
##        'Positive' Class : benign             
## 

Sedangkan bila kita lihat dari confusion matrix, tingkat akurasi pada klasifikasi ini 93,78% yang artinya lebih kecil dibandingkan tingkat akurasi dan recall pada klasifikasi Naive Model. Selanjutnya kita coba membuat model dengan menggunakan metode Random Forest, apakah model menjadi lebih baik atau sebaliknya. Kita masih bisa memperbaiki performa model Decision Tree ini dengan mengubah nilai cutoff-nya untuk mendapatkan hasil yang sesuai dengan kondisi false positive yang didapatkan, begitupun dengan model pendekatan menggunakan Naive Bayes niali cutoff masih bisa kita rubah untuk mendapatkan performa terbaiknya.

5.3 Random Forest

5.3.1 Random Forest (Cross Validation K-Fold)

BreastCancer
BreastCancer[,c("Cl.thickness", "Cell.size", "Cell.shape", 
                "Marg.adhesion", "Epith.c.size")] <- 
                lapply(BreastCancer[,c("Cl.thickness", 
                  "Cell.size", "Cell.shape", "Marg.adhesion", 
                  "Epith.c.size")], as.factor)
#merubah user_name, new_window, dan classe menjadi factor
summary(BreastCancer)
##        Class      Cl.thickness   Cell.size     Cell.shape  Marg.adhesion
##  benign   :458   1      :145   1      :384   1      :353   1      :407  
##  malignant:241   5      :130   10     : 67   2      : 59   2      : 58  
##                  3      :108   3      : 52   10     : 58   3      : 58  
##                  4      : 80   2      : 45   3      : 56   10     : 55  
##                  10     : 69   4      : 40   4      : 44   4      : 33  
##                  2      : 50   5      : 30   5      : 34   8      : 25  
##                  (Other):117   (Other): 81   (Other): 95   (Other): 63  
##   Epith.c.size  Bare.nuclei   Bl.cromatin  Normal.nucleoli    Mitoses   
##  2      :386   1      :411   2      :166   1      :443     1      :579  
##  3      : 72   10     :133   3      :165   10     : 61     2      : 35  
##  4      : 48   2      : 32   1      :152   3      : 44     3      : 33  
##  1      : 47   5      : 30   7      : 73   2      : 36     10     : 14  
##  6      : 41   3      : 29   4      : 40   8      : 24     4      : 12  
##  5      : 39   8      : 21   5      : 34   6      : 22     7      :  9  
##  (Other): 66   (Other): 43   (Other): 69   (Other): 69     (Other): 17
library(caret)
set.seed(150)
n0_var <- nearZeroVar(BreastCancer[,2:10]) 
#NzeroVar pada yang diolah adalah kolom ke 2 hingga kolom 10
bc <- BreastCancer[,-n0_var]
#-N0_Var digunakan untuk mengurangi varibel-variabel yang-
#variansi nya mendekati 0 (coba dirun -no_Var nya saja),
#maka akan terlihat urutan pada kolom ke 2 dan seterusnya 
#hingga kolom 10 itu adalah kolom kolom yang variansi nya-
#mendekati nol.
library(animation)
ani.options(interval = 1, nmax = 15)
#nmax????
cv.ani(main = "Demonstration of the k-fold Cross Validation", bty = "l") 

#bty =l (boxtype - l,0 dll)
#Penjelasan dari Visualisasi Demonstration of the k-fold Cross Validation

Sekarang, model akan dibuat dengan 5-Fold Cross Validation, dan 3 perulangan/repeats. 5-Fold dengan 5 repeats akan terlihat seperti ini:

Chunk di bawah ini diset eval=F karena akan memakan waktu. ctrl untuk mengatur k-fold/validasi parameter. Sedangkan train untuk membentuk model

set.seed(150)
ctrl <- trainControl(method="repeatedcv", number=5, repeats=3) 
# method = "none" -> no k-fold 
#repeats menampilkan nilai mtry terbaik,
#misalnya pada kasus ini akan ditampilkan 3 nilai mtry yg terbaik
model_rforest <- train(Class~ ., data=training_set, method="rf", trControl = ctrl)

saveRDS(model_rforest, file = "model_rforest.rds")
model_rforest <- readRDS("model_rforest.rds")

Dari hasil RF itu yang paling bagus mtry paling bagus adalah mtry = 2 (2 variabel), walaupun dengan 80 atau 41 variabel nilai akurasi yang didapatkan sudah cukup baik namun dalam crossvalidation ini menggunakan 2 variabel adalah yang terbaik dari keseluruhan mtry yang dicoba. Dari sini kita mengetahui bahwa mtry adalah banyak variabel yang digunakan pada pembentukan model dan secara sistem default kita juga bisa melihat bahwa Random Forest mencoba berbagai macam nilai mtry.

Jika kita coba plotkan nilainya dengan visualisasi maka hasilnya seperti dibawah ini :

plot(model_rforest) #plot ini tidak bisa di knit???

sum(predict(model_rforest,test_set[,-1])==test_set[,1])
## [1] 197
#nrow(test_set)

#Tidak bisa diknit
#Review = Harusnya nilai nrow sama
varImp(model_rforest)
## rf variable importance
## 
##   only 20 most important variables shown (out of 80)
## 
##                 Overall
## Cell.size.L      100.00
## Cell.size^8       77.32
## Cell.size.Q       76.52
## Epith.c.size.L    74.36
## Cell.shape.L      71.67
## Cell.shape.Q      66.27
## Cell.size.C       62.89
## Cl.thickness.L    59.54
## Cell.size^5       54.56
## Marg.adhesion.L   54.44
## Epith.c.size.Q    53.48
## Epith.c.size^4    53.24
## Cell.shape^8      51.80
## Cell.size^4       51.12
## Cell.shape.C      47.82
## Cell.shape^4      47.04
## Epith.c.size^8    43.72
## Epith.c.size^6    41.21
## Cell.size^6       39.46
## Marg.adhesion.Q   39.09

Dari hasil data diatas terlihat bahwa Cell.size.L memiliki pengaruh paling tinggi terhadap hasil.

Lalu, kita bisa melihat OOB pada tiap kelas dengan sesimpel melakukan plot

plot(model_rforest$finalModel)
legend("topright", colnames(model_rforest$finalModel$err.rate),
       col=1:6,cex=0.8,fill=1:6)

Dari visualisasi diatas terbaca perbandingan antara OOB dan Varibel target,diman dari trees dengan 200 pohon pun sudah erronya semakin sedikit dan sebenerany dengan 200 pohonpun sudah oke untuk sebuah model namun untuk hasil yang lebih maksimal bisa menggunakan diatas 400 pohon untuk mengurangi OOB. Dan kita bisa melihat model akhirnya seperti berikut ini.

model_rforest$finalModel
## 
## Call:
##  randomForest(x = x, y = y, mtry = param$mtry) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 2
## 
##         OOB estimate of  error rate: 3.47%
## Confusion matrix:
##           benign malignant class.error
## benign       314         9  0.02786378
## malignant      8       159  0.04790419

Dengan menggunakan mtry 2 variabel didapatkan model dapat memprediksi data kanker jinak sebanyak 314 dengan benar dan salah memprediksi sebanyak 8 kasus, begiputun dalam hal memprediksi kanker ganas model dapat menebak dengan benar sebanyak 159 kasus dan 9 kasus salah.

predict_forest <- predict(model_rforest, topredict_set)
(conf_matrix_forestI <- table(predict_forest, test_set$Class)) 
##               
## predict_forest benign malignant
##      benign       127         4
##      malignant      8        70
#kenapa hasil predict beda dengan finalmodel??

Bila kita terapkan pada dataset uji maka consfusion matrix yang didapatkan seperti diatas, lalu bagaimana dengan tingkat nilai akurasi dan recall-nya?? Bisa kita lakukan seperti sebelumnya pada Decision Tree dan Naive Bayes.

confusionMatrix(conf_matrix_forestI) 
## Confusion Matrix and Statistics
## 
##               
## predict_forest benign malignant
##      benign       127         4
##      malignant      8        70
##                                              
##                Accuracy : 0.9426             
##                  95% CI : (0.9019, 0.97)     
##     No Information Rate : 0.6459             
##     P-Value [Acc > NIR] : <0.0000000000000002
##                                              
##                   Kappa : 0.876              
##                                              
##  Mcnemar's Test P-Value : 0.3865             
##                                              
##             Sensitivity : 0.9407             
##             Specificity : 0.9459             
##          Pos Pred Value : 0.9695             
##          Neg Pred Value : 0.8974             
##              Prevalence : 0.6459             
##          Detection Rate : 0.6077             
##    Detection Prevalence : 0.6268             
##       Balanced Accuracy : 0.9433             
##                                              
##        'Positive' Class : benign             
## 

Hasilnya, model dapat memprediksi data kanker jinak sebanyak 127 dengan benar dan salah memprediksi sebanyak 8 kasus, begiputun dalam hal memprediksi kanker ganas model dapat menebak dengan benar sebanyak 70 kasus dan 4 kasus salah dengan tingkat aakurasi sebesar 94,26% dan Recall 94,07%.

Perlu diketahui bahwa model yang kita buat di atas adalah model yang dengan melakukan Cross Validation menggunakan K-Fold. Bila ingin melakukan random forest original dan membandingkannya dengan model random forest (Cross Validation K-Fold) untuk selanjutnya memilih model yang cocok, berikut ini penjelasannya.

5.3.2 Random Forest (Original)

library(randomForest)
model_rf <- randomForest(Class ~ ., data = training_set, importance=TRUE, 
                         ntree = 500)

model_rf
## 
## Call:
##  randomForest(formula = Class ~ ., data = training_set, importance = TRUE,      ntree = 500) 
##                Type of random forest: classification
##                      Number of trees: 500
## No. of variables tried at each split: 3
## 
##         OOB estimate of  error rate: 2.24%
## Confusion matrix:
##           benign malignant class.error
## benign       314         9  0.02786378
## malignant      2       165  0.01197605
preds_rf <- predict(model_rf, topredict_set)              
plot(model_rf)

(conf_matrix_forestII <- table(preds_rf, test_set$Class))
##            
## preds_rf    benign malignant
##   benign       128         2
##   malignant      7        72

Hasil confusionmatrix menunjukkan bahwa klasifikasi Random Forest dapat memperkirakan 128 kasus kanker jinak dengan benar dan 7 prediksi salah. Demikian pula, model memprediksi 72 kasus kanker ganas dengan benar dan 2 prediksi salah. Bila dibandingkan dengan model randomforest (Cross Validation K-Fold) model forestII lebih baik. Lalu apakah nilai akurasinya berbanding lurus dengan hasil prediksinya??

confusionMatrix(conf_matrix_forestII) 
## Confusion Matrix and Statistics
## 
##            
## preds_rf    benign malignant
##   benign       128         2
##   malignant      7        72
##                                              
##                Accuracy : 0.9569             
##                  95% CI : (0.9198, 0.9801)   
##     No Information Rate : 0.6459             
##     P-Value [Acc > NIR] : <0.0000000000000002
##                                              
##                   Kappa : 0.9073             
##                                              
##  Mcnemar's Test P-Value : 0.1824             
##                                              
##             Sensitivity : 0.9481             
##             Specificity : 0.9730             
##          Pos Pred Value : 0.9846             
##          Neg Pred Value : 0.9114             
##              Prevalence : 0.6459             
##          Detection Rate : 0.6124             
##    Detection Prevalence : 0.6220             
##       Balanced Accuracy : 0.9606             
##                                              
##        'Positive' Class : benign             
## 

Terlihat, nilai akurasi dan sensitivity (recall) meningkat dibanding model randomforest II, dengan nilai Akurasi 95,69% dan Recall 94,81%. Dari kedua analisa Random Forest ini, maka akan kita ambil model RandomForest II (Original) sebagai kandidat terbaik untuk kita lakukan perbandingan dengan model Naive Bayes dan Decision Tree.

Setelah kita lihat tingkat nilai yang dihasilkan, ternyata tingkat akurasi model RFII juga turun menjadi 95,69%, secara eksplisit model RFII lebih baik dibandingkan Decision Tree namun tidak lebih baik dari model klasifikasi Naive Bayes. Dibandingkan klasifikasi Decision Tree, model Random Forest memiliki false positif lebih rendah namun masih lebih tinggi dibanding model Naive Bayes. Apakah tingkat akurasinya juga lebih kecil dibandingkan model Naive Bayes?

6 Kesimpulan

Jika kita bandingkan secara keseluruhan dengan mengurutkan dan mempertimbangkan nilai akurasi dan recall (sensitivity) dari yang tertinggi dan terendah bisa dilihat seperti dibawah ini :

confusionMatrix(conf_matrix_naive) 
## Confusion Matrix and Statistics
## 
##            
## preds_naive benign malignant
##   benign       129         2
##   malignant      6        72
##                                              
##                Accuracy : 0.9617             
##                  95% CI : (0.926, 0.9833)    
##     No Information Rate : 0.6459             
##     P-Value [Acc > NIR] : <0.0000000000000002
##                                              
##                   Kappa : 0.9173             
##                                              
##  Mcnemar's Test P-Value : 0.2888             
##                                              
##             Sensitivity : 0.9556             
##             Specificity : 0.9730             
##          Pos Pred Value : 0.9847             
##          Neg Pred Value : 0.9231             
##              Prevalence : 0.6459             
##          Detection Rate : 0.6172             
##    Detection Prevalence : 0.6268             
##       Balanced Accuracy : 0.9643             
##                                              
##        'Positive' Class : benign             
## 
confusionMatrix(conf_matrix_forestII) 
## Confusion Matrix and Statistics
## 
##            
## preds_rf    benign malignant
##   benign       128         2
##   malignant      7        72
##                                              
##                Accuracy : 0.9569             
##                  95% CI : (0.9198, 0.9801)   
##     No Information Rate : 0.6459             
##     P-Value [Acc > NIR] : <0.0000000000000002
##                                              
##                   Kappa : 0.9073             
##                                              
##  Mcnemar's Test P-Value : 0.1824             
##                                              
##             Sensitivity : 0.9481             
##             Specificity : 0.9730             
##          Pos Pred Value : 0.9846             
##          Neg Pred Value : 0.9114             
##              Prevalence : 0.6459             
##          Detection Rate : 0.6124             
##    Detection Prevalence : 0.6220             
##       Balanced Accuracy : 0.9606             
##                                              
##        'Positive' Class : benign             
## 
confusionMatrix(conf_matrix_dtree) 
## Confusion Matrix and Statistics
## 
##            
## pred        benign malignant
##   benign       127         5
##   malignant      8        69
##                                              
##                Accuracy : 0.9378             
##                  95% CI : (0.896, 0.9665)    
##     No Information Rate : 0.6459             
##     P-Value [Acc > NIR] : <0.0000000000000002
##                                              
##                   Kappa : 0.8652             
##                                              
##  Mcnemar's Test P-Value : 0.5791             
##                                              
##             Sensitivity : 0.9407             
##             Specificity : 0.9324             
##          Pos Pred Value : 0.9621             
##          Neg Pred Value : 0.8961             
##              Prevalence : 0.6459             
##          Detection Rate : 0.6077             
##    Detection Prevalence : 0.6316             
##       Balanced Accuracy : 0.9366             
##                                              
##        'Positive' Class : benign             
## 
  • Beberapa variabel seperti Cell Size, Bare Nucleioli, Normal Nucleioli dan Mitoses sangat mempengaruhi seorang pasien terdiagnosa kanker payudara ganas atau jinak.

  • Dalam mendapatkan performa terbaik untuk tiap-tiap model khususnya pada model Naive Bayes dan Decision Tree masih dapat ditingkatkan performanya dengan merubah dan mencari nilai cutoff yang paling sesuai, dalam analisa ini tentunya kita ingin meminimalisir False Positive, maka perlu dicari nilai cutoff mana yang mampu memberikan prosentase recall tinggi namun tidak terlalu merubah tingkat akurasi.

  • Berdasarkan urutan tingkat akurasi dan nilai recall, model klasifikasi Naive Bayes adalah model terbaik. Dengan tingkat akurasi 96,17% dan Recall 95,56% sedangkan Random ForestII (Acc = 95,69% Recall = 94,81%) dan Decision Tree (Acc = 93,78% Recall = 94,07%). Namun kita masih bisa mengubah nilai cutoff dari tiap model dan melakukan validasi ulang terhadap nilai k-fold khususnya pada model random forest.