1 Pendahuluan

Kanker payudara merupakan kanker dengan jumlah kasus tertinggi pada perempuan di dunia. Pada tahun 2022 tercatat sekitar 2,3 juta kasus baru dan lebih dari 670 ribu kematian akibat kanker payudara secara global. Tingginya angka kejadian dan kematian tersebut menunjukkan pentingnya deteksi dini yang akurat. Kesalahan diagnosis, terutama ketika tumor ganas (malignant) diklasifikasikan sebagai tumor jinak (benign), dapat menyebabkan keterlambatan penanganan dan menurunkan peluang keberhasilan terapi (WHO, 2026).

Karakteristik inti sel hasil pemeriksaan aspirasi jarum halus atau fine needle aspiration (FNA) dapat direpresentasikan dalam bentuk data numerik yang menggambarkan ukuran, bentuk, tekstur, dan kompleksitas permukaan sel. Data Breast Cancer Wisconsin (Diagnostic) (WDBC) dari UCI Machine Learning Repository memuat 569 observasi dan 30 prediktor numerik yang digunakan untuk membedakan tumor malignant dan benign (Wolberg et al., 1993).

Salah satu metode yang dapat digunakan untuk menangani data dengan banyak prediktor adalah Support Vector Machine (SVM). Metode ini membangun bidang pemisah atau hyperplane dengan margin terbesar antarkelas. SVM juga dapat menangani hubungan nonlinier melalui fungsi kernel. Analisis ini menggunakan SVM dengan kernel linear dan kernel radial basis function (RBF).

Tujuan analisis ini adalah:

  1. Membangun SVM linear dan SVM radial/RBF untuk mengklasifikasikan diagnosis malignant dan benign
  2. Memilih hyperparameter menggunakan 5-fold cross-validation
  3. Membandingkan performa kedua kernel
  4. Mengevaluasi model menggunakan akurasi, sensitivitas kelas malignant, spesifisitas, Confusion Matrix, serta ROC AUC

Pertanyaan analisis yang diajukan adalah: Dapatkah karakteristik inti sel digunakan untuk mengklasifikasikan tumor sebagai malignant atau benign menggunakan Support Vector Machine?

2 Deskripsi Data

Data diperoleh dari UCI Machine Learning Repository. Setiap baris merepresentasikan satu sampel massa payudara. Variabel diagnosis merupakan target klasifikasi dengan kode asli M untuk malignant dan B untuk benign. Variabel id merupakan pengenal observasi sehingga tidak digunakan sebagai prediktor.

Data memiliki sepuluh karakteristik dasar inti sel berikut:

  1. radius: rata-rata jarak dari pusat inti sel ke titik-titik pada batas sel;
  2. texture: variasi intensitas warna abu-abu pada citra inti sel;
  3. perimeter: panjang keliling batas inti sel;
  4. area: luas wilayah yang ditempati inti sel;
  5. smoothness: variasi lokal panjang radius yang menggambarkan kehalusan batas sel;
  6. compactness: ukuran kepadatan bentuk berdasarkan hubungan keliling dan luas;
  7. concavity: tingkat atau besarnya bagian cekung pada kontur inti sel;
  8. concave_points: jumlah titik cekung pada kontur inti sel;
  9. symmetry: tingkat kesimetrisan bentuk inti sel; dan
  10. fractal_dimension: ukuran kompleksitas atau ketidakteraturan batas inti sel.

Setiap karakteristik diringkas menjadi tiga kelompok, yaitu nilai rata-rata (_mean), galat baku (_se), dan nilai terburuk atau terbesar (_worst). Dengan demikian, terdapat 30 prediktor numerik (Wolberg et al., 1993).

2.1 Akuisisi Data

url_wdbc <- paste0(
  "https://archive.ics.uci.edu/ml/machine-learning-databases/",
  "breast-cancer-wisconsin/wdbc.data"
)

feature_names <- c(
  "radius", "texture", "perimeter", "area", "smoothness",
  "compactness", "concavity", "concave_points", "symmetry",
  "fractal_dimension"
)

col_names <- c(
  "id",
  "diagnosis",
  paste0(feature_names, "_mean"),
  paste0(feature_names, "_se"),
  paste0(feature_names, "_worst")
)

wdbc <- readr::read_csv(
  url_wdbc,
  col_names = col_names,
  col_types = cols(
    id = col_character(),
    diagnosis = col_character(),
    .default = col_double()
  ),
  show_col_types = FALSE
) |>
  mutate(
    diagnosis = factor(
      if_else(diagnosis == "M", "Malignant", "Benign"),
      levels = c("Malignant", "Benign")
    )
  )

stopifnot(
  nrow(wdbc) == 569,
  ncol(wdbc) == 32,
  identical(
    levels(wdbc$diagnosis),
    c("Malignant", "Benign")
  )
)

Data yang berhasil dibaca terdiri atas 569 observasi, 30 prediktor numerik, satu variabel target, dan satu variabel pengenal.

wdbc |>
  slice_head(n = 5) |>
  select(
    id,
    diagnosis,
    radius_mean,
    texture_mean,
    area_mean,
    concavity_mean,
    radius_worst
  ) |>
  knitr::kable(
    digits = 3,
    caption = "Lima Observasi Pertama dan Beberapa Variabel WDBC"
  )
Lima Observasi Pertama dan Beberapa Variabel WDBC
id diagnosis radius_mean texture_mean area_mean concavity_mean radius_worst
842302 Malignant 17.99 10.38 1001.0 0.300 25.38
842517 Malignant 20.57 17.77 1326.0 0.087 24.99
84300903 Malignant 19.69 21.25 1203.0 0.197 23.57
84348301 Malignant 11.42 20.38 386.1 0.241 14.91
84358402 Malignant 20.29 14.34 1297.0 0.198 22.54

2.2 Pemeriksaan Kualitas Data

data_quality <- tibble(
  Pemeriksaan = c(
    "Jumlah observasi",
    "Jumlah variabel",
    "Jumlah nilai hilang",
    "Jumlah ID duplikat",
    "Jumlah baris duplikat"
  ),
  Hasil = c(
    nrow(wdbc),
    ncol(wdbc),
    sum(is.na(wdbc)),
    sum(duplicated(wdbc$id)),
    sum(duplicated(wdbc))
  )
)

knitr::kable(
  data_quality,
  caption = "Ringkasan Pemeriksaan Kualitas Data"
)
Ringkasan Pemeriksaan Kualitas Data
Pemeriksaan Hasil
Jumlah observasi 569
Jumlah variabel 32
Jumlah nilai hilang 0
Jumlah ID duplikat 0
Jumlah baris duplikat 0

Tidak terdapat nilai hilang pada data (0 nilai hilang). Jumlah ID duplikat adalah 0, sehingga setiap ID merupakan pengenal observasi yang unik.

3 Prapemrosesan dan Eksplorasi Data

3.1 Distribusi Kelas

class_distribution <- wdbc |>
  count(diagnosis, name = "Jumlah") |>
  mutate(
    Proporsi = Jumlah / sum(Jumlah),
    Persentase = scales::percent(
      Proporsi,
      accuracy = 0.1
    )
  )

