BAB I PENDAHULUAN

1.1 Latar Belakang Masalah

Perkembangan teknologi informasi menyebabkan data yang dihasilkan di berbagai bidang bertambah sangat cepat, sehingga dibutuhkan teknik analisis yang dapat mengubah data menjadi informasi yang berguna. Salah satu teknik yang banyak dipakai adalah klasifikasi, yaitu pengelompokan objek ke dalam kelas tertentu berdasarkan karakteristik variabel-variabel penjelasnya. Di antara berbagai metode klasifikasi, pohon keputusan (decision tree) populer karena hasilnya berupa aturan if-then yang mudah dipahami dan diinterpretasikan. Dua algoritma pohon keputusan yang sering diterapkan dalam permasalahan klasifikasi adalah Classification and Regression Tree (CART) dan C4.5 (Fatika dkk., 2022).

Classification and Regression Tree (CART) adalah metode pohon keputusan nonparametrik yang membentuk pohon biner melalui pemisahan data secara rekursif. Hasilnya berupa pohon klasifikasi jika variabel responsnya kategorik, dan pohon regresi jika variabel responsnya kontinu. Dalam praktiknya, CART telah diterapkan pada berbagai kasus. Nabila dkk. (2022) menggunakannya untuk mengklasifikasikan status bekerja dan pengangguran di Kabupaten Subang. Penelitian tersebut menghasilkan pohon klasifikasi optimal dengan 17 simpul terminal dan 6 peubah penjelas, serta menunjukkan bahwa ketidakseimbangan data dapat menurunkan akurasi pohon. Pada bidang lain, Hutapea dan Harani (2025) menerapkan CART untuk mengklasifikasikan tindakan korektif iregularitas pada perusahaan logistik dan memperoleh akurasi 90%. Kedua penelitian ini menunjukkan bahwa CART dapat diterapkan pada berbagai jenis data, tetapi kualitas hasilnya dipengaruhi oleh karakteristik data dan proses pembentukan pohon.

Berdasarkan uraian tersebut, pemahaman yang baik mengenai konsep dasar decision tree dan cara kerja algoritma CART sangat diperlukan sebelum algoritma ini diterapkan. Pemahaman tersebut mencakup proses pemilihan pemisah terbaik pada setiap simpul, penentuan simpul terminal, hingga pemangkasan pohon (pruning) untuk menghindari overfitting. Oleh karena itu, penelitian ini bertujuan menjelaskan konsep dasar Decision Tree untuk klasifikasi menggunakan metode CART dan membangun model Classification Tree dengan algoritma CART.

1.2 Rumusan Masalah

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

1.3 Tujuan

1.Menjelaskan konsep dasar Decision Tree untuk klasifikasi menggunakan metode CART (Classification and Regression Tree). 2. Membangun model Classification Tree menggunakan algoritma CART.

BAB II TINJAUAN PUSTAKA

2.1 Decision Tree

Decision Tree merupakan salah satu algoritma pada pengolahan data metode klasifikasi. Algoritma machine learning yang satu ini mempresentasikan strukturnya seperti struktur pohon untuk menemukan hasil keputusan. Konsep dari Decision Tree ini adalah dengan menyajikan pernyataan-pernyataan bersyarat pada setiap langkah yang bercabang untuk pengambilan keputusan berdasarkan perhitungan dari dataset itu sendiri. Dalam metode Klasifikasi, algoritma Decision Tree merupakan yang paling banyak digunakan (Biyantoro dan Prasetyo, 2024)

Decision Tree memiliki beberapa karakteristik, yaitu (Fransiska, 2026): 1. Mudah dipahami dan diinterpretasikan karena model dapat divisualisasikaan dalam bentuk pohon. 2. Dapat menggunakan variabel prediktor numerik maupun kategorik. 3. Membagi data secara bertahap melalui proses splitting sehingga kelompok yang tebentuk semakin homogan. 4. Dapat digunakan untuk memprediksi kelas pada kasus klasifikasi maupun nilai numerik pada kasus regresi. 5. Dapat disederhanakan melalui pruning untuk mengurangi kompleksitas pohon dan risiko overvitting.

