Klasifikasi merupakan salah satu metode dalam machine learning yang digunakan untuk mengelompokkan objek ke dalam kelas berdasarkan karakteristik atau variabel prediktor. Salah satu tantangan dalam klasifikasi adalah memperoleh model yang stabil dan memiliki kemampuan prediksi yang baik pada data baru. Metode ensemble dikembangkan dengan menggabungkan sejumlah model untuk menghasilkan prediksi yang lebih andal.
Bootstrap Aggregating atau Bagging merupakan metode ensemble yang membangun beberapa model dari sampel bootstrap yang diambil dari data pelatihan (Breiman, 1996). Prediksi akhir diperoleh melalui penggabungan hasil prediksi dari model-model tersebut. Pada klasifikasi, penggabungan umumnya dilakukan melalui voting mayoritas. Jumlah model yang digunakan dapat memengaruhi kestabilan prediksi dan waktu komputasi.
Praktikum ini menerapkan Bagging Classification pada data Breast
Cancer dari paket mlbench di R. Model dibangun dengan
jumlah bootstrap 25, 50, dan 100, lalu kinerjanya dibandingkan
menggunakan confusion matrix serta metrik accuracy, precision, recall,
specificity, dan F1-score.
Berdasarkan latar belakang di atas, rumusan masalah yang dapat disimpulkan adalah sebagai berikut:
Berdasarkan latar belakang di atas, tujuan penelitian ini adalah sebagai berikut:
Adapun manfaat pada penelitian ini yaitu:
Bagi penulis
Bagi pembaca
Menambah ilmu pengetahuan dan pemahaman yang berkaitan tentang penerapan Bagging Classification serta evaluasi kinerja model klasifikasi dengan RStudio.
Adapun batasan masalah pada penelitian ini yaitu, sebagai berikut:
BreastCancer dari
paket mlbench di R dengan variabel respons
Class (kelas benign dan malignant). Variabel
Id tidak digunakan sebagai prediktor dan pengamatan yang
memiliki data hilang dikeluarkan dari analisis.ipred::bagging() pada jumlah bootstrap (nbagg)
sebesar 25, 50, dan 100.Adapun sistematika penulisan dari praktikum ini adalah:
BAB I PENDAHULUAN
Bab I terdiri dari latar belakang, rumusan masalah, tujuan penelitian, manfaat penelitian, batasan masalah, dan sistematika penulisan.
BAB II TINJAUAN PUSTAKA
Bab ini berisi tentang kajian pustaka yang terdiri dari jurnal-jurnal, buku-buku, dan informasi pendukung tentang klasifikasi, Bootstrap Aggregating (Bagging), confusion matrix, dan metrik evaluasi pada program RStudio.
BAB III METODE PENELITIAN
Bab ini terdiri dari jenis dan sumber data, variabel penelitian, analisis data, dan diagram alir penelitian.
BAB IV HASIL DAN PEMBAHASAN
Bab ini merupakan tahapan pencapaian hasil yang diperoleh dari analisis data yang dilakukan serta penjelasan dari hasil tersebut di bagian pembahasan.
BAB V KESIMPULAN DAN SARAN
Bab ini merupakan bagian penutup dalam laporan ini berupa penarikan kesimpulan mengenai hasil analisis dari penelitian serta penyampaian saran oleh penulis.
DAFTAR PUSTAKA
LAMPIRAN
Klasifikasi merupakan teknik pembelajaran terawasi (supervised learning) yang mempelajari hubungan antara variabel prediktor dan variabel respons kategorik. Model yang terbentuk digunakan untuk memprediksi kelas pada pengamatan baru.
Bagging merupakan metode ensemble yang membangun sejumlah model dari sampel bootstrap (Breiman, 1996). Sampel bootstrap dibentuk dengan pengambilan kembali (sampling with replacement) dari data latih. Pada klasifikasi, prediksi akhir diperoleh melalui voting dari prediksi seluruh model. Bagging bertujuan membantu mengurangi variasi prediksi dan meningkatkan kestabilan model.
Parameter nbagg pada fungsi
ipred::bagging() menentukan jumlah model bootstrap yang
dibangun. Pada praktikum ini digunakan nilai 25, 50, dan 100 untuk
membandingkan hasil prediksi.
Confusion matrix membandingkan kelas aktual dengan kelas hasil prediksi. Dengan menetapkan kelas malignant sebagai kelas positif, komponennya adalah:
Metrik evaluasi yang digunakan dalam praktikum ini adalah sebagai berikut (Kuhn, 2008):
Accuracy, proporsi seluruh prediksi yang benar.
\[Accuracy = \frac{TP + TN}{TP + TN + FP + FN}\]
Precision, proporsi prediksi positif yang benar.
\[Precision = \frac{TP}{TP + FP}\]
Recall (Sensitivity), proporsi kasus positif aktual yang berhasil dikenali.
\[Recall = \frac{TP}{TP + FN}\]
Specificity, proporsi kasus negatif aktual yang berhasil dikenali.
\[Specificity = \frac{TN}{TN + FP}\]
F1-score, rata-rata harmonik precision dan recall.
\[F1 = 2 \times \frac{Precision \times Recall}{Precision + Recall}\]
Jenis data yang digunakan dalam penelitian ini adalah data
kuantitatif. Sumber data yang digunakan merupakan data sekunder berupa
dataset BreastCancer dari paket mlbench pada
R. Dataset memuat variabel respons Class dan sejumlah
variabel prediktor yang menggambarkan karakteristik sampel. Variabel
Id dikeluarkan dari analisis karena hanya berfungsi sebagai
identitas pengamatan. Data diolah menggunakan program RStudio.
Variabel yang digunakan terdiri dari satu variabel respons dan sembilan variabel prediktor, sebagaimana disajikan pada Tabel 3.1.
| Variabel | Peran | Keterangan |
|---|---|---|
| Class | Respons (Y) | Kelas sampel: benign atau malignant (malignant sebagai kelas positif) |
| Cl.thickness | Prediktor | Ketebalan gumpalan sel |
| Cell.size | Prediktor | Keseragaman ukuran sel |
| Cell.shape | Prediktor | Keseragaman bentuk sel |
| Marg.adhesion | Prediktor | Perlekatan marginal |
| Epith.c.size | Prediktor | Ukuran sel epitel tunggal |
| Bare.nuclei | Prediktor | Inti sel telanjang |
| Bl.cromatin | Prediktor | Kromatin yang lunak |
| Normal.nucleoli | Prediktor | Nukleolus normal |
| Mitoses | Prediktor | Mitosis |
Langkah-langkah yang digunakan pada penelitian adalah sebagai berikut:
nbagg sebesar 25, 50,
dan 100.Gambar 3.1 Diagram alir penelitian
Dataset dimuat dengan data() ke environment sementara
karena BreastCancer bukan objek yang diekspor oleh paket
mlbench.
env_data <- new.env()
data("BreastCancer", package = "mlbench", envir = env_data)
data_awal <- env_data$BreastCancer
head(data_awal)
str(data_awal)
## '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 ...
data_analisis <- data_awal
data_analisis$Id <- NULL
data_analisis$Class <- factor(as.character(data_analisis$Class),
levels = c("benign", "malignant"))
for (k in setdiff(names(data_analisis), "Class")) {
data_analisis[[k]] <- suppressWarnings(as.numeric(as.character(data_analisis[[k]])))
}
n_awal <- nrow(data_analisis)
data_analisis <- na.omit(data_analisis)
n_akhir <- nrow(data_analisis)
set.seed(234)
idx <- createDataPartition(data_analisis$Class, p = 0.70, list = FALSE)
data_train <- data_analisis[idx, , drop = FALSE]
data_test <- data_analisis[-idx, , drop = FALSE]
tb_kelas <- rbind(
Semua = table(data_analisis$Class),
Latih = table(data_train$Class),
Uji = table(data_test$Class)
)
kable(tb_kelas, caption = "Tabel 4.1 Distribusi kelas pada data")
| benign | malignant | |
|---|---|---|
| Semua | 444 | 239 |
| Latih | 311 | 168 |
| Uji | 133 | 71 |
Dari 699 pengamatan terdapat 16 baris yang dihapus karena memuat data hilang, sehingga data yang dianalisis berjumlah 683 pengamatan. Data dibagi secara terstratifikasi menjadi 479 data latih (70%) dan 204 data uji (30%). Pembagian terstratifikasi menjaga proporsi kelas benign dan malignant tetap serupa pada kedua bagian data.
Model Bagging dibangun dengan ipred::bagging() pada data
latih untuk nbagg = 25, 50, dan 100. Seluruh model diuji
pada data uji yang sama. Kelas malignant diperlakukan sebagai kelas
positif.
set.seed(234)
hasil <- list()
cm_list <- list()
for (n in c(25, 50, 100)) {
nama <- paste0("Bagging_", n)
model <- bagging(Class ~ ., data = data_train, nbagg = n, coob = TRUE)
pred <- predict(model, newdata = data_test, type = "class")
pred <- factor(as.character(pred), levels = c("benign", "malignant"))
cm <- confusionMatrix(pred, data_test$Class,
positive = "malignant", mode = "everything")
cm_list[[nama]] <- cm
hasil[[nama]] <- data.frame(
Model = nama,
Bootstrap = n,
Accuracy = unname(cm$overall["Accuracy"]),
Precision = unname(cm$byClass["Precision"]),
Recall = unname(cm$byClass["Recall"]),
Specificity = unname(cm$byClass["Specificity"]),
F1_Score = unname(cm$byClass["F1"]),
TP = cm$table["malignant", "malignant"],
TN = cm$table["benign", "benign"],
FP = cm$table["malignant", "benign"],
FN = cm$table["benign", "malignant"],
row.names = NULL
)
}
tabel_metrik <- do.call(rbind, hasil)
rownames(tabel_metrik) <- NULL
kolom <- c("Accuracy", "Precision", "Recall", "Specificity", "F1_Score")
kable(transform(tabel_metrik,
Accuracy = round(Accuracy, 4), Precision = round(Precision, 4),
Recall = round(Recall, 4), Specificity = round(Specificity, 4),
F1_Score = round(F1_Score, 4)),
caption = "Tabel 4.2 Perbandingan kinerja model Bagging Classification")
| Model | Bootstrap | Accuracy | Precision | Recall | Specificity | F1_Score | TP | TN | FP | FN |
|---|---|---|---|---|---|---|---|---|---|---|
| Bagging_25 | 25 | 0.9608 | 0.9565 | 0.9296 | 0.9774 | 0.9429 | 66 | 130 | 3 | 5 |
| Bagging_50 | 50 | 0.9608 | 0.9565 | 0.9296 | 0.9774 | 0.9429 | 66 | 130 | 3 | 5 |
| Bagging_100 | 100 | 0.9608 | 0.9565 | 0.9296 | 0.9774 | 0.9429 | 66 | 130 | 3 | 5 |
for (nama in names(cm_list)) {
cat("\n\n**", nama, "**\n\n<pre>\n", sep = "")
print(cm_list[[nama]])
cat("</pre>\n")
}
Bagging_25
Confusion Matrix and Statistics
Reference
Prediction benign malignant
benign 130 5
malignant 3 66
Accuracy : 0.9608
95% CI : (0.9242, 0.9829)
No Information Rate : 0.652
P-Value [Acc > NIR] : <2e-16
Kappa : 0.913
Mcnemar's Test P-Value : 0.7237
Sensitivity : 0.9296
Specificity : 0.9774
Pos Pred Value : 0.9565
Neg Pred Value : 0.9630
Precision : 0.9565
Recall : 0.9296
F1 : 0.9429
Prevalence : 0.3480
Detection Rate : 0.3235
Detection Prevalence : 0.3382
Balanced Accuracy : 0.9535
'Positive' Class : malignant
Bagging_50
Confusion Matrix and Statistics
Reference
Prediction benign malignant
benign 130 5
malignant 3 66
Accuracy : 0.9608
95% CI : (0.9242, 0.9829)
No Information Rate : 0.652
P-Value [Acc > NIR] : <2e-16
Kappa : 0.913
Mcnemar's Test P-Value : 0.7237
Sensitivity : 0.9296
Specificity : 0.9774
Pos Pred Value : 0.9565
Neg Pred Value : 0.9630
Precision : 0.9565
Recall : 0.9296
F1 : 0.9429
Prevalence : 0.3480
Detection Rate : 0.3235
Detection Prevalence : 0.3382
Balanced Accuracy : 0.9535
'Positive' Class : malignant
Bagging_100
Confusion Matrix and Statistics
Reference
Prediction benign malignant
benign 130 5
malignant 3 66
Accuracy : 0.9608
95% CI : (0.9242, 0.9829)
No Information Rate : 0.652
P-Value [Acc > NIR] : <2e-16
Kappa : 0.913
Mcnemar's Test P-Value : 0.7237
Sensitivity : 0.9296
Specificity : 0.9774
Pos Pred Value : 0.9565
Neg Pred Value : 0.9630
Precision : 0.9565
Recall : 0.9296
F1 : 0.9429
Prevalence : 0.3480
Detection Rate : 0.3235
Detection Prevalence : 0.3382
Balanced Accuracy : 0.9535
'Positive' Class : malignant
data_plot <- data.frame(
Model = rep(tabel_metrik$Model, times = length(kolom)),
Metrik = rep(kolom, each = nrow(tabel_metrik)),
Nilai = as.vector(as.matrix(tabel_metrik[, kolom]))
)
ggplot(data_plot, aes(x = Model, y = Nilai, fill = Metrik)) +
geom_col(position = position_dodge(width = 0.8), width = 0.7) +
scale_fill_brewer(palette = "Set2") +
coord_cartesian(ylim = c(0, 1)) +
labs(title = "Perbandingan Metrik Evaluasi Model Bagging",
x = "Model", y = "Nilai metrik") +
theme_minimal(base_size = 12) +
theme(plot.title = element_text(face = "bold", hjust = 0.5),
legend.position = "bottom")
Model terbaik ditentukan berdasarkan accuracy tertinggi. Jika terdapat nilai accuracy yang sama, F1-score digunakan sebagai pembanding. Aturan ini hanya berlaku untuk praktikum ini dan bukan jaminan model akan menjadi yang terbaik pada data lain.
urut <- order(-tabel_metrik$Accuracy, -tabel_metrik$F1_Score)
peringkat <- tabel_metrik[urut, ]
terbaik <- peringkat[1, ]
kable(transform(peringkat,
Accuracy = round(Accuracy, 4), Precision = round(Precision, 4),
Recall = round(Recall, 4), Specificity = round(Specificity, 4),
F1_Score = round(F1_Score, 4)),
row.names = FALSE,
caption = "Tabel 4.3 Peringkat model berdasarkan accuracy, kemudian F1-score")
| Model | Bootstrap | Accuracy | Precision | Recall | Specificity | F1_Score | TP | TN | FP | FN |
|---|---|---|---|---|---|---|---|---|---|---|
| Bagging_25 | 25 | 0.9608 | 0.9565 | 0.9296 | 0.9774 | 0.9429 | 66 | 130 | 3 | 5 |
| Bagging_50 | 50 | 0.9608 | 0.9565 | 0.9296 | 0.9774 | 0.9429 | 66 | 130 | 3 | 5 |
| Bagging_100 | 100 | 0.9608 | 0.9565 | 0.9296 | 0.9774 | 0.9429 | 66 | 130 | 3 | 5 |
selisih_acc <- max(tabel_metrik$Accuracy) - min(tabel_metrik$Accuracy)
Berdasarkan aturan tersebut, model dengan peringkat tertinggi adalah Bagging_25 dengan accuracy 0.9608, precision 0.9565, recall 0.9296, specificity 0.9774, dan F1-score 0.9429. Pada model ini terdapat 5 kasus malignant yang diprediksi benign (False Negative) dan 3 kasus benign yang diprediksi malignant (False Positive). Selisih accuracy antara model terbaik dan terendah adalah 0.0000.
Nilai recall menggambarkan proporsi kasus malignant aktual yang berhasil dikenali, sedangkan precision menggambarkan proporsi prediksi malignant yang benar. Karena itu penilaian model sebaiknya tidak hanya bergantung pada accuracy, terutama jika kesalahan dalam mengenali kasus malignant memiliki konsekuensi penting.
Metode Bagging Classification pada data Breast Cancer diterapkan di
RStudio dengan fungsi ipred::bagging(). Data dibersihkan,
dibagi secara terstratifikasi menjadi 70% data latih dan 30% data uji,
kemudian model dibangun dengan jumlah bootstrap 25, 50, dan 100, dan
dievaluasi menggunakan confusion matrix serta metrik accuracy,
precision, recall, specificity, dan F1-score.
Berdasarkan hasil evaluasi pada data uji, model dengan jumlah bootstrap 25 (Bagging_25) memberikan kinerja terbaik dengan accuracy 0.9608 dan F1-score 0.9429. Kesimpulan ini hanya berlaku pada pembagian data dan pengaturan yang digunakan dalam praktikum ini.
Untuk pengembangan analisis, pengujian dapat dilakukan dengan
beberapa nilai set.seed, validasi silang
(cross-validation), atau pembagian data yang berbeda untuk
melihat kestabilan hasil. Evaluasi juga dapat mempertimbangkan biaya
kesalahan klasifikasi, khususnya kesalahan ketika kasus malignant
diprediksi sebagai benign. Selain itu, hasil Bagging dapat dibandingkan
dengan metode klasifikasi lain menggunakan prosedur pembagian data dan
metrik evaluasi yang sama.
Breiman, L. (1996). Bagging predictors. Machine Learning, 24(2), 123–140.
Kuhn, M. (2008). Building predictive models in R using the caret package. Journal of Statistical Software, 28(5), 1–26.
R Core Team. (2026). R: A language and environment for statistical computing. R Foundation for Statistical Computing.
Lampiran 1. Kode program R tersedia pada setiap chunk di Bab IV laporan ini. Jalankan seluruh dokumen dengan tombol Knit agar tabel, confusion matrix, grafik, dan interpretasi terisi dari hasil perhitungan aktual.