# 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

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
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
# Set seed agar reproducible
set.seed(123)

# Simulasi
sim_1000 <- permintaan_simulasi(1000, tabel_permintaan)
sim_5000 <- permintaan_simulasi(5000, tabel_permintaan)
sim_20000 <- permintaan_simulasi(20000, tabel_permintaan)

# Hitung rata-rata (ekspektasi empiris)
rata_1000 <- mean(sim_1000$prediksi_permintaan)
rata_5000 <- mean(sim_5000$prediksi_permintaan)
rata_20000 <- mean(sim_20000$prediksi_permintaan)

# Hitung selisih dengan nilai teoritis
selisih_1000 <- abs(rata_1000 - nilai_ekspektasi)
selisih_5000 <- abs(rata_5000 - nilai_ekspektasi)
selisih_20000 <- abs(rata_20000 - nilai_ekspektasi)

# Tabel perbandingan
perbandingan <- data.frame(
  Simulasi = c("1000", "5000", "20000"),
  Rata_Rata = c(rata_1000, rata_5000, rata_20000),
  Selisih_dari_Teoritis = c(selisih_1000, selisih_5000, selisih_20000)
)

print(perbandingan)
##   Simulasi Rata_Rata Selisih_dari_Teoritis
## 1     1000  70.45547            0.45546559
## 2     5000  69.98183            0.01817447
## 3    20000  69.93790            0.06210239
cat("Ekspektasi Teoritis:", nilai_ekspektasi, "\n")
## Ekspektasi Teoritis: 70

Dari hasil perhitungan, nilai ekspektasi teoritis permintaan adalah sebesar 70. Nilai ini menjadi acuan untuk melihat seberapa dekat hasil simulasi yang dilakukan.

Pada simulasi dengan 1000 iterasi, rata-rata permintaan yang dihasilkan sudah cukup mendekati 70, tetapi masih terlihat adanya selisih. Ketika jumlah simulasi ditingkatkan menjadi 5000, hasilnya menjadi lebih dekat lagi. Sementara itu, pada 20000 iterasi, rata-rata yang diperoleh hampir sama dengan nilai teoritis dan perubahannya sudah sangat kecil.

Pola ini menunjukkan bahwa semakin banyak jumlah simulasi, hasil yang diperoleh menjadi lebih stabil dan tidak terlalu dipengaruhi oleh faktor kebetulan. Pada jumlah simulasi yang kecil, satu atau dua nilai ekstrem bisa cukup memengaruhi rata-rata. Namun, ketika jumlah data semakin besar, pengaruh nilai-nilai acak tersebut semakin “teredam”. Rata-rata hasil percobaan akan cenderung mendekati nilai harapan sebenarnya jika jumlah percobaan diperbanyak. Jadi, bukan berarti simulasi menjadi “benar sempurna”, tetapi kesalahannya semakin kecil dan hasilnya lebih konsisten.

Namun, peningkatan jumlah simulasi juga tidak selalu memberikan perubahan yang signifikan. Perbedaan antara 5000 dan 20000, misalnya, biasanya tidak sebesar perbedaan antara 1000 dan 5000. Artinya, setelah titik tertentu, penambahan simulasi hanya memberikan perbaikan kecil saja.