2.2 Classification and Regression Tree (CART)

Salah satu metode dalam Decision Tree adalah Classification and Regression Tree (CART). CART dapat digunakan untuk dua jenis pemodelan, yaitu klasifikasi untuk memprediksi kategori atau kelas regresi untuk memprediksi nilai numerik. Jika variabel respon berupa kategori, pohon yang terbentuk disebut pohon klasifikasi (Classification Tree), 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. Beberapa ukuran yang digunakan dalam proses pemisahan tersebut antara lain Entropy, Information Gain, dan Gini Index. Entropy digunakan untuk mengukur tingkat ketidakpastian atau ketidakmurnian kelas dalam suatu simpul. Semakin kecil nilai Entropy, semakin homogen simpul tersebut. Entropy dirumuskan sebagai (Fransiska, 2026): \[ Entropy(t) = -\sum_k p_k \log_2(p_k) \] dengan 𝑡 adalah node, 𝑘 adalah indeks kelas ke-𝑘, 𝑘 = 1,2,3,…,𝐾 dan 𝑝𝑘 merupakan proporsi observasi dari kelas ke-𝑘 dalam node. Andaikan memiliki sebuah dataset 𝐷 yang terdiri dari dua kelas (Ya atau Tidak) dengan persentase Ya adalah 𝑝1 dan persentase Tidak adalah 𝑝2 maka (Fransiska, 2026): \[ p_1 + p_2 = 1 \]

\[ E(D) = -p_1 \log_2(p_1) - p_2 \log_2(p_2) \] Semakin kecil nilai Entropy, semakin homogen data dalam suatu simpul. Sebaliknya, nilai Entropy semakin besar apabila proporsi kelas dalam simpul semakin seimbang. Jika seluruh amatan dalam suatu simpul berasal dari satu kelas yang sama, maka nilai Entropy sama dengan 0 (Fransiska, 2026).

Information Gain digunakan untuk mengukur seberapa besar tingkat ketidakpastian (Entropy) berkurang setelah dilakukan suatu split. Semakin besar nilai Information Gain, semakin baik pemisahan yang dilakukan karena kelompok data yang terbentuk menjadi semakin homogen. Jika suatu dataset 𝐷 dipartisi menjadi beberapa bagian 𝐷1,𝐷2,…,𝐷𝑗, maka Information Gain dirumuskan sebagai (Fransiska, 2026): \[ IG = E(D) - \sum_{j=1}^{J} \frac{|D_j|}{|D|} E(D_j) \] Jika data hanya dibagi menjadi dua bagian, yaitu 𝐷1 dan 𝐷2 maka rumusnya dapat ditulis sebagai (Fransiska, 2026): \[ IG = E(D) - \left[ \frac{|D_1|}{|D|} E(D_1) + \frac{|D_2|}{|D|} E(D_2) \right] \]

Gini Index digunakan untuk mengukur tingkat ketidakmurnian kelas (Gini impurity) dalam suatu simpul. Semakin kecil nilai Gini Index, semakin homogen data dalam simpul tersebut. Gini Index dirumuskan sebagai (Fransiska, 2026): \[ Gini(t) = 1 - \sum_k p_k^2 \] Jika dataset 𝐷 dipartisi menjadi dua bagian 𝐷1 dan 𝐷2, maka nilai Gini setelah pemisahan dihitung menggunakan rata-rata terbobot (Fransiska, 2026): \[ Gini_{\text{split}} = \frac{|D_1|}{|D|} Gini(D_1) + \frac{|D_2|}{|D|} Gini(D_2) \]

Regression Tree digunakan ketika variabel respons atau target berupa data numerik kontinu. Prinsip pembentukan pohonnya sama dengan Classification Tree, yaitu membagi data secara bertahap melalui proses splitting. Perbedaannya pada Regression Tree pemisahan dilakukan agar nilai respon dalam setiap simpul menjadi semakin seragam atau homogen. Salah satu ukuran yang dapat digunakan untuk menilai hasil pemisahan adalah Mean Square Error (MSE), yaitu rata-rata kuadrat selisih antara nilai respon dengan rata-rata respon dalam suatu simpul (Fransiska, 2026). \[ MSE = \frac{1}{n}\sum_{i=1}^{n}(y_i-\hat{y}_i)^2 \] Pemisahan dipilih apabila mampu menghasilkan simpul-simpul dengan nilai MSE yang lebih kecil. Dengan demikian, amatan yang berada dalam satu simpul memiliki nilai respons yang semakin mirip (Fransiska, 2026).

