Bab 1. Pendahuluan

1.1 Latar Belakang

Beton merupakan salah satu material yang banyak digunakan dalam bidang konstruksi. Salah satu ukuran penting untuk melihat kualitas beton adalah kuat tekan beton. Kuat tekan beton menunjukkan kemampuan beton dalam menahan beban tekan. Oleh karena itu, nilai kuat tekan beton penting untuk diketahui karena dapat menjadi gambaran awal mengenai kualitas beton yang dihasilkan.

Kuat tekan beton tidak hanya dipengaruhi oleh satu faktor saja. Pada dataset Concrete Compressive Strength, variabel yang digunakan untuk memprediksi kuat tekan beton terdiri atas semen, blast furnace slag, fly ash, air, superplasticizer, agregat kasar, agregat halus, dan umur beton (Yeh, 2007). Dataset tersebut terdiri atas 1030 observasi, 8 fitur, dan 1 target, serta termasuk ke dalam permasalahan regresi (Yeh, 2007). Dataset Concrete Compressive Strength dari UCI Machine Learning Repository juga menjelaskan bahwa kuat tekan beton merupakan fungsi yang sangat non-linear dari umur beton dan bahan penyusunnya.

Permasalahan yang dibahas dalam penelitian ini adalah bagaimana memprediksi nilai kuat tekan beton berdasarkan komposisi bahan dan umur beton. Hal ini penting karena kuat tekan beton tidak memiliki hubungan yang benar-benar sederhana dengan bahan penyusunnya. UCI Machine Learning Repository (2007) menjelaskan bahwa kuat tekan beton merupakan fungsi yang sangat non-linear dari umur dan bahan penyusun beton. Selain itu, Yeh (1998) juga menjelaskan bahwa perkembangan kuat tekan beton tidak hanya ditentukan oleh rasio air terhadap semen, tetapi juga dipengaruhi oleh kandungan bahan penyusun beton lainnya.

library(tidyverse)
library(readxl)
library(tidymodels)
library(kernlab)

set.seed(15062026)

# Input file Excel resmi UCI
if (file.exists("Concrete_Data.xls")) {
  concrete <- read_excel("Concrete_Data.xls")
} else {
  download.file(
    "https://archive.ics.uci.edu/ml/machine-learning-databases/concrete/compressive/Concrete_Data.xls",
    destfile = "Concrete_Data.xls",
    mode = "wb"
  )
  concrete <- read_excel("Concrete_Data.xls")
}

concrete <- concrete |>
  setNames(c(
    "cement", "slag", "fly_ash", "water", "superplasticizer",
    "coarse_aggregate", "fine_aggregate", "age", "strength"
  )) |>
  mutate(across(everything(), as.numeric))

# EDA awal
ggplot(concrete, aes(age, strength)) +
  geom_point(alpha = 0.5) +
  geom_smooth(method = "loess", se = FALSE) +
  labs(title = "Gambar 1. Hubungan Umur Beton Terhadap Kuat Tekan Beton", x = "Umur Beton (days)", y = "Kuat Tekan Beton (MPa)")

Berdasarkan gambar tersebut, terlihat bahwa terdapat pola non-linear antara umur beton dan kuat tekan beton. Selain itu, terlihat juga bahwa kuat tekan beton cenderung meningkat cukup cepat pada umur awal dan setelah umur beton tersebut semakin tinggi, peningkatannya mulai melambat dan tidak membentuk pola garis lurus yang sederhana. Hal ini menunjukkan bahwa hubungan antara umur beton dan kuat tekan beton tidak sepenuhnya linear. Oleh karena itu, penggunaan model yang mampu menangkap pola non-linear sangat penting dalam penelitian ini.

Salah satu metode yang dapat digunakan untuk memodelkan hubungan non-linear adalah Support Vector Regression (SVR) dengan kernel radial basis function (RBF). svm_rbf() dapat digunakan pada model regresi dan menggunakan fungsi non-linear dari variabel prediktor (Kuhn & Vaughan, 2026). Oleh karena itu, penelitian ini akan menggunakan SVR dengan kernel RBF untuk memprediksi kuat tekan beton berdasarkan komposisi bahan pembuat beton dan umur beton.

1.2 Tujuan Penelitian

Berdasarkan latar belakang, dapat diidentifikasi beberapa permasalahan utama dalam penelitian ini, yaitu:

  1. Membangun dan mengevaluasi model SVR dengan kernel RBF dalam memprediksi nilai kuat tekan beton (strength).
  2. Membandingkan hasil prediksi SVR dengan model dasar regresi linear.
  3. Melihat variabel apa saja yang paling berkontribusi terhadap hasil prediksi model SVR.

1.3 Pertanyaan Prediksi

Berdasarkan tujuan penelitian, pertanyaan prediksi pada penelitian ini ialah:

  1. Seberapa baik model SVR dengan kernel RBF dalam memprediksi kuat tekan beton berdasarkan komposisi bahan dan umur beton?
  2. Apakah model SVR mampu memberikan hasil prediksi yang lebih baik dibandingkan regresi linear?
  3. Variabel apa saja yang paling berkontribusi terhadap prediksi kuat tekan beton pada model SVR?

Bab 2. Deskripsi Data Penelitian

2.1 Sumber Data

Penelitian ini menggunakan data sekunder yang diperoleh dari UCI Machine Learning Repository, yaitu dataset Concrete Compressive Strength. Dataset ini dapat diakses melalui tautan berikut: https://archive.ics.uci.edu/dataset/165/concrete+compressive+strength. Dataset Concrete Compressive Strength berisi data mengenai komposisi bahan penyusun beton, umur beton, serta nilai kekuatan tekanan beton itu sendiri. Data ini digunakan karena sesuai dengan tujuan penelitian, yaitu membangun model yang berguna untuk memprediksi kekuatan tekanan beton berdasarkan komposisi material dan umur beton. Dataset ini termasuk ke dalam data tabular karena setiap observasi direpresentasikan dalam bentuk baris data, sedangkan setiap variabel direpresentasikan dalam bentuk kolom.

dimensi_data <- tibble( 
  Keterangan = c("Jumlah observasi/baris", "Jumlah variabel/kolom"), 
  Nilai = c(nrow(concrete), ncol(concrete)) 
) 

knitr::kable( 
  dimensi_data, caption = "Tabel 1. Jumlah Observasi dan Variabel pada Dataset" 
)
Tabel 1. Jumlah Observasi dan Variabel pada Dataset
Keterangan Nilai
Jumlah observasi/baris 1030
Jumlah variabel/kolom 9

Berdasarkan tabel tersebut, terlihat bahwa dataset Concrete Compressive Strength terdiri dari 1030 observasi dan 9 variabel yang terdiri atas 8 variabel prediktor (fitur) dan 1 variabel target.

2.2 Unit Observasi

Unit observasi pada penelitian ini adalah satu sampel campuran beton. Setiap observasi merepresentasikan satu komposisi campuran beton tertentu yang terdiri dari beberapa bahan penyusun, seperti semen, air, agregat, dan bahan tambahan lainnya. Selain itu, setiap observasi juga memiliki informasi umur beton serta nilai kekuatan tekanan beton yang dihasilkan. Dengan demikian, setiap baris pada dataset menunjukkan satu pengamatan terhadap campuran beton dengan karakteristik tertentu. Data ini digunakan untuk mempelajari hubungan antara komposisi bahan dan umur beton terhadap kekuatan tekanan beton.

2.3 Variabel Respons

Variabel respons atau variabel target pada penelitian ini adalah strength, yaitu Concrete Compressive Strength atau kekuatan tekanan beton. Variabel ini memiliki satuan MPa dan berbentuk numerik kontinu. Karena variabel target berupa nilai numerik, maka penelitian ini termasuk ke dalam permasalahan supervised learning.

2.4 Variabel Prediktor

Variabel prediktor pada penelitian ini terdiri atas 8 variabel yang menggambarkan komposisi material beton dan umur beton. Sebagian besar variabel memiliki satuan kg/m³, sedangkan variabel umur beton memiliki satuan hari. Adapun variabel prediktor yang digunakan dalam penelitian ini ialah sebagai berikut:

variabel_dataset <- tibble(
  Variabel = c("cement","slag","fly_ash","water","superplasticizer",
               "coarse_aggregate","fine_aggregate","age"
               ),
  Nama_Asli = c("Cement","Blast Furnace Slag","Fly Ash","Water",
                "Superplasticizer","Coarse Aggregate","Fine Aggregate","Age"
                ),
  Pengertian = c("Jumlah semen dalam campuran beton",
                 "Jumlah terak tanur tinggi sebagai bahan tambahan",
                 "Jumlah abu terbang sebagai bahan tambahan",
                 "Jumlah air dalam campuran beton",
                 "Jumlah bahan kimia pengurang air",
                 "Jumlah agregat kasar dalam campuran",
                 "Jumlah agregat halus dalam campuran",
                 "Umur beton saat pengujian"
                 ),
  Tipe_Data = c("Numerik kontinu","Numerik","Numerik kontinu","Numerik kontinu",
                "Numerik kontinu","Numerik kontinu","Numerik kontinu","Numerik"
                ),
  Satuan = c("kg/m³","kg/m³","kg/m³","kg/m³","kg/m³","kg/m³","kg/m³","hari"
             )
  )

knitr::kable(variabel_dataset,
             caption = "Tabel 2. Deskripsi Variabel pada Dataset Concrete Compressive Strength"
)
Tabel 2. Deskripsi Variabel pada Dataset Concrete Compressive Strength
Variabel Nama_Asli Pengertian Tipe_Data Satuan
cement Cement Jumlah semen dalam campuran beton Numerik kontinu kg/m³
slag Blast Furnace Slag Jumlah terak tanur tinggi sebagai bahan tambahan Numerik kg/m³
fly_ash Fly Ash Jumlah abu terbang sebagai bahan tambahan Numerik kontinu kg/m³
water Water Jumlah air dalam campuran beton Numerik kontinu kg/m³
superplasticizer Superplasticizer Jumlah bahan kimia pengurang air Numerik kontinu kg/m³
coarse_aggregate Coarse Aggregate Jumlah agregat kasar dalam campuran Numerik kontinu kg/m³
fine_aggregate Fine Aggregate Jumlah agregat halus dalam campuran Numerik kontinu kg/m³
age Age Umur beton saat pengujian Numerik hari

Berdasarkan tabel tersebut, terlihat bahwa variabel prediktor yang digunakan dalam penelitian ini adalah cement, slag, fly_ash, water, superplasticizer, coarse_aggregate, fine_aggregate, dan age. Variabel-variabel tersebut digunakan untuk memprediksi nilai strength sebagai variabel target.

2.5 Dimensi Data

Dataset Concrete Compressive Strength memiliki 1030 observasi dan 9 variabel sebelum dilakukan proses data cleaning. Setelah dilakukan pengecekan awal, ditemukan adanya data duplikat sehingga dilakukan penghapusan data duplikat. Dataset akhir yang digunakan dalam analisis adalah concrete_clean.

dimensi_data <- tibble(
  Keterangan = c(
    "Data Awal",
    "Data Setelah Data Cleaning"
  ),
  `Jumlah Observasi` = c(
    nrow(concrete),
    1005
  ),
  `Jumlah Variabel` = c(
    ncol(concrete),
    9
  )
)

