set.seed(123)
n <- 10000
x <- runif(n, min = 0, max = 1)
x_squared <- x^2
expected_value_sim <- mean(x_squared)
expected_value_sim
## [1] 0.3297405
expected_value_theoretical <- 1 / 3
expected_value_theoretical
## [1] 0.3333333
cat("Pendekatan hasil simulasi E[X^2] adalah", round(expected_value_sim, 4),
"dibandingkan nilai teoretis", round(expected_value_theoretical, 4))
## Pendekatan hasil simulasi E[X^2] adalah 0.3297 dibandingkan nilai teoretis 0.3333
set.seed(123)
n1 <- 100
data1 <- rnorm(n1, mean = 100, sd = 15)
mean1 <- mean(data1)
sd1 <- sd(data1)
cat("n = 100\n")
## n = 100
cat("Rata-rata:", round(mean1, 2), "\n")
## Rata-rata: 101.36
cat("Simpangan baku:", round(sd1, 2), "\n")
## Simpangan baku: 13.69
hist(data1, breaks = 20, col = "skyblue", main = "Histogram n = 100", xlab = "Nilai")
set.seed(123)
n2 <- 1000
data2 <- rnorm(n2, mean = 100, sd = 15)
mean2 <- mean(data2)
sd2 <- sd(data2)
cat("n = 1000\n")
## n = 1000
cat("Rata-rata:", round(mean2, 2), "\n")
## Rata-rata: 100.24
cat("Simpangan baku:", round(sd2, 2), "\n")
## Simpangan baku: 14.88
set.seed(123)
n3 <- 10000
data3 <- rnorm(n3, mean = 100, sd = 15)
mean3 <- mean(data3)
sd3 <- sd(data3)
cat("n = 10000\n")
## n = 10000
cat("Rata-rata:", round(mean3, 2), "\n")
## Rata-rata: 99.96
cat("Simpangan baku:", round(sd3, 2), "\n")
## Simpangan baku: 14.98
hist(data3, breaks = 40, col = "lightgreen", main = "Histogram n = 10000", xlab = "Nilai")
#### Penjelasan Seiring bertambahnya ukuran sampel: Rata-rata sampel
mendekati nilai teoretis Simpangan baku sampel juga semakin mendekati
𝜎=15 Bentuk histogram semakin menyerupai bentuk lonceng (distribusi
normal sempurna) Hal ini menunjukkan prinsip Hukum Bilangan Besar:
ketika ukuran sampel meningkat, statistik sampel semakin mendekati
parameter populasi.
set.seed(123)
n <- 30
p <- 0.25
simulasi <- rbinom(5000, size = n, prob = p)
prob_est <- mean(simulasi >= 15)
cat("Estimasi P(X >= 15):", prob_est, "\n")
## Estimasi P(X >= 15): 0.0024
set.seed(123)
data <- rnorm(1000, mean = 89, sd = 10)
n <- length(data)
fungsi<- sqrt((sum(data^2) - (sum(data)^2)/n) / (n - 1))
s_builtin <- sd(data)
cat("Simpangan baku (manual):", round(fungsi, 4), "\n")
## Simpangan baku (manual): 9.9169
cat("Simpangan baku (fungsi sd):", round(s_builtin, 4), "\n")
## Simpangan baku (fungsi sd): 9.9169
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.2
set.seed(123)
set.seed(123)
lambda <- 5/60
mu <- 1/8
jam_kerja <- 360
n_hari <- 20
sim_bank <- function(n_teller) {
total_tunggu <- 0
total_nasabah <- 0
total_sibuk <- 0
antrian_harian <- matrix(0, n_hari, 6)
for(hari in 1:n_hari) {
n <- rpois(1, lambda * jam_kerja)
kedatangan <- sort(runif(n, 0, jam_kerja))
pelayanan <- rexp(n, mu)
teller_selesai <- rep(0, n_teller)
tunggu <- numeric(n)
for(i in 1:n) {
teller_idx <- which.min(teller_selesai)
mulai <- max(kedatangan[i], teller_selesai[teller_idx])
tunggu[i] <- mulai - kedatangan[i]
teller_selesai[teller_idx] <- mulai + pelayanan[i]
}
total_tunggu <- total_tunggu + sum(tunggu)
total_nasabah <- total_nasabah + n
total_sibuk <- total_sibuk + sum(pmin(teller_selesai, jam_kerja))
for(jam in 1:6) {
start_t <- (jam-1) * 60
end_t <- jam * 60
dalam_jam <- kedatangan >= start_t & kedatangan < end_t
if(sum(dalam_jam) > 0) {
antrian_harian[hari, jam] <- mean(tunggu[dalam_jam] > 0)
}
}
}
list(
rata_tunggu = total_tunggu / total_nasabah,
utilisasi = total_sibuk / (n_teller * jam_kerja * n_hari),
antrian_jam = colMeans(antrian_harian)
)
}
hasil_2 <- sim_bank(2)
cat("Simulasi 20 hari dengan 2 teller selesai\n")
## Simulasi 20 hari dengan 2 teller selesai
cat("Total nasabah dilayani rata-rata:", round(rpois(1, lambda * jam_kerja)), "orang/hari\n")
## Total nasabah dilayani rata-rata: 32 orang/hari
cat("Rata-rata waktu tunggu:", round(hasil_2$rata_tunggu, 2), "menit\n")
## Rata-rata waktu tunggu: 1.14 menit
cat("Utilisasi teller:", round(hasil_2$utilisasi * 100, 1), "%\n")
## Utilisasi teller: 95.7 %
set.seed(123)
hasil_3 <- sim_bank(3)
perbandingan <- data.frame(
Metrik = c("Waktu tunggu (menit)", "Utilisasi (%)", "Efisiensi"),
Teller_2 = c(round(hasil_2$rata_tunggu, 2),
round(hasil_2$utilisasi * 100, 1),
round(hasil_2$rata_tunggu / hasil_2$utilisasi, 2)),
Teller_3 = c(round(hasil_3$rata_tunggu, 2),
round(hasil_3$utilisasi * 100, 1),
round(hasil_3$rata_tunggu / hasil_3$utilisasi, 2))
)
print(perbandingan)
## Metrik Teller_2 Teller_3
## 1 Waktu tunggu (menit) 1.14 0.13
## 2 Utilisasi (%) 95.70 94.20
## 3 Efisiensi 1.19 0.14
penurunan <- (hasil_2$rata_tunggu - hasil_3$rata_tunggu) / hasil_2$rata_tunggu * 100
cat("\nPenurunan waktu tunggu:", round(penurunan, 1), "%\n")
##
## Penurunan waktu tunggu: 88.7 %
cat("Kesimpulan:", ifelse(penurunan > 25, "EFISIEN - tambah teller", "KURANG EFISIEN"))
## Kesimpulan: EFISIEN - tambah teller
jam_data <- data.frame(
Jam = 1:6,
Teller_2 = hasil_2$antrian_jam,
Teller_3 = hasil_3$antrian_jam
)
library(reshape2)
## Warning: package 'reshape2' was built under R version 4.3.3
jam_long <- melt(jam_data, id.vars = "Jam", variable.name = "Skenario", value.name = "Panjang")
ggplot(jam_long, aes(x = Jam, y = Panjang, fill = Skenario)) +
geom_bar(stat = "identity", position = "dodge", alpha = 0.7) +
labs(title = "Rata-rata Panjang Antrian per Jam",
x = "Jam ke-", y = "Proporsi Waktu Ada Antrian") +
theme_minimal() +
scale_x_continuous(breaks = 1:6)
### No.6a
library(ggplot2)
set.seed(123)
sim <- function(pesan=50, frek=5) {
stok <- 100
habis <- 0
rugi <- 0
data_stok <- c()
data_jual <- c()
for(i in 1:60) {
jual <- round(runif(1, 8, 15))
data_jual[i] <- jual
if(stok < jual) {
habis <- habis + 1
rugi <- rugi + (jual - stok) * 50000
stok <- 0
} else {
stok <- stok - jual
}
data_stok[i] <- stok
if(i %% frek == 0) stok <- stok + pesan
}
list(stok=data_stok, habis=habis, rugi=rugi, jual=data_jual)
}
base <- sim()
cat("SIMULASI 60 HARI:")
## SIMULASI 60 HARI:
cat("\nRata-rata penjualan:", round(mean(base$jual), 1), "karung/hari")
##
## Rata-rata penjualan: 11.6 karung/hari
cat("\nTotal terjual:", sum(base$jual), "karung")
##
## Total terjual: 694 karung
cat("\nStok akhir:", tail(base$stok, 1), "karung")
##
## Stok akhir: 0 karung
cat("\nHari kehabisan:", base$habis, "hari")
##
## Hari kehabisan: 9 hari
cat("\nKerugian: Rp", base$rugi)
##
## Kerugian: Rp 2200000
cat("Kehabisan stok:", base$habis, "dari 60 hari")
## Kehabisan stok: 9 dari 60 hari
cat("\nPersentase:", round(base$habis/60*100, 1), "%")
##
## Persentase: 15 %
set.seed(123)
hasil <- data.frame()
for(p in c(40, 50, 60)) {
x <- sim(pesan=p)
hasil <- rbind(hasil, c(p, x$habis, x$rugi))
}
names(hasil) <- c("Pesan", "Habis", "Rugi")
print(hasil)
## Pesan Habis Rugi
## 1 40 19 7700000
## 2 50 7 2400000
## 3 60 0 0
terbaik <- hasil$Pesan[which.min(hasil$Rugi)]
cat("\nTerbaik: pesan", terbaik, "karung")
##
## Terbaik: pesan 60 karung
hasil2 <- data.frame()
for(f in c(3, 5, 7)) {
x <- sim(frek=f)
hasil2 <- rbind(hasil2, c(f, x$habis, x$rugi))
}
names(hasil2) <- c("Frek", "Habis", "Rugi")
print(hasil2)
## Frek Habis Rugi
## 1 3 0 0
## 2 5 7 1800000
## 3 7 18 9550000
optimal <- hasil2$Frek[which.min(hasil2$Rugi)]
cat("\nOptimal: setiap", optimal, "hari")
##
## Optimal: setiap 3 hari
# Simulasi optimal
opt <- sim(pesan=terbaik, frek=optimal)
# Plot
plot(1:60, base$stok, type="l", col="red",
xlab="Hari", ylab="Stok", main="Pergerakan Stok")
lines(1:60, opt$stok, col="blue")
legend("topright", c("Awal", "Optimal"), col=c("red", "blue"), lty=1)
# Rekomendasi
cat("\nREKOMENDASI:")
##
## REKOMENDASI:
cat("\n- Pesan", terbaik, "karung setiap", optimal, "hari")
##
## - Pesan 60 karung setiap 3 hari
cat("\n- Penghematan: Rp", base$rugi - opt$rugi)
##
## - Penghematan: Rp 2200000
cat("\n- Kurangi kehabisan dari", base$habis, "ke", opt$habis, "hari")
##
## - Kurangi kehabisan dari 9 ke 0 hari