knitr::kable(
  class_distribution |>
    select(
      Diagnosis = diagnosis,
      Jumlah,
      Persentase
    ),
  caption = "Distribusi Kelas Diagnosis"
)
Distribusi Kelas Diagnosis
Diagnosis Jumlah Persentase
Malignant 212 37.3%
Benign 357 62.7%
ggplot(
  class_distribution,
  aes(
    x = diagnosis,
    y = Jumlah,
    fill = diagnosis
  )
) +
  geom_col(
    width = 0.65,
    show.legend = FALSE
  ) +
  geom_text(
    aes(
      label = paste0(
        Jumlah,
        " (",
        Persentase,
        ")"
      )
    ),
    vjust = -0.4,
    color = "#4F3A48",
    fontface = "bold"
  ) +
  scale_fill_manual(
    values = c(
      "Malignant" = "#C65A82",
      "Benign" = "#E7B8D2"
    )
  ) +
  scale_y_continuous(
    expand = expansion(
      mult = c(0, 0.12)
    )
  ) +
  labs(
    x = "Diagnosis",
    y = "Jumlah observasi"
  )
Distribusi Kelas Diagnosis pada Seluruh Data

Distribusi Kelas Diagnosis pada Seluruh Data

Kelas benign berjumlah 357 observasi, sedangkan kelas malignant berjumlah 212 observasi. Perbedaan proporsi tersebut menjadi alasan pembagian data dilakukan secara berstrata atau stratified.

3.2 Perbandingan Karakteristik Inti Sel

selected_features <- c(
  "radius_mean",
  "texture_mean",
  "area_mean",
  "concavity_mean",
  "concave_points_mean",
  "radius_worst"
)

feature_labels <- c(
  "radius mean" = "Rata-rata radius",
  "texture mean" = "Rata-rata tekstur",
  "area mean" = "Rata-rata luas",
  "concavity mean" = "Rata-rata konkavitas",
  "concave points mean" = "Rata-rata titik cekung",
  "radius worst" = "Radius terburuk"
)

wdbc |>
  select(
    diagnosis,
    all_of(selected_features)
  ) |>
  pivot_longer(
    cols = -diagnosis,
    names_to = "feature",
    values_to = "value"
  ) |>
  mutate(
    feature = str_replace_all(
      feature,
      "_",
      " "
    ),
    feature = recode(
      feature,
      !!!feature_labels
    )
  ) |>
  ggplot(
    aes(
      x = diagnosis,
      y = value,
      fill = diagnosis
    )
  ) +
  geom_boxplot(
    alpha = 0.85,
    outlier.alpha = 0.35,
    show.legend = FALSE
  ) +
  facet_wrap(
    ~ feature,
    scales = "free_y",
    ncol = 2
  ) +
  scale_fill_manual(
    values = c(
      "Malignant" = "#D66A7F",
      "Benign" = "#D7B5E5"
    )
  ) +
  labs(
    x = "Diagnosis",
    y = "Nilai prediktor"
  )
Distribusi Prediktor Terpilih Menurut Diagnosis

Distribusi Prediktor Terpilih Menurut Diagnosis

Dibandingkan kelompok benign, kelompok malignant cenderung memiliki radius terburuk, rata-rata radius, rata-rata luas, rata-rata tekstur, rata-rata konkavitas, dan rata-rata titik cekung yang lebih tinggi. Radius dan luas yang lebih tinggi menunjukkan bahwa inti sel pada kelompok malignant cenderung berukuran lebih besar.

Konkavitas dan titik cekung yang lebih tinggi menunjukkan bahwa kontur inti sel kelompok malignant cenderung memiliki lekukan yang lebih besar dan lebih banyak. Rata-rata tekstur juga cenderung lebih tinggi pada kelas malignant, meskipun pemisahan kedua kelas pada prediktor tersebut terlihat lebih lemah karena distribusinya masih cukup bertumpang tindih. Oleh karena itu, klasifikasi diagnosis perlu mempertimbangkan kombinasi beberapa prediktor dan tidak hanya didasarkan pada satu karakteristik.

3.3 Pembagian Data Latih dan Data Uji

Data dibagi menjadi 80% data latih dan 20% data uji menggunakan pembagian berstrata. Data uji disimpan dan tidak digunakan untuk menentukan hyperparameter model.

set.seed(15062026)

split_obj <- initial_split(
  wdbc,
  prop = 0.80,
  strata = diagnosis
)

train_dat <- training(split_obj)
test_dat <- testing(split_obj)

split_distribution <- bind_rows(
  train_dat |>
    count(diagnosis) |>
    mutate(Data = "Latih"),
  test_dat |>
    count(diagnosis) |>
    mutate(Data = "Uji")
) |>
  group_by(Data) |>
  mutate(
    Proporsi = n / sum(n)
  ) |>
  ungroup()

split_distribution |>
  mutate(
    Proporsi = scales::percent(
      Proporsi,
      accuracy = 0.1
    )
  ) |>
  select(
    Data,
    Diagnosis = diagnosis,
    Jumlah = n,
    Proporsi
  ) |>
  knitr::kable(
    format = "html",
    align = c("l", "l", "r", "r"),
    caption = "Distribusi Kelas pada Data Latih dan Data Uji"
  ) |>
  collapse_rows(
    columns = 1,
    valign = "middle"
  )
Distribusi Kelas pada Data Latih dan Data Uji
Data Diagnosis Jumlah Proporsi
Latih Malignant 169 37.2%
Benign 285 62.8%
Uji Malignant 43 37.4%
Benign 72 62.6%

Data latih berisi 454 observasi dan data uji berisi 115 observasi. Pembagian berstrata mempertahankan komposisi kelas pada kedua bagian data.

3.4 Normalisasi Prediktor

SVM sensitif terhadap perbedaan skala karena pembentukan margin melibatkan jarak antarobservasi. Oleh karena itu, prediktor numerik dinormalisasi agar memiliki rata-rata nol dan simpangan baku satu.

Parameter normalisasi hanya dipelajari dari data latih. Variabel id diubah perannya menjadi pengenal agar tidak digunakan sebagai prediktor. Sebagai bagian dari prapemrosesan, step_zv() digunakan untuk menghapus prediktor dengan variasi nol apabila ditemukan pada data latih.

rec_svm <- recipe(
  diagnosis ~ .,
  data = train_dat
) |>
  update_role(
    id,
    new_role = "id"
  ) |>
  step_zv(
    all_predictors()
  ) |>
  step_normalize(
    all_numeric_predictors()
  )

rec_svm

4 Metode

4.1 Teori Support Vector Machine

Support Vector Machine (SVM) merupakan metode klasifikasi yang membentuk hyperplane sebagai batas pemisah antara dua kelas. Untuk data yang dapat dipisahkan secara linear atau linearly separable, SVM mencari hyperplane yang tidak hanya memisahkan kedua kelas, tetapi juga menghasilkan margin maksimum.

Jika diberikan data latih \((\mathbf{x}_i,y_i)\) dengan \(y_i \in \{-1,+1\}\), fungsi keputusan linear dituliskan sebagai:

\[ f(\mathbf{x})= \mathbf{w}^{T}\mathbf{x}+b \]

dengan \(\mathbf{w}\) sebagai vektor bobot dan \(b\) sebagai bias. Kelas prediksi ditentukan berdasarkan tanda fungsi keputusan:

\[ \widehat{y}= \operatorname{sign} \left( \mathbf{w}^{T}\mathbf{x}+b \right) \]

