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.
Berdasarkan latar belakang, dapat diidentifikasi beberapa permasalahan utama dalam penelitian ini, yaitu:
Berdasarkan tujuan penelitian, pertanyaan prediksi pada penelitian ini ialah:
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"
)| 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.
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.
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.
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"
)| 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.
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"
)| 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.
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.
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:
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"
)| 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.
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"
)| 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"
)| 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.
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"
)| 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.")
}| 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.
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"
)| 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.
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"
)| 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.
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"
)| 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"
)| 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.
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.
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"
)| 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:
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.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.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.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.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.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.coarse_aggregate memiliki rata-rata sebesar
974,38, dengan nilai minimum 801,00 dan maksimum 1145,00.fine_aggregate memiliki rata-rata sebesar
772,69, dengan nilai minimum 594,00 dan maksimum 992,60.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.
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.
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:
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.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.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.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.
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'
## `geom_smooth()` using formula = 'y ~ x'
## `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:
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.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.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.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.
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.
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.
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.
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.
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.
\[ 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
\[ 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
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
Tahapan pemodelan dalam penelitian ini adalah sebagai berikut:
cost,
rbf_sigma, dan margin menggunakan 5-fold
cross-validation.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.
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"
)| 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.
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?).
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"
)| 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"
)| 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.
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.
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"
)| 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.
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.
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.
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.
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:
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.
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.