Analisis Data Kategorik
Hubungan Penggunaan Kelas Online dan Kelulusan dengan Jalur Masuk sebagai Kovariat
Data
Studi Kasus Mandiri
Sebuah kampus ingin mengetahui apakah PENGGUNAAN KELAS ONLINE berhubungan dengan KELULUSAN mahasiswa, dengan JALUR MASUK (Reguler/Beasiswa) sebagai kovariat yang diduga memengaruhi pola hubungan tersebut.
Berikut data simulasi (data individu, belum dibuat tabel kontingensi) dari 480 mahasiswa dengan variabel:
- X = Kelas_Online: Intensif / Tidak Intensif
- Y = Kelulusan: Lulus / Tidak Lulus
- Z = Jalur_Masuk: Beasiswa / Reguler (stratum)
######## DATA LENGKAP ########
# jumlah mahasiswa untuk tiap kombinasi, urutannya sama dengan 3 kolom di bawah (Beasiswa: Intensif lulus, Intensif tidak lulus, Tidak Intensif lulus, Tidak Intensif tidak lulus, lalu urutan yang sama untuk Reguler)
jumlah <- c(27, 3, 160, 40, 80, 120, 12, 38)
# membuat datanya, tiap kombinasi diulang sebanyak jumlahnya
data_lengkap <- data.frame(
ID = 1:480,
Jalur_Masuk = rep(c("Beasiswa", "Beasiswa", "Beasiswa", "Beasiswa",
"Reguler", "Reguler", "Reguler", "Reguler"), times = jumlah),
Kelas_Online = rep(c("Intensif", "Intensif", "Tidak Intensif", "Tidak Intensif",
"Intensif", "Intensif", "Tidak Intensif", "Tidak Intensif"), times = jumlah),
Kelulusan = rep(c("Lulus", "Tidak Lulus", "Lulus", "Tidak Lulus",
"Lulus", "Tidak Lulus", "Lulus", "Tidak Lulus"), times = jumlah))
# Mengatur urutan kategori: Intensif dan Lulus di awal
data_lengkap$Jalur_Masuk <- factor(data_lengkap$Jalur_Masuk, levels = c("Beasiswa", "Reguler"))
data_lengkap$Kelas_Online <- factor(data_lengkap$Kelas_Online, levels = c("Intensif", "Tidak Intensif"))
data_lengkap$Kelulusan <- factor(data_lengkap$Kelulusan, levels = c("Lulus", "Tidak Lulus"))
# menampilkan semua data, bisa di-scroll ke bawah
DT::datatable(data_lengkap, rownames = FALSE,
options = list(scrollY = "300px", paging = FALSE,
searching = FALSE, info = FALSE))######## DATA FREKUENSI (jumlah mahasiswa tiap kombinasi) ########
# menghitung jumlah mahasiswa tiap kombinasi dari data lengkap
data_frekuensi <- as.data.frame(
xtabs(~ Jalur_Masuk + Kelas_Online + Kelulusan, data = data_lengkap),
responseName = "Jumlah")
# merapikan urutan baris
data_frekuensi <- data_frekuensi[order(data_frekuensi$Jalur_Masuk,
data_frekuensi$Kelas_Online,
data_frekuensi$Kelulusan), ]
rownames(data_frekuensi) <- NULL
# menampilkan tabel frekuensi
knitr::kable(data_frekuensi, caption = "Data Frekuensi (Total 480 Mahasiswa)")| Jalur_Masuk | Kelas_Online | Kelulusan | Jumlah |
|---|---|---|---|
| Beasiswa | Intensif | Lulus | 27 |
| Beasiswa | Intensif | Tidak Lulus | 3 |
| Beasiswa | Tidak Intensif | Lulus | 160 |
| Beasiswa | Tidak Intensif | Tidak Lulus | 40 |
| Reguler | Intensif | Lulus | 80 |
| Reguler | Intensif | Tidak Lulus | 120 |
| Reguler | Tidak Intensif | Lulus | 12 |
| Reguler | Tidak Intensif | Tidak Lulus | 38 |
1. Susun tabel kontingensi 3 arah dari data yang Anda kumpulkan/simulasikan
# Membuat tabel berdasarkan Kelas Online, Kelulusan, dan Jalur Masuk
tabel_3arah <- xtabs(Jumlah ~ Kelas_Online + Kelulusan + Jalur_Masuk,
data = data_frekuensi)
# Membuat tabel 3 dimensi
# Urutannya: Kelas Online x Kelulusan x Jalur Masuk
dat <- array(as.vector(tabel_3arah),
dim = c(2, 2, 2),
dimnames = list(
Kelas_Online = c("Intensif", "Tidak Intensif"),
Kelulusan = c("Lulus", "Tidak Lulus"),
Jalur_Masuk = c("Beasiswa", "Reguler")))
# Menampilkan tabel parsial jalur Beasiswa
knitr::kable(as.matrix(addmargins(dat[, , "Beasiswa"])),
caption = "Tabel Parsial: Jalur Masuk Beasiswa (Kelas Online x Kelulusan)")| Lulus | Tidak Lulus | Sum | |
|---|---|---|---|
| Intensif | 27 | 3 | 30 |
| Tidak Intensif | 160 | 40 | 200 |
| Sum | 187 | 43 | 230 |
# Menampilkan tabel parsial jalur Reguler
knitr::kable(as.matrix(addmargins(dat[, , "Reguler"])),
caption = "Tabel Parsial: Jalur Masuk Reguler (Kelas Online x Kelulusan)")| Lulus | Tidak Lulus | Sum | |
|---|---|---|---|
| Intensif | 80 | 120 | 200 |
| Tidak Intensif | 12 | 38 | 50 |
| Sum | 92 | 158 | 250 |
# Menggabungkan semua data menjadi satu tabel kontingensi 3 arah
tabel_datar <- rbind(dat[, , "Beasiswa"], dat[, , "Reguler"])
tabel_datar <- data.frame(
Jalur_Masuk = c("Beasiswa", "Beasiswa", "Reguler", "Reguler"),
Kelas_Online = rownames(tabel_datar),
tabel_datar,
Total = rowSums(tabel_datar),
row.names = NULL)
knitr::kable(tabel_datar,
col.names = c("Jalur Masuk", "Kelas Online", "Lulus", "Tidak Lulus", "Total"),
caption = "Tabel Kontingensi 3 Arah: Kelas Online x Kelulusan x Jalur Masuk (2 x 2 x 2)")| Jalur Masuk | Kelas Online | Lulus | Tidak Lulus | Total |
|---|---|---|---|---|
| Beasiswa | Intensif | 27 | 3 | 30 |
| Beasiswa | Tidak Intensif | 160 | 40 | 200 |
| Reguler | Intensif | 80 | 120 | 200 |
| Reguler | Tidak Intensif | 12 | 38 | 50 |
2. Hitung OR marginal dan OR tiap stratum (bersyarat)
# Analisis Marginal (Naif)
# Jalur masuk tidak diperhatikan
marginal <- margin.table(dat, c(1, 2))
tabel_marginal <- data.frame(
Kelas_Online = c("Intensif", "Tidak Intensif"),
Lulus = marginal[, "Lulus"],
Tidak_Lulus = marginal[, "Tidak Lulus"])
tabel_marginal$Total <- tabel_marginal$Lulus + tabel_marginal$Tidak_Lulus
tabel_marginal$Persen_Lulus <- paste0(round(100 * tabel_marginal$Lulus / tabel_marginal$Total, 1), "%")
knitr::kable(tabel_marginal, row.names = FALSE,
col.names = c("Kelas Online", "Lulus", "Tidak Lulus", "Total", "% Lulus"),
caption = "Tabel Marginal Kelas Online x Kelulusan")| Kelas Online | Lulus | Tidak Lulus | Total | % Lulus |
|---|---|---|---|---|
| Intensif | 107 | 123 | 230 | 46.5% |
| Tidak Intensif | 172 | 78 | 250 | 68.8% |
# Membuat tabel berdasarkan jalur masuk
beasiswa <- dat[, , "Beasiswa"]
reguler <- dat[, , "Reguler"]
# Menghitung persentase mahasiswa yang lulus pada tiap jalur masuk
p_beasiswa <- prop.table(beasiswa, 1)[, "Lulus"] * 100
p_reguler <- prop.table(reguler, 1)[, "Lulus"] * 100
knitr::kable(data.frame(Kelas_Online = c("Intensif", "Tidak Intensif"),
Persen = paste0(round(p_beasiswa, 1), "%")),
row.names = FALSE, col.names = c("Kelas Online", "Lulus"),
caption = "Persentase Lulus Jalur Beasiswa")| Kelas Online | Lulus |
|---|---|
| Intensif | 90% |
| Tidak Intensif | 80% |
knitr::kable(data.frame(Kelas_Online = c("Intensif", "Tidak Intensif"),
Persen = paste0(round(p_reguler, 1), "%")),
row.names = FALSE, col.names = c("Kelas Online", "Lulus"),
caption = "Persentase Lulus Jalur Reguler")| Kelas Online | Lulus |
|---|---|
| Intensif | 40% |
| Tidak Intensif | 24% |
# Menghitung OR dengan rumus OR = (n11*n22)/(n12*n21)
or_marginal <- (marginal[1,1] * marginal[2,2]) /
(marginal[1,2] * marginal[2,1])
or_beasiswa <- (beasiswa[1,1] * beasiswa[2,2]) /
(beasiswa[1,2] * beasiswa[2,1])
or_reguler <- (reguler[1,1] * reguler[2,2]) /
(reguler[1,2] * reguler[2,1])
# Membandingkan OR marginal dengan OR berdasarkan jalur masuk
hasil_or <- data.frame(
Analisis = c("Marginal (semua mahasiswa)", "Jalur Beasiswa", "Jalur Reguler"),
Rasio_Odds = round(c(or_marginal, or_beasiswa, or_reguler), 3))
knitr::kable(hasil_or,
col.names = c("Kelompok", "Rasio Odds (OR)"),
caption = "Perbandingan OR Lulus Kelas Intensif terhadap Tidak Intensif")| Kelompok | Rasio Odds (OR) |
|---|---|
| Marginal (semua mahasiswa) | 0.394 |
| Jalur Beasiswa | 2.250 |
| Jalur Reguler | 2.111 |
3. Periksa apakah terjadi Paradoks Simpson
# Membandingkan arah OR marginal dan OR bersyarat
tabel_arah <- data.frame(
Analisis = c("Marginal (semua mahasiswa)", "Jalur Beasiswa", "Jalur Reguler"),
Rasio_Odds = round(c(or_marginal, or_beasiswa, or_reguler), 3),
Arah = ifelse(c(or_marginal, or_beasiswa, or_reguler) > 1,
"OR > 1 (Intensif lebih baik)",
"OR < 1 (Tidak Intensif lebih baik)"))
knitr::kable(tabel_arah,
col.names = c("Kelompok", "Rasio Odds (OR)", "Arah"),
caption = "Arah Rasio Odds (OR) Marginal dan Bersyarat")| Kelompok | Rasio Odds (OR) | Arah |
|---|---|---|
| Marginal (semua mahasiswa) | 0.394 | OR < 1 (Tidak Intensif lebih baik) |
| Jalur Beasiswa | 2.250 | OR > 1 (Intensif lebih baik) |
| Jalur Reguler | 2.111 | OR > 1 (Intensif lebih baik) |
# Paradoks Simpson: arah OR marginal berlawanan dengan OR di semua stratum
simpson <- (or_marginal < 1 & or_beasiswa > 1 & or_reguler > 1) |
(or_marginal > 1 & or_beasiswa < 1 & or_reguler < 1)
ifelse(simpson, "TERJADI Paradoks Simpson", "TIDAK terjadi Paradoks Simpson")## [1] "TERJADI Paradoks Simpson"
# Komposisi jalur masuk pada tiap kelas online
komposisi <- round(100 * as.matrix(prop.table(margin.table(dat, c(1, 3)), 1)), 1)
komposisi[] <- paste0(komposisi, "%")
knitr::kable(komposisi,
caption = "Komposisi Jalur Masuk pada Tiap Kelas Online")| Beasiswa | Reguler | |
|---|---|---|
| Intensif | 13% | 87% |
| Tidak Intensif | 80% | 20% |
# Persentase kelulusan pada tiap jalur masuk
kelulusan <- round(100 * as.matrix(prop.table(margin.table(dat, c(3, 2)), 1)), 1)
kelulusan[] <- paste0(kelulusan, "%")
knitr::kable(kelulusan,
caption = "Persentase Kelulusan pada Tiap Jalur Masuk")| Lulus | Tidak Lulus | |
|---|---|---|
| Beasiswa | 81.3% | 18.7% |
| Reguler | 36.8% | 63.2% |
4. Lakukan uji Breslow-Day dan Uji Cochran-Mantel-Haenszel dengan R
## Warning: package 'DescTools' was built under R version 4.4.3
##
## Breslow-Day test on Homogeneity of Odds Ratios
##
## data: dat
## X-squared = 0.0076606, df = 1, p-value = 0.9303
# Keputusan: tolak H0 kalau p-value < 0,05
ifelse(BreslowDayTest(dat)$p.value < 0.05, "Breslow-Day: Tolak H0", "Breslow-Day: Gagal menolak H0")## [1] "Breslow-Day: Gagal menolak H0"
##
## Mantel-Haenszel chi-squared test without continuity correction
##
## data: dat
## Mantel-Haenszel X-squared = 6.0915, df = 1, p-value = 0.01358
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 1.160664 3.975411
## sample estimates:
## common odds ratio
## 2.14805
# Keputusan: tolak H0 kalau p-value < 0,05
ifelse(mantelhaen.test(dat, correct = FALSE)$p.value < 0.05, "CMH: Tolak H0", "CMH: Gagal menolak H0")## [1] "CMH: Tolak H0"
5. Tulis interpretasi dan Kesimpulan akhir
Interpretasi :
Tabel kontingensi 3 arah berukuran 2 × 2 × 2 dengan total 480 mahasiswa, yang terdiri dari 230 mahasiswa jalur Beasiswa dan 250 mahasiswa jalur Reguler. Masing-masing jalur masuk membentuk tabel parsial berukuran 2 × 2, yang menunjukkan hubungan antara Kelas Online dan Kelulusan.
Secara marginal (tanpa memperhatikan jalur masuk), persentase mahasiswa yang lulus pada kelas Intensif adalah 46,5% (107 dari 230), sedangkan pada kelas Tidak Intensif adalah 68,8% (172 dari 250). OR marginal sebesar 0,394 (< 1), yang berarti secara marginal odds lulus kelas Intensif lebih rendah daripada kelas Tidak Intensif. Secara bersyarat (pada masing-masing jalur masuk), diperoleh hasil sebagai berikut:
- Jalur Beasiswa: persentase lulus kelas Intensif 90% (27 dari 30) dan kelas Tidak Intensif 80% (160 dari 200), dengan OR = 2,250.
- Jalur Reguler: persentase lulus kelas Intensif 40% (80 dari 200) dan kelas Tidak Intensif 24% (12 dari 50), dengan OR = 2,111.
Kedua OR bersyarat bernilai lebih dari 1, sehingga secara bersyarat pada masing-masing jalur masuk, odds lulus kelas Intensif lebih tinggi daripada kelas Tidak Intensif.
Arah OR marginal (< 1) berbeda dengan arah OR bersyarat pada kedua jalur masuk (> 1), sehingga terjadi Paradoks Simpson. Hal ini disebabkan oleh jalur masuk yang berhubungan dengan kedua variabel lainnya:
- Jalur masuk berhubungan dengan kelas online. Sebanyak 87% mahasiswa kelas Intensif berasal dari jalur Reguler, sedangkan 80% mahasiswa kelas Tidak Intensif berasal dari jalur Beasiswa.
- Jalur masuk berhubungan dengan kelulusan. Persentase kelulusan jalur Beasiswa (81,3%) lebih tinggi daripada jalur Reguler (36,8%).
Karena kedua hubungan tersebut, jalur masuk berperan sebagai variabel pengganggu (confounder) dalam hubungan antara kelas online dan kelulusan. Apabila jalur masuk tidak diperhitungkan, hubungan yang diperoleh menjadi tidak sesuai dengan hubungan yang sebenarnya pada masing-masing jalur masuk.
Pengujian dilakukan dengan dua uji, yaitu:
- Uji Breslow-Day (H0: OR pada semua stratum sama). Diperoleh X² = 0,008 dengan p-value = 0,9303 (> 0,05), sehingga H0 tidak ditolak. Artinya, OR pada jalur Beasiswa dan jalur Reguler dapat dianggap homogen.
- Uji Cochran-Mantel-Haenszel (H0: OR bersyarat = 1). Diperoleh X² = 6,091 dengan p-value = 0,0136 (< 0,05), sehingga H0 ditolak. Artinya, terdapat hubungan yang signifikan antara kelas online dan kelulusan setelah jalur masuk dikontrol. Nilai OR Mantel-Haenszel sebesar 2,148 (CI 95%: 1,161 – 3,975) menunjukkan bahwa pada jalur masuk yang sama, odds lulus mahasiswa kelas Intensif sekitar 2,15 kali odds lulus mahasiswa kelas Tidak Intensif.
Tabel hasil analisis akhir
| Ukuran | Nilai | Keterangan |
|---|---|---|
| OR marginal | 0.394 | OR < 1 (odds lulus Intensif lebih rendah) |
| OR Beasiswa | 2.250 | OR > 1 (odds lulus Intensif lebih tinggi) |
| OR Reguler | 2.111 | OR > 1 (odds lulus Intensif lebih tinggi) |
| Paradoks Simpson | - | Terjadi (arah OR marginal berlawanan dengan OR kedua stratum) |
| OR Mantel-Haenszel | 2.148 | OR setelah jalur masuk dikontrol |
| Breslow-Day (p-value) | 0.9303 | Homogen (tidak ada bukti perbedaan OR antarstratum) |
| CMH (p-value) | 0.0136 | Signifikan (ada hubungan bersyarat) |
Kesimpulan Akhir
Berdasarkan hasil analisis, terjadi Paradoks Simpson karena OR marginal (0,394) berlawanan arah dengan OR bersyarat pada jalur Beasiswa (2,250) dan jalur Reguler (2,111). Jalur masuk berperan sebagai variabel pengganggu (confounder) karena berhubungan dengan kelas online yang diikuti mahasiswa dan juga dengan kelulusan.
Uji Breslow-Day (p = 0,9303) menunjukkan bahwa OR kedua stratum homogen. Uji CMH (p = 0,0136) menunjukkan adanya hubungan yang signifikan antara kelas online dan kelulusan setelah jalur masuk dikontrol, dengan OR Mantel-Haenszel = 2,148. Dengan demikian, pada jalur masuk yang sama, odds lulus mahasiswa kelas Intensif sekitar 2,15 kali odds lulus mahasiswa kelas Tidak Intensif. Hasil ini menunjukkan adanya asosiasi, bukan hubungan sebab-akibat.
Jadi, setelah jalur masuk dikontrol, penggunaan kelas Intensif berhubungan secara signifikan dengan peluang lulus yang lebih tinggi, dengan odds lulus sekitar 2,15 kali dibandingkan kelas Tidak Intensif.