BAB III METODE PENELITIAN

3.1 Sumber Data

Jenis data yang digunakan pada penelitian ini adalah data kategorik dan numerik. Data kategorik adalah data yang menunjukkan kategori atau kelompok tertentu dan digunakan untuk membedakan karakteristik suatu objek sedangkan data numerik adalah data berbentuk angka yang menunjukkan nilai atau jumlah dan dapat digunakan dalam perhitungan matematis. Sumber data yang diperoleh dalam penelitian ini adalah data sekunder. Data sekunder adalah sekumpulan informasi yang telah ada sebelumnya dan digunakan sebagai pelengkap kebutuhan data penelitian, di mana pada praktikum ini data sekundernya adalah data yang berasal dari program RStudio.

3.2 Variabel Penelitian

Variabel penelitian adalah segala sesuatu yang akan menjadi objek pengamatan penelitian. Pada laporan ini terdapat 10 variabel yang digunakan pada data. Variabel tersebut, yaitu Cl.thickness, Cell.size, Cell.shape, Marg.adhesion, Epith.c.size, Bare.nuclei, Bl,cromatin, Normal.nucleoli, Mitoses, dan Class.

3.3 Langkah-langkah Analisis

  1. Input data.
  2. Pengecekan dan penanganan missing value.
  3. Pembagian data latih dan data uji.
  4. Pembentukan model klasifikasi menggunakan metode Decision Tree.
  5. Visualisasi pohon klasifikasi.
  6. Analisis variabel importance.
  7. Prediksi dan evaluasi model menggunakan confusion matrix.
  8. Penentuan nilai CP terbaik.
  9. Pemangkasan pohon (pruning).
  10. Evaluasi model setelah pruning menggunakan confusion matrix, kurva ROC, dan AUC.

BAB IV HASIL DAN PEMBAHASAN

4.1 Library

Langkah pertama adalah memanggil library yang akan digunakan lalu memanggil data

library(dplyr)
## Warning: package 'dplyr' was built under R version 4.5.3
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.5.3
## Warning: package 'ggplot2' was built under R version 4.5.3
## Warning: package 'readr' was built under R version 4.5.3
## Warning: package 'purrr' was built under R version 4.5.3
## Warning: package 'forcats' was built under R version 4.5.1
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats   1.0.1     ✔ readr     2.2.0
## ✔ ggplot2   4.0.2     ✔ stringr   1.5.1
## ✔ lubridate 1.9.4     ✔ tibble    3.2.1
## ✔ purrr     1.2.2     ✔ tidyr     1.3.1
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(rpart)
## Warning: package 'rpart' was built under R version 4.5.3
library(caret)
## Warning: package 'caret' was built under R version 4.5.3
## Loading required package: lattice
## Warning: package 'lattice' was built under R version 4.5.2
## 
## Attaching package: 'caret'
## 
## The following object is masked from 'package:purrr':
## 
##     lift
library(rpart.plot)
## Warning: package 'rpart.plot' was built under R version 4.5.3
library(ROCR)
## Warning: package 'ROCR' was built under R version 4.5.3
library(ISLR)
## Warning: package 'ISLR' was built under R version 4.5.2
library(mlbench)
## Warning: package 'mlbench' was built under R version 4.5.3
library(mice)
## Warning: package 'mice' was built under R version 4.5.3
## 
## Attaching package: 'mice'
## 
## The following object is masked from 'package:stats':
## 
##     filter
## 
## The following objects are masked from 'package:base':
## 
##     cbind, rbind
library(yardstick)
## Warning: package 'yardstick' was built under R version 4.5.3
## 
## Attaching package: 'yardstick'
## 
## The following objects are masked from 'package:caret':
## 
##     precision, recall, sensitivity, specificity
## 
## The following object is masked from 'package:readr':
## 
##     spec
library(Metrics)
## Warning: package 'Metrics' was built under R version 4.5.1
## 
## Attaching package: 'Metrics'
## 
## The following objects are masked from 'package:yardstick':
## 
##     accuracy, mae, mape, mase, mse, precision, recall, rmse, smape
## 
## The following objects are masked from 'package:caret':
## 
##     precision, recall
#Data
data(BreastCancer)
str(BreastCancer)
## 'data.frame':    699 obs. of  11 variables:
##  $ Id             : chr  "1000025" "1002945" "1015425" "1016277" ...
##  $ Cl.thickness   : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 5 5 3 6 4 8 1 2 2 4 ...
##  $ Cell.size      : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 1 1 2 ...
##  $ Cell.shape     : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 2 1 1 ...
##  $ Marg.adhesion  : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 5 1 1 3 8 1 1 1 1 ...
##  $ Epith.c.size   : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 2 7 2 3 2 7 2 2 2 2 ...
##  $ Bare.nuclei    : Factor w/ 10 levels "1","2","3","4",..: 1 10 2 4 1 10 10 1 1 1 ...
##  $ Bl.cromatin    : Factor w/ 10 levels "1","2","3","4",..: 3 3 3 3 3 9 3 3 1 2 ...
##  $ Normal.nucleoli: Factor w/ 10 levels "1","2","3","4",..: 1 2 1 7 1 7 1 1 1 1 ...
##  $ Mitoses        : Factor w/ 9 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 5 1 ...
##  $ Class          : Factor w/ 2 levels "benign","malignant": 1 1 1 1 1 2 1 1 1 1 ...

