Tugas Simulasi Monte Carlo

# 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 <- sum(tabel_permintaan$frekuensi)

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
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
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 permintaan:", nilai_ekspektasi, "\n")
## Ekspektasi permintaan: 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)
    } 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)
}

Prediksi

set.seed(1000)
# a. 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
set.seed(5000)
# a. 5000 hari
sim_5000 <- permintaan_simulasi(5000, tabel_permintaan)
print(head(sim_5000, 10))
##    bilangan_acak prediksi_permintaan
## 1             63                  70
## 2             40                  70
## 3              5                  50
## 4             53                  70
## 5             50                  70
## 6             35                  70
## 7             97                  90
## 8            100                  90
## 9             52                  70
## 10            53                  70
cat("Rata-rata permintaan:", mean(sim_5000$prediksi_permintaan), "\n")
## Rata-rata permintaan: 70.08871
set.seed(20000)
# c. 20000 hari
sim_20000 <- permintaan_simulasi(20000, tabel_permintaan)
print(head(sim_20000, 10))
##    bilangan_acak prediksi_permintaan
## 1             87                  80
## 2             27                  60
## 3             28                  60
## 4             76                  80
## 5             23                  60
## 6             36                  70
## 7             11                  60
## 8             12                  60
## 9             63                  70
## 10            78                  80
cat("Rata-rata permintaan:", mean(sim_20000$prediksi_permintaan), "\n")
## Rata-rata permintaan: 69.89096
perbandingan <- data.frame(
  Metode = c("Ekspektasi Teoritis", "Simulasi 1000 hari","Simulasi 5000 hari", "Simulasi 20000 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)
  )
)
print(perbandingan)
##                Metode Permintaan_Rata_Rata
## 1 Ekspektasi Teoritis                70.00
## 2  Simulasi 1000 hari                70.12
## 3  Simulasi 5000 hari                70.09
## 4 Simulasi 20000 hari                69.89

Interpretasi

Berdasarkan perhitungan manual yang dilakukan didapat nilai ekspektasi rata-rata permintaan adalah 70.00. Sedangkan berdasarkan simulasi Monte Carlo untuk 1000 hari, 5000 hari, dan 20000 hari didapat nilai rata-rata yang mendeati 70.00 (berada dikisaran 69.89 sampai 70.12) Hal ini menunjukkan bahwa simulasi berhasil merepresentasikan kondisi teoritis dengan tingkat kesalahan (error) yang sangat kecil.

Berdasarkan simulasi Monte Carlo didapat nilai rata-rata dari simulasi 1000 hari (70.12), 5000 hari (70.09), dan 20000 hari (69.89). Hal ini menunjukkan bahwa semakin besar simulasi yang dilakukan, selisih antara rata-rata hasil simulasi dan nilai teoritis akan cenderung mengecil

Peningkatan jumlah simulasi menghasilkan estimasi yang stabil dan akurat ini didasarkan pada Hukum Bilangan Besar (Law of Large Numbers). Hukum Bilangan Besar menyatakan bahwa seiring dengan bertambahnya ukuran sampel, rata-rata dari sampel tersebut akan semakin konvergen nilai ekspektasi dari populasi aslinya.

Selain itu, varians dari rata-rata sampel berbanding terbalik dengan jumlah sampel. Semakin banyak iterasi, maka semakin kecil pula nilai variansnya, sehingga output yang dihasilkan pada simulasi 20.000 hari menjadi jauh lebih stabil dan akurat dibandingkan simulasi 1.000 hari.

Latihan Soal Simulasi Monte Carlo

tabel_permintaan <- data.frame(
  permintaan = c(50, 60, 70, 80, 90),
  frekuensi = c(10, 20, 40, 20, 10)
)
total_frekuensi <- sum(tabel_permintaan$frekuensi)

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
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
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 permintaan:", nilai_ekspektasi, "\n")
## Ekspektasi permintaan: 70

Prediksi

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

Latihan Soal 1

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

Latihan Soal 2

set.seed(123)
rata_rata_target <- 70
sd_target <- 10

# 10 data permintaan (Distribusi Eksponensial)
data_eksponensial <- rexp(10, rate = 1/rata_rata_target)
print("10 Data Permintaan (Eksponensial):")
## [1] "10 Data Permintaan (Eksponensial):"
print(data_eksponensial)
##  [1]  59.042008  40.362719  93.033841   2.210415   3.934768  22.155085
##  [7]  21.995910  10.168676 190.836553   2.040741
# 10 data frekuensi (Distribusi Normal)
data_normal <- rnorm(10, mean = rata_rata_target, sd = sd_target)
print("10 Data Frekuensi (Normal):")
## [1] "10 Data Frekuensi (Normal):"
print(data_normal)
##  [1] 65.54338 82.24082 73.59814 74.00771 71.10683 64.44159 87.86913 74.97850
##  [9] 50.33383 77.01356
simulasi_distribusi <- function(n_hari) {
  permintaan_simulasi <- rnorm(n_hari, mean = rata_rata_target, sd = sd_target)
  return(mean(permintaan_simulasi))
}

n_list <- c(5, 20, 100, 1000)
hasil_prediksi <- data.frame(Durasi_Hari = n_list, Rata_Rata_Permintaan = NA)

for(i in 1:length(n_list)) {
  hasil_prediksi$Rata_Rata_Permintaan[i] <- simulasi_distribusi(n_list[i])
}

print("Hasil Prediksi Permintaan:")
## [1] "Hasil Prediksi Permintaan:"
print(hasil_prediksi)
##   Durasi_Hari Rata_Rata_Permintaan
## 1           5             62.97303
## 2          20             71.00824
## 3         100             69.66305
## 4        1000             70.29275

Interpretasi

Berdasarkan hasil simulasi Monte Carlo yang dilakukan, terlihat bahwa pada simulasi jangka pendek (5 hari), rata-rata permintaan sebesar 62,97 masih menunjukkan perbedaan yang cukup signifikan dari nilai ekspektasi teoritis (70). Hal ini dikarenakan jumlah sampel yang terlaalu sedikit faktor acak masih mendominasi hasil.

Namun, seiring bertambahnya durasi simulasi hingga mencapai 1000 hari, nilai rata-rata mulai stabil dan semakin mendekati nilai ideal di angka 70,29. Hal ini membuktikan Hukum Bilangan Besar (Law of Large Numbers), di mana peningkatan jumlah iterasi secara efektif mengurangi dampak fluktuasi acak dan menghasilkan estimasi yang lebih akurat serta stabil.