Latar Belakang

Sebuah universitas ingin mengetahui apakah penggunaan kelas online berhubungan dengan kelulusan mahasiswa. Jalur masuk mahasiswa (Beasiswa/Reguler) diduga memengaruhi pola hubungan tersebut, sehingga dijadikan kovariat (variabel pengendali).

# Membuat data
tabel_variabel <- data.frame(
  Peran = c(
    "X (Eksposur)",
    "Y (Respons)",
    "Z (Kovariat/Stratum)"
  ),
  Variabel = c(
    "Penggunaan kelas online",
    "Kelulusan",
    "Jalur masuk"
  ),
  Kategori = c(
    "Ya, Tidak",
    "Lulus, Tidak Lulus",
    "Beasiswa, Reguler"
  )
)

# Menampilkan tabel
knitr::kable(
  tabel_variabel,
  caption = "Definisi Variabel Penelitian",
  align = c("l", "l", "l")
)
Definisi Variabel Penelitian
Peran Variabel Kategori
X (Eksposur) Penggunaan kelas online Ya, Tidak
Y (Respons) Kelulusan Lulus, Tidak Lulus
Z (Kovariat/Stratum) Jalur masuk Beasiswa, Reguler

Mahasiswa jalur beasiswa umumnya telah melewati seleksi akademik, sehingga peluang lulusnya tinggi. Mahasiswa jalur reguler tidak melewati seleksi tersebut sehingga peluang lulusnya lebih rendah.

Simulasi Data

Data dibangkitkan untuk 400 mahasiswa (200 jalur beasiswa dan 200 jalur reguler) dengan jumlah di setiap sel ditentukan langsung, sehingga hasilnya selalu sama setiap kali dijalankan. Langkah-langkahnya:

  1. Jalur masuk (Z): 200 mahasiswa Beasiswa dan 200 mahasiswa Reguler.

  2. Penggunaan kelas online (X): pada jalur Beasiswa hanya 60 dari 200 mahasiswa yang memakai kelas online, sedangkan pada jalur Reguler 140 dari 200 mahasiswa memakainya.

  3. Kelulusan (Y): jumlah lulus dan tidak lulus ditentukan untuk tiap kombinasi jalur masuk dan kelas online (lihat kode di bawah).

set.seed(123)   # agar pengacakan urutan dapat direproduksi
n <- 400

# Langkah 1: jalur masuk
Jalur_Masuk <- c(rep("Beasiswa", 200),
                 rep("Reguler", 200))

# Langkah 2: penggunaan kelas online
Kelas_Online <- c(
  rep("Ya", 60),  rep("Tidak", 140),   # Beasiswa
  rep("Ya", 140), rep("Tidak", 60)     # Reguler
)

# Langkah 3: kelulusan (mengikuti urutan baris di atas)
Kelulusan <- c(
  # Beasiswa - online Ya     : 54 lulus, 6 tidak lulus
  rep("Lulus", 54),  rep("Tidak Lulus", 6),
  # Beasiswa - online Tidak  : 112 lulus, 28 tidak lulus
  rep("Lulus", 112), rep("Tidak Lulus", 28),
  # Reguler  - online Ya     : 70 lulus, 70 tidak lulus
  rep("Lulus", 70),  rep("Tidak Lulus", 70),
  # Reguler  - online Tidak  : 20 lulus, 40 tidak lulus
  rep("Lulus", 20),  rep("Tidak Lulus", 40)
)

data_simulasi <- data.frame(Jalur_Masuk, Kelas_Online, Kelulusan)

# Acak urutan mahasiswa, lalu tambahkan ID
data_simulasi <- data_simulasi[sample(1:nrow(data_simulasi)), ]
rownames(data_simulasi) <- NULL
data_simulasi$ID_Mahasiswa <- sprintf("MHS%03d", 1:nrow(data_simulasi))
data_simulasi <- data_simulasi[c("ID_Mahasiswa", "Jalur_Masuk",
                                 "Kelas_Online", "Kelulusan")]