knitr::kable(
  dimensi_data,
  col.names = c("", "Jumlah Observasi", "Jumlah Variabel"),
  caption = "Tabel 3. Dimensi Dataset Kuat Tekan Beton"
)
Tabel 3. Dimensi Dataset Kuat Tekan Beton
Jumlah Observasi Jumlah Variabel
Data Awal 1030 9
Data Setelah Data Cleaning 1005 9

Berdasarkan tabel tersebut, jumlah data awal adalah 1030 observasi dengan 9 variabel. Setelah dilakukan proses data cleaning, jumlah observasi menjadi 1005, sedangkan jumlah variabel tetap sebanyak 9 variabel.

2.6 Konteks Analisis

Konteks analisis pada penelitian ini adalah prediksi kekuatan tekanan beton berdasarkan komposisi bahan dan umur beton. Kekuatan tekanan beton merupakan salah satu indikator penting dalam menilai kualitas beton. Nilai kekuatan tekanan beton dapat dipengaruhi oleh berbagai faktor, seperti jumlah semen, air, agregat, bahan tambahan lainnya, serta umur beton saat pengujian berlangsung. Penelitian ini menggunakan pendekatan Support Vector Regression (SVR) karena target yang diprediksi berupa nilai numerik kontinu. Selain itu, hasil eksplorasi awal menunjukkan bahwa hubungan antara beberapa variabel prediktor dan kekuatan tekanan beton tidak sepenuhnya linear. Oleh karena itu, SVR dengan kernel radial basis function atau RBF digunakan karena mampu menangkap pola hubungan non-linear antara variabel prediktor dan variabel target. Dengan demikian, fokus utama pada penelitian ini adalah membangun model yang mampu memprediksi nilai kekuatan tekanan beton secara akurat berdasarkan komposisi material dan umur beton.

Bab 3. Prapemrosesan dan EDA

3.1 Data Cleaning

Sebelum memulai analisis data dan pemodelan, dataset perlu dilakukan pemeriksaan untuk memastikan kualitas data yang akan digunakan. Umumnya, dataset mentah memiliki potensi mengandung permasalahan, seperti data kosong (missing value), data duplikat, ketidaksesuaian tipe data, dan nilai pencilan (outlier). Jika terbukti dataset memiliki missing value atau permasalahan data lainnya maka perlu penanganan khusus pada dataset agar nantinya dataset memiliki kualitas yang baik dan bisa digunakan untuk penelitian. Oleh karena itu, penting untuk dilakukan pengecekan awal pada dataset. Berikut merupakan hasil pengecekan dataset kekuatan tekanan beton dan penanganannya:

3.1.1 Missing Value

Missing value merupakan nilai kosong pada suatu variabel. Jika dataset memiliki nilai kosong pada dataset dan jika tidak ditangani dengan tepat maka akan menyebabkan bias pada pengolahan data. Berikut merupakan hasil pengecekan missing value pada dataset kekuatan tekanan beton:

missing_table <- concrete |>
  summarise(across(everything(), ~ sum(is.na(.x)))) |>
  pivot_longer(
    cols = everything(),
    names_to = "Variabel",
    values_to = "Jumlah_Missing"
  ) |>
  mutate(
    Persentase_Missing = round((Jumlah_Missing / nrow(concrete)) * 100, 2)
  )

knitr::kable(
  missing_table,
  caption = "Tabel 4. Hasil Pengecekan Missing Value pada Dataset Kekuatan Tekanan Beton"
)
Tabel 4. Hasil Pengecekan Missing Value pada Dataset Kekuatan Tekanan Beton
Variabel Jumlah_Missing Persentase_Missing
cement 0 0
slag 0 0
fly_ash 0 0
water 0 0
superplasticizer 0 0
coarse_aggregate 0 0
fine_aggregate 0 0
age 0 0
strength 0 0

Pada tabel tersebut, terlihat bahwa dataset kekuatan tekanan beton tidak memiliki missing value. Maka pengecekan dapat dilanjutkan dengan pengecekan unique value.

3.1.2 Unique Value

Unique value merupakan nilai yang tidak wajar pada suatu variabel. Jika dataset memiliki unique value pada dataset dan jika tidak ditangani dengan tepat maka akan menyebabkan bias pada pengolahan data. Berikut merupakan hasil pengecekan unique value pada dataset kekuatan tekanan beton:

# Membaca ulang data sebelum dikonversi menjadi numerik
concrete_raw <- read_excel("Concrete_Data.xls") |>
  setNames(c(
    "cement", "slag", "fly_ash", "water", "superplasticizer",
    "coarse_aggregate", "fine_aggregate", "age", "strength"
  ))

# Mengecek apakah ada nilai non-numerik / teks
cek_teks <- map_dfr(names(concrete_raw), function(col) {
  x <- concrete_raw[[col]]
  x_char <- as.character(x)
  
  # Deteksi nilai yang bukan missing tetapi tidak bisa dikonversi menjadi numeric
  non_numeric <- !is.na(x_char) & 
    trimws(x_char) != "" & 
    is.na(suppressWarnings(as.numeric(x_char)))
  
  tibble(
    Variabel = col,
    Tipe_Data_Awal = paste(class(x), collapse = ", "),
    Jumlah_Teks_Non_Numerik = sum(non_numeric),
    Contoh_Teks_Non_Numerik = ifelse(
      sum(non_numeric) > 0,
      paste(head(unique(x_char[non_numeric]), 5), collapse = ", "),
      "-"
    )
  )
})

knitr::kable(
  cek_teks,
  caption = "Tabel 5. Hasil Pengecekan Non-Numerik pada Setiap Variabel"
)
Tabel 5. Hasil Pengecekan Non-Numerik pada Setiap Variabel
Variabel Tipe_Data_Awal Jumlah_Teks_Non_Numerik Contoh_Teks_Non_Numerik
cement numeric 0 -
slag numeric 0 -
fly_ash numeric 0 -
water numeric 0 -
superplasticizer numeric 0 -
coarse_aggregate numeric 0 -
fine_aggregate numeric 0 -
age numeric 0 -
strength numeric 0 -

Pada tabel tersebut, terlihat bahwa dataset kekuatan tekanan beton tidak memiliki nilai non numerik.

# Membuat aturan sederhana untuk mendeteksi nilai yang kemungkinan tidak wajar
cek_nilai_tidak_wajar <- concrete |>
  summarise(
    cement_negatif = sum(cement < 0, na.rm = TRUE),
    slag_negatif = sum(slag < 0, na.rm = TRUE),
    fly_ash_negatif = sum(fly_ash < 0, na.rm = TRUE),
    water_negatif = sum(water < 0, na.rm = TRUE),
    superplasticizer_negatif = sum(superplasticizer < 0, na.rm = TRUE),
    coarse_aggregate_negatif = sum(coarse_aggregate < 0, na.rm = TRUE),
    fine_aggregate_negatif = sum(fine_aggregate < 0, na.rm = TRUE),
    age_negatif = sum(age < 0, na.rm = TRUE),
    strength_negatif = sum(strength < 0, na.rm = TRUE)
  ) |>
  pivot_longer(
    cols = everything(),
    names_to = "Jenis_Pengecekan",
    values_to = "Jumlah_Data_Bermasalah"
  ) |>
  mutate(
    Keterangan = ifelse(
      Jumlah_Data_Bermasalah > 0,
      "Perlu diperiksa",
      "Aman"
    )
  )

knitr::kable(
  cek_nilai_tidak_wajar,
  caption = "Tabel 6. Hasil Pengecekan Nilai Numerik yang Tidak Wajar"
)
Tabel 6. Hasil Pengecekan Nilai Numerik yang Tidak Wajar
Jenis_Pengecekan Jumlah_Data_Bermasalah Keterangan
cement_negatif 0 Aman
slag_negatif 0 Aman
fly_ash_negatif 0 Aman
water_negatif 0 Aman
superplasticizer_negatif 0 Aman
coarse_aggregate_negatif 0 Aman
fine_aggregate_negatif 0 Aman
age_negatif 0 Aman
strength_negatif 0 Aman

Pada tabel tersebut, terlihat bahwa dataset kekuatan tekanan beton tidak memiliki nilai negatif. Maka pengecekan dapat dilanjutkan dengan pengecekan Duplicate Data.

3.1.3 Duplicate Data

Duplicate data merupakan nilai-nilai pada beberapa observasi yang sama. Tidak semua dataset yang memiliki duplikasi akan menyebebkan masalah dalam penelitian, seperti data penjualan harian, dsb. Jika dataset kekuatan tekanan beton ini memiliki data kosong maka akan menyebabkan observasi tertentu memiliki bobot yang lebih besar dalam proses pemodelan. Berikut merupakan hasil pengecekan data duplikat pada dataset kekuatan tekanan beton:

jumlah_duplikat <- sum(duplicated(concrete))
persentase_duplikat <- (jumlah_duplikat / nrow(concrete)) * 100

duplicate_table <- tibble(
  Keterangan = c(
    "Jumlah seluruh data",
    "Jumlah data duplikat",
    "Persentase data duplikat (%)"
  ),
  Nilai = c(
    as.character(nrow(concrete)),
    as.character(jumlah_duplikat),
    sprintf("%.2f", persentase_duplikat)
  )
)

knitr::kable(
  duplicate_table,
  caption = "Tabel 7. Hasil Pengecekan Data Duplikat"
)
Tabel 7. Hasil Pengecekan Data Duplikat
Keterangan Nilai
Jumlah seluruh data 1030
Jumlah data duplikat 25
Persentase data duplikat (%) 2.43
duplicate_rows <- concrete |> 
  filter(duplicated(concrete) | duplicated(concrete, fromLast = TRUE)) 

if (nrow(duplicate_rows) > 0) { 
  knitr::kable( 
    head(duplicate_rows, 10), 
    caption = "Tabel 8. Beberapa Data yang Terdeteksi Duplikat" 
  ) 
} else { 
  cat("Tidak terdapat data duplikat pada dataset.") 
}
Tabel 8. Beberapa Data yang Terdeteksi Duplikat
cement slag fly_ash water superplasticizer coarse_aggregate fine_aggregate age strength
425.0 106.3 0 153.5 16.5 852.1 887.1 3 33.39822
425.0 106.3 0 153.5 16.5 852.1 887.1 3 33.39822
425.0 106.3 0 153.5 16.5 852.1 887.1 3 33.39822
362.6 189.0 0 164.9 11.6 944.7 755.8 3 35.30117
362.6 189.0 0 164.9 11.6 944.7 755.8 3 35.30117
362.6 189.0 0 164.9 11.6 944.7 755.8 3 35.30117
362.6 189.0 0 164.9 11.6 944.7 755.8 3 35.30117
425.0 106.3 0 153.5 16.5 852.1 887.1 7 49.20101
425.0 106.3 0 153.5 16.5 852.1 887.1 7 49.20101
425.0 106.3 0 153.5 16.5 852.1 887.1 7 49.20101

Pada tabel tersebut, terlihat bahwa dataset kekuatan tekanan beton memiliki 25 dari 1030 data duplikat. Oleh karena itu, 25 observasi akan dihapus agar setiap observasi hanya direpresentasikan satu kali.

concrete_clean <- concrete |>
  distinct()

3.1.4 Deteksi Outlier

