BAB I PENDAHULUAN

1.1 Latar Belakang Masalah

Perkembangan teknologi informasi menghasilkan data dalam jumlah besar yang memerlukan model prediksi yang akurat dan stabil. Salah satu pendekatan yang banyak digunakan adalah pohon regresi, yaitu model yang membagi data secara bertahap berdasarkan variabel prediktor untuk memprediksi respon numerik. Namun, satu pohon tunggal termasuk model dengan variance tinggi sehingga hasilnya mudah berubah apabila data latih berubah sedikit saja (Fransiska, 2026). Kondisi ini membuat pohon tunggal rentan terhadap overfitting dan kurang stabil untuk memprediksi data baru.

Bootstrap aggregation atau Bagging adalah meta-algoritma ensambel yang meningkatkan stabilitas dan akurasi model serta mengurangi masalah overfitting. Metode ini pertama kali diusulkan oleh Leo Breiman untuk memperbaiki hasil klasifikasi (Fransiska, 2026). Bagging bekerja dengan membuat banyak sampel bootstrap dari data latih, melatih model pada masing-masing sampel, lalu menggabungkan hasilnya. Pada kasus respon kontinu, penggabungan dilakukan dengan merata-ratakan nilai prediksi seluruh model (Fransiska, 2026). Bagging merupakan teknik ensambel yang digunakan untuk menurunkan variance penduga, baik pada masalah klasifikasi maupun regresi, sehingga meningkatkan stabilitas dan akurasi prediksi (Kholifah dkk., 2026). Keunggulan penggabungan banyak pohon juga ditunjukkan oleh Masita dkk. (2025) yang melaporkan bahwa Random Forest Regression, yaitu ensambel pohon berbasis bootstrap, menghasilkan RMSE yang lebih kecil dibandingkan Decision Tree Regression tunggal pada prediksi kepesertaan Jaminan Kesehatan Nasional.

Penerapan Bagging pada model regresi juga telah banyak dilakukan di Indonesia. Mijayanti dan Helma (2021) menerapkan Bagging MARS pada pemodelan Produk Domestik Regional Bruto (PDRB) di Provinsi Sumatera Barat, sedangkan Priambodo dkk. (2024) menerapkannya pada pemodelan indikator kemiskinan di Provinsi Jawa Timur. Kholifah dkk. (2026) membandingkan beberapa jumlah replikasi bootstrap (25, 50, 100, dan 150) pada pemodelan inflasi dan nilai tukar rupiah, dan melaporkan bahwa kinerja model membaik ketika replikasi dinaikkan dari 25 menjadi 100, tetapi tidak lagi memberikan peningkatan berarti pada 150 replikasi. Temuan tersebut menunjukkan bahwa jumlah replikasi bootstrap (nbagg) merupakan parameter yang perlu dikaji. Oleh karena itu, pada praktikum ini dilakukan Bagging Regression pada data Friedman dengan membandingkan nbagg sebesar 25, 50, dan 100, kemudian kinerjanya dievaluasi menggunakan MSE, RMSE, MAE, dan R².

1.2 Rumusan Masalah

Berdasarkan latar belakang, rumusan masalah yang dapat disimpulkan adalah sebagai berikut:

  1. Bagaimana konsep dasar dan prinsip kerja metode Bagging pada kasus regresi?
  2. Bagaimana cara membangun model Bagging Regression pada data Friedman menggunakan R?
  3. Bagaimana perbandingan kinerja model Bagging Regression dengan nbagg sebesar 25, 50, dan 100 berdasarkan metrik evaluasi MSE, RMSE, MAE, dan R²?

1.3 Tujuan Penelitian

Berdasarkan rumusan masalah tersebut, tujuan yang dapat disimpulkan adalah sebagai berikut:

  1. Menjelaskan konsep dasar dan prinsip kerja metode Bagging pada kasus regresi.
  2. Membangun model Bagging Regression pada data Friedman menggunakan R.
  3. Membandingkan kinerja model Bagging Regression dengan nbagg sebesar 25, 50, dan 100 berdasarkan metrik evaluasi MSE, RMSE, MAE, dan R².

1.4 Batasan Masalah

  1. Gunakan data friedman kemudian lakukan bagging regression dengan membandingkan hasil dengan menggunakan nbagg=c(25, 50, 100) kemudian hitung metrik evaluasinya

BAB II TINJAUAN PUSTAKA

2.1 Bagging

Bootstrap aggregation atau Bagging adalah sebuah meta-algoritma ensambel yang meningkatkan stabilitas dan akurasi model serta mengurangi masalah overfitting. Metode ini dapat digunakan dengan metode apa pun. Pada fungsi kontinu, metode ini mengambil rata-rata dari keluaran beberapa model, sedangkan pada klasifikasi, hasil beberapa model digabungkan menjadi satu keluaran tunggal melalui voting (Fransiska, 2026).

