Jawaban No 1

# Set seed untuk hasil yang dapat direproduksi
set.seed(123)

# Generate 10.000 angka random dari Uniform(0, 1)
x <- runif(10000, min = 0, max = 1)

# Hitung E[X^2] melalui pendekatan simulasi
E_X2_estimate <- mean(x^2)

# Tampilkan hasil
cat("Estimasi E[X^2]:", E_X2_estimate, "\n")
## Estimasi E[X^2]: 0.3297405
# Bandingkan dengan nilai eksak
E_X2_exact <- 1/3
cat("Nilai eksak E[X^2]:", E_X2_exact, "\n")
## Nilai eksak E[X^2]: 0.3333333

Jawaban No 2

# Set seed untuk replikasi
set.seed(456)

# Parameter distribusi normal
mean_true <- 100
sd_true <- 15

# Ukuran sampel
n_values <- c(100, 1000, 10000)

# Fungsi untuk menghasilkan data, menghitung statistik, dan menampilkan histogram
for (n in n_values) {
  data <- rnorm(n, mean = mean_true, sd = sd_true)
  sample_mean <- mean(data)
  sample_sd <- sd(data)
  
  cat("\nUkuran sampel:", n, "\n")
  cat("Rata-rata sampel:", sample_mean, "\n")
  cat("Simpangan baku sampel:", sample_sd, "\n")
  
  hist(data, breaks = 30, main = paste("Histogram N =", n),
       xlab = "Nilai", col = "pink", border = "white")
}
## 
## Ukuran sampel: 100 
## Rata-rata sampel: 101.8086 
## Simpangan baku sampel: 15.02343

## 
## Ukuran sampel: 1000 
## Rata-rata sampel: 100.9565 
## Simpangan baku sampel: 14.69216

## 
## Ukuran sampel: 10000 
## Rata-rata sampel: 100.0926 
## Simpangan baku sampel: 15.0595

Penjelasan: Dengan meningkatnya ukuran sampel dari 100, 1000, hingga 10.000, hasil simulasi distribusi normal 𝑁(100,15^2)menunjukkan bahwa rata-rata dan simpangan baku semakin mendekati nilai teoritis. Pada sampel kecil (n = 100), distribusi masih tampak acak dan belum simetris. Saat sampel bertambah (n = 1000), bentuk distribusi mulai menyerupai kurva normal. Pada sampel besar (n = 10.000), histogram terlihat sangat simetris dan menyerupai distribusi normal sempurna. Hal ini membuktikan bahwa semakin besar ukuran sampel, semakin akurat estimasi statistik yang diperoleh.

Jawaban No 3

# Set seed untuk hasil yang konsisten
set.seed(123)

# Simulasi 5000 data dari distribusi Binomial(n = 30, p = 0.25)
data_binom <- rbinom(5000, size = 30, prob = 0.25)

# Hitung proporsi kejadian X >= 15
prob_ge_15 <- mean(data_binom >= 15)

# Tampilkan hasil estimasi
cat("Estimasi P(X >= 15):", prob_ge_15, "\n")
## Estimasi P(X >= 15): 0.0024

Penjelasan: Hasil simulasi sebanyak 5000 kali menunjukkan bahwa kejadian 𝑋≥ 15 sangat jarang terjadi, hanya sekitar 12 kali dari 5000 percobaan, sehingga diperoleh estimasi probabilitas sebesar 0.0024.

Jawaban NO 4

# Buat fungsi hitung_s untuk menghitung simpangan baku dengan rumus manual
hitung_s <- function(x) {
  n <- length(x)
  sum_x <- sum(x)
  sum_x2 <- sum(x^2)
  
  s <- sqrt((sum_x2 - (sum_x^2 / n)) / (n - 1))
  return(s)
}

# Generate 1000 data dari distribusi normal (mean = 89, sd = 10)
set.seed(123)
data_normal <- rnorm(1000, mean = 89, sd = 10)

# Hitung nilai s dengan fungsi buatan
s_manual <- hitung_s(data_normal)

# Bandingkan dengan fungsi sd() bawaan R
s_builtin <- sd(data_normal)

# Tampilkan hasil
cat("Nilai s (manual):", s_manual, "\n")
## Nilai s (manual): 9.91695
cat("Nilai sd() bawaan R:", s_builtin, "\n")
## Nilai sd() bawaan R: 9.91695

Penjelasan: Fungsi yang dibuat berhasil menghitung simpangan baku sampel dengan tepat, sesuai rumus statistik. Kesesuaian hasil dengan sd() menunjukkan bahwa pemahaman dan implementasi perhitungan simpangan baku telah dilakukan dengan benar.

Jawaban No 5

# ===============================
# SIMULASI ANTRIAN DI BANK
# ===============================

# (a) SET PARAMETER SIMULASI
set.seed(123)

# Jumlah nasabah rata-rata 5 per jam
lambda <- 5        

# Rata-rata waktu pelayanan adalah 8 menit
mu <- 60 / 8        

# Jam operasional bank per hari
jam_kerja <- 6      

