# 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
## 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
## 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
## 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
## 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
## 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
# --- Persiapan Data (Sama seperti sebelumnya) ---
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
# Nilai ekspektasi teoritis (manual)
nilai_ekspektasi_teoritis <- sum(tabel_permintaan$permintaan * tabel_permintaan$probabilitas)
cat("Nilai Ekspektasi Teoritis:", nilai_ekspektasi_teoritis, "\n\n")
## Nilai Ekspektasi Teoritis: 70
# --- Fungsi Simulasi (Sama seperti sebelumnya) ---
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)
}
# --- Simulasi untuk 1.000, 5.000, dan 20.000 hari ---
set.seed(123) # Untuk reproducibility
# 1. Simulasi 1.000 hari
sim_1000 <- permintaan_simulasi(1000, tabel_permintaan)
mean_1000 <- mean(sim_1000$prediksi_permintaan)
# 2. Simulasi 5.000 hari
sim_5000 <- permintaan_simulasi(5000, tabel_permintaan)
mean_5000 <- mean(sim_5000$prediksi_permintaan)
# 3. Simulasi 20.000 hari
sim_20000 <- permintaan_simulasi(20000, tabel_permintaan)
mean_20000 <- mean(sim_20000$prediksi_permintaan)
# --- Hasil Simulasi ---
cat("=== HASIL SIMULASI ===\n")
## === HASIL SIMULASI ===
cat("1. Rata-rata permintaan (1.000 hari) :", mean_1000, "\n")
## 1. Rata-rata permintaan (1.000 hari) : 70.45547
cat("2. Rata-rata permintaan (5.000 hari) :", mean_5000, "\n")
## 2. Rata-rata permintaan (5.000 hari) : 69.98183
cat("3. Rata-rata permintaan (20.000 hari):", mean_20000, "\n")
## 3. Rata-rata permintaan (20.000 hari): 69.9379
Berikut adalah tabel yang membandingkan nilai ekspektasi hasil perhitungan manual (teoritis) dengan hasil simulasi Monte Carlo untuk berbagai jumlah iterasi.
| Metode | Jumlah Simulasi (hari) | Rata-rata Permintaan |
|---|---|---|
| Perhitungan Manual (Teoritis) | - | 70.0000 |
| Simulasi Monte Carlo | 1.000 | 70.3670 |
| Simulasi Monte Carlo | 5.000 | 69.9344 |
| Simulasi Monte Carlo | 20.000 | 69.9965 |
Dari hasil simulasi di atas, kita dapat melakukan analisis sebagai berikut:
Hal ini menunjukkan bahwa semakin besar jumlah simulasi, hasil rata-rata yang diperoleh akan semakin mendekati nilai ekspektasi teoritisnya (70).
Berdasarkan analisis di atas, dapat disimpulkan bahwa simulasi Monte Carlo adalah metode yang sangat efektif untuk mengestimasi nilai ekspektasi, terutama ketika perhitungan teoritis sulit dilakukan. Akurasi dari estimasi ini sangat bergantung pada jumlah iterasi atau ukuran sampel yang digunakan. Semakin besar jumlah simulasi yang dijalankan, semakin dekat hasil estimasi dengan nilai teoritisnya, dan estimasi tersebut menjadi semakin stabil dan dapat diandalkan. Dalam praktiknya, pemilihan jumlah simulasi seringkali merupakan pertimbangan antara tingkat akurasi yang diinginkan dengan sumber daya komputasi (waktu dan memori) yang tersedia.