BAB I PENDAHULUAN

1.1 Latar Belakang

Perkembangan teknologi informasi menyebabkan jumlah data semakin meningkat, sehingga diperlukan metode analisis yang mampu mengolah data menjadi informasi yang bermanfaat. Salah satu metode yang dapat digunakan adalah machine learning, khususnya klasifikasi, yang bertujuan mengelompokkan objek ke dalam kelas tertentu berdasarkan karakteristik variabel prediktor. Salah satu metode klasifikasi yang dapat digunakan adalah Decision Tree atau pohon keputusan. 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 (Biyantoro dan Prasetiyo, 2024).

Pohon keputusan sendiri memiliki beberapa metode dimana metode yang popular salah satunya adalah metode CART. Classification and Regression Tress (CART) adalah suatu metode algoritma dari salah satu teknik eksplorasi data yaitu teknik pohon keputusan yang dikembangkan untuk melakukan analisis klasifikasi pada variabel respon baik yang nominal, ordinal maupun kontinu. (Dj dan Achmad, 2020). Selain itu, pembentukan pohon perlu memperhatikan kompleksitas model agar tidak terjadi overfitting, yaitu kondisi ketika model terlalu menyesuaikan diri dengan data latih.

Pembangunan model Classification Tree menggunakan CART mencakup beberapa tahapan, yaitu persiapan data, pembagian data latih dan data uji, penentuan pemisahan terbaik, pembentukan pohon secara rekursif, pemangkasan pohon, serta evaluasi kinerja model. Setiap tahapan memiliki peran penting dalam menghasilkan model klasifikasi yang mampu mengidentifikasi pola data dan mengklasifikasikan pengamatan baru.

1.2 Rumusan Masalah

Berdasarkan latar belakang di atas, adapun rumusan masalah yang dapat disimpulkan sebagai berikut:

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

1.3 Tujuan

Adapun tujuan penelitian ini 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.

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 data set itu sendiri. Dalam metode Klasifikasi, algoritma Decision Tree merupakan yang paling banyak digunakan (Biyantoro dan Prasetiyo, 2024).

Decision Tree memiliki beberapa karakteristik utama yang membuatnya banyak digunakan. Karakteristik tersebut meliputi kemudahan untuk dipahami dan diinterpretasikan karena model dapat divisualisasikan dalam bentuk pohon, kemampuan menggunakan variabel prediktor numerik maupun kategorik, serta pembagian data secara bertahap melalui proses splitting sehingga kelompok yang terbentuk semakin homogen. Pohon keputusan juga dapat digunakan untuk memprediksi kelas pada kasus klasifikasi maupun nilai numerik pada kasus regresi. Selain itu, pohon dapat disederhanakan melalui pruning untuk mengurangi kompleksitas pohon dan risiko overfitting (Fransiska, 2026).

2.3 Classification and Regression Tree (CART)

CART merupakan metode klasifikasi menggunkan logika biner berdasarkan logika pohon keputusan (decision tree), hasil klasifikasi didasarkan pada kinerja statistik regresi. Cara kerja algoritma CART adalah memisahkan data melalui simpul-simpul hingga mencapai simpul akhir dengan membentuk hierarki pohon keputusan (Farikhi dan Pramono, 2023).

Indeks Gini 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 berikut (Fransiska, 2026):

\[ Gini(t) = 1 - \sum_{k=1}^{K} p_k^2 \] dengan \(t\) adalah node, \(k\) adalah indeks kelas ke-\(k\), \(K\) adalah jumlah kelas, dan \(p_k\) merupakan proporsi observasi dari kelas ke-\(k\) dalam node. Jika dataset \(D\) dipartisi menjadi dua bagian \(D_1\) dan \(D_2\), maka nilai Gini setelah pemisahan dihitung menggunakan rata-rata terbobot:

\[ Gini_{split} = \frac{|D_1|}{|D|} Gini(D_1) + \frac{|D_2|}{|D|} Gini(D_2) \] Evaluasi pemisah \(s\) pada simpul \(t\) dapat dilakukan dengan melihat nilai Goodness of split. Penurunan tingkat impurity yang diperoleh terhadap atribut \(A\) dapat dihitung dengan \(\Delta Gini(A) = Gini(D) - Gini_A(D)\). Proses pemilihan variabel prediktor terbaik juga dilakukan dengan menggunakan indeks Gini dan penyekatan dilakukan hingga memenuhi kriteria pemberhentian (Agwil dkk., 2022).

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 berikut (Fransiska, 2026):

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

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 \(D\) dipartisi menjadi beberapa bagian \(D_1, D_2, \ldots, D_j\), maka Information Gain dirumuskan sebagai berikut (Fransiska, 2026):

\[ IG = E(D) - \sum_{j=1}^{J} \frac{|D_j|}{|D|} E(D_j) \] 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 respons dengan rata-rata respons dalam suatu simpul. Pemisahan dipilih apabila mampu menghasilkan simpul-simpul dengan nilai MSE yang lebih kecil. MSE dirumuskan sebagai berikut (Fransiska, 2026):

\[ MSE = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y})^2 \] ## 2.4 Evaluasi Model Klasifikasi

Tahap evaluasi bertujuan untuk mengukur kinerja model klasifikasi yang telah dibangun melalui analisis confusion matrix. Agar evaluasi kinerja model dilakukan secara lebih komprehensif maka menerapkan beberapa metrik evaluasi yaitu accuracy, precision, recall, dan F1-score yang masing-masing memberikan informasi mengenai tingkat ketepatan klasifikasi, presisi prediksi, sensitivitas model, serta keseimbangan antara precision dan recall (Saputra et al., 2026).

Dan dari nilai-nilai ini, rasio accuracy, precision, recall dan f1-score dapat dihitung sebagai berikut (Saputra et al., 2026):

  1. Accuracy merupakan metrik evaluasi yang digunakan untuk mengukur proporsi prediksi yang benar terhadap seluruh data pada proses pengujian. Metrik ini memberikan gambaran mengenai kemampuan model dalam melakukan klasifikasi secara keseluruhan, sehingga semakin tinggi nilai accuracy maka semakin baik tingkat ketepatan prediksi yang dihasilkan oleh model. \[ Accuracy=\frac{TP+TN}{TP+TN+FP+FN} \]
  2. Precision merupakan metrik evaluasi yang digunakan untuk mengukur tingkat ketepatan prediksi model terhadap kelas positif. Metrik ini menunjukkan proporsi prediksi positif yang benar yaitu tweet yang diprediksi sebagai bencana dan benar-benar termasuk dalam kategori bencana. Nilai precision yang tinggi mengindikasikan bahwa model mampu meminimalkan terjadinya false positive sehingga prediksi yang dihasilkan menjadi lebih andal. \[ Precision=\frac{TP}{TP+FN} \]
  3. Recall merupakan metrik evaluasi yang digunakan untuk mengukur sensitivitas model dalam mendeteksi data pada kelas positif. Metrik ini menunjukkan proporsi tweet bencana yang berhasil diidentifikasi secara benar dibandingkan dengan seluruh tweet yang benar-benar termasuk dalam kategori bencana pada dataset. Nilai recall yang tinggi mengindikasikan bahwa model mampu meminimalkan terjadinya false negative sehingga semakin sedikit tweet bencana yang gagal terdeteksi. \[ Recall=\frac{TP}{TP+FP} \]
  4. Selain itu digunakan pula nilai F1-score untuk mengukur keseimbangan antara precision dan recall. Metrik ini penting digunakan terutama pada dataset yang tidak seimbang (imbalanced dataset) karena mampu memberikan evaluasi yang lebih representatif terhadap performa model klasifikasi. \[ F1\text{-}Score = \frac{2 \times (Precision \times Recall)}{Precision + Recall} \]