Pada data yang dapat dipisahkan secara sempurna, setiap observasi memenuhi:

\[ y_i \left( \mathbf{w}^{T}\mathbf{x}_i+b \right) \geq 1 \]

Margin antara kedua kelas dirumuskan sebagai:

\[ \rho= \frac{2} {\lVert\mathbf{w}\rVert} \]

Memaksimumkan margin ekuivalen dengan meminimumkan norma vektor bobot:

\[ \min_{\mathbf{w},b} \frac{1}{2} \lVert\mathbf{w}\rVert^2 \]

Observasi yang terletak paling dekat dengan hyperplane disebut support vectors. Observasi tersebut menentukan posisi dan lebar margin model.

Untuk data yang tidak dapat dipisahkan secara sempurna, SVM menggunakan soft margin dengan variabel kelonggaran \(\xi_i\):

\[ y_i \left( \mathbf{w}^{T}\mathbf{x}_i+b \right) \geq 1-\xi_i, \qquad \xi_i\geq 0 \]

Fungsi optimasinya menjadi:

\[ \min_{\mathbf{w},b,\boldsymbol{\xi}} \left[ \frac{1}{2} \lVert\mathbf{w}\rVert^2 + C\sum_{i=1}^{n}\xi_i \right] \]

Parameter \(C\), yang dalam implementasi disebut cost, mengatur keseimbangan antara lebar margin dan penalti terhadap kesalahan klasifikasi. Nilai cost yang besar memberikan penalti lebih kuat terhadap kesalahan, sedangkan nilai yang kecil memberikan toleransi lebih besar terhadap pelanggaran margin (Cortes & Vapnik, 1995).

Untuk hubungan nonlinier, SVM menggunakan fungsi kernel. Fungsi keputusan berbasis kernel dituliskan sebagai:

\[ f(\mathbf{x})= \sum_{i=1}^{n} \alpha_i y_i K(\mathbf{x}_i,\mathbf{x})+b \]

Analisis ini menggunakan kernel linear dan RBF. Kernel linear dirumuskan sebagai:

\[ K(\mathbf{x}_i,\mathbf{x}_j) = \mathbf{x}_i^{T}\mathbf{x}_j \]

Kernel RBF dirumuskan sebagai:

\[ K(\mathbf{x}_i,\mathbf{x}_j) = \exp \left( -\sigma \lVert \mathbf{x}_i-\mathbf{x}_j \rVert^2 \right) \]

Parameter \(\sigma\), yang direpresentasikan sebagai rbf_sigma, mengatur jangkauan pengaruh observasi. Nilai yang lebih besar menghasilkan pengaruh lebih lokal dan batas keputusan yang lebih fleksibel, sedangkan nilai yang lebih kecil menghasilkan batas keputusan yang lebih halus. Nilai cost dan rbf_sigma ditentukan melalui cross-validation (Al-Mejibli et al., 2020).

4.2 Teori Cross-validation

Analisis ini menggunakan 5-fold stratified cross-validation pada data latih untuk mengevaluasi performa model selama proses tuning. Pada metode ini, data latih dibagi menjadi lima lipatan (fold) dengan proporsi kelas yang tetap terjaga pada setiap lipatan. Secara bergantian, empat lipatan digunakan untuk melatih model dan satu lipatan digunakan sebagai data validasi hingga seluruh lipatan pernah berperan sebagai data validasi. Nilai performa model kemudian diperoleh dari rata-rata performa dari kelima lipatan validasi tersebut. Selama proses ini, data uji tidak digunakan sehingga evaluasi model tetap bersifat objektif dan terhindar dari data leakage (Szeghalmy & Fazekas, 2023).

Ilustrasi 5-Fold Cross-Validation (Sumber: Allgaier dan Pryss, 2024)

Ilustrasi 5-Fold Cross-Validation (Sumber: Allgaier dan Pryss, 2024)

Gambar berikut memperlihatkan skema penerapan 5-fold stratified cross-validation dalam penelitian ini. Seluruh pelatihan model dan pemilihan hyperparameter dilakukan menggunakan data latih, sedangkan data uji dipisahkan sejak awal dan hanya digunakan pada tahap evaluasi akhir. Pendekatan ini memungkinkan kemampuan generalisasi model dievaluasi pada data yang benar-benar belum pernah digunakan selama proses pengembangan model.

set.seed(15062026)

folds <- vfold_cv(
  train_dat,
  v = 5,
  strata = diagnosis
)

folds
## #  5-fold cross-validation using stratification 
## # A tibble: 5 × 2
##   splits           id   
##   <list>           <chr>
## 1 <split [363/91]> Fold1
## 2 <split [363/91]> Fold2
## 3 <split [363/91]> Fold3
## 4 <split [363/91]> Fold4
## 5 <split [364/90]> Fold5

4.3 Teori Metrik Evaluasi

Dalam penelitian ini, diagnosis malignant ditetapkan sebagai kelas positif, sedangkan diagnosis benign ditetapkan sebagai kelas negatif. Dengan demikian, \(TP\) merupakan kasus malignant yang diprediksi malignant, \(TN\) merupakan kasus benign yang diprediksi benign, \(FP\) merupakan kasus benign yang diprediksi malignant, dan \(FN\) merupakan kasus malignant yang diprediksi benign.

4.3.1 Akurasi

Akurasi merupakan proporsi seluruh observasi yang diklasifikasikan dengan benar:

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

Nilai akurasi berada pada rentang nol hingga satu. Akurasi perlu diinterpretasikan bersama metrik lain karena dapat kurang informatif ketika distribusi kelas tidak seimbang (Tharwat, 2020).

4.3.2 Sensitivitas

Sensitivitas atau recall mengukur proporsi kasus positif aktual yang diidentifikasi dengan benar:

\[ \text{Sensitivity} = \frac{TP} {TP+FN} \]

Dalam penelitian ini, sensitivitas menunjukkan proporsi kasus malignant yang berhasil diprediksi sebagai malignant. Sensitivitas yang rendah menunjukkan lebih banyak kasus tumor ganas menjadi false negative.

4.3.3 Spesifisitas

Spesifisitas mengukur proporsi kasus negatif aktual yang diidentifikasi dengan benar:

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

Dalam penelitian ini, spesifisitas menunjukkan proporsi kasus benign yang berhasil diprediksi sebagai benign. Spesifisitas yang rendah menunjukkan lebih banyak kasus benign menjadi false positive.

4.3.4 ROC AUC

Kurva Receiver Operating Characteristic (ROC) menggambarkan hubungan antara sensitivitas dan tingkat false positive atau \(1-\text{specificity}\) pada berbagai ambang klasifikasi. Luas area di bawah kurva ROC atau AUC merangkum kemampuan diskriminasi model pada seluruh ambang tersebut.

Nilai 0,5 menunjukkan kemampuan diskriminasi yang setara dengan pengurutan acak, sedangkan nilai yang mendekati satu menunjukkan kemampuan diskriminasi yang semakin baik. ROC AUC tidak menentukan ambang keputusan terbaik sehingga tetap perlu diinterpretasikan bersama akurasi, sensitivitas, spesifisitas, dan jumlah false negative (Tharwat, 2020).

4.4 Spesifikasi Model dan Grid Hyperparameter

