Perkembangan teknologi informasi menyebabkan peningkatan jumlah data yang dihasilkan dari berbagai bidang. Data tersebut dapat dimanfaatkan untuk memperoleh informasi dan menemukan pola yang berguna dalam mendukung proses pengambilan keputusan. Salah satu teknik yang dapat digunakan untuk mengolah data adalah data mining, yaitu proses menemukan pola atau informasi yang bermanfaat dari sekumpulan data. Data mining dapat digunakan untuk berbagai keperluan, seperti klasifikasi, estimasi, prediksi, asosiasi dan klasterisasi. Salah satu metode klasifikasi yang banyak digunakan adalah Decision Tree atau pohon keputusan (Setio, Saputro dan Winarno, 2020).
Decision Tree merupakan metode pembelajaran mesin yang merepresentasikan proses pengambilan keputusan dalam bentuk struktur pohon. Struktur tersebut terdiri atas simpul akar (root node), simpul keputusan (internal node), cabang (branch) dan simpul daun (leaf node). Setiap simpul keputusan menunjukkan pengujian terhadap atribut tertentu, sedangkan simpul daun menunjukkan hasil klasifikasi atau keputusan yang diperoleh. Melalui struktur tersebut, data dapat diklasifikasikan berdasarkan serangkaian aturan yang terbentuk dari atribut-atribut yang tersedia (Chair, Nasution dan Rizki, 2017).
Metode Decision Tree memiliki keunggulan berupa struktur model yang relatif mudah dipahami dan hasil klasifikasi yang dapat disajikan dalam bentuk aturan keputusan. Salah satu algoritma yang digunakan untuk membangun pohon keputusan adalah C4.5. Algoritma ini menentukan atribut pemisah berdasarkan kriteria tertentu, seperti information gain, yang berkaitan dengan perubahan nilai entropi setelah data dibagi ke dalam kelompok-kelompok tertentu. Pemilihan atribut dilakukan secara bertahap hingga terbentuk struktur pohon yang dapat digunakan untuk mengklasifikasikan data baru (Setio, Saputro dan Winarno, 2020).
Berdasarkan latar belakang diatas, rumusan masalah penelitian ini yaitu:
Berdasarkan rumusan masalah diatas, tujuan dari penelitian ini yaitu:
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. 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).
Classification and Regression Tree (CART) merupakan algoritma yang digunakan untuk membentuk pohon keputusan dalam permasalahan klasifikasi maupun regresi. Klasifikasi digunakan ketika variabel respons berupa kategori, sedangkan regresi digunakan ketika variabel respons berupa nilai numerik. CART membentuk pohon melalui proses pemisahan data secara bertahap berdasarkan atribut prediktor sehingga terbentuk kelompok data yang semakin sesuai dengan tujuan pemodelan. Pada kasus klasifikasi, CART umumnya menggunakan pemisahan biner, yaitu setiap simpul keputusan dibagi menjadi dua cabang. Salah satu kriteria yang dapat digunakan untuk menentukan pemisahan terbaik adalah indeks Gini. Pemisahan dipilih berdasarkan kemampuannya mengurangi ketidakmurnian (impurity) kelas pada simpul hasil pemisahan. Semakin kecil nilai indeks Gini, semakin homogen kelas yang terdapat dalam simpul tersebut (Hasanah, Soim dan Handayani, 2021).
Jenis data yang digunakan dalam penelitian ini berupa data kuantitatif. Sumber data yang digunakan dalam penelitian ini adalah data sekunder. Data sekunder adalah sumber data yang diperoleh secara tidak langsung melalui perantara (diperoleh dan dicatat oleh pihak lain). Pada penelitian ini data sekunder yang dimaksud adalah data yang diperoleh dari dataset program R, yaitu dataset BreastCancer.
Variabel penelitian adalah suatu atribut atau sifat atau nilai dari orang, objek, organisasi, atau kegiatan yang mempunyai variasi tertentu yang ditetapkan oleh peneliti untuk dipelajari dan kemudian ditarik kesimpulannya. Pada penelitian ini menggunakan sepuluh variabel. Variabel tersebut adalah Cl.thickness, Cell.size, Cell.shape, Marg.adhesion, Epith.c.size, Bare.nuclei, Bl.cromatin, Normal.nucleoli, Mitoses dan Class.
Algoritma batasan masalah adalah sebagai berikut:
# Memanggil package
library(mlbench)
library(mice)
##
## Attaching package: 'mice'
## The following object is masked from 'package:stats':
##
## filter
## The following objects are masked from 'package:base':
##
## cbind, rbind
library(rpart)
library(rpart.plot)
library(caret)
## Loading required package: ggplot2
## Loading required package: lattice
library(pROC)
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
library(ggplot2)
library(knitr)
# Mengatur seed agar hasil dapat direproduksi
set.seed(123)
# Memanggil dataset BreastCancer
data("BreastCancer")
# Melihat struktur data
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 ...
# Melihat enam baris pertama
head(BreastCancer)
## Id Cl.thickness Cell.size Cell.shape Marg.adhesion Epith.c.size
## 1 1000025 5 1 1 1 2
## 2 1002945 5 4 4 5 7
## 3 1015425 3 1 1 1 2
## 4 1016277 6 8 8 1 3
## 5 1017023 4 1 1 3 2
## 6 1017122 8 10 10 8 7
## Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses Class
## 1 1 3 1 1 benign
## 2 10 3 2 1 benign
## 3 2 3 1 1 benign
## 4 4 3 7 1 benign
## 5 1 3 1 1 benign
## 6 10 9 7 1 malignant
# Melihat dimensi dataset
dim(BreastCancer)
## [1] 699 11
# Melihat ringkasan data
summary(BreastCancer)
## Id Cl.thickness Cell.size Cell.shape Marg.adhesion
## Length:699 1 :145 1 :384 1 :353 1 :407
## Class :character 5 :130 10 : 67 2 : 59 2 : 58
## Mode :character 3 :108 3 : 52 10 : 58 3 : 58
## 4 : 80 2 : 45 3 : 56 10 : 55
## 10 : 69 4 : 40 4 : 44 4 : 33
## 2 : 50 5 : 30 5 : 34 8 : 25
## (Other):117 (Other): 81 (Other): 95 (Other): 63
## Epith.c.size Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses
## 2 :386 1 :402 2 :166 1 :443 1 :579
## 3 : 72 10 :132 3 :165 10 : 61 2 : 35
## 4 : 48 2 : 30 1 :152 3 : 44 3 : 33
## 1 : 47 5 : 30 7 : 73 2 : 36 10 : 14
## 6 : 41 3 : 28 4 : 40 8 : 24 4 : 12
## 5 : 39 (Other): 61 5 : 34 6 : 22 7 : 9
## (Other): 66 NA's : 16 (Other): 69 (Other): 69 (Other): 17
## Class
## benign :458
## malignant:241
##
##
##
##
##
Dataset BreastCancer terdiri dari 699 observasi dan 11 variabel, yaitu satu variabel identitas, sembilan variabel prediktor, dan satu variabel target Class. Variabel target terdiri dari 458 data benign dan 241 data malignant.
# Menghitung jumlah missing value setiap variabel
colSums(is.na(BreastCancer))
## Id Cl.thickness Cell.size Cell.shape Marg.adhesion
## 0 0 0 0 0
## Epith.c.size Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses
## 0 16 0 0 0
## Class
## 0
# Menghitung total missing value
sum(is.na(BreastCancer))
## [1] 16
# Menghitung persentase missing value setiap variabel
round(colMeans(is.na(BreastCancer)) * 100, 2)
## Id Cl.thickness Cell.size Cell.shape Marg.adhesion
## 0.00 0.00 0.00 0.00 0.00
## Epith.c.size Bare.nuclei Bl.cromatin Normal.nucleoli Mitoses
## 0.00 2.29 0.00 0.00 0.00
## Class
## 0.00
# Memeriksa missing value pada variabel target
sum(is.na(BreastCancer$Class))
## [1] 0
Terdapat 16 missing value pada variabel Bare.nuclei. Sementara itu, variabel lainnya termasuk variabel target Class tidak memiliki missing value.
# Menghapus variabel Id
data_bc <- BreastCancer[, -1]
# Mengubah variabel prediktor menjadi numerik
prediktor <- setdiff(names(data_bc), "Class")
data_bc[prediktor] <- lapply(
data_bc[prediktor],
function(x) as.numeric(as.character(x))
)
# Mempertahankan target sebagai faktor
data_bc$Class <- factor(
data_bc$Class,
levels = c("benign", "malignant")
)
# Memeriksa struktur data setelah preprocessing
str(data_bc)
## '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 ...
# Memeriksa missing value kembali
colSums(is.na(data_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
# Memeriksa distribusi kelas
table(data_bc$Class)
##
## benign malignant
## 458 241
# Menentukan metode imputasi untuk setiap variabel
metode <- mice::make.method(data_bc)
# Imputasi predictive mean matching untuk prediktor numerik
metode[prediktor] <- "pmm"
# Variabel target tidak diimputasi
metode["Class"] <- ""
# Menjalankan multiple imputation menggunakan MICE
set.seed(123)
hasil_mice <- mice(
data_bc,
m = 5,
maxit = 5,
method = metode,
seed = 123,
printFlag = FALSE
)
# Mengambil dataset hasil imputasi pertama
data_bc_imputasi <- complete(hasil_mice, 1)
# Memeriksa missing value setelah imputasi
colSums(is.na(data_bc_imputasi))
## 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
# Melihat ringkasan data setelah imputasi
summary(data_bc_imputasi)
## Cl.thickness Cell.size Cell.shape Marg.adhesion
## Min. : 1.000 Min. : 1.000 Min. : 1.000 Min. : 1.000
## 1st Qu.: 2.000 1st Qu.: 1.000 1st Qu.: 1.000 1st Qu.: 1.000
## Median : 4.000 Median : 1.000 Median : 1.000 Median : 1.000
## Mean : 4.418 Mean : 3.134 Mean : 3.207 Mean : 2.807
## 3rd Qu.: 6.000 3rd Qu.: 5.000 3rd Qu.: 5.000 3rd Qu.: 4.000
## Max. :10.000 Max. :10.000 Max. :10.000 Max. :10.000
## Epith.c.size Bare.nuclei Bl.cromatin Normal.nucleoli
## Min. : 1.000 Min. : 1.000 Min. : 1.000 Min. : 1.000
## 1st Qu.: 2.000 1st Qu.: 1.000 1st Qu.: 2.000 1st Qu.: 1.000
## Median : 2.000 Median : 1.000 Median : 3.000 Median : 1.000
## Mean : 3.216 Mean : 3.514 Mean : 3.438 Mean : 2.867
## 3rd Qu.: 4.000 3rd Qu.: 5.500 3rd Qu.: 5.000 3rd Qu.: 4.000
## Max. :10.000 Max. :10.000 Max. :10.000 Max. :10.000
## Mitoses Class
## Min. : 1.000 benign :458
## 1st Qu.: 1.000 malignant:241
## Median : 1.000
## Mean : 1.589
## 3rd Qu.: 1.000
## Max. :10.000
Berdasarkan hasil preprocessing, variabel Id dihapus karena hanya berfungsi sebagai identitas, sehingga tersisa 10 variabel yang terdiri dari sembilan prediktor dan satu variabel target Class. Penanganan missing value menggunakan metode MICE dengan predictive mean matching (PMM) berhasil mengatasi 16 data hilang pada variabel Bare.nuclei. Hasil penanganan menunjukkan, seluruh variabel sudah tidak memiliki missing value. Distribusi kelas tetap terdiri dari 458 data benign dan 241 data malignant, sehingga data siap digunakan untuk tahap pemodelan Decision Tree.
set.seed(123)
# Membagi data secara stratified
indeks_train <- createDataPartition(
data_bc_imputasi$Class,
p = 0.80,
list = FALSE
)
# Data training
train_data <- data_bc_imputasi[indeks_train, ]
# Data testing
test_data <- data_bc_imputasi[-indeks_train, ]
# Melihat dimensi data
dim(train_data)
## [1] 560 10
dim(test_data)
## [1] 139 10
# Memeriksa distribusi kelas pada data training
prop.table(table(train_data$Class))
##
## benign malignant
## 0.6553571 0.3446429
# Memeriksa distribusi kelas pada data testing
prop.table(table(test_data$Class))
##
## benign malignant
## 0.6546763 0.3453237
Berdasarkan hasil pembagian data menggunakan stratified splitting dengan proporsi 80:20, diperoleh 560 observasi data training dan 139 observasi data testing. Proporsi kelas benign dan malignant pada kedua data relatif sama, yaitu sekitar 65,5% dan 34,5%. Hal ini menunjukkan bahwa pembagian data berhasil mempertahankan proporsi kelas sehingga kedua data dapat digunakan untuk membangun dan mengevaluasi model Decision Tree.
# Membangun model Decision Tree
model_tree <- rpart(
Class ~ .,
data = train_data,
method = "class",
control = rpart.control(
cp = 0.001,
minsplit = 20,
minbucket = 7,
xval = 10
)
)
# Menampilkan ringkasan model
print(model_tree)
## n= 560
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 560 193 benign (0.65535714 0.34464286)
## 2) Cell.size< 2.5 347 11 benign (0.96829971 0.03170029)
## 4) Bare.nuclei< 5.5 340 5 benign (0.98529412 0.01470588) *
## 5) Bare.nuclei>=5.5 7 1 malignant (0.14285714 0.85714286) *
## 3) Cell.size>=2.5 213 31 malignant (0.14553991 0.85446009)
## 6) Cell.shape< 2.5 19 5 benign (0.73684211 0.26315789) *
## 7) Cell.shape>=2.5 194 17 malignant (0.08762887 0.91237113)
## 14) Bl.cromatin< 4.5 75 15 malignant (0.20000000 0.80000000)
## 28) Cl.thickness< 6.5 35 14 malignant (0.40000000 0.60000000)
## 56) Marg.adhesion< 5.5 26 13 benign (0.50000000 0.50000000)
## 112) Bl.cromatin< 3.5 15 5 benign (0.66666667 0.33333333) *
## 113) Bl.cromatin>=3.5 11 3 malignant (0.27272727 0.72727273) *
## 57) Marg.adhesion>=5.5 9 1 malignant (0.11111111 0.88888889) *
## 29) Cl.thickness>=6.5 40 1 malignant (0.02500000 0.97500000) *
## 15) Bl.cromatin>=4.5 119 2 malignant (0.01680672 0.98319328) *
# Menampilkan tabel kompleksitas
printcp(model_tree)
##
## Classification tree:
## rpart(formula = Class ~ ., data = train_data, method = "class",
## control = rpart.control(cp = 0.001, minsplit = 20, minbucket = 7,
## xval = 10))
##
## Variables actually used in tree construction:
## [1] Bare.nuclei Bl.cromatin Cell.shape Cell.size Cl.thickness
## [6] Marg.adhesion
##
## Root node error: 193/560 = 0.34464
##
## n= 560
##
## CP nsplit rel error xerror xstd
## 1 0.7823834 0 1.00000 1.00000 0.058272
## 2 0.0466321 1 0.21762 0.21762 0.032295
## 3 0.0259067 2 0.17098 0.18653 0.030072
## 4 0.0064767 3 0.14508 0.15544 0.027609
## 5 0.0010000 7 0.11917 0.17617 0.029281
Berdasarkan hasil pembentukan model Decision Tree menggunakan algoritma CART pada 560 data training, diperoleh pohon klasifikasi yang menggunakan enam variabel prediktor, yaitu Cell.size, Bare.nuclei, Cell.shape, Bl.cromatin, Cl.thickness dan Marg.adhesion. Variabel Cell.size menjadi pemisah pertama pada root node, sehingga berperan penting dalam membedakan kelas benign dan malignant. Hasil pembagian menunjukkan bahwa data dengan Cell.size < 2,5 sebagian besar diklasifikasikan sebagai benign, sedangkan data dengan Cell.size >= 2,5 sebagian besar diklasifikasikan sebagai malignant.
Berdasarkan tabel kompleksitas, nilai cross-validation error terkecil adalah 0,15544 pada CP = 0,0064767 dengan tiga pemisahan (nsplit). Nilai tersebut menunjukkan bahwa model dengan kompleksitas tersebut memiliki kesalahan validasi silang paling rendah di antara pilihan yang ditampilkan. Oleh karena itu, nilai CP = 0,0064767 dapat dipilih untuk proses pruning pohon agar model menjadi lebih sederhana dengan tetap mempertahankan kemampuan klasifikasinya.
rpart.plot::rpart.plot(
model_tree,
type = 3,
extra = 104,
fallen.leaves = TRUE,
main = "Classification Tree Kanker Payudara"
)
Pohon klasifikasi menunjukkan bahwa variabel Cell.size,
Bare.nuclei, Cell.shape, Bl.cromatin,
Cl.thickness dan Marg.adhesion digunakan untuk
mengklasifikasikan kanker payudara ke dalam kelas benign dan
malignant. Variabel Cell.size menjadi pemisah utama
pada akar pohon. Data dengan Cell.size < 2,5 dan
Bare.nuclei < 5,5 cenderung diklasifikasikan sebagai
benign. Sebaliknya, data dengan Cell.size ≥ 2,5
sebagian besar diklasifikasikan sebagai malignant.
# Mengambil nilai variable importance
importance <- model_tree$variable.importance
# Mengurutkan importance dari terbesar ke terkecil
importance <- sort(importance, decreasing = TRUE)
# Menampilkan nilai variable importance
importance
## Cell.size Cell.shape Bare.nuclei Epith.c.size Bl.cromatin
## 181.084668 158.239385 130.888305 128.794351 127.183265
## Normal.nucleoli Cl.thickness Marg.adhesion Mitoses
## 121.403654 9.157423 2.792062 2.174691
# Membuat data frame untuk visualisasi
importance_df <- data.frame(
Variabel = names(importance),
Importance = as.numeric(importance)
)
# Visualisasi variable importance
ggplot(
importance_df,
aes(
x = reorder(Variabel, Importance),
y = Importance
)
) +
geom_col(fill = "steelblue") +
coord_flip() +
labs(
title = "Variable Importance Classification Tree",
x = "Variabel Prediktor",
y = "Variable Importance"
) +
theme_minimal()
Berdasarkan hasil variable importance dan grafik Variable
Importance Classification Tree, variabel Cell.size
memiliki tingkat kepentingan tertinggi sebesar 181,084668, diikuti oleh
Cell.shape sebesar 158,24 dan Bare.nuclei sebesar 130,888305.
Variabel Epith.c.size, Bl.cromatin dan
Normal.nucleoli juga memiliki kontribusi yang cukup besar dalam
klasifikasi kanker payudara. Sementara itu, Cl.thickness,
Marg.adhesion dan Mitoses memiliki tingkat kepentingan
yang relatif rendah. Hasil ini menunjukkan bahwa Cell.size dan
Cell.shape merupakan variabel yang paling berperan dalam
klasifikasi kanker payudara pada model Decision Tree.
# Prediksi kelas pada data testing
prediksi_awal <- predict(
model_tree,
newdata = test_data,
type = "class"
)
# Prediksi probabilitas setiap kelas
prob_awal <- predict(
model_tree,
newdata = test_data,
type = "prob"
)
# Confusion matrix model awal
cm_awal <- confusionMatrix(
data = factor(prediksi_awal, levels = levels(test_data$Class)),
reference = test_data$Class,
positive = "malignant"
)
cm_awal
## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 86 1
## malignant 5 47
##
## Accuracy : 0.9568
## 95% CI : (0.9084, 0.984)
## No Information Rate : 0.6547
## P-Value [Acc > NIR] : <2e-16
##
## Kappa : 0.9064
##
## Mcnemar's Test P-Value : 0.2207
##
## Sensitivity : 0.9792
## Specificity : 0.9451
## Pos Pred Value : 0.9038
## Neg Pred Value : 0.9885
## Prevalence : 0.3453
## Detection Rate : 0.3381
## Detection Prevalence : 0.3741
## Balanced Accuracy : 0.9621
##
## 'Positive' Class : malignant
##
Berdasarkan hasil confusion matrix pada data testing, model Decision Tree memperoleh nilai akurasi sebesar 95,68%, yang menunjukkan bahwa model mampu mengklasifikasikan sebagian besar data dengan benar. Dari 139 data testing, sebanyak 86 data benign dan 47 data malignant berhasil diklasifikasikan dengan benar, sedangkan 6 data mengalami kesalahan klasifikasi. Nilai sensitivity sebesar 97,92% menunjukkan bahwa model mampu mengenali kelas malignant dengan sangat baik, sementara specificity sebesar 94,51% menunjukkan kemampuan model dalam mengenali kelas benign. Selain itu, nilai Kappa sebesar 0,9064 menunjukkan tingkat kesesuaian klasifikasi yang sangat tinggi.
# Menampilkan tabel CP
printcp(model_tree)
##
## Classification tree:
## rpart(formula = Class ~ ., data = train_data, method = "class",
## control = rpart.control(cp = 0.001, minsplit = 20, minbucket = 7,
## xval = 10))
##
## Variables actually used in tree construction:
## [1] Bare.nuclei Bl.cromatin Cell.shape Cell.size Cl.thickness
## [6] Marg.adhesion
##
## Root node error: 193/560 = 0.34464
##
## n= 560
##
## CP nsplit rel error xerror xstd
## 1 0.7823834 0 1.00000 1.00000 0.058272
## 2 0.0466321 1 0.21762 0.21762 0.032295
## 3 0.0259067 2 0.17098 0.18653 0.030072
## 4 0.0064767 3 0.14508 0.15544 0.027609
## 5 0.0010000 7 0.11917 0.17617 0.029281
# Visualisasi hubungan CP dengan cross-validation error
plotcp(model_tree)
# Mengambil tabel kompleksitas
tabel_cp <- model_tree$cptable
# Menentukan baris dengan xerror terkecil
indeks_cp <- which.min(tabel_cp[, "xerror"])
# Mengambil nilai CP terbaik
cp_terbaik <- tabel_cp[indeks_cp, "CP"]
# Menampilkan CP terbaik
cat("CP terbaik =", cp_terbaik, "\n")
## CP terbaik = 0.006476684
# Menampilkan informasi model pada CP terbaik
tabel_cp[indeks_cp, ]
## CP nsplit rel error xerror xstd
## 0.006476684 3.000000000 0.145077720 0.155440415 0.027608781
Berdasarkan tabel kompleksitas (complexity parameter), nilai CP terbaik sebesar 0,006476684 diperoleh dari nilai cross-validation error (xerror) terkecil, yaitu 0,15544, dengan jumlah pemisahan (nsplit) sebanyak 3. Nilai ini menunjukkan bahwa model dengan tiga pemisahan memiliki tingkat kesalahan validasi silang paling rendah dibandingkan pilihan lainnya pada tabel. Oleh karena itu, nilai CP tersebut digunakan untuk melakukan pruning agar model Decision Tree menjadi lebih sederhana dengan tetap mempertahankan kemampuan klasifikasinya.
# Melakukan pruning
model_pruned <- prune(
model_tree,
cp = cp_terbaik
)
# Melihat ringkasan model setelah pruning
print(model_pruned)
## n= 560
##
## node), split, n, loss, yval, (yprob)
## * denotes terminal node
##
## 1) root 560 193 benign (0.65535714 0.34464286)
## 2) Cell.size< 2.5 347 11 benign (0.96829971 0.03170029)
## 4) Bare.nuclei< 5.5 340 5 benign (0.98529412 0.01470588) *
## 5) Bare.nuclei>=5.5 7 1 malignant (0.14285714 0.85714286) *
## 3) Cell.size>=2.5 213 31 malignant (0.14553991 0.85446009)
## 6) Cell.shape< 2.5 19 5 benign (0.73684211 0.26315789) *
## 7) Cell.shape>=2.5 194 17 malignant (0.08762887 0.91237113) *
# Visualisasi pohon setelah pruning
rpart.plot(
model_pruned,
type = 3,
extra = 104,
fallen.leaves = TRUE,
box.palette = "GnBu",
shadow.col = "gray",
nn = TRUE,
main = "Classification Tree Setelah Pruning"
)
# Membandingkan kompleksitas pohon
cat(
"Jumlah split model awal:",
sum(model_tree$frame$var != "<leaf>"),
"\n"
)
## Jumlah split model awal: 7
cat(
"Jumlah split model pruning:",
sum(model_pruned$frame$var != "<leaf>"),
"\n"
)
## Jumlah split model pruning: 3
Berdasarkan hasil pruning, model Decision Tree mengalami penyederhanaan dari 7 pemisahan (split) pada model awal menjadi 3 pemisahan pada model setelah pruning. Pohon hasil pruning menggunakan tiga variabel, yaitu Cell.size, Bare.nuclei dan Cell.shape untuk mengklasifikasikan kanker payudara ke dalam kelas benign dan malignant. Data dengan Cell.size < 2,5 dan Bare.nuclei < 5,5 sebagian besar diklasifikasikan sebagai benign, sedangkan data dengan Cell.size ≥ 2,5 dan Cell.shape ≥ 2,5 sebagian besar diklasifikasikan sebagai malignant. Kinerja model setelah pruning perlu dievaluasi menggunakan confusion matrix dan nilai AUC untuk mengetahui apakah penyederhanaan tersebut tetap mempertahankan kemampuan klasifikasi model.
# Prediksi kelas setelah pruning
prediksi_pruned <- predict(
model_pruned,
newdata = test_data,
type = "class"
)
# Prediksi probabilitas setelah pruning
prob_pruned <- predict(
model_pruned,
newdata = test_data,
type = "prob"
)
# Confusion matrix setelah pruning
cm_pruned <- confusionMatrix(
data = factor(
prediksi_pruned,
levels = levels(test_data$Class)
),
reference = test_data$Class,
positive = "malignant"
)
cm_pruned
## Confusion Matrix and Statistics
##
## Reference
## Prediction benign malignant
## benign 84 0
## malignant 7 48
##
## Accuracy : 0.9496
## 95% CI : (0.899, 0.9795)
## No Information Rate : 0.6547
## P-Value [Acc > NIR] : < 2e-16
##
## Kappa : 0.8923
##
## Mcnemar's Test P-Value : 0.02334
##
## Sensitivity : 1.0000
## Specificity : 0.9231
## Pos Pred Value : 0.8727
## Neg Pred Value : 1.0000
## Prevalence : 0.3453
## Detection Rate : 0.3453
## Detection Prevalence : 0.3957
## Balanced Accuracy : 0.9615
##
## 'Positive' Class : malignant
##
Berdasarkan hasil confusion matrix setelah pruning, model Decision Tree memperoleh nilai akurasi sebesar 94,96%. Dari 139 data testing, sebanyak 84 data benign dan 48 data malignant berhasil diklasifikasikan dengan benar, sedangkan 7 data mengalami kesalahan klasifikasi. Nilai sensitivity sebesar 100% menunjukkan bahwa model mampu mengenali seluruh data kelas malignant dengan benar. Sementara itu, nilai specificity sebesar 92,31% menunjukkan bahwa model mampu mengenali sebagian besar data kelas benign. Nilai Kappa sebesar 0,8923 juga menunjukkan tingkat kesesuaian klasifikasi yang sangat tinggi. Dengan demikian, model setelah pruning memiliki kinerja klasifikasi yang sangat baik, terutama dalam mendeteksi kelas malignant, meskipun akurasinya sedikit lebih rendah dibandingkan model awal.
# Memanggil package
library(pROC)
library(ggplot2)
# Membentuk kurva ROC model awal
roc_awal <- pROC::roc(
response = test_data$Class,
predictor = prob_awal[, "malignant"],
levels = c("benign", "malignant"),
direction = "<",
quiet = TRUE
)
# Membentuk kurva ROC model setelah pruning
roc_pruned <- pROC::roc(
response = test_data$Class,
predictor = prob_pruned[, "malignant"],
levels = c("benign", "malignant"),
direction = "<",
quiet = TRUE
)
# Menghitung nilai AUC
auc_awal <- as.numeric(pROC::auc(roc_awal))
auc_pruned <- as.numeric(pROC::auc(roc_pruned))
# Menampilkan nilai AUC
cat("AUC model awal =", round(auc_awal, 4), "\n")
## AUC model awal = 0.9765
cat("AUC model pruning =", round(auc_pruned, 4), "\n")
## AUC model pruning = 0.9662
# Menyiapkan data untuk visualisasi ROC
data_roc_awal <- data.frame(
FPR = 1 - roc_awal$specificities,
TPR = roc_awal$sensitivities,
Model = "Model Awal"
)
data_roc_pruned <- data.frame(
FPR = 1 - roc_pruned$specificities,
TPR = roc_pruned$sensitivities,
Model = "Model Pruning"
)
data_roc <- rbind(data_roc_awal, data_roc_pruned)
# Visualisasi perbandingan kurva ROC
grafik_roc <- ggplot(
data_roc,
aes(x = FPR, y = TPR, color = Model)
) +
geom_line(linewidth = 1.2) +
geom_abline(
intercept = 0,
slope = 1,
linetype = "dashed",
color = "gray"
) +
coord_equal() +
labs(
title = "Perbandingan Kurva ROC",
x = "False Positive Rate (1 - Specificity)",
y = "True Positive Rate (Sensitivity)",
color = "Model"
) +
theme_minimal()
print(grafik_roc)
Kurva ROC menunjukkan bahwa model awal dan model pruning
memiliki kemampuan klasifikasi yang sangat baik karena kurva mendekati
sudut kiri atas. Model awal memiliki nilai AUC sebesar 0,9765, sedikit
lebih tinggi dibandingkan model pruning sebesar 0,9662. Hal ini
menunjukkan bahwa model awal memiliki kemampuan membedakan kelas
benign dan malignant yang sedikit lebih baik secara
keseluruhan. Namun, model pruning memiliki sensitivitas sebesar
100%, sehingga seluruh kasus malignant pada data pengujian
berhasil diklasifikasikan dengan benar.
# Mengambil metrik evaluasi model awal
metrik_awal <- cm_awal$byClass
akurasi_awal <- unname(cm_awal$overall["Accuracy"])
sensitivitas_awal <- unname(metrik_awal["Sensitivity"])
spesifisitas_awal <- unname(metrik_awal["Specificity"])
presisi_awal <- unname(metrik_awal["Pos Pred Value"])
# Mengambil metrik evaluasi model pruning
metrik_pruned <- cm_pruned$byClass
akurasi_pruned <- unname(cm_pruned$overall["Accuracy"])
sensitivitas_pruned <- unname(metrik_pruned["Sensitivity"])
spesifisitas_pruned <- unname(metrik_pruned["Specificity"])
presisi_pruned <- unname(metrik_pruned["Pos Pred Value"])
# Menyusun tabel perbandingan
perbandingan <- data.frame(
Metrik = c(
"Accuracy",
"Sensitivity",
"Specificity",
"Precision",
"AUC"
),
Model_Awal = c(
akurasi_awal,
sensitivitas_awal,
spesifisitas_awal,
presisi_awal,
as.numeric(auc(roc_awal))
),
Model_Pruning = c(
akurasi_pruned,
sensitivitas_pruned,
spesifisitas_pruned,
presisi_pruned,
as.numeric(auc(roc_pruned))
)
)
# Menampilkan tabel perbandingan
knitr::kable(
perbandingan,
digits = 4,
caption = "Perbandingan Kinerja Model Classification Tree"
)
| Metrik | Model_Awal | Model_Pruning |
|---|---|---|
| Accuracy | 0.9568 | 0.9496 |
| Sensitivity | 0.9792 | 1.0000 |
| Specificity | 0.9451 | 0.9231 |
| Precision | 0.9038 | 0.8727 |
| AUC | 0.9765 | 0.9662 |
Berdasarkan perbandingan kinerja model Classification Tree, model awal memperoleh nilai accuracy sebesar 95,68%, sensitivity 97,92%, specificity 94,51%, precision 90,38% dan AUC 97,65%. Sementara itu, model setelah pruning memperoleh accuracy sebesar 94,96%, sensitivity 100%, specificity 92,31%, precision 87,27% dan AUC 96,62%. Hasil tersebut menunjukkan bahwa model awal memiliki nilai accuracy, specificity, precision dan AUC yang lebih tinggi. Sebaliknya, model setelah pruning memiliki sensitivity yang lebih tinggi, yaitu 100%, sehingga mampu mengenali seluruh data kelas malignant pada data testing. Dengan demikian, model awal lebih unggul dari segi kinerja klasifikasi secara keseluruhan, sedangkan model setelah pruning lebih baik dalam mendeteksi kelas malignant.
Decision Tree merupakan metode klasifikasi yang menyajikan proses pengambilan keputusan dalam bentuk struktur pohon. Metode CART (Classification and Regression Tree) membentuk pohon keputusan melalui pemisahan data secara bertahap berdasarkan atribut prediktor, dengan menggunakan indeks Gini untuk menentukan pemisahan terbaik pada klasifikasi. Hasilnya berupa aturan keputusan yang dapat digunakan untuk mengklasifikasikan data ke dalam kelas tertentu.
Pembangunan model Classification Tree menggunakan algoritma CART dilakukan melalui tahapan persiapan data, pembentukan pohon keputusan, penentuan atribut pemisah, visualisasi pohon, serta evaluasi kinerja model. Model yang terbentuk dapat disederhanakan melalui proses pruning untuk mengurangi kompleksitas pohon dan mengatasi overfitting. Dengan demikian, model CART dapat digunakan untuk melakukan klasifikasi berdasarkan pola yang terdapat dalam data.
Model Decision Tree berhasil mengklasifikasikan data ke dalam kelas benign dan malignant. Sebelum pemodelan, dilakukan penanganan nilai hilang menggunakan metode MICE dengan Predictive Mean Matching (PMM), kemudian data dibagi menjadi 560 data training dan 139 data testing. Hasil pembentukan pohon klasifikasi menunjukkan bahwa Cell.size merupakan variabel yang paling berpengaruh, diikuti oleh Cell.shape dan Bare.nuclei. Model awal memperoleh akurasi sebesar 95,68% dan AUC sebesar 0,9765, yang menunjukkan kemampuan klasifikasi sangat baik. Setelah dilakukan pruning menggunakan nilai CP terbaik sebesar 0,006476684, jumlah pemisahan pohon berkurang dari 7 menjadi 3. Model hasil pruning memperoleh akurasi sebesar 94,96% dan AUC sebesar 0,9662, dengan nilai sensitivity sebesar 100%. Dengan demikian, model awal memiliki kinerja klasifikasi secara keseluruhan yang sedikit lebih baik, ditinjau dari nilai akurasi, specificity, precision dan AUC. Namun, model setelah pruning lebih sederhana dan mampu mengenali seluruh data kelas malignant pada data testing.
Chair, M., Nasution, Y. N., dan Rizki, N. A. (2017). Aplikasi klasifikasi algoritma C4.5 (Studi kasus masa studi mahasiswa Fakultas Matematika dan Ilmu Pengetahuan Alam Universitas Mulawarman angkatan 2008). Jurnal Ilmiah Ilmu Komputer.
Fransiska, H. (2026). Modul Praktikum Machine Learning and Modern Prediction. Bengkulu: Laboratorium Statistika Universitas Bengkulu.
Hasanah, M. A., Soim, S., dan Handayani, A. S. (2021). Implementasi CRISP-DM model menggunakan metode Decision Tree dengan algoritma CART untuk prediksi curah hujan berpotensi banjir. Journal of Applied Informatics and Computing.
Setio, P. B. N., Saputro, D. R. S., dan Winarno, B. (2020). Klasifikasi dengan pohon keputusan berbasis algoritme C4.5. PRISMA. Prosiding Seminar Nasional Matematika.