Jawaban :

# set seed
set.seed(123)

n <- 10000

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

# Lalu menghitung nilai pendekatan dari X^2

nilai_ekspektasi <- mean(x^2)

# Menampilkan Hasil
cat("Hasil pendekatan dari E[X^2] adalah: ", nilai_ekspektasi, "\n")
## Hasil pendekatan dari E[X^2] adalah:  0.3297405
# set seed
set.seed(123)

# Parameter Distribusi
mean_data <- 100
sd_data <- 15

n1 <- 100
n2 <- 1000
n3 <- 10000

# Generate Data
data_n1 <- rnorm(n1,mean = mean_data, sd = sd_data)
data_n2 <- rnorm(n2,mean = mean_data, sd = sd_data)
data_n3 <- rnorm(n3,mean = mean_data, sd = sd_data)

# Hasil statistik deskriptif
statistik <- function(data, n_label) {
  cat("===== Statistik untuk n =", n_label, "=====\n")
  cat("Mean              :", mean(data), "\n")
  cat("Simpangan Baku    :", sd(data), "\n\n")
}

statistik(data_n1, n1)
## ===== Statistik untuk n = 100 =====
## Mean              : 101.3561 
## Simpangan Baku    : 13.69224
statistik(data_n2, n2)
## ===== Statistik untuk n = 1000 =====
## Mean              : 100.2862 
## Simpangan Baku    : 15.06891
statistik(data_n3, n3)
## ===== Statistik untuk n = 10000 =====
## Mean              : 99.96336 
## Simpangan Baku    : 14.98314
# Plot histogram
par(mfrow = c(1,3))  # 3 plot dalam 1 baris
hist(data_n1, main = "Histogram n = 100", xlab = "Nilai", col = "lightblue", breaks = 20)
hist(data_n2, main = "Histogram n = 1000", xlab = "Nilai", col = "lightgreen", breaks = 30)
hist(data_n3, main = "Histogram n = 10000", xlab = "Nilai", col = "lightpink", breaks = 40)

Berdasarkan output yang dihasilkan, terlihat bahwa semakin besar ukuran sampel, nilai mean dan simpangan baku semakin mendekati parameter sebenarnya dari distribusi normal yaitu mean 100 dan simpangan baku 15. Untuk n = 100, nilai mean masih cukup menyimpang (101.36) dan simpangan baku juga lebih kecil dari seharusnya (13.69), menunjukkan variabilitas estimasi yang lebih besar. Pada n = 1000 dan n = 10000, hasil mean dan simpangan baku semakin stabil dan mendekati nilai sebenarnya, mencerminkan prinsip hukum bilangan besar, di mana estimasi statistik akan semakin akurat seiring bertambahnya ukuran sampel.

# Set seed untuk replikasi
set.seed(123)

# Simulasi 5000 kali dari Binomial(n = 30, p = 0.25)
simulasi <- rbinom(5000, size = 30, prob = 0.25)

# Hitung estimasi P[X >= 15]
p_estimasi <- mean(simulasi >= 15)

# Tampilkan hasil
cat("Estimasi P[X >= 15] dari simulasi:", p_estimasi, "\n")
## Estimasi P[X >= 15] dari simulasi: 0.0024
# Fungsi untuk menghitung simpangan baku manual
simpangan_baku_manual <- 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)
}

