Data Awal

tabel_permintaan <- data.frame(
  permintaan = c(50, 60, 70, 80, 90),
  frekuensi = c(10, 20, 40, 20, 10)
)
print(tabel_permintaan)
##   permintaan frekuensi
## 1         50        10
## 2         60        20
## 3         70        40
## 4         80        20
## 5         90        10

Total Frekuensi

total_frekuensi <- sum(tabel_permintaan$frekuensi)
tabel_permintaan$probabilitas <- tabel_permintaan$frekuensi / total_frekuensi

print(tabel_permintaan)
##   permintaan frekuensi probabilitas
## 1         50        10          0.1
## 2         60        20          0.2
## 3         70        40          0.4
## 4         80        20          0.2
## 5         90        10          0.1

Probabilitas Kumulatif

tabel_permintaan$probabilitas_kumulatif <- cumsum(tabel_permintaan$probabilitas)
print(tabel_permintaan)
##   permintaan frekuensi probabilitas probabilitas_kumulatif
## 1         50        10          0.1                    0.1
## 2         60        20          0.2                    0.3
## 3         70        40          0.4                    0.7
## 4         80        20          0.2                    0.9
## 5         90        10          0.1                    1.0

Interval dengan +1 untuk lower bound

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

Ekspektasi Berdasarkan distribusi peluang yang sudah dihitung sebelumnya

nilai_ekspektasi <- sum(tabel_permintaan$permintaan * tabel_permintaan$probabilitas)
cat("Ekspektasi permintaan:", nilai_ekspektasi, "\n")
## Ekspektasi permintaan: 70

Prediksi

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)
    } else {
      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)
}
set.seed(1000)
sim_1000 <- permintaan_simulasi(1000, tabel_permintaan)
print(head(sim_1000, 10))
##    bilangan_acak prediksi_permintaan
## 1             68                  70
## 2             43                  70
## 3             86                  80
## 4             51                  70
## 5             88                  80
## 6             29                  60
## 7             99                  90
## 8             61                  70
## 9             18                  60
## 10            22                  60
mean_1000  <- mean(sim_1000$prediksi_permintaan)
cat("Rata-rata permintaan:",mean_1000, "\n")
## Rata-rata permintaan: 70.12097
set.seed(5000)
sim_5000 <- permintaan_simulasi(5000, tabel_permintaan)
print(head(sim_5000, 10))
##    bilangan_acak prediksi_permintaan
## 1             63                  70
## 2             40                  70
## 3              5                  50
## 4             53                  70
## 5             50                  70
## 6             35                  70
## 7             97                  90
## 8            100                  90
## 9             52                  70
## 10            53                  70
mean_5000  <- mean(sim_5000$prediksi_permintaan)
cat("Rata-rata permintaan:", mean_5000, "\n")
## Rata-rata permintaan: 70.08871
set.seed(20000)
sim_20000 <- permintaan_simulasi(20000, tabel_permintaan)
print(head(sim_20000, 10))
##    bilangan_acak prediksi_permintaan
## 1             87                  80
## 2             27                  60
## 3             28                  60
## 4             76                  80
## 5             23                  60
## 6             36                  70
## 7             11                  60
## 8             12                  60
## 9             63                  70
## 10            78                  80
mean_20000 <- mean(sim_20000$prediksi_permintaan)
cat("Rata-rata permintaan:", mean_20000, "\n")
## Rata-rata permintaan: 69.89096
hasil <- data.frame(
  Simulasi = c(1000, 5000, 20000),
  Ekspektasi_Simulasi = c(mean_1000, mean_5000, mean_20000),
  Ekspektasi_Teoritis = nilai_ekspektasi
)

hasil$Selisih <- abs(hasil$Ekspektasi_Simulasi - nilai_ekspektasi)

print(hasil)
##   Simulasi Ekspektasi_Simulasi Ekspektasi_Teoritis    Selisih
## 1     1000            70.12097                  70 0.12096774
## 2     5000            70.08871                  70 0.08870968
## 3    20000            69.89096                  70 0.10904134

Analisi Hasil

Dengan jumlah percobaan 1.000, 5.000, dan 20.000 berdasarkan hasil dimulasi Monte Carlo diperolah ekspektasi simulasi masing-masing sebesar 70.12097, 70.08871, dan 69.89096. Jika dibandingkan dengan nilai ekspektasi teoritis yang telah dihitung sebelumnya yaitu 70. Simulasi 1.000 menghasilkan selisih sekitar 0.12097. Lalu, simulasi 5.000 menghasilkan selisih sekitar 0.08871. Dan simulasi 20.000 menghasilkan selisih sekitar 0.10904.

Terlihat ketiga hasil simulasi sudah mendekati nilai teoritis, yang menunjukkan bahwa metode Monte Carlo mampu memberikan estimasi yang baik.

Pembahasan

Hukum Bilangan Besar (LLN) menyatakan bahwa ketika n bertambah besar, rata-rata sampel Xbar akan mendekati nilai rata-rata sebenarnya μ (Blitztein & Hwang, 2019). Selain itu, metode Monte Carlo menunjukkan bahwa peningkatan jumlah iterasi akan mengurangi variansi estimasi sehingga menghasilkan hasil yang lebih stabil (Law & Kelton, 2007).

Namun, pada dasarnya, setiap kali simulasi dijalankan, hasil yang diperoleh dapat sedikit berbeda tergantung pada bilangan acak yang terbentuk.Sehingga, peningkatan jumlah simulasi tidak selalu menghasilkan nilai yang secara monoton semakin mendekati nilai teoritis pada setiap percobaan. Misalnya, pada simulasi 20.000, selisihnya sedikit lebih besar dibandingkan 5.000.