head(data_simulasi, 10)
##    ID_Mahasiswa Jalur_Masuk Kelas_Online   Kelulusan
## 1        MHS001    Beasiswa        Tidak Tidak Lulus
## 2        MHS002    Beasiswa           Ya       Lulus
## 3        MHS003    Beasiswa        Tidak Tidak Lulus
## 4        MHS004     Reguler           Ya Tidak Lulus
## 5        MHS005    Beasiswa        Tidak       Lulus
## 6        MHS006     Reguler           Ya Tidak Lulus
## 7        MHS007     Reguler           Ya       Lulus
## 8        MHS008     Reguler           Ya       Lulus
## 9        MHS009     Reguler        Tidak Tidak Lulus
## 10       MHS010     Reguler        Tidak Tidak Lulus
str(data_simulasi)
## 'data.frame':    400 obs. of  4 variables:
##  $ ID_Mahasiswa: chr  "MHS001" "MHS002" "MHS003" "MHS004" ...
##  $ Jalur_Masuk : chr  "Beasiswa" "Beasiswa" "Beasiswa" "Reguler" ...
##  $ Kelas_Online: chr  "Tidak" "Ya" "Tidak" "Ya" ...
##  $ Kelulusan   : chr  "Tidak Lulus" "Lulus" "Tidak Lulus" "Tidak Lulus" ...

Data disimpan ke file Excel, lalu dibaca kembali sebagai data analisis. Pastikan file Data_Simulasi_Kelas_Online.xlsx berada di folder yang sama dengan file Rmd ini.

# Simpan ke Excel (jalankan sekali; lewati bila file sudah ada)
write_xlsx(data_simulasi, "Data_Simulasi_Kelas_Online.xlsx")

# Input data dari Excel
data_mahasiswa <- read_excel("Data_Simulasi_Kelas_Online.xlsx")

# Ubah menjadi factor dengan urutan kategori yang jelas
# (kategori pertama = baris/kolom pertama pada tabel 2x2)
data_sim <- data.frame(
  Kelas_Online = factor(data_mahasiswa$Kelas_Online,
                        levels = c("Ya", "Tidak")),
  Kelulusan    = factor(data_mahasiswa$Kelulusan,
                        levels = c("Lulus", "Tidak Lulus")),
  Jalur_Masuk  = factor(data_mahasiswa$Jalur_Masuk,
                        levels = c("Beasiswa", "Reguler"))
)
head(data_sim)
##   Kelas_Online   Kelulusan Jalur_Masuk
## 1        Tidak Tidak Lulus    Beasiswa
## 2           Ya       Lulus    Beasiswa
## 3        Tidak Tidak Lulus    Beasiswa
## 4           Ya Tidak Lulus     Reguler
## 5        Tidak       Lulus    Beasiswa
## 6           Ya Tidak Lulus     Reguler
nrow(data_sim)
## [1] 400

Tabel Kontingensi 3 Arah

Fungsi table() mengubah data mentah menjadi tabel kontingensi 3 arah (Kelas Online x Kelulusan x Jalur Masuk).

data <- table(data_sim)
ftable(data)
##                          Jalur_Masuk Beasiswa Reguler
## Kelas_Online Kelulusan                               
## Ya           Lulus                         54      70
##              Tidak Lulus                    6      70
## Tidak        Lulus                        112      20
##              Tidak Lulus                   28      40

Tabel parsial (satu tabel 2x2 untuk tiap jalur masuk):

beasiswa <- table(data_sim$Kelas_Online[data_sim$Jalur_Masuk == "Beasiswa"],
                  data_sim$Kelulusan[data_sim$Jalur_Masuk == "Beasiswa"])
reguler  <- table(data_sim$Kelas_Online[data_sim$Jalur_Masuk == "Reguler"],
                  data_sim$Kelulusan[data_sim$Jalur_Masuk == "Reguler"])
beasiswa
##        
##         Lulus Tidak Lulus
##   Ya       54           6
##   Tidak   112          28
reguler
##        
##         Lulus Tidak Lulus
##   Ya       70          70
##   Tidak    20          40

Tabel marginal (jalur masuk diabaikan, kedua stratum dijumlahkan):

