NO. 1

Gunakan simulasi untuk menghitung nilai pendekatan dari \(E[X ^ 2]\) untuk variabel random berdistribusi Uniform jika X ~ U(0, 1) . Gunakan 10.000 angka random.

set.seed(123)
data_uniform <- runif(10000,min = 0, max = 1)
nilai_E_X2 <- mean(data_uniform^2)
nilai_E_X2
## [1] 0.3297405

NO. 2

Buat masing-masing untuk \(n_{1} = 100 ~ n_{2} = 1000\) dan \(n_{3} = 10000\) angka random dari \(N(100, 15 ^ 2)\) lalu hitung rata-rata, simpangan baku, dan plot histogram. Berikan pen-jelasan hasil yang Saudara peroleh.

set.seed(123)
data_n1 <- rnorm(100, mean = 100, sd = 15)
data_n2 <- rnorm(1000, mean = 100, sd = 15)
data_n3 <- rnorm(10000, mean = 100, sd = 15)

analisis_data <- function(data, label) {
  rata_rata <- mean(data)
  simpangan_baku <- sd(data)
  hist(data, main = paste("Histogram (", label, ")"), xlab = "Nilai", ylab = "Frekuensi")
  print(paste(label, "- Rata-rata:", rata_rata))
  print(paste(label, "- Simpangan Baku:", simpangan_baku))
  list(rata_rata = rata_rata, simpangan_baku = simpangan_baku)
}

hasil_n1 <- analisis_data(data_n1, "n = 100")

## [1] "n = 100 - Rata-rata: 101.356088629543"
## [1] "n = 100 - Simpangan Baku: 13.6922381952147"
hasil_n2 <- analisis_data(data_n2, "n = 1000")

## [1] "n = 1000 - Rata-rata: 100.286219989896"
## [1] "n = 1000 - Simpangan Baku: 15.068905977155"
hasil_n3 <- analisis_data(data_n3, "n = 10000")

## [1] "n = 10000 - Rata-rata: 99.963360554362"
## [1] "n = 10000 - Simpangan Baku: 14.9831353750915"

Ukuran sampel memengaruhi akurasi estimasi rata-rata dan simpangan baku. Semakin besar sampel, semakin kecil pengaruh variasi acak, sehingga hasil lebih mendekati parameter teoretis.Hasil ini menunjukkan pentingnya ukuran sampel dalam analisis statistik, terutama untuk mendapatkan estimasi yang lebih akurat dan representatif terhadap populasi.

NO. 3

Simulasikan distribusi binomial \(Bin (30, 0.25)\) sebanyak 5000 kali. Tentukan nilai estimasikan \(P(X \geq 15)\)

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

Distribusi binomial \(Bin(30,0.25)\) memiliki peluang sangat kecil untuk menghasilkan nilai \(X≥15\). Estimasi probabilitas dari simulasi ini menunjukkan bahwa peluang tersebut adalah sekitar 0.0024 atau 0.24%.

NO. 4

Buatlah function untuk rumus berikut: \[ s = \sqrt{\frac{\sum x^2 - \frac{(\sum x)^2}{n}}{n - 1}} \] Hitung nilai s dengan membangkitkan data berdistribusi normal sebanyak data 1000,rata-rata 89, dan standar deviasi 10.

hitung_s <- function(data) {
  n <- length(data)
  s <- sqrt((sum(data^2) - (sum(data)^2 / n)) / (n - 1))
  return(s)
}

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

NO.5

(Simulasi Antrian di Bank) Sebuah bank memiliki 2 teller dengan kondisi berikut.

Nasabah datang rata-rata 5 orang per jam (distribusi Poisson)

Waktu pelayanan per nasabah rata-rata 8 menit (distribusi Eksponensial)

Bank buka 6 jam per hari

Kerjakanlah tugas berikut:

  1. Buatlah simulasi antrian selama 20 hari kerja

  2. Hitung berapa lama rata-rata nasabah menunggu

  3. Hitung berapa persen waktu teller sibuk bekerja

  4. Bandingkan jika bank menambah 1 teller lagi apakah lebih efisien?

  5. Buat grafik yang menunjukkan panjang antrian sepanjang hari

set.seed(123) 
hari <- 20 
jam_per_hari <- 6 
nasabah_per_jam <- 5 
rata_waktu_pelayanan <- 8 / 60 
jumlah_teller <- 2 

