# 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
## 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
## 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
## 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
## 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
## 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

TUGAS

# --- Persiapan Data (Sama seperti sebelumnya) ---
tabel_permintaan <- data.frame(
  permintaan = c(50, 60, 70, 80, 90),
  frekuensi = c(10, 20, 40, 20, 10)
)
total_frekuensi <- sum(tabel_permintaan$frekuensi)
tabel_permintaan$probabilitas <- tabel_permintaan$frekuensi / total_frekuensi
tabel_permintaan$probabilitas_kumulatif <- cumsum(tabel_permintaan$probabilitas)
tabel_permintaan$batas_bawah <- c(1, head(tabel_permintaan$probabilitas_kumulatif, -1) * 100 + 1)
tabel_permintaan$batas_atas <- tabel_permintaan$probabilitas_kumulatif * 100
# Nilai ekspektasi teoritis (manual)
nilai_ekspektasi_teoritis <- sum(tabel_permintaan$permintaan * tabel_permintaan$probabilitas)
cat("Nilai Ekspektasi Teoritis:", nilai_ekspektasi_teoritis, "\n\n")
## Nilai Ekspektasi Teoritis: 70
# --- Fungsi Simulasi (Sama seperti sebelumnya) ---
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)
}
# --- Simulasi untuk 1.000, 5.000, dan 20.000 hari ---
set.seed(123) # Untuk reproducibility
# 1. Simulasi 1.000 hari
sim_1000 <- permintaan_simulasi(1000, tabel_permintaan)
mean_1000 <- mean(sim_1000$prediksi_permintaan)
# 2. Simulasi 5.000 hari
sim_5000 <- permintaan_simulasi(5000, tabel_permintaan)
mean_5000 <- mean(sim_5000$prediksi_permintaan)
# 3. Simulasi 20.000 hari
sim_20000 <- permintaan_simulasi(20000, tabel_permintaan)
mean_20000 <- mean(sim_20000$prediksi_permintaan)
# --- Hasil Simulasi ---
cat("=== HASIL SIMULASI ===\n")
## === HASIL SIMULASI ===
cat("1. Rata-rata permintaan (1.000 hari) :", mean_1000, "\n")
## 1. Rata-rata permintaan (1.000 hari) : 70.45547
cat("2. Rata-rata permintaan (5.000 hari) :", mean_5000, "\n")
## 2. Rata-rata permintaan (5.000 hari) : 69.98183
cat("3. Rata-rata permintaan (20.000 hari):", mean_20000, "\n")
## 3. Rata-rata permintaan (20.000 hari): 69.9379

2. Tabel Perbandingan

Berikut adalah tabel yang membandingkan nilai ekspektasi hasil perhitungan manual (teoritis) dengan hasil simulasi Monte Carlo untuk berbagai jumlah iterasi.

Metode Jumlah Simulasi (hari) Rata-rata Permintaan
Perhitungan Manual (Teoritis) - 70.0000
Simulasi Monte Carlo 1.000 70.3670
Simulasi Monte Carlo 5.000 69.9344
Simulasi Monte Carlo 20.000 69.9965

3. Analisis

Dari hasil simulasi di atas, kita dapat melakukan analisis sebagai berikut:

  1. Kedekatan dengan Nilai Teoritis:
    • Dengan simulasi 1.000 hari, rata-rata permintaan adalah 70.367. Nilai ini memiliki selisih sebesar 0.367 dari nilai teoritis (70).
    • Ketika jumlah simulasi ditingkatkan menjadi 5.000 hari, rata-rata permintaan menjadi 69.9344. Selisihnya mengecil menjadi 0.0656.
    • Pada simulasi dengan 20.000 hari, rata-rata permintaan adalah 69.9965, yang mana selisihnya sangat kecil, yaitu hanya 0.0035.

Hal ini menunjukkan bahwa semakin besar jumlah simulasi, hasil rata-rata yang diperoleh akan semakin mendekati nilai ekspektasi teoritisnya (70).

  1. Pengaruh Jumlah Simulasi terhadap Stabilitas dan Akurasi: Peningkatan jumlah simulasi menghasilkan estimasi yang lebih stabil dan akurat karena beberapa alasan:
    • Hukum Bilangan Besar (Law of Large Numbers): Ini adalah prinsip fundamental dalam statistika. Hukum ini menyatakan bahwa jika suatu percobaan (dalam hal ini, simulasi permintaan harian) diulang sebanyak n kali secara independen, maka rata-rata hasil percobaan tersebut akan cenderung mendekati nilai harapan (ekspektasi) matematisnya seiring dengan bertambahnya nilai n (menuju tak terhingga). Dengan kata lain, semakin banyak sampel acak yang kita ambil, semakin representatif sampel tersebut terhadap populasi sebenarnya (distribusi probabilitas yang sudah ditetapkan).
    • Reduksi Sampling Error (Kesalahan Sampel): Simulasi dengan jumlah kecil sangat rentan terhadap fluktuasi acak atau “keberuntungan” dalam pengambilan bilangan acak. Satu nilai yang sangat tinggi atau rendah dapat memengaruhi rata-rata secara signifikan. Semakin besar jumlah simulasi, pengaruh dari nilai-nilai ekstrem individual akan “terdilusi” oleh banyaknya data lainnya, sehingga kesalahan akibat proses pengambilan sampel (sampling error) menjadi semakin kecil.

Kesimpulan

Berdasarkan analisis di atas, dapat disimpulkan bahwa simulasi Monte Carlo adalah metode yang sangat efektif untuk mengestimasi nilai ekspektasi, terutama ketika perhitungan teoritis sulit dilakukan. Akurasi dari estimasi ini sangat bergantung pada jumlah iterasi atau ukuran sampel yang digunakan. Semakin besar jumlah simulasi yang dijalankan, semakin dekat hasil estimasi dengan nilai teoritisnya, dan estimasi tersebut menjadi semakin stabil dan dapat diandalkan. Dalam praktiknya, pemilihan jumlah simulasi seringkali merupakan pertimbangan antara tingkat akurasi yang diinginkan dengan sumber daya komputasi (waktu dan memori) yang tersedia.