BAB I PENDAHULUAN

1.1 Latar Belakang

Klasifikasi merupakan salah satu metode machine learning yang digunakan untuk mengelompokkan objek ke dalam kelas berdasarkan variabel prediktor. Metode ensemble menggabungkan beberapa model untuk memperoleh prediksi yang lebih stabil. Salah satu metode ensemble adalah Bootstrap Aggregating atau Bagging, yang membangun model dari beberapa sampel bootstrap yang diambil dari data latih.

Jumlah model bootstrap dapat memengaruhi hasil prediksi dan waktu komputasi. Oleh karena itu, praktikum ini membandingkan Bagging Classification dengan jumlah bootstrap (nbagg) sebesar 25, 50, dan 100 pada dataset Breast Cancer. Kinerja model dinilai menggunakan confusion matrix, accuracy, precision, recall, specificity, dan F1-score.

1.2 Rumusan Masalah

  1. Bagaimana menerapkan Bagging Classification pada data Breast Cancer?
  2. Bagaimana perbandingan kinerja model dengan nbagg sebesar 25, 50, dan 100?
  3. Model dengan jumlah bootstrap berapa yang memberikan hasil evaluasi terbaik pada data uji?

1.3 Tujuan

  1. Menerapkan Bagging Classification pada dataset Breast Cancer dengan R.
  2. Membandingkan model dengan nbagg sebesar 25, 50, dan 100.
  3. Menghitung metrik evaluasi klasifikasi.
  4. Menentukan model terbaik berdasarkan hasil evaluasi pada data uji.

1.4 Manfaat

Praktikum ini diharapkan menambah pemahaman mengenai metode ensemble, penerapan Bagging Classification, serta penggunaan confusion matrix dan metrik evaluasi untuk membandingkan model klasifikasi.

1.5 Batasan Masalah

  1. Data yang digunakan adalah BreastCancer dari paket mlbench.
  2. Variabel Id dihapus karena hanya merupakan identitas pengamatan.
  3. Baris dengan data hilang dihapus sebelum pemodelan.
  4. Data dibagi menjadi 70% data latih dan 30% data uji secara terstratifikasi.
  5. Model Bagging dibuat menggunakan ipred::bagging() dengan nbagg = 25, 50, dan 100.
  6. Kelas malignant ditetapkan sebagai kelas positif.
  7. Evaluasi menggunakan accuracy, precision, recall, specificity, dan F1-score.

1.6 Sistematika Penulisan

Laporan terdiri dari pendahuluan, tinjauan pustaka, metode penelitian, hasil dan pembahasan, kesimpulan dan saran, daftar pustaka, serta lampiran kode.

BAB II TINJAUAN PUSTAKA

2.1 Klasifikasi

Klasifikasi adalah metode pembelajaran terawasi (supervised learning) yang mempelajari hubungan antara variabel prediktor dan variabel respons kategorik. Model yang diperoleh digunakan untuk memprediksi kelas pada data baru.

2.2 Bootstrap Aggregating (Bagging)

Bagging membangun sejumlah model dari sampel bootstrap, yaitu sampel yang diambil dari data latih dengan pengembalian. Pada klasifikasi, prediksi akhir ditentukan dengan menggabungkan prediksi model-model tersebut melalui voting. Parameter nbagg pada fungsi ipred::bagging() menentukan banyaknya model bootstrap yang dibangun.

2.3 Confusion Matrix

Dengan malignant sebagai kelas positif, confusion matrix terdiri dari:

  • True Positive (TP): kasus malignant yang diprediksi malignant.
  • True Negative (TN): kasus benign yang diprediksi benign.
  • False Positive (FP): kasus benign yang diprediksi malignant.
  • False Negative (FN): kasus malignant yang diprediksi benign.

2.4 Metrik Evaluasi

Metrik yang digunakan adalah:

\[ Accuracy = \frac{TP+TN}{TP+TN+FP+FN} \]

\[ Precision = \frac{TP}{TP+FP} \]