BAB III METODE PENELITIAN

3.1 Jenis dan Sumber Data

Jenis data yang digunakan dalam penelitian ini adalah data kategorik, yaitu data yang menunjukkan pengelompokan objek berdasarkan kategori tertentu. Data yang digunakan berasal dari hasil pemeriksaan klinis sel kanker payudara yang disajikan dalam bentuk kategori.

Sumber data yang digunakan dalam penelitian ini adalah data sekunder. Data sekunder merupakan data yang telah dikumpulkan oleh pihak lain dan dapat dimanfaatkan kembali untuk keperluan penelitian. Dataset BreastCancer diperoleh dari package mlbench pada perangkat lunak R. Dataset tersebut terdiri atas 699 observasi.

3.2 Variabel Penelitian

Variabel merupakan karakteristik atau atribut yang dapat diukur maupun diamati dalam suatu penelitian. Penelitian ini menggunakan sepuluh variabel, yaitu Cl.thickness, Cell.size, Cell.shape, Marg.adhesion, Epith.c.size, Bare.nuclei, Bl.cromatin, Normal.nucleoli, Mitoses, dan Class. Variabel Class berperan sebagai variabel respons yang bertipe kategorik dengan dua kelas, yaitu benign (jinak) dan malignant (ganas). Sembilan variabel lainnya berperan sebagai variabel prediktor yang bertipe kategorik dengan skala 1 sampai 10.

3.3 Analisis Data

Berikut merupakan algoritma penelitian pada batasan masalah:

  1. Input data
  2. Pemeriksaan dan penanganan missing value
  3. Pembagian data training dan testing
  4. Visualisasi CART
  5. Analisis variable importance
  6. Prediksi dan evaluasi model awal
  7. Penentuan CP terbaik
  8. Pruning pohon dengan CP terbaik
  9. Evaluasi model setelah pruning
  10. Output
  11. Interpretasi

BAB IV HASIL DAN PEMBAHASAN

4.1 Library

library(dplyr)
library(tidyverse)
library(rpart)
library(caret)
library(rpart.plot)
library(ROCR)
library(mlbench)
library(mice)

Dalam proses pembentukan model Classification Tree menggunakan algoritma CART, diperlukan beberapa package pendukung untuk menunjang analisis. Package rpart digunakan untuk membangun pohon keputusan, sementara rpart.plot berfungsi menampilkan visualisasi struktur pohon yang dihasilkan. Selanjutnya, caret dimanfaatkan untuk membantu pembagian data serta evaluasi klasifikasi melalui confusion matrix.

Adapun package mlbench menyediakan dataset BreastCancer yang digunakan dalam analisis, sedangkan mice berperan dalam menangani data yang hilang (missing values). Untuk mendukung pengolahan dan manipulasi data, digunakan dplyr dan tidyverse, sementara ROCR dimanfaatkan untuk mengevaluasi kinerja model melalui kurva ROC. Seluruh package berhasil dimuat tanpa mengalami kesalahan, sehingga analisis dapat dilanjutkan ke tahap berikutnya.

4.2 Data

d <- data(package = "mlbench")
d$results[, "Item"]
##  [1] "BostonHousing"     "BostonHousing2"    "BreastCancer"     
##  [4] "DNA"               "Glass"             "HouseVotes84"     
##  [7] "Ionosphere"        "LetterRecognition" "Ozone"            
## [10] "Satellite"         "Servo"             "Shuttle"          
## [13] "Sonar"             "Soybean"           "SynthDiabetes"    
## [16] "SynthDiabetes2"    "Vehicle"           "Vowel"            
## [19] "Zoo"
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 ...
# Menghapus variabel Id (bukan variabel prediktor)
BC <- BreastCancer[, -1]
str(BC)
## 'data.frame':    699 obs. of  10 variables:
##  $ Cl.thickness   : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 5 5 3 6 4 8 1 2 2 4 ...
##  $ Cell.size      : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 1 1 2 ...
##  $ Cell.shape     : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 2 1 1 ...
##  $ Marg.adhesion  : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 5 1 1 3 8 1 1 1 1 ...
##  $ Epith.c.size   : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 2 7 2 3 2 7 2 2 2 2 ...
##  $ Bare.nuclei    : Factor w/ 10 levels "1","2","3","4",..: 1 10 2 4 1 10 10 1 1 1 ...
##  $ Bl.cromatin    : Factor w/ 10 levels "1","2","3","4",..: 3 3 3 3 3 9 3 3 1 2 ...
##  $ Normal.nucleoli: Factor w/ 10 levels "1","2","3","4",..: 1 2 1 7 1 7 1 1 1 1 ...
##  $ Mitoses        : Factor w/ 9 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 5 1 ...
##  $ Class          : Factor w/ 2 levels "benign","malignant": 1 1 1 1 1 2 1 1 1 1 ...
class(BC$Class)
## [1] "factor"
table(BC$Class)
## 
##    benign malignant 
##       458       241

Sesuai dengan batasan masalah, analisis menggunakan dataset BreastCancer yang tersedia dalam package mlbench untuk melakukan klasifikasi kondisi kanker payudara. Dataset tersebut mencakup 699 observasi dan 11 variabel, yang terdiri atas satu variabel identitas, sembilan variabel prediktor, dan satu variabel respons. Variabel Id tidak disertakan dalam pemodelan karena hanya berfungsi sebagai penanda identitas pasien dan tidak memberikan informasi yang relevan untuk menentukan kelas.

Setelah variabel Id dihilangkan, dataset yang digunakan terdiri atas sembilan variabel prediktor dan satu variabel respons, yaitu Class. Variabel Class bertipe factor dengan dua kategori, yakni benign yang menunjukkan kondisi jinak dan malignant yang menunjukkan kondisi ganas. Adapun uraian mengenai setiap variabel yang digunakan dalam analisis disajikan pada Tabel 4.1.

Tabel 4.1 Deskripsi variabel pada dataset BreastCancer

No Variabel Tipe Keterangan
1 Cl.thickness Ordered factor (10 level) Ketebalan gumpalan sel
2 Cell.size Ordered factor (10 level) Keseragaman ukuran sel
3 Cell.shape Ordered factor (10 level) Keseragaman bentuk sel
4 Marg.adhesion Ordered factor (10 level) Perlekatan marginal
5 Epith.c.size Ordered factor (10 level) Ukuran sel epitel tunggal
6 Bare.nuclei Factor (10 level) Inti sel telanjang
7 Bl.cromatin Factor (10 level) Kromatin halus
8 Normal.nucleoli Factor (10 level) Nukleolus normal
9 Mitoses Factor (9 level) Mitosis
10 Class Factor (2 level) Variabel respons (benign/malignant)