Langkah-langkah Bagging secara garis besar adalah sebagai berikut (Fransiska, 2026):

  1. Membuat sampel bootstrap dari data pelatihan dalam jumlah yang sesuai (tidak terlalu banyak maupun terlalu sedikit).
  2. Melatih model pada masing-masing sampel.
  3. Membuat classifier atau predictor dari setiap model dan menyimpan hasilnya.
  4. Menggabungkan hasil seluruh model, melalui voting mayoritas, voting tertimbang, atau rata-rata, untuk memprediksi data uji.

Beberapa fitur penting Bagging adalah sebagai berikut (Fransiska, 2026):

  1. Setiap model dikembangkan secara paralel dan independen satu sama lain.
  2. Membantu mengurangi variance, tetapi tidak efektif dalam mengurangi bias.
  3. Paling cocok digunakan untuk model dengan variance tinggi dan bias rendah (model yang kompleks).
  4. Random Forest merupakan contoh yang baik dari pengembangan Bagging.

Tabel 1. Perbedaan Bagging Classification Tree dan Bagging Regression Tree

Aspek Bagging Classification Tree Bagging Regression Tree
Variabel respon Kategorik Numerik atau kontinu
Agregasi Voting mayoritas atau rata-rata probabilitas Rata-rata nilai prediksi
Metrik evaluasi Accuracy, Precision, Recall, F1, ROC-AUC MSE, RMSE, MAE, R-Square

Sumber: Fransiska (2026).

2.2 Bagging Regression Tree

Pada Bagging Regression Tree, dibentuk \(B\) sampel bootstrap dengan pengambilan sampel secara acak dengan pengembalian dari data latih, masing-masing berukuran sama dengan data latih. Pada setiap sampel dibangun satu pohon regresi, sehingga diperoleh \(B\) pohon. Parameter \(B\) ini dinyatakan sebagai nbagg pada fungsi bagging() di package ipred. Prediksi akhir untuk pengamatan \(x\) diperoleh dengan merata-ratakan prediksi seluruh pohon:

\[\hat{f}_{bag}(x) = \frac{1}{B}\sum_{b=1}^{B}\hat{f}^{*b}(x)\]

dengan \(\hat{f}^{*b}(x)\) adalah prediksi pohon ke-\(b\) yang dilatih pada sampel bootstrap ke-\(b\). Karena pohon-pohon dilatih pada sampel yang berbeda, kesalahan masing-masing pohon cenderung saling meniadakan ketika dirata-ratakan, sehingga variance prediksi menurun (Kholifah dkk., 2026).

Pada pengambilan sampel bootstrap, setiap pohon hanya menggunakan sebagian pengamatan, sedangkan pengamatan yang tidak terambil disebut pengamatan out-of-bag (OOB). Pengamatan OOB dapat dipakai untuk menguji pohon yang tidak melibatkannya dalam pelatihan, sehingga diperoleh estimasi galat prediksi tanpa memerlukan data uji terpisah. Pada fungsi bagging(), estimasi ini diaktifkan dengan argumen coob = TRUE. Untuk kasus regresi, hasilnya disajikan sebagai out-of-bag estimate of root mean squared error.

2.3 Evaluasi Model

Pada Bagging Regression, evaluasi dilakukan dengan membandingkan nilai aktual dan nilai prediksi. Metrik yang digunakan adalah MSE, RMSE, MAE, dan koefisien determinasi (R²) (Fransiska, 2026):

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

\[RMSE = \sqrt{MSE}\]

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

\[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}\]

Semakin kecil nilai MSE, RMSE, dan MAE, serta semakin besar nilai R², maka model semakin baik dalam memprediksi. RMSE dan MAE memiliki satuan yang sama dengan variabel respon sehingga lebih mudah diinterpretasikan (Masita dkk., 2025).

2.4 Data Friedman

Data Friedman #1 adalah data simulasi yang disediakan oleh package mlbench melalui fungsi mlbench.friedman1(). Data ini terdiri atas 10 variabel prediktor \(x_1, x_2, \dots, x_{10}\) yang masing-masing berdistribusi uniform pada selang \([0,1]\). Variabel respon dibangkitkan dengan persamaan berikut:

\[y = 10\sin(\pi x_1 x_2) + 20(x_3 - 0.5)^2 + 10x_4 + 5x_5 + \varepsilon, \quad \varepsilon \sim N(0,1)\]

