BAB I PENDAHULUAN

1.1 Latar Belakang Masalah

Latar Belakang

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.

1.2 Rumusan Masalah

Berdasarkan latar belakang di atas, rumusan masalah yang dapat disimpulkan yaitu:

  1. Bagaimana konsep dasar Decision Tree untuk klasifikasi menggunakan metode CART (Classification and Regression Tree)?
  2. Bagaimana membangun model Classification Tree menggunakan algoritma CART di program RStudio?

1.3 Tujuan

Berdasarkan rumusan masalah di atas, tujuan yang dapat disimpulkan yaitu:

  1. Praktikan dapat menjelaskan konsep dasar Decision Tree untuk klasifikasi menggunakan metode CART (Classification and Regression Tree).
  2. Praktikan dapat membangun model Classification Tree menggunakan algoritma CART di program RStudio.

1.4 Manfaat Penelitian

Adapun manfaat dari praktikum ini yaitu:

  1. Bagi penulis, yaitu dapat memberikan informasi dan pengetahuan serta menerapkan ilmu pengetahuan mengenai metode Decision Tree (Classification Tree) dengan R.
  2. Bagi Pembaca, yaitu dapat menambah ilmu pengetahuan dan pemahaman mengenai metode Decision Tree (Classification Tree) dengan R.

1.5 Batasan Masalah

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!

BAB II TINJAUAN PUSTAKA

2.1 Decision Tree

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

2.2 Classification and Regression Tree (CART)

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):

  1. Entropy mengukur tingkat ketidakpastian atau ketidakmurnian kelas dalam suatu simpul. Semakin kecil nilai Entropy, semakin homogen simpul tersebut, dan bernilai 0 apabila seluruh amatan berasal dari satu kelas yang sama.

\[Entropy(t) = -\sum_{k=1}^{K} p_k \log_2(p_k)\]

  1. Information Gain mengukur besarnya penurunan Entropy setelah dilakukan suatu pemisahan. Semakin besar nilai Information Gain, semakin baik pemisahan yang dilakukan.

\[IG = E(D) - \sum_{j=1}^{J} \frac{|D_j|}{|D|} E(D_j)\]

  1. Gini Index mengukur tingkat ketidakmurnian kelas (Gini impurity) dalam suatu simpul. Semakin kecil nilai Gini Index, semakin homogen data dalam simpul tersebut.

\[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).

2.3 Missing Value dan Imputasi dengan mice

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.

2.4 Pruning dan Evaluasi Model

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.

BAB III METODE PENELITIAN

3.1 Sumber Data

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.

3.2 Variabel Penelitian

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).

3.3 Langkah-langkah Analisis

Berikut adalah langkah-langkah yang dilakukan dalam analisis:

  1. Membaca dan memeriksa dataset BreastCancer dari package mlbench.
  2. Memeriksa dan menangani missing value menggunakan mice.
  3. Membagi data menjadi data training dan testing.
  4. Membangun model Classification Tree menggunakan CART dan memvisualisasikan tree.
  5. Menganalisis variable importance.
  6. Melakukan prediksi pada data testing dan mengevaluasi model menggunakan confusion matrix.
  7. Menentukan nilai CP terbaik.
  8. Melakukan pruning pada tree berdasarkan CP terbaik.
  9. Mengevaluasi kembali model hasil pruning menggunakan confusion matrix, ROC, dan AUC.
  10. Menampilkan dan menginterpretasikan output dari setiap tahapan.

BAB IV HASIL DAN PEMBAHASAN

4.1 Hasil Pemeriksaan dan Penanganan Missing Value

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 ...
head(data)
##   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
dim(data)
## [1] 699  10
# Distribusi variabel respon
table(data$Class)
## 
##    benign malignant 
##       458       241
round(prop.table(table(data$Class)) * 100, 2)
## 
##    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
sum(!complete.cases(data))
## [1] 16
# Pola missing value
md.pattern(data, plot = FALSE)
##     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
sum(!complete.cases(data_complete))
## [1] 0
# Membandingkan ringkasan Bare.nuclei sebelum dan sesudah imputasi
summary(data$Bare.nuclei)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max.     NAs 
##   1.000   1.000   1.000   3.545   6.000  10.000      16
summary(data_complete$Bare.nuclei)
##    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.

4.2 Hasil Pembagian Data Training dan Testing

# 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
cat("Ukuran data training:", dim(BC.train), "\n")
## Ukuran data training: 490 10
cat("Ukuran data testing :", dim(BC.test), "\n")
## Ukuran data testing : 209 10
# Distribusi kelas pada data training
cat("\nDistribusi kelas training:\n")
## 
## Distribusi kelas training:
print(table(BC.train$Class))
## 
##    benign malignant 
##       321       169
print(round(prop.table(table(BC.train$Class)) * 100, 2))
## 
##    benign malignant 
##     65.51     34.49
# Distribusi kelas pada data testing
cat("\nDistribusi kelas testing:\n")
## 
## Distribusi kelas testing:
print(table(BC.test$Class))
## 
##    benign malignant 
##       137        72
print(round(prop.table(table(BC.test$Class)) * 100, 2))
## 
##    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.

4.3 Hasil Pembentukan dan Visualisasi Classification Tree

# 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) *
# Visualisasi tree
rpart.plot(fit.tree)

# 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.

4.4 Hasil Analisis Variable Importance

# Nilai variable importance
fit.tree$variable.importance
##       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.

4.5 Hasil Prediksi dan Evaluasi Model Sebelum Pruning

# 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.

4.6 Hasil Penentuan CP Terbaik

# Tabel CP dan hasil cross-validation
printcp(fit.tree)
## 
## 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
# CP dengan xerror terkecil
fit.tree$cptable[
  which.min(fit.tree$cptable[, "xerror"]),
  "CP"
]
## [1] 0.008
# Plot CP
plotcp(fit.tree, upper = "splits")

# 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).

4.7 Hasil Pruning

# Pruning berdasarkan CP terbaik
pruned.tree <- prune(fit.tree, cp = bestcp)

# Visualisasi tree hasil pruning
rpart.plot(pruned.tree)

# Variable importance setelah pruning
pruned.tree$variable.importance
##       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
cat("Jumlah leaf setelah pruning:", n_leaf_prune, "\n")
## 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.

4.8 Hasil Prediksi dan Evaluasi Model Setelah Pruning

# 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.

4.9 Hasil Evaluasi ROC dan AUC

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.

BAB V KESIMPULAN

5.1 Kesimpulan

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.

5.2 Saran

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.

DAFTAR PUSTAKA

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