set.seed(2025)
pop <- data.frame(
exam_score = round(rnorm(5000, mean = 72, sd = 10)),
pass = rbinom(5000, 1, 0.7)
)
# 6 baris pertama
head(pop)
# Ringkasan statistik exam_score
ringkasan <- data.frame(
mean = mean(pop$exam_score),
sd = sd(pop$exam_score),
min = min(pop$exam_score),
maks = max(pop$exam_score)
)
round(ringkasan, 3)
# Histogram
hist(pop$exam_score, breaks = 30, col = "steelblue", border = "white",
main = "Histogram Nilai Ujian (Populasi, N = 5000)",
xlab = "exam_score")
abline(v = mean(pop$exam_score), col = "red", lwd = 2)
Interpretasi. Populasi memiliki rata-rata 71.82 dan simpangan baku 10.1 dengan rentang 40 sampai 111. Histogram berbentuk lonceng dan simetris di sekitar rata-rata, sesuai dengan data yang dibangkitkan dari \(N(72, 10^2)\).
set.seed(123)
n <- 30
rata_sampel <- replicate(1000, mean(sample(pop$exam_score, size = n, replace = TRUE)))
# sd populasi (rumus populasi) dan standard error teoretis
sd_pop <- sqrt(mean((pop$exam_score - mean(pop$exam_score))^2))
se_teoretis <- sd_pop / sqrt(n)
se_empiris <- sd(rata_sampel)
hist(rata_sampel, breaks = 30, col = "orange", border = "white",
main = "Distribusi Sampling Rata-rata (n = 30, 1000 sampel)",
xlab = "Rata-rata sampel", freq = FALSE)
curve(dnorm(x, mean(pop$exam_score), se_teoretis), add = TRUE,
col = "blue", lwd = 2)
data.frame(
mean_rata_sampel = mean(rata_sampel),
sd_empiris = se_empiris,
SE_teoretis = se_teoretis,
selisih = abs(se_empiris - se_teoretis)
)
Interpretasi. Rata-rata dari 1.000 rata-rata sampel (71.833) sangat dekat dengan rata-rata populasi (71.819). Simpangan baku empiris sebesar 1.8498 hampir sama dengan standard error teoretis \(\sigma/\sqrt{n}\) = 1.8439, sehingga hasil simulasi sesuai dengan teori. Kurva biru (normal teoretis) menempel baik pada histogram.
ukuran <- c(5, 30, 100)
hasil <- list()
par(mfrow = c(1, 3))
for (n in ukuran) {
set.seed(123)
m <- replicate(1000, mean(sample(pop$exam_score, size = n, replace = TRUE)))
hasil[[as.character(n)]] <- m
hist(m, breaks = 30, col = "seagreen", border = "white",
main = paste("n =", n), xlab = "Rata-rata sampel",
xlim = c(60, 84))
}
par(mfrow = c(1, 1))
tabel <- data.frame(
n = ukuran,
mean_empiris = sapply(hasil, mean),
sd_empiris = sapply(hasil, sd),
SE_teoretis = sd_pop / sqrt(ukuran)
)
rownames(tabel) <- NULL
round(tabel, 4)
Interpretasi. Semua distribusi sampling berpusat di sekitar rata-rata populasi (tidak bias) pada setiap ukuran sampel. Semakin besar \(n\), sebaran rata-rata sampel semakin sempit: simpangan baku turun dari 4.52 (n = 5) menjadi 1.85 (n = 30) dan 1.02 (n = 100), mengikuti \(\sigma/\sqrt{n}\). Bentuk distribusi juga makin mendekati normal dan makin runcing di sekitar rata-rata. Karena populasi sudah mendekati normal, bentuknya sudah cukup normal bahkan pada n kecil; untuk populasi non-normal, efek ini sesuai dengan Teorema Limit Pusat.
penjualan <- c(45, 52, 47, 50, 49, 53, 54, 48, 51, 50,
55, 46, 49, 47, 52, 50, 48, 53, 54, 49)
berat <- c(55, 60, 62, 58, 64, 70, 68, 72, 59, 61,
63, 65, 66, 67, 71, 69, 60, 58, 62, 64,
73, 75, 77, 68, 70, 72, 74, 69, 63, 65)
tinggi <- c(160, 162, 164, 158, 166, 172, 170, 175, 161, 163,
165, 167, 169, 171, 173, 174, 160, 159, 164, 166,
176, 178, 180, 172, 174, 176, 177, 171, 165, 167)
par(mfrow = c(1, 2))
hist(penjualan, breaks = 8, col = "skyblue", border = "white",
main = "Histogram Penjualan", xlab = "Penjualan")
qqnorm(penjualan, main = "Q-Q Plot Penjualan", pch = 19)
qqline(penjualan, col = "red", lwd = 2)
par(mfrow = c(1, 1))
# Shapiro-Wilk
sw <- shapiro.test(penjualan)
sw
##
## Shapiro-Wilk normality test
##
## data: penjualan
## W = 0.96996, p-value = 0.754
# Kolmogorov-Smirnov pada data terstandarisasi
z <- as.numeric(scale(penjualan))
ks <- suppressWarnings(ks.test(z, "pnorm", mean = 0, sd = 1))
ks
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: z
## D = 0.11402, p-value = 0.9573
## alternative hypothesis: two-sided
Hipotesis (kedua uji):
| Uji | Statistik | p-value | Keputusan |
|---|---|---|---|
| Shapiro-Wilk | W = 0.97 | 0,754 | H0 gagal ditolak |
| Kolmogorov-Smirnov | D = 0.114 | 0,9573 | H0 gagal ditolak |
Kesimpulan. Kedua uji memberikan p-value lebih besar dari 0,05 sehingga H0 gagal ditolak: data penjualan dapat dianggap berdistribusi normal pada taraf signifikansi 5%. Hal ini konsisten dengan Q-Q plot yang titiknya mengikuti garis lurus. (Catatan: uji K-S dengan data terstandarisasi memakai mean dan sd dari sampel sehingga cenderung konservatif, dan terdapat nilai kembar sehingga p-value bersifat aproksimasi.)
data_bt <- list(berat = berat, tinggi = tinggi)
# Uji Shapiro-Wilk sekaligus
hasil_sw <- sapply(data_bt, function(x) {
u <- shapiro.test(x)
c(W = unname(u$statistic), p_value = u$p.value)
})
round(t(hasil_sw), 4)
## W p_value
## berat 0.9826 0.8889
## tinggi 0.9648 0.4071
# Uji Kolmogorov-Smirnov (data terstandarisasi) sekaligus
hasil_ks <- sapply(data_bt, function(x) {
u <- suppressWarnings(ks.test(as.numeric(scale(x)), "pnorm"))
c(D = unname(u$statistic), p_value = u$p.value)
})
round(t(hasil_ks), 4)
## D p_value
## berat 0.0716 0.9979
## tinggi 0.0951 0.9488
# Q-Q plot keduanya
par(mfrow = c(1, 2))
for (nm in names(data_bt)) {
qqnorm(data_bt[[nm]], main = paste("Q-Q Plot", nm), pch = 19)
qqline(data_bt[[nm]], col = "red", lwd = 2)
}
par(mfrow = c(1, 1))
Hipotesis: \(H_0\): variabel berdistribusi normal; \(H_1\): variabel tidak berdistribusi normal (\(\alpha = 0{,}05\)).
Kesimpulan. Pada uji Shapiro-Wilk, berat memiliki p-value 0,8889 (H0 gagal ditolak) dan tinggi memiliki p-value 0,4071 (H0 gagal ditolak).
skew <- function(x) mean((x - mean(x))^3) / (mean((x - mean(x))^2))^1.5
perbandingan <- data.frame(
variabel = names(data_bt),
W = hasil_sw["W", ],
p_value = hasil_sw["p_value", ],
skewness = sapply(data_bt, skew)
)
rownames(perbandingan) <- NULL
perbandingan$W <- round(perbandingan$W, 4)
perbandingan$p_value <- round(perbandingan$p_value, 4)
perbandingan$skewness <- round(perbandingan$skewness, 3)
perbandingan
lebih_normal <- names(which.max(hasil_sw["W", ]))
Jawaban. Variabel yang lebih mendekati distribusi normal adalah berat, karena nilai statistik W Shapiro-Wilk-nya lebih besar (mendekati 1), p-value-nya lebih besar, dan titik-titik pada Q-Q plot-nya lebih rapat mengikuti garis referensi. Semakin besar W dan p-value serta semakin kecil kemiringan (skewness), semakin kecil penyimpangan data dari distribusi normal.
bp <- data.frame(
id = 1:30,
before = c(140,150,135,142,128,155,138,147,131,144,
129,152,141,137,148,133,149,136,130,145,
139,143,134,151,127,146,132,140,138,135),
after = c(132,145,130,138,125,148,135,140,128,136,
125,146,135,132,142,130,144,133,127,140,
134,138,130,145,124,139,128,137,134,131)
)
bp$selisih <- bp$before - bp$after
head(bp)
deskriptif <- data.frame(
variabel = c("before", "after", "selisih"),
rata_rata = c(mean(bp$before), mean(bp$after), mean(bp$selisih)),
simpangan_baku = c(sd(bp$before), sd(bp$after), sd(bp$selisih))
)
deskriptif[, 2:3] <- round(deskriptif[, 2:3], 3)
deskriptif
par(mfrow = c(1, 2))
boxplot(bp$before, bp$after, names = c("Before", "After"),
col = c("tomato", "lightgreen"),
main = "Tekanan Darah Sistolik", ylab = "mmHg")
hist(bp$selisih, breaks = 10, col = "plum", border = "white",
main = "Histogram Selisih (before - after)", xlab = "Selisih (mmHg)")
abline(v = mean(bp$selisih), col = "red", lwd = 2)
par(mfrow = c(1, 1))
Interpretasi. Boxplot menunjukkan median tekanan darah setelah intervensi lebih rendah daripada sebelum intervensi. Histogram selisih terpusat pada nilai positif (rata-rata 4.8 mmHg), artinya sebagian besar pasien mengalami penurunan tekanan darah.
Hipotesis: \(H_0\): selisih berdistribusi normal; \(H_1\): selisih tidak berdistribusi normal.
sw_d <- shapiro.test(bp$selisih)
sw_d
##
## Shapiro-Wilk normality test
##
## data: bp$selisih
## W = 0.89942, p-value = 0.008129
qqnorm(bp$selisih, main = "Q-Q Plot Selisih", pch = 19)
qqline(bp$selisih, col = "red", lwd = 2)
normal_d <- sw_d$p.value >= alpha
Kesimpulan. Uji Shapiro-Wilk menghasilkan W = 0.8994 dan p-value = 0,0081, sehingga H0 ditolak. Selisih tidak berdistribusi normal, sehingga uji yang paling sesuai adalah uji Wilcoxon signed-rank (nonparametrik); uji t berpasangan hanya dipakai sebagai pembanding.
Hipotesis (dua arah):
# Uji t berpasangan
tt <- t.test(bp$before, bp$after, paired = TRUE, conf.level = 0.95)
tt
##
## Paired t-test
##
## data: bp$before and bp$after
## t = 16.826, df = 29, p-value < 2.2e-16
## alternative hypothesis: true mean difference is not equal to 0
## 95 percent confidence interval:
## 4.216556 5.383444
## sample estimates:
## mean difference
## 4.8
# Uji Wilcoxon signed-rank (exact = FALSE karena ada nilai selisih kembar)
wt <- wilcox.test(bp$before, bp$after, paired = TRUE, exact = FALSE,
conf.int = TRUE)
wt
##
## Wilcoxon signed rank test with continuity correction
##
## data: bp$before and bp$after
## V = 465, p-value = 1.619e-06
## alternative hypothesis: true location shift is not equal to 0
## 95 percent confidence interval:
## 4.000001 5.499942
## sample estimates:
## (pseudo)median
## 4.500075
| Uji | Statistik | p-value | Selang kepercayaan 95% | Keputusan |
|---|---|---|---|---|
| t berpasangan | t = 16.826 (db = 29) | < 0,0001 | [4.217; 5.383] | H0 ditolak |
| Wilcoxon signed-rank | V = 465 | < 0,0001 | - | H0 ditolak |
Kesimpulan. Kedua uji menghasilkan p-value kurang dari 0,05 sehingga H0 ditolak: terdapat perbedaan signifikan rata-rata tekanan darah sistolik sebelum dan sesudah intervensi. Selang kepercayaan 95% untuk rata-rata selisih adalah 4.22 sampai 5.38 mmHg, yang tidak memuat nol sehingga konsisten dengan keputusan uji t.
d_cohen <- mean(bp$selisih) / sd(bp$selisih)
d_cohen
## [1] 3.072017
besar_efek <- function(d) {
d <- abs(d)
if (d < 0.2) "dapat diabaikan"
else if (d < 0.5) "kecil"
else if (d < 0.8) "sedang"
else "besar"
}
besar_efek(d_cohen)
## [1] "besar"
Cohen’s d berpasangan dihitung sebagai \(d = \bar{D} / s_D\) = 3.072. Menurut kriteria Cohen (0,2 kecil; 0,5 sedang; 0,8 besar), ukuran efek tergolong besar. Artinya penurunan tekanan darah rata-rata sebesar 3.07 simpangan baku selisih.
Intervensi edukasi gaya hidup selama 6 minggu pada 30 pasien menurunkan rata-rata tekanan darah sistolik dari 139.83 mmHg menjadi 135.03 mmHg, yaitu turun rata-rata 4.8 mmHg (SD selisih = 1.56). Uji Shapiro-Wilk pada selisih menghasilkan p-value 0,0081 sehingga asumsi normalitas tidak terpenuhi dan uji Wilcoxon signed-rank dipilih sebagai uji utama. Hasil uji t berpasangan (t = 16.83, p < 0,0001) dan uji Wilcoxon (p < 0,0001) sama-sama menunjukkan perbedaan yang signifikan pada taraf 5%, dengan ukuran efek Cohen’s d = 3.07 (besar). Dengan demikian, program edukasi gaya hidup berasosiasi dengan penurunan tekanan darah sistolik yang bermakna secara statistik dan secara praktis; namun karena desainnya sebelum-sesudah tanpa kelompok kontrol, penyebab penurunan tidak dapat disimpulkan sepenuhnya berasal dari intervensi.