# Contoh penggunaan sebanyak data 1000,mean 89,sd 10
set.seed(1)
data <- rnorm(1000, mean = 89, sd = 10)
simpangan_baku_manual(data)
## [1] 10.34916
simulasi_antrian <- function(jumlah_teller = 2, seed = 123) {
  set.seed(seed)
  
  # Parameter simulasi
  lambda <- 5 / 60  # Tingkat kedatangan (5 nasabah/jam -> per menit)
  mu <- 1 / 8       # Tingkat layanan (1 nasabah/8 menit)
  total_menit_perhari <- 6 * 60  # 360 menit per hari
  total_hari <- 20
  total_menit <- total_menit_perhari * total_hari  # 7200 menit (20 hari)
  
  # Simulasi kedatangan nasabah
  kedatangan <- cumsum(rexp(10000, rate = lambda))
  kedatangan <- kedatangan[kedatangan <= total_menit]
  jumlah_nasabah <- length(kedatangan)
  layanan <- rexp(jumlah_nasabah, rate = mu)
  
  # Inisialisasi variabel
  mulai_layanan <- numeric(jumlah_nasabah)
  selesai_layanan <- numeric(jumlah_nasabah)
  teller_selesai <- rep(0, jumlah_teller)
  teller_kerja <- integer(jumlah_nasabah)
  
  # Simulasi layanan
  for (i in 1:jumlah_nasabah) {
    teller <- which.min(teller_selesai)
    mulai <- max(kedatangan[i], teller_selesai[teller])
    selesai <- mulai + layanan[i]
    
    mulai_layanan[i] <- mulai
    selesai_layanan[i] <- selesai
    teller_selesai[teller] <- selesai
    teller_kerja[i] <- teller
  }
  
  # Hitung metrik kinerja
  waktu_tunggu <- mulai_layanan - kedatangan
  total_waktu <- max(selesai_layanan)
  util <- sapply(1:jumlah_teller, function(j) {
    sum(layanan[teller_kerja == j]) / total_waktu * 100
  })
  
  # Hitung panjang antrian per menit (untuk grafik)
  waktu_poin <- 0:(total_menit - 1)  # Menit 0 sampai 7199
  n_datang <- sapply(waktu_poin, function(t) sum(kedatangan <= t))
  n_selesai <- sapply(waktu_poin, function(t) sum(selesai_layanan <= t))
  n_sistem <- n_datang - n_selesai
  panjang_antrian <- pmax(0, n_sistem - jumlah_teller)
  
  # Rata-rata panjang antrian per hari
  antrian_mat <- matrix(panjang_antrian, nrow = total_menit_perhari, ncol = total_hari)
  antrian_rata <- rowMeans(antrian_mat)
  
  # Hasil akhir
  list(
    teller = jumlah_teller,
    nasabah = jumlah_nasabah,
    rata_tunggu = mean(waktu_tunggu),
    max_tunggu = max(waktu_tunggu),
    utilisasi = util,
    antrian_rata = antrian_rata
  )
}
# Jalankan simulasi
hasil_2 <- simulasi_antrian(2)
hasil_3 <- simulasi_antrian(3)
# Tampilkan hasil
cat("=== 2 TELLER ===\n")
## === 2 TELLER ===
cat("Jumlah nasabah:", hasil_2$nasabah, "\n")
## Jumlah nasabah: 601
cat("Rata-rata tunggu:", round(hasil_2$rata_tunggu, 2), "menit\n")
## Rata-rata tunggu: 1.24 menit
cat("Max tunggu:", round(hasil_2$max_tunggu, 2), "menit\n")
## Max tunggu: 40.48 menit
cat("Utilisasi teller:", paste(round(hasil_2$utilisasi, 2), "%", collapse = ", "), "\n\n")
## Utilisasi teller: 34.89 %, 33.61 %
cat("=== 3 TELLER ===\n")
## === 3 TELLER ===
cat("Jumlah nasabah:", hasil_3$nasabah, "\n")
## Jumlah nasabah: 601
cat("Rata-rata tunggu:", round(hasil_3$rata_tunggu, 2), "menit\n")
## Rata-rata tunggu: 0.15 menit
cat("Max tunggu:", round(hasil_3$max_tunggu, 2), "menit\n")
## Max tunggu: 9.48 menit
cat("Utilisasi teller:", paste(round(hasil_3$utilisasi, 2), "%", collapse = ", "))
## Utilisasi teller: 22.88 %, 23.84 %, 21.79 %

Waktu tunggu menjadi sangat cepat, namun efisiensi terhadap tellernya turun.

# Buat grafik
waktu_jam <- seq(0, 5.98, length.out = 360)  # Konversi menit ke jam (6 jam kerja)

plot(waktu_jam, hasil_2$antrian_rata, type = "l", col = "red",
     xlab = "Jam Operasional", ylab = "Rata-rata Panjang Antrian",
     main = "Panjang Antrian Rata-rata (20 Hari)",
     ylim = c(0, max(hasil_2$antrian_rata, hasil_3$antrian_rata) + 1))