Outlier merupakan nilai yang jauh berbeda dari kumpulan nilai lainnya atau biasa disebut sebagai nilai ekstrem. Tidak semua dataset yang memiliki outlier akan memiliki masalah dalam penelitian. Pada data hasil eksperimen, seperti pengujian kekuatan tekanan beton, nilai yang terdeteksi sebagai outlier dapat merepresentasikan variasi nyata dari proses eksperimen. Misalnya, beton dengan umur pengujian yang lebih lama atau komposisi material tertentu dapat menghasilkan nilai kekuatan tekanan yang lebih tinggi dibandingkan sebagian besar data lainnya. Pada penelitian ini, deteksi outlier akan dilakukan dengan menggunakan bantuan dari Interquartile Range atau IQR. Rumus interquartile yang digunakan pada penelitian ini adalah (Sugiyono, 2022):

\[ Batas Bawah = Q_1 - 1.5(IQR) \]

\[ Batas Atas = Q_3 + 1.5(IQR) \] dengan,

\[ IQR = Q_3 - Q_1 \]

Jika terdapat data yang nilainya kurang dari batas bawah atau lebih dari batas atasnya maka nilai tersebut dapat disebut dengan outlier. Berikut merupakan hasil pengecekan outlier pada dataset kekuatan tekanan beton:

outlier_table <- concrete |> 
  summarise( 
    across( 
      where(is.numeric), 
      list( 
        Q1 = ~ quantile(.x, 0.25, na.rm = TRUE), 
        Q3 = ~ quantile(.x, 0.75, na.rm = TRUE), 
        IQR = ~ IQR(.x, na.rm = TRUE), 
        Lower_Bound = ~ quantile(.x, 0.25, na.rm = TRUE) - 1.5 * IQR(.x, na.rm = TRUE), 
        Upper_Bound = ~ quantile(.x, 0.75, na.rm = TRUE) + 1.5 * IQR(.x, na.rm = TRUE), 
        Jumlah_Outlier = ~ sum( 
          .x < quantile(.x, 0.25, na.rm = TRUE) - 1.5 * IQR(.x, na.rm = TRUE) | 
            .x > quantile(.x, 0.75, na.rm = TRUE) + 1.5 * IQR(.x, na.rm = TRUE), 
          na.rm = TRUE 
        ) 
      ), 
      .names = "{.col}_{.fn}" 
    ) 
  ) |> 
  pivot_longer( 
    cols = everything(), 
    names_to = c("Variabel", ".value"), 
    names_pattern = "(.+)_(Q1|Q3|IQR|Lower_Bound|Upper_Bound|Jumlah_Outlier)" 
  ) |> 
  mutate( 
    Persentase_Outlier = round((Jumlah_Outlier / nrow(concrete)) * 100, 2), 
    Keterangan = ifelse(Jumlah_Outlier > 0, "Terdapat outlier", "Tidak terdapat outlier") 
  ) 

knitr::kable( 
  outlier_table, 
  digits = 2, 
  caption = "Tabel 9. Hasil Deteksi Outlier" 
)
Tabel 9. Hasil Deteksi Outlier
Variabel Q1 Q3 IQR Lower_Bound Upper_Bound Jumlah_Outlier Persentase_Outlier Keterangan
cement 192.38 350.00 157.62 -44.06 586.44 0 0.00 Tidak terdapat outlier
slag 0.00 142.95 142.95 -214.42 357.38 2 0.19 Terdapat outlier
fly_ash 0.00 118.27 118.27 -177.40 295.68 0 0.00 Tidak terdapat outlier
water 164.90 192.00 27.10 124.25 232.65 9 0.87 Terdapat outlier
superplasticizer 0.00 10.16 10.16 -15.24 25.40 10 0.97 Terdapat outlier
coarse_aggregate 932.00 1029.40 97.40 785.90 1175.50 0 0.00 Tidak terdapat outlier
fine_aggregate 730.95 824.00 93.05 591.37 963.58 5 0.49 Terdapat outlier
age 7.00 56.00 49.00 -66.50 129.50 59 5.73 Terdapat outlier
strength 23.71 46.14 22.43 -9.94 79.78 4 0.39 Terdapat outlier

Pada tabel tersebut, terlihat bahwa dataset kekuatan tekanan beton memiliki beberapa outlier. Outlier hanya dideteksi pada penelitian ini karena nilai ekstrem pada dataset ini masih dapat merepresentasikan variasi nyata dalam komposisi material, umur beton, dan kekuatan tekanan beton.

Berdasarkan tabel tersebut, terdapat beberapa variabel yang memiliki outlier, yaitu slag, water, superplasticizer, fine_aggregate, age, dan strength. Variabel dengan jumlah outlier terbanyak adalah age, yaitu sebanyak 59 data atau 5,73% dari total data. Hal ini terjadi karena nilai umur beton yang lebih tinggi dari 129,50 hari terdeteksi sebagai outlier berdasarkan batas atas IQR. Namun, outlier pada penelitian ini tidak langsung dihapus karena nilai pada variabel age, superplasticizer, dan strength masih dapat merepresentasikan variasi nyata dalam proses pengujian beton. Oleh karena itu, outlier pada penelitian ini tetap dipertahankan dan hanya digunakan sebagai informasi awal dalam memahami karakteristik data. Meskipun outlier tetap dipertahankan, keberadaannya tetap perlu diperhatikan karena metode Support Vector Regression (SVR) cukup sensitif terhadap nilai ekstrem.

3.1.5 Tipe Data

Pengecekan tipe data penting untuk dilakukan karena jika tipe data yang digunakan tidak sesuai dengan yang seharusnya maka akan menyebabkan bias pada pengolahan data. Berikut merupakan hasil pengecekan tipe data pada dataset kekuatan tekanan beton:

data_type_table <- tibble( 
  Variabel = names(concrete), 
  Tipe_Data = map_chr(concrete, ~ paste(class(.x), collapse = ", "))
) 

knitr::kable( 
  data_type_table, 
  caption = "Tabel 10. Hasil Pengecekan Tipe Data" 
)
Tabel 10. Hasil Pengecekan Tipe Data
Variabel Tipe_Data
cement numeric
slag numeric
fly_ash numeric
water numeric
superplasticizer numeric
coarse_aggregate numeric
fine_aggregate numeric
age numeric
strength numeric

Pada tabel tersebut, terlihat bahwa dataset kekuatan tekanan beton memiliki tipe data yang sesuai pada masing-masing variabelnya, yaitu numerik.

3.2 Kondisi Dataset Setelah Data Cleaning

Setelah dilakukan pengecekan dan pembersihan data, selanjutnya dilakukan perbandingan kondisi dataset sebelum dan sesudah proses data cleaning. Tahap ini bertujuan untuk mengetahui perubahan jumlah data setelah dilakukan penanganan terhadap permasalahan yang ditemukan pada dataset. Ringkasan hasil pengecekan dan penanganan data pada dataset kekuatan tekanan beton disajikan pada tabel berikut:

ringkasan_proses_cleaning <- tibble(
  Keterangan = c(
    "Missing Value",
    "Unique Value",
    "Data Duplicate",
    "Deteksi Outlier",
    "Tipe Data"
  ),
  Hasil = c(
    "Tidak ada",
    "Tidak ada nilai tidak wajar",
    paste(jumlah_duplikat, "observasi"),
    paste(sum(outlier_table$Jumlah_Outlier), "nilai outlier"),
    "Sesuai"
  ),
  Penanganan = c(
    "-",
    "-",
    "Dihapus",
    "Hanya dideteksi",
    "-"
  )
)

knitr::kable(
  ringkasan_proses_cleaning,
  col.names = c("", "Hasil", "Penanganan"),
  caption = "Tabel 11. Ringkasan Hasil Data Cleaning"
)
Tabel 11. Ringkasan Hasil Data Cleaning
Hasil Penanganan
Missing Value Tidak ada -
Unique Value Tidak ada nilai tidak wajar -
Data Duplicate 25 observasi Dihapus
Deteksi Outlier 89 nilai outlier Hanya dideteksi
Tipe Data Sesuai -

Berdasarkan tabel tersebut, dapat diketahui bahwa proses data cleaning yang dilakukan pada penelitian ini adalah penghapusan data duplikat. Sementara itu, outlier tidak dihapus karena nilai ekstrem pada dataset hasil eksperimen tekanan beton masih dapat merepresentasikan variasi nyata dari komposisi material, umur beton, dan kekuatan tekanan beton.

ringkasan_setelah_cleaning <- tibble(
  Keterangan = c(
    "Jumlah Data Awal",
    "Jumlah Data Setelah Data Cleaning"
  ),
  `Jumlah Baris` = c(
    nrow(concrete),
    nrow(concrete_clean)
  ),
  `Jumlah Kolom` = c(
    ncol(concrete),
    ncol(concrete_clean)
  )
)

knitr::kable(
  ringkasan_setelah_cleaning,
  col.names = c("", "Jumlah Baris", "Jumlah Kolom"),
  caption = "Tabel 12. Jumlah Data Sebelum dan Sesudah Data Cleaning"
)
Tabel 12. Jumlah Data Sebelum dan Sesudah Data Cleaning
Jumlah Baris Jumlah Kolom
Jumlah Data Awal 1030 9
Jumlah Data Setelah Data Cleaning 1005 9

Berdasarkan tabel tersebut, jumlah data awal pada dataset kekuatan tekanan beton adalah 1030 observasi dengan 9 variabel. Setelah dilakukan proses data cleaning, jumlah data menjadi 1005 observasi dengan jumlah variabel yang tetap, yaitu 9 variabel.

3.3 Exploratory Data Analysis (EDA)

Setelah dataset melalui tahap data cleaning, selanjutnya masuk tahap Exploratory Data Analysis (EDA). EDA dilakukan untuk memahami karakteristik data secara umum sebelum masuk ke tahap pemodelan. Pada penelitian ini, EDA dilakukan melalui analisis deskriptif, visualisasi distribusi variabel target, serta analisis korelasi antarvariabel.

3.3.1 Analisis Deskriptif

Analisis deskriptif dilakukan untuk mengetahui gambaran umum dari setiap variabel pada dataset. Hasil analisis deskriptif pada dataset kekuatan tekanan beton disajikan pada tabel berikut:

analisis_deskriptif <- concrete_clean |> 
  summarise( 
    across( 
      where(is.numeric), 
      list( 
        N = ~ sum(!is.na(.x)), 
        Mean = ~ mean(.x, na.rm = TRUE), 
        Std_Deviasi = ~ sd(.x, na.rm = TRUE), 
        Minimum = ~ min(.x, na.rm = TRUE), 
        Maksimum = ~ max(.x, na.rm = TRUE) 
      ), 
      .names = "{.col}_{.fn}" 
    ) 
  ) |> 
  pivot_longer( 
    cols = everything(), 
    names_to = c("Variabel", ".value"), 
    names_pattern = "(.+)_(N|Mean|Std_Deviasi|Minimum|Maksimum)" 
  ) |> 
  rename( 
    `Std. Deviasi` = Std_Deviasi 
  ) 

