Nomor 1 (set.seed(123))

set.seed(123)

x_1 <- runif(10000, min = 0, max = 1)

ex2_approx_1 <- mean(x_1^2)

# Menampilkan Hasil
cat("Pendekatan E[X^2] =", ex2_approx_1, "\n")
## Pendekatan E[X^2] = 0.3297405

Nomor 2 (set.seed(321))

set.seed(321)

mean_true_2 <- 100
sd_true_2 <- 15

n_values_2 <- c(100, 1000, 10000)

for (n_2 in n_values_2) {
  data_2 <- rnorm(n_2, mean = mean_true_2, sd = sd_true_2)
  
  rata2_2 <- mean(data_2)
  simpangan_baku_2 <- sd(data_2)
  
  # Menampilkan hasil
  cat("\nUntuk n =", n_2, "\n")
  cat("Rata-rata:", round(rata2_2, 4), "\n")
  cat("Simpangan baku:", round(simpangan_baku_2, 4), "\n")
  
  # Plot histogram
  hist(data_2,
       main = paste("Histogram untuk n =", n_2),
       xlab = "Nilai",
       col = "cyan",
       border = "black",
       breaks = 30)
}
## 
## Untuk n = 100 
## Rata-rata: 100.136 
## Simpangan baku: 14.3365

## 
## Untuk n = 1000 
## Rata-rata: 100.6492 
## Simpangan baku: 14.9364

## 
## Untuk n = 10000 
## Rata-rata: 99.9522 
## Simpangan baku: 14.9591

Berdasarkan hasil tersebut dapat disimpulkan bahwa, semakin besar nilai n maka:

Nomor 3 (set.seed(111))

set.seed(111)

x_3 <- rbinom(5000, size = 30, prob = 0.25)

estimasi_prob_3 <- mean(x_3 >= 15)

# Menampilkan hasil
cat("Estimasi P(X >= 15) =", estimasi_prob_3, "\n")
## Estimasi P(X >= 15) = 0.0026

Nomor 4 (set.seed(222))

# Membuat fungsi rumus
hitung_s_4 <- function(x) {
  n_4 <- length(x)
  sum_x_4 <- sum(x)
  sum_x2_4 <- sum(x^2)
  s_4 <- sqrt((sum_x2_4 - (sum_x_4^2) / n_4) / (n_4 - 1))
  return(s_4)
}

set.seed(222)

data_4 <- rnorm(1000, mean = 89, sd = 10)

s_hasil_4 <- hitung_s_4(data_4)

cat("Nilai s =", round(s_hasil_4, 4), "\n")
## Nilai s = 9.9325

Nomor 5

library(ggplot2)

a. Simulasi antrian selama 20 hari kerja (set.seed(333))

set.seed(333)
lambda <- 5/60   
mu <- 1/8         
jam_kerja <- 360
n_hari <- 20


sim_bank <- function(n_teller) {
  total_tunggu <- 0
  total_nasabah <- 0
  total_sibuk <- 0
  antrian_harian <- matrix(0, n_hari, 6)
  
  for(hari in 1:n_hari) {
    
    n <- rpois(1, lambda * jam_kerja)
    kedatangan <- sort(runif(n, 0, jam_kerja))
    pelayanan <- rexp(n, mu)
    
   
    teller_selesai <- rep(0, n_teller)
    tunggu <- numeric(n)
    
    for(i in 1:n) {
      teller_idx <- which.min(teller_selesai)
      mulai <- max(kedatangan[i], teller_selesai[teller_idx])
      tunggu[i] <- mulai - kedatangan[i]
      teller_selesai[teller_idx] <- mulai + pelayanan[i]
    }
    
    
    total_tunggu <- total_tunggu + sum(tunggu)
    total_nasabah <- total_nasabah + n
    total_sibuk <- total_sibuk + sum(pmin(teller_selesai, jam_kerja))
 
    
    for(jam in 1:6) {
      start_t <- (jam-1) * 60
      end_t <- jam * 60
      dalam_jam <- kedatangan >= start_t & kedatangan < end_t
      if(sum(dalam_jam) > 0) {
        antrian_harian[hari, jam] <- mean(tunggu[dalam_jam] > 0)
      }
    }
  }
  
  list(
    rata_tunggu = total_tunggu / total_nasabah,
    utilisasi = total_sibuk / (n_teller * jam_kerja * n_hari),
    antrian_jam = colMeans(antrian_harian)
  )
}

hasil_2 <- sim_bank(2)
cat("Simulasi 20 hari dengan 2 teller selesai\n")
## Simulasi 20 hari dengan 2 teller selesai
cat("Total nasabah dilayani rata-rata:", round(rpois(1, lambda * jam_kerja)), "orang/hari\n")
## Total nasabah dilayani rata-rata: 32 orang/hari

b. Lama nasabah menunggu

cat("Rata-rata waktu tunggu:", round(hasil_2$rata_tunggu, 2), "menit\n")
## Rata-rata waktu tunggu: 0.67 menit

c. Persentase waktu teller sibuk pekerja

cat("Utilisasi teller:", round(hasil_2$utilisasi * 100, 1), "%\n")
## Utilisasi teller: 96.5 %

d. Perbandingan jika bank menambah 1 teller lagi (set.seed(777))

set.seed(777)
hasil_3 <- sim_bank(3)