# Lama simulasi (dalam hari kerja)
hari_kerja <- 20    

# Total waktu kerja dalam menit (20 hari x 6 jam x 60 menit)
total_waktu <- jam_kerja * 60 * hari_kerja  

# ===============================
# (a) FUNGSI SIMULASI ANTRIAN
# ===============================
simulasi_bank <- function(jml_teller = 2) {
  # Jumlah nasabah tiap hari (mengikuti distribusi Poisson)
  n_nasabah <- rpois(hari_kerja, lambda * jam_kerja)

  # Waktu kedatangan tiap nasabah (dalam menit)
  kedatangan <- sort(unlist(lapply(n_nasabah, function(n) cumsum(rexp(n, lambda / 60)))))

  # Waktu pelayanan tiap nasabah (dalam menit)
  pelayanan <- rexp(length(kedatangan), mu)

  # Inisialisasi waktu mulai dan selesai
  mulai <- rep(NA, length(kedatangan))
  selesai <- rep(NA, length(kedatangan))

  # Waktu kapan masing-masing teller tersedia
  teller_tersedia <- rep(0, jml_teller)

  # (a) Proses simulasi pelayanan
  for (i in seq_along(kedatangan)) {
    teller_aktif <- which.min(teller_tersedia)
    mulai[i] <- max(kedatangan[i], teller_tersedia[teller_aktif])
    selesai[i] <- mulai[i] + pelayanan[i]
    teller_tersedia[teller_aktif] <- selesai[i]
  }

  # Hitung waktu tunggu dan tingkat kesibukan teller
  waktu_tunggu <- mulai - kedatangan
  total_pelayanan <- sum(selesai - mulai)
  persentase_sibuk <- total_pelayanan / (jml_teller * total_waktu) * 100

  # Output sebagai list
  return(list(
    data = data.frame(kedatangan, mulai, selesai, pelayanan, tunggu = waktu_tunggu),
    rata2_tunggu = mean(waktu_tunggu),
    persen_sibuk = persentase_sibuk
  ))
}

# ===============================
# (a–d) JALANKAN SIMULASI UNTUK 2 DAN 3 TELLER
# ===============================
sim2 <- simulasi_bank(jml_teller = 2)
sim3 <- simulasi_bank(jml_teller = 3)

# ===============================
# (b–d) TAMPILKAN HASIL SIMULASI
# ===============================
cat("=== HASIL SIMULASI ANTRIAN BANK ===\n")
## === HASIL SIMULASI ANTRIAN BANK ===
cat("Jumlah hari kerja:", hari_kerja, "\n")
## Jumlah hari kerja: 20
cat("Total nasabah (2 teller):", nrow(sim2$data), "\n\n")
## Total nasabah (2 teller): 582
cat("(b) Rata-rata waktu tunggu (2 teller):", round(sim2$rata2_tunggu, 2), "menit\n")
## (b) Rata-rata waktu tunggu (2 teller): 0 menit
cat("(c) Persentase teller sibuk (2 teller):", round(sim2$persen_sibuk, 2), "%\n\n")
## (c) Persentase teller sibuk (2 teller): 0.56 %
cat("(d) Jika menggunakan 3 teller:\n")
## (d) Jika menggunakan 3 teller:
cat("    Rata-rata waktu tunggu:", round(sim3$rata2_tunggu, 2), "menit\n")
##     Rata-rata waktu tunggu: 0 menit
cat("    Persentase teller sibuk:", round(sim3$persen_sibuk, 2), "%\n")
##     Persentase teller sibuk: 0.35 %
if (sim3$rata2_tunggu < sim2$rata2_tunggu & sim3$persen_sibuk < sim2$persen_sibuk) {
  cat("    ➤ Kesimpulan: Menambah teller lebih efisien (lebih cepat & ringan).\n")
} else {
  cat("    ➤ Kesimpulan: Penambahan teller tidak terlalu berdampak signifikan.\n")
}
##     ➤ Kesimpulan: Menambah teller lebih efisien (lebih cepat & ringan).
# ===============================
# (e) GRAFIK JUMLAH NASABAH DATANG PER 10 MENIT
# ===============================
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
# Tambahkan kolom hari dan menit dalam hari
sim2$data$hari <- cut(sim2$data$kedatangan,
                      breaks = seq(0, total_waktu, by = jam_kerja * 60),
                      labels = 1:hari_kerja)

sim2$data$jam <- sim2$data$kedatangan %% (jam_kerja * 60)

# Buat grafik batang
ggplot(sim2$data, aes(x = jam)) +
  stat_bin(binwidth = 10, fill = "pink", color = "black") +
  labs(title = "(e) Jumlah Nasabah Datang Setiap 10 Menit (2 Teller)",
       x = "Menit dalam Hari (0–360)", y = "Jumlah Nasabah") +
  theme_minimal()

Jawaban No 6

set.seed(1)

# Inisialisasi
hari <- 60
stok <- numeric(hari)
penjualan <- sample(8:15, hari, replace = TRUE)
stok[1] <- 100 - penjualan[1]