marginal <- margin.table(data, c(1, 2))
marginal
##             Kelulusan
## Kelas_Online Lulus Tidak Lulus
##        Ya      124          76
##        Tidak   132          68

Odds Ratio Marginal dan Bersyarat

Rumus OR untuk tabel 2x2 adalah \(\frac{n_{11} \times n_{22}}{n_{12} \times n_{21}}\). Di sini OR membandingkan odds lulus mahasiswa yang memakai kelas online terhadap yang tidak memakainya.

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

hasil_or <- c("OR marginal"  = or_marginal,
              "OR Beasiswa"  = or_beasiswa,
              "OR Reguler"   = or_reguler)
round(hasil_or, 3)
## OR marginal OR Beasiswa  OR Reguler 
##       0.841       2.250       2.000

Pemeriksaan Paradoks Simpson

Paradoks Simpson terjadi bila arah OR marginal berlawanan dengan arah OR di setiap stratum.

if (or_marginal < 1 & or_beasiswa > 1 & or_reguler > 1) {
  simpson <- TRUE
  cat("Paradoks Simpson TERJADI: OR marginal < 1, tetapi OR di kedua stratum > 1\n")
} else if (or_marginal > 1 & or_beasiswa < 1 & or_reguler < 1) {
  simpson <- TRUE
  cat("Paradoks Simpson TERJADI: OR marginal > 1, tetapi OR di kedua stratum < 1\n")
} else {
  simpson <- FALSE
  cat("Paradoks Simpson TIDAK terjadi\n")
}
## Paradoks Simpson TERJADI: OR marginal < 1, tetapi OR di kedua stratum > 1

Penyebabnya terlihat dari sebaran pengguna kelas online dan peluang lulus pada tiap jalur masuk:

# persentase pengguna kelas online di tiap jalur masuk
round(100 * c(Beasiswa = sum(beasiswa["Ya", ]) / sum(beasiswa),
              Reguler  = sum(reguler["Ya", ])  / sum(reguler)), 1)
## Beasiswa  Reguler 
##       30       70
# persentase mahasiswa yang lulus di tiap jalur masuk
round(100 * c(Beasiswa = sum(beasiswa[, "Lulus"]) / sum(beasiswa),
              Reguler  = sum(reguler[, "Lulus"])  / sum(reguler)), 1)
## Beasiswa  Reguler 
##       83       45

Uji Breslow-Day dan CMH

Uji Breslow-Day (homogenitas OR antar stratum)

H0: OR Beasiswa = OR Reguler (asosiasi homogen)
H1: OR berbeda antar stratum (ada interaksi tiga arah)

bd <- BreslowDayTest(data)
bd
## 
##  Breslow-Day test on Homogeneity of Odds Ratios
## 
## data:  data
## X-squared = 0.041761, df = 1, p-value = 0.8381

Uji Cochran-Mantel-Haenszel (independensi bersyarat)

H0: semua OR bersyarat sama dengan 1 (penggunaan kelas online dan kelulusan independen setelah jalur masuk dikontrol)
H1: ada asosiasi bersyarat

cmh <- mantelhaen.test(data, correct = FALSE)
cmh
## 
##  Mantel-Haenszel chi-squared test without continuity correction
## 
## data:  data
## Mantel-Haenszel X-squared = 7.6473, df = 1, p-value = 0.005686
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
##  1.233036 3.512387
## sample estimates:
## common odds ratio 
##          2.081081

Interpretasi dan Kesimpulan

Data gabungan (marginal)

Jika semua mahasiswa digabung tanpa memperhatikan jalur masuk, pengguna kelas online tampak lebih sulit lulus. Hanya 62% dari pengguna kelas online yang lulus, sedangkan pada mahasiswa yang tidak memakai kelas online sebesar 66%. Hal ini tercermin pada OR marginal sebesar 0.841. OR (odds ratio) membandingkan kecenderungan lulus dua kelompok: nilai di atas 1 berarti kelompok pertama (pengguna kelas online) lebih unggul, sedangkan nilai di bawah 1 berarti kelompok pertama tertinggal. Dengan nilai di bawah 1, data gabungan seolah-olah menyatakan bahwa kelas online justru menurunkan peluang lulus.