Persamaan di atas menunjukkan bahwa hanya lima variabel pertama (\(x_1\) sampai \(x_5\)) yang memengaruhi \(y\), sedangkan \(x_6\) sampai \(x_{10}\) merupakan variabel noise. Hubungan antara prediktor dan respon bersifat non-linear dan memuat interaksi (\(x_1\) dan \(x_2\)), sehingga data ini sering dipakai untuk menguji model non-linear seperti pohon regresi.

BAB III METODE PENELITIAN

3.1 Sumber Data

Jenis data yang digunakan dalam penelitian ini adalah data kuantitatif, yaitu data berbentuk angka yang dapat diolah dan dianalisis secara statistik. Data yang digunakan merupakan data simulasi Friedman #1 yang dibangkitkan dengan fungsi mlbench.friedman1() pada package mlbench dalam perangkat lunak R, sebanyak 200 observasi. Variabel y digunakan sebagai variabel respons untuk membangun model prediksi menggunakan metode Bagging (Bagging Regression).

3.2 Variabel Penelitian

No Variabel Keterangan Tipe Data Peran
1 y Variabel respon hasil persamaan Friedman #1 Numerik Respons
2 x.1 Prediktor 1, berdistribusi uniform (0,1) Numerik Prediktor
3 x.2 Prediktor 2, berdistribusi uniform (0,1) Numerik Prediktor
4 x.3 Prediktor 3, berdistribusi uniform (0,1) Numerik Prediktor
5 x.4 Prediktor 4, berdistribusi uniform (0,1) Numerik Prediktor
6 x.5 Prediktor 5, berdistribusi uniform (0,1) Numerik Prediktor
7 x.6 Prediktor 6, berdistribusi uniform (0,1), tidak memengaruhi y (noise) Numerik Prediktor
8 x.7 Prediktor 7, berdistribusi uniform (0,1), tidak memengaruhi y (noise) Numerik Prediktor
9 x.8 Prediktor 8, berdistribusi uniform (0,1), tidak memengaruhi y (noise) Numerik Prediktor
10 x.9 Prediktor 9, berdistribusi uniform (0,1), tidak memengaruhi y (noise) Numerik Prediktor
11 x.10 Prediktor 10, berdistribusi uniform (0,1), tidak memengaruhi y (noise) Numerik Prediktor

3.3 Langkah-langkah Analisis

Langkah-langkah yang digunakan pada penelitian ini adalah sebagai berikut:

  1. Mulai.
  2. Memanggil package yang diperlukan (ipred, mlbench, rpart, rpart.plot, ggplot2, dan knitr).
  3. Membangkitkan data Friedman #1 sebanyak 200 observasi menggunakan fungsi mlbench.friedman1() dengan menetapkan seed agar hasil dapat direproduksi, lalu memeriksa struktur dan ringkasan data.
  4. Membangun model Bagging Regression dengan y sebagai variabel respons dan seluruh variabel lainnya sebagai prediktor menggunakan fungsi bagging() dengan coob = TRUE, untuk nbagg = 25, 50, dan 100.
  5. Melihat hasil model, struktur pohon pertama, dan estimasi out-of-bag (OOB) pada masing-masing model.
  6. Memprediksi nilai y menggunakan masing-masing model, lalu membandingkan nilai aktual dan prediksi.
  7. Menghitung metrik evaluasi, yaitu MSE, RMSE, MAE, dan R², pada masing-masing model.
  8. Membandingkan hasil ketiga model berdasarkan metrik evaluasi dan memvisualisasikannya, lalu menentukan model terbaik.
  9. Menarik kesimpulan.
  10. Selesai.

3.4 Diagram Alir Penelitian

BAB IV HASIL DAN PEMBAHASAN

Pada batasan masalah diminta menggunakan data Friedman kemudian melakukan Bagging Regression dengan membandingkan hasil menggunakan nbagg = c(25, 50, 100), kemudian menghitung metrik evaluasinya. Berikut ini adalah hasil analisis yang diperoleh:

4.1 Library

library(ipred)
library(mlbench)
library(rpart)
library(rpart.plot)
library(ggplot2)
library(knitr)

Berikut adalah package yang digunakan pada pertemuan 3. Package ipred menyediakan fungsi bagging() untuk membentuk model Bagging, mlbench untuk membangkitkan data Friedman, rpart dan rpart.plot untuk membentuk dan memvisualisasikan pohon regresi penyusun Bagging, serta ggplot2 untuk visualisasi hasil.

4.2 Membangkitkan dan Eksplorasi Data

set.seed(123)
learn <- as.data.frame(mlbench.friedman1(200))