svm_linear_spec <- svm_linear(
  cost = tune()
) |>
  set_engine(
    "kernlab",
    prob.model = TRUE
  ) |>
  set_mode("classification")

svm_rbf_spec <- svm_rbf(
  cost = tune(),
  rbf_sigma = tune()
) |>
  set_engine(
    "kernlab",
    prob.model = TRUE
  ) |>
  set_mode("classification")

svm_linear_wf <- workflow() |>
  add_recipe(rec_svm) |>
  add_model(svm_linear_spec)

svm_rbf_wf <- workflow() |>
  add_recipe(rec_svm) |>
  add_model(svm_rbf_spec)

linear_grid <- grid_regular(
  cost(
    range = c(-5, 5)
  ),
  levels = 5
)

rbf_grid <- grid_regular(
  cost(
    range = c(-5, 5)
  ),
  rbf_sigma(
    range = c(-10, 0)
  ),
  levels = 5
)

svm_metrics <- metric_set(
  roc_auc,
  accuracy,
  sens,
  spec
)

Jumlah nilai pada grid merupakan keputusan analitik dalam rancangan pencarian hyperparameter, sehingga rentang dan jumlah tingkat grid SVM radial mengikuti template syntax yang diberikan. Parameter cost diuji pada rentang \(2^{-5}\) hingga \(2^5\), sedangkan rbf_sigma diuji pada rentang \(10^{-10}\) hingga \(10^0\). Dengan levels = 5, masing-masing parameter dievaluasi pada lima tingkat.

Agar konsisten dengan template, SVM linear juga menggunakan lima tingkat cost pada rentang \(2^{-5}\) hingga \(2^5\). Dengan demikian, SVM linear mengevaluasi lima konfigurasi, sedangkan SVM radial mengevaluasi \(5 \times 5 = 25\) kombinasi cost dan rbf_sigma.

ROC AUC digunakan sebagai metrik utama dalam pemilihan hyperparameter karena metrik ini mengukur kemampuan model membedakan kelas malignant dan benign pada berbagai ambang probabilitas.

4.5 Hyperparameter Tuning

set.seed(15062026)

linear_tuned <- tune_grid(
  svm_linear_wf,
  resamples = folds,
  grid = linear_grid,
  metrics = svm_metrics,
  control = control_grid(
    save_pred = TRUE
  )
)

set.seed(15062026)

rbf_tuned <- tune_grid(
  svm_rbf_wf,
  resamples = folds,
  grid = rbf_grid,
  metrics = svm_metrics,
  control = control_grid(
    save_pred = TRUE
  )
)

5 Hasil Analisis

5.1 Hasil Hyperparameter Tuning SVM Linear

linear_best_table <- show_best(
  linear_tuned,
  metric = "roc_auc",
  n = 5
)

knitr::kable(
  linear_best_table |>
    select(
      cost,
      mean,
      std_err,
      n
    ) |>
    mutate(
      across(
        c(cost, mean, std_err),
        ~ round(.x, 6)
      )
    ),
  caption = "Lima Konfigurasi Terbaik SVM Linear Berdasarkan ROC AUC"
)
Lima Konfigurasi Terbaik SVM Linear Berdasarkan ROC AUC
cost mean std_err n
0.031250 0.993486 0.003651 5
0.176777 0.993486 0.003525 5
1.000000 0.992354 0.004733 5
5.656854 0.988335 0.005451 5
32.000000 0.984458 0.004865 5

Berdasarkan hasil cross-validation, SVM linear menghasilkan nilai ROC AUC rata-rata tertinggi sebesar 0,99349 pada nilai cost 0,03125 dan 0,17678. Nilai ROC AUC yang mendekati 1 menunjukkan bahwa model memiliki kemampuan yang sangat baik dalam membedakan diagnosis malignant dan benign. Selain itu, nilai standard error yang relatif kecil menunjukkan bahwa performa model cukup konsisten pada berbagai lipatan validasi.

Secara umum, perbedaan ROC AUC antar nilai cost relatif kecil pada rentang nilai rendah hingga menengah. Namun, performa model cenderung menurun ketika nilai cost semakin besar, yang terlihat dari penurunan ROC AUC pada cost 5,65685 dan 32,00. Hasil ini menunjukkan bahwa pemberian penalti yang terlalu tinggi tidak meningkatkan kemampuan diskriminasi SVM linear pada data ini. Oleh karena itu, cost sebesar 0,03125 dipilih sebagai hyperparameter terbaik karena menghasilkan ROC AUC tertinggi dengan kompleksitas model yang lebih sederhana dibandingkan alternatif lainnya.

collect_metrics(linear_tuned) |>
  filter(.metric == "roc_auc") |>
  ggplot(
    aes(
      x = cost,
      y = mean
    )
  ) +
  geom_ribbon(
    aes(
      ymin = mean - std_err,
      ymax = mean + std_err
    ),
    fill = "#F4C7D9",
    alpha = 0.65
  ) +
  geom_line(
    color = "#A83E72",
    linewidth = 1
  ) +
  geom_point(
    size = 2.8,
    color = "#C65A82"
  ) +
  scale_x_log10() +
  labs(
    x = "Cost (skala logaritmik)",
    y = "Rata-rata ROC AUC"
  )
Performa Validasi Silang SVM Linear pada Berbagai Nilai Cost

Performa Validasi Silang SVM Linear pada Berbagai Nilai Cost

Grafik menunjukkan bahwa performa SVM linear relatif stabil pada nilai cost rendah hingga menengah, kemudian cenderung menurun ketika cost semakin besar. Hal tersebut menunjukkan bahwa peningkatan penalti terhadap kesalahan klasifikasi tidak selalu meningkatkan kemampuan diskriminasi model. Area bayangan menunjukkan kisaran rata-rata ROC AUC ditambah dan dikurangi standard error pada lima lipatan. Area tersebut terlihat lebih lebar pada nilai cost yang besar, yang mengindikasikan bahwa performa antarlipatan cenderung lebih bervariasi. Oleh karena itu, cost sekitar 0,03125 dipilih sebagai nilai terbaik berdasarkan rata-rata ROC AUC tertinggi selama proses validasi silang.

5.2 Hasil Hyperparameter Tuning SVM Radial

rbf_best_table <- show_best(
  rbf_tuned,
  metric = "roc_auc",
  n = 10
)

knitr::kable(
  rbf_best_table |>
    select(
      cost,
      rbf_sigma,
      mean,
      std_err,
      n
    ) |>
    transmute(
      cost = signif(cost, 6),
      rbf_sigma = formatC(
        rbf_sigma,
        format = "e",
        digits = 3
      ),
      mean = round(mean, 6),
      std_err = round(std_err, 6),
      n
    ),
  caption = "Sepuluh Konfigurasi Terbaik SVM Radial Berdasarkan ROC AUC"
)
Sepuluh Konfigurasi Terbaik SVM Radial Berdasarkan ROC AUC
cost rbf_sigma mean std_err n
32.000000 3.162e-03 0.993799 0.003813 5
1.000000 3.162e-03 0.992973 0.003124 5
5.656850 3.162e-03 0.992870 0.004181 5
0.176777 3.162e-03 0.989148 0.003694 5
32.000000 1.000e-05 0.989042 0.003709 5
0.031250 3.162e-08 0.987078 0.004138 5
0.176777 3.162e-08 0.987078 0.004138 5
1.000000 3.162e-08 0.987078 0.004138 5
5.656850 3.162e-08 0.987078 0.004138 5
32.000000 3.162e-08 0.987078 0.004138 5