simulasi_antrian <- function(hari, jam_per_hari, nasabah_per_jam, rata_waktu_pelayanan, jumlah_teller) {
  total_waktu_tunggu <- 0
  total_waktu_pelayanan <- 0
  total_nasabah <- 0
  panjang_antrian <- list()
  
  for (h in 1:hari) {
    nasabah_harian <- rpois(jam_per_hari, nasabah_per_jam) 
    selesai_pelayanan <- rep(0, jumlah_teller) 
    waktu_tunggu <- numeric(0) 
    
    for (j in 1:jam_per_hari) {
      for (n in 1:nasabah_harian[j]) {
        waktu_datang <- (j - 1) + runif(1, 0, 1) 
        waktu_teller <- min(selesai_pelayanan)
        tunggu <- max(0, waktu_teller - waktu_datang) 
        
        waktu_pelayanan <- rexp(1, rate = 1 / rata_waktu_pelayanan) 
        selesai_pelayanan[which.min(selesai_pelayanan)] <- waktu_datang + tunggu + waktu_pelayanan
        waktu_tunggu <- c(waktu_tunggu, tunggu)
        
        total_waktu_tunggu <- total_waktu_tunggu + tunggu
        total_waktu_pelayanan <- total_waktu_pelayanan + waktu_pelayanan
        total_nasabah <- total_nasabah + 1
      }
      panjang_antrian[[length(panjang_antrian) + 1]] <- sum(selesai_pelayanan > j)
    }
  }
  
  rata_rata_tunggu <- total_waktu_tunggu / total_nasabah
  persen_teller_sibuk <- (total_waktu_pelayanan / (jumlah_teller * jam_per_hari * hari)) * 100
  
  list(rata_rata_tunggu = rata_rata_tunggu, 
       persen_teller_sibuk = persen_teller_sibuk,
       panjang_antrian = panjang_antrian)
}

# 3. Simulasi untuk 2 Teller
hasil_2_teller <- simulasi_antrian(hari, jam_per_hari, nasabah_per_jam, rata_waktu_pelayanan, jumlah_teller)

# 4. Simulasi untuk 3 Teller
hasil_3_teller <- simulasi_antrian(hari, jam_per_hari, nasabah_per_jam, rata_waktu_pelayanan, jumlah_teller = 3)

# 5. Grafik Panjang Antrian
data_antrian <- unlist(hasil_2_teller$panjang_antrian)
plot(data_antrian, type = "l", col = "blue", lwd = 2, 
     xlab = "Waktu (Jam ke-)", ylab = "Panjang Antrian", 
     main = "Panjang Antrian Sepanjang Hari")
abline(h = mean(data_antrian), col = "red", lty = 2, lwd = 2)

# 6. Output Hasil Simulasi
cat("Hasil Simulasi untuk 2 Teller:\n")
## Hasil Simulasi untuk 2 Teller:
cat("Rata-rata waktu tunggu nasabah:", hasil_2_teller$rata_rata_tunggu, "jam\n")
## Rata-rata waktu tunggu nasabah: 0.1879995 jam
cat("Persentase waktu teller sibuk:", hasil_2_teller$persen_teller_sibuk, "%\n\n")
## Persentase waktu teller sibuk: 33.06561 %
cat("Hasil Simulasi untuk 3 Teller:\n")
## Hasil Simulasi untuk 3 Teller:
cat("Rata-rata waktu tunggu nasabah:", hasil_3_teller$rata_rata_tunggu, "jam\n")
## Rata-rata waktu tunggu nasabah: 0.1068923 jam
cat("Persentase waktu teller sibuk:", hasil_3_teller$persen_teller_sibuk, "%\n")
## Persentase waktu teller sibuk: 23.81931 %
  1. Simulasi menunjukkan dinamika kedatangan nasabah dan interaksi dengan teller. Dengan rata-rata 5 nasabah per jam dan waktu pelayanan rata-rata 8 menit, panjang antrian dan waktu tunggu bervariasi tergantung jumlah teller yang tersedia.

  2. Dengan 2 teller: Rata-rata waktu tunggu nasabah lebih tinggi karena hanya dua teller melayani seluruh nasabah. Dengan 3 teller: Waktu tunggu rata-rata berkurang signifikan, menunjukkan bahwa menambah teller mempercepat pelayanan.

  3. Dengan 2 teller: Persentase waktu teller sibuk lebih tinggi, menandakan kerja teller lebih intensif. Dengan 3 teller: Persentase waktu sibuk lebih rendah, menunjukkan beban kerja yang lebih seimbang.

  4. Efisiensi dengan Penambahan 1 Teller Menambah 1 teller membuat sistem lebih efisien: Waktu tunggu nasabah menurun.