head(learn)
##         x.1       x.2       x.3       x.4        x.5       x.6       x.7
## 1 0.2875775 0.2387260 0.9860543 0.2372297 0.47068183 0.2736227 0.8585914
## 2 0.7883051 0.9623589 0.1370675 0.6864904 0.36584547 0.5938669 0.8873848
## 3 0.4089769 0.6013657 0.9053096 0.2258184 0.12127205 0.1601848 0.4890915
## 4 0.8830174 0.5150297 0.5763018 0.3184946 0.04699368 0.8534302 0.7180918
## 5 0.9404673 0.4025733 0.3954489 0.1739838 0.26279630 0.8477392 0.4867056
## 6 0.0455565 0.8802465 0.4498025 0.8014296 0.96864117 0.4778868 0.9887089
##          x.8        x.9       x.10        y
## 1 0.23323974 0.63918581 0.15526414 10.59497
## 2 0.23065360 0.12482240 0.84585101 17.16530
## 3 0.06172627 0.25526578 0.21438043 13.11249
## 4 0.49711861 0.82057469 0.66987324 13.30344
## 5 0.24412509 0.80378039 0.61775645 10.00466
## 6 0.75818554 0.04583463 0.04999978 15.20495
str(learn)
## 'data.frame':    200 obs. of  11 variables:
##  $ x.1 : num  0.288 0.788 0.409 0.883 0.94 ...
##  $ x.2 : num  0.239 0.962 0.601 0.515 0.403 ...
##  $ x.3 : num  0.986 0.137 0.905 0.576 0.395 ...
##  $ x.4 : num  0.237 0.686 0.226 0.318 0.174 ...
##  $ x.5 : num  0.471 0.366 0.121 0.047 0.263 ...
##  $ x.6 : num  0.274 0.594 0.16 0.853 0.848 ...
##  $ x.7 : num  0.859 0.887 0.489 0.718 0.487 ...
##  $ x.8 : num  0.2332 0.2307 0.0617 0.4971 0.2441 ...
##  $ x.9 : num  0.639 0.125 0.255 0.821 0.804 ...
##  $ x.10: num  0.155 0.846 0.214 0.67 0.618 ...
##  $ y   : num  10.6 17.2 13.1 13.3 10 ...
dim(learn)
## [1] 200  11
summary(learn)
##       x.1                 x.2                x.3                 x.4          
##  Min.   :0.0006248   Min.   :0.006301   Min.   :0.0004654   Min.   :0.001192  
##  1st Qu.:0.2721181   1st Qu.:0.235623   1st Qu.:0.2736035   1st Qu.:0.246362  
##  Median :0.4820961   Median :0.469024   Median :0.5061597   Median :0.492065  
##  Mean   :0.5063919   Mean   :0.489122   Mean   :0.5022216   Mean   :0.493561  
##  3rd Qu.:0.7333708   3rd Qu.:0.741910   3rd Qu.:0.7570153   3rd Qu.:0.755200  
##  Max.   :0.9942698   Max.   :0.999405   Max.   :0.9966172   Max.   :0.994936  
##       x.5                x.6                x.7                x.8         
##  Min.   :0.003896   Min.   :0.002479   Min.   :0.001156   Min.   :0.01152  
##  1st Qu.:0.261924   1st Qu.:0.263275   1st Qu.:0.234549   1st Qu.:0.27500  
##  Median :0.518644   Median :0.478715   Median :0.487690   Median :0.49757  
##  Mean   :0.495092   Mean   :0.486666   Mean   :0.473317   Mean   :0.51007  
##  3rd Qu.:0.734548   3rd Qu.:0.719703   3rd Qu.:0.715833   3rd Qu.:0.75497  
##  Max.   :0.991745   Max.   :0.992616   Max.   :0.998883   Max.   :0.99952  
##       x.9                x.10                y        
##  Min.   :0.005364   Min.   :0.004609   Min.   : 4.39  
##  1st Qu.:0.272996   1st Qu.:0.249906   1st Qu.:10.73  
##  Median :0.556871   Median :0.497349   Median :14.56  
##  Mean   :0.528512   Mean   :0.492717   Mean   :14.60  
##  3rd Qu.:0.798814   3rd Qu.:0.729677   3rd Qu.:18.09  
##  Max.   :0.996372   Max.   :0.994995   Max.   :27.72

Data Friedman yang dibangkitkan terdiri atas 200 observasi dan 11 variabel, yaitu 1 variabel respons (y) dan 10 variabel prediktor (x.1 sampai x.10), seluruhnya bertipe numerik. Berdasarkan ringkasan y, nilai minimum sebesar 4,39, median sebesar 14,56, rata-rata sebesar 14,60, dan maksimum sebesar 27,72. Seluruh variabel prediktor berada pada rentang 0 sampai 1 sesuai distribusi uniform yang digunakan untuk membangkitkan data.

colSums(is.na(learn))
##  x.1  x.2  x.3  x.4  x.5  x.6  x.7  x.8  x.9 x.10    y 
##    0    0    0    0    0    0    0    0    0    0    0

