Teorema Limit Pusat (Central Limit Theorem - CLT) menyatakan bahwa distribusi rata-rata sampel akan mendekati distribusi normal seiring dengan bertambahnya ukuran sampel, terlepas dari distribusi populasi asal.
Rata-rata Sampel: Untuk sampel acak yang diambil dari populasi, rata-rata sampel adalah nilai rata-rata yang dihitung dari data yang ada di dalam sampel tersebut.
Teorema Limit Pusat: Menyatakan bahwa distribusi dari rata-rata sampel, jika pengambilan sampel dilakukan berulang kali, akan mendekati distribusi normal dengan rata-rata sama dengan rata-rata populasi (μ) dan varians (σ²/n), di mana n adalah ukuran sampel.
Aims (Tujauan): Menjelaskan secara jelas apa yang ingin dicapai atau dipelajari dari simulasi.
Data generating Mechanism: Menjabarkan bagaimana data disimulasikan.
Estimand/Target of Analysis: Menentukan nilai parameter sebenarnya (true value) yang ingin diestimasi dari data simulasi.
Methods: Merinci metode statistik atau algoritma yang digunakan dalam analisis data hasil simulasi.
Performance Measure: Menjelaskan bagaimana kinerja metode diukur, bisa secara visual atau numerik.
Tujuan dari simulasi ini adalah untuk menentukan batas bawah ukuran amatan contoh \(n_{obs}\) agar distribusi sample mean \(\bar{X}_{n_{obs}} \sim \mathcal{N}\) (Normal) dengan pendekatan visual, yaitu saat bentuk sebarannya terlihat mendekati distribusi normal (misalnya memiliki bentuk simetris dan lonceng) ketika populasi asal adalah distribusi Normal.
Data dibangkitkan dari distribusi Normal dengan rata-rata 10 dan standar deviasi 3, yaitu \(\mathcal{N}(10,3)\). Ukuran contoh (\(n_{obs}\)) yang diuji: 5, 8, 10, 15, 20, …, 100.
library(ggplot2)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyr)
set.seed(123)
n_obs_seq <- seq(5, 100, by = 10)
n_sim <- 1000
mu <- 10
sigma <- 3
# Simulasi untuk semua nilai n_obs
sim_results <- lapply(n_obs_seq, function(n) {
means <- replicate(n_sim, mean(rnorm(n, mean = mu, sd = sigma)))
data.frame(n_obs = n, sample_mean = means)
}) %>% bind_rows()
Karena kita ingin memeriksa apakah distribusi sample mean \(\bar{X}\) menyerupai distribusi normal, maka kita membandingkan bentuk distribusi tersebut dengan distribusi normal teoritis. Perlu dicatat bahwa estimasi sample mean mendekati rata-rata populasi (yaitu 10), bukan nol.
ggplot(sim_results, aes(x = sample_mean)) +
geom_histogram(aes(y = ..density..), bins = 30, fill = "skyblue", color = "black") +
geom_density(color = "red", size = 1) +
facet_wrap(~ n_obs, scales = "free", ncol = 5) +
theme_minimal() +
labs(title = "Distribusi Sample Mean untuk Berbagai Ukuran Sampel",
x = "Sample Mean", y = "Density")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Kinerja dievaluasi secara visual dari grafik density untuk setiap \(n_{obs}\). Kita ingin mencari batas bawah dari \(n_{obs}\) dimana bentuk distribusi sample mean sudah terlihat cukup simetris dan menyerupai distribusi normal (berbentuk lonceng).
Kesimpulan: Berdasarkan grafik, distribusi sample mean mulai terlihat normal sekitar \(n_{obs} \geq 30\).
Dalam eksperimen ini, kita akan melihat bagaimana distribusi sampel berubah dengan ukuran sampel yang berbeda. Kita akan menggunakan tiga jenis distribusi populasi yang berbeda: Normal, Seragam, dan Eksponensial. Untuk setiap distribusi ini, kita akan mengambil sampel dengan ukuran n = 5, n = 25, n = 50, dan n = 100 kemudian menghitung rata-rata sampel dan memvisualisasikan hasilnya.
Membangkitkan Sampel: Kita akan membangkitkan sampel dari tiga distribusi: normal, seragam, dan eksponensial dengan ukuran sampel yang berbeda (5, 25, 50, 100).
Histogram Rata-rata Sampel: Setelah kita mengambil sampel, kita akan menghitung rata-rata sampel dan memvisualisasikan hasilnya dengan histogram.
Normal QQ-Plot: Kita juga akan memplotkan normal QQ-plot untuk melihat bagaimana distribusi rata-rata sampel dibandingkan dengan distribusi normal.
Kita akan membangkitkan sampel dari distribusi Normal, Seragam, dan Eksponensial untuk ukuran sampel n = 5, 25, 50, dan 100. Kemudian, kita akan menghitung rata-rata dari setiap sampel dan membuat histogram untuk melihat distribusi rata-rata sampel.
# Set seed untuk hasil yang konsisten
set.seed(123)
# Ukuran sampel yang berbeda
sample_sizes = c(5, 25, 50, 100)
# Fungsi untuk mengambil sampel dan menghitung rata-rata
ambil_sampel = function(n, k, distribusi) {
means = numeric(k)
for (i in 1:k) {
if (distribusi == "normal") {
sampel = rnorm(n)
} else if (distribusi == "uniform") {
sampel = runif(n)
} else if (distribusi == "exponential") {
sampel = rexp(n)
}
means[i] = mean(sampel)
}
return(means)
}
# Membuat histogram dan QQ-Plot untuk masing-masing distribusi dan ukuran sampel
par(mfrow = c(2, 2)) # Layout untuk menampilkan 3 histogram dan 3 QQ-Plot
# Distribusi Normal
for (size in sample_sizes) {
means = ambil_sampel(size, 1000, "normal")
hist(means, main = paste("Normal - n =", size),
xlab = "Rata-rata Sampel", col = "lightblue", border = "black")
}
# Distribusi Seragam
for (size in sample_sizes) {
means = ambil_sampel(size, 1000, "uniform")
hist(means, main = paste("Seragam - n =", size),
xlab = "Rata-rata Sampel", col = "lightgreen", border = "black")
}
# Distribusi Eksponensial
for (size in sample_sizes) {
means = ambil_sampel(size, 1000, "exponential")
hist(means, main = paste("Eksponensial - n =", size),
xlab = "Rata-rata Sampel", col = "lightcoral", border = "black")
}
QQ-plot digunakan untuk membandingkan distribusi rata-rata sampel dengan distribusi normal. Jika rata-rata sampel terdistribusi normal, maka titik-titik pada QQ-plot akan mengikuti garis diagonal.
# Menampilkan Normal QQ-Plot untuk masing-masing distribusi dan ukuran sampel
par(mfrow = c(2, 2)) # Layout untuk menampilkan 3 QQ-Plot
# Distribusi Normal
for (size in sample_sizes) {
means = ambil_sampel(size, 1000, "normal")
qqnorm(means, main = paste("QQ-Plot Normal - n =", size))
qqline(means, col = "red")
}
# Distribusi Seragam
for (size in sample_sizes) {
means = ambil_sampel(size, 1000, "uniform")
qqnorm(means, main = paste("QQ-Plot Seragam - n =", size))
qqline(means, col = "red")
}
# Distribusi Eksponensial
for (size in sample_sizes) {
means = ambil_sampel(size, 1000, "exponential")
qqnorm(means, main = paste("QQ-Plot Eksponensial - n =", size))
qqline(means, col = "red")
}
Dari hasil histogram dan QQ-plot yang dihasilkan, kita bisa menarik beberapa kesimpulan penting:
Distribusi Normal: Dengan ukuran sampel yang lebih besar, distribusi rata-rata sampel akan semakin mendekati distribusi normal. QQ-plot akan menunjukkan kecocokan yang sangat baik dengan garis diagonal.
Distribusi Seragam: Meskipun distribusi populasi seragam, distribusi rata-rata sampel akan semakin mendekati distribusi normal dengan bertambahnya ukuran sampel. Hal ini terlihat jelas pada histogram dan QQ-plot.
Distribusi Eksponensial: Meskipun distribusi populasi eksponensial, rata-rata sampel akan mendekati distribusi normal seiring bertambahnya ukuran sampel, meskipun mungkin tidak sekuat distribusi normal atau seragam.
library(ggplot2)
library(gridExtra)
##
## Attaching package: 'gridExtra'
## The following object is masked from 'package:dplyr':
##
## combine
library(dplyr)
Gugus 1: Data dari sebaran normal standar.
Gugus 2: Data campuran dengan tiga jenis kombinasi distribusi:
# misalkan pada praktikum ini menggunakan parameter a=2 dan parameter b=5
bangkitkan_data = function(jenis, n, a = 2, b = 5) {
if (jenis == "normal") {
return(rnorm(n))
} else if (jenis == "campuran1") {
return(c(rnorm(n/2), rchisq(n/2, df = 2)))
} else if (jenis == "campuran2") {
return(c(rchisq(n/2, df = a), rchisq(n/2, df = b)))
} else if (jenis == "campuran3") {
return(c(
rchisq(n/4, df = a),
rchisq(n/4, df = b),
rnorm(n/4, mean = a),
rnorm(n/4, mean = b)
))
}
}
# misalkan pada praktikum ini mneggunakan pengulangan (reps) sebanyak 1000 kali
ambl_rataan = function(jenis, n, reps = 1000, a = 2, b = 5) {
replicate(reps, mean(bangkitkan_data(jenis, n, a, b)))
}
# Menampilkan Histogram dan QQ-Plot dalam Grid untuk Jenis Data dan Ukuran Sampel yang Berbeda
library(gridExtra)
# Fungsi untuk menghasilkan dan menampilkan plot dalam grid
plot_data = function(jenis, sample_sizes, a = 2, b = 5) {
# Siapkan list untuk menampung plot
plots = list()
# Loop untuk semua ukuran sampel
for (n in sample_sizes) {
# Ambil rata-rata dari data yang telah dibangkitkan
rataan = ambl_rataan(jenis, n, a = a, b = b)
judul = paste(jenis, "n =", n)
# Plot histogram dan QQ-plot
df = data.frame(x = rataan)
hist_plot = ggplot(df, aes(x)) +
geom_histogram(bins = 30, fill = 'skyblue', color = 'black') +
ggtitle(paste("Histogram -", judul)) +
theme_minimal()
qq_plot = ggplot(df, aes(sample = x)) +
stat_qq() + stat_qq_line() +
ggtitle(paste("QQ Plot -", judul)) +
theme_minimal()
# Simpan plot dalam list
plots[[length(plots) + 1]] = hist_plot
plots[[length(plots) + 1]] = qq_plot
}
# Menampilkan semua plot dalam grid
do.call(grid.arrange, c(plots, ncol = 2))
}
# Ukuran sampel yang ingin dibandingkan
sample_sizes = c(4, 12, 20, 60, 100)
# Menampilkan hasil untuk setiap jenis data
# Grid untuk data normal
plot_data("normal", sample_sizes)
# Grid untuk data campuran1
plot_data("campuran1", sample_sizes)
# Grid untuk data campuran2
plot_data("campuran2", sample_sizes)
# Grid untuk data campuran3
plot_data("campuran3", sample_sizes)
Distribusi rataan dari semua jenis data cenderung mendekati distribusi normal seiring dengan bertambahnya ukuran sampel.
Untuk data campuran yang lebih kompleks, ukuran sampel minimal 50–100 diperlukan agar bentuk distribusi mendekati normal.
Hal ini sejalan dengan Teorema Limit Pusat (Central Limit Theorem).
Distribusi Sampel Mendekati Normal
Distribusi rata-rata sampel akan semakin mendekati distribusi normal
seiring dengan bertambahnya ukuran sampel. Dalam distribusi normal,
nilai rata-rata sampel yang dekat dengan rata-rata populasi memiliki
kemungkinan lebih besar muncul dibandingkan yang jauh.
Rata-rata Sampel Mendekati Rata-rata
Populasi
Rata-rata dari distribusi sampel rata-rata (\(\bar{x}\)) akan mendekati rata-rata
populasi (\(\mu\)) seiring bertambahnya
ukuran sampel. Hal ini menunjukkan bahwa rata-rata sampel akan semakin
dekat dengan rata-rata populasi.
Kemungkinan Rata-rata Sampel Mendekati Rata-rata
Populasi
Karena distribusi rata-rata sampel semakin mendekati distribusi normal,
rata-rata sampel lebih mungkin berada dekat dengan rata-rata populasi
seiring bertambahnya ukuran sampel. Dengan ukuran sampel yang lebih
besar, sampel akan lebih representatif terhadap populasi.
Kerjakan simulasi menggunakan format ADEMP. Tugas dikumpulkan menggunakan format pdf dan dikumpulkan paling lambar 27 April 2025 pukul 23.59.
Melakukan simulasi untuk mendapatkan batas bawah ukuran contoh \(n_{\text{obs}}\) agar statistik baku \(Z \sim \mathcal{N}(0, 1)\), jika populasi asal berdistribusi normal namun mengandung pencilan (outlier).
Bangkitkan dua gugus data:
Ambil sampel dengan ukuran n = 6, 22, 150.