# Nomor 1
## Simulasi nilai pendekatan dari $E[X^2]$ untuk Uniform(0, 10)

set.seed(123)
x <- runif(10000, min = 0, max = 10)
ex2 <- mean(x^2)
ex2
## [1] 32.97405
# Nomor 2
## Simulasi untuk tiga ukuran data dari $N(100, 15^2)$

n1 <- rnorm(100, mean = 100, sd = 15)
n2 <- rnorm(1000, mean = 100, sd = 15)
n3 <- rnorm(10000, mean = 100, sd = 15)

summary_stats <- function(data) {
  c(mean = mean(data), sd = sd(data))
}
stat_n1 <- summary_stats(n1)
stat_n2 <- summary_stats(n2)
stat_n3 <- summary_stats(n3)

stat_n1
##      mean        sd 
## 101.02046  13.34109
stat_n2
##      mean        sd 
## 100.49238  14.92385
stat_n3
##     mean       sd 
## 99.97380 15.04648
par(mfrow = c(1, 3))  # tampilkan 3 histogram dalam 1 baris
hist(n1, main = "Histogram n = 100", col = "skyblue", xlab = "Nilai", breaks = 15)
hist(n2, main = "Histogram n = 1000", col = "yellow", xlab = "Nilai", breaks = 30)
hist(n3, main = "Histogram n = 10000", col = "salmon", xlab = "Nilai", breaks = 50)

par(mfrow = c(1, 1))  # reset layout

Penjelasan : Simulasi ini dilakukan untuk melihat bagaimana ukuran sampel memengaruhi estimasi statistik (rata-rata dan simpangan baku) dari suatu populasi yang berdistribusi normal dengan parameter \(N(100, 15^2)\). Berikut hasil pengamatan :

  1. Ukuran n = 100:
  1. Ukuran n = 1000:
  1. Ukuran n = 10000:

Kesimpulan : Semakin besar ukuran sampel, maka estimasi parameter (rata-rata dan simpangan baku) dari data simulasi semakin akurat dan distribusi data semakin mendekati bentuk distribusi normal teoritis

# Nomor 3
## Simulasi distribusi Binomial Bin(30, 0.25) sebanyak 5000 kali

binom_sample <- rbinom(5000, size = 30, prob = 0.25)
p_estimate <- mean(binom_sample >= 15)
p_estimate
## [1] 0.0014
# Nomor 4
## Buatlah fungsi rumus simpangan baku (standar deviasi)

s_custom <- function(x) {
  sqrt((sum(x^2) - (sum(x)^2) / length(x)) / (length(x) - 1))
}

# Uji coba fungsi
data_test <- c(10, 12, 8, 9, 11)
s_custom(data_test)
## [1] 1.581139
#Hitungan nilai s dengan data normal 1000,  rata-rata 89, dan sd 10
set.seed(123)

# Bangkitkan data dari distribusi normal
data_norm <- rnorm(n = 1000, mean = 89, sd = 10)

# Hitung simpangan baku dengan fungsi buatan
s_custom(data_norm)
## [1] 9.91695
## (a) Buat simulasi antrian selama 20 hari kerja

set.seed(123)

# Parameter
jam_kerja <- 6
hari_kerja <- 20
lama_simulasi <- jam_kerja * 60 * hari_kerja

# Kedatangan nasabah (eksponensial): rata-rata 5 per jam
kedatangan <- as.numeric(cumsum(rexp(1000, rate = 5/60)))
kedatangan <- kedatangan[kedatangan <= lama_simulasi]

# Waktu pelayanan (eksponensial): rata-rata 8 menit
pelayanan <- as.numeric(rexp(length(kedatangan), rate = 1/8))

# Variabel hasil simulasi
mulai_pelayanan <- rep(0, length(kedatangan))
selesai <- rep(0, length(kedatangan))
selesai_teller <- c(0, 0)  # dua teller

for (i in 1:length(kedatangan)) {
  teller_tersedia <- which.min(selesai_teller)
  mulai_pelayanan[i] <- max(kedatangan[i], selesai_teller[teller_tersedia])
  selesai[i] <- mulai_pelayanan[i] + pelayanan[i]
  selesai_teller[teller_tersedia] <- selesai[i]
}
simulasi_antrian <- head(data.frame(
  kedatangan = round(kedatangan, 2),
  mulai_dilayani = round(mulai_pelayanan, 2),
  selesai_dilayani = round(selesai, 2)
), 10)

simulasi_antrian
##    kedatangan mulai_dilayani selesai_dilayani
## 1       10.12          10.12            11.91
## 2       17.04          17.04            17.98
## 3       32.99          32.99            57.40
## 4       33.37          33.37            37.29
## 5       34.04          37.29            53.60
## 6       37.84          53.60            56.10
## 7       41.61          56.10            56.46
## 8       43.35          56.46            58.60
## 9       76.07          76.07            77.95
## 10      76.42          76.42            83.08
# (b) Hitung rata-rata waktu tunggu nasabah dalam antrian

waktu_tunggu <- mulai_pelayanan - kedatangan
mean(waktu_tunggu)
## [1] 0.8116455

Penjelasan : Artinya, rata-rata nasabah hanya perlu menunggu sekitar 49 detik sebelum mulai dilayani. Hal ini menunjukkan bahwa dengan 2 teller, antrian relatif pendek dan pelayanan cukup cepat.

# (c) Hitung persentase waktu teller dalam kondisi sibuk

waktu_sibuk <- sum(pelayanan)
persen_sibuk <- selesai_teller / lama_simulasi* 100
persen_sibuk
## [1] 99.76891 99.69771

