Perkembangan teknologi informasi menghasilkan data dalam jumlah besar yang dapat dimanfaatkan untuk membantu pengambilan keputusan, termasuk di bidang kesehatan. Salah satu pemanfaatannya adalah klasifikasi, yaitu proses menentukan kelas atau kategori suatu pengamatan berdasarkan karakteristik yang dimilikinya. Dalam bidang kesehatan, klasifikasi dapat digunakan untuk membantu membedakan kondisi pasien, misalnya tumor jinak (benign) dan ganas (malignant) pada kasus kanker payudara. Kanker payudara sendiri termasuk jenis kanker dengan jumlah kasus yang tinggi dan menjadi salah satu penyebab kematian terbesar di dunia, sehingga deteksi dan klasifikasi yang akurat menjadi hal yang penting (Robbaniyyah dkk., 2026).
Salah satu metode supervised learning yang banyak digunakan untuk klasifikasi adalah Decision Tree. Metode ini membagi data secara bertahap berdasarkan variabel prediktor sehingga terbentuk kelompok data yang semakin homogen, dan hasilnya disajikan dalam bentuk pohon yang mudah divisualisasikan serta diinterpretasikan. Salah satu algoritma Decision Tree yang umum digunakan adalah Classification and Regression Tree (CART). Apabila variabel respon berupa kategori, CART membentuk pohon klasifikasi (Classification Tree), sedangkan apabila variabel respon berupa numerik kontinu, CART membentuk pohon regresi (Regression Tree).
Oleh karena itu, praktikum Decision Tree dilakukan untuk memahami konsep dasar Decision Tree dan menerapkan metode CART pada kasus klasifikasi menggunakan RStudio. Melalui praktikum ini, praktikan diharapkan mampu membangun model Classification Tree, menganalisis tingkat kepentingan variabel, melakukan prediksi, melakukan pruning, serta mengevaluasi kinerja model menggunakan confusion matrix, kurva ROC, dan nilai AUC.
Berdasarkan latar belakang di atas, rumusan masalah yang dapat disimpulkan yaitu:
Berdasarkan rumusan masalah di atas, tujuan yang dapat disimpulkan yaitu:
Adapun manfaat dari praktikum ini yaitu:
Adapun batasan masalah dari praktikum ini, yaitu gunakan dataset BreastCancer dari package mlbench untuk mengklasifikasikan kondisi kanker payudara menggunakan Decision Tree (Classification Tree). Lakukan pengecekan dan penanganan missing value menggunakan mice, kemudian bagi data menjadi training dan testing. Selanjutnya, bangun dan visualisasikan tree, analisis variable importance, lakukan prediksi dan evaluasi menggunakan confusion matrix, tentukan CP terbaik, lakukan pruning, dan evaluasi kembali model menggunakan confusion matrix, ROC, dan AUC. Tampilkan dan interpretasikan setiap output!
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 (Fransiska, 2026).
Penelitian terdahulu menunjukkan bahwa Decision Tree telah banyak dimanfaatkan untuk klasifikasi dan prediksi penyakit kanker payudara. Mellina dkk. (2024) menerapkan algoritma Decision Tree ID3 dan C5.0 untuk memprediksi deteksi penyakit kanker payudara dan memperoleh hasil bahwa algoritma C5.0 memberikan hasil klasifikasi terbaik dibandingkan ID3 dengan akurasi sebesar 80%. Hal ini menunjukkan bahwa Decision Tree dapat digunakan sebagai salah satu pendekatan untuk membantu proses klasifikasi pada data medis.
Menurut Fransiska (2026), Decision Tree memiliki beberapa karakteristik, yaitu mudah dipahami dan diinterpretasikan karena dapat divisualisasikan dalam bentuk pohon, dapat menggunakan variabel prediktor numerik maupun kategorik, membagi data secara bertahap sehingga kelompok yang terbentuk semakin homogen, dapat digunakan untuk klasifikasi maupun regresi, serta dapat disederhanakan melalui pruning untuk mengurangi kompleksitas pohon dan risiko overfitting. Komponen utama dalam Decision Tree adalah sebagai berikut (Fransiska, 2026):
| Komponen | Keterangan |
|---|---|
| Root node | Simpul awal atau simpul paling atas yang memuat seluruh data sebelum dilakukan pemisahan |
| Intermediate node | Simpul di antara root node dan leaf node yang masih dapat mengalami pemisahan |
| Leaf node | Simpul akhir yang menunjukkan hasil prediksi, berupa kelas pada klasifikasi dan nilai numerik pada regresi |
| Branch | Cabang yang menghubungkan satu simpul dengan simpul lainnya berdasarkan aturan tertentu |
| Attribute | Variabel prediktor yang digunakan sebagai dasar untuk melakukan pemisahan data |
| Splitting criteria | Kriteria yang digunakan untuk menentukan pemisahan terbaik, yaitu Gini Index atau Entropy pada klasifikasi dan ukuran kesalahan seperti MSE pada regresi |
| Decision rules | Aturan keputusan yang terbentuk dari jalur percabangan dan digunakan untuk menghasilkan prediksi |
| Pruning | Proses pemangkasan cabang yang kurang penting untuk menyederhanakan pohon dan mengurangi risiko overfitting |
Classification and Regression Tree (CART) dapat digunakan untuk dua jenis pemodelan, yaitu klasifikasi untuk memprediksi kategori atau kelas, dan regresi untuk memprediksi nilai numerik. Jika variabel respon berupa kategori, pohon yang terbentuk disebut pohon klasifikasi (Classification Tree), sedangkan jika variabel respon berupa numerik kontinu disebut pohon regresi (Regression Tree) (Fransiska, 2026).
Pada Classification Tree, proses pemisahan data dilakukan dengan memilih aturan yang mampu menghasilkan simpul-simpul yang semakin homogen. Ukuran yang digunakan dalam proses pemisahan tersebut antara lain Entropy, Information Gain, dan Gini Index (Fransiska, 2026):
\[Entropy(t) = -\sum_{k=1}^{K} p_k \log_2(p_k)\]
\[IG = E(D) - \sum_{j=1}^{J} \frac{|D_j|}{|D|} E(D_j)\]
\[Gini(t) = 1 - \sum_{k=1}^{K} p_k^2\]
Pada penelitian Robbaniyyah dkk. (2026), algoritma CART diterapkan pada model klasifikasi kanker payudara berdasarkan data rekam medis pasien. Model yang dibangun dievaluasi menggunakan confusion matrix dan menghasilkan akurasi sebesar 94,74%, spesifisitas sebesar 95,77%, serta recall, precision, dan F1-Score masing-masing sebesar 93,02%, sehingga CART dinilai dapat diterapkan dengan baik pada model klasifikasi.
Algoritma CART dilakukan melalui tahapan mencari pemisahan terbaik dari setiap variabel prediktor, menentukan variabel dan pemisah terbaik, kemudian melakukan pemisahan serta memeriksa apakah proses perlu dilanjutkan. Tahapan tersebut dilakukan berulang pada setiap simpul yang terbentuk dan berhenti apabila simpul sudah cukup homogen, nilai variabel prediktor tidak memungkinkan pemisahan lebih lanjut, jumlah amatan dalam simpul lebih kecil dari batas minimum, atau kedalaman pohon telah mencapai batas maksimum (Fransiska, 2026).
Missing value adalah kondisi ketika terdapat data yang tidak tersedia pada suatu observasi. Salah satu pendekatan penanganannya adalah imputasi berganda (multiple imputation) menggunakan paket mice (Multivariate Imputation by Chained Equations). Paket ini mengisi nilai yang hilang secara berulang dengan memanfaatkan hubungan antarvariabel dalam data. Salah satu metode yang tersedia adalah Predictive Mean Matching (PMM), yaitu mengisi nilai yang hilang dengan nilai teramati dari observasi lain yang memiliki prediksi paling dekat, sehingga nilai imputasi tetap berada dalam rentang nilai yang sebenarnya muncul pada data.
Pruning merupakan proses pemangkasan cabang yang kurang penting untuk menyederhanakan pohon dan mengurangi risiko overfitting. Pada paket rpart, kompleksitas pohon dikendalikan oleh parameter complexity parameter (CP). Nilai CP terbaik umumnya dipilih berdasarkan nilai cross-validation error (xerror) terkecil pada tabel CP (Fransiska, 2026).
Evaluasi Classification Tree dilakukan dengan membandingkan kelas aktual dan kelas hasil prediksi yang disajikan dalam confusion matrix (Fransiska, 2026):
| Predicted Positive | Predicted Negative | |
|---|---|---|
| Actual Positive | True Positive (TP) | False Negative (FN) |
| Actual Negative | False Positive (FP) | True Negative (TN) |
Berdasarkan confusion matrix, ukuran evaluasi yang dapat digunakan adalah:
\[Accuracy = \frac{TP+TN}{TP+TN+FP+FN} \qquad Precision = \frac{TP}{TP+FP}\]
\[Recall = \frac{TP}{TP+FN} \qquad Specificity = \frac{TN}{TN+FP}\]
\[F1\text{-}Score = 2\left(\frac{Precision \times Recall}{Precision + Recall}\right)\]
Selain itu, kemampuan model dalam membedakan kelas pada berbagai nilai ambang (threshold) dapat dinilai melalui kurva ROC (Receiver Operating Characteristic) dan nilai AUC (Area Under the Curve). Semakin mendekati 1 nilai AUC, semakin baik kemampuan model dalam membedakan kedua kelas.
Jenis data yang digunakan pada penelitian ini adalah data kategorik dan numerik. Data yang digunakan merupakan dataset BreastCancer yang tersedia pada package mlbench di R. Data ini merupakan data sekunder yang berisi hasil pengamatan karakteristik sel dari biopsi payudara dan berjumlah 699 observasi.
Penelitian ini menggunakan sepuluh variabel, yaitu satu variabel respon dan sembilan variabel prediktor. Variabel Id (nomor identitas sampel) tidak digunakan dalam pemodelan karena hanya berfungsi sebagai penanda observasi. Variabel respon adalah Class yang menunjukkan kondisi kanker payudara, yaitu benign (jinak) dan malignant (ganas). Variabel prediktor berupa skor 1 sampai 10 dari karakteristik sel, yaitu Cl.thickness (ketebalan gumpalan sel), Cell.size (keseragaman ukuran sel), Cell.shape (keseragaman bentuk sel), Marg.adhesion (adhesi marginal), Epith.c.size (ukuran sel epitel tunggal), Bare.nuclei (inti sel telanjang), Bl.cromatin (kromatin halus), Normal.nucleoli (nukleolus normal), dan Mitoses (mitosis).
Berikut adalah langkah-langkah yang dilakukan dalam analisis:
library(mlbench)
library(mice)
library(dplyr)
library(tidyverse)
library(rpart)
library(caret)
library(rpart.plot)
library(ggplot2)
# Memanggil dataset BreastCancer
data(BreastCancer)
data <- BreastCancer
# Menghapus variabel Id karena hanya penanda observasi
data$Id <- NULL
# Mengubah prediktor (faktor berurutan skor 1-10) menjadi numerik
data[, 1:9] <- lapply(
data[, 1:9],
function(x) as.numeric(as.character(x))
)
# Memeriksa struktur dan ukuran data
str(data)## 'data.frame': 699 obs. of 10 variables:
## $ Cl.thickness : num 5 5 3 6 4 8 1 2 2 4 ...
## $ Cell.size : num 1 4 1 8 1 10 1 1 1 2 ...
## $ Cell.shape : num 1 4 1 8 1 10 1 2 1 1 ...
## $ Marg.adhesion : num 1 5 1 1 3 8 1 1 1 1 ...
## $ Epith.c.size : num 2 7 2 3 2 7 2 2 2 2 ...
## $ Bare.nuclei : num 1 10 2 4 1 10 10 1 1 1 ...
## $ Bl.cromatin : num 3 3 3 3 3 9 3 3 1 2 ...
## $ Normal.nucleoli: num 1 2 1 7 1 7 1 1 1 1 ...
## $ Mitoses : num 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 ...
## Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size Bare.nuclei
## 1 5 1 1 1 2 1
## 2 5 4 4 5 7 10
## 3 3 1 1 1 2 2
## 4 6 8 8 1 3 4
## 5 4 1 1 3 2 1
## 6 8 10 10 8 7 10
## Bl.cromatin Normal.nucleoli Mitoses Class
## 1 3 1 1 benign
## 2 3 2 1 benign
## 3 3 1 1 benign
## 4 3 7 1 benign
## 5 3 1 1 benign
## 6 9 7 1 malignant
## [1] 699 10
##
## benign malignant
## 458 241
##
## benign malignant
## 65.52 34.48
# Memeriksa missing value
missing_value <- data.frame(
Variabel = names(data),
Jumlah_NA = sapply(data, function(x) sum(is.na(x))),
Persentase_NA = round(
sapply(data, function(x) mean(is.na(x))) * 100, 2
)
)
missing_value## Variabel Jumlah_NA Persentase_NA
## 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
## [1] 16
## Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size Bl.cromatin
## 683 1 1 1 1 1 1
## 16 1 1 1 1 1 1
## 0 0 0 0 0 0
## Normal.nucleoli Mitoses Class Bare.nuclei
## 683 1 1 1 1 0
## 16 1 1 1 0 1
## 0 0 0 16 16
Berdasarkan hasil pemeriksaan dataset, data BreastCancer
terdiri atas 699 observasi dan 10 variabel setelah variabel Id
dihapus, yaitu sembilan variabel prediktor dan satu variabel respon
Class. Variabel respon terdiri dari kelas benign
sebanyak 458 observasi (65.52%) dan kelas malignant sebanyak
241 observasi (34.48%). Pemeriksaan missing value menunjukkan
bahwa terdapat 16 observasi yang tidak lengkap, yang seluruhnya berasal
dari variabel Bare.nuclei dengan jumlah missing value
sebanyak 16 data (2.29%). Pola missing value pada tabel
md.pattern menunjukkan bahwa nilai yang hilang hanya
terdapat pada satu variabel tersebut. Karena proporsinya relatif kecil,
data yang hilang dapat diimputasi sehingga seluruh observasi tetap dapat
digunakan.
# Imputasi missing value menggunakan mice (metode PMM)
set.seed(123)
imp <- mice(
data,
m = 5,
maxit = 5,
method = "pmm",
printFlag = FALSE
)
# Mengambil dataset lengkap (imputasi ke-1)
data_complete <- complete(imp, 1)
# Memeriksa missing value setelah imputasi
sapply(data_complete, function(x) sum(is.na(x)))## Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size
## 0 0 0 0 0
## Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses Class
## 0 0 0 0 0
## [1] 0
## Min. 1st Qu. Median Mean 3rd Qu. Max. NAs
## 1.000 1.000 1.000 3.545 6.000 10.000 16
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 1.000 1.000 1.000 3.514 5.500 10.000
Penanganan missing value dilakukan menggunakan mice dengan metode Predictive Mean Matching (PMM) sebanyak lima kali imputasi (m = 5) dan lima iterasi (maxit = 5). Pada tahap ini, prediktor yang berupa skor 1 sampai 10 diperlakukan sebagai data numerik agar PMM dapat bekerja dengan baik, dan urutan skor tetap dipertahankan sehingga pemisahan pada tree tidak berubah secara makna. Hasil imputasi ke-1 digunakan sebagai data lengkap. Setelah imputasi, jumlah missing value menjadi 0, sehingga seluruh 699 observasi dapat digunakan. Ringkasan statistik Bare.nuclei sebelum dan sesudah imputasi relatif mirip, yang menunjukkan bahwa imputasi tidak banyak mengubah sebaran data aslinya.
# Membagi data dengan proporsi 70:30 (stratified berdasarkan Class)
set.seed(234)
train <- createDataPartition(
as.factor(data_complete$Class),
p = 0.7,
list = FALSE
)
BC.train <- data_complete[train, ]
BC.test <- data_complete[-train, ]
Class.test <- data_complete$Class[-train]
# Ukuran data
cat("Ukuran data awal :", dim(data_complete), "\n")## Ukuran data awal : 699 10
## Ukuran data training: 490 10
## Ukuran data testing : 209 10
##
## Distribusi kelas training:
##
## benign malignant
## 321 169
##
## benign malignant
## 65.51 34.49
##
## Distribusi kelas testing:
##
## benign malignant
## 137 72
##
## benign malignant
## 65.55 34.45
Pembagian data dilakukan menggunakan fungsi
createDataPartition() dari paket caret dengan
proporsi 70% data training dan 30% data testing.
Fungsi ini membagi data dengan mempertimbangkan distribusi kelas pada
variabel Class, sehingga proporsi kelas pada kedua bagian data
relatif mendekati proporsi pada data awal. Berdasarkan hasil pembagian,
data awal yang terdiri atas 699 observasi dibagi menjadi 490 observasi
pada data training dan 209 observasi pada data
testing. Proporsi kelas malignant pada data
training sebesar 34.49% dan pada data testing sebesar
34.45%. Data training digunakan untuk membangun model,
sedangkan data testing digunakan untuk mengevaluasi kemampuan
model pada data yang tidak digunakan saat pelatihan.
# Classification Tree dengan CART
set.seed(234)
fit.tree <- rpart(
Class ~ .,
data = BC.train,
method = "class",
cp = 0.008
)
fit.tree## n= 490
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 490 169 benign (0.65510204 0.34489796)
## 2) Cell.size< 2.5 309 11 benign (0.96440129 0.03559871)
## 4) Bare.nuclei< 5.5 302 5 benign (0.98344371 0.01655629) *
## 5) Bare.nuclei>=5.5 7 1 malignant (0.14285714 0.85714286) *
## 3) Cell.size>=2.5 181 23 malignant (0.12707182 0.87292818)
## 6) Bare.nuclei< 2.5 33 16 benign (0.51515152 0.48484848)
## 12) Cell.size< 3.5 16 1 benign (0.93750000 0.06250000) *
## 13) Cell.size>=3.5 17 2 malignant (0.11764706 0.88235294) *
## 7) Bare.nuclei>=2.5 148 6 malignant (0.04054054 0.95945946) *
# Jumlah simpul akhir (leaf) pada tree awal
n_leaf_awal <- sum(fit.tree$frame$var == "<leaf>")
n_leaf_awal## [1] 5
Model Classification Tree dibangun menggunakan fungsi
rpart() dengan method = "class" dan nilai
cp = 0.008, dengan Class sebagai variabel respon
dan seluruh variabel lainnya sebagai prediktor. Berdasarkan hasil,
tree yang terbentuk memiliki 5 simpul akhir. Pada visualisasi,
simpul paling atas (root node) memuat seluruh data
training, kemudian dipecah berdasarkan variabel yang
menghasilkan simpul paling homogen. Variabel yang digunakan pada
pemisahan pertama adalah variabel yang paling mampu membedakan kelas
benign dan malignant. Setiap simpul pada gambar
menampilkan kelas prediksi, proporsi masing-masing kelas, dan persentase
observasi pada simpul tersebut, sedangkan jalur dari root node
menuju leaf node membentuk aturan keputusan (decision
rules) untuk menentukan kelas suatu pengamatan.
## Cell.size Cell.shape Bare.nuclei Bl.cromatin Epith.c.size
## 171.133402 137.339629 131.473985 123.383044 119.035887
## Normal.nucleoli Marg.adhesion Cl.thickness
## 113.922007 6.925273 4.143474
# Visualisasi variable importance
fit.tree$variable.importance %>%
data.frame() %>%
rownames_to_column(var = "Feature") %>%
rename(Overall = '.') %>%
ggplot(
aes(
x = fct_reorder(Feature, Overall),
y = Overall)) +
geom_pointrange(
aes(
ymin = 0,
ymax = Overall),
color = "cadetblue",
size = .3) +
theme_minimal() +
coord_flip() +
labs(
x = "",
y = "",
title = "Variable Importance with Simple Classification")Variable importance menunjukkan seberapa besar kontribusi setiap variabel prediktor dalam mengurangi ketidakmurnian simpul pada pembentukan tree. Berdasarkan hasil, tiga variabel dengan nilai kepentingan tertinggi adalah Cell.size, Cell.shape, Bare.nuclei. Variabel Cell.size memiliki nilai kepentingan terbesar yaitu 171.13, sehingga variabel ini paling berpengaruh dalam membedakan kelas benign dan malignant. Semakin ke kanan posisi titik pada grafik, semakin besar kontribusi variabel tersebut dalam model, sedangkan variabel dengan nilai kecil memberikan kontribusi yang relatif sedikit terhadap klasifikasi.
# Prediksi pada data testing
pred.tree <- predict(
fit.tree,
BC.test,
type = "class"
)
# Tabel prediksi dan kelas aktual
table(pred.tree, Class.test)## Class.test
## pred.tree benign malignant
## benign 126 0
## malignant 11 72
# Confusion matrix (kelas positif: malignant)
matriks_kesalahan <- confusionMatrix(
pred.tree,
BC.test$Class,
positive = "malignant"
)
matriks_kesalahan## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 126 0
## malignant 11 72
##
## Accuracy : 0.9474
## 95% CI : (0.9078, 0.9734)
## No Information Rate : 0.6555
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.8875
##
## Mcnemar's Test P-Value : 0.002569
##
## Sensitivity : 1.0000
## Specificity : 0.9197
## Pos Pred Value : 0.8675
## Neg Pred Value : 1.0000
## Prevalence : 0.3445
## Detection Rate : 0.3445
## Detection Prevalence : 0.3971
## Balanced Accuracy : 0.9599
##
## 'Positive' Class : malignant
##
# Menyimpan ukuran evaluasi model sebelum pruning
eval_sebelum <- c(
Accuracy = unname(matriks_kesalahan$overall["Accuracy"]),
Sensitivity = unname(matriks_kesalahan$byClass["Sensitivity"]),
Specificity = unname(matriks_kesalahan$byClass["Specificity"]),
Precision = unname(matriks_kesalahan$byClass["Pos Pred Value"]),
F1 = unname(matriks_kesalahan$byClass["F1"])
)
round(eval_sebelum, 4)## Accuracy Sensitivity Specificity Precision F1
## 0.9474 1.0000 0.9197 0.8675 0.9290
Prediksi dilakukan pada 209 data testing menggunakan tree yang telah dibangun. Pada tabel prediksi, diagonal menunjukkan observasi yang diklasifikasikan dengan benar, yaitu 126 observasi benign dan 72 observasi malignant, sedangkan di luar diagonal menunjukkan kesalahan klasifikasi, yaitu 11 observasi benign yang diprediksi malignant (False Positive) dan 0 observasi malignant yang diprediksi benign (False Negative). Dengan kelas malignant sebagai kelas positif, diperoleh nilai accuracy sebesar 94.74%, sensitivity (recall) sebesar 100%, specificity sebesar 91.97%, precision sebesar 86.75%, dan F1-Score sebesar 92.9%. Pada kasus kanker, nilai sensitivity perlu mendapat perhatian khusus karena False Negative berarti kasus ganas yang tidak terdeteksi.
##
## Classification tree:
## rpart(formula = Class ~ ., data = BC.train, method = "class",
## cp = 0.008)
##
## Variables actually used in tree construction:
## [1] Bare.nuclei Cell.size
##
## Root node error: 169/490 = 0.3449
##
## n= 490
##
## CP nsplit rel error xerror xstd
## 1 0.798817 0 1.000000 1.00000 0.062260
## 2 0.041420 1 0.201183 0.24852 0.036667
## 3 0.029586 3 0.118343 0.20118 0.033284
## 4 0.008000 4 0.088757 0.15385 0.029360
## [1] 0.008
# Menyimpan CP terbaik
bestcp <- fit.tree$cptable[
which.min(fit.tree$cptable[, "xerror"]), "CP"]
bestcp## [1] 0.008
Tabel CP menyajikan nilai complexity parameter, jumlah pemisahan (nsplit), relative error, cross-validation error (xerror), dan xstd pada setiap ukuran tree. Pemilihan CP terbaik dilakukan dengan memilih nilai CP yang menghasilkan xerror paling kecil. Berdasarkan hasil, CP terbaik adalah 0.008 dengan nilai xerror terkecil sebesar 0.1538. Pada grafik CP, titik terendah menunjukkan ukuran tree dengan kesalahan validasi silang paling kecil, sehingga tree pada titik tersebut dinilai paling optimal karena tidak terlalu sederhana (underfitting) maupun terlalu kompleks (overfitting).
# Pruning berdasarkan CP terbaik
pruned.tree <- prune(fit.tree, cp = bestcp)
# Visualisasi tree hasil pruning
rpart.plot(pruned.tree)## Cell.size Cell.shape Bare.nuclei Bl.cromatin Epith.c.size
## 171.133402 137.339629 131.473985 123.383044 119.035887
## Normal.nucleoli Marg.adhesion Cl.thickness
## 113.922007 6.925273 4.143474
# Jumlah simpul akhir (leaf) setelah pruning
n_leaf_prune <- sum(pruned.tree$frame$var == "<leaf>")
cat("Jumlah leaf sebelum pruning:", n_leaf_awal, "\n")## Jumlah leaf sebelum pruning: 5
## Jumlah leaf setelah pruning: 5
Pruning dilakukan menggunakan fungsi prune()
dengan nilai CP terbaik yang telah diperoleh. Berdasarkan hasil, jumlah
simpul akhir berubah dari 5 pada tree awal menjadi 5 pada
tree hasil pruning. Hal ini menunjukkan bahwa
tree awal sudah berada pada kompleksitas yang optimal menurut
cross-validation error, sehingga tidak ada cabang yang perlu
dipangkas. Variabel yang paling berpengaruh pada tree hasil
pruning adalah Cell.size.
# Prediksi menggunakan tree hasil pruning
pred.prune <- predict(
pruned.tree,
BC.test,
type = "class"
)
table(pred.prune, Class.test)## Class.test
## pred.prune benign malignant
## benign 126 0
## malignant 11 72
# Confusion matrix setelah pruning
matriks_kesalahan_prune <- confusionMatrix(
pred.prune,
BC.test$Class,
positive = "malignant"
)
matriks_kesalahan_prune## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 126 0
## malignant 11 72
##
## Accuracy : 0.9474
## 95% CI : (0.9078, 0.9734)
## No Information Rate : 0.6555
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.8875
##
## Mcnemar's Test P-Value : 0.002569
##
## Sensitivity : 1.0000
## Specificity : 0.9197
## Pos Pred Value : 0.8675
## Neg Pred Value : 1.0000
## Prevalence : 0.3445
## Detection Rate : 0.3445
## Detection Prevalence : 0.3971
## Balanced Accuracy : 0.9599
##
## 'Positive' Class : malignant
##
# Menyimpan ukuran evaluasi model setelah pruning
eval_sesudah <- c(
Accuracy = unname(matriks_kesalahan_prune$overall["Accuracy"]),
Sensitivity = unname(matriks_kesalahan_prune$byClass["Sensitivity"]),
Specificity = unname(matriks_kesalahan_prune$byClass["Specificity"]),
Precision = unname(matriks_kesalahan_prune$byClass["Pos Pred Value"]),
F1 = unname(matriks_kesalahan_prune$byClass["F1"])
)
# Perbandingan sebelum dan sesudah pruning
perbandingan <- data.frame(
Ukuran = names(eval_sebelum),
Sebelum_Pruning = round(eval_sebelum, 4),
Sesudah_Pruning = round(eval_sesudah, 4),
row.names = NULL
)
perbandingan## Ukuran Sebelum_Pruning Sesudah_Pruning
## 1 Accuracy 0.9474 0.9474
## 2 Sensitivity 1.0000 1.0000
## 3 Specificity 0.9197 0.9197
## 4 Precision 0.8675 0.8675
## 5 F1 0.9290 0.9290
Setelah pruning, model kembali digunakan untuk memprediksi data testing. Berdasarkan confusion matrix, model hasil pruning mengklasifikasikan dengan benar 126 observasi benign dan 72 observasi malignant, dengan 11 False Positive dan 0 False Negative. Nilai accuracy model hasil pruning sebesar 94.74% dibandingkan 94.74% sebelum pruning, sensitivity sebesar 100% dibandingkan 100%, specificity sebesar 91.97% dibandingkan 91.97%, serta F1-Score sebesar 92.9% dibandingkan 92.9%. Akurasi yang sama menunjukkan bahwa penyederhanaan tree tidak menurunkan kinerja model, sehingga model yang lebih sederhana lebih diutamakan karena lebih mudah diinterpretasikan.
library(yardstick)
# Probabilitas dan kelas prediksi pada data testing
carseat_preds_cart <- bind_cols(
as.data.frame(
predict(
pruned.tree,
newdata = BC.test,
type = "prob")),
predicted = predict(
pruned.tree,
newdata = BC.test,
type = "class"),
actual = BC.test$Class)
head(carseat_preds_cart)## benign malignant predicted actual
## 5 0.98344371 0.01655629 benign benign
## 7 0.14285714 0.85714286 malignant benign
## 9 0.98344371 0.01655629 benign benign
## 12 0.98344371 0.01655629 benign benign
## 19 0.04054054 0.95945946 malignant malignant
## 27 0.98344371 0.01655629 benign benign
# Confusion matrix dari hasil prediksi
carseat_cm_cart <- confusionMatrix(
carseat_preds_cart$predicted,
reference = carseat_preds_cart$actual,
positive = "malignant")
carseat_cm_cart## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 126 0
## malignant 11 72
##
## Accuracy : 0.9474
## 95% CI : (0.9078, 0.9734)
## No Information Rate : 0.6555
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 0.8875
##
## Mcnemar's Test P-Value : 0.002569
##
## Sensitivity : 1.0000
## Specificity : 0.9197
## Pos Pred Value : 0.8675
## Neg Pred Value : 1.0000
## Prevalence : 0.3445
## Detection Rate : 0.3445
## Detection Prevalence : 0.3971
## Balanced Accuracy : 0.9599
##
## 'Positive' Class : malignant
##
# Menghitung AUC (kelas positif: malignant)
mdl_auc <- Metrics::auc(
actual = carseat_preds_cart$actual == "malignant",
carseat_preds_cart$malignant)
mdl_auc## [1] 0.9665957
# Kurva ROC
yardstick::roc_curve(
carseat_preds_cart,
actual,
malignant,
event_level = "second"
) %>%
autoplot() +
labs(
title = "ROC Curve",
subtitle = paste0(
"AUC = ",
round(mdl_auc, 4)))Kurva ROC menggambarkan hubungan antara sensitivity (True Positive Rate) dan 1 − specificity (False Positive Rate) pada berbagai nilai ambang probabilitas, dengan kelas malignant sebagai kelas positif. Berdasarkan hasil, nilai AUC model hasil pruning sebesar 0.9666. Nilai tersebut berada pada kategori sangat baik karena mendekati 1, sehingga model memiliki kemampuan yang sangat baik dalam membedakan kelas benign dan malignant. Semakin dekat kurva ROC ke sudut kiri atas grafik dan semakin jauh dari garis diagonal, semakin baik kinerja model dalam mengklasifikasikan kedua kelas.
Decision Tree merupakan metode supervised learning berbasis pohon yang digunakan untuk klasifikasi melalui proses pemisahan data berdasarkan variabel prediktor hingga terbentuk kelompok yang semakin homogen. Pada algoritma CART (Classification and Regression Tree), klasifikasi dilakukan dengan membentuk pohon keputusan berdasarkan kriteria pemisahan tertentu sehingga menghasilkan aturan untuk menentukan kelas suatu pengamatan. Metode ini memiliki keunggulan berupa struktur pohon yang mudah divisualisasikan dan diinterpretasikan, serta dapat disederhanakan melalui proses pruning untuk mengurangi kompleksitas model.
Pembangunan model Classification Tree menggunakan algoritma CART di RStudio dilakukan melalui tahapan pemeriksaan dan penanganan missing value, pembagian data training dan testing, pembentukan pohon klasifikasi, analisis variable importance, serta evaluasi model. Penentuan complexity parameter (CP) terbaik dilakukan berdasarkan nilai cross-validation error terkecil, sedangkan evaluasi model dilakukan menggunakan confusion matrix, kurva ROC, dan nilai AUC. Penerapan tahapan tersebut memungkinkan praktikan membangun model klasifikasi, mengidentifikasi variabel yang berkontribusi terhadap prediksi, serta mengevaluasi kinerja model sebelum dan sesudah pruning.
Berdasarkan hasil praktikum pada dataset BreastCancer yang terdiri atas 699 observasi, sebanyak 16 missing value pada variabel Bare.nuclei berhasil ditangani menggunakan metode PMM melalui paket mice, kemudian data dibagi menjadi 490 observasi training dan 209 observasi testing. Model CART menghasilkan lima simpul akhir dengan variabel Cell.size sebagai variabel yang memiliki tingkat kepentingan tertinggi sebesar 171.13, serta diperoleh CP terbaik sebesar 0.008. Evaluasi model sebelum dan sesudah pruning menghasilkan nilai yang sama, yaitu accuracy sebesar 94.74%, sensitivity sebesar 100%, specificity sebesar 91.97%, precision sebesar 86.75%, dan F1-Score sebesar 92.90%, sedangkan nilai AUC sebesar 0.9666 menunjukkan kemampuan diskriminasi yang sangat baik dalam membedakan kelas benign dan malignant. Hasil tersebut menunjukkan bahwa model CART yang dibangun mampu mengklasifikasikan kondisi kanker payudara dengan baik pada data testing, dan proses pruning tidak mengubah struktur pohon maupun kinerja evaluasinya.
Praktikan diharapkan dapat mempelajari lebih lanjut konsep Decision Tree serta memahami pengaruh parameter seperti CP, kedalaman pohon, dan jumlah minimum amatan pada setiap simpul terhadap bentuk tree dan kinerja model. Pada data medis seperti kanker payudara, evaluasi sebaiknya tidak hanya berfokus pada accuracy, tetapi juga pada sensitivity agar kasus ganas tidak terlewat. Praktikan juga disarankan untuk mencoba metode lain, seperti Random Forest atau Bagging, serta menggunakan dataset lain agar lebih memahami penerapan Decision Tree melalui RStudio.
Fransiska, H. (2026). Modul Praktikum Machine Learning dan Model Prediction. Universitas Bengkulu: Bengkulu.
Mellina, A. D. F., Suhartono, S., & Yaqin, M. A. (2024). Prediksi deteksi penyakit kanker payudara dengan menggunakan algoritma decision tree. JISKA (Jurnal Informatika Sunan Kalijaga), 9(1).
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