Tidak terdapat missing value pada data (total 0), sehingga data dapat langsung digunakan untuk pemodelan tanpa penanganan data hilang.

# Fungsi untuk menghitung metrik evaluasi regresi
hitung_metrik <- function(aktual, prediksi) {
  mse <- mean((aktual - prediksi)^2)
  c(
    MSE  = mse,
    RMSE = sqrt(mse),
    MAE  = mean(abs(aktual - prediksi)),
    R2   = 1 - sum((aktual - prediksi)^2) / sum((aktual - mean(aktual))^2)
  )
}

Fungsi hitung_metrik() dibuat agar perhitungan MSE, RMSE, MAE, dan R² pada ketiga model menggunakan rumus yang sama, sesuai rumus pada subbab 2.4.

4.3 Bagging Regression dengan nbagg = 25

set.seed(123)
mod25 <- bagging(y ~ ., data = learn, nbagg = 25, coob = TRUE)

print(mod25)
## 
## Bagging regression trees with 25 bootstrap replications 
## 
## Call: bagging.data.frame(formula = y ~ ., data = learn, nbagg = 25, 
##     coob = TRUE)
## 
## Out-of-bag estimate of root mean squared error:  2.7366
summary(mod25)
##        Length Class      Mode   
## y      200    -none-     numeric
## X       10    data.frame list   
## mtrees  25    -none-     list   
## OOB      1    -none-     logical
## comb     1    -none-     logical
## err      1    -none-     numeric
## call     5    -none-     call

Model Bagging Regression dengan nbagg = 25 dibentuk dari 25 pohon regresi, masing-masing dilatih pada sampel bootstrap dari 200 observasi. Estimasi out-of-bag RMSE model ini sebesar 2,7366, yang berarti rata-rata kesalahan prediksi pada pengamatan yang tidak ikut melatih pohon adalah sekitar 2,74 satuan y.

# Struktur pohon regresi pertama
pohon1 <- mod25$mtrees[[1]]$btree
jumlah_daun <- sum(pohon1$frame$var == "<leaf>")

head(capture.output(print(pohon1)), 15)
##  [1] "n= 200 "                                               
##  [2] ""                                                      
##  [3] "node), split, n, deviance, yval"                       
##  [4] "      * denotes terminal node"                         
##  [5] ""                                                      
##  [6] " 1) root 200 4025.49800 14.029480  "                   
##  [7] "   2) x.4< 0.6502426 138 2160.39900 12.313130  "       
##  [8] "     4) x.2< 0.3684006 66  456.23160  9.859159  "      
##  [9] "       8) x.5< 0.7123567 49  196.75530  8.894625  "    
## [10] "        16) x.8>=0.3836868 34  130.62010  8.338864  "  
## [11] "          32) x.8< 0.4076226 9    1.81360  5.965380 *" 
## [12] "          33) x.8>=0.4076226 25   59.85333  9.193318 *"
## [13] "        17) x.8< 0.3836868 15   31.83001 10.154350 *"  
## [14] "       9) x.5>=0.7123567 17   82.49546 12.639290 *"    
## [15] "     5) x.2>=0.3684006 72  942.38620 14.562610  "
rpart.plot(pohon1, roundint = FALSE, cex = 0.4)

Pohon regresi pertama pada model nbagg = 25 memiliki 12 simpul daun. Jumlah simpul yang besar terjadi karena fungsi bagging() secara bawaan membentuk pohon yang tumbuh penuh (tanpa pemangkasan), sehingga setiap pohon bersifat kompleks dengan bias rendah tetapi variance tinggi. Kondisi inilah yang sesuai dengan karakteristik Bagging, yaitu paling cocok digunakan pada model dengan variance tinggi dan bias rendah.

pred25 <- predict(mod25, newdata = learn)

hasil25 <- data.frame(Aktual = learn$y, Prediksi = pred25)
head(hasil25, 10)
##       Aktual  Prediksi
## 1  10.594975  9.667302
## 2  17.165302 17.703382
## 3  13.112492 13.359338
## 4  13.303440 14.777714
## 5  10.004662 11.232180
## 6  15.204950 18.347786
## 7  10.687788  9.797199
## 8  23.748416 19.067135
## 9  11.168910 11.062871
## 10  9.731385  9.342596
m25 <- hitung_metrik(learn$y, pred25)
round(m25, 4)
##    MSE   RMSE    MAE     R2 
## 3.5190 1.8759 1.4446 0.8427

Hasil prediksi model nbagg = 25 menghasilkan MSE sebesar 3,5190, RMSE sebesar 1,8759, dan MAE sebesar 1,4446. Nilai R² sebesar 0,8427 menunjukkan bahwa model mampu menjelaskan sekitar 84,27% keragaman y pada data yang digunakan.