Berdasarkan distribusi variabel respons, sebanyak 458 observasi (65,52%) termasuk dalam kategori benign (jinak), sedangkan 241 observasi (34,48%) tergolong kategori malignant (ganas). Hal ini menunjukkan bahwa kategori benign memiliki proporsi yang lebih besar dibandingkan kategori malignant. Meskipun terdapat perbedaan jumlah observasi antarkelas, distribusi tersebut belum menunjukkan ketimpangan yang ekstrem, sehingga pemodelan dapat dilakukan tanpa penyeimbangan kelas tambahan. Namun, kinerja model pada kedua kelas tetap perlu diperhatikan melalui evaluasi klasifikasi.

4.3 Pengecekan dan Penanganan Missing Value

# Pengecekan Missing Value
colSums(is.na(BC))
##    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
sum(is.na(BC))
## [1] 16
md.pattern(BC)

##     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
# Penanganan Missing Value dengan mice
set.seed(46)

imp <- mice(
  BC,
  m = 5,
  maxit = 5,
  seed = 46,
  printFlag = FALSE
)

summary(imp)
## Class: mids
## Number of multiple imputations:  5 
## Imputation methods:
##    Cl.thickness       Cell.size      Cell.shape   Marg.adhesion    Epith.c.size 
##              ""              ""              ""              ""              "" 
##     Bare.nuclei     Bl.cromatin Normal.nucleoli         Mitoses           Class 
##       "polyreg"              ""              ""              ""              "" 
## PredictorMatrix:
##               Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size
## Cl.thickness             0         1          1             1            1
## Cell.size                1         0          1             1            1
## Cell.shape               1         1          0             1            1
## Marg.adhesion            1         1          1             0            1
## Epith.c.size             1         1          1             1            0
## Bare.nuclei              1         1          1             1            1
##               Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses Class
## Cl.thickness            1           1               1       1     1
## Cell.size               1           1               1       1     1
## Cell.shape              1           1               1       1     1
## Marg.adhesion           1           1               1       1     1
## Epith.c.size            1           1               1       1     1
## Bare.nuclei             0           1               1       1     1
BC.complete <- complete(imp, 1)

# Pengecekan ulang setelah imputasi
colSums(is.na(BC.complete))
##    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(is.na(BC.complete))
## [1] 0
str(BC.complete)
## 'data.frame':    699 obs. of  10 variables:
##  $ Cl.thickness   : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 5 5 3 6 4 8 1 2 2 4 ...
##  $ Cell.size      : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 1 1 2 ...
##  $ Cell.shape     : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 4 1 8 1 10 1 2 1 1 ...
##  $ Marg.adhesion  : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 1 5 1 1 3 8 1 1 1 1 ...
##  $ Epith.c.size   : Ord.factor w/ 10 levels "1"<"2"<"3"<"4"<..: 2 7 2 3 2 7 2 2 2 2 ...
##  $ Bare.nuclei    : Factor w/ 10 levels "1","2","3","4",..: 1 10 2 4 1 10 10 1 1 1 ...
##  $ Bl.cromatin    : Factor w/ 10 levels "1","2","3","4",..: 3 3 3 3 3 9 3 3 1 2 ...
##  $ Normal.nucleoli: Factor w/ 10 levels "1","2","3","4",..: 1 2 1 7 1 7 1 1 1 1 ...
##  $ Mitoses        : Factor w/ 9 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 5 1 ...
##  $ Class          : Factor w/ 2 levels "benign","malignant": 1 1 1 1 1 2 1 1 1 1 ...

Pemeriksaan missing value dilakukan menggunakan package mice. Berdasarkan hasil pemeriksaan, ditemukan sebanyak 16 nilai hilang yang seluruhnya terdapat pada variabel Bare.nuclei. Jumlah tersebut mencakup 2,29% dari total 699 observasi, sementara variabel lainnya tidak memiliki nilai hilang.

Berdasarkan pola data hilang yang ditampilkan melalui fungsi md.pattern, sebanyak 683 observasi memiliki data lengkap, sedangkan 16 observasi lainnya mengalami kehilangan nilai hanya pada variabel Bare.nuclei. Dengan demikian, data hilang tidak ditemukan pada variabel lain. Untuk mempertahankan seluruh observasi dalam proses pemodelan, penanganan dilakukan melalui imputasi daripada menghapus observasi yang memiliki nilai hilang.

Proses imputasi dilakukan menggunakan fungsi mice dengan lima imputasi (m = 5), lima iterasi (maxit = 5), dan seed sebesar 46 agar proses dapat direproduksi. Metode imputasi yang digunakan untuk variabel Bare.nuclei adalah polytomous regression (polyreg), sesuai dengan karakteristik variabel tersebut yang bertipe faktor tidak berurutan dengan lebih dari dua kategori. Selanjutnya, kumpulan data hasil imputasi pertama digunakan untuk analisis. Pemeriksaan ulang menunjukkan bahwa seluruh variabel telah bebas dari missing value, sehingga data dapat dilanjutkan ke tahap pembentukan model Classification Tree.

4.4 Pembagian Data Training dan Testing

set.seed(46)

train <- createDataPartition(
  BC.complete$Class,
  p = 0.7,
  list = FALSE
)

BC.train = BC.complete[train, ]
BC.test = BC.complete[-train, ]
Class.test = BC.complete$Class[-train]

dim(BC.train)
## [1] 490  10
dim(BC.test)
## [1] 209  10
prop.table(table(BC.train$Class))
## 
##    benign malignant 
##  0.655102  0.344898
prop.table(table(BC.test$Class))
## 
##    benign malignant 
## 0.6555024 0.3444976

Pembagian data dilakukan untuk memisahkan data training dan data testing sebelum model Classification Tree dibangun. Proses ini menggunakan fungsi createDataPartition dengan proporsi 70% untuk data training dan 30% untuk data testing. Hasil pembagian menghasilkan 490 observasi pada data training dan 209 observasi pada data testing.

Fungsi createDataPartition menerapkan pengambilan sampel berstrata berdasarkan variabel Class, sehingga distribusi kelas pada kedua kelompok data tetap mendekati distribusi data awal. Pada data training, terdapat 321 observasi benign (65,51%) dan 169 observasi malignant (34,49%). Sementara itu, data testing terdiri atas 137 observasi benign (65,55%) dan 72 observasi malignant (34,45%).

Proporsi kelas yang relatif serupa menunjukkan bahwa pembagian data mempertahankan distribusi kategori benign dan malignant. Data training selanjutnya digunakan untuk membangun model CART, sedangkan data testing digunakan untuk mengevaluasi kemampuan klasifikasi pada observasi yang tidak dilibatkan dalam proses pelatihan. Dengan demikian, evaluasi model dapat memberikan gambaran yang lebih objektif mengenai kemampuannya dalam mengklasifikasikan data baru.

4.5 Pembentukan Classification Tree

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=1,2,3 337  25 benign (0.92581602 0.07418398)  
##     4) Bare.nuclei=1,2,3 309   5 benign (0.98381877 0.01618123) *
##     5) Bare.nuclei=4,5,7,8,9,10 28   8 malignant (0.28571429 0.71428571) *
##   3) Cell.size=4,5,6,7,8,9,10 153   9 malignant (0.05882353 0.94117647) *
rpart.plot(fit.tree)
Gambar 4.1 Struktur Classification Tree sebelum pruning

