set.seed(123)
x <- runif(10000, min = 0, max = 1)
Ex2 <- mean(x^2)
cat("Estimasi E[X^2] =", Ex2)
## Estimasi E[X^2] = 0.3297405
Pembahasan: Hasil analisis simulasi dengan 10.000 angka acak dan U(0,1) didapatkan hasill mendekati 1/3 atau 0.3297405. dapat disimpulkan bahwa simulasi ini efektif untuk pendekatan nilai harapan.
set.seed(123) # Agar hasil replikasi konsisten
# Buat vektor ukuran sampel
n_values <- c(100, 1000, 10000)
# Fungsi untuk simulasi dan analisis
simulasi_normal <- function(n) {
data <- rnorm(n, mean = 100, sd = 15)
# Statistik deskriptif
rata2 <- mean(data)
sdnya <- sd(data)
# Tampilkan hasil
cat("Ukuran Sampel:", n, "\n")
cat("Rata-rata:", round(rata2, 2), "\n")
cat("Simpangan Baku:", round(sdnya, 2), "\n\n")
# Plot histogram
hist(data,
main = paste("Histogram N =", n),
xlab = "Nilai",
col = "skyblue",
border = "white")
}
# Jalankan simulasi untuk setiap ukuran n
for (n in n_values) {
simulasi_normal(n)
}
## Ukuran Sampel: 100
## Rata-rata: 101.36
## Simpangan Baku: 13.69
## Ukuran Sampel: 1000
## Rata-rata: 100.29
## Simpangan Baku: 15.07
## Ukuran Sampel: 10000
## Rata-rata: 99.96
## Simpangan Baku: 14.98
Pembahasan:Semakin besar ukuran sampel (n), rata-rata dan
simpangan baku hasil simulasi semakin mendekati nilai teoritis (100 dan
15).Histogram menjadi lebih halus dan menyerupai bentuk distribusi
normal ketika n besar.
set.seed(123)
sim_binom <- rbinom(5000, size = 30, prob = 0.25)
mean(sim_binom >= 15)
## [1] 0.0024
Pembahasan: Simulasi menghasilkan hasil estimasi 0.0024 mendekati nilai sekitar distribusi binomial. digunakan untuk memperkirakan peluang kejadian tertentu dalam distribusi diskrit.
# Fungsi untuk menghitung simpangan baku
custom_sd <- function(x) {
n <- length(x)
sqrt((sum(x^2) - (sum(x)^2 / n)) / (n - 1))
}
# Simulasi data normal
set.seed(123)
data <- rnorm(1000, mean = 89, sd = 10)
# Hitung s menggunakan fungsi custom
s_custom <- custom_sd(data)
s_builtin <- sd(data)
cat("s (fungsi custom) =", s_custom, "\n")
## s (fungsi custom) = 9.91695
cat("s (fungsi bawaan R) =", s_builtin, "\n")
## s (fungsi bawaan R) = 9.91695
Pembahasan:Hasil mendekati(sama) parameter populasi dapat disimpulkan bahwa sampel cukup representatif dan menunjukan fungsi bekerja benar.
λ = 5 per jam μ = 8 menit → 0.1333 jam Teller = 2 Orang Jam Oprasional = 6 Jam/hari
set.seed(123)
lambda <- 5 # rata-rata kedatangan/jam
mu <- 1 / 0.1333 # laju pelayanan per jam
jam_per_hari <- 6
hari_kerja <- 20
waktu_total <- jam_per_hari * hari_kerja # 120 jam
n_teller <- 2
# Simulasi waktu antar kedatangan
inter_arrival <- rexp(5000, rate = lambda)
arrival_time <- cumsum(inter_arrival)
arrival_time <- arrival_time[arrival_time <= waktu_total]
# Simulasi waktu pelayanan
service_time <- rexp(length(arrival_time), rate = mu)
# Proses antrian dan pelayanan
end_time <- rep(0, n_teller)
start_service <- numeric(length(arrival_time))
finish_service <- numeric(length(arrival_time))
waiting_time <- numeric(length(arrival_time))
for (i in seq_along(arrival_time)) {
teller <- which.min(end_time)
start_service[i] <- max(arrival_time[i], end_time[teller])
finish_service[i] <- start_service[i] + service_time[i]
waiting_time[i] <- start_service[i] - arrival_time[i]
end_time[teller] <- finish_service[i]
}
total_waktu_teller <- waktu_total * n_teller
total_pelayanan <- sum(service_time)
utilisasi <- total_pelayanan / total_waktu_teller * 100
cat("Persentase waktu teller sibuk:", round(utilisasi, 2), "%\n")
## Persentase waktu teller sibuk: 32.61 %
Penjelasan: Teller hanya sibuk sekitar 1/3 waktu,menunjukkan bahwa kapasitas teller masih cukup longgar dan sistem belum padat.
# Ganti jumlah teller
n_teller <- 3
end_time <- rep(0, n_teller)
# Ulangi loop pelayanan
for (i in seq_along(arrival_time)) {
teller <- which.min(end_time)
start_service[i] <- max(arrival_time[i], end_time[teller])
finish_service[i] <- start_service[i] + service_time[i]
waiting_time[i] <- start_service[i] - arrival_time[i]
end_time[teller] <- finish_service[i]
}
rata_tunggu_3 <- mean(waiting_time)
utilisasi_3 <- sum(service_time) / (waktu_total * n_teller) * 100
cat("Rata-rata tunggu (3 teller):", round(rata_tunggu_3, 3), "jam\n")
## Rata-rata tunggu (3 teller): 0.002 jam
cat("Utilisasi teller (3 teller):", round(utilisasi_3, 2), "%\n")
## Utilisasi teller (3 teller): 21.74 %
Penjelasan: Menambah teller memang mempercepat layanan, tetapi dengan penurunan efisiensi signifikan karena banyak waktu teller tidak terpakai. Jadi, tidak efisien secara biaya operasional jika jumlah nasabah tidak meningkat drastis.
set.seed(123)
hari <- 60
stok <- numeric(hari)
stok[1] <- 100
penjualan <- sample(8:15, hari, replace = TRUE)
pesanan <- rep(0, hari)
rugi <- 0
kehabisan <- 0
for (i in 2:hari) {
# Penjualan dan kehabisan
stok[i] <- stok[i - 1] - penjualan[i - 1]
if (stok[i] < 0) {
rugi <- rugi + abs(stok[i]) * 50000
kehabisan <- kehabisan + 1
stok[i] <- 0
}
# Pemesanan ulang setiap 5 hari
if (i %% 5 == 0) {
stok[i] <- stok[i] + 50
pesanan[i] <- 50
}
}
cat("Jumlah hari kehabisan stok:", kehabisan, "\n")
## Jumlah hari kehabisan stok: 2
simulasi_strategi <- function(jml_pesan) {
stok <- numeric(hari)
stok[1] <- 100
rugi <- 0
kehabisan <- 0
for (i in 2:hari) {
stok[i] <- stok[i - 1] - penjualan[i - 1]
if (stok[i] < 0) {
rugi <- rugi + abs(stok[i]) * 50000
kehabisan <- kehabisan + 1
stok[i] <- 0
}
if (i %% 5 == 0) {
stok[i] <- stok[i] + jml_pesan
}
}
return(data.frame(pesan = jml_pesan, rugi = rugi, kehabisan = kehabisan))
}
strategi_df <- do.call(rbind, lapply(c(40, 50, 60), simulasi_strategi))
print(strategi_df)
## pesan rugi kehabisan
## 1 40 5800000 12
## 2 50 300000 2
## 3 60 0 0
simulasi_frekuensi <- function(freq) {
stok <- numeric(hari)
stok[1] <- 100
rugi <- 0
kehabisan <- 0
for (i in 2:hari) {
stok[i] <- stok[i - 1] - penjualan[i - 1]
if (stok[i] < 0) {
rugi <- rugi + abs(stok[i]) * 50000
kehabisan <- kehabisan + 1
stok[i] <- 0
}
if (i %% freq == 0) {
stok[i] <- stok[i] + 50
}
}
return(data.frame(frekuensi = freq, rugi = rugi, kehabisan = kehabisan))
}
frekuensi_df <- do.call(rbind, lapply(c(3, 5, 7), simulasi_frekuensi))
print(frekuensi_df)
## frekuensi rugi kehabisan
## 1 3 0 0
## 2 5 300000 2
## 3 7 8050000 18
plot(stok, type = "l", lwd = 2, col = "blue",
ylab = "Jumlah Stok", xlab = "Hari ke-60 hari kedepan",
main = "Grafik Pergerakan Stok Beras")
abline(h = 0, col = "red", lty = 2)
Pembahasan: Hasil analisis simulasi manajemen persediaan beras di toko kelontong milik Bu Sari selama 60 hari. Setiap hari, penjualan beras mengikuti distribusi uniform antara 8 hingga 15 karung, dengan stok awal sebanyak 100 karung. Pemesanan ulang dilakukan setiap 5 hari sekali sebanyak 50 karung, dan jika toko kehabisan stok, akan terjadi kerugian sebesar Rp50.000 per karung yang tidak bisa dijual. Berdasarkan hasil simulasi, strategi pemesanan 50 karung setiap 5 hari memberikan hasil paling seimbang, dengan hanya dua kali kehabisan stok dan kerugian kecil (sekitar Rp300.000). Jika pesanan dikurangi menjadi 40 karung, toko kehabisan stok sebanyak 12 kali dengan kerugian mencapai Rp5.800.000, sedangkan jika ditingkatkan menjadi 60 karung, stok selalu aman namun berpotensi menumpuk dan menyebabkan pemborosan. Selain jumlah pesanan, diuji pula variasi frekuensi pemesanan, yaitu setiap 3, 5, dan 7 hari. Pemesanan setiap 3 hari memang menghindari kerugian, tetapi terlalu sering dan tidak efisien. Sementara itu, interval 7 hari justru terlalu lama dan menyebabkan kerugian besar. Interval 5 hari kembali terbukti sebagai yang paling optimal. Grafik pergerakan stok harian menunjukkan fluktuasi stok secara jelas dan dapat digunakan sebagai alat bantu visual untuk mengevaluasi kebijakan persediaan toko.