plot(learn$y, type = "l", lwd = 2,
     xlab = "Observasi", ylab = "Nilai Y",
     main = "Perbandingan Nilai Aktual dan Prediksi (nbagg = 25)", col = "red")
lines(pred25, lwd = 2, lty = 2, col = "blue")
legend("topright", legend = c("Aktual", "Prediksi"),
       lty = c(1, 2), lwd = c(2, 2), col = c("red", "blue"))

Pada grafik, garis merah menunjukkan nilai aktual dan garis biru putus-putus menunjukkan nilai prediksi. Semakin berimpit kedua garis, semakin dekat prediksi model dengan nilai sebenarnya.

4.4 Bagging Regression dengan nbagg = 50

set.seed(123)
mod50 <- bagging(y ~ ., data = learn, nbagg = 50, coob = TRUE)

print(mod50)
## 
## Bagging regression trees with 50 bootstrap replications 
## 
## Call: bagging.data.frame(formula = y ~ ., data = learn, nbagg = 50, 
##     coob = TRUE)
## 
## Out-of-bag estimate of root mean squared error:  2.6582
summary(mod50)
##        Length Class      Mode   
## y      200    -none-     numeric
## X       10    data.frame list   
## mtrees  50    -none-     list   
## OOB      1    -none-     logical
## comb     1    -none-     logical
## err      1    -none-     numeric
## call     5    -none-     call

Model dengan nbagg = 50 dibentuk dari 50 pohon regresi dengan estimasi out-of-bag RMSE sebesar 2,6582.

pred50 <- predict(mod50, newdata = learn)

hasil50 <- data.frame(Aktual = learn$y, Prediksi = pred50)
head(hasil50, 10)
##       Aktual  Prediksi
## 1  10.594975  9.789806
## 2  17.165302 17.761975
## 3  13.112492 13.632967
## 4  13.303440 14.553878
## 5  10.004662 11.220419
## 6  15.204950 17.675590
## 7  10.687788 10.579998
## 8  23.748416 19.097176
## 9  11.168910 11.093494
## 10  9.731385  9.608181
m50 <- hitung_metrik(learn$y, pred50)
round(m50, 4)
##    MSE   RMSE    MAE     R2 
## 3.4140 1.8477 1.4247 0.8474

Model nbagg = 50 menghasilkan MSE sebesar 3,4140, RMSE sebesar 1,8477, MAE sebesar 1,4247, dan R² sebesar 0,8474, yang berarti model menjelaskan sekitar 84,74% keragaman y.

plot(learn$y, type = "l", lwd = 2,
     xlab = "Observasi", ylab = "Nilai Y",
     main = "Perbandingan Nilai Aktual dan Prediksi (nbagg = 50)", col = "red")
lines(pred50, lwd = 2, lty = 2, col = "blue")
legend("topright", legend = c("Aktual", "Prediksi"),
       lty = c(1, 2), lwd = c(2, 2), col = c("red", "blue"))

4.5 Bagging Regression dengan nbagg = 100

set.seed(123)
mod100 <- bagging(y ~ ., data = learn, nbagg = 100, coob = TRUE)

print(mod100)
## 
## Bagging regression trees with 100 bootstrap replications 
## 
## Call: bagging.data.frame(formula = y ~ ., data = learn, nbagg = 100, 
##     coob = TRUE)
## 
## Out-of-bag estimate of root mean squared error:  2.6574
summary(mod100)
##        Length Class      Mode   
## y      200    -none-     numeric
## X       10    data.frame list   
## mtrees 100    -none-     list   
## OOB      1    -none-     logical
## comb     1    -none-     logical
## err      1    -none-     numeric
## call     5    -none-     call

Model dengan nbagg = 100 dibentuk dari 100 pohon regresi dengan estimasi out-of-bag RMSE sebesar 2,6574.

pred100 <- predict(mod100, newdata = learn)

hasil100 <- data.frame(Aktual = learn$y, Prediksi = pred100)
head(hasil100, 10)
##       Aktual  Prediksi
## 1  10.594975  9.765383
## 2  17.165302 17.792408
## 3  13.112492 13.669305
## 4  13.303440 14.380736
## 5  10.004662 11.045641
## 6  15.204950 17.183246
## 7  10.687788 10.607459
## 8  23.748416 18.806131
## 9  11.168910 11.093265
## 10  9.731385  9.947430
m100 <- hitung_metrik(learn$y, pred100)
round(m100, 4)
##    MSE   RMSE    MAE     R2 
## 3.4755 1.8643 1.4381 0.8446

