set.seed(123)
n <- 10000
X <- runif(n, min = 0, max = 1)
E_X2_est <- mean(X^2) # Rata-rata X^2
cat("Estimasi E[X^2] untuk U(0,1):", E_X2_est, "\n")
## Estimasi E[X^2] untuk U(0,1): 0.3297405
set.seed(123)
n_vec <- c(100, 1000, 10000)
par(mfrow = c(1, 3)) # tampilkan histogram berdampingan
for (n in n_vec) {
data <- rnorm(n, mean = 100, sd = 15)
cat("\nn =", n, "\nMean:", mean(data), "SD:", sd(data), "\n")
hist(data, main = paste("Histogram n =", n), xlab = "Data")
}
##
## n = 100
## Mean: 101.3561 SD: 13.69224
##
## n = 1000
## Mean: 100.2862 SD: 15.06891
##
## n = 10000
## Mean: 99.96336 SD: 14.98314
par(mfrow = c(1,1))
Hasil dari analisis menunjukkan bahwa semakin banyak jumlah sampel yang diambil, nilai rata-rata dan standar deviasi sampel akan semakin dekat dengan parameter populasi (mean = 100 dan SD = 15). Pada ukuran n = 100, nilai estimasi rata-rata dan simpangan baku masih menunjukkan variasi yang lebih besar, namun saat ukuran data meningkat menjadi 1. 000 dan 10. 000, hasil yang diperoleh menjadi lebih konsisten dan tepat. Selain itu, bentuk histogram untuk semua ukuran sampel cenderung mendekati pola distribusi normal, dan seiring penambahan jumlah data, distribusi tersebut tampak semakin simetris dan halus. Dengan demikian, simulasi ini menunjukkan bahwa ukuran sampel yang lebih besar menghasilkan estimasi parameter populasi yang lebih terpercaya serta distribusi data yang semakin cocok dengan karakteristik dari distribusi normal.
set.seed(123)
binom_data <- rbinom(5000, size = 30, prob = 0.25)
prob_est <- mean(binom_data >= 15)
cat("Estimasi P(X ≥ 15):", prob_est, "\n")
## Estimasi P(X ≥ 15): 0.0024
s_function <- function(x) {
n <- length(x)
s <- sqrt((sum(x^2) - (sum(x)^2)/n) / (n-1))
return(s)
}
# Test
set.seed(123)
normal_data <- rnorm(1000, mean = 89, sd = 10)
s_est <- s_function(normal_data)
cat("Estimasi s dari data N(89,10):", s_est, "\n")
## Estimasi s dari data N(89,10): 9.91695
# a. DAN B.
set.seed(123)
# Parameter
jam_per_hari <- 6
menit_per_jam <- 60
total_hari <- 20
total_menit <- jam_per_hari * menit_per_jam * total_hari
lambd <- 5 / 60
rata_pelayanan <- 8
jumlah_teller <- 2
waktu_kedatangan <- c()
waktu <- 0
while (waktu < total_menit) {
antar <- rexp(1, rate = lambd)
waktu <- waktu + antar
if (waktu < total_menit) {
waktu_kedatangan <- c(waktu_kedatangan, waktu)
}
}
# Simulasi pelayanan
selesai_teller <- rep(0, jumlah_teller)
waktu_tunggu <- numeric(length(waktu_kedatangan))
for (i in seq_along(waktu_kedatangan)) {
idx <- which.min(selesai_teller)
mulai <- max(waktu_kedatangan[i], selesai_teller[idx])
durasi <- rexp(1, rate = 1/rata_pelayanan)
selesai_teller[idx] <- mulai + durasi
waktu_tunggu[i] <- mulai - waktu_kedatangan[i]
}
cat("Jumlah nasabah:", length(waktu_kedatangan), "\n")
## Jumlah nasabah: 601
cat("Rata-rata waktu tunggu:", round(mean(waktu_tunggu), 2), "menit\n")
## Rata-rata waktu tunggu: 1.08 menit
# c. Persen waktu teller sibuk bekerja
total_waktu_kerja <- total_menit
selesai_teller <- rep(0, jumlah_teller)
waktu_sibuk <- rep(0, jumlah_teller)
for (waktu in waktu_kedatangan) {
idx <- which.min(selesai_teller)
mulai <- max(waktu, selesai_teller[idx])
durasi <- rexp(1, rate = 1/rata_pelayanan)
selesai_teller[idx] <- mulai + durasi
waktu_sibuk[idx] <- waktu_sibuk[idx] + durasi
}
persen_sibuk <- waktu_sibuk / total_waktu_kerja * 100
persen_sibuk
## [1] 34.20985 32.91613
# d. Bandingkan jika bank menambah 1 teller lagi
set.seed(123)
total_menit <- 20 * 6 * 60
jumlah_teller <- 3
lambd <- 5 / 60
rata_pelayanan <- 8
waktu <- 0
waktu_kedatangan <- c()
while (waktu < total_menit) {
waktu <- waktu + rexp(1, rate = lambd)
if (waktu < total_menit) waktu_kedatangan <- c(waktu_kedatangan, waktu)
}
selesai <- rep(0, jumlah_teller)
sibuk <- rep(0, jumlah_teller)
tunggu <- numeric(length(waktu_kedatangan))
for (i in seq_along(waktu_kedatangan)) {
idx <- which.min(selesai)
mulai <- max(waktu_kedatangan[i], selesai[idx])
durasi <- rexp(1, 1/rata_pelayanan)
selesai[idx] <- mulai + durasi
sibuk[idx] <- sibuk[idx] + durasi
tunggu[i] <- mulai - waktu_kedatangan[i]
}
cat("Rata-rata tunggu:", round(mean(tunggu),2), "menit\n")
## Rata-rata tunggu: 0.15 menit
cat("Persen sibuk teller:\n")
## Persen sibuk teller:
print(round(sibuk / total_menit * 100, 2))
## [1] 24.21 22.83 22.35
# e. Grafik yang menunjukkan panjang antrian sepanjang hari
set.seed(1)
# Parameter
total_hari <- 20
jumlah_teller <- 2
total_menit <- total_hari * 6 * 60
lambd <- 5 / 60
rata_pelayanan <- 8
waktu <- 0
waktu_kedatangan <- c()
while (waktu < total_menit) {
waktu <- waktu + rexp(1, lambd)
if (waktu < total_menit) waktu_kedatangan <- c(waktu_kedatangan, waktu)
}
selesai <- rep(0, jumlah_teller)
panjang_antrian <- rep(0, total_hari)
for (i in seq_along(waktu_kedatangan)) {
waktu <- waktu_kedatangan[i]
hari <- ceiling(waktu / (6 * 60))
idx <- which.min(selesai)
mulai <- max(waktu, selesai[idx])
durasi <- rexp(1, 1/rata_pelayanan)
selesai[idx] <- mulai + durasi
antrian <- sum(selesai > waktu)
panjang_antrian[hari] <- panjang_antrian[hari] + antrian
}
plot(1:total_hari, panjang_antrian, type = "o", pch = 16, col = "red",
xlab = "Hari ke-", ylab = "Total Panjang Antrian",
main = "Grafik Panjang Antrian per Hari")
## NO. 6
#a. Simulasi stok beras selama 60 hari
set.seed(1)
hari <- 60
stok <- numeric(hari)
stok[1] <- 100
penjualan <- sample(8:15, hari, replace = TRUE)
pesan_setiap <- 5
jumlah_pesan <- 50
kehabisan <- 0
stok_habis <- numeric(hari)
for (i in 2:hari) {
stok[i] <- stok[i - 1] - penjualan[i - 1]
if (stok[i] < 0) {
stok_habis[i] <- abs(stok[i])
stok[i] <- 0
kehabisan <- kehabisan + 1
}
if (i %% pesan_setiap == 0) {
stok[i] <- stok[i] + jumlah_pesan
}
}
#b. Berapa kali toko kehabisan stok
cat("Toko kehabisan stok sebanyak", kehabisan, "hari.\n")
## Toko kehabisan stok sebanyak 0 hari.
#c. Pesan 40, 50, 60 karung. Mana yang terbaik
simulasi_jumlah_pesan <- function(jumlah_pesan) {
stok <- numeric(hari)
stok[1] <- 100
kehabisan <- 0
for (i in 2:hari) {
stok[i] <- stok[i - 1] - penjualan[i - 1]
if (stok[i] < 0) {
stok[i] <- 0
kehabisan <- kehabisan + 1
}
if (i %% 5 == 0) {
stok[i] <- stok[i] + jumlah_pesan
}
}
return(kehabisan)
}
strategi <- c(40, 50, 60)
hasil <- sapply(strategi, simulasi_jumlah_pesan)
names(hasil) <- paste0("Pesan ", strategi)
hasil
## Pesan 40 Pesan 50 Pesan 60
## 14 0 0
#d. Frekuensi pesan setiap 3, 5, 7 hari. Mana yang optimal?
simulasi_frekuensi_pesan <- function(freq) {
stok <- numeric(hari)
stok[1] <- 100
kehabisan <- 0
for (i in 2:hari) {
stok[i] <- stok[i - 1] - penjualan[i - 1]
if (stok[i] < 0) {
stok[i] <- 0
kehabisan <- kehabisan + 1
}
if (i %% freq == 0) {
stok[i] <- stok[i] + 50
}
}
return(kehabisan)
}
frekuensi <- c(3, 5, 7)
hasil_frek <- sapply(frekuensi, simulasi_frekuensi_pesan)
names(hasil_frek) <- paste0("Tiap ", frekuensi, " hari")
hasil_frek
## Tiap 3 hari Tiap 5 hari Tiap 7 hari
## 0 0 18
#e. Grafik pergerakan stok dan rekomendasi untuk Bu Sari
plot(stok, type = "o", pch = 16, col = "blue", lwd = 2,
xlab = "Hari ke-", ylab = "Stok Beras (karung)",
main = "Grafik Stok Harian Bu Sari")
abline(h = 0, col = "red", lty = 2)
Berdasarkan hasil simulasi selama 60 hari, strategi pemesanan 50 karung
setiap 5 hari terbukti efektif karena mampu menjaga ketersediaan stok
tanpa terjadi kehabisan. Strategi ini aman, efisien, dan mudah
diterapkan. Bu Sari disarankan tetap menggunakan pola ini, namun tetap
memantau penjualan harian dan kesiapan gudang agar strategi tetap
optimal di masa mendatang.