Berdasarkan hasil validasi silang, kombinasi hyperparameter terbaik untuk SVM radial adalah cost sebesar 32 dan rbf_sigma sebesar \(3{,}162 \times 10^{-3}\). Kombinasi tersebut menghasilkan rata-rata ROC AUC tertinggi, yaitu 0,993799, dengan standard error sebesar 0,003813 pada lima lipatan.

Beberapa kombinasi cost dan rbf_sigma menghasilkan nilai ROC AUC yang relatif tinggi, khususnya pada rbf_sigma sebesar \(3{,}162 \times 10^{-3}\). Namun, perbedaan ROC AUC antarkombinasi terbaik relatif kecil sehingga tidak menunjukkan pola peningkatan performa yang konsisten hanya akibat perubahan nilai cost. Hasil ini mengindikasikan bahwa performa model dipengaruhi oleh kombinasi kedua hyperparameter secara bersamaan.

Sebaliknya, kombinasi dengan rbf_sigma yang sangat kecil, yaitu \(3{,}162 \times 10^{-8}\), cenderung menghasilkan ROC AUC yang lebih rendah dibandingkan kombinasi terbaik. Dengan demikian, performa SVM radial dipengaruhi oleh interaksi antara cost dan rbf_sigma, bukan hanya oleh satu hyperparameter. Oleh karena itu, kombinasi cost = 32 dan rbf_sigma = 0,003162 dipilih sebagai hyperparameter final karena menghasilkan rata-rata ROC AUC tertinggi selama proses validasi silang.

rbf_plot_data <- collect_metrics(
  rbf_tuned
) |>
  filter(.metric == "roc_auc")

ggplot(
  rbf_plot_data,
  aes(
    x = cost,
    y = rbf_sigma,
    fill = mean
  )
) +
  geom_tile(
    color = "white",
    linewidth = 1
  ) +
  geom_text(
    aes(
      label = sprintf(
        "%.3f",
        mean
      )
    ),
    color = "#493A45",
    size = 3.2,
    fontface = "bold"
  ) +
  scale_x_log10() +
  scale_y_log10() +
  scale_fill_gradientn(
    colors = c(
      "#FDE8EF",
      "#F8C7D8",
      "#F6B8A8",
      "#DFC2EA",
      "#C4B5E8",
      "#B65C8A"
    ),
    name = "ROC AUC"
  ) +
  labs(
    x = "Cost (skala logaritmik)",
    y = "RBF sigma (skala logaritmik)"
  ) +
  theme(
    legend.key.width = grid::unit(
      1.8,
      "cm"
    ),
    panel.grid = element_blank()
  )
Performa Validasi Silang SVM Radial pada Kombinasi Cost dan RBF Sigma

Performa Validasi Silang SVM Radial pada Kombinasi Cost dan RBF Sigma

Heatmap menunjukkan bahwa performa SVM radial dipengaruhi oleh kombinasi cost dan rbf_sigma. Rata-rata ROC AUC tertinggi, yaitu sekitar 0,994, diperoleh pada kombinasi cost = 32 dan rbf_sigma = \(3{,}162 \times 10^{-3}\). Pada nilai rbf_sigma tersebut, ROC AUC cenderung meningkat ketika cost dinaikkan, meskipun peningkatannya relatif kecil pada beberapa kombinasi. Hal ini menunjukkan bahwa kombinasi kedua hyperparameter berperan dalam menentukan kemampuan diskriminasi model.

Nilai rbf_sigma yang sangat besar, yaitu sekitar 1, menghasilkan ROC AUC yang lebih rendah dibandingkan kombinasi terbaik, yaitu sekitar 0,959. Sementara itu, nilai rbf_sigma yang sangat kecil menghasilkan ROC AUC yang relatif seragam terhadap perubahan cost, yaitu sekitar 0,982–0,989. Hasil ini menunjukkan bahwa pengaruh cost terhadap performa model bergantung pada nilai rbf_sigma yang digunakan.

Secara keseluruhan, konfigurasi terbaik diperoleh pada kombinasi rbf_sigma tingkat menengah dan cost yang tinggi. Oleh karena itu, cost = 32 dan rbf_sigma = \(3{,}162 \times 10^{-3}\) dipilih untuk memfinalisasi SVM radial karena menghasilkan rata-rata ROC AUC tertinggi selama proses validasi silang.

5.3 Pemilihan Model Berdasarkan Cross-validation

best_linear <- select_best(
  linear_tuned,
  metric = "roc_auc"
)

best_rbf <- select_best(
  rbf_tuned,
  metric = "roc_auc"
)

cv_comparison <- bind_rows(
  show_best(
    linear_tuned,
    metric = "roc_auc",
    n = 1
  ) |>
    mutate(Model = "SVM Linear"),
  show_best(
    rbf_tuned,
    metric = "roc_auc",
    n = 1
  ) |>
    mutate(Model = "SVM Radial")
) |>
  select(
    Model,
    cost,
    rbf_sigma = any_of("rbf_sigma"),
    ROC_AUC_CV = mean,
    Standard_Error = std_err
  )

selected_kernel <- cv_comparison |>
  slice_max(
    ROC_AUC_CV,
    n = 1,
    with_ties = FALSE
  ) |>
  pull(Model)

knitr::kable(
  cv_comparison |>
    transmute(
      Model,
      Cost = signif(cost, 6),
      `RBF Sigma` = if_else(
        is.na(rbf_sigma),
        "-",
        formatC(
          rbf_sigma,
          format = "e",
          digits = 3
        )
      ),
      `ROC AUC CV` = round(
        ROC_AUC_CV,
        6
      ),
      `Galat baku` = round(
        Standard_Error,
        6
      )
    ),
  caption = "Perbandingan Konfigurasi Terbaik Berdasarkan Validasi Silang"
)
Perbandingan Konfigurasi Terbaik Berdasarkan Validasi Silang
Model Cost RBF Sigma ROC AUC CV Galat baku
SVM Linear 0.03125 - 0.993486 0.003651
SVM Radial 32.00000 3.162e-03 0.993799 0.003813

Berdasarkan hasil validasi silang, konfigurasi terbaik SVM radial menghasilkan rata-rata ROC AUC sebesar 0,993799, sedikit lebih tinggi dibandingkan SVM linear yang menghasilkan ROC AUC sebesar 0,993486. Selisih ROC AUC kedua model hanya sekitar 0,000313 sehingga kemampuan diskriminasi keduanya dapat dikatakan sangat serupa.

Nilai galat baku kedua model juga relatif kecil, yaitu 0,003651 untuk SVM linear dan 0,003813 untuk SVM radial. Hasil ini menunjukkan bahwa performa kedua model cukup konsisten antarlipatan validasi. Meskipun SVM radial menghasilkan rata-rata ROC AUC tertinggi, keunggulannya terhadap SVM linear sangat kecil.

Oleh karena itu, SVM radial dengan cost = 32 dan rbf_sigma = 0,003162 dipilih sebagai model utama berdasarkan nilai ROC AUC tertinggi. Namun, perbedaan performanya terhadap SVM linear tidak bersifat substantif.

