Simulasi variabel random adalah teknik yang digunakan untuk menghasilkan data acak berdasarkan distribusi probabilitas tertentu. Dalam analisis statistik dan pemodelan data, simulasi ini membantu memahami perilaku variabel acak dalam berbagai kondisi tanpa harus mengumpulkan data nyata.
Terdapat dua jenis utama variabel random yang sering disimulasikan:
Dengan menggunakan simulasi variabel random di R, kita dapat menguji teori probabilitas, melakukan eksperimen statistik, serta membuat model prediksi berdasarkan data sintetis.
Distribusi uniform menghasilkan angka acak yang memiliki peluang sama untuk muncul dalam rentang tertentu.
# simulasi 1000 variabel random dari distribusi uniform
set.seed(44) # set seed untuk reproducibility
n <- 1000
uniform_data <- runif(n, min = 0, max = 1)
# plot histogram
hist(uniform_data, breaks = 30, main = "Histogram Distribusi Uniform", xlab = "Nilai", col = "blueviolet")
runif(n, min, max) digunakan untuk menghasilkan n variabel random dari
distribusi uniform dengan rentang min hingga max. Kemudian, histogram
dibuat dengan 30 bin (breaks = 30), yang menunjukkan bahwa data tersebar
secara merata tanpa pola tertentu. Dari histogram, terlihat bahwa
frekuensi kemunculan tiap nilai relatif merata, sesuai dengan sifat
distribusi uniform.
Distribusi binomial digunakan untuk memodelkan jumlah keberhasilan dalam sejumlah percobaan dengan probabilitas tetap.
# simulasi 1000 variabel random dari distribusi binomial
n_trials <- 10 # jumlah percobaan
p_success <- 0.5 # probabilitas sukses
binomial_data <- rbinom(n, size = n_trials, prob = p_success)
# plot histogram
hist(binomial_data, breaks = 30, main = "Histogram Distribusi Binomial", xlab = "Jumlah Sukses", col = "darkmagenta")
Pada simulasi ini, kita menghasilkan 1000 angka acak dari distribusi
binomial dengan 10 percobaan (n_trials = 10) dan probabilitas sukses 0.5
(p_success = 0.5). Setiap angka yang dihasilkan mewakili jumlah
keberhasilan dalam 10 percobaan. Histogram menunjukkan bahwa jumlah
sukses cenderung berkumpul di sekitar nilai tengah (mean = 5), membentuk
pola mirip distribusi normal, sesuai dengan teori distribusi
binomial
Distribusi normal adalah distribusi kontinu yang berbentuk lonceng, dengan mean mu dan standar deviasi sigma. Distribusi normal sering digunakan dalam statistik karena banyak fenomena alamiah mengikuti pola ini, seperti tinggi badan atau nilai ujian.
# simulasi 1000 variabel random dari distribusi normal
mu <- 0 # Mean
sigma <- 1 # Standar deviasi
normal_data <- rnorm(n, mean = mu, sd = sigma)
# plot histogram
hist(normal_data, breaks = 30, main = "Histogram Distribusi Normal", xlab = "Nilai", col = "darkslateblue")
Pada simulasi ini, kita menghasilkan 1000 angka acak dari distribusi
normal standar dengan mean (μ) = 0 dan standar deviasi (σ) = 1.
Histogram menunjukkan bentuk distribusi lonceng simetris, di mana
sebagian besar data berkumpul di sekitar nilai rata-rata 0, dan semakin
jauh dari rata-rata, frekuensi kemunculannya semakin berkurang.
Distribusi Poisson digunakan untuk memodelkan jumlah kejadian dalam interval waktu atau ruang tertentu ketika kejadian terjadi secara acak dengan rata-rata tertentu.
lambda <- 3 # parameter lambda
poisson_data <- rpois(n, lambda)
hist(poisson_data, breaks = 30, main = "Histogram Distribusi Poisson", xlab = "Jumlah Kejadian", col = "cornflowerblue")
Distribusi eksponensial sering digunakan untuk memodelkan waktu antar kejadian dalam proses Poisson, seperti waktu kedatangan pelanggan atau waktu kegagalan mesin.
rate <- 1 # Parameter rate
exp_data <- rexp(n, rate)
hist(exp_data, breaks = 30, main = "Histogram Distribusi Eksponensial", xlab = "Nilai", col = "darkorchid3")
# Simulasi pendapatan bulanan
set.seed(123)
n_employees <- 500
mean_income <- 10000000
sd_income <- 2000000
income_data <- rnorm(n_employees, mean = mean_income, sd = sd_income)
# 1. Rata-rata pendapatan simulasi
mean_simulated <- mean(income_data)
cat("Rata-rata pendapatan simulasi:", mean_simulated, "\n")
## Rata-rata pendapatan simulasi: 10069181
Simulasi ini menggambarkan distribusi pendapatan bulanan 500 karyawan dengan rata-rata Rp10.000.000 dan standar deviasi Rp2.000.000. Hasil simulasi menunjukkan bahwa rata-rata pendapatan yang diperoleh adalah Rp10.069.181, mencerminkan variasi yang wajar dalam data acak yang dihasilkan.
# 2. Probabilitas pendapatan di atas Rp 12.000.000
prob_above_12m <- sum(income_data > 12000000) / n_employees
cat("Probabilitas pendapatan di atas Rp 12.000.000:", prob_above_12m, "\n")
## Probabilitas pendapatan di atas Rp 12.000.000: 0.164
Hasil simulasi menunjukkan bahwa sekitar 16,4% karyawan memiliki pendapatan bulanan di atas Rp12.000.000. Ini mencerminkan distribusi pendapatan yang mengikuti pola normal dengan sebagian kecil karyawan berpenghasilan lebih tinggi dari rata-rata.
# Simulasi jumlah pelanggan
set.seed(123)
n_days <- 30
lambda_customers <- 50
customers_data <- rpois(n_days, lambda_customers)
# 1. Rata-rata jumlah pelanggan simulasi
mean_customers <- mean(customers_data)
cat("Rata-rata jumlah pelanggan simulasi:", mean_customers, "\n")
## Rata-rata jumlah pelanggan simulasi: 48.96667
# 2. Probabilitas jumlah pelanggan lebih dari 60
prob_above_60 <- sum(customers_data > 60) / n_days
cat("Probabilitas jumlah pelanggan lebih dari 60:", prob_above_60, "\n")
## Probabilitas jumlah pelanggan lebih dari 60: 0.03333333
Studi kasus ini mensimulasikan jumlah pelanggan harian selama 30 hari
dengan distribusi Poisson, di mana rata-rata pelanggan per hari adalah
50. Dari hasil simulasi, rata-rata jumlah pelanggan yang diperoleh
adalah sekitar 48,97 pelanggan per hari.
Selain itu, probabilitas jumlah pelanggan harian melebihi 60 adalah
sekitar 3,33%. Ini menunjukkan bahwa kejadian pelanggan yang sangat
ramai (lebih dari 60 dalam sehari) cukup jarang terjadi.
set.seed(123) # set seed untuk reproducibility
n <- 1010 # jumlah sampel
# Simulasi Distribusi Diskrit
## Distribusi Binomial: 1010 sampel, 10 percobaan, probabilitas sukses 0.5
n_trials <- 10
p_success <- 0.5
data_binomial <- rbinom(n, size = n_trials, prob = p_success)
hist(data_binomial, breaks = 10, main = "Distribusi Binomial", xlab = "Jumlah Sukses", col = "darkgreen", border = "white")
## Distribusi Poisson: 1010 sampel, rata-rata kejadian per interval = 3
lambda <- 3
data_poisson <- rpois(n, lambda)
hist(data_poisson, breaks = 10, main = "Distribusi Poisson", xlab = "Jumlah Kejadian", col = "darkgoldenrod2", border = "white")
# Simulasi Distribusi Kontinu
## Distribusi Normal: 1010 sampel, mean = 0, sd = 1
mu <- 0
sigma <- 1
normal_data <- rnorm(n, mean = mu, sd = sigma)
hist(normal_data, breaks = 30, main = "Distribusi Normal", xlab = "Nilai", col = "aquamarine4", border = "white")
## Distribusi Eksponensial: 1010 sampel, rate = 1
rate <- 1
exp_data <- rexp(n, rate)
hist(exp_data, breaks = 30, main = "Distribusi Eksponensial", xlab = "Nilai", col = "chocolate", border = "white")
Visualisasi di atas menunjukkan pola unik dari berbagai distribusi probabilitas. Dari distribusi binomial yang simetris hingga distribusi eksponensial yang menurun tajam, setiap grafik mencerminkan bagaimana data dapat tersebar dalam berbagai situasi. Simulasi ini membantu memahami bagaimana variabel acak berperilaku dalam berbagai kondisi.
Studi Kasus: Analisis Waktu Pelayanan di Sebuah Restoran Sebuah restoran ingin menganalisis jumlah pelanggan yang datang setiap jam serta waktu pelayanan setiap pelanggan untuk meningkatkan efisiensi operasional. Untuk itu, dilakukan simulasi berdasarkan distribusi probabilitas yang sesuai.
Jumlah pelanggan per jam (Distribusi Poisson). Restoran memperkirakan bahwa rata-rata ada 10 pelanggan datang setiap jam. Maka, jumlah pelanggan dalam setiap jam dapat dimodelkan menggunakan distribusi poisson dengan parameter λ = 10.
Jumlah item yang dipesan oleh pelanggan (Distribusi Binomial). Setiap pelanggan memiliki kemungkinan 0,7 untuk memesan lebih dari satu item, dengan jumlah maksimal 5 item. Maka, jumlah item yang dipesan setiap pelanggan dapat dimodelkan menggunakan distribusi binomial dengan n = 5, p = 0.7.
Waktu pelayanan per pelanggan (Distribusi Eksponensial). Waktu pelayanan pelanggan rata-rata 5 menit, sehingga dapat dimodelkan dengan Distribusi Eksponensial dengan rate = 1/5 menit.
Total pendapatan per jam (Distribusi Normal). Jika rata-rata pendapatan per pelanggan adalah Rp 50.000 dengan standar deviasi Rp 10.000, maka pendapatan per pelanggan dapat dimodelkan dengan Distribusi Normal dengan mean = 50000, sd = 10000.
set.seed(123)
# Parameter simulasi
n_hours <- 12 # Simulasi untuk 12 jam operasional
lambda_customers <- 10 # Rata-rata pelanggan per jam
n_items <- 5 # Maksimal item per pelanggan
p_item <- 0.7 # Probabilitas pelanggan membeli lebih dari 1 item
mean_service_time <- 5 # Waktu pelayanan rata-rata dalam menit
rate_service <- 1 / mean_service_time
mean_income <- 50000 # Rata-rata pendapatan per pelanggan
sd_income <- 10000 # Standar deviasi pendapatan
# Simulasi jumlah pelanggan per jam (Distribusi Poisson)
customers_per_hour <- rpois(n_hours, lambda_customers)
# Simulasi jumlah item yang dipesan pelanggan (Distribusi Binomial)
items_per_customer <- rbinom(sum(customers_per_hour), n_items, p_item)
# Simulasi waktu pelayanan pelanggan (Distribusi Eksponensial)
service_time <- rexp(sum(customers_per_hour), rate_service)
# Simulasi pendapatan per pelanggan (Distribusi Normal)
income_per_customer <- rnorm(sum(customers_per_hour), mean_income, sd_income)
# Hitung total pendapatan per jam
total_income_per_hour <- tapply(income_per_customer, rep(1:n_hours, customers_per_hour), sum)
# Output ringkasan simulasi
cat("Rata-rata jumlah pelanggan per jam:", mean(customers_per_hour), "\n")
## Rata-rata jumlah pelanggan per jam: 10.08333
cat("Rata-rata item per pelanggan:", mean(items_per_customer), "\n")
## Rata-rata item per pelanggan: 3.578512
cat("Rata-rata waktu pelayanan per pelanggan:", mean(service_time), "menit\n")
## Rata-rata waktu pelayanan per pelanggan: 4.864774 menit
cat("Rata-rata pendapatan per pelanggan: Rp", mean(income_per_customer), "\n")
## Rata-rata pendapatan per pelanggan: Rp 49745.21
cat("Total pendapatan rata-rata per jam: Rp", mean(total_income_per_hour), "\n")
## Total pendapatan rata-rata per jam: Rp 501597.5
# Load library
library(ggplot2)
# Histogram jumlah pelanggan per jam
ggplot(data.frame(customers_per_hour), aes(x = customers_per_hour)) +
geom_histogram(binwidth = 1, fill = "steelblue", color = "black") +
labs(title = "Distribusi Jumlah Pelanggan per Jam", x = "Jumlah Pelanggan", y = "Frekuensi") +
theme_minimal()
# Histogram jumlah item per pelanggan
ggplot(data.frame(items_per_customer), aes(x = items_per_customer)) +
geom_histogram(binwidth = 1, fill = "darkolivegreen4", color = "black") +
labs(title = "Distribusi Jumlah Item per Pelanggan", x = "Jumlah Item", y = "Frekuensi") +
theme_minimal()
# Histogram waktu pelayanan per pelanggan
ggplot(data.frame(service_time), aes(x = service_time)) +
geom_histogram(binwidth = 1, fill = "darkorange", color = "black") +
labs(title = "Distribusi Waktu Pelayanan", x = "Waktu Pelayanan (menit)", y = "Frekuensi") +
theme_minimal()
# Histogram pendapatan per pelanggan
ggplot(data.frame(income_per_customer), aes(x = income_per_customer)) +
geom_histogram(binwidth = 5000, fill = "purple", color = "black") +
labs(title = "Distribusi Pendapatan per Pelanggan", x = "Pendapatan (Rp)", y = "Frekuensi") +
theme_minimal()
# Histogram total pendapatan per jam
ggplot(data.frame(total_income_per_hour), aes(x = total_income_per_hour)) +
geom_histogram(binwidth = 50000, fill = "brown1", color = "black") +
labs(title = "Distribusi Total Pendapatan per Jam", x = "Pendapatan (Rp)", y = "Frekuensi") +
theme_minimal()
Berdasarkan simulasi yang dilakukan, berikut beberapa temuan utama:
Implikasi Bisnis: