Jawaban No 1
set.seed(123)
x <- runif(10000, min = 0, max = 1)
x_kuadrat <- x^2
ekspektasi_x_kuadrat <- mean(x_kuadrat)
ekspektasi_x_kuadrat
## [1] 0.3297405
Jawaban No 2
set.seed(123)
n1 <- rnorm(100, mean = 100, sd = 15)
n2 <- rnorm(1000, mean = 100, sd = 15)
n3 <- rnorm(10000, mean = 100, sd = 15)
mean_n1 <- mean(n1); sd_n1 <- sd(n1)
mean_n2 <- mean(n2); sd_n2 <- sd(n2)
mean_n3 <- mean(n3); sd_n3 <- sd(n3)
cat("n = 100 -> Mean:", mean_n1, "; SD:", sd_n1, "\n")
## n = 100 -> Mean: 101.3561 ; SD: 13.69224
cat("n = 1000 -> Mean:", mean_n2, "; SD:", sd_n2, "\n")
## n = 1000 -> Mean: 100.2862 ; SD: 15.06891
cat("n = 10000 -> Mean:", mean_n3, "; SD:", sd_n3, "\n")
## n = 10000 -> Mean: 99.96336 ; SD: 14.98314
par(mfrow = c(1,3))
hist(n1, breaks = 15, col = "skyblue", main = "n = 100", xlab = "Nilai", xlim = c(40,160))
hist(n2, breaks = 30, col = "lightgreen", main = "n = 1000", xlab = "Nilai", xlim = c(40,160))
hist(n3, breaks = 50, col = "salmon", main = "n = 10000", xlab = "Nilai", xlim = c(40,160))

par(mfrow = c(1,1))
Jawaban No 3
set.seed(123)
x <- rbinom(5000, size = 30, prob = 0.25)
p_ge_15 <- mean(x >= 15)
cat("Estimasi P(X >= 15):", p_ge_15, "\n")
## Estimasi P(X >= 15): 0.0024
Jawaban No 4
hitung_s <- function(x) {
n <- length(x)
jumlah_x <- sum(x)
jumlah_x2 <- sum(x^2)
s <- sqrt((jumlah_x2 - (jumlah_x^2) / n) / (n - 1))
return(s)
}
set.seed(123)
data <- rnorm(1000, mean = 89, sd = 10)
s_manual <- hitung_s(data)
cat("Simpangan baku (manual):", s_manual, "\n")
## Simpangan baku (manual): 9.91695
Jawaban No 5
library(simmer)
library(ggplot2)
library(simmer.plot)
##
## Attaching package: 'simmer.plot'
## The following objects are masked from 'package:simmer':
##
## get_mon_arrivals, get_mon_attributes, get_mon_resources
set.seed(123)
kedatangan_per_jam <- 5
waktu_pelayanan <- 8 / 60
jam_kerja <- 6
hari_simulasi <- 20
total_jam <- jam_kerja * hari_simulasi
simulasi_bank <- function(jumlah_teller) {
env <- simmer("Bank")
nasabah <- trajectory("nasabah") %>%
seize("teller", 1) %>%
timeout(function() rexp(1, rate = 1 / waktu_pelayanan)) %>%
release("teller", 1)
env %>%
add_resource("teller", jumlah_teller) %>%
add_generator("nasabah", nasabah, function() rexp(1, rate = kedatangan_per_jam)) %>%
run(until = total_jam)
return(env)
}
env_2 <- simulasi_bank(2)
data_2 <- get_mon_arrivals(env_2)
res_2 <- get_mon_resources(env_2)
env_3 <- simulasi_bank(3)
data_3 <- get_mon_arrivals(env_3)
res_3 <- get_mon_resources(env_3)
data_2$waiting_time <- data_2$end_time - data_2$start_time - data_2$activity_time
data_3$waiting_time <- data_3$end_time - data_3$start_time - data_3$activity_time
mean_wait_2 <- mean(data_2$waiting_time) * 60 # menit
mean_wait_3 <- mean(data_3$waiting_time) * 60 # menit
total_busy_time_2 <- sum(res_2[res_2$resource == "teller" & res_2$metric == "busy", "value"])
total_busy_time_3 <- sum(res_3[res_3$resource == "teller" & res_3$metric == "busy", "value"])
total_time_2 <- 2 * total_jam
total_time_3 <- 3 * total_jam
util_2 <- (total_busy_time_2 / total_time_2) * 100
util_3 <- (total_busy_time_3 / total_time_3) * 100
cat("=== Hasil Simulasi ===\n")
## === Hasil Simulasi ===
cat(">> 2 Teller:\n")
## >> 2 Teller:
cat(sprintf("Rata-rata waktu tunggu: %.2f menit\n", mean_wait_2))
## Rata-rata waktu tunggu: 0.94 menit
cat(sprintf("Persentase waktu teller sibuk: %.2f%%\n", util_2))
## Persentase waktu teller sibuk: 0.00%
cat("\n>> 3 Teller:\n")
##
## >> 3 Teller:
cat(sprintf("Rata-rata waktu tunggu: %.2f menit\n", mean_wait_3))
## Rata-rata waktu tunggu: 0.16 menit
cat(sprintf("Persentase waktu teller sibuk: %.2f%%\n", util_3))
## Persentase waktu teller sibuk: 0.00%
# === Grafik Panjang Antrian (2 Teller) ===
antrian_2 <- get_mon_resources(env_2)
ggplot(antrian_2[antrian_2$resource == "teller", ], aes(time, queue)) +
geom_line(color = "blue") +
labs(title = "Panjang Antrian Sepanjang Hari (20 Hari, 2 Teller)",
x = "Waktu (jam)",
y = "Panjang Antrian") +
theme_minimal()

