nomer 1

set.seed(123)
x <- runif(10000)
E_X2 <- mean(x^2)
E_X2
## [1] 0.3297405

nome 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)

hist(n1, main="Histogram n=100", xlab="Value")

hist(n2, main="Histogram n=1000", xlab="Value")

hist(n3, main="Histogram n=10000", xlab="Value")

mean(n1); sd(n1)
## [1] 101.3561
## [1] 13.69224
mean(n2); sd(n2)
## [1] 100.2862
## [1] 15.06891
mean(n3); sd(n3)
## [1] 99.96336
## [1] 14.98314

nomer 3

set.seed(123)
sim <- rbinom(5000, size = 30, prob = 0.25)
mean(sim >= 15)
## [1] 0.0024

nomer 4

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

set.seed(123)
data <- rnorm(1000, mean = 89, sd = 10)
s_custom(data)
## [1] 9.91695

nomer 5

library(simmer)
library(simmer.plot)
## Loading required package: ggplot2
## 
## Attaching package: 'simmer.plot'
## The following objects are masked from 'package:simmer':
## 
##     get_mon_arrivals, get_mon_attributes, get_mon_resources
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:simmer':
## 
##     select
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
bank_simulation <- function(teller_count = 2, days = 20) {
  env <- simmer("Bank")
  lambda <- 5 / 60   # 5 nasabah per jam → per menit
  mu <- 1 / 8        # rata-rata pelayanan 8 menit

  customer <- trajectory("Nasabah") %>%
    seize("teller", 1) %>%
    timeout(function() rexp(1, rate = mu)) %>%
    release("teller", 1)

  env %>%
    add_resource("teller", teller_count) %>%
    add_generator("nasabah", customer, function() rexp(1, rate = lambda), mon = TRUE) %>%
    run(until = 360 * days)

  return(env)
}

sim <- bank_simulation(teller_count = 2, days = 20)

5b

arrivals <- get_mon_arrivals(sim)
arrivals$waiting_time <- (arrivals$end_time - arrivals$start_time) - arrivals$activity_time
mean(arrivals$waiting_time)
## [1] 1.175034

5c

sim_2 <- bank_simulation(teller_count = 2)
resources <- get_mon_resources(sim_2)
total_time <- max(resources$time)
busy_time <- resources %>%
  filter(resource == "teller") %>%
  group_by(resource) %>%
  summarize(total_busy = sum(server))
busy_time$utilization <- busy_time$total_busy / (2 * total_time)
busy_time
## # A tibble: 1 × 3
##   resource total_busy utilization
##   <chr>         <int>       <dbl>
## 1 teller         1210      0.0840

5d

sim_3 <- bank_simulation(teller_count = 3)
arrivals_3 <- get_mon_arrivals(sim_3)
arrivals_3$waiting_time <- (arrivals_3$end_time - arrivals_3$start_time) - arrivals_3$activity_time
mean(arrivals_3$waiting_time)
## [1] 0.1823506

5e

sim_harian <- bank_simulation(teller_count = 2, days = 1)
resources <- get_mon_resources(sim_harian)
antrian_df <- resources %>%
  filter(resource == "teller") %>%
  select(time, queue)

ggplot(antrian_df, aes(x = time, y = queue)) +
  geom_line(color = "steelblue", linewidth = 1) +
  labs(
    title = "Panjang Antrian Nasabah Sepanjang Hari (2 Teller)",
    x = "Waktu (menit)",
    y = "Jumlah Nasabah dalam Antrian"
  ) +
  theme_minimal()

### 6
simulasi_stok <- function(jumlah_pesan = 50, hari = 60, stok_awal = 100, frekuensi_pesan = 5) {
  penjualan <- round(runif(hari, min = 8, max = 15))
  stok <- numeric(hari)
  kehabisan <- numeric(hari)
  rugi <- numeric(hari)

  stok[1] <- stok_awal - penjualan[1]

  for (i in 2:hari) {
    if (i %% frekuensi_pesan == 1) {
      stok[i - 1] <- stok[i - 1] + jumlah_pesan
    }
    sisa <- stok[i - 1] - penjualan[i]
    if (sisa < 0) {
      stok[i] <- 0
      kehabisan[i] <- 1
      rugi[i] <- abs(sisa) * 50000
    } else {
      stok[i] <- sisa
    }
  }

  return(data.frame(
    Hari = 1:hari,
    Penjualan = penjualan,
    Stok_Tersisa = stok,
    Kehabisan = kehabisan,
    Kerugian = rugi
  ))
}

set.seed(123)
df_stok <- simulasi_stok()

6b

sum(df_stok$Kehabisan)
## [1] 9

6c

hasil_40 <- simulasi_stok(jumlah_pesan = 40)
hasil_50 <- simulasi_stok(jumlah_pesan = 50)
hasil_60 <- simulasi_stok(jumlah_pesan = 60)

strategi_jumlah <- data.frame(
  Jumlah_Pesan = c(40, 50, 60),
  Kehabisan = c(sum(hasil_40$Kehabisan), sum(hasil_50$Kehabisan), sum(hasil_60$Kehabisan)),
  Total_Rugi = c(sum(hasil_40$Kerugian), sum(hasil_50$Kerugian), sum(hasil_60$Kerugian))
)
strategi_jumlah
##   Jumlah_Pesan Kehabisan Total_Rugi
## 1           40        18    7900000
## 2           50         5    1850000
## 3           60         0          0

6d

df_3 <- simulasi_stok(frekuensi_pesan = 3)
df_5 <- simulasi_stok(frekuensi_pesan = 5)
df_7 <- simulasi_stok(frekuensi_pesan = 7)

strategi_frekuensi <- data.frame(
  Frekuensi = c(3, 5, 7),
  Kehabisan = c(sum(df_3$Kehabisan), sum(df_5$Kehabisan), sum(df_7$Kehabisan)),
  Total_Rugi = c(sum(df_3$Kerugian), sum(df_5$Kerugian), sum(df_7$Kerugian))
)
strategi_frekuensi
##   Frekuensi Kehabisan Total_Rugi
## 1         3         0          0
## 2         5         5    1950000
## 3         7        19    9050000

6e

df_3$strategi <- "Setiap 3 Hari"
df_5$strategi <- "Setiap 5 Hari"
df_7$strategi <- "Setiap 7 Hari"

df_all <- rbind(df_3, df_5, df_7)

# Plot
ggplot(df_all, aes(x = Hari, y = Stok_Tersisa, color = strategi)) +
  geom_line(linewidth = 1) +
  labs(
    title = "Pergerakan Stok Beras Bu Sari Selama 60 Hari",
    x = "Hari ke-",
    y = "Sisa Stok (karung)",
    color = "Strategi Pemesanan"
  ) +
  theme_minimal()