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)
Tujuan dari simulasi ini adalah untuk menentukan batas minimum ukuran sampel (jumlah observasi) yang diperlukan agar statistik baku Z dapat mengikuti distribusi normal baku, meskipun populasi asal berdistribusi normal namun mengandung pencilan (outlier).
Data dibangkitkan dari distribusi Normal dengan rata-rata 7 dan standar deviasi 5, yaitu \(\mathcal{N}\) (7,5). Ukuran contoh(\(\mathcal{n}_{obs}\)) yang diuji: 10, 20, …, 100. Namun, untuk mensimulasikan pencilan, kita akan menambahkan beberapa nilai ekstrem ke dalam data (330, 500, 730).
set.seed(1401231100)
n_base <- seq(10, 100, by=10)
n_eks <- c(330,500, 730)
n_obs <- c(n_base, n_eks)
simulasi <- 1000
hasil <- data.frame()
for (n in n_obs) {
z_values <- replicate(simulasi, {
data <- rnorm(n, mean=7, sd=5)
if (n %in% n_eks) {
data <- c(data, n)
}
z <- (mean(data) - 7) / (sd(data) / sqrt(length(data)))
return(z)
})
hasil <- rbind(hasil, data.frame(n=n, z_values=z_values))
}
head(hasil)
## n z_values
## 1 10 0.2091844
## 2 10 1.5811287
## 3 10 0.1831312
## 4 10 2.5459964
## 5 10 -1.4943058
## 6 10 0.6140819
Untuk memeriksa apakah distribusi sampel menyerupai distribusi normal, kita akan membandingkan bentuk distribusi sampel dengan distribus teoritis. Harapannya, estimasi sampel mean mendekati rata-rata populasi, yaitu 7.
ggplot(hasil, aes(x=z_values)) +
geom_histogram(aes(y=..density..), bins=30, fill="lightblue", color="black") +
geom_density(color="red", size=1) +
stat_function(fun=dnorm, args=list(mean=7, sd=5), color="blue", size=1) +
facet_wrap(~n, scales="free") +
geom_vline(xintercept=0, linetype="dashed", color="black") +
labs(title="Distribusi Z vs Sebaran Normal(7,5)",
subtitle = "Simulasi untuk berbagai ukuran sampel dengan pencilan",
x="Nilai Z",
y="Kepadatan") +
theme_minimal(base_size = 12) +
theme(panel.grid.major = element_blank(),
panel.grid.minor = element_blank(),
panel.background = element_blank(),
axis.line = element_line(color = "black"))
## 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.
Hasil simulasi menunjukkan bahwa untuk ukuran sampel kecil hingga menengah (n=10 sampai 100) tanpa pencilan, distribusi statistik Z cenderung simetris di sekitar nol dan semakin mendekati bentuk distribusi normal baku seiring bertambahnya ukuran sampel. Hal ini konsisten dengan prinsip Central Limit Theorem, di mana distribusi rata-rata sampel akan mendekati normal meskipun data awal memiliki variabilitas tertentu. Selain itu, varians distribusi Z terlihat semakin kecil ketika n meningkat, yang mencerminkan meningkatnya presisi estimasi rata-rata.
Sebaliknya, pada ukuran sampel besar yang disertai pencilan (n=330,500,730), distribusi Z mengalami pergeseran ke kanan dan tidak lagi berpusat di nol. Kondisi ini menunjukkan bahwa keberadaan satu nilai ekstrem mampu memengaruhi rata-rata dan simpangan baku secara signifikan, sehingga menyebabkan penyimpangan dari asumsi distribusi normal baku. Temuan ini menegaskan bahwa statistik berbasis rata-rata tidak robust terhadap pencilan, bahkan ketika ukuran sampel besar, sehingga perlu kehati-hatian dalam interpretasi hasil analisis yang melibatkan data dengan potensi outlier.
z_test <- function(data, mu0 = 7, sigma = 5) {
n <- length(data)
x_bar <- mean(data)
z <- (x_bar - mu0) / (sigma / sqrt(n))
p_value <- 2 * (1 - pnorm(abs(z))) # dua sisi
return(list(
z_stat = z,
p_value = p_value
))
}
z_test(z_values)
## $z_stat
## [1] -38.04831
##
## $p_value
## [1] 0
Kinerja uji Z pada simulasi ini menunjukkan kemampuan yang sangat tinggi dalam mendeteksi penyimpangan dari hipotesis nol \(H_0: \mu = 7\), yang ditunjukkan oleh nilai statistik uji sebesar \(z = -10.317\) dan \(p\)-value yang mendekati nol. Hal ini mengindikasikan bahwa probabilitas memperoleh nilai statistik se-ekstrem tersebut ketika \(H_0\) benar sangat kecil, sehingga keputusan yang diambil adalah menolak \(H_0\) secara kuat. Dengan demikian, uji Z dalam konteks ini memiliki power yang sangat tinggi untuk mendeteksi perbedaan rata-rata terhadap nilai hipotesis.
Namun demikian, performa yang terlihat sangat tinggi ini perlu ditafsirkan secara hati-hati. Nilai statistik uji yang ekstrem kemungkinan dipengaruhi oleh adanya pencilan atau penyimpangan dari asumsi dasar, seperti normalitas dan tidak adanya outlier. Kondisi ini menyebabkan uji Z menjadi sangat sensitif sehingga berpotensi menghasilkan keputusan penolakan yang berlebihan. Oleh karena itu, meskipun secara numerik uji menunjukkan performa yang baik, secara substantif hal ini juga mengindikasikan rendahnya ketahanan (robustness) terhadap pencilan.