Dataset BreastCancer dari package mlbench terdiri atas 699 observasi dan 11 variabel. Variabel tersebut mencakup satu variabel identitas (Id), sembilan variabel prediktor yang menggambarkan karakteristik sel, serta satu variabel respon (Class) yang terdiri atas dua kategori, yaitu benign (jinak) dan malignant (ganas).

4.2 Pengecekan dan Penanganan Missing Value

#Menghapus variabel ID
BreastCancer = BreastCancer[,-1]

#Pengecekan Missing Value
colSums(is.na(BreastCancer))
##    Cl.thickness       Cell.size      Cell.shape   Marg.adhesion    Epith.c.size 
##               0               0               0               0               0 
##     Bare.nuclei     Bl.cromatin Normal.nucleoli         Mitoses           Class 
##              16               0               0               0               0
#Penanganan Missing Value menggunakan mice
data_mice <- mice(BreastCancer, m = 1, method = "pmm",
                  seed = 234)
## 
##  iter imp variable
##   1   1  Bare.nuclei
##   2   1  Bare.nuclei
##   3   1  Bare.nuclei
##   4   1  Bare.nuclei
##   5   1  Bare.nuclei
BreastCancer <- complete(data_mice)

#Mengubah variabel respons menjadi faktor
BreastCancer$Class = as.factor(BreastCancer$Class)

Pengecekan missing value menunjukkan bahwa variabel Bare.nuclei memiliki 16 nilai hilang, sedangkan variabel lainnya tidak memiliki nilai hilang. Penanganan dilakukan menggunakan package mice dengan metode Predictive Mean Matching (pmm). Setelah proses imputasi, data dilengkapi kembali menggunakan fungsi complete(), sehingga data dapat digunakan untuk pemodelan tanpa nilai hilang.

4.3 Membangi Data Training dan Testing

#Data Training dan Testing
set.seed(234)
train <- createDataPartition(
  BreastCancer$Class,
  p = 0.7,
  list = FALSE)

BreastCancer.train = BreastCancer[train,]
BreastCancer.test = BreastCancer[-train,]
Class.test = BreastCancer$Class[-train]

Data dibagi menjadi data latih sebesar 70% dan data uji sebesar 30% menggunakan fungsi createDataPartition(). Dari total 699 observasi, sebanyak 490 observasi digunakan sebagai data latih dan 209 observasi sebagai data uji. Pembagian ini mempertahankan proporsi kelas respon sehingga kedua kelompok data dapat digunakan untuk membangun dan mengevaluasi model klasifikasi.