Jawaban No 6
library(ggplot2)
library(reshape2)
set.seed(123)
simulasi_stok <- function(jumlah_pesan = 50, frekuensi_pesan = 5) {
hari <- 60
stok <- numeric(hari)
stok[1] <- 100 # Stok awal
kehabisan <- 0
rugi <- 0
penjualan <- runif(hari, min = 8, max = 15)
for (t in 2:hari) {
if ((t - 1) %% frekuensi_pesan == 0) {
stok[t] <- stok[t - 1] + jumlah_pesan
} else {
stok[t] <- stok[t - 1]
}
jual <- min(penjualan[t], stok[t])
rugi <- rugi + max(0, penjualan[t] - stok[t]) * 50000
if (stok[t] < penjualan[t]) kehabisan <- kehabisan + 1
stok[t] <- stok[t] - jual
}
return(list(stok = stok, kehabisan = kehabisan, rugi = rugi))
}
hasil_pesan <- lapply(c(40, 50, 60), function(p) simulasi_stok(jumlah_pesan = p, frekuensi_pesan = 5))
names(hasil_pesan) <- c("Pesan_40", "Pesan_50", "Pesan_60")
sapply(hasil_pesan, function(h) c(Kehabisan = h$kehabisan, Rugi = h$rugi))
## Pesan_40 Pesan_50 Pesan_60
## Kehabisan 17 5 0
## Rugi 7115279 1701815 0
hasil_frekuensi <- lapply(c(3, 5, 7), function(f) simulasi_stok(jumlah_pesan = 50, frekuensi_pesan = f))
names(hasil_frekuensi) <- c("Setiap_3_Hari", "Setiap_5_Hari", "Setiap_7_Hari")
sapply(hasil_frekuensi, function(h) c(Kehabisan = h$kehabisan, Rugi = h$rugi))
## Setiap_3_Hari Setiap_5_Hari Setiap_7_Hari
## Kehabisan 0 4 16
## Rugi 0 1088394 9029860
stok_data <- data.frame(
Hari = 1:60,
Pesan_40 = hasil_pesan$Pesan_40$stok,
Pesan_50 = hasil_pesan$Pesan_50$stok,
Pesan_60 = hasil_pesan$Pesan_60$stok
)
stok_melt <- melt(stok_data, id = "Hari")
ggplot(stok_melt, aes(x = Hari, y = value, color = variable)) +
geom_line(size = 1) +
labs(title = "Pergerakan Stok Beras selama 60 Hari",
x = "Hari", y = "Jumlah Stok", color = "Strategi Pemesanan") +
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