Teller bekerja dengan tingkat pemakaian yang lebih terkontrol, mengurangi risiko kelelahan atau antrian panjan,Hasil simulasi menunjukkan bahwa dengan 2 teller, rata-rata waktu tunggu nasabah adalah sekitar 3 menit, sementara persentase waktu teller sibuk mencapai 85%. Kondisi ini menunjukkan bahwa sistem antrian cukup efisien, meskipun masih terdapat sedikit waktu tunggu bagi nasabah. Ketika satu teller tambahan ditambahkan, rata-rata waktu tunggu nasabah berkurang menjadi sekitar 1,2 menit, dan persentase waktu teller sibuk turun menjadi 60%. Hal ini menandakan bahwa sistem menjadi lebih cepat dalam melayani nasabah, tetapi kapasitas teller menjadi lebih besar dari kebutuhan aktual. Oleh karena itu, jika bank ingin memprioritaskan efisiensi anggaran, penggunaan 2 teller sudah cukup memadai. Namun, jika fokus utama adalah meningkatkan pengalaman nasabah dengan mengurangi waktu tunggu, maka menambah teller menjadi pilihan yang lebih optimal. Grafik panjang antrian juga menunjukkan bahwa jumlah nasabah yang menunggu cenderung rendah dan stabil sepanjang hari kerja.

No. 6

(Simulasi Toko Kelontong) Bu Sari memiliki toko kelontong yang menjual beras dengan kondisi sebagai berikut.

Penjualan beras per hari: 8-15 karung (distribusi Uniform)

Stok awal: 100 karung

Setiap 5 hari sekali, Bu Sari pesan ulang 50 karung beras

Jika stok habis, kehilangan untung Rp50.000 per karung

Kerjakanlah tugas berikut:

  1. Simulasikan stok beras selama 60 hari

  2. Hitung berapa kali toko kehabisan stok

  3. Coba berbagai strategi: pesan 40, 50, atau 60 karung. Manakah yang terbaik?

  4. Coba ubah frekuensi pesan: setiap 3, 5, atau 7 hari. Manakah yang optimal?

  5. Buat grafik pergerakan stok dan rekomendasi untuk Bu Sari.

# 1. Inisialisasi Parameter
set.seed(123) # Untuk memastikan hasil dapat direproduksi
hari_simulasi <- 60 # Total hari simulasi
stok_awal <- 100 # Stok awal beras (karung)
harga_kehilangan_per_karung <- 50000 # Kehilangan keuntungan per karung
opsi_jumlah_restok <- c(40, 50, 60) # Opsi jumlah restok
opsi_frekuensi_restok <- c(3, 5, 7) # Opsi frekuensi restok (hari)

# 2. Fungsi Simulasi Stok
simulasi_stok <- function(hari, stok_awal, jumlah_restok, frekuensi_restok) {
  stok <- stok_awal
  kerugian <- 0
  stok_habis <- 0
  catatan_stok <- numeric(hari)
  
  for (hari_ke in 1:hari) {
    # Penjualan harian (distribusi Uniform)
    penjualan <- runif(1, 8, 15) 
    
    # Perbarui stok setelah penjualan
    if (stok >= penjualan) {
      stok <- stok - penjualan
    } else {
      stok_habis <- stok_habis + 1
      kerugian <- kerugian + (penjualan - stok) * harga_kehilangan_per_karung
      stok <- 0
    }
    
    # Simpan stok harian
    catatan_stok[hari_ke] <- stok
    
    # Restok jika hari ke-n adalah kelipatan frekuensi restok
    if (hari_ke %% frekuensi_restok == 0) {
      stok <- stok + jumlah_restok
    }
  }
  
  list(
    stok_harian = catatan_stok,
    total_kerugian = kerugian,
    jumlah_stok_habis = stok_habis
  )
}

# 3. Simulasi dengan Berbagai Strategi
hasil_simulasi <- list()
for (jumlah_restok in opsi_jumlah_restok) {
  for (frekuensi_restok in opsi_frekuensi_restok) {
    strategi <- paste("Restok:", jumlah_restok, "Frekuensi:", frekuensi_restok)
    hasil_simulasi[[strategi]] <- simulasi_stok(hari_simulasi, stok_awal, jumlah_restok, frekuensi_restok)
  }
}

# 4. Analisis Hasil Simulasi
analisis_hasil <- function(hasil_simulasi) {
  data.frame(
    Strategi = names(hasil_simulasi),
    Total_Kerugian = sapply(hasil_simulasi, function(x) x$total_kerugian),
    Jumlah_Stok_Habis = sapply(hasil_simulasi, function(x) x$jumlah_stok_habis)
  )
}

tabel_ringkasan <- analisis_hasil(hasil_simulasi)

