# 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
# 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.
# 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.
# 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.
# ===============================
# 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()
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)