# 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
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)
# b. 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
TUGAS Lakukan modifikasi pada salah satu kode program yang telah diberikan dengan mengubah jumlah simulasi menjadi 1.000, 5.000, dan 20.000. Jalankan simulasi untuk masing-masing kondisi tersebut, kemudian bandingkan nilai ekspektasi yang dihasilkan dengan nilai ekspektasi hasil perhitungan manual. Selanjutnya, analisis bagaimana perubahan jumlah simulasi memengaruhi kedekatan hasil simulasi terhadap nilai teoritis, serta jelaskan mengapa peningkatan jumlah simulasi dapat menghasilkan estimasi yang lebih stabil dan akurat.
permintaan_simulasi <- function(n, tabel_permintaan) {
# Generate bilangan acak 1–100
bilangan_acak <- sample(1:100, n, replace = TRUE)
# Mapping ke permintaan
prediksi_permintaan <- sapply(bilangan_acak, 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[1]])
}
})
# Data frame hasil
result <- data.frame(
bilangan_acak = bilangan_acak,
prediksi_permintaan = prediksi_permintaan
)
return(na.omit(result))
}
set.seed(1000)
# Simulasi 1000 hari
sim_1000 <- permintaan_simulasi(1000, tabel_permintaan)
# Tampilkan 10 data pertama
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
# Hitung rata-rata permintaan
rata_1000 <- mean(sim_1000$prediksi_permintaan)
cat("Rata-rata permintaan (1000):", rata_1000, "\n")
## Rata-rata permintaan (1000): 70.12097
Berdasarkan hasil simulasi menggunakan metode Monte Carlo Simulation dengan jumlah percobaan sebanyak 1.000, diperoleh nilai rata-rata (ekspektasi) permintaan sebesar 70,12097.Namun, karena jumlah simulasi yang digunakan masih relatif terbatas, hasil tersebut masih mengandung variasi atau fluktuasi acak.
set.seed(5000)
# Simulasi 5000 hari
sim_5000 <- permintaan_simulasi(5000, tabel_permintaan)
# Tampilkan 10 data pertama
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
# Hitung rata-rata permintaan
rata_5000 <- mean(sim_5000$prediksi_permintaan)
cat("Rata-rata permintaan (5000):", rata_5000, "\n")
## Rata-rata permintaan (5000): 70.08871
Berdasarkan hasil simulasi menggunakan metode Monte Carlo Simulation dengan jumlah percobaan sebanyak 5.000, diperoleh nilai rata-rata (ekspektasi) permintaan sebesar 70,08871. Terjadi penurunan tingkat fluktuatif pada prediksi permintaan.
set.seed(20000)
# Simulasi 20000 hari
sim_20000 <- permintaan_simulasi(20000, tabel_permintaan)
# Tampilkan 10 data pertama
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
# Hitung rata-rata permintaan
rata_20000 <- mean(sim_20000$prediksi_permintaan)
cat("Rata-rata permintaan (20000):", rata_20000, "\n")
## Rata-rata permintaan (20000): 69.89096
Berdasarkan hasil simulasi menggunakan metode Monte Carlo Simulation dengan jumlah percobaan sebanyak 20.000, diperoleh nilai rata-rata (ekspektasi) permintaan sebesar 69,89096.
nilai_ekspektasi <- sum(
tabel_permintaan$permintaan * tabel_permintaan$probabilitas
)
nilai_ekspektasi
## [1] 70
Berdasarkan perhitungan manual, diperoleh nilai ekspektasi permintaan sebesar 70. Sementara itu, hasil simulasi menggunakan metode Monte Carlo Simulation menunjukkan nilai rata-rata sebesar 70,12097 untuk 1.000 percobaan, 70,08871 untuk 5.000 percobaan, dan 69,89096 untuk 20.000 percobaan.
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
Berdasarkan tabel perbandingan diatas,diperoleh bahwa simulasi 1.000 hari memiliki selisih dengan nilai ekspektasi teoritis sebesar +0,12, simulasi 5.000 hari sebesar +0,09, dan simulasi 20.000 hari sebesar -0,11.Selisih positif menunjukkan bahwa hasil simulasi sedikit lebih tinggi dari nilai teoritis, sedangkan selisih negatif menunjukkan hasil yang sedikit lebih rendah.Secara umum, seluruh hasil simulasi sudah sangat mendekati nilai ekspektasi teoritis, dengan selisih yang relatif kecil. Terlihat bahwa ketika jumlah simulasi meningkat dari 1.000 ke 5.000 dan 20.000, nilai rata-rata yang dihasilkan menjadi semakin stabil dan berfluktuasi lebih kecil di sekitar angka 70.
Fenomena ini bisa dipahami melalui prinsip Law of Large Numbers, yaitu semakin banyak percobaan yang dilakukan, maka nilai rata-rata yang dihasilkan akan semakin mendekati nilai sebenarnya. Dengan kata lain, ketika jumlah simulasi ditambah, hasilnya jadi lebih stabil dan tidak terlalu dipengaruhi oleh kebetulan acak. Oleh karena itu, simulasi dengan jumlah percobaan yang lebih besar cenderung memberikan hasil yang lebih akurat dan bisa lebih dipercaya.