\[ Recall = \frac{TP}{TP+FN} \]

\[ Specificity = \frac{TN}{TN+FP} \]

\[ F1 = 2 \times \frac{Precision \times Recall}{Precision+Recall} \]

Accuracy mengukur proporsi prediksi yang benar secara keseluruhan. Precision mengukur ketepatan prediksi positif, recall mengukur kemampuan menemukan kasus positif, specificity mengukur kemampuan mengenali kelas negatif, dan F1-score merupakan rata-rata harmonik precision dan recall.

BAB III METODE PENELITIAN

3.1 Jenis dan Sumber Data

Data yang digunakan adalah data sekunder berupa dataset BreastCancer dari paket mlbench pada R. Data memiliki variabel respons Class dengan kategori benign dan malignant, serta sembilan variabel prediktor setelah variabel identitas Id dihapus.

3.2 Variabel Penelitian

var_tab <- data.frame(
  Variabel = c("Class", "Cl.thickness", "Cell.size", "Cell.shape",
               "Marg.adhesion", "Epith.c.size", "Bare.nuclei",
               "Bl.cromatin", "Normal.nucleoli", "Mitoses"),
  Peran = c("Respons (Y)", rep("Prediktor", 9)),
  Keterangan = c(
    "Kelas sampel: benign atau malignant",
    "Ketebalan gumpalan sel",
    "Keseragaman ukuran sel",
    "Keseragaman bentuk sel",
    "Perlekatan marginal",
    "Ukuran sel epitel tunggal",
    "Inti sel telanjang",
    "Kromatin",
    "Nukleolus normal",
    "Mitosis"
  )
)
knitr::kable(var_tab, caption = "Tabel 3.1 Variabel penelitian")
Tabel 3.1 Variabel penelitian
Variabel Peran Keterangan
Class Respons (Y) Kelas sampel: benign atau malignant
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
Normal.nucleoli Prediktor Nukleolus normal
Mitoses Prediktor Mitosis

3.3 Tahapan Analisis

Tahapan analisis meliputi pemanggilan data, pembersihan data, pembagian data menjadi data latih dan data uji, pembangunan model Bagging dengan tiga nilai nbagg, prediksi kelas data uji, penghitungan metrik evaluasi, serta perbandingan hasil model.

3.4 Diagram Alir Penelitian

Gambar 3.1. Diagram alir penerapan Bagging Classification.

BAB IV HASIL DAN PEMBAHASAN

4.1 Pembersihan dan Pembagian Data

# Memuat dataset ke environment tersendiri
env_data <- new.env()
data("BreastCancer", package = "mlbench", envir = env_data)
data_awal <- env_data$BreastCancer

cat("Jumlah baris awal:", nrow(data_awal), "\n")
## Jumlah baris awal: 699
cat("Jumlah kolom awal:", ncol(data_awal), "\n")
## Jumlah kolom awal: 11
# Menghapus kolom identitas
data_analisis <- data_awal
data_analisis$Id <- NULL

# Mengatur kelas respons
data_analisis$Class <- factor(
  as.character(data_analisis$Class),
  levels = c("benign", "malignant")
)

# Mengubah variabel prediktor menjadi numerik
for (k in setdiff(names(data_analisis), "Class")) {
  data_analisis[[k]] <- suppressWarnings(
    as.numeric(as.character(data_analisis[[k]]))
  )
}

# Menghapus pengamatan yang memiliki nilai hilang
n_awal <- nrow(data_analisis)
data_analisis <- na.omit(data_analisis)
n_akhir <- nrow(data_analisis)

# Membagi data secara terstratifikasi: 70% latih dan 30% uji
set.seed(234)
idx <- caret::createDataPartition(
  data_analisis$Class, p = 0.70, list = FALSE
)
data_train <- data_analisis[idx, , drop = FALSE]
data_test <- data_analisis[-idx, , drop = FALSE]

