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)
}
  1. Prediksi permintaan esteh selama 5 hari ke depan
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
  1. Prediksi permintaan esteh selama 20 hari ke depan
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
  1. Bangkitkanlah data dengan distribusi eksponensial untuk variabel permintaan sebanyak 10 data permintaan, dan data dengan distribusi normal untuk variabel frekuensi
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)
}
  1. Prediksi permintaan esteh selama 5 hari ke depan
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
  1. Prediksi permintaan esteh selama 20 hari ke depan
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
  1. Prediksi permintaan esteh selama 100 hari ke depan
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
  1. Prediksi permintaan esteh selama 1000 hari ke depan
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.