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
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
Lakukan modifikasi pada salah satu kode program yang telah diberikan dengan mengubah jumlah simulasi menjadi 1.000, 5.000, dan 20.000. Jalankan simulasi untuk masing-masing kondisi tersebut, kemudian bandingkan nilai ekspektasi yang dihasilkan dengan nilai ekspektasi hasil perhitungan manual. Selanjutnya, analisis bagaimana perubahan jumlah simulasi memengaruhi kedekatan hasil simulasi terhadap nilai teoritis, serta jelaskan mengapa peningkatan jumlah simulasi dapat menghasilkan estimasi yang lebih stabil dan akurat.
set.seed(123) # Menetapkan seed agar hasil simulasi bisa direproduksi
# 1. Simulasi 1.000 kali
sim_1000_tugas <- permintaan_simulasi(1000, tabel_permintaan)
# 2. Simulasi 5.000 kali
sim_5000_tugas <- permintaan_simulasi(5000, tabel_permintaan)
# 3. Simulasi 20.000 kali
sim_20000_tugas <- permintaan_simulasi(20000, tabel_permintaan)
# Membuat tabel perbandingan
perbandingan_tugas <- data.frame(
Metode = c("Ekspektasi Teoritis (Manual)",
"Simulasi 1.000 hari",
"Simulasi 5.000 hari",
"Simulasi 20.000 hari"),
Ekspektasi_Rata_Rata = c(
round(nilai_ekspektasi, 3),
round(mean(sim_1000_tugas$prediksi_permintaan), 3),
round(mean(sim_5000_tugas$prediksi_permintaan), 3),
round(mean(sim_20000_tugas$prediksi_permintaan), 3)
)
)
# Tampilkan tabel hasil perbandingan
print(perbandingan_tugas)
## Metode Ekspektasi_Rata_Rata
## 1 Ekspektasi Teoritis (Manual) 70.000
## 2 Simulasi 1.000 hari 70.455
## 3 Simulasi 5.000 hari 69.982
## 4 Simulasi 20.000 hari 69.938
Perbandingan Nilai Ekspektasi Simulasi vs Teoritis:
Berdasarkan hasil modifikasi kode program, nilai ekspektasi hasil perhitungan manual (teoritis) adalah tepat 70. Ketika dilakukan simulasi sebanyak 1.000 kali, rata-rata permintaan masih memiliki sedikit selisih terhadap angka 70. Namun, ketika jumlah simulasi ditingkatkan menjadi 5.000 dan 20.000 kali, terlihat jelas bahwa rata-rata permintaan hasil simulasi menjadi semakin konvergen (mendekati) nilai ekspektasi teoritis (70).
Pengaruh Perubahan Jumlah Simulasi terhadap Kedekatan Hasil:
Perubahan jumlah simulasi berbanding lurus dengan kedekatan hasil simulasi terhadap nilai teoritis. Semakin banyak pengulangan / iterasi simulasi yang dilakukan, selisih (error) antara hasil simulasi dengan hasil analitik akan semakin mengecil.
Mengapa peningkatan jumlah simulasi menghasilkan estimasi yang lebih stabil dan akurat?
Peningkatan jumlah simulasi menghasilkan estimasi yang lebih stabil dan akurat karena didasari oleh dua konsep utama dalam probabilitas:
Hukum Bilangan Besar (Law of Large Numbers): Hukum ini menyatakan bahwa semakin besar jumlah sampel acak yang diambil dalam suatu percobaan (dalam hal ini, simulasi dari 1.000 ke 20.000 kali), maka rata-rata hasil empiris (simulasi) akan semakin menyatu dan mendekati nilai ekspektasi populasinya (nilai teoritis).
Penurunan Standar Error (Galat Baku): Dalam simulasi Monte Carlo, tingkat fluktuasi acak berbanding terbalik dengan akar kuadrat dari jumlah simulasi (\(\frac{1}{\sqrt{N}}\)). Dengan memperbesar jumlah simulasi menjadi 20.000, varians empiris ditekan secara dramatis. Hal ini menyebabkan angka ekspektasi yang dihasilkan terhindar dari bias nilai acak yang ekstrem, sehingga tebakannya menjadi sangat stabil (tidak banyak berubah jika program di-run berulang kali) dan jauh lebih akurat.