ringkasan_data <- data.frame(
  Keterangan = c("Data awal", "Data setelah menghapus NA", "Data latih", "Data uji"),
  Jumlah = c(n_awal, n_akhir, nrow(data_train), nrow(data_test))
)
knitr::kable(ringkasan_data, caption = "Tabel 4.1 Ringkasan jumlah pengamatan")
Tabel 4.1 Ringkasan jumlah pengamatan
Keterangan Jumlah
Data awal 699
Data setelah menghapus NA 683
Data latih 479
Data uji 204

Setelah variabel identitas dihapus dan baris dengan data hilang dikeluarkan, data dibagi menjadi data latih sebesar 70% dan data uji sebesar 30%. Pembagian terstratifikasi dilakukan agar proporsi kelas pada data latih dan data uji relatif terjaga.

4.2 Pemodelan Bagging dan Metrik Evaluasi

# Menetapkan jumlah bootstrap yang dibandingkan
nilai_nbagg <- c(25, 50, 100)

hasil_model <- list()
confusion_list <- list()
prediksi_list <- list()

# Membuat model dengan data latih yang sama
for (i in seq_along(nilai_nbagg)) {
  n <- nilai_nbagg[i]
  nama_model <- paste0("Bagging_", n)

  set.seed(234)
  model <- ipred::bagging(
    Class ~ .,
    data = data_train,
    nbagg = n,
    coob = TRUE
  )

  prediksi <- predict(model, newdata = data_test, type = "class")
  prediksi <- factor(as.character(prediksi), levels = c("benign", "malignant"))

  # Confusion matrix dengan malignant sebagai kelas positif
  cm <- caret::confusionMatrix(
    data = prediksi,
    reference = data_test$Class,
    positive = "malignant",
    mode = "everything"
  )

  confusion_list[[nama_model]] <- cm
  prediksi_list[[nama_model]] <- prediksi

  # Mengambil metrik evaluasi
  hasil_model[[i]] <- data.frame(
    Model = nama_model,
    nbagg = 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 = unname(cm$table["malignant", "malignant"]),
    TN = unname(cm$table["benign", "benign"]),
    FP = unname(cm$table["malignant", "benign"]),
    FN = unname(cm$table["benign", "malignant"])
  )
}

tabel_metrik <- do.call(rbind, hasil_model)
rownames(tabel_metrik) <- NULL

# Membulatkan metrik agar tabel lebih mudah dibaca
tabel_tampil <- tabel_metrik
kolom_numerik <- c("Accuracy", "Precision", "Recall", "Specificity", "F1_Score")
tabel_tampil[kolom_numerik] <- lapply(
  tabel_tampil[kolom_numerik], round, digits = 4
)

knitr::kable(
  tabel_tampil,
  caption = "Tabel 4.2 Perbandingan metrik evaluasi Bagging Classification"
)
Tabel 4.2 Perbandingan metrik evaluasi Bagging Classification
Model nbagg 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

Nilai metrik berada pada rentang 0 sampai 1. Nilai yang lebih besar menunjukkan hasil lebih baik untuk metrik tersebut. Pada konteks ini, recall penting diperhatikan karena menunjukkan kemampuan model mengenali kasus malignant.

4.3 Confusion Matrix Setiap Model

for (nama_model in names(confusion_list)) {
  cat("\n\n### ", nama_model, "\n\n", sep = "")
  print(knitr::kable(
    as.data.frame.matrix(confusion_list[[nama_model]]$table),
    caption = paste("Confusion matrix", nama_model)
  ))
  cat("\n\n")
}

Bagging_25

Confusion matrix Bagging_25
benign malignant
benign 130 5
malignant 3 66

Bagging_50

Confusion matrix Bagging_50
benign malignant
benign 130 5
malignant 3 66

Bagging_100

Confusion matrix Bagging_100
benign malignant
benign 130 5
malignant 3 66

Confusion matrix memperlihatkan jumlah prediksi benar dan salah untuk masing-masing kelas. FP adalah kasus benign yang diprediksi malignant, sedangkan FN adalah kasus malignant yang diprediksi benign.

4.4 Grafik Perbandingan Metrik