Model nbagg = 100 menghasilkan MSE sebesar 3,4755, RMSE sebesar 1,8643, MAE sebesar 1,4381, dan R² sebesar 0,8446, yang berarti model menjelaskan sekitar 84,46% keragaman y.

plot(learn$y, type = "l", lwd = 2,
     xlab = "Observasi", ylab = "Nilai Y",
     main = "Perbandingan Nilai Aktual dan Prediksi (nbagg = 100)", col = "red")
lines(pred100, lwd = 2, lty = 2, col = "blue")
legend("topright", legend = c("Aktual", "Prediksi"),
       lty = c(1, 2), lwd = c(2, 2), col = c("red", "blue"))

4.6 Perbandingan Model berdasarkan Metrik Evaluasi

hasil <- data.frame(
  nbagg    = c(25, 50, 100),
  OOB_RMSE = c(mod25$err, mod50$err, mod100$err),
  MSE      = c(m25["MSE"],  m50["MSE"],  m100["MSE"]),
  RMSE     = c(m25["RMSE"], m50["RMSE"], m100["RMSE"]),
  MAE      = c(m25["MAE"],  m50["MAE"],  m100["MAE"]),
  R2       = c(m25["R2"],   m50["R2"],   m100["R2"])
)
rownames(hasil) <- NULL

kable(hasil, digits = 4, align = "c",
      caption = "Perbandingan metrik evaluasi Bagging Regression")
Perbandingan metrik evaluasi Bagging Regression
nbagg OOB_RMSE MSE RMSE MAE R2
25 2.7366 3.5190 1.8759 1.4446 0.8427
50 2.6582 3.4140 1.8477 1.4247 0.8474
100 2.6574 3.4755 1.8643 1.4381 0.8446

Berdasarkan tabel perbandingan, metrik pada data yang digunakan untuk pemodelan menunjukkan bahwa model dengan nbagg = 50 memiliki RMSE terkecil (1,8477), model dengan nbagg = 50 memiliki MAE terkecil (1,4247), dan model dengan nbagg = 50 memiliki R² terbesar (0,8474). Dari nbagg = 25 ke nbagg = 100, RMSE menurun sebesar 0,62%, dan secara keseluruhan RMSE tidak menurun secara konsisten seiring bertambahnya nbagg.

Metrik yang didapatkan yaitu dengan memprediksi data yang sama dengan data pelatihan, sehingga cenderung lebih optimistis dibandingkan kinerja pada data baru. Karena itu, estimasi out-of-bag (OOB) RMSE perlu diperhatikan sebagai ukuran yang lebih jujur. Berdasarkan OOB RMSE, model terbaik adalah model dengan nbagg = 100 (2,6574). Dari nbagg = 25 ke nbagg = 100, OOB RMSE menurun sebesar 2,90%, dan secara keseluruhan OOB RMSE menurun secara konsisten seiring bertambahnya nbagg. Selisih yang jelas antara RMSE pada data pelatihan dan OOB RMSE (misalnya pada nbagg = 100, RMSE 1,8643 berbanding OOB RMSE 2,6574) menunjukkan bahwa kesalahan pada data baru lebih besar daripada kesalahan pada data pelatihan, sehingga kemampuan generalisasi model sebaiknya dinilai dari OOB RMSE, bukan hanya dari RMSE pada data pelatihan.

4.7 Visualisasi Perbandingan Model

metrik_long <- data.frame(
  nbagg = factor(rep(hasil$nbagg, 2)),
  Jenis = rep(c("RMSE (data pelatihan)", "OOB RMSE"), each = 3),
  Nilai = c(hasil$RMSE, hasil$OOB_RMSE)
)

ggplot(metrik_long, aes(x = nbagg, y = Nilai, fill = Jenis)) +
  geom_col(position = "dodge") +
  geom_text(aes(label = round(Nilai, 3)),
            position = position_dodge(width = 0.9), vjust = -0.3, size = 3.5) +
  theme_minimal() +
  labs(
    title = "Perbandingan RMSE dan OOB RMSE berdasarkan nbagg",
    x = "Jumlah replikasi bootstrap (nbagg)",
    y = "Nilai RMSE"
  )

Grafik batang memperlihatkan perbandingan RMSE pada data pelatihan dan OOB RMSE untuk setiap nilai nbagg. Batang OOB RMSE yang lebih tinggi daripada RMSE pada data pelatihan menunjukkan bahwa kinerja model pada pengamatan yang tidak ikut dilatih lebih rendah dibandingkan kinerja pada data pelatihan.

scatter_df <- rbind(
  data.frame(Aktual = learn$y, Prediksi = pred25,  Model = "nbagg = 25"),
  data.frame(Aktual = learn$y, Prediksi = pred50,  Model = "nbagg = 50"),
  data.frame(Aktual = learn$y, Prediksi = pred100, Model = "nbagg = 100")
)
scatter_df$Model <- factor(scatter_df$Model,
                           levels = c("nbagg = 25", "nbagg = 50", "nbagg = 100"))