lines(waktu_jam, hasil_3$antrian_rata, col = "blue")
abline(v = 0:6, lty = 3, col = "gray")  # Garis pembatas jam
legend("topright", legend = c("2 Teller", "3 Teller"), 
       col = c("red", "blue"), lty = 1, cex = 0.8)

  1. A.Simulasi Stok Beras Selama 60 Hari
# Set seed untuk reproducibility
set.seed(123)

# Parameter awal
stok_awal <- 100
hari_simulasi <- 60
frekuensi_pesan <- 5
jumlah_pesan <- 50
kerugian_per_karung <- 50000

# Fungsi simulasi stok
simulasi_stok <- function(hari_total, stok_awal, frekuensi_pesan, jumlah_pesan) {
  stok <- numeric(hari_total + 1)
  stok[1] <- stok_awal
  
  penjualan_harian <- numeric(hari_total)
  stockout_days <- 0
  total_kerugian <- 0
  
  for (hari in 1:hari_total) {
    # Generate penjualan harian (uniform distribution 8-15 karung)
    penjualan_harian[hari] <- round(runif(1, min = 8, max = 15))
    
    # Update stok setelah penjualan
    stok_tersedia <- max(0, stok[hari])
    penjualan_aktual <- min(penjualan_harian[hari], stok_tersedia)
    stok_setelah_jual <- stok_tersedia - penjualan_aktual
    
    # Hitung kerugian jika stockout
    if (penjualan_harian[hari] > stok_tersedia) {
      kerugian_karung <- penjualan_harian[hari] - stok_tersedia
      total_kerugian <- total_kerugian + (kerugian_karung * kerugian_per_karung)
      stockout_days <- stockout_days + 1
    }
    
    # Pesan ulang setiap frekuensi_pesan hari
    if (hari %% frekuensi_pesan == 0) {
      stok[hari + 1] <- stok_setelah_jual + jumlah_pesan
    } else {
      stok[hari + 1] <- stok_setelah_jual
    }
  }
  
  return(list(
    stok = stok,
    penjualan = penjualan_harian,
    stockout_days = stockout_days,
    total_kerugian = total_kerugian
  ))
}

# Jalankan simulasi
hasil_simulasi <- simulasi_stok(hari_simulasi, stok_awal, frekuensi_pesan, jumlah_pesan)

# Tampilkan hasil
cat("=== HASIL SIMULASI 60 HARI ===\n")
## === HASIL SIMULASI 60 HARI ===
cat("Stok akhir:", tail(hasil_simulasi$stok, 1), "karung\n")
## Stok akhir: 50 karung
cat("Jumlah hari kehabisan stok:", hasil_simulasi$stockout_days, "hari\n")
## Jumlah hari kehabisan stok: 9 hari
cat("Total kerugian: Rp", format(hasil_simulasi$total_kerugian, big.mark = ".", decimal.mark = ","), "\n")
## Total kerugian: Rp 2.200.000
# Tampilkan 10 hari pertama sebagai contoh
cat("\n=== CONTOH 10 HARI PERTAMA ===\n")
## 
## === CONTOH 10 HARI PERTAMA ===
for (i in 1:10) {
  cat(sprintf("Hari %2d: Stok awal = %3d, Penjualan = %2d, Stok akhir = %3d\n", 
              i, hasil_simulasi$stok[i], hasil_simulasi$penjualan[i], hasil_simulasi$stok[i+1]))
}
## Hari  1: Stok awal = 100, Penjualan = 10, Stok akhir =  90
## Hari  2: Stok awal =  90, Penjualan = 14, Stok akhir =  76
## Hari  3: Stok awal =  76, Penjualan = 11, Stok akhir =  65
## Hari  4: Stok awal =  65, Penjualan = 14, Stok akhir =  51
## Hari  5: Stok awal =  51, Penjualan = 15, Stok akhir =  86
## Hari  6: Stok awal =  86, Penjualan =  8, Stok akhir =  78
## Hari  7: Stok awal =  78, Penjualan = 12, Stok akhir =  66
## Hari  8: Stok awal =  66, Penjualan = 14, Stok akhir =  52
## Hari  9: Stok awal =  52, Penjualan = 12, Stok akhir =  40
## Hari 10: Stok awal =  40, Penjualan = 11, Stok akhir =  79