for (i in 2:hari) {
  # Tambah stok setiap 5 hari
  if (i %% 5 == 1) {
    stok[i] <- stok[i-1] + 50
  } else {
    stok[i] <- stok[i-1]
  }

  # Kurangi stok sesuai penjualan
  stok[i] <- stok[i] - penjualan[i]

  # Jika stok < 0, tetap dicatat agar bisa dihitung rugi nanti
}

# Buat tabel hasil
hasil <- data.frame(
  Hari = 1:hari,
  Penjualan = penjualan,
  Stok_Sisa = stok
)

print(head(hasil, 60))  
##    Hari Penjualan Stok_Sisa
## 1     1         8        92
## 2     2        11        81
## 3     3        14        67
## 4     4         8        59
## 5     5         9        50
## 6     6        12        88
## 7     7        14        74
## 8     8        10        64
## 9     9        13        51
## 10   10         9        42
## 11   11        10        82
## 12   12        10        72
## 13   13         8        64
## 14   14        12        52
## 15   15        12        40
## 16   16         9        81
## 17   17        13        68
## 18   18        13        55
## 19   19         9        46
## 20   20        14        32
## 21   21         8        74
## 22   22        14        60
## 23   23        12        48
## 24   24        12        36
## 25   25         8        28
## 26   26         8        70
## 27   27        13        57
## 28   28        12        45
## 29   29        12        33
## 30   30         9        24
## 31   31         9        65
## 32   32        13        52
## 33   33         8        44
## 34   34        11        33
## 35   35        14        19
## 36   36         8        61
## 37   37        11        50
## 38   38        10        40
## 39   39        13        27
## 40   40         9        18
## 41   41         9        59
## 42   42        13        46
## 43   43        14        32
## 44   44        11        21
## 45   45        11        10
## 46   46        11        49
## 47   47         9        40
## 48   48        11        29
## 49   49         8        21
## 50   50        14         7
## 51   51        13        44
## 52   52         8        36
## 53   53        15        21
## 54   54        11        10
## 55   55         8         2
## 56   56        14        38
## 57   57        15        23
## 58   58        13        10
## 59   59         9         1
## 60   60        14       -13
# Hitung jumlah hari stok habis atau kurang dari sama dengan 0
jumlah_kehabisan_stok <- sum(stok <= 0)

jumlah_kehabisan_stok
## [1] 1
set.seed(1)

# Fungsi sederhana untuk hitung berapa kali stok habis
cek_kehabisan <- function(pesan_ulang) {
  stok <- 100
  kehabisan <- 0
  
  for (i in 1:60) {
    penjualan <- sample(8:15, 1)
    
    # Pesan ulang setiap 5 hari
    if (i %% 5 == 1 && i != 1) {
      stok <- stok + pesan_ulang
    }
    
    stok <- stok - penjualan
    
    if (stok <= 0) {
      kehabisan <- kehabisan + 1
    }
  }
  
  return(kehabisan)
}

# Coba 3 strategi
cat("Pesan 40 karung - kehabisan:", cek_kehabisan(40), "hari\n")
## Pesan 40 karung - kehabisan: 34 hari
## Pesan 40 karung - kehabisan: 34 hari
## Pesan 50 karung - kehabisan: 24 hari
## Pesan 60 karung - kehabisan: 0 hari
set.seed(1)

cek_kehabisan <- function(frekuensi_pesan) {
  stok <- 100
  kehabisan <- 0
  
  for (i in 1:60) {
    penjualan <- sample(8:15, 1)
    
    # Tambah stok jika hari sesuai frekuensi
    if (i %% frekuensi_pesan == 1 && i != 1) {
      stok <- stok + 50
    }
    
    stok <- stok - penjualan
    
    if (stok <= 0) {
      kehabisan <- kehabisan + 1
    }
  }
  
  return(kehabisan)
}

# Coba 3 frekuensi: setiap 3, 5, dan 7 hari
cat("Pesan setiap 3 hari - kehabisan:", cek_kehabisan(3), "hari\n")
## Pesan setiap 3 hari - kehabisan: 0 hari
## Pesan setiap 3 hari - kehabisan: 0 hari
## Pesan setiap 5 hari - kehabisan: 24 hari
## Pesan setiap 7 hari - kehabisan: 43 hari
set.seed(1)

stok <- numeric(60)
stok[1] <- 100 - sample(8:15, 1)

for (i in 2:60) {
  penjualan <- sample(8:15, 1)
  
  # Ganti angka 5 di bawah ini untuk mencoba strategi lain (3, 5, atau 7)
  if (i %% 5 == 1) {
    stok[i] <- stok[i-1] + 50
  } else {
    stok[i] <- stok[i-1]
  }
  
  stok[i] <- stok[i] - penjualan
}

# Buat grafik stok
plot(stok, type = "l", col = "pink", lwd = 2,
     main = "Pergerakan Stok Selama 60 Hari",
     xlab = "Hari", ylab = "Stok Sisa")
abline(h = 0, col = "red", lty = 2)