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