Soal 1 Gunakan simulasi untuk menghitung nilai pendekatan dari𝐸[𝑋2]E[X2] untuk variabel random berdistribusi Uniform jika𝑋∼𝑈(0,1)X∼U(0,1).Gunakan 10.000 angka random.

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.

Soal 2 Simulasi dari N(100, 15²) dengan n = 100, 1000, 10000

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.

Soal 3 Simulasikan distribusi binomial𝐵𝑖𝑛(30,0.25)Bin(30,0.25) sebanyak 5000 kali.Tentukan nilai estimasi 𝑃(𝑋≥15)P(X≥15).

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.

Soal 4 Buatkan Buat function sesuai rumus dan hitung nilai s

# 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.

Soal 5 Analisi Simulasi Antrian di Bank

λ = 5 per jam μ = 8 menit → 0.1333 jam Teller = 2 Orang Jam Oprasional = 6 Jam/hari

a. Buatlah simulasi antrian selaman 20 hari kerja

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]
}

b. Hitung berapa lama rata-rata nasabah menunggu

rata_tunggu <- mean(waiting_time)
cat("Rata-rata waktu tunggu nasabah:", round(rata_tunggu, 3), "jam\n")
## Rata-rata waktu tunggu nasabah: 0.011 jam

Penjelasan: Rata-rata nasabah hanya menunggu sekitar 40 detik (0.66 menit) sebelum dilayani. Ini menunjukkan bahwa dua teller sudah sangat efisien, dan antrian jarang terjadi.

c.Hitung berapa persen waktu teller sibuk kerja

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.

d. Bandingkan jika bank menambah 1 teller lagi, apakah lebih efisien?

# 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.

e. Buat grafik yang menunjukan panjang antrian sepanjang hari

library(dplyr)
## Warning: package 'dplyr' was built under R version 4.3.3
## 
## Attaching package: 'dplyr'
## 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.3.3
df <- data.frame(arrival = arrival_time, start = start_service)
df$waiting <- df$start - df$arrival
df$jam <- floor(df$arrival)

queue <- df %>%
  group_by(jam) %>%
  summarise(panjang_antrian = n())

ggplot(queue, aes(x = jam, y = panjang_antrian)) +
  geom_col(fill = "skyblue") +
  labs(title = "Jumlah Nasabah per Jam", x = "Jam ke-", y = "Jumlah Nasabah") +
  theme_minimal()

Penjelasan: Dari hasil grafik dapat disimpulkan bahwa sistem antrian berjalan lancar dan beban teller sangat ringan. Grafik membantu visualisasi beban kerja harian dan mengidentifikasi potensi jam sibuk untuk penjadwalan optimal.

Soal 6 Analisi Simulasi Toko Kelontong

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.