library(simmer)
## Warning: package 'simmer' was built under R version 4.4.3
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:simmer':
##
## select
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
Jawaban No. 1
set.seed(123)
X <- runif(10000, min = 0, max = 1)
# Estimasi E[X^2] = rata-rata dari X^2
E_X2 <- mean(X^2)
cat("Estimasi E[X^2] dari 10.000 data uniform:", E_X2)
## Estimasi E[X^2] dari 10.000 data uniform: 0.3297405
Jawaban No. 2
set.seed(123)
# Fungsi bantu untuk perhitungan dan visualisasi
analisis_normal <- function(n, warna = "skyblue") {
data <- rnorm(n, mean = 100, sd = 15)
rata2 <- mean(data)
simp_baku <- sd(data)
cat("Ukuran n =", n, "\n")
cat(" Rata-rata:", round(rata2, 2), "\n")
cat(" Simpangan baku:", round(simp_baku, 2), "\n\n")
hist(data, main = paste("Histogram N(100, 15^2), n =", n),
xlab = "Nilai", col = warna, breaks = 30, border = "white")
}
# Jalankan untuk masing-masing n
analisis_normal(100)
## Ukuran n = 100
## Rata-rata: 101.36
## Simpangan baku: 13.69
analisis_normal(1000)
## Ukuran n = 1000
## Rata-rata: 100.29
## Simpangan baku: 15.07
analisis_normal(10000)
## Ukuran n = 10000
## Rata-rata: 99.96
## Simpangan baku: 14.98
Interpretasi:
Simulasi dilakukan untuk data acak dari distribusi normal dengan rata-rata \(\mu = 100\) dan simpangan baku \(\sigma = 15\), dengan tiga ukuran sampel berbeda:
1. Ukuran sampel n = 100
Analisis:
2. Ukuran sampel n = 1000
Analisis:
3. Ukuran sampel n = 10.000
Analisis:
Kesimpulan
Jawaban No. 3
set.seed(123) # untuk hasil yang reprodusibel
# Simulasi 5000 data dari distribusi Binomial(n = 30, p = 0.25)
data_binomial <- rbinom(n = 5000, size = 30, prob = 0.25)
# Estimasi peluang P(X ≥ 15)
estimasi_probabilitas <- mean(data_binomial >= 15)
# Tampilkan hasil
cat("Estimasi P(X ≥ 15):", estimasi_probabilitas)
## Estimasi P(X ≥ 15): 0.0024
Jawaban No. 4
s_custom <- function(x) {
n <- length(x)
sqrt((sum(x^2) - (sum(x)^2 / n)) / (n - 1))
}
set.seed(123)
data_norm <- rnorm(1000, mean = 89, sd = 10)
s_custom(data_norm)
## [1] 9.91695
Jawaban No. 5
simulasi_bank <- function(jumlah_teller = 2) {
set.seed(123)
env <- simmer("Bank")
traj <- trajectory("traj_nasabah") %>%
seize("teller", 1) %>%
timeout(function() rexp(1, 1/8)) %>%
release("teller", 1)
env %>%
add_resource("teller", capacity = jumlah_teller) %>%
add_generator("nasabah", traj, function() rexp(1, 1/5)) # antar-kedatangan 12 menit
# Simulasi selama 20 hari kerja, 6 jam per hari = 7200 menit total
env %>% run(until = 20 * 6 * 60)
return(env)
}
(a) Simulasi antrian selama 20 hari kerja
bank_2teller <- simulasi_bank(jumlah_teller = 2)
(b) Lama rata-rata waktu tunggu nasabah
monitor_data <- get_mon_arrivals(bank_2teller)
waktu_tunggu <- monitor_data$end_time - monitor_data$start_time - monitor_data$activity_time
mean_wait <- mean(waktu_tunggu)
cat("Rata-rata waktu tunggu nasabah (menit):", round(mean_wait, 2))
## Rata-rata waktu tunggu nasabah (menit): 11.44
Setelah dilakukan simulasi dengan menambahkan satu teller tambahan (sehingga total menjadi tiga teller), diperoleh bahwa rata-rata waktu tunggu nasabah menurun drastis dari sebelumnya 11,44 menit (dengan dua teller) menjadi hanya 1,4 menit. Penurunan ini menunjukkan bahwa sistem antrian menjadi jauh lebih efisien setelah penambahan teller. Waktu tunggu yang lebih singkat berarti pelayanan menjadi lebih cepat, nasabah tidak perlu menunggu lama, dan risiko penumpukan antrian berkurang secara signifikan. Oleh karena itu, penambahan satu teller terbukti mampu meningkatkan efisiensi pelayanan secara substansial.
(c) Persentase waktu teller sibuk
resource_data <- get_mon_resources(bank_2teller)
# Ambil waktu total pelayanan (server busy)
total_busy_time <- sum(resource_data$server) # dalam satuan menit
# Hitung total waktu semua teller tersedia: 20 hari × 6 jam × 60 menit × 2 teller
total_available_time <- 20 * 6 * 60 * 2
# Hitung persentase waktu sibuk
persentase_sibuk <- total_busy_time / total_available_time * 100
cat("Persentase waktu teller sibuk:", round(persentase_sibuk, 2), "%")
## Persentase waktu teller sibuk: 34.08 %
(d) Rata-rata tunggu (3 teller)
bank_3teller <- simulasi_bank(jumlah_teller = 3)
monitor_3 <- get_mon_arrivals(bank_3teller)
wait_3 <- monitor_3$end_time - monitor_3$start_time - monitor_3$activity_time
mean_wait_3 <- mean(wait_3)
cat("Rata-rata tunggu (3 teller):", round(mean_wait_3, 2), "\n")
## Rata-rata tunggu (3 teller): 1.4
(e) Panjang antrian sepanjang hari kerja
# Ambil data antrian dari hasil simulasi
queue_data <- get_mon_resources(bank_2teller) %>%
filter(resource == "teller") %>%
select(time, queue)
# Tambahkan kolom hari ke berapa dan menit ke berapa dalam hari tsb
queue_data <- queue_data %>%
mutate(
hari = floor(time / 360) + 1, # 1 sampai 20
waktu_dalam_hari = time %% 360 # 0 sampai 359 menit
)
# Plot panjang antrian sepanjang hari kerja (semua hari ditampilkan)
ggplot(queue_data, aes(x = waktu_dalam_hari, y = queue, group = hari, color = as.factor(hari))) +
geom_line(alpha = 0.6) +
labs(
title = "Panjang Antrian Teller Sepanjang Hari (20 Hari Kerja)",
x = "Waktu (menit, dalam 1 hari kerja)", y = "Jumlah Nasabah dalam Antrian",
color = "Hari ke-"
) +
theme_minimal()
Jawaban No. 6
(a) Simulasi stok selama 60 hari
set.seed(123)
simulasi_stok <- function(pesan_ulang = 50, frekuensi = 5, hari_total = 60) {
stok <- numeric(hari_total)
stok[1] <- 100 # stok awal
rugi <- 0
habis_hari <- 0
for (hari in 2:hari_total) {
penjualan <- round(runif(1, min = 8, max = 15))
# Update stok
sisa_stok <- stok[hari - 1] - penjualan
if (sisa_stok < 0) {
rugi <- rugi + abs(sisa_stok) * 50000
habis_hari <- habis_hari + 1
sisa_stok <- 0
}
# Tambah stok jika saatnya pesan ulang
if ((hari - 1) %% frekuensi == 0) {
sisa_stok <- sisa_stok + pesan_ulang
}
stok[hari] <- sisa_stok
}
return(list(stok = stok, rugi = rugi, habis_hari = habis_hari))
}
# Simulasi dasar untuk (a)
hasil_a <- simulasi_stok()
(b) Jumlah hari kehabisan stok
cat("Jumlah hari kehabisan stok:", hasil_a$habis_hari, "\n")
## Jumlah hari kehabisan stok: 8
cat("Total kerugian karena kehabisan stok: Rp", format(hasil_a$rugi, big.mark = ","), "\n")
## Total kerugian karena kehabisan stok: Rp 1,900,000
Selama periode simulasi 60 hari, toko kelontong Bu Sari mengalami kehabisan stok beras sebanyak 8 hari. Akibat dari kekosongan ini, estimasi total kerugian yang dialami mencapai Rp1.900.000, dihitung berdasarkan hilangnya potensi keuntungan sebesar Rp50.000 untuk setiap karung yang tidak dapat dijual.
(c) Strategi jumlah pemesanan: 40, 50, dan 60 karung
opsi_pesan <- c(40, 50, 60)
strategi_c <- sapply(opsi_pesan, function(qty) {
hasil <- simulasi_stok(pesan_ulang = qty)
return(c(qty, hasil$habis_hari, hasil$rugi))
})
colnames(strategi_c) <- c("Pesan 40", "Pesan 50", "Pesan 60")
rownames(strategi_c) <- c("Jumlah Pesan", "Hari Kehabisan", "Total Rugi")
strategi_c
## Pesan 40 Pesan 50 Pesan 60
## Jumlah Pesan 40 50 60
## Hari Kehabisan 17 5 0
## Total Rugi 7300000 1150000 0
Simulasi dilakukan dengan tiga skenario jumlah pemesanan beras setiap 5 hari, yaitu 40, 50, dan 60 karung. Hasilnya menunjukkan bahwa:
Dengan demikian, strategi pemesanan 60 karung setiap 5 hari adalah yang paling aman dalam mencegah kerugian akibat kekosongan stok, meskipun berpotensi menimbulkan kelebihan stok jika permintaan rendah.
(d)Strategi frekuensi pemesanan: setiap 3, 5, dan 7 hari
opsi_freq <- c(3, 5, 7)
strategi_d <- sapply(opsi_freq, function(freq) {
hasil <- simulasi_stok(frekuensi = freq)
return(c(freq, hasil$habis_hari, hasil$rugi))
})
colnames(strategi_d) <- c("Setiap 3 Hari", "Setiap 5 Hari", "Setiap 7 Hari")
rownames(strategi_d) <- c("Frekuensi", "Hari Kehabisan", "Total Rugi")
strategi_d
## Setiap 3 Hari Setiap 5 Hari Setiap 7 Hari
## Frekuensi 3 5 7
## Hari Kehabisan 0 4 19
## Total Rugi 0 1500000 9600000
Simulasi juga dilakukan untuk mengevaluasi dampak perubahan frekuensi pemesanan beras, dengan tetap memesan 50 karung per siklus:
Berdasarkan hasil tersebut, semakin sering Bu Sari melakukan pemesanan, maka risiko kehabisan stok semakin kecil. Namun, pemesanan terlalu sering (misalnya setiap 3 hari) mungkin kurang efisien secara logistik, sementara pemesanan terlalu jarang (7 hari) jelas menyebabkan kerugian besar. Strategi pemesan setiap 3 atau 5 hari adalah yang paling optimal dalam menjaga ketersediaan stok dan mengurangi kerugian.
(e) Grafik Pergerakan Stok dan Rekomendasi untuk Bu Sari
stok_df <- data.frame(
Hari = 1:60,
Stok = hasil_a$stok
)
ggplot(stok_df, aes(x = Hari, y = Stok)) +
geom_line(color = "darkred", size = 1) +
geom_hline(yintercept = 0, linetype = "dashed", color = "gray") +
labs(
title = "Pergerakan Stok Beras Toko Bu Sari Selama 60 Hari",
x = "Hari",
y = "Stok Beras (karung)"
) +
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Grafik di atas menunjukkan fluktuasi stok beras di toko Bu Sari selama periode 60 hari. Terlihat pola siklus naik-turun yang cukup tajam setiap 5 hari, sesuai dengan frekuensi pemesanan ulang. Penurunan stok yang signifikan hingga mendekati nol menunjukkan bahwa toko sering berada dalam kondisi hampir kehabisan stok, bahkan benar-benar habis pada beberapa titik (ditunjukkan oleh grafik yang menyentuh garis nol).
Hal ini mengindikasikan bahwa strategi saat ini—memesan ulang 50 karung setiap 5 hari—belum sepenuhnya optimal, karena masih terjadi kehabisan stok selama 8 hari dan menyebabkan kerugian sebesar Rp1.900.000. Berdasarkan simulasi dan hasil grafik:
Rekomendasi
Strategi paling efisien adalah dengan meningkatkan jumlah pesanan menjadi 60 karung, karena dapat menghilangkan hari kehabisan stok dan menghindari seluruh kerugian.
Alternatif lainnya adalah meningkatkan frekuensi pemesanan menjadi setiap 3 hari, yang juga berhasil menghilangkan kekosongan stok, meskipun kemungkinan membutuhkan usaha lebih besar dalam hal logistik.
Oleh karena itu, Bu Sari disarankan untuk memilih antara memperbesar jumlah pesanan atau mempercepat frekuensi pemesanan, dengan mempertimbangkan kemudahan operasional dan biaya tambahan yang mungkin timbul dari masing-masing strategi.