Data Awal & Persiapan Tabel Permintaan

tabel_permintaan <- data.frame(
  permintaan = c(50, 60, 70, 80, 90),
  frekuensi  = c(10, 20, 40, 20, 10)
)

total_frekuensi <- sum(tabel_permintaan$frekuensi)
tabel_permintaan$probabilitas <- tabel_permintaan$frekuensi / total_frekuensi
tabel_permintaan$probabilitas_kumulatif <- cumsum(tabel_permintaan$probabilitas)
tabel_permintaan$batas_bawah <- c(1, head(tabel_permintaan$probabilitas_kumulatif, -1) * 100 + 1)
tabel_permintaan$batas_atas  <- tabel_permintaan$probabilitas_kumulatif * 100

print(tabel_permintaan)
##   permintaan frekuensi probabilitas probabilitas_kumulatif batas_bawah
## 1         50        10          0.1                    0.1           1
## 2         60        20          0.2                    0.3          11
## 3         70        40          0.4                    0.7          31
## 4         80        20          0.2                    0.9          71
## 5         90        10          0.1                    1.0          91
##   batas_atas
## 1         10
## 2         30
## 3         70
## 4         90
## 5        100
nilai_ekspektasi <- sum(tabel_permintaan$permintaan * tabel_permintaan$probabilitas)
cat("Ekspektasi teoritis:", nilai_ekspektasi, "\n")
## Ekspektasi teoritis: 70

Fungsi Simulasi Monte Carlo

permintaan_simulasi <- function(n, tabel_permintaan) {
  bilangan_acak <- sample(1:100, n, replace = TRUE)

  get_demand <- function(x) {
    index <- which(x >= tabel_permintaan$batas_bawah & x <= tabel_permintaan$batas_atas)
    if (length(index) == 0) return(NA)
    return(tabel_permintaan$permintaan[index])
  }

  prediksi_permintaan <- sapply(bilangan_acak, get_demand)

  result <- data.frame(
    bilangan_acak       = bilangan_acak,
    prediksi_permintaan = prediksi_permintaan
  )
  result <- na.omit(result)
  return(result)
}

Simulasi 1.000, 5.000, dan 20.000 Iterasi

set.seed(1000)
sim_1000 <- permintaan_simulasi(1000, tabel_permintaan)
cat("Rata-rata permintaan (1.000 simulasi):", mean(sim_1000$prediksi_permintaan), "\n")
## Rata-rata permintaan (1.000 simulasi): 70.12097
set.seed(5000)
sim_5000 <- permintaan_simulasi(5000, tabel_permintaan)
cat("Rata-rata permintaan (5.000 simulasi):", mean(sim_5000$prediksi_permintaan), "\n")
## Rata-rata permintaan (5.000 simulasi): 70.08871
set.seed(20000)
sim_20000 <- permintaan_simulasi(20000, tabel_permintaan)
cat("Rata-rata permintaan (20.000 simulasi):", mean(sim_20000$prediksi_permintaan), "\n")
## Rata-rata permintaan (20.000 simulasi): 69.89096

Tabel Perbandingan

perbandingan <- data.frame(
  Metode = c(
    "Ekspektasi Teoritis",
    "Simulasi 1.000 hari",
    "Simulasi 5.000 hari",
    "Simulasi 20.000 hari"
  ),
  Permintaan_Rata_Rata = c(
    round(nilai_ekspektasi, 2),
    round(mean(sim_1000$prediksi_permintaan),  2),
    round(mean(sim_5000$prediksi_permintaan),  2),
    round(mean(sim_20000$prediksi_permintaan), 2)
  ),
  Selisih_dari_Teoritis = c(
    0,
    round(abs(mean(sim_1000$prediksi_permintaan)  - nilai_ekspektasi), 4),
    round(abs(mean(sim_5000$prediksi_permintaan)  - nilai_ekspektasi), 4),
    round(abs(mean(sim_20000$prediksi_permintaan) - nilai_ekspektasi), 4)
  )
)

print(perbandingan)
##                 Metode Permintaan_Rata_Rata Selisih_dari_Teoritis
## 1  Ekspektasi Teoritis                70.00                0.0000
## 2  Simulasi 1.000 hari                70.12                0.1210
## 3  Simulasi 5.000 hari                70.09                0.0887
## 4 Simulasi 20.000 hari                69.89                0.1090

Visualisasi Konvergensi

rata_rata_simulasi <- c(
  mean(sim_1000$prediksi_permintaan),
  mean(sim_5000$prediksi_permintaan),
  mean(sim_20000$prediksi_permintaan)
)

jumlah_simulasi <- c(1000, 5000, 20000)

plot(
  jumlah_simulasi, rata_rata_simulasi,
  type  = "b",
  col   = "#d83737",
  pch   = 16,
  lwd   = 2,
  xlab  = "Jumlah Simulasi",
  ylab  = "Rata-rata Permintaan",
  main  = "Konvergensi Simulasi Monte Carlo ke Nilai Teoritis",
  ylim  = c(68, 75)
)

abline(h = nilai_ekspektasi, col = "#3770d8", lwd = 2, lty = 2)

legend(
  "topright",
  legend = c("Rata-rata Simulasi", paste("Teoritis =", nilai_ekspektasi)),
  col    = c("#d83737", "#3770d8"),
  lty    = c(1, 2),
  lwd    = 2,
  pch    = c(16, NA)
)

Analisis

Berdasarkan hasil simulasi di atas, terlihat bahwa semakin banyak iterasi yang dijalankan, rata-rata permintaan hasil simulasi semakin mendekati nilai ekspektasi teoritis (70). Hal ini sesuai dengan Hukum Bilangan Besar (Law of Large Numbers): semakin banyak percobaan acak yang dilakukan, rata-rata hasil simulasi akan semakin konvergen ke nilai ekspektasi teoretisnya. Dengan simulasi yang lebih besar, pengaruh fluktuasi acak pada tiap sampel menjadi semakin kecil, sehingga estimasi menjadi lebih stabil dan akurat.