Gambar 4.1 Struktur Classification Tree sebelum pruning

Pembentukan model Classification Tree dilakukan menggunakan fungsi rpart dengan metode klasifikasi (method = "class") dan parameter kompleksitas (cp) sebesar 0,008. Variabel Class ditetapkan sebagai variabel respons, sedangkan variabel lainnya digunakan sebagai prediktor. Berdasarkan hasil pemodelan, terbentuk pohon keputusan dengan tiga simpul terminal dan dua tahap pemisahan.

Pada simpul akar, terdapat 490 observasi dengan 169 observasi berkelas malignant, sehingga kelas mayoritas yang diprediksi adalah benign. Pemisahan pertama dilakukan berdasarkan variabel Cell.size. Observasi dengan kategori 1, 2, dan 3 diarahkan ke cabang kiri, sedangkan kategori 4 hingga 10 masuk ke cabang kanan. Cabang kanan terdiri atas 153 observasi, dengan 94,12% di antaranya termasuk kelas malignant, sehingga simpul tersebut diklasifikasikan sebagai malignant.

Selanjutnya, cabang kiri yang terdiri atas 337 observasi kembali dipisahkan menggunakan variabel Bare.nuclei. Observasi dengan kategori 1, 2, dan 3 berjumlah 309 dan diklasifikasikan sebagai benign, dengan proporsi kelas sebesar 98,38%. Sementara itu, 28 observasi pada kategori lainnya diklasifikasikan sebagai malignant, dengan proporsi sebesar 71,43%.

Variabel Cell.size dan Bare.nuclei merupakan dua prediktor yang digunakan dalam struktur pohon akhir. Kedua variabel tersebut menjadi dasar pembentukan aturan klasifikasi pada model yang diperoleh. Pada data training, terdapat 22 observasi yang salah diklasifikasikan dari total 490 observasi, sehingga tingkat kesalahan klasifikasi (misclassification rate) sebesar 4,49%. Hasil ini menggambarkan kinerja model pada data pelatihan, sedangkan kemampuan klasifikasi pada data baru perlu dinilai menggunakan data testing.

4.6 Variable Importance

fit.tree$variable.importance
##       Cell.size     Bare.nuclei      Cell.shape     Bl.cromatin Normal.nucleoli 
##      158.192512      132.553593      127.507199      107.862378      104.339897 
##    Epith.c.size    Cl.thickness   Marg.adhesion 
##      103.393799        4.468579        3.574863
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"
  )
Gambar 4.2 Variable importance pada model awal

Gambar 4.2 Variable importance pada model awal

Analisis variable importance dilakukan untuk mengidentifikasi variabel prediktor yang memiliki tingkat kepentingan relatif dalam proses klasifikasi. Berdasarkan hasil pemodelan, variabel Cell.size memperoleh nilai kepentingan tertinggi sebesar 158,19, diikuti Bare.nuclei sebesar 132,55 dan Cell.shape sebesar 127,51. Tingginya nilai kepentingan Cell.size sejalan dengan struktur pohon keputusan karena variabel tersebut digunakan sebagai pemisah pertama pada simpul akar.

Variabel Cell.shape, Bl.cromatin, Normal.nucleoli, dan Epith.c.size juga memiliki nilai kepentingan yang relatif tinggi meskipun tidak digunakan secara langsung dalam struktur pohon akhir. Hal ini disebabkan perhitungan variable importance pada rpart dapat memperhitungkan kontribusi variabel melalui pemisah pesaing (competing splits) dan pemisah pengganti (surrogate splits). Dengan demikian, variabel yang tidak muncul dalam struktur pohon tetap dapat memiliki nilai kepentingan apabila memberikan informasi yang relevan terhadap proses pemisahan kelas.

Sebaliknya, variabel Cl.thickness dan Marg.adhesion memiliki nilai kepentingan yang relatif rendah, masing-masing sebesar 4,47 dan 3,57. Sementara itu, variabel Mitoses tidak tercantum dalam hasil variable importance karena tidak memberikan kontribusi yang tercatat dalam perhitungan model. Secara keseluruhan, hasil ini menunjukkan bahwa tingkat kepentingan variabel prediktor berbeda-beda dalam model CART yang dibentuk. Namun, nilai variable importance menunjukkan kepentingan relatif dalam model, bukan secara langsung membuktikan hubungan sebab-akibat atau signifikansi statistik.

4.7 Prediksi dan Evaluasi Model Awal

pred.tree = predict(
  fit.tree,
  BC.test,
  type = "class"
)

table(
  pred.tree,
  Class.test
)
##            Class.test
## pred.tree   benign malignant
##   benign       125         3
##   malignant     12        69
matriks_kesalahan <- confusionMatrix(
  pred.tree,
  BC.test$Class
)
matriks_kesalahan
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       125         3
##   malignant     12        69
##                                           
##                Accuracy : 0.9282          
##                  95% CI : (0.8844, 0.9593)
##     No Information Rate : 0.6555          
##     P-Value [Acc > NIR] : < 2e-16         
##                                           
##                   Kappa : 0.8457          
##                                           
##  Mcnemar's Test P-Value : 0.03887         
##                                           
##             Sensitivity : 0.9124          
##             Specificity : 0.9583          
##          Pos Pred Value : 0.9766          
##          Neg Pred Value : 0.8519          
##              Prevalence : 0.6555          
##          Detection Rate : 0.5981          
##    Detection Prevalence : 0.6124          
##       Balanced Accuracy : 0.9354          
##                                           
##        'Positive' Class : benign          
## 
matriks_kesalahan <- confusionMatrix(
  pred.tree,
  BC.test$Class,
  positive = "malignant"
)
matriks_kesalahan
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       125         3
##   malignant     12        69
##                                           
##                Accuracy : 0.9282          
##                  95% CI : (0.8844, 0.9593)
##     No Information Rate : 0.6555          
##     P-Value [Acc > NIR] : < 2e-16         
##                                           
##                   Kappa : 0.8457          
##                                           
##  Mcnemar's Test P-Value : 0.03887         
##                                           
##             Sensitivity : 0.9583          
##             Specificity : 0.9124          
##          Pos Pred Value : 0.8519          
##          Neg Pred Value : 0.9766          
##              Prevalence : 0.3445          
##          Detection Rate : 0.3301          
##    Detection Prevalence : 0.3876          
##       Balanced Accuracy : 0.9354          
##                                           
##        'Positive' Class : malignant       
## 

Evaluasi model dilakukan menggunakan confusion matrix terhadap 209 observasi pada data testing. Berdasarkan hasil klasifikasi, sebanyak 125 observasi kelas benign dan 69 observasi kelas malignant berhasil diprediksi dengan benar. Sementara itu, terdapat 15 observasi yang mengalami kesalahan klasifikasi, sehingga model mampu mengklasifikasikan 194 observasi secara tepat.

Model memperoleh akurasi sebesar 92,82%, dengan selang kepercayaan 95% antara 88,44% hingga 95,93%. Nilai tersebut lebih tinggi dibandingkan No Information Rate sebesar 65,55%, dengan p-value kurang dari 2 × 10⁻¹⁶. Selain itu, nilai Kappa sebesar 0,8457 menunjukkan tingkat kesesuaian yang tinggi antara hasil prediksi dan kelas aktual setelah memperhitungkan kesepakatan yang mungkin terjadi secara kebetulan.