B.Hitung Berapa Kali Toko Kehabisan Stok

# Analisis detail stockout
cat("=== ANALISIS KEHABISAN STOK ===\n")
## === ANALISIS KEHABISAN STOK ===
cat("Jumlah hari mengalami stockout:", hasil_simulasi$stockout_days, "dari", hari_simulasi, "hari\n")
## Jumlah hari mengalami stockout: 9 dari 60 hari
cat("Persentase hari stockout:", round((hasil_simulasi$stockout_days / hari_simulasi) * 100, 2), "%\n")
## Persentase hari stockout: 15 %
cat("Total kerugian karena stockout: Rp", format(hasil_simulasi$total_kerugian, big.mark = ".", decimal.mark = ","), "\n")
## Total kerugian karena stockout: Rp 2.200.000
cat("Rata-rata kerugian per hari: Rp", format(hasil_simulasi$total_kerugian / hari_simulasi, big.mark = ".", decimal.mark = ","), "\n")
## Rata-rata kerugian per hari: Rp 36.666,67
# Identifikasi hari-hari stockout
hari_stockout <- which(hasil_simulasi$stok[1:hari_simulasi] < hasil_simulasi$penjualan)
if (length(hari_stockout) > 0) {
  cat("\nHari-hari yang mengalami stockout:", paste(hari_stockout, collapse = ", "), "\n")
}
## 
## Hari-hari yang mengalami stockout: 25, 30, 34, 35, 40, 45, 50, 55, 60
  1. Perbandingan Strategi Jumlah Pemesanan (40, 50, 60 karung)
# Fungsi untuk menguji berbagai strategi
uji_strategi_jumlah <- function(jumlah_pesan_list) {
  hasil_strategi <- data.frame(
    Jumlah_Pesan = integer(),
    Stockout_Days = integer(),
    Total_Kerugian = numeric(),
    Rata_Kerugian_Harian = numeric()
  )
  
  for (jumlah in jumlah_pesan_list) {
    set.seed(123)  # Gunakan seed yang sama untuk perbandingan fair
    hasil <- simulasi_stok(hari_simulasi, stok_awal, frekuensi_pesan, jumlah)
    
    hasil_strategi <- rbind(hasil_strategi, data.frame(
      Jumlah_Pesan = jumlah,
      Stockout_Days = hasil$stockout_days,
      Total_Kerugian = hasil$total_kerugian,
      Rata_Kerugian_Harian = hasil$total_kerugian / hari_simulasi
    ))
  }
  
  return(hasil_strategi)
}

# Test strategi jumlah pemesanan
strategi_jumlah <- c(40, 50, 60)
hasil_strategi_jumlah <- uji_strategi_jumlah(strategi_jumlah)

cat("=== PERBANDINGAN STRATEGI JUMLAH PEMESANAN ===\n")
## === PERBANDINGAN STRATEGI JUMLAH PEMESANAN ===
print(hasil_strategi_jumlah)
##   Jumlah_Pesan Stockout_Days Total_Kerugian Rata_Kerugian_Harian
## 1           40            19        7700000            128333.33
## 2           50             9        2200000             36666.67
## 3           60             0              0                 0.00
# Cari strategi terbaik
strategi_terbaik_idx <- which.min(hasil_strategi_jumlah$Total_Kerugian)
cat("\nStrategi terbaik: Pesan", hasil_strategi_jumlah$Jumlah_Pesan[strategi_terbaik_idx], "karung\n")
## 
## Strategi terbaik: Pesan 60 karung
cat("Dengan total kerugian: Rp", format(hasil_strategi_jumlah$Total_Kerugian[strategi_terbaik_idx], big.mark = ".", decimal.mark = ","), "\n")
## Dengan total kerugian: Rp 0

D. Perbandingan Frekuensi Pemesanan (3, 5, 7 hari)

