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)")
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)")
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)")
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)")
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")
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")
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")
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")
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")
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")
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")
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

library(DescTools)
## Warning: package 'DescTools' was built under R version 4.4.3
# Uji Breslow-Day (H0: OR semua stratum sama/homogen)
BreslowDayTest(dat)
## 
##  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"
# Uji Cochran-Mantel-Haenszel (H0: semua OR bersyarat = 1)
mantelhaen.test(dat, correct = FALSE)
## 
##  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 :

  1. 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.

  2. 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.

  3. 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.

  4. 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

Hasil Analisis Marginal, Bersyarat, dan Uji
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.