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")
)
| 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.
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:
Jalur masuk (Z): 200 mahasiswa Beasiswa dan 200 mahasiswa Reguler.
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.
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
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
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
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
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
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
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.
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.
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 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 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.
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.