# Fungsi untuk menguji berbagai frekuensi
uji_strategi_frekuensi <- function(frekuensi_list) {
  hasil_frekuensi <- data.frame(
    Frekuensi_Pesan = integer(),
    Stockout_Days = integer(),
    Total_Kerugian = numeric(),
    Rata_Kerugian_Harian = numeric()
  )
  
  for (frek in frekuensi_list) {
    set.seed(123)  # Gunakan seed yang sama untuk perbandingan fair
    hasil <- simulasi_stok(hari_simulasi, stok_awal, frek, jumlah_pesan)
    
    hasil_frekuensi <- rbind(hasil_frekuensi, data.frame(
      Frekuensi_Pesan = frek,
      Stockout_Days = hasil$stockout_days,
      Total_Kerugian = hasil$total_kerugian,
      Rata_Kerugian_Harian = hasil$total_kerugian / hari_simulasi
    ))
  }
  
  return(hasil_frekuensi)
}

# Test strategi frekuensi pemesanan
strategi_frekuensi <- c(3, 5, 7)
hasil_strategi_frekuensi <- uji_strategi_frekuensi(strategi_frekuensi)

cat("=== PERBANDINGAN STRATEGI FREKUENSI PEMESANAN ===\n")
## === PERBANDINGAN STRATEGI FREKUENSI PEMESANAN ===
print(hasil_strategi_frekuensi)
##   Frekuensi_Pesan Stockout_Days Total_Kerugian Rata_Kerugian_Harian
## 1               3             0              0                 0.00
## 2               5             9        2200000             36666.67
## 3               7            20        9850000            164166.67
# Cari frekuensi terbaik
frekuensi_terbaik_idx <- which.min(hasil_strategi_frekuensi$Total_Kerugian)
cat("\nFrekuensi terbaik: Setiap", hasil_strategi_frekuensi$Frekuensi_Pesan[frekuensi_terbaik_idx], "hari\n")
## 
## Frekuensi terbaik: Setiap 3 hari
cat("Dengan total kerugian: Rp", format(hasil_strategi_frekuensi$Total_Kerugian[frekuensi_terbaik_idx], big.mark = ".", decimal.mark = ","), "\n")
## Dengan total kerugian: Rp 0

E. Grafik Pergerakan Stok dan Rekomendasi

  library(ggplot2)

# Buat data untuk grafik
data_grafik <- data.frame(
  Hari = 0:hari_simulasi,
  Stok = hasil_simulasi$stok,
  Penjualan = c(0, hasil_simulasi$penjualan)
)

# Grafik pergerakan stok
grafik_stok <- ggplot(data_grafik, aes(x = Hari)) +
  geom_line(aes(y = Stok), color = "blue", linewidth = 1, alpha = 0.8) +
  geom_point(aes(y = Stok), color = "blue", size = 0.8) +
  geom_hline(yintercept = 0, color = "red", linetype = "dashed", alpha = 0.7) +
  geom_hline(yintercept = mean(hasil_simulasi$penjualan), color = "green", linetype = "dotted", alpha = 0.7) +
  labs(
    title = "Pergerakan Stok Beras Bu Sari (60 Hari)",
    subtitle = "Garis merah: Stok habis | Garis hijau: Rata-rata penjualan harian",
    x = "Hari",
    y = "Jumlah Stok (Karung)",
    caption = "Simulasi dengan pemesanan 50 karung setiap 5 hari"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    plot.subtitle = element_text(hjust = 0.5)
  )

print(grafik_stok)

# Grafik perbandingan strategi
data_perbandingan <- rbind(
  data.frame(Strategi = paste("Jumlah", hasil_strategi_jumlah$Jumlah_Pesan), 
             Kerugian = hasil_strategi_jumlah$Total_Kerugian,
             Kategori = "Jumlah Pemesanan"),
  data.frame(Strategi = paste("Setiap", hasil_strategi_frekuensi$Frekuensi_Pesan, "hari"), 
             Kerugian = hasil_strategi_frekuensi$Total_Kerugian,
             Kategori = "Frekuensi Pemesanan")
)