5.4 Finalisasi dan Evaluasi Data Uji

linear_final_wf <- finalize_workflow(
  svm_linear_wf,
  best_linear
)

rbf_final_wf <- finalize_workflow(
  svm_rbf_wf,
  best_rbf
)

linear_final_fit <- last_fit(
  linear_final_wf,
  split = split_obj,
  metrics = svm_metrics
)

rbf_final_fit <- last_fit(
  rbf_final_wf,
  split = split_obj,
  metrics = svm_metrics
)

linear_pred <- collect_predictions(
  linear_final_fit
)

rbf_pred <- collect_predictions(
  rbf_final_fit
)

test_metrics <- bind_rows(
  collect_metrics(
    linear_final_fit
  ) |>
    mutate(Model = "SVM Linear"),
  collect_metrics(
    rbf_final_fit
  ) |>
    mutate(Model = "SVM Radial")
) |>
  select(
    Model,
    .metric,
    .estimate
  ) |>
  pivot_wider(
    names_from = .metric,
    values_from = .estimate
  ) |>
  arrange(
    desc(roc_auc)
  )

knitr::kable(
  test_metrics |>
    mutate(
      across(
        where(is.numeric),
        ~ round(.x, 6)
      )
    ) |>
    rename(
      Akurasi = accuracy,
      `ROC AUC` = roc_auc,
      `Sensitivitas malignant` = sens,
      Spesifisitas = spec
    ),
  caption = "Metrik Performa SVM pada Data Uji"
)
Metrik Performa SVM pada Data Uji
Model Akurasi Sensitivitas malignant Spesifisitas ROC AUC
SVM Radial 0.973913 0.953488 0.986111 0.996447
SVM Linear 0.973913 0.953488 0.986111 0.995801

Berdasarkan tabel metrik performa, SVM radial dan SVM linear menunjukkan kinerja yang sangat baik dalam mengklasifikasikan diagnosis kanker payudara pada data uji. Kedua model menghasilkan akurasi sebesar 97,39%, yang menunjukkan bahwa 97,39% observasi pada data uji berhasil diklasifikasikan dengan benar.

Nilai sensitivitas sebesar 95,35% menunjukkan bahwa sebagian besar kasus malignant berhasil dideteksi dengan benar. Meskipun demikian, terdapat dua kasus malignant yang diprediksi sebagai benign (false negative). Di sisi lain, spesifisitas sebesar 98,61% menunjukkan bahwa hampir seluruh kasus benign berhasil diklasifikasikan dengan benar.

Nilai ROC AUC yang mendekati 1 menunjukkan bahwa kedua model memiliki kemampuan diskriminasi yang sangat baik dalam membedakan kelas malignant dan benign. SVM radial memperoleh ROC AUC sedikit lebih tinggi, yaitu 0,9964, dibandingkan SVM linear sebesar 0,9958. Namun, selisih sebesar 0,0006 tersebut sangat kecil sehingga performa kedua model pada data uji dapat dikatakan hampir setara secara praktis.

Dengan demikian, pemilihan SVM radial sebagai model utama tetap didasarkan pada hasil validasi silang, bukan pada performa data uji. SVM radial dipilih karena menghasilkan rata-rata ROC AUC validasi silang yang sedikit lebih tinggi dibandingkan SVM linear.

5.5 Confusion Matrix

cm_linear <- conf_mat(
  linear_pred,
  truth = diagnosis,
  estimate = .pred_class
)

cm_rbf <- conf_mat(
  rbf_pred,
  truth = diagnosis,
  estimate = .pred_class
)

cm_table <- bind_rows(
  as.data.frame(
    cm_linear$table
  ) |>
    mutate(Model = "SVM Linear"),
  as.data.frame(
    cm_rbf$table
  ) |>
    mutate(Model = "SVM Radial")
) |>
  select(
    Model,
    Prediction,
    Truth,
    Freq
  )

ggplot(
  cm_table,
  aes(
    x = Truth,
    y = Prediction,
    fill = Freq
  )
) +
  geom_tile(
    color = "white",
    linewidth = 1.2
  ) +
  geom_text(
    aes(label = Freq),
    size = 5,
    fontface = "bold",
    color = "#493A45"
  ) +
  facet_wrap(~ Model) +
  scale_fill_gradientn(
    colors = c(
      "#FDECF2",
      "#F4C6D8",
      "#DABEE7",
      "#B45A87"
    )
  ) +
  coord_equal() +
  labs(
    x = "Kelas aktual",
    y = "Kelas prediksi",
    fill = "Jumlah"
  )
Confusion Matrix SVM Linear dan SVM Radial pada Data Uji

Confusion Matrix SVM Linear dan SVM Radial pada Data Uji

Confusion matrix menunjukkan bahwa kedua model menghasilkan klasifikasi yang identik pada data uji. Dari 43 kasus malignant, sebanyak 41 kasus diklasifikasikan dengan benar sebagai malignant, sedangkan dua kasus diprediksi sebagai benign (false negative). Hasil ini sejalan dengan sensitivitas sebesar 95,35%, yang menunjukkan bahwa sebagian besar kasus kanker payudara ganas berhasil dideteksi oleh model.

Untuk kelas benign, sebanyak 71 dari 72 kasus diklasifikasikan dengan benar, sedangkan satu kasus benign diprediksi sebagai malignant (false positive). Kesalahan tersebut menyebabkan spesifisitas tidak mencapai 100%, tetapi tetap sangat tinggi, yaitu 98,61%.

Secara keseluruhan, kedua model menghasilkan tiga kesalahan klasifikasi dari 115 observasi pada data uji sehingga memperoleh akurasi sebesar 97,39%. Meskipun jumlah false negative relatif kecil dibandingkan total kasus malignant, performa agregat yang tinggi tidak menjamin bahwa seluruh kasus malignant dapat dideteksi.

Dalam konteks medis, dua kasus false negative tersebut tetap perlu mendapat perhatian karena pasien dengan tumor ganas dapat memperoleh hasil prediksi benign. Kesalahan semacam ini berpotensi menimbulkan rasa aman yang keliru serta menunda pemeriksaan dan penanganan lebih lanjut. Oleh karena itu, sensitivitas dan jumlah false negative perlu dipertimbangkan bersama dengan akurasi dan ROC AUC ketika mengevaluasi kelayakan model.

5.6 Kurva ROC dan AUC

roc_test <- bind_rows(
  roc_curve(
    linear_pred,
    truth = diagnosis,
    .pred_Malignant
  ) |>
    mutate(Model = "SVM Linear"),
  roc_curve(
    rbf_pred,
    truth = diagnosis,
    .pred_Malignant
  ) |>
    mutate(Model = "SVM Radial")
)

ggplot(
  roc_test,
  aes(
    x = 1 - specificity,
    y = sensitivity,
    color = Model
  )
) +
  geom_path(linewidth = 1.2) +
  geom_abline(
    slope = 1,
    intercept = 0,
    linetype = 2,
    color = "#A990A1"
  ) +
  coord_equal() +
  scale_color_manual(
    values = c(
      "SVM Linear" = "#A83E72",
      "SVM Radial" = "#B394D6"
    )
  ) +
  labs(
    x = "1 - spesifisitas",
    y = "Sensitivitas",
    color = "Model"
  )
