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
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)
}
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
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
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)
)
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.