grafik_perbandingan <- ggplot(data_perbandingan, aes(x = Strategi, y = Kerugian, fill = Kategori)) +
  geom_col(position = "dodge", alpha = 0.8) +
  geom_text(aes(label = paste("Rp", round(Kerugian/1000, 1), "K")), 
            vjust = -0.5, size = 3) +
  labs(
    title = "Perbandingan Total Kerugian Berbagai Strategi",
    x = "Strategi",
    y = "Total Kerugian (Rp)",
    fill = "Kategori Strategi"
  ) +
  theme_minimal() +
  theme(
    plot.title = element_text(hjust = 0.5, face = "bold"),
    axis.text.x = element_text(angle = 45, hjust = 1)
  )

print(grafik_perbandingan)

# REKOMENDASI UNTUK BU SARI
cat("\n", paste(rep("=", 50), collapse = ""), "\n")
## 
##  ==================================================
cat("           REKOMENDASI UNTUK BU SARI\n")
##            REKOMENDASI UNTUK BU SARI
cat(paste(rep("=", 50), collapse = ""), "\n")
## ==================================================
cat("Berdasarkan analisis simulasi 60 hari:\n\n")
## Berdasarkan analisis simulasi 60 hari:
cat("1. KONDISI SAAT INI (50 karung setiap 5 hari):\n")
## 1. KONDISI SAAT INI (50 karung setiap 5 hari):
cat("   - Mengalami stockout", hasil_simulasi$stockout_days, "hari dari 60 hari\n")
##    - Mengalami stockout 9 hari dari 60 hari
cat("   - Total kerugian: Rp", format(hasil_simulasi$total_kerugian, big.mark = ".", decimal.mark = ","), "\n\n")
##    - Total kerugian: Rp 2.200.000
cat("2. REKOMENDASI JUMLAH PEMESANAN:\n")
## 2. REKOMENDASI JUMLAH PEMESANAN:
strategi_terbaik <- hasil_strategi_jumlah[which.min(hasil_strategi_jumlah$Total_Kerugian),]
cat("   - Sebaiknya pesan", strategi_terbaik$Jumlah_Pesan, "karung setiap kali pesan\n")
##    - Sebaiknya pesan 60 karung setiap kali pesan
cat("   - Dapat mengurangi kerugian menjadi: Rp", format(strategi_terbaik$Total_Kerugian, big.mark = ".", decimal.mark = ","), "\n\n")
##    - Dapat mengurangi kerugian menjadi: Rp 0
cat("3. REKOMENDASI FREKUENSI PEMESANAN:\n")
## 3. REKOMENDASI FREKUENSI PEMESANAN:
frekuensi_terbaik <- hasil_strategi_frekuensi[which.min(hasil_strategi_frekuensi$Total_Kerugian),]
cat("   - Sebaiknya pesan setiap", frekuensi_terbaik$Frekuensi_Pesan, "hari\n")
##    - Sebaiknya pesan setiap 3 hari
cat("   - Dapat mengurangi kerugian menjadi: Rp", format(frekuensi_terbaik$Total_Kerugian, big.mark = ".", decimal.mark = ","), "\n\n")
##    - Dapat mengurangi kerugian menjadi: Rp 0
cat("4. STRATEGI OPTIMAL GABUNGAN:\n")
## 4. STRATEGI OPTIMAL GABUNGAN:
cat("   - Kombinasikan strategi terbaik dari kedua analisis\n")
##    - Kombinasikan strategi terbaik dari kedua analisis
cat("   - Monitor stok harian dan sesuaikan jika ada perubahan pola penjualan\n")
##    - Monitor stok harian dan sesuaikan jika ada perubahan pola penjualan
cat("   - Pertimbangkan buffer stock untuk menghindari stockout\n\n")
##    - Pertimbangkan buffer stock untuk menghindari stockout
cat("5. CATATAN TAMBAHAN:\n")
## 5. CATATAN TAMBAHAN:
cat("   - Rata-rata penjualan harian:", round(mean(hasil_simulasi$penjualan), 1), "karung\n")
##    - Rata-rata penjualan harian: 11.6 karung
cat("   - Stok minimum yang disarankan:", round(mean(hasil_simulasi$penjualan) * 2, 0), "karung\n")
##    - Stok minimum yang disarankan: 23 karung
cat("   - Perlu monitoring berkala untuk penyesuaian strategi\n")
##    - Perlu monitoring berkala untuk penyesuaian strategi