kolom_metrik <- c("Accuracy", "Precision", "Recall", "Specificity", "F1_Score")

data_plot <- data.frame(
  Model = rep(tabel_metrik$Model, times = length(kolom_metrik)),
  Metrik = rep(kolom_metrik, each = nrow(tabel_metrik)),
  Nilai = as.vector(as.matrix(tabel_metrik[, kolom_metrik]))
)

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

Grafik digunakan untuk membandingkan accuracy, precision, recall, specificity, dan F1-score pada ketiga model. Perbedaan nilai metrik menunjukkan perubahan kinerja ketika jumlah bootstrap ditingkatkan.

4.5 Penentuan Model Terbaik

Model terbaik ditentukan berdasarkan accuracy tertinggi. Jika accuracy sama, F1-score menjadi kriteria pembanding. Pemilihan ini hanya digunakan untuk keperluan praktikum dan tidak menjamin performa terbaik pada data lain.

# Mengurutkan model berdasarkan accuracy, lalu F1-score
peringkat <- tabel_metrik[
  order(-tabel_metrik$Accuracy, -tabel_metrik$F1_Score),
]
rownames(peringkat) <- NULL

peringkat_tampil <- peringkat
peringkat_tampil[kolom_metrik] <- lapply(
  peringkat_tampil[kolom_metrik], round, digits = 4
)

knitr::kable(
  peringkat_tampil,
  caption = "Tabel 4.3 Peringkat model berdasarkan accuracy dan F1-score"
)
Tabel 4.3 Peringkat model berdasarkan accuracy dan F1-score
Model nbagg 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
model_terbaik <- peringkat[1, ]

cat(
  "\nModel terbaik berdasarkan aturan evaluasi adalah",
  model_terbaik$Model,
  "dengan accuracy",
  round(model_terbaik$Accuracy, 4),
  "dan F1-score",
  round(model_terbaik$F1_Score, 4),
  ".\n"
)
## 
## Model terbaik berdasarkan aturan evaluasi adalah Bagging_25 dengan accuracy 0.9608 dan F1-score 0.9429 .

Berdasarkan aturan tersebut, model pada peringkat pertama merupakan model dengan accuracy tertinggi dan, jika diperlukan, F1-score tertinggi sebagai pemecah nilai seri. Interpretasi akhir sebaiknya juga mempertimbangkan recall dan jumlah FN, khususnya karena kelas positif yang digunakan adalah malignant.

BAB V KESIMPULAN DAN SARAN

5.1 Kesimpulan

Bagging Classification diterapkan pada dataset Breast Cancer menggunakan fungsi ipred::bagging() dengan jumlah bootstrap 25, 50, dan 100. Data dibersihkan dan dibagi menjadi data latih dan data uji secara terstratifikasi. Kinerja setiap model dibandingkan menggunakan confusion matrix, accuracy, precision, recall, specificity, dan F1-score.

Model terbaik ditentukan berdasarkan accuracy tertinggi, dengan F1-score sebagai pembanding jika terdapat nilai accuracy yang sama. Model yang memperoleh peringkat pertama dan nilai metriknya dapat dilihat pada Tabel 4.3. Kesimpulan berlaku untuk pembagian data dan pengaturan yang digunakan pada praktikum ini.

5.2 Saran

Analisis berikutnya dapat menggunakan validasi silang atau beberapa pembagian data untuk memeriksa kestabilan hasil. Perbandingan dengan metode klasifikasi lain juga dapat dilakukan menggunakan data uji dan metrik evaluasi yang sama. Untuk kasus klasifikasi kesehatan, recall dan jumlah false negative sebaiknya turut diperhatikan, bukan hanya accuracy.

DAFTAR PUSTAKA

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

Kode program tersedia pada setiap bagian kode dalam laporan ini. Jalankan dokumen menggunakan tombol Knit di RStudio untuk menghasilkan laporan HTML yang memuat tabel, diagram alir, confusion matrix, grafik, dan hasil evaluasi berdasarkan perhitungan aktual.