Dengan menetapkan kelas malignant sebagai kelas positif, model menghasilkan sensitivitas sebesar 95,83% dan spesifisitas sebesar 91,24%. Artinya, model berhasil mengidentifikasi 69 dari 72 observasi malignant dan mengenali 125 dari 137 observasi benign dengan benar. Kesalahan klasifikasi terdiri atas 12 observasi benign yang diprediksi sebagai malignant (false positive) dan 3 observasi malignant yang diprediksi sebagai benign (false negative).

Apabila kelas benign ditetapkan sebagai kelas positif, nilai sensitivitas menjadi 91,24% dan spesifisitas sebesar 95,83%. Sementara itu, akurasi, Kappa, dan balanced accuracy sebesar 93,54% tetap sama karena tidak bergantung pada pemilihan kelas positif. Dalam konteks klasifikasi kanker payudara, penetapan kelas malignant sebagai kelas positif lebih relevan untuk menilai kemampuan model dalam mendeteksi kasus ganas, terutama untuk memperhatikan risiko kasus ganas yang salah diklasifikasikan sebagai jinak.

4.8 Penentuan CP Terbaik

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.00000 1.00000 0.062260
## 2 0.071006      1   0.20118 0.30178 0.039997
## 3 0.008000      2   0.13018 0.16568 0.030403
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
plotcp(fit.tree, upper = "splits")
Gambar 4.3 Plot Complexity Parameter (CP) terhadap cross-validation error

Gambar 4.3 Plot Complexity Parameter (CP) terhadap cross-validation error

Penentuan nilai complexity parameter (CP) terbaik dilakukan berdasarkan nilai cross-validation error (xerror) terkecil pada tabel CP. Parameter ini digunakan untuk mengendalikan kompleksitas pohon keputusan dan menjadi dasar dalam menentukan struktur pohon yang sesuai.

Berdasarkan hasil, nilai xerror mengalami penurunan dari 1,00000 pada pohon tanpa pemisahan menjadi 0,30178 pada pohon dengan satu pemisahan, kemudian turun menjadi 0,16568 pada pohon dengan dua pemisahan. Nilai xerror terkecil diperoleh pada CP sebesar 0,008 dengan nilai xstd sebesar 0,030403. Oleh karena itu, berdasarkan kriteria minimum xerror, nilai CP terbaik yang dipilih adalah 0,008.

Nilai CP tersebut sama dengan parameter yang digunakan dalam pembentukan model awal. Hal ini menunjukkan bahwa struktur pohon dengan dua pemisahan memiliki nilai galat validasi silang terendah di antara struktur yang tercantum dalam tabel CP. Dengan demikian, nilai CP sebesar 0,008 dipilih sebagai dasar untuk tahap pemangkasan (pruning) dan penentuan struktur akhir pohon keputusan.

4.9 Pruning

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

pruned.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,3 337  25 benign (0.92581602 0.07418398)  
##     4) Bare.nuclei=1,2,3 309   5 benign (0.98381877 0.01618123) *
##     5) Bare.nuclei=4,5,7,8,9,10 28   8 malignant (0.28571429 0.71428571) *
##   3) Cell.size=4,5,6,7,8,9,10 153   9 malignant (0.05882353 0.94117647) *
rpart.plot(pruned.tree)
Gambar 4.4 Struktur Classification Tree setelah pruning

Gambar 4.4 Struktur Classification Tree setelah pruning

pruned.tree$variable.importance
##       Cell.size     Bare.nuclei      Cell.shape     Bl.cromatin Normal.nucleoli 
##      158.192512      132.553593      127.507199      107.862378      104.339897 
##    Epith.c.size    Cl.thickness   Marg.adhesion 
##      103.393799        4.468579        3.574863

Pemangkasan pohon (pruning) dilakukan menggunakan fungsi prune dengan nilai CP sebesar 0,008, yang sebelumnya terpilih berdasarkan nilai cross-validation error (xerror) minimum. Setelah proses pemangkasan, struktur pohon tetap terdiri atas tiga simpul terminal dan dua pemisahan.

Hasil perbandingan menunjukkan bahwa struktur pohon, jumlah observasi pada setiap simpul, dan probabilitas kelas tidak mengalami perubahan setelah pruning. Nilai variable importance juga tetap sama seperti model awal. Hal ini menunjukkan bahwa penerapan nilai CP sebesar 0,008 tidak menghilangkan cabang pada pohon yang telah terbentuk, sehingga struktur model tetap dipertahankan.

Tidak berubahnya struktur pohon setelah pemangkasan menunjukkan bahwa berdasarkan nilai CP yang dipilih, tidak terdapat cabang yang perlu dihilangkan. Model akhir tetap memiliki struktur yang sederhana dengan dua variabel prediktor, yaitu Cell.size dan Bare.nuclei, serta tiga simpul terminal. Struktur tersebut memudahkan interpretasi aturan klasifikasi. Namun, tidak berubahnya pohon setelah pruning tidak secara langsung membuktikan bahwa model bebas dari overfitting, hal tersebut tetap perlu dinilai berdasarkan kinerja model pada data testing.

4.10 Prediksi dan Evaluasi Model Setelah Pruning

pred.prune = predict(
  pruned.tree,
  BC.test,
  type = "class"
)

table(
  pred.prune,
  Class.test
)
##            Class.test
## pred.prune  benign malignant
##   benign       125         3
##   malignant     12        69
matriks_kesalahan <- confusionMatrix(
  pred.prune,
  BC.test$Class
)
matriks_kesalahan
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       125         3
##   malignant     12        69
##                                           
##                Accuracy : 0.9282          
##                  95% CI : (0.8844, 0.9593)
##     No Information Rate : 0.6555          
##     P-Value [Acc > NIR] : < 2e-16         
##                                           
##                   Kappa : 0.8457          
##                                           
##  Mcnemar's Test P-Value : 0.03887         
##                                           
##             Sensitivity : 0.9124          
##             Specificity : 0.9583          
##          Pos Pred Value : 0.9766          
##          Neg Pred Value : 0.8519          
##              Prevalence : 0.6555          
##          Detection Rate : 0.5981          
##    Detection Prevalence : 0.6124          
##       Balanced Accuracy : 0.9354          
##                                           
##        'Positive' Class : benign          
## 
matriks_kesalahan <- confusionMatrix(
  pred.prune,
  BC.test$Class,
  positive = "malignant"
)
matriks_kesalahan
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       125         3
##   malignant     12        69
##                                           
##                Accuracy : 0.9282          
##                  95% CI : (0.8844, 0.9593)
##     No Information Rate : 0.6555          
##     P-Value [Acc > NIR] : < 2e-16         
##                                           
##                   Kappa : 0.8457          
##                                           
##  Mcnemar's Test P-Value : 0.03887         
##                                           
##             Sensitivity : 0.9583          
##             Specificity : 0.9124          
##          Pos Pred Value : 0.8519          
##          Neg Pred Value : 0.9766          
##              Prevalence : 0.3445          
##          Detection Rate : 0.3301          
##    Detection Prevalence : 0.3876          
##       Balanced Accuracy : 0.9354          
##                                           
##        'Positive' Class : malignant       
## 

