Simulasi digunakan sebagai pendekatan untuk memahami perilaku suatu variabel acak melalui proses pembangkitan data secara berulang. Salah satu konsep dasar yang mendasari pendekatan ini adalah Hukum Bilangan Besar (Law of Large Numbers), yang menyatakan bahwa semakin banyak jumlah pengamatan atau simulasi yang dilakukan, maka rata-rata hasil sampel akan semakin mendekati nilai harapan (ekspektasi) teoritis dari distribusi tersebut.. Sebuah warung es teh di pinggir jalan melakukan pengamatan dan mencatat frekuensi harian permintaan es teh selama 100 hari terakhir. Data pengamatan sebagai berikut:
esteh <- data.frame(
Permintaan = c(50,60,70,80,90),
Frekuensi = c(10,20,40,20,10)
)
# Probabilitas
Total_frekuensi <- sum(esteh$Frekuensi)
esteh$Probabilitas <- esteh$Frekuensi/ Total_frekuensi
# Probabilitas Kumulatif
esteh$Probabilitas_kumulatif <- cumsum(esteh$Probabilitas)
# Batas Atas dan Bawah
esteh$Batas_Bawah <- c(1, head(esteh$Probabilitas_kumulatif, -1) * 100 + 1)
esteh$Batas_Atas <- esteh$Probabilitas_kumulatif * 100
Ekspektasi <- sum(esteh$Permintaan * esteh$Probabilitas)
cat("Nilai Ekspektasi =", Ekspektasi, "\n")
## Nilai Ekspektasi = 70
Simulasi_esteh <- function(n, esteh) {
random <- sample(1:100, n, replace = TRUE)
demand <- function(x) {
index <- which(x >= esteh$Batas_Bawah & x <= esteh$Batas_Atas)
if (length(index) == 0) {
return (70)
} else {
return(esteh$Permintaan[index])
}
}
Prediksi_esteh <- sapply(random, demand)
result <- data.frame(
random = random,
Prediksi_esteh = Prediksi_esteh
)
result <- na.omit(result)
return(result)
}
set.seed(5)
day5 <- Simulasi_esteh(5, esteh)
head(day5)
## random Prediksi_esteh
## 1 66 70
## 2 57 70
## 3 79 80
## 4 75 80
## 5 41 70
cat("Rata-rata permintaan = ", mean(day5$Prediksi_esteh), "\n")
## Rata-rata permintaan = 74
set.seed(20)
day20 <- Simulasi_esteh(20, esteh)
head(day20, 20)
## random Prediksi_esteh
## 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
## 11 61 70
## 12 14 60
## 13 72 80
## 14 63 70
## 15 52 70
## 16 73 80
## 17 85 80
## 18 81 80
## 19 57 70
## 20 6 50
cat("Rata-rata permintaan = ", mean(day20$Prediksi_esteh), "\n")
## Rata-rata permintaan = 71
Perbandingan ekspektasi dengan hasil simulasi
Perbandingan <- data.frame(
Metode = c("Ekspektasi", "Simulasi 5 hari", "Simulasi 20 hari"),
Permintaan_Rata_Rata = c(Ekspektasi, mean(day5$Prediksi_esteh), mean(day20$Prediksi_esteh))
)
Perbandingan
## Metode Permintaan_Rata_Rata
## 1 Ekspektasi 70
## 2 Simulasi 5 hari 74
## 3 Simulasi 20 hari 71
set.seed(1)
data <- data.frame(
Permintaan = rexp(10, rate = 0.1),
Frekuensi = rnorm(10, mean = 40, sd = 20)
)
# Probabilitas
Total_Frekuensi <- sum(data$Frekuensi)
data$Probabilitas <- data$Frekuensi/Total_Frekuensi
# Probabilitas Kumulatif
data$Probabilitas_Kumulatif <- cumsum(data$Probabilitas)
# Batas Atas dan Bawah
data$Batas_Bawah <- c(1, head(data$Probabilitas_Kumulatif, -1) * 100 + 1)
data$Batas_Atas <- data$Probabilitas_Kumulatif * 100
Ekspektasi <- sum(data$Permintaan * data$Probabilitas)
cat("Nilai Ekspektasi =", Ekspektasi, "\n")
## Nilai Ekspektasi = 7.715219
Simulasi <- function(n, data) {
random <- sample(1:100, n, replace = TRUE)
demand <- function(x) {
index <- which(x >= data$Batas_Bawah & x <= data$Batas_Atas)
if (length(index) == 0) {
return (7.715219)
} else {
return(data$Permintaan[index])
}
}
Prediksi <- sapply(random, demand)
result <- data.frame(
random = random,
Prediksi = Prediksi
)
result <- na.omit(result)
return(result)
}
set.seed(5)
day_5 <- Simulasi(5, data)
head(day_5)
## random Prediksi
## 1 66 12.295621
## 2 57 12.295621
## 3 79 9.565675
## 4 75 7.715219
## 5 41 4.360686
cat("Rata-rata permintaan = ", mean(day_5$Prediksi), "\n")
## Rata-rata permintaan = 9.246564
set.seed(20)
day_20 <- Simulasi(20, data)
head(day_20)
## random Prediksi
## 1 38 4.360686
## 2 63 12.295621
## 3 2 7.551818
## 4 98 1.470460
## 5 29 1.397953
## 6 94 1.470460
cat("Rata-rata permintaan = ", mean(day_20$Prediksi), "\n")
## Rata-rata permintaan = 8.857641
set.seed(100)
day_100 <- Simulasi(100, data)
head(day_100)
## random Prediksi
## 1 74 5.396828
## 2 89 1.470460
## 3 78 9.565675
## 4 23 1.457067
## 5 86 7.715219
## 6 70 12.295621
cat("Rata-rata permintaan = ", mean(day_100$Prediksi), "\n")
## Rata-rata permintaan = 8.918797
set.seed(1000)
day_1000 <- Simulasi(1000, data)
head(day_1000)
## random Prediksi
## 1 68 12.295621
## 2 43 4.360686
## 3 86 7.715219
## 4 51 28.949685
## 5 88 1.470460
## 6 29 1.397953
cat("Rata-rata permintaan = ", mean(day_1000$Prediksi), "\n")
## Rata-rata permintaan = 7.276563
Perbandingan ekspektasi dengan hasil simulasi
Perbandingan <- data.frame(
Metode = c("Ekspektasi", "Simulasi 5 hari", "Simulasi 20 hari", "Simulasi 100 hari", "Simulasi 1000 hari"),
Permintaan_Rata_Rata = c(Ekspektasi, mean(day_5$Prediksi), mean(day_20$Prediksi), mean(day_100$Prediksi), mean(day_1000$Prediksi))
)
Perbandingan
## Metode Permintaan_Rata_Rata
## 1 Ekspektasi 7.715219
## 2 Simulasi 5 hari 9.246564
## 3 Simulasi 20 hari 8.857641
## 4 Simulasi 100 hari 8.918797
## 5 Simulasi 1000 hari 7.276563
Dilakukan simulasi permintaan dengan berbagai jumlah hari, yaitu 5, 20, 100, dan 1000 hari. Tujuannya adalah untuk mengamati bagaimana rata-rata hasil simulasi berubah seiring dengan bertambahnya jumlah pengamatan. Secara teoritis, simulasi dengan jumlah kecil cenderung menghasilkan rata-rata yang tidak stabil dan dapat menyimpang jauh dari nilai ekspektasi, terutama jika distribusi yang digunakan memiliki variabilitas tinggi. Sebaliknya, ketika jumlah simulasi diperbesar, pengaruh nilai ekstrem akan semakin berkurang, sehingga rata-rata menjadi lebih stabil dan mendekati nilai ekspektasi.
Hasil yang menunjukkan bahwa rata-rata simulasi dengan jumlah pengamatan yang lebih besar semakin mendekati nilai ekspektasi dapat dianggap sebagai bukti empiris dari berlakunya Hukum Bilangan Besar. Dengan demikian, peningkatan jumlah simulasi tidak hanya memperbaiki kestabilan hasil, tetapi juga meningkatkan akurasi estimasi terhadap parameter populasi yang sebenarnya.