Perkembangan teknologi pengolahan data mendorong penggunaan metode machine learning untuk membantu proses klasifikasi dan prediksi dalam berbagai bidang, termasuk kesehatan. Salah satu metode yang dapat digunakan adalah Decision Tree, yaitu metode klasifikasi yang menghasilkan struktur pohon berupa aturan keputusan sehingga hasil analisis lebih mudah dipahami dan diinterpretasikan (Mienye & Jere, 2024).
Salah satu penerapan klasifikasi dalam bidang kesehatan adalah identifikasi kondisi kanker payudara berdasarkan karakteristik sel. Metode klasifikasi dapat digunakan untuk membedakan kondisi kanker ke dalam kategori jinak (benign) dan ganas (malignant) berdasarkan pola yang terdapat dalam data. Penerapan algoritma Decision Tree untuk klasifikasi kanker payudara telah dikaji dalam penelitian sebelumnya (Munir dkk., 2024).
Berdasarkan hal tersebut, praktikum ini menggunakan dataset BreastCancer dari package mlbench dalam software R untuk mengklasifikasikan kondisi kanker payudara menggunakan metode Decision Tree dengan algoritma CART. Tahapan analisis meliputi pemeriksaan dan penanganan missing value, pembentukan model, visualisasi pohon klasifikasi, analisis variable importance, serta evaluasi menggunakan confusion matrix. Selanjutnya, dilakukan pruning berdasarkan nilai Complexity Parameter (CP) terbaik dan evaluasi kembali menggunakan confusion matrix, kurva ROC, serta nilai AUC.
Berdasarkan latar belakang tersebut, rumusan masalah dalam praktikum ini adalah sebagai berikut.
Bagaimana konsep dasar Decision Tree untuk klasifikasi menggunakan metode CART (Classification and Regression Tree)?
Bagaimana membangun model Classification Tree menggunakan algoritma CART?
Tujuan yang ingin dicapai dalam praktikum ini adalah sebagai berikut:
Mahasiswa mampu menjelaskan konsep dasar Decision Tree untuk klasifikasi menggunakan metode CART (Classification and Regression Tree).
Mahasiswa mampu membangun model Classification Tree menggunakan algoritma CART.
Decision Tree merupakan salah satu metode supervised learning berbasis pohon yang dapat digunakan untuk membentuk aturan prediksi. Pada metode ini, data dibagi secara bertahap melalui proses splitting berdasarkan variabel prediktor sehingga terbentuk kelompok-kelompok data yang semakin homogen. Setiap percabangan pada pohon menunjukkan aturan pemisahan sedangkan simpul akhir (leaf node) menunjukkan hasil prediksi. Pada permasalahan klasifikasi, Decision Tree membagi data berdasarkan nilai variabel prediktor hingga diperoleh kelompok yang memiliki kelas relatif homogen. Proses pemisahan dilakukan secara bertahap mulai dari simpul akar sampai simpul daun. Pemilihan variabel untuk pemisahan didasarkan pada kriteria tertentu agar menghasilkan kelompok yang semakin baik dalam membedakan kelas. Salah satu ukuran yang digunakan dalam pembentukan pohon klasifikasi adalah indeks Gini, yang mengukur tingkat ketidakmurnian suatu simpul (Mienye & Jere, 2024).
Indeks Gini dirumuskan sebagai berikut:
\[Gini(t) = 1 - \sum_{k=1}^{K} p_k^2\]
Keterangan:
Nilai indeks Gini yang semakin kecil menunjukkan bahwa observasi dalam simpul semakin didominasi oleh satu kelas. Sebaliknya, nilai yang semakin besar menunjukkan bahwa kelas dalam simpul lebih beragam. Oleh karena itu, pemisahan yang baik diharapkan dapat menghasilkan kelompok dengan tingkat ketidakmurnian yang lebih rendah (Mienye & Jere, 2024).
Classification and Regression Tree (CART) merupakan algoritma pohon keputusan yang digunakan untuk menyelesaikan permasalahan klasifikasi maupun regresi. Pada klasifikasi, CART digunakan untuk memprediksi kategori respons, sedangkan pada regresi digunakan untuk memprediksi nilai numerik. Salah satu karakteristik CART adalah pemisahan data secara biner (binary split), yaitu setiap pemisahan membentuk dua kelompok berdasarkan variabel prediktor dan titik pemisahan tertentu (Mienye & Jere, 2024).
Pada klasifikasi, CART dapat menggunakan indeks Gini untuk menentukan pemisahan terbaik. Kualitas suatu pemisahan dapat dihitung berdasarkan rata-rata tertimbang indeks Gini dari kedua kelompok yang terbentuk, yaitu:
\[ Gini_{\text{split}} = \frac{n_L}{n}Gini(L) + \frac{n_R}{n}Gini(R) \]
Keterangan:
Pemisahan dipilih dengan mempertimbangkan nilai ketidakmurnian tertimbang yang lebih kecil dibandingkan alternatif pemisahan lainnya. Dengan demikian, data dapat dibagi secara bertahap hingga terbentuk pohon yang mampu membedakan kategori respons berdasarkan karakteristik variabel prediktor (Robbaniyyah dkk., 2026).
Pohon klasifikasi yang terbentuk dapat memiliki banyak cabang sehingga berisiko mengalami overfitting, yaitu ketika model terlalu menyesuaikan diri dengan data pelatihan dan kurang baik dalam memprediksi data baru. Untuk mengatasi hal tersebut, CART menyediakan proses pemangkasan pohon (pruning) guna menyederhanakan struktur pohon dan mengurangi cabang yang kurang diperlukan. Dalam proses ini, nilai Complexity Parameter (CP) dapat digunakan sebagai dasar untuk menentukan tingkat pemangkasan pohon (Mienye & Jere, 2024).
Jenis data yang digunakan dalam penelitian ini berupa data kuantitatif. Data kuantitatif adalah jenis data yang berbentuk angka atau berskala numerik yang dapat dihitung secara langsung. Sumber data yang digunakan adalah data sekunder. Data sekunder adalah data yang diperoleh secara tidak langsung melalui perantara. Data yang digunakan pada penelitian ini adalah data BreastCancer pada package mlbench pada program R.
Variabel penelitian adalah segala sesuatu yang menjadi objek pengamatan dalam suatu penelitian. Variabel penelitian yang digunakan berasal dari dataset BreastCancer dengan jumlah 699 observasi dan 11 variabel, termasuk satu variabel identitas sampel. Variabel-variabel tersebut meliputi Sample code number, Clump Thickness, Uniformity of Cell Size, Uniformity of Cell Shape, Marginal Adhesion, Single Epithelial Cell Size, Bare Nuclei, Bland Chromatin, Normal Nucleoli, Mitoses, dan Class. Variabel Class merupakan variabel respons yang digunakan untuk mengklasifikasikan kondisi kanker payudara ke dalam dua kategori, yaitu benign dan malignant. Sementara itu, variabel karakteristik sel digunakan sebagai variabel prediktor dalam pembentukan model klasifikasi..
Berikut langkah” analisis data pada penelitian ini:
Memuat dataset BreastCancer dari package mlbench.
Memeriksa dan menangani missing value menggunakan MICE.
Menghapus variabel Id serta membagi data menjadi training dan testing.
Membentuk dan memvisualisasikan model Classification Tree menggunakan algoritma CART.
Menganalisis variable importance dan mengevaluasi model awal menggunakan confusion matrix.
Menentukan CP terbaik berdasarkan cross validation.
Melakukan pruning dan memvisualisasikan pohon hasil pruning.
Mengevaluasi model setelah pruning menggunakan confusion matrix, kurva ROC, dan nilai AUC.
Library yang digunakan pada pratikum adalah sebagai berikut:
##
## Attaching package: 'mice'
## The following object is masked from 'package:stats':
##
## filter
## The following objects are masked from 'package:base':
##
## cbind, rbind
## Loading required package: ggplot2
## Loading required package: lattice
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
## [1] 699 11
## '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 ...
## Id Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size
## 1 1000025 5 1 1 1 2
## 2 1002945 5 4 4 5 7
## 3 1015425 3 1 1 1 2
## 4 1016277 6 8 8 1 3
## 5 1017023 4 1 1 3 2
## 6 1017122 8 10 10 8 7
## Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses Class
## 1 1 3 1 1 benign
## 2 10 3 2 1 benign
## 3 2 3 1 1 benign
## 4 4 3 7 1 benign
## 5 1 3 1 1 benign
## 6 10 9 7 1 malignant
## Id Cl.thickness Cell.size Cell.shape Marg.adhesion
## Length :699 1 :145 1 :384 1 :353 1 :407
## N.unique :645 5 :130 10 : 67 2 : 59 2 : 58
## N.blank : 0 3 :108 3 : 52 10 : 58 3 : 58
## Min.nchar: 5 4 : 80 2 : 45 3 : 56 10 : 55
## Max.nchar: 8 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 :402 2 :166 1 :443 1 :579
## 3 : 72 10 :132 3 :165 10 : 61 2 : 35
## 4 : 48 2 : 30 1 :152 3 : 44 3 : 33
## 1 : 47 5 : 30 7 : 73 2 : 36 10 : 14
## 6 : 41 3 : 28 4 : 40 8 : 24 4 : 12
## 5 : 39 (Other): 61 5 : 34 6 : 22 7 : 9
## (Other): 66 NAs : 16 (Other): 69 (Other): 69 (Other): 17
## Class
## benign :458
## malignant:241
##
##
##
##
##
Data BreastCancer berisi variabel prediktor yang
menggambarkan karakteristik sel dan variabel Class sebagai
target klasifikasi, yaitu kondisi benign dan
malignant. Variabel Id merupakan identitas
observasi sehingga tidak digunakan sebagai prediktor model. Variabel
benign 458 dan variabel malignant 241.
# Menghapus variabel identitas
data_bc$Id <- NULL
# Memastikan variabel target berupa faktor
data_bc$Class <- factor(
data_bc$Class,
levels = c("benign", "malignant")
)
# Memastikan prediktor berbentuk faktor
prediktor <- setdiff(names(data_bc), "Class")
data_bc[prediktor] <- lapply(data_bc[prediktor], factor)
str(data_bc)## 'data.frame': 699 obs. of 10 variables:
## $ 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 ...
##
## benign malignant
## 458 241
missing_awal <- data.frame(
Variabel = names(data_bc),
Jumlah_Missing = colSums(is.na(data_bc)),
Persentase_Missing = round(
colMeans(is.na(data_bc)) * 100, 2
)
)
kable(missing_awal, caption = "Pemeriksaan missing value sebelum imputasi")| Variabel | Jumlah_Missing | Persentase_Missing | |
|---|---|---|---|
| Cl.thickness | Cl.thickness | 0 | 0.00 |
| Cell.size | Cell.size | 0 | 0.00 |
| Cell.shape | Cell.shape | 0 | 0.00 |
| Marg.adhesion | Marg.adhesion | 0 | 0.00 |
| Epith.c.size | Epith.c.size | 0 | 0.00 |
| Bare.nuclei | Bare.nuclei | 16 | 2.29 |
| Bl.cromatin | Bl.cromatin | 0 | 0.00 |
| Normal.nucleoli | Normal.nucleoli | 0 | 0.00 |
| Mitoses | Mitoses | 0 | 0.00 |
| Class | Class | 0 | 0.00 |
Berdasarkan tabel tersebut, variabel yang memiliki missing value dapat diidentifikasi melalui kolom Jumlah_Missing. Hasil pemeriksaan menunjukkan bahwa terdapat missing value pada variabel Bare.nuclei sebanyak 16 data atau sebesar 2,29% dari keseluruhan pengamatan. Sementara itu, sembilan variabel lainnya tidak memiliki missing value. Selanjutnya, penanganan missing value dilakukan menggunakan metode Multiple Imputation by Chained Equations (mice) untuk mengestimasi nilai yang hilang sehingga data dapat digunakan pada tahap analisis berikutnya.
# Menentukan metode imputasi
metode <- mice::make.method(data_bc)
metode["Class"] <- ""
# Menentukan matriks prediktor
prediktor <- mice::make.predictorMatrix(data_bc)
prediktor[, "Class"] <- 0
prediktor["Class", ] <- 0
# Melakukan imputasi
set.seed(234)
imputasi <- mice::mice(
data_bc,
m = 5,
method = metode,
predictorMatrix = prediktor,
seed = 234,
printFlag = FALSE
)
# Mengambil satu dataset hasil imputasi
data_bc_imp <- mice::complete(imputasi, action = 1)
# Memeriksa missing value setelah imputasi
missing_akhir <- data.frame(
Variabel = names(data_bc_imp),
Jumlah_Missing = colSums(is.na(data_bc_imp))
)
knitr::kable(
missing_akhir,
caption = "Pemeriksaan Missing Value Setelah Imputasi"
)| Variabel | Jumlah_Missing | |
|---|---|---|
| Cl.thickness | Cl.thickness | 0 |
| Cell.size | Cell.size | 0 |
| Cell.shape | Cell.shape | 0 |
| Marg.adhesion | Marg.adhesion | 0 |
| Epith.c.size | Epith.c.size | 0 |
| Bare.nuclei | Bare.nuclei | 0 |
| Bl.cromatin | Bl.cromatin | 0 |
| Normal.nucleoli | Normal.nucleoli | 0 |
| Mitoses | Mitoses | 0 |
| Class | Class | 0 |
Berdasarkan hasil imputasi menggunakan metode MICE, penanganan missing value dilakukan terhadap variabel Bare.nuclei yang sebelumnya memiliki 16 nilai hilang. Hasil pemeriksaan setelah imputasi menunjukkan bahwa jumlah missing value adalah 0 pada seluruh variabel. Dengan demikian, proses penanganan missing value berhasil dilakukan sehingga data dapat digunakan untuk tahap pemodelan Classification Tree.
Data dibagi menjadi 70% data training dan 30% data testing. Pembagian
dilakukan secara terstratifikasi berdasarkan variabel Class
agar proporsi kelas relatif terjaga.
set.seed(234)
indeks_train <- createDataPartition(
data_bc_imp$Class,
p = 0.70,
list = FALSE
)
data_train <- data_bc_imp[indeks_train, ]
data_test <- data_bc_imp[-indeks_train, ]
dim(data_train)## [1] 490 10
## [1] 209 10
##
## benign malignant
## 0.655102 0.344898
##
## benign malignant
## 0.6555024 0.3444976
Berdasarkan hasil pembagian data, sebanyak 490 observasi dengan 10 variabel digunakan sebagai data training (70%), sedangkan 209 observasi dengan 10 variabel digunakan sebagai data testing (30%). Pembagian data dilakukan secara terstratifikasi berdasarkan variabel Class untuk menjaga proporsi kelas benign dan malignant pada kedua kelompok data. Proporsi kelas pada data training adalah 65,51% untuk kelas benign dan 34,49% untuk kelas malignant. Sementara itu, data testing memiliki proporsi kelas benign sebesar 65,55% dan malignant sebesar 34,45%. Hasil tersebut menunjukkan bahwa proporsi kedua kelas relatif terjaga setelah pembagian data.
Model dibentuk menggunakan fungsi rpart() dengan
method = "class". Parameter cp awal dibuat
kecil agar kandidat pohon yang lebih besar dapat dievaluasi sebelum
dilakukan pruning.
set.seed(234)
model_tree <- rpart(
Class ~ .,
data = data_train,
method = "class",
parms = list(split = "gini"),
control = rpart.control(
cp = 0.001,
minsplit = 10,
xval = 10
)
)
print(model_tree)## n= 490
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 490 169 benign (0.655102041 0.344897959)
## 2) Cell.size=1,2 309 11 benign (0.964401294 0.035598706)
## 4) Bare.nuclei=1,2,3,4,5 303 5 benign (0.983498350 0.016501650)
## 8) Cl.thickness=1,2,3,4,5,6 298 2 benign (0.993288591 0.006711409) *
## 9) Cl.thickness=7,8,9,10 5 2 malignant (0.400000000 0.600000000) *
## 5) Bare.nuclei=6,7,8,10 6 0 malignant (0.000000000 1.000000000) *
## 3) Cell.size=3,4,5,6,7,8,9,10 181 23 malignant (0.127071823 0.872928177)
## 6) Bare.nuclei=1,6 23 9 benign (0.608695652 0.391304348)
## 12) Cell.size=1,2,3 12 0 benign (1.000000000 0.000000000) *
## 13) Cell.size=4,5,6,7,8,9,10 11 2 malignant (0.181818182 0.818181818)
## 26) Bl.cromatin=4 3 1 benign (0.666666667 0.333333333) *
## 27) Bl.cromatin=2,3,7,8,10 8 0 malignant (0.000000000 1.000000000) *
## 7) Bare.nuclei=2,3,4,5,7,8,9,10 158 9 malignant (0.056962025 0.943037975)
## 14) Bare.nuclei=2,3,4,8 44 8 malignant (0.181818182 0.818181818)
## 28) Normal.nucleoli=2,6 4 1 benign (0.750000000 0.250000000) *
## 29) Normal.nucleoli=1,3,4,5,7,8,9,10 40 5 malignant (0.125000000 0.875000000)
## 58) Bl.cromatin=3,5,6 17 5 malignant (0.294117647 0.705882353)
## 116) Cl.thickness=1,2,3,4,5,6 8 3 benign (0.625000000 0.375000000) *
## 117) Cl.thickness=7,8,9,10 9 0 malignant (0.000000000 1.000000000) *
## 59) Bl.cromatin=4,7,8,9,10 23 0 malignant (0.000000000 1.000000000) *
## 15) Bare.nuclei=5,7,9,10 114 1 malignant (0.008771930 0.991228070) *
rpart.plot(
model_tree,
type = 2,
extra = 104,
fallen.leaves = TRUE,
main = "Classification Tree Sebelum Pruning"
)Visualisasi pohon klasifikasi menunjukkan bahwa variabel Cell.size menjadi pemisah utama dalam mengklasifikasikan tumor ke dalam kelas benign dan malignant. Pemisahan selanjutnya melibatkan variabel Bare.nuclei, Cl.thickness, Bl.cromatin, dan Normal.nucleoli untuk menghasilkan klasifikasi yang lebih spesifik. Setiap cabang menunjukkan aturan pemisahan berdasarkan nilai prediktor, sedangkan simpul terminal menunjukkan kelas hasil prediksi model.
importance <- model_tree$variable.importance
if (is.null(importance) || length(importance) == 0) {
cat("Model tidak menghasilkan nilai variable importance.")
} else {
tabel_importance <- data.frame(
Variabel = names(importance),
Importance = as.numeric(importance)
)
tabel_importance <- tabel_importance[
order(tabel_importance$Importance, decreasing = TRUE),
]
kable(
tabel_importance,
digits = 3,
row.names = FALSE,
caption = "Variable importance sebelum pruning"
)
barplot(
sort(importance, decreasing = TRUE),
horiz = TRUE,
las = 1,
main = "Variable Importance",
xlab = "Importance"
)
}Variabel dengan nilai importance tertinggi memiliki kontribusi relatif lebih besar dalam proses pembentukan pohon klasifikasi. Nilai importance menunjukkan tingkat kepentingan variabel dalam membantu pemisahan kelas benign dan malignant, tetapi tidak menunjukkan hubungan sebab-akibat.
prediksi_awal <- predict(
model_tree,
newdata = data_test,
type = "class"
)
prediksi_awal <- factor(
prediksi_awal,
levels = levels(data_test$Class)
)
cm_awal <- confusionMatrix(
data = prediksi_awal,
reference = data_test$Class,
positive = "malignant"
)
cm_awal## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 129 3
## malignant 8 69
##
## Accuracy : 0.9474
## 95% CI : (0.9078, 0.9734)
## No Information Rate : 0.6555
## P-Value [Acc > NIR] : <2e-16
##
## Kappa : 0.8854
##
## Mcnemar's Test P-Value : 0.2278
##
## Sensitivity : 0.9583
## Specificity : 0.9416
## Pos Pred Value : 0.8961
## Neg Pred Value : 0.9773
## Prevalence : 0.3445
## Detection Rate : 0.3301
## Detection Prevalence : 0.3684
## Balanced Accuracy : 0.9500
##
## 'Positive' Class : malignant
##
Berdasarkan hasil evaluasi confusion matrix, model Classification Tree memperoleh nilai accuracy sebesar 94,74%, yang menunjukkan bahwa sebagian besar data testing berhasil diklasifikasikan dengan benar. Nilai sensitivity sebesar 95,83% menunjukkan kemampuan model dalam mengidentifikasi kelas malignant, sedangkan specificity sebesar 94,16% menunjukkan kemampuan model dalam mengidentifikasi kelas benign. Selain itu, nilai Kappa sebesar 0,8854 menunjukkan tingkat kesesuaian klasifikasi yang sangat baik. Dengan demikian, model memiliki kinerja klasifikasi yang baik dalam membedakan kedua kelas pada data testing.
# Menampilkan tabel complexity parameter
tabel_cp <- as.data.frame(model_tree$cptable)
knitr::kable(
tabel_cp,
digits = 6,
caption = "Tabel Complexity Parameter (CP)"
)| CP | nsplit | rel error | xerror | xstd |
|---|---|---|---|---|
| 0.798817 | 0 | 1.000000 | 1.000000 | 0.062260 |
| 0.035503 | 1 | 0.201183 | 0.248521 | 0.036667 |
| 0.005917 | 4 | 0.094675 | 0.124260 | 0.026528 |
| 0.001000 | 10 | 0.059172 | 0.165680 | 0.030403 |
# Menentukan CP terbaik berdasarkan xerror terkecil
indeks_cp_terbaik <- which.min(model_tree$cptable[, "xerror"])
cp_terbaik <- model_tree$cptable[indeks_cp_terbaik, "CP"]
cat("CP terbaik berdasarkan xerror terkecil =", cp_terbaik, "\n")## CP terbaik berdasarkan xerror terkecil = 0.00591716
Berdasarkan tabel complexity parameter (CP), nilai xerror terkecil sebesar 0,124260 diperoleh pada CP sebesar 0,005917. Nilai tersebut menunjukkan bahwa model dengan empat pemisahan (nsplit = 4) memiliki estimasi kesalahan validasi silang paling rendah dibandingkan kandidat model lainnya. Oleh karena itu, CP sebesar 0,00591716 dipilih sebagai acuan dalam proses pruning untuk menyederhanakan pohon klasifikasi dengan mempertimbangkan tingkat kesalahan prediksi model.
Nilai Complexity Parameter (CP) digunakan untuk mengatur kompleksitas pohon klasifikasi. Dalam analisis ini, pemilihan CP dilakukan berdasarkan nilai xerror terkecil sebagai kriteria untuk menentukan tingkat kompleksitas pohon yang digunakan dalam proses pruning.
## n= 490
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 490 169 benign (0.65510204 0.34489796)
## 2) Cell.size=1,2 309 11 benign (0.96440129 0.03559871)
## 4) Bare.nuclei=1,2,3,4,5 303 5 benign (0.98349835 0.01650165) *
## 5) Bare.nuclei=6,7,8,10 6 0 malignant (0.00000000 1.00000000) *
## 3) Cell.size=3,4,5,6,7,8,9,10 181 23 malignant (0.12707182 0.87292818)
## 6) Bare.nuclei=1,6 23 9 benign (0.60869565 0.39130435)
## 12) Cell.size=1,2,3 12 0 benign (1.00000000 0.00000000) *
## 13) Cell.size=4,5,6,7,8,9,10 11 2 malignant (0.18181818 0.81818182) *
## 7) Bare.nuclei=2,3,4,5,7,8,9,10 158 9 malignant (0.05696203 0.94303797) *
rpart.plot(
model_pruned,
type = 2,
extra = 104,
fallen.leaves = TRUE,
main = "Classification Tree Setelah Pruning"
)Visualisasi pohon klasifikasi setelah proses pruning menunjukkan bahwa Cell.size menjadi pemisah utama, diikuti oleh Bare.nuclei untuk membedakan kelas benign dan malignant. Pohon yang dihasilkan memiliki cabang lebih sederhana dengan enam simpul terminal. Penyederhanaan ini memudahkan interpretasi aturan klasifikasi, sedangkan kinerja model tetap dievaluasi menggunakan data testing.
prediksi_pruned <- predict(
model_pruned,
newdata = data_test,
type = "class"
)
prediksi_pruned <- factor(
prediksi_pruned,
levels = levels(data_test$Class)
)
cm_pruned <- confusionMatrix(
data = prediksi_pruned,
reference = data_test$Class,
positive = "malignant"
)
cm_pruned## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 125 0
## malignant 12 72
##
## Accuracy : 0.9426
## 95% CI : (0.9019, 0.97)
## No Information Rate : 0.6555
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.8777
##
## Mcnemar's Test P-Value : 0.001496
##
## Sensitivity : 1.0000
## Specificity : 0.9124
## Pos Pred Value : 0.8571
## Neg Pred Value : 1.0000
## Prevalence : 0.3445
## Detection Rate : 0.3445
## Detection Prevalence : 0.4019
## Balanced Accuracy : 0.9562
##
## 'Positive' Class : malignant
##
Berdasarkan hasil evaluasi confusion matrix setelah pruning, model memperoleh nilai accuracy sebesar 94,26% dan Kappa sebesar 0,8777, yang menunjukkan tingkat kesesuaian klasifikasi yang sangat baik. Nilai sensitivity sebesar 100% menunjukkan bahwa seluruh data kelas malignant berhasil diidentifikasi dengan benar, sedangkan specificity sebesar 91,24% menunjukkan kemampuan model dalam mengidentifikasi kelas benign. Dengan demikian, model setelah pruning memiliki kemampuan deteksi kelas malignant yang sangat baik, meskipun masih terdapat beberapa data benign yang salah diklasifikasikan sebagai malignant.
prob_awal <- predict(
model_tree,
newdata = data_test,
type = "prob"
)
roc_awal <- pROC::roc(
response = data_test$Class,
predictor = prob_awal[, "malignant"],
levels = c("benign", "malignant"),
direction = "<",
quiet = TRUE
)
plot(
roc_awal,
col = "blue",
lwd = 2,
main = "Kurva ROC Sebelum Pruning"
)
abline(a = 0, b = 1, lty = 2, col = "gray")## AUC sebelum pruning = 0.9709
Kurva Receiver Operating Characteristic (ROC) sebelum pruning menunjukkan kemampuan model dalam membedakan kelas benign dan malignant pada berbagai nilai ambang klasifikasi. Nilai Area Under the Curve (AUC) sebesar 0,9709 menunjukkan bahwa model memiliki kemampuan diskriminasi yang sangat baik, ditunjukkan oleh kurva yang mendekati sudut kiri atas grafik.
prob_pruned <- predict(
model_pruned,
newdata = data_test,
type = "prob"
)
roc_pruned <- pROC::roc(
response = data_test$Class,
predictor = prob_pruned[, "malignant"],
levels = c("benign", "malignant"),
direction = "<",
quiet = TRUE
)
plot(
roc_pruned,
col = "red",
lwd = 2,
main = "Kurva ROC Setelah Pruning"
)
abline(a = 0, b = 1, lty = 2, col = "gray")auc_pruned <- as.numeric(pROC::auc(roc_pruned))
cat("AUC setelah pruning =", round(auc_pruned, 4), "\n")## AUC setelah pruning = 0.9523
Kurva Receiver Operating Characteristic (ROC) setelah pruning menunjukkan kemampuan model dalam membedakan kelas benign dan malignant pada berbagai nilai ambang klasifikasi. Nilai Area Under the Curve (AUC) sebesar 0,9523 menunjukkan bahwa model tetap memiliki kemampuan diskriminasi yang sangat baik setelah proses pruning, meskipun nilainya sedikit menurun dibandingkan model sebelum pruning yang memiliki AUC sebesar 0,9709.
hasil_perbandingan <- data.frame(
Model = c("Sebelum pruning", "Setelah pruning"),
Accuracy = c(
as.numeric(cm_awal$overall["Accuracy"]),
as.numeric(cm_pruned$overall["Accuracy"])
),
Sensitivity = c(
as.numeric(cm_awal$byClass["Sensitivity"]),
as.numeric(cm_pruned$byClass["Sensitivity"])
),
Specificity = c(
as.numeric(cm_awal$byClass["Specificity"]),
as.numeric(cm_pruned$byClass["Specificity"])
),
AUC = c(auc_awal, auc_pruned),
Jumlah_Simpul_Terminal = c(
sum(model_tree$frame$var == "<leaf>"),
sum(model_pruned$frame$var == "<leaf>")
)
)
kable(
hasil_perbandingan,
digits = 4,
row.names = FALSE,
caption = "Perbandingan performa sebelum dan setelah pruning"
)| Model | Accuracy | Sensitivity | Specificity | AUC | Jumlah_Simpul_Terminal |
|---|---|---|---|---|---|
| Sebelum pruning | 0.9474 | 0.9583 | 0.9416 | 0.9709 | 11 |
| Setelah pruning | 0.9426 | 1.0000 | 0.9124 | 0.9523 | 5 |
Berdasarkan tabel tersebut, model sebelum pruning memiliki accuracy (94,74%) dan AUC (0,9709) lebih tinggi dibandingkan model setelah pruning. Namun, model setelah pruning memiliki sensitivity sebesar 100% dan jumlah simpul terminal berkurang dari 11 menjadi 5. Dengan demikian, model setelah pruning lebih sederhana dan mampu mengidentifikasi seluruh kelas malignant dengan benar, meskipun accuracy, specificity, dan AUC sedikit menurun.
Pemodelan Decision Tree menggunakan metode CART merupakan salah satu metode klasifikasi yang membentuk aturan keputusan berdasarkan variabel prediktor untuk membedakan kelas benign dan malignant pada dataset kanker payudara.
Pemodelan Classification Tree dilakukan melalui tahapan penanganan missing value menggunakan MICE, pembagian data training dan testing, pembentukan pohon klasifikasi, serta analisis variable importance untuk mengetahui variabel yang berkontribusi dalam proses klasifikasi.
Evaluasi model menunjukkan bahwa model sebelum pruning menghasilkan accuracy sebesar 94,74% dan AUC sebesar 0,9709, sedangkan model setelah pruning menghasilkan sensitivity sebesar 100% dengan jumlah simpul terminal yang lebih sedikit. Dengan demikian, pruning dapat menyederhanakan struktur pohon dan meningkatkan kemampuan model dalam mendeteksi kelas malignant, meskipun nilai accuracy dan AUC sedikit menurun.
Mienye, I. D., & Jere, N. (2024). A survey of decision trees: Concepts, algorithms, and applications. IEEE Access, 12, 86716–86727. https://doi.org/10.1109/ACCESS.2024.3416838
Munir, A. S., Saputra, A. B., Aziz, A., & Barata, M. A. (2024). Perbandingan akurasi algoritma Naive Bayes dan algoritma Decision Tree dalam pengklasifikasian penyakit kanker payudara. Jurnal Ilmiah Informatika Global, 15(1), 23–29. https://doi.org/10.36982/jiig.v15i1.3578
Robbaniyyah, N. A., Asmawati, I., & Bahri, S. (2026). Breast cancer classification model using decision tree algorithm. Jurnal Matematika, Statistika dan Komputasi, 22(3), 617–626. https://doi.org/10.20956/j.v22i3.49472