Evaluasi ulang model setelah proses pruning dilakukan menggunakan confusion matrix pada 209 observasi data testing. Hasil klasifikasi menunjukkan bahwa 125 observasi benign dan 69 observasi malignant berhasil diprediksi dengan benar. Sementara itu, terdapat 12 observasi benign yang diprediksi sebagai malignant dan 3 observasi malignant yang diprediksi sebagai benign.

Berdasarkan hasil evaluasi, seluruh ukuran kinerja model setelah pruning tetap sama dengan model sebelum pruning. Akurasi sebesar 92,82%, Kappa sebesar 0,8457, sensitivitas sebesar 95,83%, spesifisitas sebesar 91,24%, dan balanced accuracy sebesar 93,54%. Jumlah simpul terminal juga tetap sebanyak tiga. Kesamaan tersebut terjadi karena proses pruning tidak mengubah struktur pohon maupun hasil klasifikasinya.

Secara keseluruhan, model akhir mampu mengklasifikasikan 92,82% observasi pada data testing dengan benar. Sensitivitas sebesar 95,83% menunjukkan bahwa model berhasil mengidentifikasi sebagian besar observasi yang termasuk kelas malignant. Namun, masih terdapat kesalahan klasifikasi berupa false positive dan false negative. Oleh karena itu, meskipun model memiliki kinerja klasifikasi yang baik berdasarkan ukuran evaluasi tersebut, penggunaannya untuk mendukung penilaian medis tetap memerlukan validasi lebih lanjut dan tidak dapat menggantikan pemeriksaan oleh tenaga kesehatan.

4.11 Evaluasi dengan ROC dan AUC

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