Kurva ROC SVM Linear dan SVM Radial pada Data Uji

Kurva ROC SVM Linear dan SVM Radial pada Data Uji

Kurva ROC kedua model berada dekat dengan sudut kiri atas dan jauh dari garis diagonal klasifikasi acak. Semakin dekat kurva ke sudut kiri atas, semakin tinggi sensitivitas yang dapat dicapai dengan tingkat kesalahan klasifikasi yang rendah. Hal tersebut menunjukkan bahwa kedua model memiliki kemampuan diskriminasi yang sangat baik. Kurva yang hampir bertumpuk juga menunjukkan bahwa perbedaan performa kedua model relatif kecil, sehingga secara praktis tidak menunjukkan perbedaan performa yang substantif.

5.7 Analisis False Negative

False negative merupakan kasus dengan diagnosis aktual malignant, tetapi diprediksi sebagai benign. Kesalahan ini penting karena dapat menyebabkan kasus tumor ganas tidak terdeteksi oleh model.

false_negative_summary <- bind_rows(
  linear_pred |>
    summarise(
      Model = "SVM Linear",
      False_Negative = sum(
        diagnosis == "Malignant" &
          .pred_class == "Benign"
      ),
      Total_Malignant = sum(
        diagnosis == "Malignant"
      )
    ),
  rbf_pred |>
    summarise(
      Model = "SVM Radial",
      False_Negative = sum(
        diagnosis == "Malignant" &
          .pred_class == "Benign"
      ),
      Total_Malignant = sum(
        diagnosis == "Malignant"
      )
    )
) |>
  mutate(
    False_Negative_Rate =
      False_Negative / Total_Malignant
  )

knitr::kable(
  false_negative_summary |>
    mutate(
      False_Negative_Rate =
        scales::percent(
          False_Negative_Rate,
          accuracy = 0.1
        )
    ),
  caption = "Kasus Malignant yang Salah Diprediksi sebagai Benign"
)
Kasus Malignant yang Salah Diprediksi sebagai Benign
Model False_Negative Total_Malignant False_Negative_Rate
SVM Linear 2 43 4.7%
SVM Radial 2 43 4.7%

Analisis false negative menunjukkan bahwa kedua model menghasilkan dua kasus false negative dari total 43 kasus malignant pada data uji sehingga diperoleh false negative rate sebesar 4,7%. Artinya, dua kasus kanker payudara ganas salah diklasifikasikan sebagai benign.

Proporsi false negative tersebut relatif rendah dan konsisten dengan sensitivitas sebesar 95,35%. Hasil ini menunjukkan bahwa SVM linear dan SVM radial memiliki kemampuan yang sangat baik dalam mendeteksi kasus malignant, meskipun belum mampu mengidentifikasi seluruh kasus secara sempurna.

Dalam konteks diagnosis kanker payudara, keberadaan false negative tetap perlu mendapat perhatian karena pasien yang sebenarnya memiliki tumor ganas berpotensi tidak memperoleh pemeriksaan lanjutan dan penanganan medis yang diperlukan. Oleh karena itu, meskipun performa kedua model secara keseluruhan sangat baik, keberadaan dua kasus false negative menunjukkan bahwa prediksi model tidak dapat digunakan sebagai pengganti diagnosis klinis dan perlu dipertimbangkan bersama hasil pemeriksaan medis lainnya.

6 Interpretasi dan Diskusi

Model utama yang dipilih melalui cross-validation adalah SVM Radial. Pada data uji, model tersebut menghasilkan akurasi sebesar 97.4%, sensitivitas kelas malignant sebesar 95.3%, spesifisitas sebesar 98.6%, dan ROC AUC sebesar 0.996447. Hasil tersebut menunjukkan bahwa model memiliki kemampuan yang sangat baik dalam membedakan diagnosis malignant dan benign pada data uji.

Sensitivitas kelas malignant menunjukkan proporsi kasus tumor ganas yang berhasil dikenali oleh model. Pada model utama terdapat 2 kasus malignant yang diprediksi sebagai benign (false negative). Kesalahan tersebut lebih kritis dibandingkan false positive karena berpotensi menyebabkan keterlambatan pemeriksaan lanjutan pada pasien yang sebenarnya memiliki tumor ganas.

Meskipun jumlah false negative relatif kecil, keberadaan kasus tersebut menunjukkan bahwa model belum mampu mendeteksi seluruh kasus malignant secara sempurna. Oleh karena itu, performa model perlu dievaluasi tidak hanya berdasarkan akurasi dan ROC AUC, tetapi juga berdasarkan implikasi praktis dari kesalahan klasifikasi yang dihasilkan.

Pada proses cross-validation, ROC AUC rata-rata SVM linear dan SVM radial praktis setara, yaitu 0.9935 dan 0.9938. Model utama tetap ditetapkan berdasarkan nilai numerik tertinggi tanpa menggunakan data uji. Pada data uji, ROC AUC kedua kernel juga praktis setara. Data uji hanya digunakan untuk evaluasi akhir dan tidak digunakan untuk mengulang proses hyperparameter tuning.

Analisis ini memiliki beberapa keterbatasan. Pertama, ukuran data relatif kecil dan evaluasi akhir hanya menggunakan satu pembagian data latih dan data uji sehingga hasil dapat dipengaruhi oleh variasi sampel. Kedua, model belum divalidasi menggunakan data eksternal dari institusi atau populasi yang berbeda sehingga kemampuan generalisasinya di luar dataset penelitian belum dapat dipastikan. Ketiga, SVM merupakan model yang berfokus pada akurasi prediksi dan tidak memberikan interpretasi pengaruh masing-masing prediktor secara langsung seperti model parametrik. Keempat, model ini dikembangkan untuk tujuan akademik dan tidak dimaksudkan untuk menggantikan diagnosis klinis maupun pemeriksaan patologis yang dilakukan oleh tenaga medis.

7 Kesimpulan

Hasil analisis menunjukkan bahwa karakteristik morfologi inti sel pada data WDBC mampu memberikan informasi diskriminatif yang kuat untuk membedakan diagnosis malignant dan benign. Prediktor yang menggambarkan ukuran dan ketidakteraturan kontur inti sel, seperti radius, luas, konkavitas, dan titik cekung, menunjukkan perbedaan distribusi yang jelas antara kedua kelas. Meskipun demikian, adanya tumpang tindih pada beberapa prediktor menunjukkan bahwa diagnosis tidak dapat ditentukan hanya berdasarkan satu karakteristik, tetapi memerlukan kombinasi beberapa informasi secara simultan.

Berdasarkan rata-rata ROC AUC dari 5-fold cross-validation pada data latih, model yang dipilih adalah SVM Radial. Pada data uji, model tersebut menghasilkan akurasi sebesar 97.4%, sensitivitas kelas malignant sebesar 95.3%, spesifisitas sebesar 98.6%, dan ROC AUC sebesar 0.996. Hasil tersebut menunjukkan bahwa model memiliki kemampuan diskriminasi yang sangat baik dalam membedakan kedua kelas pada data uji.

