set.seed(2025)
pop <- data.frame(
exam_score = round(rnorm(5000, mean = 72, sd = 10)),
pass = rbinom(5000, 1, 0.7)
)
# Enam baris pertama
head(pop)
## exam_score pass
## 1 78 0
## 2 72 1
## 3 80 0
## 4 85 0
## 5 76 1
## 6 70 0
# Statistik deskriptif exam_score
statistik_populasi <- data.frame(
Mean = mean(pop$exam_score),
SD = sd(pop$exam_score),
Min = min(pop$exam_score),
Maks = max(pop$exam_score)
)
statistik_populasi
## Mean SD Min Maks
## 1 71.8192 10.1005 40 111
# SD populasi empiris: pembagi N, untuk menghitung SE teoretis
sd_pop <- sqrt(mean((pop$exam_score - mean(pop$exam_score))^2))
# Histogram nilai ujian
hist(
pop$exam_score,
main = "Histogram Nilai Ujian Mahasiswa",
xlab = "Nilai ujian",
ylab = "Frekuensi",
col = "lightblue",
border = "white"
)
Interpretasi: Tabel menampilkan rata-rata, simpangan
baku, nilai minimum, dan maksimum nilai ujian pada populasi buatan
berisi 5.000 mahasiswa. Histogram menunjukkan bentuk sebaran nilai
ujian. Nilai pass dibangkitkan sesuai instruksi soal,
tetapi analisis pada nomor ini berfokus pada
exam_score.
set.seed(123)
B <- 1000
n <- 30
rata_sampel_30 <- replicate(
B,
mean(sample(pop$exam_score, size = n, replace = TRUE))
)
hist(
rata_sampel_30,
main = "Distribusi Sampling Rata-rata (n = 30)",
xlab = "Rata-rata sampel",
ylab = "Frekuensi",
col = "lightgreen",
border = "white"
)
# Bandingkan SD empiris dan standard error teoretis
sd_empiris <- sd(rata_sampel_30)
se_teoretis <- sd_pop / sqrt(n)
perbandingan_se <- data.frame(
Ukuran_sampel = n,
Jumlah_simulasi = B,
Rata_rata_sampling = mean(rata_sampel_30),
SD_empiris = sd_empiris,
SD_populasi = sd_pop,
SE_teoretis = se_teoretis
)
perbandingan_se
## Ukuran_sampel Jumlah_simulasi Rata_rata_sampling SD_empiris SD_populasi
## 1 30 1000 71.8333 1.849776 10.09949
## SE_teoretis
## 1 1.843906
Interpretasi: SD empiris dihitung dari 1.000
rata-rata sampel, sedangkan standard error teoretis dihitung dengan
rumus sd_pop / sqrt(n). Keduanya diharapkan mendekati satu
sama lain, tetapi tidak harus identik karena simulasi menggunakan sampel
acak yang terbatas.
ukuran_sampel <- c(5, 30, 100)
set.seed(123)
hasil_sampling <- lapply(
ukuran_sampel,
function(n) {
replicate(
1000,
mean(sample(pop$exam_score, size = n, replace = TRUE))
)
}
)
names(hasil_sampling) <- paste0("n = ", ukuran_sampel)
par(mfrow = c(1, 3))
for (i in seq_along(ukuran_sampel)) {
hist(
hasil_sampling[[i]],
main = paste("Distribusi Sampling, n =", ukuran_sampel[i]),
xlab = "Rata-rata sampel",
ylab = "Frekuensi",
col = "lightblue",
border = "white"
)
}
par(mfrow = c(1, 1))
perbandingan_ukuran_sampel <- data.frame(
n = ukuran_sampel,
Mean_sampling = sapply(hasil_sampling, mean),
SD_empiris = sapply(hasil_sampling, sd),
SE_teoretis = sd_pop / sqrt(ukuran_sampel)
)
perbandingan_ukuran_sampel
## n Mean_sampling SD_empiris SE_teoretis
## n = 5 5 71.97200 4.521750 4.516630
## n = 30 30 71.79777 1.892637 1.843906
## n = 100 100 71.82888 1.029191 1.009949
Interpretasi: Ketika ukuran sampel meningkat, rata-rata sampel cenderung semakin terkonsentrasi di sekitar rata-rata populasi dan penyebarannya mengecil. Hal ini terlihat dari SD empiris dan standard error teoretis yang cenderung turun. Distribusi rata-rata sampel juga cenderung berbentuk lebih mendekati normal.
Kesimpulan Soal 1: Simulasi menunjukkan bahwa distribusi sampling rata-rata berpusat di sekitar rata-rata populasi. Semakin besar ukuran sampel, semakin kecil standard error sehingga estimasi rata-rata menjadi lebih stabil.
Taraf signifikansi untuk semua pengujian adalah \(\alpha = 0{,}05\).
Hipotesis Shapiro-Wilk:
Hipotesis Kolmogorov-Smirnov pada data terstandarisasi:
penjualan <- c(
45, 52, 47, 50, 49, 53, 54, 48, 51, 50,
55, 46, 49, 47, 52, 50, 48, 53, 54, 49
)
par(mfrow = c(1, 2))
hist(
penjualan,
main = "Histogram Data Penjualan",
xlab = "Jumlah penjualan",
ylab = "Frekuensi",
col = "lightblue",
border = "white"
)
qqnorm(penjualan, main = "Q-Q Plot Data Penjualan")
qqline(penjualan, col = "red", lwd = 2)
par(mfrow = c(1, 1))
hasil_shapiro <- shapiro.test(penjualan)
# Sesuai instruksi soal, lakukan KS pada data terstandarisasi.
# Data berulang (ties) dapat memunculkan peringatan pada uji KS.
hasil_ks <- ks.test(as.numeric(scale(penjualan)), "pnorm")
## Warning in ks.test.default(as.numeric(scale(penjualan)), "pnorm"): ties should
## not be present for the one-sample Kolmogorov-Smirnov test
hasil_shapiro
##
## Shapiro-Wilk normality test
##
## data: penjualan
## W = 0.96996, p-value = 0.754
hasil_ks
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: as.numeric(scale(penjualan))
## D = 0.11402, p-value = 0.9573
## alternative hypothesis: two-sided
tabel_penjualan <- data.frame(
Uji = c("Shapiro-Wilk", "Kolmogorov-Smirnov"),
Statistik = c(
unname(hasil_shapiro$statistic),
unname(hasil_ks$statistic)
),
P_value = c(
hasil_shapiro$p.value,
hasil_ks$p.value
)
)
tabel_penjualan$Keputusan <- ifelse(
tabel_penjualan$P_value <= alpha,
"Tolak H0",
"Tidak menolak H0"
)
tabel_penjualan
## Uji Statistik P_value Keputusan
## 1 Shapiro-Wilk 0.9699599 0.7540280 Tidak menolak H0
## 2 Kolmogorov-Smirnov 0.1140191 0.9572511 Tidak menolak H0
Aturan keputusan: Jika p-value \(\leq 0{,}05\), H0 ditolak. Jika p-value \(> 0{,}05\), H0 tidak ditolak.
Interpretasi: Periksa p-value pada tabel. P-value
Shapiro-Wilk yang lebih besar dari 0,05 berarti tidak terdapat bukti
yang cukup untuk menyatakan data menyimpang dari normalitas. Untuk KS, R
dapat menampilkan peringatan ties karena beberapa angka
penjualan berulang; hasil KS tetap ditampilkan sesuai instruksi soal,
tetapi perlu ditafsirkan secara hati-hati karena asumsi uji KS
satu-sampel klasik tidak ideal untuk data dengan nilai berulang dan
parameter normal yang diestimasi dari data.
lapply(), serta Q-Q plotHipotesis untuk masing-masing variabel:
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
)
data_dua <- list(
Berat = berat,
Tinggi = tinggi
)
# Terapkan Shapiro-Wilk pada kedua variabel sekaligus
hasil_dua <- lapply(data_dua, shapiro.test)
hasil_dua
## $Berat
##
## Shapiro-Wilk normality test
##
## data: X[[i]]
## W = 0.98257, p-value = 0.8889
##
##
## $Tinggi
##
## Shapiro-Wilk normality test
##
## data: X[[i]]
## W = 0.96475, p-value = 0.4071
tabel_dua <- data.frame(
Variabel = names(data_dua),
W = sapply(hasil_dua, function(x) unname(x$statistic)),
P_value = sapply(hasil_dua, function(x) x$p.value)
)
tabel_dua$Keputusan <- ifelse(
tabel_dua$P_value <= alpha,
"Tolak H0",
"Tidak menolak H0"
)
tabel_dua
## Variabel W P_value Keputusan
## Berat Berat 0.9825681 0.8889398 Tidak menolak H0
## Tinggi Tinggi 0.9647532 0.4071377 Tidak menolak H0
par(mfrow = c(1, 2))
qqnorm(berat, main = "Q-Q Plot Berat Badan")
qqline(berat, col = "red", lwd = 2)
qqnorm(tinggi, main = "Q-Q Plot Tinggi Badan")
qqline(tinggi, col = "red", lwd = 2)
par(mfrow = c(1, 1))
W_dua <- sapply(hasil_dua, function(x) unname(x$statistic))
p_dua <- sapply(hasil_dua, function(x) x$p.value)
variabel_lebih_dekat <- names(which.max(W_dua))
cat(
"Berdasarkan statistik W Shapiro-Wilk, variabel yang lebih mendekati normal adalah:",
variabel_lebih_dekat, "\n"
)
## Berdasarkan statistik W Shapiro-Wilk, variabel yang lebih mendekati normal adalah: Berat
data.frame(
Variabel = names(data_dua),
Statistik_W = as.numeric(W_dua),
P_value = as.numeric(p_dua)
)
## Variabel Statistik_W P_value
## 1 Berat 0.9825681 0.8889398
## 2 Tinggi 0.9647532 0.4071377
Interpretasi dan kesimpulan Soal 2: Nilai W yang lebih dekat ke 1 dan p-value yang lebih besar dapat menjadi indikasi relatif bahwa data lebih mendekati normal, dengan tetap mempertimbangkan Q-Q plot. Jika p-value suatu variabel lebih besar dari 0,05, H0 tidak ditolak; hal ini berarti tidak ada bukti yang cukup untuk menyatakan variabel tersebut tidak normal, bukan membuktikan bahwa distribusinya pasti normal.
Data berisi tekanan darah sistolik 30 pasien sebelum dan sesudah intervensi selama enam minggu. Selisih didefinisikan sebagai before − after, sehingga selisih positif menunjukkan penurunan tekanan darah setelah intervensi.
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)
## id before after selisih
## 1 1 140 132 8
## 2 2 150 145 5
## 3 3 135 130 5
## 4 4 142 138 4
## 5 5 128 125 3
## 6 6 155 148 7
ringkasan_bp <- data.frame(
Variabel = c("Before", "After", "Selisih (before - after)"),
Mean = c(
mean(bp$before),
mean(bp$after),
mean(bp$selisih)
),
SD = c(
sd(bp$before),
sd(bp$after),
sd(bp$selisih)
)
)
ringkasan_bp
## Variabel Mean SD
## 1 Before 139.8333 7.706170
## 2 After 135.0333 6.713257
## 3 Selisih (before - after) 4.8000 1.562491
par(mfrow = c(1, 2))
boxplot(
bp$before, bp$after,
names = c("Sebelum", "Sesudah"),
main = "Tekanan Darah Sebelum dan Sesudah",
ylab = "Tekanan darah sistolik (mmHg)",
col = c("lightblue", "lightgreen")
)
hist(
bp$selisih,
main = "Histogram Selisih Tekanan Darah",
xlab = "Before - After (mmHg)",
ylab = "Frekuensi",
col = "lightblue",
border = "white"
)
par(mfrow = c(1, 1))
Hipotesis:
hasil_shapiro_selisih <- shapiro.test(bp$selisih)
hasil_shapiro_selisih
##
## Shapiro-Wilk normality test
##
## data: bp$selisih
## W = 0.89942, p-value = 0.008129
if (hasil_shapiro_selisih$p.value <= alpha) {
cat("Keputusan: Tolak H0. Selisih tidak memenuhi asumsi normalitas pada alpha = 0,05.\n")
cat("Uji Wilcoxon signed-rank menjadi pilihan nonparametrik yang sesuai untuk data berpasangan.\n")
} else {
cat("Keputusan: Tidak menolak H0. Selisih tidak menunjukkan penyimpangan signifikan dari normalitas.\n")
cat("Uji t berpasangan dapat digunakan jika asumsi lainnya juga terpenuhi.\n")
}
## Keputusan: Tolak H0. Selisih tidak memenuhi asumsi normalitas pada alpha = 0,05.
## Uji Wilcoxon signed-rank menjadi pilihan nonparametrik yang sesuai untuk data berpasangan.
Catatan: Untuk uji t berpasangan, asumsi normalitas
yang diperiksa adalah distribusi selisih pasangan,
bukan keharusan bahwa data before dan after
masing-masing normal.
Hipotesis:
hasil_t <- t.test(
bp$before,
bp$after,
paired = TRUE,
alternative = "two.sided",
conf.level = 0.95
)
hasil_t
##
## 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
ringkasan_t <- data.frame(
Rata_rata_selisih = unname(hasil_t$estimate),
Statistik_t = unname(hasil_t$statistic),
df = unname(hasil_t$parameter),
P_value = hasil_t$p.value,
CI_95_bawah = hasil_t$conf.int[1],
CI_95_atas = hasil_t$conf.int[2]
)
ringkasan_t
## Rata_rata_selisih Statistik_t df P_value CI_95_bawah CI_95_atas
## 1 4.8 16.82613 29 1.674497e-16 4.216556 5.383444
Hipotesis:
# exact = FALSE digunakan agar penghitungan aproksimasi dapat dilakukan
# meskipun data selisih memiliki nilai yang sama (ties).
hasil_wilcoxon <- wilcox.test(
bp$before,
bp$after,
paired = TRUE,
alternative = "two.sided",
exact = FALSE
)
hasil_wilcoxon
##
## 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
tabel_uji_pasangan <- data.frame(
Uji = c("Paired t-test", "Wilcoxon signed-rank"),
Statistik = c(
unname(hasil_t$statistic),
unname(hasil_wilcoxon$statistic)
),
P_value = c(
hasil_t$p.value,
hasil_wilcoxon$p.value
),
Keputusan = ifelse(
c(hasil_t$p.value, hasil_wilcoxon$p.value) <= alpha,
"Tolak H0",
"Tidak menolak H0"
)
)
tabel_uji_pasangan
## Uji Statistik P_value Keputusan
## 1 Paired t-test 16.82613 1.674497e-16 Tolak H0
## 2 Wilcoxon signed-rank 465.00000 1.618574e-06 Tolak H0
Interpretasi: Pada kedua uji, bandingkan p-value dengan 0,05. Untuk paired t-test, selang kepercayaan 95% menunjukkan rentang nilai yang masuk akal bagi rata-rata selisih. Jika seluruh rentang berada di atas 0, hasil mendukung adanya penurunan rata-rata tekanan darah setelah intervensi. Karena uji normalitas selisih juga diperiksa, gunakan hasil Wilcoxon sebagai dasar utama jika asumsi normalitas selisih tidak terpenuhi.
Cohen’s \(d\) berpasangan dihitung sebagai rata-rata selisih dibagi simpangan baku selisih (sering disebut \(d_z\)).
cohens_d_z <- mean(bp$selisih) / sd(bp$selisih)
interpretasi_d <- if (abs(cohens_d_z) < 0.2) {
"sangat kecil"
} else if (abs(cohens_d_z) < 0.5) {
"kecil"
} else if (abs(cohens_d_z) < 0.8) {
"sedang"
} else {
"besar"
}
hasil_d <- data.frame(
Mean_selisih = mean(bp$selisih),
SD_selisih = sd(bp$selisih),
Cohens_d_z = cohens_d_z,
Interpretasi = interpretasi_d
)
hasil_d
## Mean_selisih SD_selisih Cohens_d_z Interpretasi
## 1 4.8 1.562491 3.072017 besar
Interpretasi: Nilai Cohen’s \(d_z\) menunjukkan besarnya efek intervensi
dalam satuan simpangan baku selisih. Nilai absolut sekitar 0,2 sering
disebut kecil, 0,5 sedang, dan 0,8 atau lebih besar. Tanda positif pada
definisi selisih before - after berarti tekanan darah
cenderung lebih tinggi sebelum intervensi.
Berdasarkan data, rata-rata tekanan darah sebelum intervensi adalah
139.83 mmHg, sedangkan setelah intervensi
135.03 mmHg. Rata-rata selisih
before - after sebesar 4.8 mmHg, yang
menunjukkan penurunan rata-rata setelah intervensi. Uji Shapiro-Wilk
pada selisih menghasilkan p-value 0.008129; karena
p-value <= 0,05, keputusan normalitasnya adalah
menolak H0. Uji Wilcoxon signed-rank menghasilkan
p-value 1.619e-06, sedangkan paired t-test menghasilkan
p-value < 2.2e-16 dengan CI 95% untuk rata-rata
selisih sebesar [4.22, 5.38] mmHg. Cohen’s \(d_z\) sebesar 3.07
menunjukkan ukuran efek yang besar. Dengan
memperhatikan hasil uji normalitas selisih, Wilcoxon signed-rank
dijadikan dasar utama apabila normalitas tidak terpenuhi; hasil kedua
pengujian perlu dilaporkan sesuai instruksi soal.