No.1

set.seed(123)
n <- 10000
x <- runif(n, min = 0, max = 1)

x_squared <- x^2

expected_value_sim <- mean(x_squared)

expected_value_sim
## [1] 0.3297405
expected_value_theoretical <- 1 / 3
expected_value_theoretical
## [1] 0.3333333
cat("Pendekatan hasil simulasi E[X^2] adalah", round(expected_value_sim, 4),
    "dibandingkan nilai teoretis", round(expected_value_theoretical, 4))
## Pendekatan hasil simulasi E[X^2] adalah 0.3297 dibandingkan nilai teoretis 0.3333

No.2

set.seed(123)
n1 <- 100
data1 <- rnorm(n1, mean = 100, sd = 15)

mean1 <- mean(data1)
sd1 <- sd(data1)

cat("n = 100\n")
## n = 100
cat("Rata-rata:", round(mean1, 2), "\n")
## Rata-rata: 101.36
cat("Simpangan baku:", round(sd1, 2), "\n")
## Simpangan baku: 13.69
hist(data1, breaks = 20, col = "skyblue", main = "Histogram n = 100", xlab = "Nilai")

set.seed(123)
n2 <- 1000
data2 <- rnorm(n2, mean = 100, sd = 15)

mean2 <- mean(data2)
sd2 <- sd(data2)

cat("n = 1000\n")
## n = 1000
cat("Rata-rata:", round(mean2, 2), "\n")
## Rata-rata: 100.24
cat("Simpangan baku:", round(sd2, 2), "\n")
## Simpangan baku: 14.88
set.seed(123)
n3 <- 10000
data3 <- rnorm(n3, mean = 100, sd = 15)

mean3 <- mean(data3)
sd3 <- sd(data3)

cat("n = 10000\n")
## n = 10000
cat("Rata-rata:", round(mean3, 2), "\n")
## Rata-rata: 99.96
cat("Simpangan baku:", round(sd3, 2), "\n")
## Simpangan baku: 14.98
hist(data3, breaks = 40, col = "lightgreen", main = "Histogram n = 10000", xlab = "Nilai")

#### Penjelasan Seiring bertambahnya ukuran sampel: Rata-rata sampel mendekati nilai teoretis Simpangan baku sampel juga semakin mendekati 𝜎=15 Bentuk histogram semakin menyerupai bentuk lonceng (distribusi normal sempurna) Hal ini menunjukkan prinsip Hukum Bilangan Besar: ketika ukuran sampel meningkat, statistik sampel semakin mendekati parameter populasi.

No.3

set.seed(123)
n <- 30
p <- 0.25
simulasi <- rbinom(5000, size = n, prob = p)

prob_est <- mean(simulasi >= 15)
cat("Estimasi P(X >= 15):", prob_est, "\n")
## Estimasi P(X >= 15): 0.0024

No.4

set.seed(123)
data <- rnorm(1000, mean = 89, sd = 10)
n <- length(data)
fungsi<- sqrt((sum(data^2) - (sum(data)^2)/n) / (n - 1))
s_builtin <- sd(data)

cat("Simpangan baku (manual):", round(fungsi, 4), "\n")
## Simpangan baku (manual): 9.9169
cat("Simpangan baku (fungsi sd):", round(s_builtin, 4), "\n")
## Simpangan baku (fungsi sd): 9.9169

No.5a

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.2
set.seed(123)
set.seed(123)
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

No.5b

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

No.5c

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

No.5d

set.seed(123)
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)     1.14     0.13
## 2        Utilisasi (%)    95.70    94.20
## 3            Efisiensi     1.19     0.14
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: 88.7 %
cat("Kesimpulan:", ifelse(penurunan > 25, "EFISIEN - tambah teller", "KURANG EFISIEN"))
## Kesimpulan: EFISIEN - tambah teller

No.5e

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.3.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)

### No.6a

library(ggplot2)
set.seed(123)
sim <- function(pesan=50, frek=5) {
  stok <- 100
  habis <- 0
  rugi <- 0
  data_stok <- c()
  data_jual <- c()
  
  for(i in 1:60) {
    jual <- round(runif(1, 8, 15))
    data_jual[i] <- jual
    
    if(stok < jual) {
      habis <- habis + 1
      rugi <- rugi + (jual - stok) * 50000
      stok <- 0
    } else {
      stok <- stok - jual
    }
    
    data_stok[i] <- stok
    
    if(i %% frek == 0) stok <- stok + pesan
  }
  
  list(stok=data_stok, habis=habis, rugi=rugi, jual=data_jual)
}
base <- sim()
cat("SIMULASI 60 HARI:")
## SIMULASI 60 HARI:
cat("\nRata-rata penjualan:", round(mean(base$jual), 1), "karung/hari")
## 
## Rata-rata penjualan: 11.6 karung/hari
cat("\nTotal terjual:", sum(base$jual), "karung")
## 
## Total terjual: 694 karung
cat("\nStok akhir:", tail(base$stok, 1), "karung")
## 
## Stok akhir: 0 karung
cat("\nHari kehabisan:", base$habis, "hari")
## 
## Hari kehabisan: 9 hari
cat("\nKerugian: Rp", base$rugi)
## 
## Kerugian: Rp 2200000

No.6b

cat("Kehabisan stok:", base$habis, "dari 60 hari")
## Kehabisan stok: 9 dari 60 hari
cat("\nPersentase:", round(base$habis/60*100, 1), "%")
## 
## Persentase: 15 %

No.6c

set.seed(123)
hasil <- data.frame()
for(p in c(40, 50, 60)) {
  x <- sim(pesan=p)
  hasil <- rbind(hasil, c(p, x$habis, x$rugi))
}
names(hasil) <- c("Pesan", "Habis", "Rugi")
print(hasil)
##   Pesan Habis    Rugi
## 1    40    19 7700000
## 2    50     7 2400000
## 3    60     0       0
terbaik <- hasil$Pesan[which.min(hasil$Rugi)]
cat("\nTerbaik: pesan", terbaik, "karung")
## 
## Terbaik: pesan 60 karung

No.6d

hasil2 <- data.frame()
for(f in c(3, 5, 7)) {
  x <- sim(frek=f)
  hasil2 <- rbind(hasil2, c(f, x$habis, x$rugi))
}
names(hasil2) <- c("Frek", "Habis", "Rugi")
print(hasil2)
##   Frek Habis    Rugi
## 1    3     0       0
## 2    5     7 1800000
## 3    7    18 9550000
optimal <- hasil2$Frek[which.min(hasil2$Rugi)]
cat("\nOptimal: setiap", optimal, "hari")
## 
## Optimal: setiap 3 hari

No.6e

# Simulasi optimal
opt <- sim(pesan=terbaik, frek=optimal)

# Plot
plot(1:60, base$stok, type="l", col="red", 
     xlab="Hari", ylab="Stok", main="Pergerakan Stok")
lines(1:60, opt$stok, col="blue")
legend("topright", c("Awal", "Optimal"), col=c("red", "blue"), lty=1)

# Rekomendasi
cat("\nREKOMENDASI:")
## 
## REKOMENDASI:
cat("\n- Pesan", terbaik, "karung setiap", optimal, "hari")
## 
## - Pesan 60 karung setiap 3 hari
cat("\n- Penghematan: Rp", base$rugi - opt$rugi)
## 
## - Penghematan: Rp 2200000
cat("\n- Kurangi kehabisan dari", base$habis, "ke", opt$habis, "hari")
## 
## - Kurangi kehabisan dari 9 ke 0 hari