perbandingan <- data.frame(
  Metrik = c("Waktu tunggu (menit)", "Utilisasi (%)", "Efisiensi"),
  Teller_2 = c(round(hasil_2$rata_tunggu, 2), 
               round(hasil_2$utilisasi * 100, 1),
               round(hasil_2$rata_tunggu / hasil_2$utilisasi, 2)),
  Teller_3 = c(round(hasil_3$rata_tunggu, 2),
               round(hasil_3$utilisasi * 100, 1), 
               round(hasil_3$rata_tunggu / hasil_3$utilisasi, 2))
)

print(perbandingan)
##                 Metrik Teller_2 Teller_3
## 1 Waktu tunggu (menit)     0.67     0.11
## 2        Utilisasi (%)    96.50    95.10
## 3            Efisiensi     0.69     0.11
penurunan <- (hasil_2$rata_tunggu - hasil_3$rata_tunggu) / hasil_2$rata_tunggu * 100
cat("\nPenurunan waktu tunggu:", round(penurunan, 1), "%\n")
## 
## Penurunan waktu tunggu: 84 %
cat("Kesimpulan:", ifelse(penurunan > 25, "EFISIEN - tambah teller", "KURANG EFISIEN"))
## Kesimpulan: EFISIEN - tambah teller

e. Grafik panjang antrian sepanjang hari

jam_data <- data.frame(
  Jam = 1:6,
  Teller_2 = hasil_2$antrian_jam,
  Teller_3 = hasil_3$antrian_jam
)

library(reshape2)
## Warning: package 'reshape2' was built under R version 4.4.3
jam_long <- melt(jam_data, id.vars = "Jam", variable.name = "Skenario", value.name = "Panjang")

ggplot(jam_long, aes(x = Jam, y = Panjang, fill = Skenario)) +
  geom_bar(stat = "identity", position = "dodge", alpha = 0.7) +
  labs(title = "Rata-rata Panjang Antrian per Jam",
       x = "Jam ke-", y = "Proporsi Waktu Ada Antrian") +
  theme_minimal() +
  scale_x_continuous(breaks = 1:6)

Nomor 6 (set.seed(444))

set.seed(444)

simulasi_stok <- function(hari = 60, stok_awal = 100, frekuensi_pesan = 5, jumlah_pesan = 50) {
  stok <- numeric(hari)
  stok[1] <- stok_awal
  lost_sales <- numeric(hari)
  
  for (i in 2:hari) {
    penjualan <- round(runif(1, min = 8, max = 15))
    
    # Kurangi stok
    if (stok[i - 1] >= penjualan) {
      stok[i] <- stok[i - 1] - penjualan
    } else {
      lost_sales[i] <- penjualan - stok[i - 1]
      stok[i] <- 0
    }
    
    # Tambah stok bila hari pemesanan
    if ((i %% frekuensi_pesan) == 0) {
      stok[i] <- stok[i] + jumlah_pesan
    }
  }
  
  return(data.frame(hari = 1:hari, stok = stok, lost_sales = lost_sales))
}

a. Simulasi selama 60 Hari

sim_6 <- simulasi_stok()
head(sim_6)
##   hari stok lost_sales
## 1    1  100          0
## 2    2   91          0
## 3    3   82          0
## 4    4   71          0
## 5    5  110          0
## 6    6  102          0

b. Menghitung berapa kali kehabisan stok

jumlah_kehabisan <- sum(sim_6$lost_sales > 0)
kerugian <- sum(sim_6$lost_sales) * 50000

cat("Toko kehabisan stok setiap", jumlah_kehabisan, "hari.\n")
## Toko kehabisan stok setiap 1 hari.
cat("Total kerugian: Rp", kerugian, "\n")
## Total kerugian: Rp 50000

c. Memabandingkan berbagai strategi jumlah pesanan yang terbaik

strategi <- c(40, 50, 60)

for (jumlah in strategi) {
  sim_6 <- simulasi_stok(jumlah_pesan = jumlah)
  rugi <- sum(sim_6$lost_sales) * 50000
  cat("Pesan", jumlah, "karung → Kerugian: Rp", rugi, "\n")
}
## Pesan 40 karung → Kerugian: Rp 6150000 
## Pesan 50 karung → Kerugian: Rp 2600000 
## Pesan 60 karung → Kerugian: Rp 0

d. Menguji frekuensi pemesanan: 3, 5, 7 hari

frekuensi <- c(3, 5, 7)

for (freq in frekuensi) {
  sim_6 <- simulasi_stok(frekuensi_pesan = freq)
  rugi <- sum(sim_6$lost_sales) * 50000
  cat("Pesan setiap", freq, "hari → Kerugian: Rp", rugi, "\n")
}
## Pesan setiap 3 hari → Kerugian: Rp 0 
## Pesan setiap 5 hari → Kerugian: Rp 850000 
## Pesan setiap 7 hari → Kerugian: Rp 9350000

e. Grafik stok harian

library(ggplot2)

sim_6 <- simulasi_stok()
ggplot(sim_6, aes(x = hari, y = stok)) +
  geom_line(color = "forestgreen") +
  geom_point(aes(y = lost_sales * 5), color = "red", size = 1.5) +
  labs(title = "Grafik Pergerakan Stok Beras Bu Sari",
       y = "Jumlah Karung (stok)",
       x = "Hari") +
  theme_minimal()