ggplot(scatter_df, aes(x = Aktual, y = Prediksi)) +
  geom_point(alpha = 0.6, color = "steelblue") +
  geom_abline(slope = 1, intercept = 0, color = "red", linetype = "dashed") +
  facet_wrap(~ Model) +
  theme_minimal() +
  labs(
    title = "Nilai Aktual vs Prediksi pada Berbagai nbagg",
    x = "Nilai Aktual", y = "Nilai Prediksi"
  )

Pada diagram pencar, garis putus-putus merah merupakan garis identitas, yaitu kondisi ketika nilai prediksi sama persis dengan nilai aktual. Titik-titik yang berada dekat garis ini menunjukkan prediksi yang akurat, sedangkan titik yang jauh dari garis menunjukkan prediksi yang kurang akurat. Pola titik yang rapat di sekitar garis pada ketiga panel menunjukkan bahwa ketiga model mampu mengikuti pola data dengan baik.

BAB V KESIMPULAN

5.1 Kesimpulan

Bagging merupakan metode ensambel yang membangun banyak model pada sampel bootstrap dari data latih, kemudian menggabungkan hasilnya. Pada kasus regresi, penggabungan dilakukan dengan merata-ratakan nilai prediksi seluruh pohon, sehingga variance prediksi menurun dan model menjadi lebih stabil. Model Bagging Regression pada data Friedman dibangun dengan fungsi bagging() pada package ipred dengan coob = TRUE untuk memperoleh estimasi out-of-bag, dan kinerjanya dievaluasi menggunakan MSE, RMSE, MAE, dan R².

Berdasarkan hasil yang diperoleh, perbandingan model dengan nbagg sebesar 25, 50, dan 100 menunjukkan bahwa model dengan nbagg = 50 memiliki RMSE terkecil pada data pelatihan (1,8477) dan R² terbesar berada pada model nbagg = 50 (0,8474). Berdasarkan estimasi out-of-bag, model terbaik adalah model dengan nbagg = 100 dengan OOB RMSE sebesar 2,6574. Karena OOB RMSE lebih mencerminkan kemampuan model pada data baru, model dengan nbagg = 100 dipilih sebagai model terbaik pada praktikum ini.

5.2 Saran

Praktikan disarankan untuk mempelajari lebih lanjut mengenai program RStudio melalui berbagai sumber pembelajaran, seperti buku, jurnal, modul praktikum, maupun sumber belajar lainnya agar semakin memahami penerapan metode ensambel. Pada penelitian selanjutnya, disarankan membagi data menjadi data latih dan data uji, mencoba nilai nbagg yang lebih besar (misalnya 150 atau 200) untuk melihat titik jenuh peningkatan kinerja, serta membandingkan Bagging dengan pohon regresi tunggal dan Random Forest. Praktikan juga diharapkan lebih teliti dalam melakukan pengolahan data dan penulisan kode program agar dapat meminimalkan kesalahan selama praktikum.

DAFTAR PUSTAKA

Fransiska, H. (2026). Modul Praktikum Machine Learning dan Model Prediction. Universitas Bengkulu: Bengkulu.

Kholifah, R. I. N., Utami, T. W., & Imron, A. (2026). Modeling inflation and rupiah exchange rate responses using bootstrap aggregating multivariate adaptive regression spline in Indonesia. JTAM (Jurnal Teori dan Aplikasi Matematika), 10(3), 1000–1011. https://doi.org/10.31764/jtam.v10i3.37314

Masita, A. R. P., Saputri, P. D., & Atok, R. M. (2025). Analisis perbandingan metode decision tree regression dan random forest regression pada prediksi kepesertaan Jaminan Kesehatan Nasional. MATHunesa: Jurnal Ilmiah Matematika, 13(2), 291–302.

Mijayanti, T., & Helma. (2021). Bootstrap Aggregating Multivariate Adaptive Regression Splines (Bagging MARS) dan penerapannya pada pemodelan Produk Domestik Regional Bruto (PDRB) di Provinsi Sumatera Barat. Journal of Mathematics UNP, 6(4), 38–43. https://doi.org/10.24036/unpjomath.v6i4.12233

Priambodo, D., Wasono, R., & Al Haris, M. (2024). Modeling of poverty indicators in East Java Province using bootstrap aggregating multivariate adaptive regression spline (Bagging MARS). Jurnal Statistika Universitas Muhammadiyah Semarang, 12(2), 19–28. https://doi.org/10.14710/JSUNIMUS.12.2.2024.19-28