Pendahuluan

Dalam analisis probabilitas dan statistika, nilai ekspektasi (expected value) merupakan ukuran penting yang merepresentasikan rata-rata jangka panjang dari suatu variabel acak. Secara teoritis, nilai ekspektasi dapat dihitung langsung menggunakan distribusi probabilitas yang diketahui. Namun, dalam banyak kasus nyata, distribusi tersebut tidak selalu tersedia secara eksplisit, sehingga pendekatan simulasi menjadi alternatif yang sangat berguna.

Salah satu metode yang sering digunakan adalah simulasi Monte Carlo, yaitu teknik yang memanfaatkan pengambilan sampel acak berulang untuk mendekati nilai parameter tertentu. Melalui simulasi ini, kita dapat membandingkan hasil perhitungan teoritis (manual) dengan pendekatan empiris berbasis data.

# 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)

# peluang
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 dari 1 sampai 100 (diskrit sesuai interval)
  bilangan_acak <- sample(1:100, n, replace = TRUE)
  
  # Fungsi bantu untuk menentukan demand berdasarkan interval
  get_demand <- function(x) {
    index <- which(x >= tabel_permintaan$batas_bawah & x <= tabel_permintaan$batas_atas)
    if (length(index) == 0) {
      return(NA)  # atau fallback ke 70 jika mau pakai nilai tengah
    } else {
      return(tabel_permintaan$permintaan[index])
    }
  }
  
  prediksi_permintaan <- sapply(bilangan_acak, get_demand)
  
  # Hapus NA jika ada
  result <- data.frame(
    bilangan_acak = bilangan_acak,
    prediksi_permintaan = prediksi_permintaan
  )
  result <- na.omit(result)
  
  return(result)
}
set.seed(5)
# a. 5 hari
sim_5 <- permintaan_simulasi(5, tabel_permintaan)
print(head(sim_5, 10))
##   bilangan_acak prediksi_permintaan
## 1            66                  70
## 2            57                  70
## 3            79                  80
## 4            75                  80
## 5            41                  70
cat("Rata-rata permintaan:", mean(sim_5$prediksi_permintaan), "\n")
## Rata-rata permintaan: 74
set.seed(20)
# a. 20 hari
sim_20 <- permintaan_simulasi(20, tabel_permintaan)
print(head(sim_20, 10))
##    bilangan_acak prediksi_permintaan
## 1             38                  70
## 2             63                  70
## 3              2                  50
## 4             98                  90
## 5             29                  60
## 6             94                  90
## 7             62                  70
## 8             45                  70
## 9             41                  70
## 10            67                  70
cat("Rata-rata permintaan:", mean(sim_20$prediksi_permintaan), "\n")
## Rata-rata permintaan: 71
set.seed(100)
# c. 100 hari
sim_100 <- permintaan_simulasi(100, tabel_permintaan)
print(head(sim_100, 10))
##    bilangan_acak prediksi_permintaan
## 1             74                  80
## 2             89                  80
## 3             78                  80
## 4             23                  60
## 5             86                  80
## 6             70                  70
## 7              4                  50
## 8             55                  70
## 9             70                  70
## 10            98                  90
cat("Rata-rata permintaan:", mean(sim_100$prediksi_permintaan), "\n")
## Rata-rata permintaan: 69.19192
set.seed(1000)
# d. 1000 hari
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
cat("Rata-rata permintaan:", mean(sim_1000$prediksi_permintaan), "\n")
## Rata-rata permintaan: 70.12097
perbandingan <- data.frame(
  Metode = c("Ekspektasi Teoritis", "Simulasi 5 hari","Simulasi 20 hari", "Simulasi 100 hari", "Simulasi 1000 hari"),
  Permintaan_Rata_Rata = c(
    round(nilai_ekspektasi, 2),
    round(mean(sim_5$prediksi_permintaan), 2),
    round(mean(sim_20$prediksi_permintaan), 2),
    round(mean(sim_100$prediksi_permintaan), 2),
    round(mean(sim_1000$prediksi_permintaan), 2)
  )
)

# Tampilkan tabel
print(perbandingan)
##                Metode Permintaan_Rata_Rata
## 1 Ekspektasi Teoritis                70.00
## 2     Simulasi 5 hari                74.00
## 3    Simulasi 20 hari                71.00
## 4   Simulasi 100 hari                69.19
## 5  Simulasi 1000 hari                70.12