Meskipun demikian, performa agregat yang tinggi tidak berarti bahwa model terbebas dari kesalahan yang penting secara klinis. Model utama masih menghasilkan 2 kasus false negative, yaitu sampel malignant yang diprediksi sebagai benign. Kesalahan ini lebih serius dibandingkan false positive karena berpotensi memberikan keyakinan yang keliru bahwa pasien tidak memiliki keganasan sehingga dapat menunda pemeriksaan lanjutan maupun penanganan yang diperlukan. Dengan kata lain, meskipun tingkat false negative hanya sekitar 4,7%, konsekuensi dari setiap kasus yang tidak terdeteksi tetap perlu menjadi perhatian utama dalam evaluasi model untuk aplikasi medis.

Perbandingan SVM linear dan SVM radial menunjukkan bahwa kedua model memiliki performa yang hampir setara, baik pada tahap validasi silang maupun pada data uji. Keunggulan SVM radial berdasarkan ROC AUC relatif kecil sehingga tidak menunjukkan peningkatan performa yang substantif dibandingkan SVM linear. Hasil ini mengindikasikan bahwa fleksibilitas batas keputusan nonlinier tidak selalu memberikan keuntungan yang berarti pada data yang telah memiliki pemisahan kelas cukup baik.

Temuan penelitian ini masih terbatas pada satu pembagian data latih dan data uji serta belum divalidasi pada populasi eksternal. Oleh karena itu, model yang dihasilkan belum dapat digunakan sebagai pengganti diagnosis klinis. Penelitian selanjutnya perlu mengevaluasi strategi untuk menurunkan jumlah false negative, misalnya melalui penyesuaian ambang klasifikasi, pemberian bobot yang lebih besar pada kelas malignant, atau penggunaan metode lain yang lebih berorientasi pada sensitivitas. Dengan demikian, pengembangan model tidak hanya berfokus pada peningkatan akurasi dan ROC AUC, tetapi juga pada pengurangan risiko tidak terdeteksinya kasus keganasan.

8 Referensi

  1. WHO. (2026, April 16). Breast cancer. World Health Organization. https://www.who.int/news-room/fact-sheets/detail/breast-cancer

  2. Wolberg, W., Mangasarian, O., Street, N., & Street, W. (1993). Breast Cancer Wisconsin (Diagnostic) [Dataset]. UCI Machine Learning Repository. https://doi.org/10.24432/C5DW2B

  3. Cortes, C., & Vapnik, V. (1995). Support-vector networks. Machine Learning, 20, 273–297. https://doi.org/10.1007/BF00994018

  4. Al-Mejibli, I. S., Alwan, J. K., & Abd, D. H. (2020). The effect of gamma value on support vector machine performance with different kernels. International Journal of Electrical and Computer Engineering, 10(5), 5497–5506. https://doi.org/10.11591/ijece.v10i5.pp5497-5506

  5. Szeghalmy, S., & Fazekas, A. (2023). A comparative study of stratified cross-validation and distribution-balanced stratified cross-validation in imbalanced learning. Sensors, 23(4), 2333. https://doi.org/10.3390/s23042333

  6. Allgaier, J., & Pryss, R. (2024). Cross-validation visualized: A narrative guide to advanced methods. Machine Learning and Knowledge Extraction, 6(2), 1378–1388. https://doi.org/10.3390/make6020065

  7. Tharwat, A. (2020). Classification assessment methods. Applied Computing and Informatics, 17(1), 168–192. https://doi.org/10.1016/j.aci.2018.08.003

  8. parsnip. Linear support vector machines. https://parsnip.tidymodels.org/reference/svm_linear.html

  9. parsnip. Radial basis function support vector machines. https://parsnip.tidymodels.org/reference/svm_rbf.html

9 Informasi Sesi

sessionInfo()
## R version 4.3.1 (2023-06-16 ucrt)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 11 x64 (build 26200)
## 
## Matrix products: default
## 
## 
## locale:
## [1] LC_COLLATE=English_Indonesia.utf8  LC_CTYPE=English_Indonesia.utf8   
## [3] LC_MONETARY=English_Indonesia.utf8 LC_NUMERIC=C                      
## [5] LC_TIME=English_Indonesia.utf8    
## 
## time zone: Asia/Jakarta
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
##  [1] kableExtra_1.4.0   kernlab_0.9-32     yardstick_1.3.2    workflowsets_1.1.0
##  [5] workflows_1.3.0    tune_1.3.0         rsample_1.3.2      recipes_1.3.3     
##  [9] parsnip_1.6.0      modeldata_1.5.1    infer_1.1.0        dials_1.4.3       
## [13] scales_1.4.0       broom_1.0.13       tidymodels_1.3.0   lubridate_1.9.4   
## [17] forcats_1.0.0      stringr_1.5.0      dplyr_1.1.4        purrr_1.0.4       
## [21] readr_2.1.5        tidyr_1.3.1        tibble_3.2.1       ggplot2_4.0.3     
## [25] tidyverse_2.0.0   
## 
## loaded via a namespace (and not attached):
##  [1] conflicted_1.2.0    rlang_1.1.5         magrittr_2.0.3     
##  [4] furrr_0.3.1         compiler_4.3.1      systemfonts_1.2.2  
##  [7] vctrs_0.6.5         lhs_1.2.0           crayon_1.5.2       
## [10] pkgconfig_2.0.3     fastmap_1.2.0       backports_1.5.0    
## [13] labeling_0.4.3      utf8_1.2.3          rmarkdown_2.29     
## [16] prodlim_2024.06.25  tzdb_0.4.0          bit_4.0.5          
## [19] xfun_0.52           cachem_1.1.0        jsonlite_2.0.0     
## [22] parallel_4.3.1      R6_2.5.1            bslib_0.8.0        
## [25] stringi_1.7.12      RColorBrewer_1.1-3  parallelly_1.43.0  
## [28] rpart_4.1.19        jquerylib_0.1.4     Rcpp_1.0.13-1      
## [31] iterators_1.0.14    knitr_1.49          future.apply_1.11.3
## [34] Matrix_1.6-1        splines_4.3.1       nnet_7.3-19        
## [37] timechange_0.3.0    tidyselect_1.2.1    rstudioapi_0.19.0  
## [40] dichromat_2.0-0.1   yaml_2.3.10         timeDate_4041.110  
## [43] codetools_0.2-19    curl_5.0.2          listenv_0.9.1      
## [46] lattice_0.21-8      withr_2.5.0         S7_0.2.0           
## [49] evaluate_1.0.5      future_1.34.0       survival_3.5-5     
## [52] xml2_1.3.6          pillar_1.9.0        foreach_1.5.2      
## [55] generics_0.1.4      vroom_1.6.5         hms_1.1.3          
## [58] globals_0.18.0      class_7.3-22        glue_1.8.0         
## [61] tools_4.3.1         data.table_1.16.2   gower_1.0.2        
## [64] grid_4.3.1          ipred_0.9-15        cli_3.6.4          
## [67] DiceDesign_1.10     fansi_1.0.4         viridisLite_0.4.2  
## [70] svglite_2.1.3       lava_1.8.1          gtable_0.3.6       
## [73] GPfit_1.0-8         sass_0.4.9          digest_0.6.37      
## [76] farver_2.1.2        memoise_2.0.1       htmltools_0.5.8.1  
## [79] lifecycle_1.0.5     hardhat_1.4.3       sparsevctrs_0.3.2  
## [82] bit64_4.0.5         MASS_7.3-60