Gunakan simulasi untuk menghitung nilai pendekatan dari \(E[X^2]\) untuk variabel random berdistribusi Uniform jika \(X \sim U(0,1)\). Gunakan 10.000 angka random.
set.seed(777)
n <- 10000
x <- runif(n, 0, 1)
e_x2 <- mean(x^2)
cat("Pendekatan E[X^2]:", e_x2, "\n")
## Pendekatan E[X^2]: 0.3311039
Pada soal ini kita melakukan simulasi untuk menghitung pendekatan nilai \(E[X^2]\) di mana \(X\) berdistribusi Uniform(0,1). Dengan membangkitkan 10.000 angka acak, diperoleh hasil \(E[X^2]\) mendekati 0.3311. Nilai ini cukup dekat dengan nilai teoritis \(E[X^2] = \int_0^1 x^2 dx = \frac{1}{3} \approx 0.3333\).
Artinya, simulasi Monte Carlo yang dilakukan sudah mampu memberikan estimasi yang akurat untuk nilai ekspektasi \(X^2\), sesuai dengan karakteristik distribusi Uniform(0,1). Hal ini menunjukkan bahwa pendekatan berbasis simulasi dapat digunakan untuk mendekati nilai harapan fungsi dari variabel acak ketika perhitungan analitik sulit dilakukan.
Buat masing-masing untuk \(n_1 = 100\), \(n_2 = 1000\), dan \(n_3 = 10000\) angka random dari \(N(100, 15^2)\) lalu hitung rata-rata, simpangan baku, dan plot histogram. Berikan penjelasan hasil yang Saudara peroleh.
set.seed(777)
sim_normal <- function(n) {
data <- rnorm(n, 100, 15)
cat("n =", n, "\nRata-rata:", mean(data), "\nSimpangan baku:", sd(data), "\n\n")
hist(data, main=paste("Histogram N(100,15^2) n=", n), col="blue", xlab="Nilai")
}
sim_normal(100)
## n = 100
## Rata-rata: 99.86759
## Simpangan baku: 14.41958
sim_normal(1000)
## n = 1000
## Rata-rata: 100.2659
## Simpangan baku: 15.00885
sim_normal(10000)
## n = 10000
## Rata-rata: 99.83816
## Simpangan baku: 15.03981
Pada simulasi ini dibangkitkan angka acak dari distribusi normal \(N(100, 15^2)\) dengan tiga ukuran sampel berbeda, yaitu \(n = 100\), \(n = 1000\), dan \(n = 10000\). Hasilnya adalah sebagai berikut:
Dari hasil tersebut terlihat bahwa semakin besar ukuran sampel, rata-rata dan simpangan baku semakin mendekati nilai teoritisnya (rata-rata = 100, simpangan baku = 15). Selain itu, histogram pada setiap ukuran sampel menunjukkan bentuk distribusi yang semakin mendekati kurva normal seiring dengan bertambahnya ukuran sampel. Hal ini sesuai dengan teori bahwa sampel besar akan menghasilkan distribusi empiris yang mendekati distribusi populasi aslinya.
Simulasikan distribusi binomial \(\text{Bin}(30, 0.25)\) sebanyak 5000 kali. Tentukan nilai estimasikan \(P(X \geq 15)\).
set.seed(777)
x_binom <- rbinom(5000, 30, 0.25)
p_xge15 <- mean(x_binom >= 15)
cat("P(X >= 15):", p_xge15, "\n")
## P(X >= 15): 0.0034
Simulasi distribusi binomial dilakukan dengan parameter \(n = 30\) dan \(p = 0.25\), sebanyak 5000 kali percobaan. Hasil estimasi peluang diperoleh \(P(X \ge 15) = 0.0034\). Ini menunjukkan bahwa peluang mendapatkan 15 atau lebih keberhasilan dalam 30 percobaan dengan peluang keberhasilan 0.25 pada setiap percobaan sangat kecil, yakni hanya sekitar 0.34%. Hasil ini sesuai dengan ekspektasi karena 15 keberhasilan jauh di atas rata-rata yang diharapkan (yakni \(30 \times 0.25 = 7.5\)).
Buatlah function untuk rumus berikut: \[ s = \sqrt{ \frac{ \sum x^2 - \frac{(\sum x)^2}{n} }{n - 1} } \] Hitung nilai \(s\) dengan membangkitkan data berdistribusi normal sebanyak 1000 data, rata-rata 89, dan standar deviasi 10.
s_custom <- function(x) {
n <- length(x)
s <- sqrt((sum(x^2) - (sum(x)^2)/n)/(n-1))
return(s)
}
set.seed(777)
x_norm <- rnorm(1000, 89, 10)
s_value <- s_custom(x_norm)
cat("Nilai S:", s_value, "\n")
## Nilai S: 9.965422
Simulasi membangkitkan 1000 data acak dari distribusi normal dengan rata-rata 89 dan standar deviasi 10. Nilai \(s\) yang dihitung menggunakan rumus manual diperoleh sebesar 9.97. Hasil ini sangat mendekati nilai standar deviasi yang digunakan dalam pembangkitan data, yaitu 10. Hal ini menunjukkan bahwa perhitungan manual rumus \(s\) telah sesuai dan dapat diandalkan untuk mengestimasi simpangan baku populasi berdasarkan data sampel.
Sebuah bank memiliki 2 teller dengan kondisi berikut:
Kerjakanlah tugas berikut:
set.seed(777)
# Muat library
library(simmer)
## Warning: package 'simmer' was built under R version 4.3.3
# Fungsi simulasi antrian
simulasi_antrian <- function(hari, teller = 2) {
lambda <- 5 # rata-rata kedatangan per jam
mu <- 1/8 # rate pelayanan per menit (8 menit rata-rata)
jam_buka <- 6
total_menit <- jam_buka * 60
waktu_tunggu <- c()
waktu_selesai_teller <- rep(0, teller)
teller_busy_time <- rep(0, teller)
for (h in 1:hari) {
n_customer <- rpois(1, lambda * jam_buka)
if (n_customer == 0) next
kedatangan <- sort(runif(n_customer, 0, total_menit))
pelayanan <- rexp(n_customer, mu)
for (i in 1:n_customer) {
next_teller <- which.min(waktu_selesai_teller)
mulai <- max(kedatangan[i], waktu_selesai_teller[next_teller])
selesai <- mulai + pelayanan[i]
waktu_tunggu <- c(waktu_tunggu, mulai - kedatangan[i])
teller_busy_time[next_teller] <- teller_busy_time[next_teller] + pelayanan[i]
waktu_selesai_teller[next_teller] <- selesai
}
}
list(
avg_tunggu = mean(waktu_tunggu),
persen_sibuk = teller_busy_time / (total_menit * hari) * 100,
waktu_tunggu = waktu_tunggu
)
}
# (a) Simulasi 20 hari untuk 2 dan 3 teller
result_2 <- simulasi_antrian(20, teller = 2)
result_3 <- simulasi_antrian(20, teller = 3)
# (b) Hitung rata-rata waktu tunggu
cat("Rata-rata waktu tunggu 2 teller:", round(result_2$avg_tunggu, 2), "menit\n")
## Rata-rata waktu tunggu 2 teller: 1177.4 menit
cat("Rata-rata waktu tunggu 3 teller:", round(result_3$avg_tunggu, 2), "menit\n")
## Rata-rata waktu tunggu 3 teller: 943.99 menit
# (c) Hitung persen sibuk masing-masing teller
cat("Persen sibuk 2 teller:", paste(round(result_2$persen_sibuk, 2), collapse = ", "), "%\n")
## Persen sibuk 2 teller: 32.83, 32.91 %
cat("Persen sibuk 3 teller:", paste(round(result_3$persen_sibuk, 2), collapse = ", "), "%\n")
## Persen sibuk 3 teller: 23.78, 22.98, 23.46 %
# (d) Bandingkan efisiensi -> Analisis di narasi Rmd, misalnya:
# Dengan menambah 1 teller, waktu tunggu berkurang, persentase sibuk menurun, artinya lebih efisien.
# (e) Visualisasi panjang antrian sepanjang hari
# Tentukan panjang maksimum untuk menyamakan panjang vektor
max_len <- max(length(result_2$waktu_tunggu), length(result_3$waktu_tunggu))
# Buat data frame gabungan
df_plot <- data.frame(
Nasabah = 1:max_len,
Teller2 = c(result_2$waktu_tunggu, rep(NA, max_len - length(result_2$waktu_tunggu))),
Teller3 = c(result_3$waktu_tunggu, rep(NA, max_len - length(result_3$waktu_tunggu)))
)
# Plot
plot(df_plot$Nasabah, df_plot$Teller2, type = "l", col = "blue",
xlab = "Urutan Nasabah", ylab = "Waktu Tunggu (menit)",
main = "Panjang Antrian Sepanjang Hari (2 vs 3 Teller)",
ylim = range(c(df_plot$Teller2, df_plot$Teller3), na.rm = TRUE))
lines(df_plot$Nasabah, df_plot$Teller3, col = "red")
legend("topright", legend = c("2 Teller", "3 Teller"),
col = c("blue", "red"), lty = 1)
grid()
Simulasi telah dijalankan selama 20 hari kerja pada dua skenario: menggunakan 2 teller dan 3 teller. Data waktu tunggu nasabah dan waktu sibuk teller dikumpulkan sebagai dasar analisis lebih lanjut.
Pada simulasi 2 teller, persen waktu sibuk masing-masing teller adalah 32.83% dan 32.91%. Sementara pada simulasi 3 teller, masing-masing teller sibuk sekitar 23.78%, 22.98%, dan 23.46%. Artinya, dengan 3 teller beban kerja per teller menjadi lebih ringan karena tugas terbagi lebih merata.
Penambahan 1 teller (dari 2 menjadi 3 teller) terbukti lebih efisien: - Rata-rata waktu tunggu nasabah turun dari sekitar 1177,4 menit (2 teller) menjadi 943,99 menit (3 teller). - Persen waktu sibuk per teller turun dari sekitar 32,8% pada 2 teller menjadi sekitar 23% pada 3 teller. - Artinya, beban kerja teller lebih merata dan antrian dapat dilayani lebih cepat.
Namun, meskipun waktu tunggu menurun, ada indikasi bahwa penambahan teller juga membuat penggunaan tenaga kerja sedikit kurang optimal (lebih banyak idle time). Hal ini perlu dipertimbangkan untuk efisiensi biaya, apakah 3 teller benar-benar diperlukan sepanjang waktu atau hanya pada jam sibuk.
Plot menunjukkan: - 2 teller (garis biru) memiliki waktu tunggu yang cenderung naik tajam, dengan pola menumpuk yang menunjukkan banyak nasabah menunggu lebih lama. - 3 teller (garis merah) menunjukkan waktu tunggu yang lebih rendah dengan pola kenaikan yang lebih landai, artinya sistem mampu mengurai antrian lebih baik. - Grafik line chart ini memperlihatkan bahwa penambahan teller berhasil menurunkan panjang antrian dan waktu tunggu nasabah secara signifikan.
Secara keseluruhan, visualisasi memperkuat hasil bahwa penambahan teller berdampak positif pada pengurangan panjang antrian dan waktu tunggu.
Bu Sari memiliki toko kelontong yang menjual beras dengan kondisi sebagai berikut:
Kerjakanlah tugas berikut:
set.seed(777)
# Fungsi simulasi stok beras
simulasi_stok <- function(hari, pesan = 50, frekuensi = 5, stok_awal = 100) {
stok_harian <- numeric(hari)
stok <- stok_awal
habis <- 0
for (h in 1:hari) {
penjualan <- sample(8:15, 1)
if (stok >= penjualan) {
stok <- stok - penjualan
} else {
habis <- habis + (penjualan - stok)
stok <- 0
}
if (h %% frekuensi == 0) {
stok <- stok + pesan
}
stok_harian[h] <- stok
}
list(stok_harian = stok_harian, habis = habis)
}
# (a) Simulasikan stok beras selama 60 hari
result_a <- simulasi_stok(60, pesan = 50, frekuensi = 5, stok_awal = 100)
print(result_a$stok_harian)
## [1] 85 77 68 57 94 81 71 60 51 90 82 74 59 48 87 78 64 51 39 78 64 50 35 21 58
## [26] 49 36 27 13 51 38 23 8 0 50 42 31 23 9 50 41 28 13 2 50 42 32 22 11 50
## [51] 41 32 24 9 50 42 28 16 1 50
# (b) Hitung berapa kali toko kehabisan stok
cat("Jumlah karung kehilangan untung:", result_a$habis, "\n")
## Jumlah karung kehilangan untung: 36
# (c) Coba strategi pesan 40, 50, 60 karung
result_40 <- simulasi_stok(60, pesan = 40, frekuensi = 5)
result_50 <- simulasi_stok(60, pesan = 50, frekuensi = 5)
result_60 <- simulasi_stok(60, pesan = 60, frekuensi = 5)
cat("Kehabisan stok pesan 40 karung:", result_40$habis, "\n")
## Kehabisan stok pesan 40 karung: 153
cat("Kehabisan stok pesan 50 karung:", result_50$habis, "\n")
## Kehabisan stok pesan 50 karung: 48
cat("Kehabisan stok pesan 60 karung:", result_60$habis, "\n")
## Kehabisan stok pesan 60 karung: 0
# (d) Coba frekuensi pesan 3, 5, 7 hari
result_3hari <- simulasi_stok(60, pesan = 50, frekuensi = 3)
result_5hari <- simulasi_stok(60, pesan = 50, frekuensi = 5)
result_7hari <- simulasi_stok(60, pesan = 50, frekuensi = 7)
cat("Kehabisan stok pesan tiap 3 hari:", result_3hari$habis, "\n")
## Kehabisan stok pesan tiap 3 hari: 0
cat("Kehabisan stok pesan tiap 5 hari:", result_5hari$habis, "\n")
## Kehabisan stok pesan tiap 5 hari: 56
cat("Kehabisan stok pesan tiap 7 hari:", result_7hari$habis, "\n")
## Kehabisan stok pesan tiap 7 hari: 179
# (e) Buat grafik pergerakan stok
plot(result_a$stok_harian, type = "l", col = "blue", lwd = 2,
xlab = "Hari", ylab = "Stok Beras", main = "Pergerakan Stok Beras 60 Hari")
Dari hasil simulasi, stok beras mengalami fluktuasi seiring hari berjalan. Pada beberapa hari, stok menurun drastis hingga habis. Total kehilangan keuntungan akibat kehabisan stok selama 60 hari adalah sebanyak 36 karung. Ini menunjukkan bahwa strategi awal (stok awal 100, pesan ulang 50 karung tiap 5 hari) belum sepenuhnya optimal untuk menghindari kekurangan stok.
Hasil simulasi menunjukkan bahwa kehilangan keuntungan terjadi sebanyak 36 karung selama 60 hari. Artinya, toko mengalami kekurangan stok pada sejumlah hari dan kehilangan peluang penjualan, yang tentu dapat berdampak pada kepuasan pelanggan.
Dari simulasi: - Pesan 40 karung: kehilangan 153 karung. - Pesan 50 karung: kehilangan 48 karung. - Pesan 60 karung: kehilangan 0 karung.
Ini memperlihatkan bahwa semakin banyak karung yang dipesan tiap siklus, maka risiko kehabisan stok menurun. Memesan 60 karung terbukti menghilangkan risiko kehabisan stok, meskipun mungkin ada risiko overstock jika permintaan tidak setinggi itu.
Dari simulasi: - Pesan tiap 3 hari: kehilangan 0 karung. - Pesan tiap 5 hari: kehilangan 56 karung. - Pesan tiap 7 hari: kehilangan 179 karung.
Hasil ini menunjukkan bahwa semakin sering melakukan pemesanan (frekuensi lebih tinggi), semakin kecil peluang kehabisan stok. Pemesanan setiap 3 hari adalah yang paling aman untuk menjaga ketersediaan stok, tetapi tentu perlu dipertimbangkan biaya pemesanan lebih sering.
Grafik menunjukkan pola pergerakan stok beras selama 60 hari: - Terlihat adanya pola naik-turun yang konsisten setiap beberapa hari, mencerminkan siklus pengeluaran stok akibat penjualan dan penambahan stok karena pemesanan ulang. - Saat mendekati hari pemesanan ulang, stok beras cenderung turun mendekati nol atau bahkan habis, sehingga terjadi risiko kehilangan keuntungan. - Puncak-puncak grafik memperlihatkan saat stok baru saja ditambah dari pemesanan ulang. - Visualisasi ini membantu Bu Sari memahami kapan stok mulai menipis dan kapan waktu pemesanan sebaiknya dilakukan agar stok tetap aman dan risiko kehilangan keuntungan dapat ditekan.
Rekomendasi: - Strategi pemesanan dan jumlah pesanan sebaiknya dioptimalkan untuk menjaga stok tetap stabil, menghindari kehabisan, dan memaksimalkan keuntungan.