bc_preds_cart
##         benign  malignant predicted    actual
## 5   0.98381877 0.01618123    benign    benign
## 7   0.28571429 0.71428571 malignant    benign
## 8   0.98381877 0.01618123    benign    benign
## 9   0.98381877 0.01618123    benign    benign
## 12  0.98381877 0.01618123    benign    benign
## 13  0.98381877 0.01618123    benign malignant
## 18  0.98381877 0.01618123    benign    benign
## 23  0.98381877 0.01618123    benign    benign
## 24  0.05882353 0.94117647 malignant malignant
## 25  0.98381877 0.01618123    benign    benign
## 28  0.98381877 0.01618123    benign    benign
## 41  0.05882353 0.94117647 malignant    benign
## 45  0.05882353 0.94117647 malignant malignant
## 47  0.05882353 0.94117647 malignant malignant
## 51  0.05882353 0.94117647 malignant malignant
## 55  0.05882353 0.94117647 malignant malignant
## 59  0.28571429 0.71428571 malignant malignant
## 61  0.98381877 0.01618123    benign malignant
## 65  0.98381877 0.01618123    benign    benign
## 66  0.05882353 0.94117647 malignant malignant
## 68  0.28571429 0.71428571 malignant malignant
## 71  0.98381877 0.01618123    benign    benign
## 74  0.05882353 0.94117647 malignant malignant
## 78  0.98381877 0.01618123    benign    benign
## 79  0.98381877 0.01618123    benign    benign
## 82  0.98381877 0.01618123    benign    benign
## 83  0.98381877 0.01618123    benign    benign
## 85  0.05882353 0.94117647 malignant malignant
## 86  0.05882353 0.94117647 malignant malignant
## 87  0.28571429 0.71428571 malignant malignant
## 90  0.98381877 0.01618123    benign    benign
## 91  0.98381877 0.01618123    benign    benign
## 92  0.98381877 0.01618123    benign    benign
## 96  0.98381877 0.01618123    benign    benign
## 100 0.05882353 0.94117647 malignant malignant
## 109 0.98381877 0.01618123    benign    benign
## 111 0.98381877 0.01618123    benign    benign
## 113 0.28571429 0.71428571 malignant malignant
## 115 0.98381877 0.01618123    benign    benign
## 117 0.98381877 0.01618123    benign    benign
## 119 0.98381877 0.01618123    benign    benign
## 121 0.98381877 0.01618123    benign    benign
## 130 0.98381877 0.01618123    benign    benign
## 135 0.98381877 0.01618123    benign    benign
## 141 0.98381877 0.01618123    benign    benign
## 143 0.05882353 0.94117647 malignant malignant
## 144 0.28571429 0.71428571 malignant    benign
## 145 0.98381877 0.01618123    benign    benign
## 146 0.98381877 0.01618123    benign    benign
## 147 0.05882353 0.94117647 malignant malignant
## 148 0.98381877 0.01618123    benign    benign
## 152 0.28571429 0.71428571 malignant malignant
## 154 0.98381877 0.01618123    benign    benign
## 160 0.05882353 0.94117647 malignant malignant
## 168 0.05882353 0.94117647 malignant malignant
## 170 0.98381877 0.01618123    benign    benign
## 175 0.05882353 0.94117647 malignant malignant
## 176 0.05882353 0.94117647 malignant malignant
## 178 0.05882353 0.94117647 malignant malignant
## 194 0.98381877 0.01618123    benign    benign
## 201 0.05882353 0.94117647 malignant malignant
## 205 0.98381877 0.01618123    benign    benign
## 208 0.98381877 0.01618123    benign    benign
## 210 0.98381877 0.01618123    benign    benign
## 214 0.05882353 0.94117647 malignant malignant
## 216 0.05882353 0.94117647 malignant malignant
## 218 0.98381877 0.01618123    benign    benign
## 220 0.98381877 0.01618123    benign    benign
## 226 0.98381877 0.01618123    benign    benign
## 229 0.98381877 0.01618123    benign    benign
## 231 0.05882353 0.94117647 malignant malignant
## 234 0.05882353 0.94117647 malignant malignant
## 244 0.28571429 0.71428571 malignant    benign
## 245 0.98381877 0.01618123    benign    benign
## 250 0.98381877 0.01618123    benign    benign
## 252 0.05882353 0.94117647 malignant malignant
## 254 0.05882353 0.94117647 malignant malignant
## 255 0.05882353 0.94117647 malignant malignant
## 260 0.05882353 0.94117647 malignant    benign
## 265 0.05882353 0.94117647 malignant malignant
## 266 0.98381877 0.01618123    benign    benign
## 268 0.28571429 0.71428571 malignant malignant
## 276 0.98381877 0.01618123    benign    benign
## 279 0.98381877 0.01618123    benign    benign
## 288 0.98381877 0.01618123    benign    benign
## 295 0.98381877 0.01618123    benign    benign
## 299 0.98381877 0.01618123    benign    benign
## 300 0.28571429 0.71428571 malignant malignant
## 301 0.05882353 0.94117647 malignant malignant
## 302 0.98381877 0.01618123    benign    benign
## 310 0.28571429 0.71428571 malignant    benign
## 311 0.98381877 0.01618123    benign    benign
## 312 0.98381877 0.01618123    benign    benign
## 313 0.05882353 0.94117647 malignant malignant
## 314 0.98381877 0.01618123    benign    benign
## 316 0.05882353 0.94117647 malignant    benign
## 318 0.05882353 0.94117647 malignant malignant
## 320 0.05882353 0.94117647 malignant    benign
## 321 0.05882353 0.94117647 malignant malignant
## 325 0.98381877 0.01618123    benign    benign
## 328 0.98381877 0.01618123    benign    benign
## 335 0.05882353 0.94117647 malignant malignant
## 338 0.98381877 0.01618123    benign    benign
## 340 0.05882353 0.94117647 malignant malignant
## 341 0.28571429 0.71428571 malignant malignant
## 342 0.98381877 0.01618123    benign    benign
## 343 0.98381877 0.01618123    benign    benign
## 344 0.98381877 0.01618123    benign    benign
## 358 0.05882353 0.94117647 malignant malignant
## 360 0.28571429 0.71428571 malignant malignant
## 366 0.98381877 0.01618123    benign    benign
## 367 0.05882353 0.94117647 malignant malignant
## 369 0.98381877 0.01618123    benign    benign
## 376 0.98381877 0.01618123    benign    benign
## 378 0.98381877 0.01618123    benign    benign
## 381 0.98381877 0.01618123    benign    benign
## 384 0.98381877 0.01618123    benign    benign
## 386 0.98381877 0.01618123    benign    benign
## 388 0.98381877 0.01618123    benign    benign
## 389 0.98381877 0.01618123    benign    benign
## 391 0.98381877 0.01618123    benign    benign
## 396 0.98381877 0.01618123    benign    benign
## 399 0.98381877 0.01618123    benign    benign
## 402 0.98381877 0.01618123    benign    benign
## 405 0.98381877 0.01618123    benign    benign
## 412 0.98381877 0.01618123    benign    benign
## 413 0.05882353 0.94117647 malignant malignant
## 420 0.98381877 0.01618123    benign    benign
## 431 0.98381877 0.01618123    benign    benign
## 432 0.98381877 0.01618123    benign    benign
## 436 0.05882353 0.94117647 malignant malignant
## 442 0.28571429 0.71428571 malignant    benign
## 444 0.98381877 0.01618123    benign    benign
## 448 0.98381877 0.01618123    benign    benign
## 453 0.98381877 0.01618123    benign    benign
## 456 0.98381877 0.01618123    benign malignant
## 457 0.05882353 0.94117647 malignant malignant
## 459 0.98381877 0.01618123    benign    benign
## 461 0.98381877 0.01618123    benign    benign
## 464 0.98381877 0.01618123    benign    benign
## 465 0.98381877 0.01618123    benign    benign
## 470 0.98381877 0.01618123    benign    benign
## 474 0.98381877 0.01618123    benign    benign
## 479 0.98381877 0.01618123    benign    benign
## 483 0.05882353 0.94117647 malignant malignant
## 484 0.05882353 0.94117647 malignant malignant
## 485 0.98381877 0.01618123    benign    benign
## 489 0.05882353 0.94117647 malignant malignant
## 491 0.98381877 0.01618123    benign    benign
## 494 0.05882353 0.94117647 malignant malignant
## 498 0.98381877 0.01618123    benign    benign
## 507 0.05882353 0.94117647 malignant malignant
## 508 0.28571429 0.71428571 malignant    benign
## 510 0.98381877 0.01618123    benign    benign
## 511 0.98381877 0.01618123    benign    benign
## 512 0.98381877 0.01618123    benign    benign
## 515 0.05882353 0.94117647 malignant malignant
## 516 0.05882353 0.94117647 malignant malignant
## 519 0.98381877 0.01618123    benign    benign
## 525 0.98381877 0.01618123    benign    benign
## 526 0.98381877 0.01618123    benign    benign
## 530 0.98381877 0.01618123    benign    benign
## 531 0.05882353 0.94117647 malignant malignant
## 534 0.98381877 0.01618123    benign    benign
## 537 0.98381877 0.01618123    benign    benign
## 539 0.98381877 0.01618123    benign    benign
## 540 0.98381877 0.01618123    benign    benign
## 546 0.98381877 0.01618123    benign    benign
## 548 0.98381877 0.01618123    benign    benign
## 550 0.05882353 0.94117647 malignant malignant
## 554 0.05882353 0.94117647 malignant    benign
## 567 0.98381877 0.01618123    benign    benign
## 568 0.98381877 0.01618123    benign    benign
## 570 0.05882353 0.94117647 malignant malignant
## 571 0.05882353 0.94117647 malignant malignant
## 572 0.05882353 0.94117647 malignant malignant
## 574 0.98381877 0.01618123    benign    benign
## 576 0.98381877 0.01618123    benign    benign
## 577 0.98381877 0.01618123    benign    benign
## 578 0.98381877 0.01618123    benign    benign
## 580 0.98381877 0.01618123    benign    benign
## 588 0.98381877 0.01618123    benign    benign
## 591 0.05882353 0.94117647 malignant malignant
## 596 0.98381877 0.01618123    benign    benign
## 597 0.98381877 0.01618123    benign    benign
## 598 0.98381877 0.01618123    benign    benign
## 604 0.05882353 0.94117647 malignant malignant
## 609 0.05882353 0.94117647 malignant malignant
## 610 0.98381877 0.01618123    benign    benign
## 624 0.98381877 0.01618123    benign    benign
## 627 0.05882353 0.94117647 malignant malignant
## 628 0.28571429 0.71428571 malignant    benign
## 637 0.05882353 0.94117647 malignant malignant
## 639 0.98381877 0.01618123    benign    benign
## 646 0.98381877 0.01618123    benign    benign
## 648 0.98381877 0.01618123    benign    benign
## 649 0.05882353 0.94117647 malignant malignant
## 654 0.98381877 0.01618123    benign    benign
## 659 0.05882353 0.94117647 malignant malignant
## 662 0.98381877 0.01618123    benign    benign
## 664 0.98381877 0.01618123    benign    benign
## 669 0.05882353 0.94117647 malignant malignant
## 670 0.05882353 0.94117647 malignant malignant
## 672 0.98381877 0.01618123    benign    benign
## 678 0.98381877 0.01618123    benign    benign
## 687 0.98381877 0.01618123    benign    benign
## 692 0.05882353 0.94117647 malignant malignant
## 696 0.98381877 0.01618123    benign    benign
## 699 0.05882353 0.94117647 malignant malignant
bc_cm_cart <- confusionMatrix(
  bc_preds_cart$predicted,
  reference = bc_preds_cart$actual
)
bc_cm_cart
## Confusion Matrix and Statistics
## 
##            Reference
## Prediction  benign malignant
##   benign       125         3
##   malignant     12        69
##                                           
##                Accuracy : 0.9282          
##                  95% CI : (0.8844, 0.9593)
##     No Information Rate : 0.6555          
##     P-Value [Acc > NIR] : < 2e-16         
##                                           
##                   Kappa : 0.8457          
##                                           
##  Mcnemar's Test P-Value : 0.03887         
##                                           
##             Sensitivity : 0.9124          
##             Specificity : 0.9583          
##          Pos Pred Value : 0.9766          
##          Neg Pred Value : 0.8519          
##              Prevalence : 0.6555          
##          Detection Rate : 0.5981          
##    Detection Prevalence : 0.6124          
##       Balanced Accuracy : 0.9354          
##                                           
##        'Positive' Class : benign          
## 
library(yardstick)