4.4 Membangun dan Memvisualisasikan Classification Tree

#Classification Tree
fit.tree = rpart(
  Class ~ .,
  data = BreastCancer.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=1,2 309  11 benign (0.96440129 0.03559871)  
##      4) Bare.nuclei=1,2,3,5 300   4 benign (0.98666667 0.01333333) *
##      5) Bare.nuclei=4,6,7,8,10 9   2 malignant (0.22222222 0.77777778) *
##    3) Cell.size=3,4,5,6,7,8,9,10 181  23 malignant (0.12707182 0.87292818)  
##      6) Bare.nuclei=1 22   8 benign (0.63636364 0.36363636)  
##       12) Cell.size=1,2,3 12   0 benign (1.00000000 0.00000000) *
##       13) Cell.size=4,5,6,7,8,9,10 10   2 malignant (0.20000000 0.80000000) *
##      7) Bare.nuclei=2,3,4,5,6,7,8,9,10 159   9 malignant (0.05660377 0.94339623) *
#Visualisasi Tree
rpart.plot(fit.tree)

Model Decision Tree dibangun menggunakan fungsi rpart() dengan metode klasifikasi dan nilai awal Complexity Parameter (CP) sebesar 0,008. Hasil pohon menunjukkan bahwa Cell.size dan Bare.nuclei merupakan variabel yang digunakan dalam percabangan pohon. Variabel Cell.size menjadi pemisah pada akar pohon, sedangkan Bare.nuclei digunakan untuk membentuk percabangan berikutnya. Hal ini menunjukkan bahwa kedua variabel tersebut berperan penting dalam membedakan kelas kanker payudara pada model yang terbentuk.

4.5 Analisis Variabel Importance

#Variable Importance
fit.tree$variable.importance
##       Cell.size      Cell.shape     Bare.nuclei     Bl.cromatin    Epith.c.size 
##      167.034783      134.398275      133.737946      122.207637      117.003541 
## Normal.nucleoli   Marg.adhesion    Cl.thickness 
##      114.153425        5.585455        3.404128
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 Classification Tree")

Hasil variabel importance menunjukkan bahwa Cell.size memiliki nilai kepentingan tertinggi sebesar 167,03, diikuti oleh Cell.shape sebesar 134,40 dan Bare.nuclei sebesar 133,74. Sementara itu, Marg.adhesion dan Cl.thickness memiliki nilai yang relatif rendah, masing-masing sebesar 5,59 dan 3,40. Dengan demikian, Cell.size merupakan variabel yang paling berkontribusi terhadap pemisahan kelas pada model, sedangkan nilai kepentingan variabel lainnya menunjukkan kontribusi relatif dalam proses klasifikasi.

4.6 Prediksi dan Evalusi Model Awal

#Prediksi
pred.tree = predict(
  fit.tree,
  BreastCancer.test,
  type = "class"
)

table(
  pred.tree,
  Class.test)
##            Class.test
## pred.tree   benign malignant
##   benign       122         0
##   malignant     15        72
#Confusion Matrix
matriks_kesalahan <- confusionMatrix(
  pred.tree,
  BreastCancer.test$Class)

matriks_kesalahan
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       122         0
##   malignant     15        72
##                                           
##                Accuracy : 0.9282          
##                  95% CI : (0.8844, 0.9593)
##     No Information Rate : 0.6555          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.8486          
##                                           
##  Mcnemar's Test P-Value : 0.0003006       
##                                           
##             Sensitivity : 0.8905          
##             Specificity : 1.0000          
##          Pos Pred Value : 1.0000          
##          Neg Pred Value : 0.8276          
##              Prevalence : 0.6555          
##          Detection Rate : 0.5837          
##    Detection Prevalence : 0.5837          
##       Balanced Accuracy : 0.9453          
##                                           
##        'Positive' Class : benign          
## 
matriks_kesalahan <- confusionMatrix(
  pred.tree,
  BreastCancer.test$Class,
  positive = "malignant")

matriks_kesalahan
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       122         0
##   malignant     15        72
##                                           
##                Accuracy : 0.9282          
##                  95% CI : (0.8844, 0.9593)
##     No Information Rate : 0.6555          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.8486          
##                                           
##  Mcnemar's Test P-Value : 0.0003006       
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.8905          
##          Pos Pred Value : 0.8276          
##          Neg Pred Value : 1.0000          
##              Prevalence : 0.3445          
##          Detection Rate : 0.3445          
##    Detection Prevalence : 0.4163          
##       Balanced Accuracy : 0.9453          
##                                           
##        'Positive' Class : malignant       
## 

Berdasarkan hasil prediksi terhadap 209 data uji, diperoleh 122 data benign yang diprediksi benar sebagai benign dan 72 data malignant yang diprediksi benar sebagai malignant. Selain itu, terdapat 15 data benign yang salah diklasifikasikan sebagai malignant, sedangkan tidak terdapat data malignant yang salah diklasifikasikan sebagai benign.

Hasil evaluasi model menunjukkan nilai accuracy sebesar 92,82% dan Kappa sebesar 0,8486. Ketika kelas positif ditetapkan sebagai malignant, diperoleh sensitivity sebesar 100% dan specificity sebesar 89,05%. Artinya, model berhasil mendeteksi seluruh kasus malignant pada data uji, tetapi masih terdapat beberapa kasus benign yang salah diklasifikasikan sebagai malignant.

4.7 Menetukan CP Terbaik

#Menampilkan Tabel CP
printcp(fit.tree)
## 
## Classification tree:
## rpart(formula = Class ~ ., data = BreastCancer.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.00000 1.00000 0.062260
## 2 0.035503      1   0.20118 0.27811 0.038571
## 3 0.029586      3   0.13018 0.18343 0.031886
## 4 0.008000      4   0.10059 0.17160 0.030908
#Menentukan CP Terbaik
fit.tree$cptable[
  which.min(
    fit.tree$cptable[,"xerror"]
  ),
  "CP"]
## [1] 0.008
bestcp <- fit.tree$cptable[
  which.min(fit.tree$cptable[,"xerror"]),
  "CP"]

bestcp
## [1] 0.008
#Visualisasi CP
plotcp(fit.tree, upper = "splits")

Penentuan CP terbaik dilakukan berdasarkan nilai cross-validation error terkecil pada tabel CP. Hasil menunjukkan bahwa nilai terkecil sebesar 0,17160 diperoleh pada CP sebesar 0,008 dengan empat percabangan (nsplit = 4). Oleh karena itu, nilai CP terbaik yang diperoleh adalah 0,008, yang selanjutnya digunakan dalam proses pruning.

4.8 Melakukan Pruning dan Visualisasi

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

#Visualisasi Tree setelah Pruning
rpart.plot(pruned.tree)

Proses pruning dilakukan menggunakan nilai CP terbaik sebesar 0,008. Berdasarkan hasil yang diperoleh, struktur pohon setelah pruning tidak mengalami perubahan dibandingkan pohon awal karena nilai CP yang digunakan sama dengan nilai CP awal pembentukan model. Dengan demikian, proses pruning tersebut tidak menghasilkan penyederhanaan pohon klasifikasi.

4.9 Prediksi dan Evaluasi Model setelah Pruning

#Prediksi setelah Pruning
pred.prune = predict(
  pruned.tree,
  BreastCancer.test,
  type = "class")

table(pred.prune, Class.test)
##            Class.test
## pred.prune  benign malignant
##   benign       122         0
##   malignant     15        72
#Confusion Matrix setelah Pruning
matriks_kesalahan <- confusionMatrix(
  pred.prune,
  BreastCancer.test$Class)

matriks_kesalahan
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       122         0
##   malignant     15        72
##                                           
##                Accuracy : 0.9282          
##                  95% CI : (0.8844, 0.9593)
##     No Information Rate : 0.6555          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.8486          
##                                           
##  Mcnemar's Test P-Value : 0.0003006       
##                                           
##             Sensitivity : 0.8905          
##             Specificity : 1.0000          
##          Pos Pred Value : 1.0000          
##          Neg Pred Value : 0.8276          
##              Prevalence : 0.6555          
##          Detection Rate : 0.5837          
##    Detection Prevalence : 0.5837          
##       Balanced Accuracy : 0.9453          
##                                           
##        'Positive' Class : benign          
## 
matriks_kesalahan <- confusionMatrix(
  pred.prune,
  BreastCancer.test$Class,
  positive = "malignant")

matriks_kesalahan
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       122         0
##   malignant     15        72
##                                           
##                Accuracy : 0.9282          
##                  95% CI : (0.8844, 0.9593)
##     No Information Rate : 0.6555          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.8486          
##                                           
##  Mcnemar's Test P-Value : 0.0003006       
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.8905          
##          Pos Pred Value : 0.8276          
##          Neg Pred Value : 1.0000          
##              Prevalence : 0.3445          
##          Detection Rate : 0.3445          
##    Detection Prevalence : 0.4163          
##       Balanced Accuracy : 0.9453          
##                                           
##        'Positive' Class : malignant       
## 

Hasil prediksi setelah pruning menunjukkan matriks klasifikasi yang sama dengan model awal, yaitu 122 data benign dan 72 data malignant berhasil diklasifikasikan dengan benar, sedangkan 15 data benign salah diklasifikasikan sebagai malignant. Nilai accuracy tetap sebesar 92,82%, sensitivity sebesar 100%, dan specificity sebesar 89,05% ketika kelas positif ditetapkan sebagai malignant. Hasil ini menunjukkan bahwa proses pruning tidak mengubah kinerja model pada data uji.

4.10 Evaluasi Akhir

#Probabilitas Prediksi
breastcancer_preds_cart <- bind_cols(
  predict(
    pruned.tree,
    newdata = BreastCancer.test,
    type = "prob"),

  predicted = predict(
    pruned.tree,
    newdata = BreastCancer.test,
    type = "class"),

  actual = BreastCancer.test$Class)

breastcancer_preds_cart
## # A tibble: 209 × 4
##    benign malignant predicted actual   
##     <dbl>     <dbl> <fct>     <fct>    
##  1 0.987     0.0133 benign    benign   
##  2 0.222     0.778  malignant benign   
##  3 0.987     0.0133 benign    benign   
##  4 0.987     0.0133 benign    benign   
##  5 0.0566    0.943  malignant malignant
##  6 0.987     0.0133 benign    benign   
##  7 0.987     0.0133 benign    benign   
##  8 0.987     0.0133 benign    benign   
##  9 0.0566    0.943  malignant malignant
## 10 0.2       0.8    malignant malignant
## # ℹ 199 more rows
#Confusion Matrix
breastcancer_cm_cart <- confusionMatrix(
  breastcancer_preds_cart$predicted,
  reference = breastcancer_preds_cart$actual,
  positive = "malignant")

breastcancer_cm_cart
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       122         0
##   malignant     15        72
##                                           
##                Accuracy : 0.9282          
##                  95% CI : (0.8844, 0.9593)
##     No Information Rate : 0.6555          
##     P-Value [Acc > NIR] : < 2.2e-16       
##                                           
##                   Kappa : 0.8486          
##                                           
##  Mcnemar's Test P-Value : 0.0003006       
##                                           
##             Sensitivity : 1.0000          
##             Specificity : 0.8905          
##          Pos Pred Value : 0.8276          
##          Neg Pred Value : 1.0000          
##              Prevalence : 0.3445          
##          Detection Rate : 0.3445          
##    Detection Prevalence : 0.4163          
##       Balanced Accuracy : 0.9453          
##                                           
##        'Positive' Class : malignant       
## 
#AUC
mdl_auc <- Metrics::auc(
  actual =
    breastcancer_preds_cart$actual == "malignant",
  predicted =
    breastcancer_preds_cart$malignant)

mdl_auc
## [1] 0.9629461
#ROC Curve
yardstick::roc_curve(
  breastcancer_preds_cart,
  actual,
  malignant
) %>%
  autoplot() +
  labs(
    title = "ROC Curve",
    subtitle =
      paste0(
        "AUC = ",
        round(mdl_auc, 4)))

Hasil evaluasi akhir menunjukkan bahwa model setelah pruning memiliki accuracy sebesar 92,82%, sensitivity sebesar 100%, dan specificity sebesar 89,05%. Sementara itu, nilai AUC yang diperoleh adalah 0,9629. Nilai tersebut menunjukkan bahwa model memiliki kemampuan yang sangat baik dalam membedakan kelas benign dan malignant berdasarkan probabilitas prediksinya.

Secara keseluruhan, model Decision Tree menghasilkan kinerja klasifikasi yang baik dengan akurasi 92,82% dan AUC 0,9629. Namun, model masih menghasilkan 15 kesalahan klasifikasi pada kelas benign. Selain itu, karena nilai CP terbaik sama dengan CP awal, proses pruning tidak memberikan perubahan pada struktur pohon maupun hasil evaluasi model.

BAB V KESIMPULAN

5.1 Kesimpulan

Decision Tree merupakan metode klasifikasi yang membentuk struktur pohon melalui proses pemisahan data secara bertahap untuk menghasilkan keputusan berdasarkan variabel prediktor. Metode CART (Classification and Regression Tree) membentuk pohon klasifikasi dengan memilih pemisahan yang menghasilkan kelompok data semakin homogen, yang dapat diukur menggunakan Entropy, Information Gain, atau Gini Index. Kompleksitas pohon dapat dikurangi melalui proses pruning untuk menghasilkan model yang lebih sederhana dan mengurangi risiko overfitting.

Model Classification Tree menggunakan algoritma CART dibangun dengan menyiapkan data, menentukan variabel prediktor dan variabel respons, serta membagi data menjadi data latih dan data uji. Selanjutnya, model dibentuk melalui proses splitting untuk memperoleh kelompok data yang homogen, kemudian divisualisasikan dan dianalisis berdasarkan tingkat kepentingan variabel. Model dapat disederhanakan melalui pruning menggunakan nilai complexity parameter (CP) terbaik, lalu dievaluasi menggunakan confusion matrix, kurva ROC, dan nilai AUC untuk mengetahui kinerja klasifikasinya.

Berdasarkan hasil pemodelan Classification Tree menggunakan algoritma CART pada dataset BreastCancer, diperoleh model dengan akurasi sebesar 92,82% dan nilai AUC sebesar 0,9629, yang menunjukkan kemampuan klasifikasi yang sangat baik. Variabel Cell.size menjadi variabel dengan tingkat kepentingan tertinggi, sedangkan evaluasi menunjukkan bahwa seluruh data kanker ganas (malignant) berhasil diklasifikasikan dengan benar, meskipun terdapat 15 data jinak (benign) yang salah diklasifikasikan sebagai ganas. Proses pruning menggunakan nilai CP sebesar 0,008 tidak mengubah struktur maupun kinerja model, sehingga model awal tetap menghasilkan performa yang sama setelah pemangkasan.

DAFTAR PUSTAKA

Biyantoro, A. S., & Prasetiyo, B. (2024). Application of decision tree for health status classification, compared to KNN and Naive Bayes. IJIRSE: Indonesian Journal of Informatic Research and Software Engineering, 4(1), 47–55. https://journal.irpi.or.id/index.php/ijirse

Fatika, I., Suryowati, K., Pratiwi, N., & Sholeh, M. (2022). Klasifikasi tingkat pengangguran terbuka di Indonesia dengan algoritma Classification and Regression Tree (CART) dan C4.5. Jurnal Statistika Industri dan Komputasi, 7(2), 77–85.

Fransiska, H. (2026). Modul Praktikum Machine Learning dan Modern Prediction. Bengkulu: Universitas Bengkulu.

Hutapea, J. S., & Harani, N. H. (2025). Klasifikasi tindakan korektif iregularitas dengan penerapan algoritma CART pada perusahaan logistik. IJAI (Indonesian Journal of Applied Informatics), 9(2), 495–505. https://doi.org/10.20961/ijai.v9i2.98539.

Nabila, I., Sumertajaya, I. M., & Raharjo, M. (2022). Penerapan metode CART pada pengklasifikasian bekerja dan pengangguran di Kabupaten Subang. Xplore: Journal of Statistics, 11(2), 120–129.