Penjelasan : Ini artinya, teller bekerja hampir sepanjang waktu (99.7%) selama jam operasional. Ini menunjukkan efisiensi tinggi, tetapi juga mengindikasikan beban kerja teller yang sangat padat, dengan nyaris tidak ada waktu istirahat

# (d) Bandingkan jika bank menambah 1 teller lagi – apakah lebih efisien?

selesai_teller3 <- c(0, 0, 0)
mulai3 <- rep(0, length(kedatangan))
selesai3 <- rep(0, length(kedatangan))
for (i in 1:length(kedatangan)) {
  available <- which.min(selesai_teller3)
  mulai3[i] <- max(kedatangan[i], selesai_teller3[available])
  selesai3[i] <- mulai3[i] + pelayanan[i]
  selesai_teller3[available] <- selesai3[i]
}

mean(mulai3 - kedatangan)  # rata-rata tunggu dengan 3 teller
## [1] 0.08019951

Penjelasan : Jika teller ditambah menjadi 3, waktu tunggu rata-rata menurun menjadi 0.80 menit (48 detik). Penurunan ini sangat kecil dibanding 2 teller (0.811 menit), sehingga menambah 1 teller tidak memberikan dampak signifikan terhadap efisiensi waktu tunggu. Artinya, 2 teller sudah cukup optimal

# (e) Buat grafik yang menunjukkan panjang antrian sepanjang hari

waktu <- seq(0, jam_kerja * 60, by = 1)
antrian <- sapply(waktu, function(t) {
  sum(kedatangan <= t & selesai > t)
})

plot(waktu, antrian, type = "l", col = "orange", lwd = 2,
     xlab = "Menit", ylab = "Jumlah Antrian",
     main = "Panjang Antrian Teller Bank (2 Teller) Sepanjang Hari")

# Nomor 6
## Simulasi Penjualan Beras di Toko Bu Sari
#(a) Simulasikan stok selama 60 hari
set.seed(123)
penjualan <- runif(60, min = 8, max = 15)
stok <- numeric(60)
rugi <- 0
stok[1] <- 100

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

  stok[i] <- stok[i] - penjualan[i]
  if (stok[i] < 0) {
    rugi <- rugi + abs(stok[i]) * 50000
    stok[i] <- 0
  }
}
stok
##  [1] 100.000000  86.481864  75.619026  61.437904  46.854633  88.535737
##  [7]  76.838999  62.592066  50.732020  39.535717  74.837884  63.664545
## [13]  50.921550  38.913117  30.192644  65.893869  56.171255  47.876838
## [19]  37.581393  22.899868  58.673092  45.823468  33.339921  18.380032
## [25]   5.790092  42.830378  31.021916  18.862922   8.838804   0.000000
## [31]  35.258830  20.942737   8.107800   0.000000   0.000000  38.655428
## [37]  25.346211  15.831356   5.604089   0.000000  41.000400  30.098575
## [43]  19.202505   8.620587   0.000000  41.028358  31.397119  20.135382
## [49]  10.273573   0.000000  41.679182  30.583781  16.991307   8.138013
## [55]   0.000000  40.554280  31.661559  18.388404   4.123086   0.000000
# (b) Hitung berapa kali toko kehabisan stok
sum(stok == 0)
## [1] 8
# (c) Strategi jumlah pemesanan: 40, 50, 60 karung
pesan_strategi <- function(pesan) {
  stok <- numeric(60)
  rugi <- 0
  stok[1] <- 100
  penjualan <- runif(60, 8, 15)
  for (i in 2:60) {
    if (i %% 5 == 1) stok[i] <- stok[i - 1] + pesan
    else stok[i] <- stok[i - 1]
    stok[i] <- stok[i] - penjualan[i]
    if (stok[i] < 0) {
      rugi <- rugi + abs(stok[i]) * 50000
      stok[i] <- 0
    }
  }
  list(stok = stok, rugi = rugi, habis = sum(stok == 0))
}

s40 <- pesan_strategi(40)
s50 <- pesan_strategi(50)
s60 <- pesan_strategi(60)
s40$rugi; s50$rugi; s60$rugi
## [1] 7201815
## [1] 935349.6
## [1] 0
s40$habis; s50$habis; s60$habis
## [1] 18
## [1] 2
## [1] 0
# (d) Strategi frekuensi pemesanan: setiap 3, 5, dan 7 hari
freq_strategi <- function(freq) {
  stok <- numeric(60)
  rugi <- 0
  stok[1] <- 100
  penjualan <- runif(60, 8, 15)
  for (i in 2:60) {
    if (i %% freq == 1) stok[i] <- stok[i - 1] + 50
    else stok[i] <- stok[i - 1]
    stok[i] <- stok[i] - penjualan[i]
    if (stok[i] < 0) {
      rugi <- rugi + abs(stok[i]) * 50000
      stok[i] <- 0
    }
  }
  list(stok = stok, rugi = rugi, habis = sum(stok == 0))
}

f3 <- freq_strategi(3)
f5 <- freq_strategi(5)
f7 <- freq_strategi(7)
f3$rugi; f5$rugi; f7$rugi
## [1] 0
## [1] 1416061
## [1] 8741818
f3$habis; f5$habis; f7$habis
## [1] 0
## [1] 4
## [1] 18
# (e) Grafik pergerakan stok dan rekomendasi

plot(s50$stok, type = "l", col = "pink", lwd = 2,
     main = "Pergerakan Stok Beras Bu Sari (Pesan 50 Karung Tiap 5 Hari)",
     xlab = "Hari ke-", ylab = "Sisa Stok")