mdl_auc <- Metrics::auc(
  actual =
    bc_preds_cart$actual == "benign",
  bc_preds_cart$benign
)
mdl_auc
## [1] 0.9543796
yardstick::roc_curve(
  bc_preds_cart,
  actual,
  benign
) %>%
  autoplot() +
  labs(
    title = "ROC Curve",
    subtitle =
      paste0(
        "AUC = ",
        round(mdl_auc, 4)
      )
  )
Gambar 4.5 Kurva ROC model Classification Tree setelah pruning (AUC = 0,9544)

Gambar 4.5 Kurva ROC model Classification Tree setelah pruning (AUC = 0,9544)

Evaluasi model dilakukan menggunakan confusion matrix, kurva Receiver Operating Characteristic (ROC), dan nilai Area Under the Curve (AUC). Kurva ROC dibentuk berdasarkan probabilitas prediksi kelas benign pada data testing, sehingga kelas benign ditetapkan sebagai kelas positif. Kurva ini menggambarkan hubungan antara sensitivitas (true positive rate) dan tingkat positif palsu (false positive rate) pada berbagai nilai ambang probabilitas.

Hasil evaluasi menunjukkan bahwa nilai AUC yang diperoleh sebesar 0,9544. Nilai tersebut mendekati 1, yang menunjukkan bahwa model memiliki kemampuan diskriminasi yang sangat baik dalam membedakan kelas benign dan malignant. Dengan kata lain, terdapat peluang sekitar 95,44% bahwa model memberikan skor probabilitas benign yang lebih tinggi kepada satu observasi benign dibandingkan satu observasi malignant yang dipilih secara acak.

Kurva ROC yang terbentuk memiliki pola bersudut dengan jumlah titik yang relatif sedikit. Hal ini berkaitan dengan struktur pohon keputusan yang hanya memiliki tiga simpul terminal, sehingga menghasilkan tiga nilai probabilitas prediksi yang berbeda, yaitu 0,9838, 0,2857, dan 0,0588. Observasi yang berada pada simpul terminal yang sama memperoleh nilai probabilitas prediksi yang identik, sehingga jumlah titik pada kurva ROC menjadi terbatas.

Secara keseluruhan, hasil confusion matrix dengan akurasi sebesar 92,82% dan nilai AUC sebesar 0,9544 menunjukkan bahwa model Classification Tree menggunakan algoritma CART memiliki kinerja klasifikasi yang baik pada dataset BreastCancer. Variabel Cell.size dan Bare.nuclei menjadi prediktor yang digunakan dalam struktur pohon akhir. Namun, hasil tersebut perlu diinterpretasikan berdasarkan pembagian data dengan seed 46 dan tidak secara langsung menjamin kinerja yang sama pada data lain. Selain itu, model ini merupakan model klasifikasi untuk keperluan analisis data, bukan pengganti diagnosis medis.

BAB V PENUTUP

5.1 Kesimpulan

Decision Tree merupakan metode klasifikasi yang menyajikan proses pengambilan keputusan dalam bentuk struktur pohon sehingga mudah dipahami dan diinterpretasikan. Algoritma CART (Classification and Regression Trees) membentuk pohon keputusan melalui pemisahan data secara biner berdasarkan variabel yang paling optimal. Dalam klasifikasi, CART dapat digunakan untuk mengelompokkan data ke dalam kelas tertentu dengan mempertimbangkan karakteristik variabel prediktor.

Pembangunan Classification Tree dengan algoritma CART dilakukan melalui beberapa tahapan, mulai dari persiapan dan pembersihan data, pembentukan pohon, penentuan pemisahan terbaik, hingga evaluasi dan pemangkasan pohon (pruning). Pemisahan dapat ditentukan menggunakan indeks Gini untuk memperoleh kelompok yang lebih homogen. Evaluasi model dapat dilakukan menggunakan confusion matrix, kurva ROC, dan nilai AUC untuk mengetahui kemampuan klasifikasi. Dengan tahapan tersebut, CART dapat menghasilkan model klasifikasi yang sistematis, mudah diinterpretasikan, dan sesuai dengan karakteristik data.

Berdasarkan hasil analisis, metode Decision Tree menggunakan algoritma CART berhasil membentuk model klasifikasi kondisi kanker payudara pada dataset BreastCancer yang terdiri atas 699 amatan. Penanganan missing value dilakukan menggunakan metode imputasi mice, kemudian data dibagi menjadi 490 amatan data training dan 209 amatan data testing. Model yang terbentuk menggunakan dua variabel prediktor utama, yaitu Cell.size dan Bare.nuclei, dengan tiga simpul terminal dan dua pemisahan. Berdasarkan analisis variable importance, Cell.size memiliki nilai kepentingan tertinggi sebesar 158,19. Penentuan CP terbaik menghasilkan nilai 0,008, dan proses pruning tidak mengubah struktur maupun kinerja model. Evaluasi pada data testing menunjukkan akurasi sebesar 92,82%, nilai Kappa 0,8457, sensitivitas kelas malignant 95,83%, spesifisitas 91,24%, balanced accuracy 93,54%, dan AUC sebesar 0,9544. Hasil tersebut menunjukkan bahwa model CART memiliki kemampuan klasifikasi dan diskriminasi yang sangat baik pada data yang dianalisis serta menghasilkan aturan keputusan yang relatif sederhana dan mudah diinterpretasikan.

5.2 Saran

Laporan praktikum ini menggunakan pemrograman R dalam proses analisis klasifikasi menggunakan metode Decision Tree dengan algoritma CART. Oleh karena itu, diperlukan pemahaman terhadap sintaks yang digunakan agar program dapat dijalankan dengan baik dan meminimalkan terjadinya error. Selain itu, penting untuk memahami konsep dasar metode CART, tahapan pembentukan pohon keputusan, serta metode evaluasi yang digunakan untuk mengetahui tingkat ketepatan dan kinerja model klasifikasi.

DAFTAR PUSTAKA

Agwil, W., Agustina, D., Fransiska, H., & Hidayati, N. (2022). Klasifikasi Karakteristik Kemiskinan di Provinsi Bengkulu Tahun 2020 Menggunakan Metode Pohon Klasifikasi Gabungan. Jurnal Aplikasi Statistika & Komputasi Statistik, 14(2), 23–32.

Biyantoro, A. S., & Prasetiyo, B. (2024). Penerapan Decision Tree untuk Klasifikasi Status Kesehatan dengan perbandingan KNN dan Naive Bayes. 4(1), 47–55.

Dj, S. P., & Achmad, A. I. (2020). Metode Classification And Regression Trees untuk Pengklasifikasian Faktor-Faktor yang Mempengaruhi Pengangguran Terbuka di Provinsi Jawa Barat Tahun 2020. 35–43.

Farikhi, F. Al, & Pramono, R. W. D. (2023). Perbandingan Algoritma Classification and Regression Tree ( CART ) dan Random Forest ( RF ) untuk Klasifikasi Penggunaan Lahan pada Google Earth Engine.

Fransiska, H. (2026). Modul Praktikum Machine Learning and Modern Prediction. Bengkulu: Laboratorium Matematika Fakultas Matematika dan Ilmu Pengetahuan Alam Universitas Bengkulu.

Saputra, S. N., Christanto, F. W., Firdaus, E. A., & Ama, A. U. T. (2026). Model Klasifikasi Tweet Bencana Alam Gunung Meletus Menggunakan Algoritma Long Short-Term Memory. 5(2), 250–263.