# Nomor 1
## Simulasi nilai pendekatan dari $E[X^2]$ untuk Uniform(0, 10)
set.seed(123)
x <- runif(10000, min = 0, max = 10)
ex2 <- mean(x^2)
ex2
## [1] 32.97405
# Nomor 2
## Simulasi untuk tiga ukuran data dari $N(100, 15^2)$
n1 <- rnorm(100, mean = 100, sd = 15)
n2 <- rnorm(1000, mean = 100, sd = 15)
n3 <- rnorm(10000, mean = 100, sd = 15)
summary_stats <- function(data) {
c(mean = mean(data), sd = sd(data))
}
stat_n1 <- summary_stats(n1)
stat_n2 <- summary_stats(n2)
stat_n3 <- summary_stats(n3)
stat_n1
## mean sd
## 101.02046 13.34109
stat_n2
## mean sd
## 100.49238 14.92385
stat_n3
## mean sd
## 99.97380 15.04648
par(mfrow = c(1, 3)) # tampilkan 3 histogram dalam 1 baris
hist(n1, main = "Histogram n = 100", col = "skyblue", xlab = "Nilai", breaks = 15)
hist(n2, main = "Histogram n = 1000", col = "yellow", xlab = "Nilai", breaks = 30)
hist(n3, main = "Histogram n = 10000", col = "salmon", xlab = "Nilai", breaks = 50)
par(mfrow = c(1, 1)) # reset layout
Penjelasan : Simulasi ini dilakukan untuk melihat bagaimana ukuran sampel memengaruhi estimasi statistik (rata-rata dan simpangan baku) dari suatu populasi yang berdistribusi normal dengan parameter \(N(100, 15^2)\). Berikut hasil pengamatan :
Rata-rata hasil simulasi mendekati nilai teoritis 100, tetapi masih bisa terdapat sedikit deviasi.
Simpangan baku hasil simulasi mendekati nilai teoritis 15.
Histogram masih terlihat kurang halus karena data masih sedikit.
Rata-rata semakin mendekati nilai 100.
Simpangan baku juga makin stabil mendekati 15.
Bentuk histogram mulai menyerupai kurva normal.
Estimasi rata-rata dan simpangan baku sangat mendekati nilai populasi.
Histogram sangat halus dan menyerupai bentuk lonceng distribusi normal (bell-shaped).
Kesimpulan : Semakin besar ukuran sampel, maka estimasi parameter (rata-rata dan simpangan baku) dari data simulasi semakin akurat dan distribusi data semakin mendekati bentuk distribusi normal teoritis
# Nomor 3
## Simulasi distribusi Binomial Bin(30, 0.25) sebanyak 5000 kali
binom_sample <- rbinom(5000, size = 30, prob = 0.25)
p_estimate <- mean(binom_sample >= 15)
p_estimate
## [1] 0.0014
# Nomor 4
## Buatlah fungsi rumus simpangan baku (standar deviasi)
s_custom <- function(x) {
sqrt((sum(x^2) - (sum(x)^2) / length(x)) / (length(x) - 1))
}
# Uji coba fungsi
data_test <- c(10, 12, 8, 9, 11)
s_custom(data_test)
## [1] 1.581139
#Hitungan nilai s dengan data normal 1000, rata-rata 89, dan sd 10
set.seed(123)
# Bangkitkan data dari distribusi normal
data_norm <- rnorm(n = 1000, mean = 89, sd = 10)
# Hitung simpangan baku dengan fungsi buatan
s_custom(data_norm)
## [1] 9.91695
## (a) Buat simulasi antrian selama 20 hari kerja
set.seed(123)
# Parameter
jam_kerja <- 6
hari_kerja <- 20
lama_simulasi <- jam_kerja * 60 * hari_kerja
# Kedatangan nasabah (eksponensial): rata-rata 5 per jam
kedatangan <- as.numeric(cumsum(rexp(1000, rate = 5/60)))
kedatangan <- kedatangan[kedatangan <= lama_simulasi]
# Waktu pelayanan (eksponensial): rata-rata 8 menit
pelayanan <- as.numeric(rexp(length(kedatangan), rate = 1/8))
# Variabel hasil simulasi
mulai_pelayanan <- rep(0, length(kedatangan))
selesai <- rep(0, length(kedatangan))
selesai_teller <- c(0, 0) # dua teller
for (i in 1:length(kedatangan)) {
teller_tersedia <- which.min(selesai_teller)
mulai_pelayanan[i] <- max(kedatangan[i], selesai_teller[teller_tersedia])
selesai[i] <- mulai_pelayanan[i] + pelayanan[i]
selesai_teller[teller_tersedia] <- selesai[i]
}
simulasi_antrian <- head(data.frame(
kedatangan = round(kedatangan, 2),
mulai_dilayani = round(mulai_pelayanan, 2),
selesai_dilayani = round(selesai, 2)
), 10)
simulasi_antrian
## kedatangan mulai_dilayani selesai_dilayani
## 1 10.12 10.12 11.91
## 2 17.04 17.04 17.98
## 3 32.99 32.99 57.40
## 4 33.37 33.37 37.29
## 5 34.04 37.29 53.60
## 6 37.84 53.60 56.10
## 7 41.61 56.10 56.46
## 8 43.35 56.46 58.60
## 9 76.07 76.07 77.95
## 10 76.42 76.42 83.08
# (b) Hitung rata-rata waktu tunggu nasabah dalam antrian
waktu_tunggu <- mulai_pelayanan - kedatangan
mean(waktu_tunggu)
## [1] 0.8116455
Penjelasan : Artinya, rata-rata nasabah hanya perlu menunggu sekitar 49 detik sebelum mulai dilayani. Hal ini menunjukkan bahwa dengan 2 teller, antrian relatif pendek dan pelayanan cukup cepat.
# (c) Hitung persentase waktu teller dalam kondisi sibuk
waktu_sibuk <- sum(pelayanan)
persen_sibuk <- selesai_teller / lama_simulasi* 100
persen_sibuk
## [1] 99.76891 99.69771
Penjelasan : Ini artinya, teller bekerja hampir sepanjang waktu (99.7%) selama jam operasional. Ini menunjukkan efisiensi tinggi, tetapi juga mengindikasikan beban kerja teller yang sangat padat, dengan nyaris tidak ada waktu istirahat
# (d) Bandingkan jika bank menambah 1 teller lagi – apakah lebih efisien?
selesai_teller3 <- c(0, 0, 0)
mulai3 <- rep(0, length(kedatangan))
selesai3 <- rep(0, length(kedatangan))
for (i in 1:length(kedatangan)) {
available <- which.min(selesai_teller3)
mulai3[i] <- max(kedatangan[i], selesai_teller3[available])
selesai3[i] <- mulai3[i] + pelayanan[i]
selesai_teller3[available] <- selesai3[i]
}
mean(mulai3 - kedatangan) # rata-rata tunggu dengan 3 teller
## [1] 0.08019951
Penjelasan : Jika teller ditambah menjadi 3, waktu tunggu rata-rata menurun menjadi 0.80 menit (48 detik). Penurunan ini sangat kecil dibanding 2 teller (0.811 menit), sehingga menambah 1 teller tidak memberikan dampak signifikan terhadap efisiensi waktu tunggu. Artinya, 2 teller sudah cukup optimal
# (e) Buat grafik yang menunjukkan panjang antrian sepanjang hari
waktu <- seq(0, jam_kerja * 60, by = 1)
antrian <- sapply(waktu, function(t) {
sum(kedatangan <= t & selesai > t)
})
plot(waktu, antrian, type = "l", col = "orange", lwd = 2,
xlab = "Menit", ylab = "Jumlah Antrian",
main = "Panjang Antrian Teller Bank (2 Teller) Sepanjang Hari")
# Nomor 6
## Simulasi Penjualan Beras di Toko Bu Sari
#(a) Simulasikan stok selama 60 hari
set.seed(123)
penjualan <- runif(60, min = 8, max = 15)
stok <- numeric(60)
rugi <- 0
stok[1] <- 100
for (i in 2:60) {
if (i %% 5 == 1) {
stok[i] <- stok[i - 1] + 50
} else {
stok[i] <- stok[i - 1]
}
stok[i] <- stok[i] - penjualan[i]
if (stok[i] < 0) {
rugi <- rugi + abs(stok[i]) * 50000
stok[i] <- 0
}
}
stok
## [1] 100.000000 86.481864 75.619026 61.437904 46.854633 88.535737
## [7] 76.838999 62.592066 50.732020 39.535717 74.837884 63.664545
## [13] 50.921550 38.913117 30.192644 65.893869 56.171255 47.876838
## [19] 37.581393 22.899868 58.673092 45.823468 33.339921 18.380032
## [25] 5.790092 42.830378 31.021916 18.862922 8.838804 0.000000
## [31] 35.258830 20.942737 8.107800 0.000000 0.000000 38.655428
## [37] 25.346211 15.831356 5.604089 0.000000 41.000400 30.098575
## [43] 19.202505 8.620587 0.000000 41.028358 31.397119 20.135382
## [49] 10.273573 0.000000 41.679182 30.583781 16.991307 8.138013
## [55] 0.000000 40.554280 31.661559 18.388404 4.123086 0.000000
# (b) Hitung berapa kali toko kehabisan stok
sum(stok == 0)
## [1] 8
# (c) Strategi jumlah pemesanan: 40, 50, 60 karung
pesan_strategi <- function(pesan) {
stok <- numeric(60)
rugi <- 0
stok[1] <- 100
penjualan <- runif(60, 8, 15)
for (i in 2:60) {
if (i %% 5 == 1) stok[i] <- stok[i - 1] + pesan
else stok[i] <- stok[i - 1]
stok[i] <- stok[i] - penjualan[i]
if (stok[i] < 0) {
rugi <- rugi + abs(stok[i]) * 50000
stok[i] <- 0
}
}
list(stok = stok, rugi = rugi, habis = sum(stok == 0))
}
s40 <- pesan_strategi(40)
s50 <- pesan_strategi(50)
s60 <- pesan_strategi(60)
s40$rugi; s50$rugi; s60$rugi
## [1] 7201815
## [1] 935349.6
## [1] 0
s40$habis; s50$habis; s60$habis
## [1] 18
## [1] 2
## [1] 0
# (d) Strategi frekuensi pemesanan: setiap 3, 5, dan 7 hari
freq_strategi <- function(freq) {
stok <- numeric(60)
rugi <- 0
stok[1] <- 100
penjualan <- runif(60, 8, 15)
for (i in 2:60) {
if (i %% freq == 1) stok[i] <- stok[i - 1] + 50
else stok[i] <- stok[i - 1]
stok[i] <- stok[i] - penjualan[i]
if (stok[i] < 0) {
rugi <- rugi + abs(stok[i]) * 50000
stok[i] <- 0
}
}
list(stok = stok, rugi = rugi, habis = sum(stok == 0))
}
f3 <- freq_strategi(3)
f5 <- freq_strategi(5)
f7 <- freq_strategi(7)
f3$rugi; f5$rugi; f7$rugi
## [1] 0
## [1] 1416061
## [1] 8741818
f3$habis; f5$habis; f7$habis
## [1] 0
## [1] 4
## [1] 18
# (e) Grafik pergerakan stok dan rekomendasi
plot(s50$stok, type = "l", col = "pink", lwd = 2,
main = "Pergerakan Stok Beras Bu Sari (Pesan 50 Karung Tiap 5 Hari)",
xlab = "Hari ke-", ylab = "Sisa Stok")