Data per jalur masuk (bersyarat)

Gambaran berubah setelah mahasiswa dipisah menurut jalur masuk. Pada jalur beasiswa, 90% pengguna kelas online lulus, dibandingkan 80% pada mahasiswa yang tidak memakai kelas online (OR = 2.25). Pada jalur reguler, angkanya 50% berbanding 33.3% (OR = 2). Kedua OR berada di atas 1, jadi di dalam setiap jalur masuk pengguna kelas online lebih unggul. Hasil yang berbalik arah antara data gabungan dan data per kelompok ini disebut Paradoks Simpson.

Penyebab paradoks

Jalur masuk memengaruhi dua hal sekaligus. Pertama, pengguna kelas online menumpuk di jalur reguler: 70% mahasiswa reguler memakai kelas online, sedangkan pada jalur beasiswa hanya 30%. Kedua, jalur reguler memiliki tingkat kelulusan yang jauh lebih rendah: hanya 45% mahasiswa reguler yang lulus, dibandingkan 83% pada jalur beasiswa. Akibatnya, sebagian besar pengguna kelas online berasal dari kelompok dengan peluang lulus rendah sehingga angka kelulusan gabungan mereka tertarik turun. Sebaliknya, mahasiswa yang tidak memakai kelas online banyak berasal dari jalur beasiswa yang peluang lulusnya tinggi sehingga angka gabungannya tampak lebih baik. Dengan kata lain, jalur masuk adalah variabel pengganggu (confounder).

Uji Breslow-Day

Uji ini memeriksa apakah besarnya asosiasi (OR) antara kelas online dan kelulusan sama di jalur beasiswa dan jalur reguler. Hasilnya, statistik uji sebesar 0.042 dengan derajat bebas 1 dan p-value 0.838. Karena p-value lebih besar dari 0,05, tidak cukup bukti bahwa OR berbeda antar jalur masuk (OR Beasiswa = 2.25 dan OR Reguler = 2). Asumsi OR homogen dapat diterima, sehingga kedua OR boleh diringkas menjadi satu OR gabungan Mantel-Haenszel.

Uji Cochran-Mantel-Haenszel (CMH)

Uji ini memeriksa apakah hubungan antara kelas online dan kelulusan masih ada setelah pengaruh jalur masuk dikesampingkan. Hasilnya, statistik uji sebesar 7.647 dengan p-value 0.00569. Karena p-value lebih kecil dari 0,05, hubungan tersebut nyata dan tidak terjadi hanya karena kebetulan. OR gabungan Mantel-Haenszel sebesar 2.081 (CI 95%: 1.233 sampai 3.512). Artinya, pada jalur masuk yang sama, odds lulus pengguna kelas online sekitar 2.08 kali lipat odds mahasiswa yang tidak memakai kelas online. Selang kepercayaan tersebut tidak memuat angka 1, sejalan dengan hasil uji.

Kesimpulan

Pada data gabungan, OR marginal sebesar 0.841 membuat pengguna kelas online tampak lebih sulit lulus. Setelah mahasiswa dipisah menurut jalur masuk, OR Beasiswa (2.25) dan OR Reguler (2) sama-sama berlawanan arah dengan OR marginal, sehingga terjadi Paradoks Simpson. Penyebabnya, jalur masuk bertindak sebagai variabel pengganggu: pengguna kelas online menumpuk di jalur reguler yang tingkat kelulusannya rendah. Uji Breslow-Day tidak menolak homogenitas OR (p-value = 0.838), dan uji CMH menunjukkan hubungan tetap nyata setelah jalur masuk dikontrol (OR Mantel-Haenszel = 2.08, CI 95%: 1.23 sampai 3.51). Jadi, pada jalur masuk yang sama, odds lulus pengguna kelas online sekitar 2.08 kali lipat odds mahasiswa yang tidak memakai kelas online. Hubungan kelas online dan kelulusan sebaiknya dinilai dari OR bersyarat ini, bukan dari data gabungan.