knitr::kable( 
  analisis_deskriptif, 
  digits = 2, 
  caption = "Tabel 13. Analisis Deskriptif" 
)
Tabel 13. Analisis Deskriptif
Variabel N Mean Std. Deviasi Minimum Maksimum
cement 1005 278.63 104.35 102.00 540.0
slag 1005 72.04 86.17 0.00 359.4
fly_ash 1005 55.54 64.21 0.00 200.1
water 1005 182.07 21.34 121.75 247.0
superplasticizer 1005 6.03 5.92 0.00 32.2
coarse_aggregate 1005 974.38 77.58 801.00 1145.0
fine_aggregate 1005 772.69 80.34 594.00 992.6
age 1005 45.86 63.73 1.00 365.0
strength 1005 35.25 16.28 2.33 82.6

Berdasarkan tabel tersebut, dataset yang digunakan setelah proses data cleaning terdiri dari 1005 observasi dan 9 variabel. Selain itu, terlihat juga bahwa:

  • Variabel strength sebagai variabel target memiliki nilai rata-rata sebesar 35,25 MPa dengan standar deviasi sebesar 16,28. Nilai minimum kekuatan tekanan beton adalah 2,33 MPa, sedangkan nilai maksimumnya adalah 82,60 MPa. Hal ini menunjukkan bahwa kekuatan tekanan beton pada dataset memiliki rentang nilai yang cukup lebar.
  • Variabel cement memiliki rata-rata sebesar 278,63, dengan nilai minimum 102,00 dan maksimum 540,00. Hal ini menunjukkan bahwa jumlah semen dalam campuran beton cukup bervariasi.
  • Variabel slag memiliki rata-rata sebesar 72,04, dengan nilai minimum 0,00 dan maksimum 359,40. Nilai minimum 0,00 menunjukkan bahwa tidak semua campuran beton menggunakan slag.
  • Variabel fly_ash memiliki rata-rata sebesar 55,54, dengan nilai minimum 0,00 dan maksimum 200,10. Hal ini juga menunjukkan bahwa tidak semua campuran beton menggunakan fly ash.
  • Variabel water memiliki rata-rata sebesar 182,07, dengan nilai minimum 121,75 dan maksimum 247,00. Rentang nilai ini menunjukkan adanya perbedaan kadar air pada setiap campuran beton.
  • Variabel `superplasticizer memiliki rata-rata sebesar 6,03, dengan nilai minimum 0,00 dan maksimum 32,20. Nilai minimum 0,00 menunjukkan bahwa tidak semua campuran beton menggunakan bahan tambahan tersebut.
  • Variabel coarse_aggregate memiliki rata-rata sebesar 974,38, dengan nilai minimum 801,00 dan maksimum 1145,00.
  • Variabel fine_aggregate memiliki rata-rata sebesar 772,69, dengan nilai minimum 594,00 dan maksimum 992,60.
  • Variabel age memiliki rata-rata sebesar 45,86 hari dengan standar deviasi sebesar 63,73. Nilai standar deviasi yang cukup besar menunjukkan bahwa umur beton dalam dataset sangat bervariasi, yaitu mulai dari 1 hari hingga 365 hari.

Secara umum, hasil analisis deskriptif menunjukkan bahwa setiap variabel memiliki rentang nilai yang berbeda-beda dan memiliki rentang nilai yang jauh lebih besar. Oleh karena itu, sebelum dilakukan pemodelan menggunakan Support Vector Regression (SVR) perlu dilakukan standardisasi pada variabel prediktor. Standardisasi dilakukan karena SVR merupakan metode yang sensitif terhadap perbedaan skala data.

3.3.2 Distribusi Kekuatan Tekanan Beton

Variabel target pada penelitian ini adalah strength, yaitu nilai kekuatan tekanan beton. Visualisasi distribusi variabel target dilakukan untuk mengetahui pola persebaran nilai kekuatan tekanan beton pada dataset. Distribusi variabel target disajikan pada gambar berikut:

ggplot(concrete_clean, aes(x = strength)) + 
  geom_histogram(aes(y = after_stat(density)), bins = 30) + 
  geom_density(linewidth = 1) + 
  labs( 
    title = "Gambar 2. Distribusi Kekuatan Tekanan Beton", 
    x = "Kekuatan Tekanan Beton (MPa)", 
    y = "Density" 
  ) + 
  theme_minimal()

Berdasarkan grafik distribusi variabel target strength, terlihat bahwa nilai kekuatan tekanan beton tersebar pada rentang sekitar 2 MPa hingga 82 MPa. Sebagian besar data berada pada kisaran 20 MPa hingga 50 MPa, dengan kepadatan tertinggi berada di sekitar 30 MPa hingga 40 MPa. Hal ini menunjukkan bahwa mayoritas beton dalam dataset memiliki kekuatan tekanan pada kategori sedang. Distribusi variabel strength terlihat tidak sepenuhnya simetris dan cenderung memiliki ekor ke kanan. Artinya, terdapat beberapa beton dengan nilai kekuatan tekanan yang relatif tinggi dibandingkan sebagian besar data lainnya. Hal tersebut bukan merupakan masalah karena nilai-nilai tersebut masih dapat dianggap sebagai variasi alami dalam data eksperimen beton karena kekuatan tekanan beton dapat dipengaruhi oleh berbagai komposisi material dan umur pengujian.

3.3.3 Heatmap Korelasi Antarvariabel

Analisis korelasi dilakukan untuk mengetahui hubungan linear antarvariabel pada dataset. Nilai korelasi berada pada rentang -1 sampai 1. Nilai korelasi yang mendekati 1 menunjukkan hubungan positif yang kuat, nilai yang mendekati -1 menunjukkan hubungan negatif yang kuat, sedangkan nilai yang mendekati 0 menunjukkan hubungan linear yang lemah. Pada penelitian ini, heatmap akan digunakan untuk mempermudah melihat nilai korelasi. Berikut merupakan hasil heatmap korelasi:

cor_matrix <- cor(concrete_clean, use = "complete.obs") 

# Mengubah matriks korelasi menjadi format long 
cor_long <- as.data.frame(as.table(cor_matrix)) |> 
  rename( 
    Variabel_1 = Var1, 
    Variabel_2 = Var2, 
    Korelasi = Freq 
  ) 

# Membuat heatmap korelasi 
ggplot(cor_long, aes(x = Variabel_1, y = Variabel_2, fill = Korelasi)) + 
  geom_tile() + 
  geom_text(aes(label = round(Korelasi, 2)), size = 3) + 
  scale_fill_gradient2( 
    low = "blue", 
    mid = "white", 
    high = "red", 
    midpoint = 0, 
    limits = c(-1, 1) 
  ) + 
  labs( 
    title = "Gambar 3. Heatmap Korelasi Antarvariabel", 
    x = "Variabel", 
    y = "Variabel", 
    fill = "Korelasi" 
  ) + 
  theme_minimal() + 
  theme( 
    axis.text.x = element_text(angle = 45, hjust = 1) 
  ) + 
  coord_fixed()

Berdasarkan gambar tersebut, hubungan antar variabel prediktor dengan variabel ialah sebagai berikut:

  • Variabel cement memiliki hubungan positif paling kuat dengan strength, yaitu sebesar 0,49. Hal ini menunjukkan bahwa semakin tinggi jumlah semen dalam campuran beton maka kekuatan tekanan beton cenderung akan meningkat.
  • Variabel age dan superplasticizer juga memiliki korelasi positif terhadap strength, masing-masing sebesar 0,34. Artinya, umur beton yang lebih lama dan penggunaan superplasticizer cenderung berkaitan dengan peningkatan kekuatan beton.
  • Variabel water memiliki korelasi negatif dengan strength, yaitu sebesar -0,27. Hal ini menunjukkan bahwa semakin tinggi kadar air dalam campuran beton, kekuatan tekanan beton akan cenderung menurun.
  • Variabel fine_aggregate, coarse_aggregate, dan fly_ash juga memiliki korelasi negatif terhadap strength, tetapi hubungan yang terbentuk relatif lemah.

Selain hubungan terhadap variabel target, heatmap juga menunjukkan adanya korelasi antarvariabel prediktor. Korelasi negatif yang cukup kuat terlihat antara water dan superplasticizer, yaitu sebesar -0,65. Hal ini menunjukkan bahwa campuran dengan penggunaan superplasticizer yang lebih tinggi cenderung menggunakan kadar air yang lebih rendah. Namun, secara umum tidak terlihat korelasi yang sangat tinggi antarvariabel prediktor, sehingga indikasi multikolinearitas yang sangat kuat tidak tampak pada dataset ini.

3.3.4 Hubungan Variabel Prediktor terhadap Target

Selain korelasi, analisis hubungan variabel prediktor terhadap variabel target dapat dilakukan dengan melihat pola hubungan antara beberapa variabel yang memiliki keterkaitan kuat dengan kekuatan tekanan beton. Variabel yang akan divisualisasikan ialah cement, age, water, dan superplasticizer terhadap variabel target strength. Visualisasi dilakukan dengan menggunakan scatter plot dengan garis tren untuk melihat kecenderungan hubungan antarvariabel.

# Fungsi untuk membuat scatter plot
buat_scatter <- function(data, x_var, x_label, nomor_gambar) {
  ggplot(data, aes(x = .data[[x_var]], y = strength)) +
    geom_point(alpha = 0.5) +
    geom_smooth(method = "loess", se = FALSE) +
    labs(
      title = paste0(
        "Gambar ", nomor_gambar, ". Hubungan ",
        x_label,
        " terhadap Kuat Tekan Beton (Strength)"
      ),
      x = x_label,
      y = "Kuat Tekan Beton (MPa)"
    ) +
    theme_minimal()
}

# Gambar 4: Cement terhadap Strength
buat_scatter(concrete_clean, "cement", "Cement", 4)
## `geom_smooth()` using formula = 'y ~ x'

# Gambar 5: Age terhadap Strength
buat_scatter(concrete_clean, "age", "Age", 5)
## `geom_smooth()` using formula = 'y ~ x'

# Gambar 6: Water terhadap Strength
buat_scatter(concrete_clean, "water", "Water", 6)
## `geom_smooth()` using formula = 'y ~ x'

# Gambar 7: Superplasticizer terhadap Strength
buat_scatter(concrete_clean, "superplasticizer", "Superplasticizer", 7)
## `geom_smooth()` using formula = 'y ~ x'

Berdasarkan grafik tersebut, terlihat bahwa:

  • Variabel cement menunjukkan kecenderungan hubungan positif terhadap strength. Semakin tinggi jumlah semen dalam campuran beton, nilai kekuatan tekanan beton cenderung meningkat. Hal ini terlihat dari garis tren yang bergerak naik seiring bertambahnya nilai cement.
  • Variabel age juga menunjukkan hubungan positif terhadap strength, terutama pada umur beton yang masih rendah. Kekuatan tekanan beton cenderung meningkat cukup cepat pada awal umur pengujian, kemudian pola peningkatannya mulai melambat pada umur beton yang lebih tinggi. Hal ini menunjukkan bahwa umur beton berpengaruh terhadap peningkatan kekuatan tekanan, tetapi pengaruhnya tidak selalu linear.
  • Variabel water menunjukkan kecenderungan hubungan negatif terhadap strength pada sebagian besar rentang data. Semakin tinggi kadar air dalam campuran beton, nilai kekuatan tekanan beton cenderung menurun. Namun, pada kadar air yang sangat tinggi, pola grafik terlihat kembali meningkat.
  • Variabel superplasticizer menunjukkan kecenderungan hubungan positif terhadap strength. Penggunaan superplasticizer yang lebih tinggi cenderung berkaitan dengan peningkatan kekuatan tekanan beton. Meskipun demikian, persebaran titik data masih cukup menyebar, sehingga hubungan ini tidak sepenuhnya kuat secara visual.

Secara umum, visualisasi ini menunjukkan bahwa cement, age, dan superplasticizer cenderung memiliki hubungan positif terhadap kekuatan tekanan beton, sedangkan water cenderung memiliki hubungan negatif. Hasil ini sejalan dengan analisis korelasi sebelumnya, sehingga variabel-variabel tersebut berpotensi berperan penting dalam proses pemodelan SVR. Selain itu, terlihat juga bahwa tidak terdapat indikasi adanya hubungan linear antara variabel fitur denga targetnya. Oleh karena itu, model SVR lebih cocok digunakan ketimbang regresi linear.

Bab 4. Metode Penelitian

4.1 Prapemrosesan Data

Data yang digunakan pada tahap pemodelan adalah concrete_clean, yaitu data yang sudah melalui tahap data cleaning. Pada tahap sebelumnya, data duplikat sudah dihapus, sedangkan outlier tetap dipertahankan karena masih dianggap masuk akal dalam konteks pengujian beton dan model SVR tidak sensitif dengan keberadaan outlier. Sebelum model dibangun, data dibagi terlebih dahulu menjadi data latih (training) dan data uji (testing). Data latih digunakan untuk proses pelatihan model dan tuning parameter, sedangkan data uji digunakan untuk evaluasi akhir. Pembagian data dilakukan dengan proporsi 80% data latih dan 20% data uji. Pada penelitian ini, split data atau pemisahan data ini dilakukan dengan menggunakan fungsi initial_split() digunakan karena fungsi tersebut memang digunakan untuk membuat pembagian data menjadi training set dan testing set (rsample, 2026).

Setelah data dibagi, standardisasi dilakukan pada variabel prediktor. Standardisasi diperlukan karena SVR sensitif terhadap perbedaan skala data. Pada dataset ini, skala antarvariabel cukup berbeda. Misalnya, superplasticizer memiliki rentang nilai yang kecil, sedangkan coarse_aggregate dan fine_aggregate memiliki nilai yang jauh lebih besar. Jika data tidak distandardisasi, variabel dengan skala besar dapat lebih mendominasi proses pembentukan model. Proses standardisasi ini dilakukan setelah pembagian data untuk menghindari data leakage. Dengan cara ini, informasi dari data uji tidak ikut masuk ke proses pelatihan model dan standardisasi dihitung berdasarkan data latih, lalu diterapkan pada data uji melalui workflow pemodelan.

4.2 Metode SVR

Penelitian ini akan menggunakan metode Support Vector Regression (SVR) dengan kernel Radial Basis Function (RBF). Metode ini dipilih karena target yang diprediksi berupa nilai numerik kontinu, yaitu kuat tekan beton (strength). Selain itu, dataset Concrete Compressive Strength dari UCI Machine Learning Repository termasuk ke dalam permasalahan regresi, dengan variabel target berupa kuat tekan beton dalam satuan MPa (Yeh, 2007). pada penelitian ini, SVR digunakan karena hubungan antara komposisi bahan, umur beton, dan kuat tekan beton tidak selalu berbentuk linear. Yeh (2007) juga menjelaskan bahwa kuat tekan beton merupakan fungsi yang sangat non-linear dari umur dan bahan penyusunnya. Hal ini juga terlihat pada hasil EDA sebelumnya, terutama pada hubungan antara age dan strength, di mana kuat tekan beton meningkat cukup cepat pada umur awal, tetapi peningkatannya mulai melambat pada umur yang lebih tinggi. Fungsi prediksi pada SVR yang digunakan ialah sebagai berikut:

\[ f(x) = w^T \phi(x) + b \]

Keterangan:

\(f(x)\) = nilai prediksi kuat tekan beton

\(w\) = bobot model

\(\phi(x)\) = transformasi data ke ruang fitur berdimensi lebih tinggi

\(b\) = bias atau intercept

Kernel RBF digunakan karena dapat membantu model menangkap pola hubungan non-linear antara variabel prediktor dengan variabel target. svm_rbf() dapat digunakan untuk model regresi dan bekerja dengan fungsi non-linear dari variabel prediktor (Kuhn & Vaughan, 2026). Oleh karena itu, SVR dengan kernel RBF dianggap sesuai untuk memprediksi kuat tekan beton pada penelitian ini. Rumus kernel RBF yang digunakan ialah sebagai berikut:

\[ K(x_i, x_j) = \exp(-\gamma ||x_i - x_j||^2) \]

Keterangan:

\(K(x_i, x_j)\) = nilai kemiripan antara dua observasi

\(x_i\) dan \(x_j\) = dua observasi yang dibandingkan

\(\gamma\) = parameter kernel yang mengatur fleksibilitas model

\(||x_i - x_j||^2\) = jarak kuadrat antara dua observasi

Pada tidymodels, parameter \(\gamma\) ini berkaitan dengan rbf_sigma. Selain itu, SVR menggunakan konsep batas toleransi kesalahan atau epsilon-insensitive loss. Secara sederhana, fungsi loss SVR yang digunakan ialah sebagai berikut:

\[ L_\epsilon(y, f(x)) = \begin{cases} 0, & \text{jika } |y - f(x)| \leq \epsilon \\ |y - f(x)| - \epsilon, & \text{jika } |y - f(x)| > \epsilon \end{cases} \]

Keterangan:

\(y\) = nilai aktual

\(f(x)\) = nilai prediksi

\(\epsilon\) = batas toleransi kesalahan

\(L_\epsilon\) = besar kesalahan yang dihitung oleh model

Model dasar untuk pembanding dalam penelitian ini akan menggunakan model regresi linear. Regresi linear digunakan sebagai baseline model untuk melihat performa awal dari model sederhana. Hasil regresi linear kemudian dibandingkan dengan SVR untuk melihat apakah SVR mampu memberikan hasil prediksi yang lebih baik atau tidak.

4.3 Parameter Tuning

Pada model SVR, tuning parameter dilakukan untuk mencari kombinasi parameter yang akan menghasilkan performa terbaik. Parameter yang dituning dalam penelitian ini adalah cost, rbf_sigma, dan margin. Parameter cost digunakan untuk mengatur seberapa besar penalti yang diberikan terhadap kesalahan prediksi. Jika nilai cost terlalu kecil, model dapat jadi terlalu sederhana. Sebaliknya, jika terlalu besar maka model dapat terlalu mengikuti data latih dan berisiko kurang stabil pada data baru juga mengakibatkan terjadinya overfitting. Parameter rbf_sigma digunakan untuk mengatur fleksibilitas kernel RBF. Parameter ini berpengaruh terhadap seberapa fleksibel model dalam menangkap pola non-linear pada data. Sementara itu, parameter margin berhubungan dengan batas toleransi kesalahan prediksi pada model SVR. Proses tuning dilakukan dengan mencoba beberapa kombinasi nilai parameter menggunakan grid_latin_hypercube. Dari beberapa kombinasi tersebut, parameter terbaik dipilih berdasarkan nilai RMSE terkecil. RMSE dipilih sebagai dasar pemilihan karena metrik ini dapat menunjukkan besar kesalahan prediksi dalam satuan yang sama dengan target, yaitu MPa.

4.4 Rancangan Validasi

Rancangan validasi yang digunakan pada penelitian ini adalah 5-fold cross-validation pada data latih. Cross-validation digunakan agar proses pemilihan parameter tidak hanya bergantung pada satu pembagian data saja. Pada 5-fold cross-validation, data latih dibagi menjadi lima bagian atau fold. Secara bergantian, empat bagian digunakan untuk melatih model, sedangkan satu bagian digunakan untuk validasi. Proses ini dilakukan sampai setiap fold pernah menjadi data validasi. Fungsi vfold_cv() dari package rsample digunakan karena fungsi tersebut membagi data secara acak ke dalam beberapa fold yang ukurannya relatif sama (rsample, 2026). Setelah proses tuning selesai dan parameter terbaik diperoleh, model SVR akhir dibangun menggunakan parameter tersebut. Model SVR akhir kemudian dievaluasi pada data uji. Data uji tidak digunakan dalam proses training maupun tuning, sehingga hasil evaluasi dapat menggambarkan kemampuan model pada data baru.

4.5 Metrik Evaluasi

Metrik evaluasi yang digunakan dalam penelitian ini adalah RMSE, MAE, dan R-squared. Ketiga metrik ini digunakan karena penelitian termasuk ke dalam permasalahan regresi, sehingga evaluasi dilakukan dengan membandingkan nilai aktual dan nilai prediksi.

  1. RMSE atau Root Mean Squared Error digunakan untuk melihat besaran kesalahan prediksi model. RMSE memiliki satuan yang sama dengan target, yaitu MPa. Menurut Yardstick (2026), RMSE merupakan metrik yang nilainya semakin kecil semakin baik, dengan nilai 0 menunjukkan prediksi sempurna. Pada penelitian ini, RMSE digunakan sebagai metrik utama dalam pemilihan parameter terbaik.

\[ RMSE = \sqrt{\frac{1}{n}\sum_{i=1}^{n} \left(y_i - \hat{y}_i\right)^2} \]

Keterangan:

\(RMSE\) = Root Mean Squared Error

\(n\) = jumlah data

\(y_i\) = nilai aktual

\(\hat{y}_i\) = nilai prediksi

  1. MAE atau Mean Absolute Error digunakan untuk melihat rata-rata selisih absolut antara nilai aktual dan nilai prediksi. MAE juga mudah diinterpretasikan karena menunjukkan rata-rata besar kesalahan prediksi dalam satuan MPa. Semakin kecil nilai MAE, maka semakin dekat hasil prediksi model terhadap nilai aktual.

\[ MAE = \frac{1}{n}\sum_{i=1}^{n} \left| y_i - \hat{y}_i \right| \]

Keterangan:

\(MAE\) = Mean Absolute Error

\(n\) = jumlah data

\(y_i\) = nilai aktual

\(\hat{y}_i\) = nilai prediksi

  1. R-squared atau \(R^2\) digunakan untuk melihat seberapa besar variasi nilai strength yang dapat dijelaskan oleh model. Nilai R-squared yang semakin tinggi menunjukkan bahwa model semakin baik dalam menjelaskan variasi data. Namun, R-squared tetap perlu dibaca bersama RMSE dan MAE, karena model yang baik bukan hanya memiliki R-squared tinggi, tetapi juga memiliki galat atau error prediksi yang rendah.

\[ R^2 = 1 - \frac{\sum_{i=1}^{n} \left(y_i - \hat{y}i\right)^2}{\sum_{i=1}^{n} \left(y_i - \bar{y}\right)^2} \]

Keterangan:

\(R^2\) = R-squared

\(y_i\) = nilai aktual

\(\hat{y}_i\) = nilai prediksi

\(\bar{y}\) = rata-rata nilai aktual

4.6 Alur Pemodelan

Tahapan pemodelan dalam penelitian ini adalah sebagai berikut:

  1. Melakukan cleaning data.
  2. Melakukan eksplorasi pada data.
  3. Membagi data menjadi data latih dan data uji dengan proporsi 80:20.
  4. Melakukan standardisasi pada variabel prediktor.
  5. Membentuk model regresi linear.
  6. Membentuk model SVR dengan kernel RBF.
  7. Melakukan tuning parameter cost, rbf_sigma, dan margin menggunakan 5-fold cross-validation.
  8. Memilih parameter terbaik berdasarkan nilai RMSE terkecil.
  9. Mengevaluasi model akhir pada data uji menggunakan RMSE, MAE, dan R-squared.
  10. Melihat hasil prediksi, residual plot, dan feature importance untuk membantu interpretasi model.

Bab 5. Hasil Analisis

Penelitian ini akan melakukan pemodelan untuk memprediksi kekuatan tekanan beton (strength) berdasarkan komposisi bahan dan umur beton. Model yang digunakan adalah Support Vector Regression (SVR) dengan kernel radial basis function (RBF). Selain itu, penelitian ini juga menggunakan model dasar, yaitu Regresi Linear. Regresi linear digunakan sebagai modelembanding dasar karena memiliki struktur model yang sederhana dan mudah diinterpretasikan.

5.1 Split Data Dan Standarisasi

Dataset concrete_clean dibagi menjadi data latih (train) dan data uji (test) dengan proporsi 80:20. Data latih digunakan untuk proses pelatihan model dan tuning parameter, sedangkan data uji digunakan untuk mengevaluasi performa akhir model.

library(ranger)

set.seed(15062026)

# Pembagian data menjadi data latih dan data uji
split_obj <- initial_split(concrete_clean, prop = 0.80)

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

# Cross-validation 5-fold pada data latih
folds <- vfold_cv(train_dat, v = 5)

# Metrik evaluasi regresi
reg_metrics <- metric_set(rmse, mae, rsq)

# Standardisasi dilakukan pada seluruh prediktor
rec_svr <- recipe(strength ~ ., data = train_dat) |>
  step_zv(all_predictors()) |>
  step_normalize(all_numeric_predictors())

# Ringkasan jumlah data latih dan data uji
split_table <- tibble(
  Keterangan = c("Data Latih", "Data Uji"),
  `Jumlah Baris` = c(nrow(train_dat), nrow(test_dat)),
  `Jumlah Kolom` = c(ncol(train_dat), ncol(test_dat))
)

knitr::kable(
  split_table,
  col.names = c("", "Jumlah Baris", "Jumlah Kolom"),
  caption = "Tabel 14. Jumlah Data Latih dan Data Uji"
)
Tabel 14. Jumlah Data Latih dan Data Uji
Jumlah Baris Jumlah Kolom
Data Latih 804 9
Data Uji 201 9

Berdasarkan tabel tersebut, terlihat bahwa data dibagi menjadi 80% data training (804 observasi) dan 20% data testing (201 observasi), dengan masing-masing memiliki 9 variabel (8 variabel prediktor dan 1 target). Selain itu, standardisasi juga dilakukan guna menyamakan skala variabel sebelum pemodelan. Standarisasi ini dilakukan untuk model SVR dan regresi linear juga pada variabel prediktor, hal ini dilakukan karena model tersebut sensitif terhadap perbedaan skala data. Standardisasi ini juga dilakukan setelah pembagian data untuk menghindari terjadinya data leakage.

5.2 Model Dasar: Regresi Linear

Model regresi linear digunakan sebagai model dasar atau baseline model dalam penelitian. Model ini bekerja dengan membentuk hubungan linear antara variabel prediktor dan variabel target. Penggunaan regresi linear bertujuan untuk memberikan gambaran awal mengenai kemampuan model sederhana dalam memprediksi kekuatan tekanan beton. Hasil dari model regresi linear ini selanjutnya akan digunakan sebagai acuan awal sebelum dilakukan pemodelan menggunakan Support Vector Regression (SVR) untuk melihat performa model SVR (apakah mampu memberikan hasil prediksi yang lebih baik dibandingkan model linear sederhana?).

# Workflow regresi linear
lm_wf <- workflow() |>
  add_recipe(rec_svr) |>
  add_model(
    linear_reg() |>
      set_engine("lm")
  )

# Evaluasi regresi linear pada data uji
lm_fit <- last_fit(
  lm_wf,
  split_obj,
  metrics = reg_metrics
)

5.3 Model Utama: Support Vector Regression Radial/RBF

Penelitian ini menggunakan Support Vector Regression dengan kernel radial basis function atau RBF sebagai model utama yang digunakan. Kernel RBF digunakan karena mampu menangkap pola hubungan non-linear antara variabel prediktor dengan variabel target. Hal ini sesuai dengan hasil EDA sebelumnya yang menunjukkan bahwa hubungan antara beberapa variabel prediktor dan strength tidak sepenuhnya linear. Pada model SVR, parameter yang dituning adalah cost, rbf_sigma, dan margin. Parameter cost mengatur penalti terhadap kesalahan prediksi, rbf_sigma mengatur fleksibilitas kernel radial, sedangkan margin berkaitan dengan batas toleransi kesalahan prediksi. Selain itu, pemilihan parameter terbaik dilakukan berdasarkan nilai RMSE terkecil, karena RMSE menunjukkan rata-rata kesalahan prediksi model dalam satuan MPa. Semakin kecil nilai RMSE, maka semakin baik kemampuan model dalam memprediksi kuat tekan beton.

set.seed(15062026)

# Spesifikasi model SVR radial/RBF
svr_spec <- svm_rbf(
  cost = tune(),
  rbf_sigma = tune(),
  margin = tune()
) |>
  set_engine("kernlab") |>
  set_mode("regression")

# Workflow SVR
svr_wf <- workflow() |>
  add_recipe(rec_svr) |>
  add_model(svr_spec)

# Grid tuning SVR
svr_grid <- grid_latin_hypercube(
  dials::cost(range = c(-5, 8)),
  dials::rbf_sigma(range = c(-10, 0)),
  dials::svm_margin(),
  size = 25
)

# Proses tuning SVR menggunakan 5-fold cross-validation
svr_tuned <- tune_grid(
  svr_wf,
  resamples = folds,
  grid = svr_grid,
  metrics = reg_metrics,
  control = control_grid(save_pred = TRUE)
)

# Menampilkan 10 kombinasi parameter terbaik SVR
hasil_tuning_svr <- show_best(svr_tuned, metric = "rmse", n = 10)
hasil_tuning_svr_2 <- hasil_tuning_svr |>
  select(cost, rbf_sigma, margin, mean, std_err, .config)

knitr::kable(
  hasil_tuning_svr_2,
  digits = 4,
  caption = "Tabel 15. Top 10 Hasil Tuning Terbaik Model SVR Berdasarkan RMSE"
)
Tabel 15. Top 10 Hasil Tuning Terbaik Model SVR Berdasarkan RMSE
cost rbf_sigma margin mean std_err .config
19.3497 0.1193 0.1471 5.4718 0.1469 pre0_mod18_post0
238.3805 0.0076 0.0422 6.6182 0.2490 pre0_mod25_post0
1.1078 0.2200 0.0157 6.6846 0.1455 pre0_mod10_post0
2.3339 0.0359 0.0161 7.1479 0.2355 pre0_mod12_post0
3.2440 0.0028 0.0817 9.4065 0.0735 pre0_mod13_post0
42.2872 0.0003 0.1306 10.2581 0.1035 pre0_mod21_post0
0.1350 0.0151 0.0057 10.5011 0.1377 pre0_mod05_post0
10.5322 0.0001 0.1416 11.2402 0.1246 pre0_mod17_post0
0.0894 0.7271 0.0755 12.2086 0.2432 pre0_mod03_post0
143.2767 0.0000 0.1219 15.0074 0.1446 pre0_mod24_post0

Berdasarkan tabel tersebut, terlihat bahwa kombinasi parameter terbaik diperoleh cost sebesar 19,3497, rbf_sigma sebesar 0,1193, dan margin sebesar 0,1471. Selain itu, nilai std_err sebesar 0,1469 menunjukkan bahwa variasi RMSE antar-fold relatif kecil. Hal ini mengindikasikan bahwa performa model cukup stabil pada proses cross-validation. Oleh karena itu, kombinasi parameter tersebut dipilih sebagai parameter terbaik untuk membangun model SVR final yang kemudian akan dievaluasi.

# Parameter terbaik SVR
best_svr <- select_best(svr_tuned, metric = "rmse")

knitr::kable(
  best_svr,
  digits = 4,
  caption = "Tabel 16. Parameter Terbaik Model SVR"
)
Tabel 16. Parameter Terbaik Model SVR
cost rbf_sigma margin .config
19.3497 0.1193 0.1471 pre0_mod18_post0
# Finalisasi workflow SVR
final_svr_wf <- finalize_workflow(svr_wf, best_svr)

# Evaluasi model SVR final pada data uji
svr_final <- last_fit(
  final_svr_wf,
  split_obj,
  metrics = reg_metrics
)

Berdasarkan tabel tersebut, terlihat bahwa parameter terbaik model SVR diperoleh pada nilai cost sebesar 19,3497, rbf_sigma sebesar 0,1193, dan margin sebesar 0,1471. Kombinasi tersebut menghasilkan rata-rata RMSE sebesar 5,4718 berdasarkan proses 5-fold cross-validation pada data latih. Nilai ini menunjukkan bahwa selama proses validasi silang, model SVR memiliki rata-rata kesalahan prediksi terkecil sekitar 5,47 MPa. Oleh karena itu, parameter ini dipilih (karena memberikan nilai RMSE terkecil pada proses cross-validation). Selanjutnya, kombinasi parameter tersebut digunakan untuk membangun model SVR final dan mengevaluasi performanya.

5.3 Perbandingan Performa Model

Perbandingan performa dilakukan terhadap dua model, yaitu Regresi Linear dan SVR RBF. Model dengan RMSE dan MAE yang lebih kecil serta R-squared yang lebih besar dapat dikatakan memiliki performa prediksi yang lebih baik.

# Metrik regresi linear
lm_metrics <- collect_metrics(lm_fit) |>
  select(.metric, .estimate) |>
  mutate(Model = "Regresi Linear") |>
  select(Model, .metric, .estimate)

# Metrik SVR
svr_metrics <- collect_metrics(svr_final) |>
  select(.metric, .estimate) |>
  mutate(Model = "SVR RBF") |>
  select(Model, .metric, .estimate)

# Menggabungkan metrik seluruh model
perbandingan_model <- bind_rows(
  lm_metrics,
  svr_metrics
) |>
  pivot_wider(
    names_from = .metric,
    values_from = .estimate
  ) |>
  arrange(rmse)

# Menentukan model terbaik berdasarkan RMSE terkecil
model_terbaik <- perbandingan_model |>
  arrange(rmse) |>
  slice(1) |>
  pull(Model)

rmse_terbaik <- perbandingan_model |>
  arrange(rmse) |>
  slice(1) |>
  pull(rmse)

mae_terbaik <- perbandingan_model |>
  arrange(rmse) |>
  slice(1) |>
  pull(mae)

rsq_terbaik <- perbandingan_model |>
  arrange(rmse) |>
  slice(1) |>
  pull(rsq)

# Mengambil nilai metrik masing-masing model
nilai_lm <- perbandingan_model |> filter(Model == "Regresi Linear")
nilai_svr <- perbandingan_model |> filter(Model == "SVR RBF")

# Mengubah tabel perbandingan ke format long
perbandingan_model_long <- perbandingan_model |>
  pivot_longer(
    cols = c(rmse, mae, rsq),
    names_to = "Metrik",
    values_to = "Nilai"
  ) |>
  mutate(
    Metrik = case_when(
      Metrik == "rmse" ~ "RMSE",
      Metrik == "mae" ~ "MAE",
      Metrik == "rsq" ~ "R-squared"
    )
  )

# Visualisasi perbandingan model
ggplot(perbandingan_model_long, aes(x = Model, y = Nilai)) +
  geom_col() +
  geom_text(
    aes(label = round(Nilai, 2)),
    vjust = -0.3,
    size = 3.5
  ) +
  facet_wrap(~ Metrik, scales = "free_y") +
  scale_y_continuous(expand = expansion(mult = c(0, 0.15))) +
  labs(
    title = "Gambar 8. Perbandingan Performa Model Regresi Linear vs SVR",
    x = "Model",
    y = "Nilai Metrik"
  ) +
  theme_minimal()

Berdasarkan hasil perbandingan model tersebut, terlihat bahwa model SVR RBF memiliki nilai RMSE sebesar 7,7006 dan MAE sebesar 5,1009 yang lebih kecil dari model regresi linear. Selain itu, nilai R-squared sebesar 80,53% yang lebih besar dari model regresi linear. Hasil ini menunjukkan bahwa SVR memberikan performa prediksi yang lebih baik dibandingkan model dasar regresi linear.

5.4 Hasil Prediksi Model SVR

Hasil prediksi dengan menggunakan model SVR, digunakan untuk melihat perbandingan antara nilai aktual kuat tekan beton dengan nilai prediksi yang dihasilkan oleh model. Selain itu, dihitung juga nilai residual dan absolute error untuk mengetahui besar kesalahan prediksi pada beberapa observasi.

# Mengambil hasil prediksi SVR pada data uji
svr_pred <- collect_predictions(svr_final) |>
  mutate(
    residual = strength - .pred,
    absolute_error = abs(residual)
  )

# Menampilkan beberapa hasil prediksi
prediksi_svr_table <- svr_pred |>
  select(strength, .pred, residual, absolute_error) |>
  rename(
    `Aktual Strength` = strength,
    `Prediksi Strength` = .pred,
    Residual = residual,
    `Absolute Error` = absolute_error
  ) |>
  head(10)

knitr::kable( 
  prediksi_svr_table, 
  digits = 2, 
  caption = "Tabel 17. Hasil Prediksi Model SVR pada Data Uji" 
)
Tabel 17. Hasil Prediksi Model SVR pada Data Uji
Aktual Strength Prediksi Strength Residual Absolute Error
61.89 78.31 -16.42 16.42
44.30 48.49 -4.19 4.19
47.03 48.08 -1.05 1.05
45.85 36.36 9.49 9.49
28.02 27.59 0.43 0.43
47.81 36.53 11.29 11.29
52.91 47.92 4.99 4.99
40.56 43.79 -3.23 3.23
42.62 42.74 -0.12 0.12
44.21 37.50 6.71 6.71

Berdasarkan tabel tersebut, terlihat bahwa model SVR menghasilkan nilai prediksi yang cukup mendekati nilai aktual pada beberapa observasi data train. Selain itu, beberapa hasil prediksi menunjukkan bahwa sebagian observasi memiliki nilai kesalahan yang relatif kecil, meskipun masih terdapat beberapa observasi dengan kesalahan prediksi yang cukup besar. Hal ini menunjukkan bahwa model SVR sudah mampu memprediksi kekuatan tekanan beton dengan cukup baik walaupun masih memiliki keterbatasan pada beberapa data tertentu.

5.5 Aktual vs Prediksi Model SVR

Visualisasi aktual versus prediksi digunakan untuk melihat seberapa dekat nilai prediksi model SVR terhadap nilai aktual. Semakin dekat titik-titik data terhadap garis diagonal, maka semakin baik kemampuan model dalam memprediksi kekuatan tekanan beton.

ggplot(svr_pred, aes(x = strength, y = .pred)) +
  geom_point(alpha = 0.6) +
  geom_abline(slope = 1, intercept = 0, linetype = 2) +
  coord_equal() +
  labs(
    title = "Gambar 9. Aktual vs Prediksi Model SVR",
    x = "Actual Strength (MPa)",
    y = "Predicted Strength (MPa)"
  ) +
  theme_minimal()

Berdasarkan grafik tersebut, terlihat bahwa sebagian besar titik berada di sekitar garis diagonal (titik-titik mengikuti arah garis). Hal ini menunjukkan bahwa model SVR mampu menghasilkan prediksi yang cukup mendekati nilai aktual kekuatan tekanan beton. Meskipun demikian, masih terdapat beberapa titik yang menjauh dari garis diagonal, terutama pada nilai kekuatan tekanan beton yang relatif tinggi. Secara umum, model SVR sudah cukup baik dalam memprediksikan kekuatan tekanan beton.

5.6 Residual Plot Model SVR

Residual plot digunakan untuk melihat pola kesalahan prediksi model SVR. Residual merupakan selisih antara nilai aktual dan nilai prediksi. Model yang baik umumnya memiliki residual yang menyebar secara acak di sekitar garis nol tanpa membentuk pola tertentu.

ggplot(svr_pred, aes(x = .pred, y = residual)) +
  geom_point(alpha = 0.6) +
  geom_hline(yintercept = 0, linetype = 2) +
  labs(
    title = "Gambar 10. Residual Plot Model SVR",
    x = "Predicted Strength (MPa)",
    y = "Residual"
  ) +
  theme_minimal()

Berdasarkan grafik tersebut, terlihat bahwa sebagian besar residual menyebar di sekitar garis residual sama dengan nol. Hal ini menunjukkan bahwa model SVR mampu menghasilkan prediksi yang cukup baik karena selisih antara nilai aktual dan nilai prediksi relatif berada di sekitar nol. Namun, penyebaran residual tidak sepenuhnya merata pada seluruh rentang nilai prediksi. Karena pada nilai prediksi sekitar 30 MPa hingga 60 MPa, residual terlihat lebih menyebar dibandingkan rentang lainnya. Hal ini menunjukkan bahwa kesalahan prediksi model cenderung lebih bervariasi pada rentang kekuatan tekanan beton yang sedang. Selain itu, terdapat juga beberapa titik residual yang cukup jauh dari garis residual sama dengan nol, baik residual positif maupun negatif, yang menunjukkan adanya beberapa observasi dengan kesalahan prediksi yang cukup besar. Terlihat bahwa masih terdapat beberapa titik dengan residual negatif yang cukup besar pada nilai prediksi tinggi, sehingga model masih memiliki keterbatasan dalam memprediksi beberapa beton dengan kekuatan tekanan yang tinggi. Oleh karena itu, dapat disimpulkan bahwa residual plot menunjukkan bahwa model SVR tidak memiliki pola kesalahan yang sangat sistematis, karena sebagian besar residual tetap menyebar di sekitar garis nol. Namun, adanya beberapa residual ekstrem menunjukkan bahwa model belum sepenuhnya sempurna dalam memprediksi seluruh observasi, terutama pada beberapa nilai kekuatan tekanan beton tertentu.

5.7 Feature Importance Model SVR

Feature importance digunakan untuk melihat variabel mana yang paling berkontribusi terhadap hasil prediksi model SVR. Pada model regresi linear, kontribusi variabel dapat dilihat melalui koefisien regresi. Berbeda dengan regresi, untuk mencari kontribusi variabel model SVR dapat menggunakan kernel RBF. Kontribusi variabel pada SVR tidak dapat dilihat secara langsung melalui koefisien karena model bekerja dengan pendekatan kernel non-linear. Penelitian ini akan menggunakan metode Permutation Feature Importance yang dimana akan dilakukan dengan cara mengacak nilai pada setiap variabel prediktor, kemudian melihat perubahan performa model. Jika setelah suatu variabel diacak nilai RMSE meningkat cukup besar, maka variabel tersebut dianggap memiliki kontribusi penting terhadap model dan begitui juga sebaliknya.

library(vip)

# Fit ulang workflow SVR final pada data training
svr_fit_final <- fit(
  final_svr_wf,
  data = train_dat
)

# Fungsi prediksi untuk workflow tidymodels
pred_svr <- function(object, newdata) {
  predict(object, new_data = newdata)$.pred
}

# Permutation Feature Importance
set.seed(15062026)

svr_importance <- vi_permute(
  object = svr_fit_final,
  train = test_dat,
  target = "strength",
  metric = yardstick::rmse_vec,
  pred_wrapper = pred_svr,
  smaller_is_better = TRUE,
  nsim = 10
)

# Tabel importance
svr_importance_table <- svr_importance |>
  arrange(desc(Importance))

variabel_terpenting <- svr_importance_table |>
  slice(1) |>
  pull(Variable)

importance_tertinggi <- svr_importance_table |>
  slice(1) |>
  pull(Importance)

# Visualisasi feature importance
svr_importance_table |>
  ggplot(aes(x = reorder(Variable, Importance), y = Importance)) +
  geom_col() +
  geom_text(
    aes(label = round(Importance, 2)),
    hjust = -0.1,
    size = 3.5
  ) +
  coord_flip() +
  scale_y_continuous(
    expand = expansion(mult = c(0, 0.15))
  ) +
  labs(
    title = "Gambar 11. Feature Importance Model SVR",
    x = "Variabel",
    y = "Importance"
  ) +
  theme_minimal()

Berdasarkan grafik tersebut, terlihat bahwa variabel cement memiliki nilai importance tertinggi, yaitu sebesar 9,19. Hal ini menunjukkan bahwa cement merupakan variabel yang paling berkontribusi terhadap hasil prediksi kekuatan tekanan beton. Dengan kata lain, ketika nilai cement diacak, performa model mengalami penurunan paling besar dibandingkan variabel lainnya. Kemudian, variabel kedua yang memiliki kontribusi besar adalah age dengan nilai importance sebesar 7,11. Hal ini menunjukkan bahwa umur beton saat pengujian juga memiliki peran penting dalam memprediksi kuat tekan beton. Semakin lama umur beton, umumnya kuat tekan beton akan mengalami peningkatan hingga titik tertentu. Selanjutnya, variabel water memiliki nilai importance sebesar 6,65 dan slag sebesar 5,90. Kedua variabel ini juga memberikan kontribusi cukup besar terhadap prediksi model. Hal ini sejalan dengan karakteristik beton, di mana kadar air dan bahan tambahan seperti blast furnace slag dapat memengaruhi kekuatan beton. Selain itu, variabel fine_aggregate, fly_ash, superplasticizer, dan coarse_aggregate memiliki nilai importance yang lebih rendah dibandingkan variabel yang sebelumnya disebutkan. Namun, variabel-variabel tersebut tetap berkontribusi terhadap model, hanya saja pengaruhnya terhadap performa kontribusi terhadap prediksi SVR relatif lebih kecil. Hal ini sejalan dengan analisis EDA sebelumnya yang di mana cement, age, dan water memiliki hubungan yang relatif lebih tinggi terhadap variabel target strength dibandingkan dengan variabel lainnya.

Bab 6. Interpretasi dan Diskusi

Berdasarkan hasil analisis sebelumnya, model Support Vector Regression (SVR) dengan kernel RBF menunjukkan performa yang cukup baik dalam memprediksi kekuatan tekanan beton. Hal ini terlihat dari hasil evaluasi model pada data test, di mana model SVR memperoleh nilai RMSE sebesar 7,7006, MAE sebesar 5,1009, dan R-squared sebesar 0,8053. Nilai tersebut menunjukkan bahwa model SVR mampu menjelaskan sekitar 80,53% variasi pada variabel strength. Jika dibandingkan dengan model regresi linear, model SVR memberikan hasil yang lebih baik. Model regresi linear menghasilkan RMSE sebesar 10,6045, MAE sebesar 8,3096, dan R-squared sebesar 0,6162. Artinya, kesalahan prediksi pada model regresi linear masih lebih besar dibandingkan model SVR. Hal ini menunjukkan bahwa pola hubungan antara komposisi bahan, umur beton, dan kekuatan tekanan beton tidak sepenuhnya linear. Oleh karena itu, penggunaan SVR dengan kernel RBF lebih sesuai karena model ini karena dapat menangkap pola hubungan yang lebih kompleks.

Hasil tuning parameter juga menunjukkan bahwa kombinasi parameter terbaik pada model SVR adalah cost sebesar 19,3497, rbf_sigma sebesar 0,1193, dan margin sebesar 0,1471. Kombinasi parameter tersebut dipilih karena menghasilkan nilai RMSE terkecil pada proses cross-validation. Nilai RMSE pada proses validasi silang sebesar 5,4718 menunjukkan bahwa model memiliki performa yang cukup baik pada data latih. Namun, ketika dievaluasi pada data uji, nilai RMSE menjadi 7,7006. Perbedaan ini masih cukup wajar karena data uji merupakan data baru yang tidak digunakan dalam proses pelatihan model.

Berdasarkan grafik aktual versus prediksi, sebagian besar titik berada di sekitar garis diagonal. Hal ini menunjukkan bahwa hasil prediksi model SVR cukup mendekati nilai aktual. Namun, masih terdapat beberapa titik yang cukup jauh dari garis diagonal, terutama pada nilai kekuatan tekanan beton yang relatif tinggi. Artinya, model masih memiliki beberapa kesalahan prediksi pada kondisi tertentu. Kesalahan ini bisa terjadi karena beberapa observasi memiliki nilai yang ekstrem atau memiliki karakteristik campuran beton yang berbeda dari mayoritas data.

Hasil residual plot juga menunjukkan bahwa sebagian besar residual menyebar di sekitar garis nol. Hal ini menunjukkan bahwa model tidak memiliki pola kesalahan yang sangat sistematis. Namun, penyebaran residual pada rentang prediksi sekitar 30 MPa sampai 60 MPa terlihat lebih lebar dibandingkan rentang lainnya. Selain itu, terdapat beberapa residual yang cukup jauh dari nol. Hal ini menunjukkan bahwa model SVR masih belum sepenuhnya sempurna dalam memprediksi seluruh data, terutama pada beberapa nilai kekuatan tekanan beton tertentu.

Dari hasil feature importance, variabel yang paling berkontribusi terhadap prediksi model SVR adalah cement, dengan nilai importance sebesar 9,19. Hal ini menunjukkan bahwa jumlah semen dalam campuran beton menjadi variabel yang paling penting dalam membantu model memprediksi kekuatan tekanan beton. Variabel berikutnya yang juga memiliki kontribusi besar adalah age sebesar 7,11, water sebesar 6,65, dan slag sebesar 5,90. Hasil ini cukup masuk akal karena kekuatan beton memang dipengaruhi oleh jumlah semen, umur beton, kadar air, dan bahan tambahan dalam campuran.

Sementara itu, variabel seperti fine_aggregate, fly_ash, superplasticizer, dan coarse_aggregate memiliki nilai importance yang lebih rendah. Meskipun begitu, variabel-variabel tersebut tetap memberikan kontribusi terhadap model, hanya saja kontribusinya relatif lebih kecil dibandingkan variabel utama seperti cement, age, dan water. Hasil feature importance ini juga sejalan dengan hasil EDA sebelumnya, di mana variabel cement, age, dan water memiliki hubungan yang cukup terlihat terhadap variabel target strength.

Salah satu kekuatan dari model SVR pada penelitian ini adalah kemampuannya dalam menangkap pola hubungan non-linear. Berdasarkan EDA, hubungan antara beberapa variabel prediktor dan target tidak membentuk pola linear yang benar-benar jelas. Oleh karena itu, penggunaan kernel RBF pada SVR membantu model dalam mempelajari pola yang lebih fleksibel dibandingkan regresi linear. Selain itu, proses standardisasi data juga sudah dilakukan sebelum pemodelan SVR, sehingga perbedaan skala antarvariabel tidak terlalu memengaruhi proses pembentukan model. Kekuatan lainnya adalah proses tuning parameter dilakukan menggunakan 5-fold cross-validation. Dengan cara ini, pemilihan parameter tidak hanya bergantung pada satu pembagian data saja, tetapi mempertimbangkan beberapa pembagian data latih. Hal ini membuat pemilihan parameter model menjadi lebih stabil. Selain itu, evaluasi akhir dilakukan pada data uji, sehingga performa model dapat dilihat pada data yang belum digunakan saat pelatihan.

Variabel cement, age, water, dan slag perlu mendapat perhatian lebih dalam analisis kekuatan tekanan beton karena memiliki kontribusi yang cukup besar terhadap hasil prediksi model. Variabel-variabel tersebut dapat menjadi fokus utama apabila dilakukan analisis lanjutan, misalnya untuk melihat bagaimana perubahan komposisi bahan tertentu berkaitan dengan perubahan kuat tekan beton. Namun, hasil ini tetap perlu dipahami sebagai kontribusi terhadap prediksi model, bukan sebagai bukti hubungan sebab-akibat secara langsung.

Namun, model ini tetap memiliki beberapa keterbatasan seperti berikut:

  1. SVR cukup sensitif terhadap keberadaan outlier. Pada tahap data cleaning, terdapat beberapa outlier yang tetap dipertahankan karena dianggap masih masuk akal dalam konteks eksperimen beton. Walaupun keputusan ini cukup aman, keberadaan outlier tetap dapat memengaruhi hasil prediksi, terutama pada nilai kekuatan tekanan beton yang tinggi.
  2. Model hanya menggunakan variabel yang tersedia pada dataset, yaitu komposisi bahan dan umur beton. Padahal, dalam kondisi nyata, kekuatan beton juga bisa dipengaruhi oleh faktor lain seperti suhu saat proses curing, kelembaban, metode pencampuran, kondisi lingkungan, dan kualitas material. Karena variabel tersebut tidak tersedia dalam dataset, maka model belum bisa menangkap seluruh faktor yang mungkin memengaruhi kekuatan tekanan beton.
  3. Hasil feature importance pada SVR tidak dapat diartikan sebagai hubungan sebab-akibat. Feature importance hanya menunjukkan seberapa besar kontribusi suatu variabel terhadap performa prediksi model. Jadi, variabel dengan importance tinggi bukan berarti secara mutlak menjadi penyebab utama perubahan kekuatan beton, tetapi menunjukkan bahwa variabel tersebut penting bagi model dalam menghasilkan prediksi.

Bab 7. Kesimpulan

7.1 Kesimpulan

Berdasarkan hasil analisis yang telah dilakukan, dapat disimpulkan bahwa model Support Vector Regression (SVR) dengan kernel RBF mampu memprediksi kuat tekan beton dengan cukup baik berdasarkan komposisi bahan dan umur beton. Hal ini terlihat dari hasil evaluasi pada data uji, di mana model SVR menghasilkan nilai RMSE sebesar 7,7006, MAE sebesar 5,1009, dan R-squared sebesar 0,8053. Nilai R-squared tersebut menunjukkan bahwa model SVR mampu menjelaskan sekitar 80,53% variasi kuat tekan beton. Jika dibandingkan dengan model regresi linear, SVR memberikan performa yang lebih baik. Regresi linear menghasilkan RMSE sebesar 10,6045, MAE sebesar 8,3096, dan R-squared sebesar 0,6162. Dengan demikian, model SVR memiliki kesalahan prediksi yang lebih kecil dan kemampuan menjelaskan variasi data yang lebih tinggi dibandingkan regresi linear. Hal ini menunjukkan bahwa hubungan antara komposisi bahan, umur beton, dan kuat tekan beton tidak sepenuhnya linear, sehingga penggunaan SVR dengan kernel RBF lebih sesuai.

Berdasarkan hasil feature importance, variabel yang paling berkontribusi terhadap prediksi kuat tekan beton adalah cement dengan nilai importance sebesar 9,19. Selanjutnya, variabel lain yang juga memiliki kontribusi cukup besar adalah age sebesar 7,11, water sebesar 6,65, dan slag sebesar 5,90. Hal ini menunjukkan bahwa jumlah semen, umur beton, kadar air, dan penggunaan slag menjadi faktor penting yang diperhatikan model dalam memprediksi kuat tekan beton.

Selain itu, SVR dapat digunakan untuk memprediksi kekuatan tekanan beton berdasarkan komposisi bahan dan umur beton. Model SVR mampu memberikan hasil prediksi yang cukup baik, terutama karena dapat menangkap pola hubungan non-linear pada data. Namun, model masih memiliki beberapa kesalahan prediksi pada observasi tertentu, terutama pada nilai kuat tekan beton yang relatif tinggi.

7.2 Rekomendasi Analitik

Berdasarkan kesimpulan, model SVR dengan kernel RBF dapat direkomendasikan sebagai salah satu metode prediksi kuat tekan beton karena memiliki performa yang lebih baik dibandingkan regresi linear. Model ini cocok digunakan ketika hubungan antara variabel prediktor dan target tidak sepenuhnya linear. Variabel cement, age, water, dan slag perlu menjadi perhatian utama dalam analisis kuat tekan beton karena variabel-variabel tersebut memiliki kontribusi paling besar terhadap hasil prediksi model. Dalam analisis lanjutan, variabel-variabel tersebut dapat diprioritaskan untuk melihat pola hubungan yang lebih detail terhadap kuat tekan beton. Untuk pengembangan model berikutnya, dapat dilakukan perbandingan dengan metode machine learning lain, seperti Random Forest, XGBoost, atau Gradient Boosting, agar dapat diketahui apakah terdapat model lain yang mampu menghasilkan performa lebih baik dari SVR. Selain itu, jumlah kombinasi parameter tuning juga dapat diperbanyak agar pencarian parameter terbaik menjadi lebih optimal.

Selain itu, penelitian selanjutnya dapat menambahkan variabel lain yang berkaitan dengan proses pembuatan dan pengujian beton, seperti suhu curing, kelembaban, metode pencampuran, dan kualitas material. Penambahan variabel tersebut berpotensi meningkatkan kemampuan model dalam memprediksi kuat tekan beton secara lebih akurat. Oleh karena itu, SVR dapat dikatakan cukup baik untuk memprediksi kekuatan tekanan beton berdasarkan dataset yang digunakan, tetapi hasil prediksi masih dapat ditingkatkan melalui pengembangan fitur, tuning parameter yang lebih luas, dan perbandingan dengan model machine learning lainnya.

Referensi