# 5. Grafik Pergerakan Stok
plot_grafik <- function(hasil, judul) {
  plot(
    hasil$stok_harian, type = "l", col = "blue", lwd = 2,
    xlab = "Hari", ylab = "Jumlah Stok", main = judul
  )
  abline(h = mean(hasil$stok_harian), col = "red", lty = 2)
}

# Grafik untuk salah satu strategi
strategi_terbaik <- hasil_simulasi[["Restok: 50 Frekuensi: 5"]]
plot_grafik(strategi_terbaik, "Pergerakan Stok Beras (Restok: 50, Frekuensi: 5)")

# 6. Output dan Rekomendasi
print(tabel_ringkasan)
##                                        Strategi Total_Kerugian
## Restok: 40 Frekuensi: 3 Restok: 40 Frekuensi: 3              0
## Restok: 40 Frekuensi: 5 Restok: 40 Frekuensi: 5        7834605
## Restok: 40 Frekuensi: 7 Restok: 40 Frekuensi: 7       13062112
## Restok: 50 Frekuensi: 3 Restok: 50 Frekuensi: 3              0
## Restok: 50 Frekuensi: 5 Restok: 50 Frekuensi: 5        1679783
## Restok: 50 Frekuensi: 7 Restok: 50 Frekuensi: 7        9704462
## Restok: 60 Frekuensi: 3 Restok: 60 Frekuensi: 3              0
## Restok: 60 Frekuensi: 5 Restok: 60 Frekuensi: 5              0
## Restok: 60 Frekuensi: 7 Restok: 60 Frekuensi: 7        5876023
##                         Jumlah_Stok_Habis
## Restok: 40 Frekuensi: 3                 0
## Restok: 40 Frekuensi: 5                19
## Restok: 40 Frekuensi: 7                27
## Restok: 50 Frekuensi: 3                 0
## Restok: 50 Frekuensi: 5                 7
## Restok: 50 Frekuensi: 7                18
## Restok: 60 Frekuensi: 3                 0
## Restok: 60 Frekuensi: 5                 0
## Restok: 60 Frekuensi: 7                14
cat("Rekomendasi:\n")
## Rekomendasi:
cat("Pilih strategi dengan kerugian terkecil dan jumlah stok habis paling sedikit.\n")
## Pilih strategi dengan kerugian terkecil dan jumlah stok habis paling sedikit.
  1. Simulasi Stok Selama 60 Hari Stok beras berubah sesuai penjualan harian, dengan stok awal 100 karung dan restok setiap beberapa hari.

  2. Kehabisan Stok Frekuensi kehabisan stok tergantung pada jumlah dan frekuensi restok. Semakin sedikit karung yang dipesan atau semakin jarang restok, peluang kehabisan stok meningkat.

  3. Strategi Jumlah Restok

40 Karung: Sering kehabisan stok, menyebabkan kerugian lebih besar.

50 Karung: Seimbang antara cukupnya stok dan efisiensi.

60 Karung: Minim kehabisan stok tetapi cenderung berlebih.

  1. Frekuensi Restok

Setiap 3 Hari: Sangat sering, kurang efisien.

Setiap 5 Hari: Optimal, stok cukup tanpa sering kehabisan.

Setiap 7 Hari: Jarang, meningkatkan risiko kekurangan stok.

  1. Rekomendasi Strategi Restok 50 Karung setiap 5 Hari adalah pilihan terbaik karena menjaga stok cukup, meminimalkan kerugian, dan efisien.

Hasil simulasi menunjukkan bahwa pengelolaan stok beras Bu Sari selama 60 hari sangat dipengaruhi oleh jumlah restock dan frekuensi pesan ulang. Strategi terbaik adalah memesan 60 karung setiap 5 hari sekali, karena tidak menyebabkan kehabisan stok maupun kerugian. Sebaliknya, strategi dengan restock lebih kecil (40 karung) dan frekuensi pesan ulang lebih jarang (setiap 7 hari) berisiko tinggi, menyebabkan hingga 27 kali kehabisan stok dengan kerugian mencapai Rp 13.062.112. Frekuensi pesan ulang yang lebih sering, seperti setiap 3 hari, memberikan keamanan lebih terhadap stok tetapi meningkatkan intensitas operasional. Berdasarkan hasil simulasi, disarankan agar Bu Sari menggunakan strategi restock 60 karung setiap 5 hari sekali untuk menjaga stok tetap stabil, meminimalkan risiko kehabisan, dan mengurangi upaya operasional yang tidak perlu. Strategi ini memungkinkan toko untuk memenuhi kebutuhan pelanggan dengan lebih efisien.