Analisis Data Kategori adalah cabang statistika yang berfokus pada data yang berbentuk frekuensi atau cacahan hasil klasifikasi observasi ke dalam kategori-kategori tertentu. Data jenis ini tidak berskala numerik kontinu, melainkan hanya menyatakan keanggotaan suatu kelompok atau kelas.
Dalam kehidupan sehari-hari, data kategori sangat mudah dijumpai. Di bidang kesehatan misalnya, seseorang diklasifikasikan berdasarkan status vaksinasi, jenis kelamin, atau ada tidaknya suatu penyakit. Di bidang sosial, seseorang dikelompokkan berdasarkan tingkat pendidikan, status pekerjaan, atau golongan pendapatan. Karena data semacam ini tidak dapat diperlakukan seperti data numerik biasa, diperlukan metode analisis yang khusus.
Salah satu pendekatan yang paling mendasar dan banyak digunakan dalam analisis data kategori adalah tabel kontingensi. Tabel ini memungkinkan kita untuk melihat bagaimana dua variabel kategori saling berhubungan, sekaligus menjadi dasar untuk menghitung berbagai ukuran kekuatan asosiasi antarvariabel. Laporan ini membahas konsep tabel kontingensi dua arah beserta tiga ukuran asosiasi utama yang umum digunakan, yaitu beda peluang, risiko relatif, dan odds ratio.
Tabel Kontingensi (contingency table) adalah tabel klasifikasi silang (cross-tabulation) yang menyajikan distribusi frekuensi bersama dari dua atau lebih variabel kategori secara simultan. Melalui tabel ini, dapat dilihat seberapa sering setiap kombinasi kategori muncul dalam data.
Tabel kontingensi diberi nama berdasarkan jumlah variabel yang terlibat. Jika hanya ada dua variabel, disebut tabel kontingensi dua arah. Jika ada tiga variabel, disebut tabel kontingensi tiga arah. Apabila variabel yang terlibat lebih dari tiga, maka disebut tabel kontingensi multi arah. Dalam laporan ini, fokus pembahasan ada pada tabel kontingensi dua arah karena merupakan bentuk yang paling dasar dan paling banyak digunakan.
Misalkan terdapat dua variabel kategori, yaitu variabel \(X\) dengan \(I\) kategori dan variabel \(Y\) dengan \(J\) kategori. Tabel klasifikasi silang antara keduanya membentuk tabel berukuran \(I \times J\), di mana setiap sel berisi frekuensi observasi yang termasuk dalam kombinasi kategori tertentu.
| X Y | \(y_1\) | \(y_2\) | \(\cdots\) | \(y_J\) | Total |
|---|---|---|---|---|---|
| \(x_1\) | \(n_{11}\) | \(n_{12}\) | \(\cdots\) | \(n_{1J}\) | \(n_{1\cdot}\) |
| \(x_2\) | \(n_{21}\) | \(n_{22}\) | \(\cdots\) | \(n_{2J}\) | \(n_{2\cdot}\) |
| \(\vdots\) | \(\vdots\) | \(\vdots\) | \(\ddots\) | \(\vdots\) | \(\vdots\) |
| \(x_I\) | \(n_{I1}\) | \(n_{I2}\) | \(\cdots\) | \(n_{IJ}\) | \(n_{I\cdot}\) |
| Total | \(n_{\cdot 1}\) | \(n_{\cdot 2}\) | \(\cdots\) | \(n_{\cdot J}\) | \(n_{\cdot\cdot}\) |
Notasi yang digunakan: \(n_{ij}\) adalah frekuensi sel baris ke-\(i\) kolom ke-\(j\); \(n_{i\cdot}\) adalah total marginal baris ke-\(i\) yang diperoleh dengan menjumlahkan semua nilai pada baris tersebut; \(n_{\cdot j}\) adalah total marginal kolom ke-\(j\); dan \(n_{\cdot\cdot}\) adalah total keseluruhan observasi.
Bentuk paling sederhana dari tabel kontingensi dua arah adalah ketika masing-masing variabel hanya memiliki dua kategori, sehingga terbentuk tabel berukuran \(2 \times 2\). Berikut adalah strukturnya beserta notasi lengkap yang digunakan dalam perhitungan:
| X Y | \(y_1\) | \(y_2\) | Total |
|---|---|---|---|
| \(x_1\) | \(n_{11}\) | \(n_{12}\) | \(n_{1\cdot}\) |
| \(x_2\) | \(n_{21}\) | \(n_{22}\) | \(n_{2\cdot}\) |
| Total | \(n_{\cdot 1}\) | \(n_{\cdot 2}\) | \(n_{\cdot\cdot}\) |
Dari tabel di atas berlaku hubungan berikut:
Apabila variabel \(X\) dan \(Y\) merupakan variabel acak dan sampel dipilih secara acak dari suatu populasi, maka tabel kontingensi tersebut memiliki distribusi peluang. Terdapat tiga jenis distribusi peluang yang perlu dipahami.
Peluang bersama \(\pi_{ij}\) menyatakan peluang bahwa suatu observasi secara serentak masuk ke kategori \(X = i\) dan \(Y = j\). Estimasinya diperoleh dari proporsi frekuensi sel terhadap total keseluruhan:
\[\pi_{ij} = P(X = i,\ Y = j), \quad \text{diestimasi oleh} \quad \hat{\pi}_{ij} = \frac{n_{ij}}{n_{\cdot\cdot}}\]
Sifat: \(\displaystyle\sum_{i}\sum_{j} \pi_{ij} = 1\)
Peluang marginal adalah peluang yang hanya memperhatikan satu variabel saja, tanpa mempertimbangkan variabel lainnya. Peluang marginal diperoleh dengan menjumlahkan peluang bersama sepanjang satu dimensi:
Marginal untuk X (baris ke-i): \[\pi_{i\cdot} = \sum_{j=1}^{J} \pi_{ij} = \pi_{i1} + \pi_{i2}\]
Marginal untuk Y (kolom ke-j): \[\pi_{\cdot j} = \sum_{i=1}^{I} \pi_{ij} = \pi_{1j} + \pi_{2j}\]
Sifat: \(\displaystyle\sum_{i} \pi_{i\cdot} = \sum_{j} \pi_{\cdot j} = 1\)
Penjumlahan total: \(\pi_{11} + \pi_{12} + \pi_{21} + \pi_{22} = \pi_{1\cdot} + \pi_{2\cdot} = \pi_{\cdot 1} + \pi_{\cdot 2} = 1\)
Peluang bersyarat menyatakan peluang suatu kategori \(Y\) terjadi dengan kondisi bahwa kategori \(X\) tertentu sudah diketahui. Jika variabel \(X\) dijadikan syarat, maka peluang bersyarat \(Y = j\) diberikan \(X = h\) adalah:
\[\pi_{j|h} = P(Y = j \mid X = h) = \frac{\pi_{hj}}{\pi_{h\cdot}}\]
dengan sifat \(\displaystyle\sum_{j} \pi_{j|h} = 1\) untuk setiap nilai \(h\).
Distribusi peluang bersyarat untuk tabel 2 x 2 apabila \(X\) dijadikan syarat adalah sebagai berikut:
| X Y | \(y_1\) | \(y_2\) | Total |
|---|---|---|---|
| \(x_1\) | \(\pi_{1 \mid 1}\) | \(\pi_{2 \mid 1}\) | 1 |
| \(x_2\) | \(\pi_{1 \mid 2}\) | \(\pi_{2 \mid 2}\) | 1 |
Di sini \(\pi_{j|i}\) adalah peluang kategori \(Y\) ke-\(j\) bersyarat variabel \(X\) ke-\(i\), dan berlaku \(\pi_{1|i} + \pi_{2|i} = 1\) untuk setiap \(i\).
Kondisi Independensi: Jika \(X\) dan \(Y\) saling bebas (independen), maka berlaku: \[\pi_{hj} = \pi_{h\cdot} \times \pi_{\cdot j} \quad \text{atau ekuivalen} \quad \pi_{j|h} = \pi_{\cdot j}\] Artinya, peluang variabel respons \(Y = j\) tidak bergantung pada kategori \(X\) — distribusi bersyarat \(Y\) sama untuk setiap baris \(X\).
Cara data dikumpulkan sangat memengaruhi interpretasi tabel kontingensi dan ukuran asosiasi yang tepat digunakan. Terdapat tiga jenis desain sampling yang relevan.
| Desain | Penjelasan | Contoh di Indonesia | Distribusi Relevan |
|---|---|---|---|
| Prospektif | Pengelompokan variabel X (prediktor) ditetapkan terlebih dahulu, kemudian variabel respons Y diamati setelahnya. Peneliti memiliki kendali atas pengelompokan. | Uji klinis obat antihipertensi (kelompok diberi obat vs plasebo, lalu diamati tekanan darahnya); Studi kohort perokok dan kanker paru di Indonesia | Peluang bersyarat Y diberikan X |
| Retrospektif | Variabel respons Y (outcome) ditetapkan terlebih dahulu, kemudian ditelusuri prediktor X yang melatarbelakanginya. Perbandingan distribusi Y bersyarat X tidak bisa dikerjakan langsung. | Studi kasus-kontrol pasien HIV/AIDS di RSCM Jakarta: pasien ditetapkan lebih dulu, lalu ditelusuri riwayat perilaku risikonya | Peluang bersyarat X diberikan Y |
| Cross Sectional | Sampel acak diambil dari populasi, lalu setiap unit diklasifikasikan menurut X dan Y secara bersamaan. Peneliti hanya mengamati apa yang terjadi. | Survei Kesehatan Dasar (Riskesdas) oleh Kemenkes RI: responden diklasifikasikan menurut status gizi dan wilayah tempat tinggal secara bersamaan | Peluang bersama |
Hubungan antara dua variabel acak \(X\) dan \(Y\) yang keduanya bersifat kategori dalam tabel kontingensi disebut asosiasi. Asosiasi dalam tabel kontingensi dibentuk berdasarkan distribusi peluang bersyaratnya. Pada tabel kontingensi dua arah terdapat tiga jenis ukuran asosiasi, yaitu beda peluang, risiko relatif, dan rasio odds.
Jika \(Y\) merupakan variabel respons, beda peluang bersyarat \(Y = j\) untuk dua kategori dari \(X\), yaitu \(h\) dan \(i\), memberikan indikasi ada tidaknya asosiasi antara keduanya:
\[\Delta = \pi_{j|h} - \pi_{j|i}\]
Nilai beda sebesar nol, atau \(\pi_{j|h} = \pi_{j|i}\), mencerminkan keadaan tidak terdapat asosiasi, artinya peluang nilai variabel respons \(Y = j\) tidak bergantung pada kategori \(X\). Sehingga berlaku:
\[\pi_{j|h} = \pi_{j|i} = \pi_{\cdot j} \quad \Longrightarrow \quad X \text{ dan } Y \text{ independen}\]
Rentang nilai: \(-1 \leq \Delta \leq 1\)
Nilai \(\Delta > 0\) menunjukkan kelompok \(h\) memiliki peluang lebih tinggi untuk mengalami respons \(Y = j\), sedangkan \(\Delta < 0\) menunjukkan sebaliknya.
Keterbatasan Beda Peluang: Beda peluang antara dua baris mungkin menghasilkan nilai yang sama walaupun peluang-peluangnya tidak sama. Beda peluang akan memberikan kesimpulan yang keliru pada saat peluang-peluang yang terlibat bernilai sangat kecil. Misalnya, selisih antara 0,04 dan 0,02 menghasilkan \(\Delta = 0,02\) yang terlihat kecil, padahal secara relatif kelompok pertama memiliki risiko dua kali lebih besar. Untuk situasi seperti ini, risiko relatif menjadi pilihan yang lebih informatif.
Risiko Relatif (RR) merupakan alternatif yang dapat mengatasi keterbatasan beda peluang. RR adalah rasio antara dua peluang bersyarat, yaitu antara peluang \(Y = j\) dalam baris \(X = h\) dengan \(X = i\):
\[RR = \frac{\pi_{j|h}}{\pi_{j|i}}\]
Nilai RR berkisar dalam interval \(0\) sampai \(\infty\). Nilai RR sama dengan 1 mengindikasikan tidak adanya asosiasi antara variabel \(X\) dengan variabel \(Y\):
\[RR = 1 \quad \Longrightarrow \quad \pi_{j|h} = \pi_{j|i} \quad \Longrightarrow \quad Y \text{ dan } X \text{ independen}\]
Nilai \(RR > 1\) menunjukkan kelompok \(h\) berisiko lebih tinggi mengalami respons \(j\), sementara \(RR < 1\) menunjukkan risiko yang lebih rendah dibandingkan kelompok \(i\).
Catatan Penggunaan RR: Risiko relatif dapat diinterpretasikan secara langsung hanya pada desain prospektif (clinical trial atau cohort study). Pada desain retrospektif (case-control study), RR tidak dapat dihitung secara valid karena total baris tidak mencerminkan proporsi populasi yang sesungguhnya. Dalam situasi tersebut, odds ratio menjadi ukuran yang lebih tepat digunakan.
Beda peluang dan risiko relatif membandingkan sebuah respons \(Y\) menurut dua baris berbeda dari \(X\). Perbandingan dua respons \(Y\) dalam \(X\) yang sama menghasilkan sebuah odds. Kemungkinan terjadinya respons \(j\) dalam \(X = i\) berbanding dengan respons \(k\) juga dalam \(X = i\) dinyatakan dalam odds berikut:
\[\Psi_i(j,k) = \frac{\pi_{j|i}}{\pi_{k|i}}, \quad j \neq k = 1, \ldots, J; \quad i = 1, \ldots, I\]
Apabila \(X\) dan \(Y\) keduanya merupakan variabel respons, maka berdasarkan definisi peluang bersyarat, odds dalam baris \(i\) untuk \(Y = j\) dan \(k\) adalah:
\[\Psi_i(j,k) = \frac{\pi_{ij}}{\pi_{ik}}\]
Hasilnya merupakan nilai non-negatif yang memperlihatkan apakah \(j\) lebih mungkin terjadi dibanding \(k\). Sebuah nilai \(> 1\) memperlihatkan bahwa \(j\) lebih mungkin dibanding \(k\). Misalnya jika \(\Psi_i(j,k) = 4\), artinya respons \(j\) empat kali lebih mungkin terjadi dibandingkan respons \(k\) apabila \(X = i\).
Asosiasi antara \(X\) dengan \(Y\) diperlihatkan melalui rasio dua buah odds — misalnya odds baris 1 dan odds baris 2 — yang disebut odds ratio. Untuk dua buah level \(X\), yaitu \(h\) dan \(i\), odds ratio respons \(j\) dan \(k\) adalah:
\[\Psi_{hi}(j,k) = \frac{\Psi_h(j,k)}{\Psi_i(j,k)} = \frac{\pi_{j|h} / \pi_{k|h}}{\pi_{j|i} / \pi_{k|i}}\]
Yang dapat disederhanakan menjadi perkalian silang (cross product):
\[\Psi_{hi}(j,k) = \frac{\pi_{j|h} \times \pi_{k|i}}{\pi_{j|i} \times \pi_{k|h}} = \frac{\pi_{hj} \times \pi_{ik}}{\pi_{ij} \times \pi_{hk}}\]
Untuk tabel 2 x 2 secara khusus, odds ratio merupakan cross product dari elemen-elemen pada diagonal:
\[\boxed{OR = \frac{n_{11} \times n_{22}}{n_{12} \times n_{21}} = \frac{ad}{bc}}\]
| \(y_1\) | \(y_2\) | Total | |
|---|---|---|---|
| \(x_1\) | \(a = n_{11}\) | \(b = n_{12}\) | \(n_{1\cdot}\) |
| \(x_2\) | \(c = n_{21}\) | \(d = n_{22}\) | \(n_{2\cdot}\) |
| Total | \(n_{\cdot 1}\) | \(n_{\cdot 2}\) | \(n_{\cdot\cdot}\) |
Nilai odds ratio berkisar dalam interval \(0\) sampai \(\infty\). Nilai OR sama dengan 1 mengindikasikan tidak adanya asosiasi. Nilai \(OR > 1\) mengindikasikan bahwa subjek-subjek dalam baris \(h\) lebih mungkin menghasilkan respons \(j\) dibandingkan dengan subjek dalam baris \(i\), sebanyak \(\Psi_{hi}\) kalinya.
Catatan penting: Untuk tabel \(I \times J\) yang lebih besar, tidak perlu menghitung seluruh kombinasi 2 x 2. Cukup diwakili oleh sebanyak \((I-1) \times (J-1)\) odds ratio saja, dengan menetapkan satu kategori dari baris dan satu dari kolom sebagai patokan (baseline). OR juga berlaku untuk semua desain sampling dan merupakan parameter utama dalam model regresi logistik.
Untuk memperjelas konsep yang telah diuraikan, berikut disajikan contoh perhitungan menggunakan data survei hipotetis yang menggambarkan hubungan antara status aktivitas fisik dan kejadian hipertensi pada 250 responden dewasa.
| Aktivitas Fisik (X) | Hipertensi (\(y_1\)) | Tidak Hipertensi (\(y_2\)) | Total |
|---|---|---|---|
| Aktif Berolahraga | 30 | 95 | 125 |
| Tidak Aktif Berolahraga | 95 | 30 | 125 |
| Total | 125 | 125 | 250 |
Dari tabel tersebut diperoleh: \(a = 30\), \(b = 95\), \(c = 95\), \(d = 30\), dengan total baris masing-masing \(n_{1\cdot} = n_{2\cdot} = 125\).
\[\hat{\pi}_{11} = \frac{30}{250} = 0{,}12, \quad \hat{\pi}_{12} = \frac{95}{250} = 0{,}38\] \[\hat{\pi}_{21} = \frac{95}{250} = 0{,}38, \quad \hat{\pi}_{22} = \frac{30}{250} = 0{,}12\]
Verifikasi: \(0{,}12 + 0{,}38 + 0{,}38 + 0{,}12 = 1\) \(\checkmark\)
\[\hat{\pi}_{1\cdot} = \frac{125}{250} = 0{,}50 \quad \text{(peluang aktif berolahraga)}\] \[\hat{\pi}_{\cdot 1} = \frac{125}{250} = 0{,}50 \quad \text{(peluang hipertensi)}\]
\[\hat{\pi}_{1|1} = P(\text{Hipertensi} \mid \text{Aktif}) = \frac{30}{125} = 0{,}24\]
\[\hat{\pi}_{1|2} = P(\text{Hipertensi} \mid \text{Tidak Aktif}) = \frac{95}{125} = 0{,}76\]
\[\Delta = \hat{\pi}_{1|1} - \hat{\pi}_{1|2} = 0{,}24 - 0{,}76 = \mathbf{-0{,}52}\]
\[RR = \frac{\hat{\pi}_{1|1}}{\hat{\pi}_{1|2}} = \frac{0{,}24}{0{,}76} = \mathbf{0{,}316}\]
\[\Psi_1 = \frac{\hat{\pi}_{1|1}}{\hat{\pi}_{2|1}} = \frac{0{,}24}{0{,}76} = \frac{30}{95} \approx 0{,}316 \quad \text{(odds aktif)}\]
\[\Psi_2 = \frac{\hat{\pi}_{1|2}}{\hat{\pi}_{2|2}} = \frac{0{,}76}{0{,}24} = \frac{95}{30} \approx 3{,}167 \quad \text{(odds tidak aktif)}\]
\[OR = \frac{\Psi_1}{\Psi_2} = \frac{0{,}316}{3{,}167} \approx \mathbf{0{,}0997}\]
Verifikasi dengan perkalian silang:
\[OR = \frac{a \times d}{b \times c} = \frac{30 \times 30}{95 \times 95} = \frac{900}{9025} \approx \mathbf{0{,}0997} \checkmark\]
# Membuat matriks tabel kontingensi
data_hipertensi <- matrix(
c(30, 95, 95, 30),
nrow = 2,
byrow = TRUE,
dimnames = list(
c("Aktif Berolahraga", "Tidak Aktif"),
c("Hipertensi", "Tidak Hipertensi")
)
)
data_hipertensi Hipertensi Tidak Hipertensi
Aktif Berolahraga 30 95
Tidak Aktif 95 30
Hipertensi Tidak Hipertensi
Aktif Berolahraga 0.12 0.38
Tidak Aktif 0.38 0.12
Aktif Berolahraga Tidak Aktif
0.5 0.5
Hipertensi Tidak Hipertensi
Aktif Berolahraga 0.24 0.76
Tidak Aktif 0.76 0.24
a <- data_hipertensi[1, 1]
b <- data_hipertensi[1, 2]
c <- data_hipertensi[2, 1]
d <- data_hipertensi[2, 2]
beda_peluang <- (a / (a + b)) - (c / (c + d))
risiko_relatif <- (a / (a + b)) / (c / (c + d))
odds_ratio <- (a * d) / (b * c)
cat("Beda Peluang :", round(beda_peluang, 4), "\n")Beda Peluang : -0.52
Risiko Relatif : 0.3158
Odds Ratio : 0.0997
Pearson's Chi-squared test with Yates' continuity correction
data: data_hipertensi
X-squared = 65.536, df = 1, p-value = 5.706e-16
proporsi <- prop.table(data_hipertensi, margin = 1)
barplot(
t(proporsi),
beside = TRUE,
col = c("#1d6fa4", "#a8dadc"),
ylim = c(0, 0.95),
ylab = "Proporsi",
xlab = "Status Aktivitas Fisik",
main = "Proporsi Hipertensi berdasarkan Status Aktivitas Fisik",
legend.text = colnames(proporsi),
args.legend = list(x = "topright", bty = "n", cex = 0.95)
)Proporsi Kejadian Hipertensi berdasarkan Status Aktivitas Fisik
Berdasarkan data yang dianalisis, diperoleh nilai beda peluang sebesar \(-0,52\). Nilai negatif ini menunjukkan bahwa kelompok yang aktif berolahraga memiliki peluang mengalami hipertensi yang lebih rendah dibandingkan kelompok yang tidak aktif, dengan selisih sebesar 52 poin persentase. Secara rinci, hanya 24% dari kelompok aktif yang mengalami hipertensi, sedangkan pada kelompok tidak aktif angka tersebut mencapai 76%.
Risiko relatif yang diperoleh sebesar 0,316 memperkuat temuan tersebut. Artinya, risiko terkena hipertensi pada kelompok aktif berolahraga hanya sekitar 31,6% dari risiko yang dialami kelompok tidak aktif, atau dengan kata lain kelompok aktif memiliki risiko hipertensi sekitar tiga kali lebih rendah. Sementara itu, odds ratio sebesar 0,0997 menunjukkan bahwa odds kelompok aktif mengalami hipertensi hanya sekitar sepersepuluh dari odds kelompok tidak aktif. Karena prevalensi hipertensi dalam data ini cukup tinggi, OR terlihat jauh lebih ekstrem dibandingkan RR, yang merupakan konsekuensi wajar dari perbedaan karakteristik kedua ukuran ini.
Hasil uji chi-square menunjukkan nilai yang signifikan secara statistik dengan \(p\)-value jauh di bawah 0,05. Hal ini berarti terdapat asosiasi yang bermakna antara status aktivitas fisik dan kejadian hipertensi dalam data ini, dan asosiasi tersebut sangat kecil kemungkinannya terjadi hanya karena kebetulan.
Secara keseluruhan, ketiga ukuran asosiasi yang dihitung semuanya mengarah pada kesimpulan yang sama: terdapat hubungan yang kuat dan negatif antara kebiasaan berolahraga dengan kejadian hipertensi. Kelompok yang tidak aktif secara fisik memiliki kecenderungan yang jauh lebih besar untuk mengalami hipertensi dibandingkan kelompok yang rutin berolahraga.
Inferensi pada tabel kontingensi dua arah mencakup dua pendekatan utama: estimasi (titik dan interval kepercayaan untuk ukuran asosiasi seperti RD, RR, dan OR) serta pengujian hipotesis (uji proporsi, chi-square, likelihood ratio, dan Fisher exact test). Tujuannya adalah menyimpulkan apakah ada hubungan nyata antara dua variabel kategori dalam populasi berdasarkan data sampel.
\[RD = \hat{p}_{j|h} - \hat{p}_{j|i}\]
Standard Error: \[SE(RD) = \sqrt{\frac{\hat{p}_{j|h}(1-\hat{p}_{j|h})}{n_{h+}} + \frac{\hat{p}_{j|i}(1-\hat{p}_{j|i})}{n_{i+}}}\]
Interval Kepercayaan 95%: \[RD \pm 1{,}96 \times SE(RD)\]
\[RR = \frac{\hat{p}_{j|h}}{\hat{p}_{j|i}}\]
Karena distribusi \(\ln(RR)\) lebih mendekati normal, interval kepercayaan dihitung di skala log:
\[SE(\ln RR) = \sqrt{\frac{1-\hat{p}_{j|h}}{n_{h+}\hat{p}_{j|h}} + \frac{1-\hat{p}_{j|i}}{n_{i+}\hat{p}_{j|i}}}\]
Interval Kepercayaan 95%: \[\exp\!\left(\ln RR \pm 1{,}96 \times SE(\ln RR)\right)\]
\[OR = \hat{\theta} = \frac{n_{11} \cdot n_{22}}{n_{12} \cdot n_{21}}\]
\[SE(\ln OR) = \sqrt{\frac{1}{n_{11}} + \frac{1}{n_{12}} + \frac{1}{n_{21}} + \frac{1}{n_{22}}}\]
Interval Kepercayaan 95%: \[\exp\!\left(\ln OR \pm 1{,}96 \times SE(\ln OR)\right)\]
Catatan: Jika ada sel yang bernilai nol (\(n_{ij} = 0\)), tambahkan koreksi 0,5 pada setiap sel sebelum menghitung OR.
\[H_0: \pi_{ij} = \pi_{i+}\pi_{+j} \quad \text{(X dan Y independen)}\]
\[X^2 = \sum_i \sum_j \frac{(n_{ij} - \hat{\mu}_{ij})^2}{\hat{\mu}_{ij}}, \quad \hat{\mu}_{ij} = \frac{n_{i+} \cdot n_{+j}}{n}\]
Distribusi referensi: \(X^2 \sim \chi^2_{(I-1)(J-1)}\). Tolak \(H_0\) jika \(p\)-value \(< \alpha\).
\[G^2 = 2\sum_i\sum_j n_{ij} \ln\!\left(\frac{n_{ij}}{\hat{\mu}_{ij}}\right)\]
\(G^2\) mengikuti distribusi \(\chi^2_{(I-1)(J-1)}\). Untuk sampel besar, \(X^2 \approx G^2\), namun \(G^2\) lebih tepat untuk distribusi-distribusi yang tidak simetris.
Residual Pearson: mengukur kontribusi tiap sel terhadap \(X^2\). \[e_{ij} = \frac{n_{ij} - \hat{\mu}_{ij}}{\sqrt{\hat{\mu}_{ij}}}\]
Standardized Residual (Adjusted Residual): lebih informatif karena mempertimbangkan total marginal. \[r_{ij} = \frac{n_{ij} - \hat{\mu}_{ij}}{\sqrt{\hat{\mu}_{ij}(1-\hat{p}_{i+})(1-\hat{p}_{+j})}}\]
Nilai \(|r_{ij}| > 2\) mengindikasikan sel tersebut berkontribusi signifikan terhadap asosiasi.
Untuk tabel \(I \times J\), nilai \(X^2\) keseluruhan dapat dipecah menjadi \((I-1)(J-1)\) komponen yang independen satu sama lain. Tiap komponen bersesuaian dengan tabel 2×2 yang dibentuk dari kategori-kategori tertentu. Cara ini berguna untuk mengetahui kategori mana yang paling menyebabkan ketidakindependenan.
Untuk tabel 2×3 (df = 2), dipecah menjadi dua partisi:
| Partisi | Isi | df |
|---|---|---|
| Partisi 1 | Kolom 1 vs Kolom 2 | 1 |
| Partisi 2 | (Kolom 1 + Kolom 2) vs Kolom 3 | 1 |
Syarat: \(\chi^2_{P1} + \chi^2_{P2} = \chi^2_{\text{total}}\)
Digunakan ketika sampel kecil atau frekuensi harapan \(< 5\). \(p\)-value dihitung dari distribusi hipergeometrik:
\[P(n_{11}) = \frac{\binom{n_{1+}}{n_{11}}\binom{n_{2+}}{n_{+1}-n_{11}}}{\binom{n}{n_{+1}}}\]
Tidak memerlukan asumsi asimtotik — berlaku untuk semua ukuran sampel.
Berikut contoh penerapan inferensi menggunakan data survei kesehatan hipotetis mengenai hubungan status merokok dengan kejadian penyakit jantung pada 500 responden dewasa.
library(knitr); library(kableExtra)
# Data: Merokok vs Penyakit Jantung
tbl_jantung <- matrix(
c(120, 80, 60, 240),
nrow = 2, byrow = TRUE,
dimnames = list(c("Perokok","Non-Perokok"),
c("Sakit Jantung","Sehat"))
)
kable(addmargins(tbl_jantung), format = "html",
caption = "Hubungan Merokok × Penyakit Jantung (n=500)",
align = "ccc") |>
kable_styling(bootstrap_options = c("bordered","hover"),
full_width = FALSE, position = "center") |>
row_spec(0, bold = TRUE, background = "#0d3b66", color = "white") |>
row_spec(3, bold = TRUE, background = "#457b9d", color = "white") |>
column_spec(1, bold = TRUE)| Sakit Jantung | Sehat | Sum | |
|---|---|---|---|
| Perokok | 120 | 80 | 200 |
| Non-Perokok | 60 | 240 | 300 |
| Sum | 180 | 320 | 500 |
a <- tbl_jantung[1,1]; b <- tbl_jantung[1,2]
c <- tbl_jantung[2,1]; d <- tbl_jantung[2,2]
n1 <- a+b; n2 <- c+d; z <- qnorm(0.975)
p1 <- a/n1; p2 <- c/n2
# RD
RD <- p1 - p2
ci_RD <- RD + c(-1,1)*z*sqrt(p1*(1-p1)/n1 + p2*(1-p2)/n2)
# RR
RR <- p1/p2
ci_RR <- exp(log(RR) + c(-1,1)*z*sqrt((1-p1)/(n1*p1)+(1-p2)/(n2*p2)))
# OR
OR <- (a*d)/(b*c)
ci_OR <- exp(log(OR) + c(-1,1)*z*sqrt(1/a+1/b+1/c+1/d))
df_hasil <- data.frame(
Ukuran = c("p₁ (Perokok)","p₂ (Non-Perokok)","RD","RR","OR"),
Estimasi = round(c(p1,p2,RD,RR,OR),4),
Batas_Bawah = round(c(p1-z*sqrt(p1*(1-p1)/n1), p2-z*sqrt(p2*(1-p2)/n2),
ci_RD[1],ci_RR[1],ci_OR[1]),4),
Batas_Atas = round(c(p1+z*sqrt(p1*(1-p1)/n1), p2+z*sqrt(p2*(1-p2)/n2),
ci_RD[2],ci_RR[2],ci_OR[2]),4)
)
kable(df_hasil, format="html",
col.names=c("Ukuran","Estimasi","CI Bawah 95%","CI Atas 95%"),
caption="Ringkasan Estimasi Ukuran Asosiasi") |>
kable_styling(bootstrap_options=c("striped","bordered"),
full_width=FALSE, position="center") |>
row_spec(0, bold=TRUE, background="#0d3b66", color="white") |>
column_spec(1, bold=TRUE)| Ukuran | Estimasi | CI Bawah 95% | CI Atas 95% |
|---|---|---|---|
| p₁ (Perokok) | 0.6 | 0.5321 | 0.6679 |
| p₂ (Non-Perokok) | 0.2 | 0.1547 | 0.2453 |
| RD | 0.4 | 0.3184 | 0.4816 |
| RR | 3.0 | 2.3293 | 3.8638 |
| OR | 6.0 | 4.0216 | 8.9516 |
# Chi-square
chi_j <- chisq.test(tbl_jantung, correct=FALSE)
# G2
G2_j <- 2*sum(tbl_jantung*log(tbl_jantung/chi_j$expected))
# Fisher
fish_j <- fisher.test(tbl_jantung)
cat("Chi-square X² =", round(chi_j$statistic,4), " p-value =", round(chi_j$p.value,6), "\n")Chi-square X² = 83.3333 p-value = 0
G² = 83.9721 p-value = 0
Fisher OR = 5.9751 p-value = 0
Perokok memiliki proporsi penyakit jantung sebesar 60%, sementara non-perokok hanya 20%. RD = 0,40 menunjukkan selisih 40 poin persentase; RR = 3,00 artinya perokok berisiko 3 kali lebih tinggi; OR = 6,00 menunjukkan odds perokok terkena penyakit jantung enam kali lebih besar. Semua uji hipotesis menghasilkan \(p\)-value \(< 0{,}001\) — terdapat asosiasi yang sangat kuat dan signifikan antara merokok dan penyakit jantung.
Tabel kontingensi tiga arah melibatkan tiga variabel kategori: variabel prediktor \(X\), variabel respons \(Y\), dan variabel kontrol \(Z\). Saat mempelajari hubungan \(X\) terhadap \(Y\), penting untuk “mengendalikan” variabel \(Z\) yang diduga mempengaruhi hubungan tersebut — caranya dengan membuat tabel parsial untuk setiap level \(Z\).
Contoh klasik: hubungan antara kebiasaan merokok (X) dan kanker paru (Y), dengan usia (Z) sebagai variabel kontrol karena usia berkaitan dengan keduanya.
Tabel Parsial adalah tabel 2×2 yang dibentuk untuk setiap level \(Z_k\) — menunjukkan hubungan \(X\)–\(Y\) dalam kelompok \(Z\) tertentu.
Tabel Marginal adalah tabel \(X\)–\(Y\) yang diperoleh dengan menjumlahkan semua tabel parsial — menunjukkan hubungan \(X\)–\(Y\) tanpa memperhitungkan \(Z\).
| Kelompok Usia (Z) | Status Vaksin (X) | Infeksi (Y=1) | Sehat (Y=0) |
|---|---|---|---|
| Muda | Vaksin | 20 | 180 |
| Muda | Tidak Vaksin | 80 | 120 |
| Tua | Vaksin | 40 | 160 |
| Tua | Tidak Vaksin | 120 | 80 |
| Marginal | Vaksin | 60 | 340 |
| Marginal | Tidak Vaksin | 200 | 200 |
# OR tabel parsial Z=Muda
OR_muda <- (20*120)/(80*180)
# OR tabel parsial Z=Tua
OR_tua <- (40*80)/(120*160)
# OR marginal
OR_mar <- (60*200)/(200*340)
cat("OR bersyarat (Z=Muda) :", round(OR_muda, 4), "\n")OR bersyarat (Z=Muda) : 0.1667
OR bersyarat (Z=Tua) : 0.1667
OR marginal (tanpa Z) : 0.1765
Pada kelompok muda maupun tua, OR bersyarat menunjukkan nilai yang sama (~0,167) — artinya vaksin secara konsisten menurunkan risiko infeksi. Namun OR marginal (~0,176) sedikit berbeda karena penggabungan tabel. Perbedaan antara OR bersyarat dan marginal yang lebih ekstrem disebut Simpson’s Paradox.
Simpson’s Paradox terjadi ketika asosiasi antara \(X\) dan \(Y\) pada tabel parsial berbeda arahnya dengan asosiasi pada tabel marginal. Hal ini disebabkan oleh variabel perancu \(Z\) yang tidak diperhitungkan. Oleh karena itu, selalu penting untuk mengontrol variabel perancu sebelum mengambil kesimpulan dari data kategori.
\(X\) dan \(Y\) dikatakan independen bersyarat terhadap \(Z\) apabila OR bersyarat pada setiap tabel parsial bernilai 1. Namun perlu diingat: independensi bersyarat tidak menjamin independensi marginal — OR marginal bisa saja \(\neq 1\) meskipun setiap OR bersyarat = 1.
Uji CMH digunakan untuk menguji independensi bersyarat \(X\)–\(Y\) dengan mengontrol \(Z\) pada tabel \(2 \times 2 \times K\).
\[H_0: \theta_{XY(k)} = 1 \text{ untuk setiap } k \qquad \text{vs} \qquad H_1: \theta_{XY(k)} \neq 1 \text{ untuk setidaknya satu } k\]
\[CMH = \frac{\left[\displaystyle\sum_k (n_{11k} - \mu_{11k})\right]^2}{\displaystyle\sum_k \text{Var}(n_{11k})}\]
di mana: \[\mu_{11k} = \frac{n_{1\cdot k} \cdot n_{\cdot 1k}}{n_{\cdot\cdot k}}, \qquad \text{Var}(n_{11k}) = \frac{n_{1\cdot k}\, n_{2\cdot k}\, n_{\cdot 1k}\, n_{\cdot 2k}}{n_{\cdot\cdot k}^2(n_{\cdot\cdot k}-1)}\]
CMH mengikuti distribusi \(\chi^2_1\). Tolak \(H_0\) jika \(p\)-value \(< \alpha\).
Jika OR bersyarat relatif homogen di semua level \(Z\), dapat dihitung satu nilai ringkasan OR menggunakan estimator Mantel-Haenszel:
\[\hat{\theta}_{MH} = \frac{\displaystyle\sum_k \frac{n_{11k}\, n_{22k}}{n_{\cdot\cdot k}}}{\displaystyle\sum_k \frac{n_{12k}\, n_{21k}}{n_{\cdot\cdot k}}}\]
Interval kepercayaan dihitung di skala log: \[\exp\!\left(\ln\hat{\theta}_{MH} \pm 1{,}96 \cdot \hat{\sigma}[\ln\hat{\theta}_{MH}]\right)\]
Sebelum menggunakan OR bersama, perlu diuji apakah OR di tiap level \(Z\) homogen:
\[H_0: \theta_{XY(1)} = \theta_{XY(2)} = \cdots = \theta_{XY(K)}\]
\[BD = \sum_{k=1}^{K} \frac{(n_{ijk} - \hat{\mu}_{ijk})^2}{\hat{\mu}_{ijk}} \sim \chi^2_{K-1}\]
Jika \(p\)-value \(>\) \(\alpha\): OR homogen → gunakan \(\hat{\theta}_{MH}\) sebagai ringkasan. Jika tidak homogen: laporkan OR tiap level secara terpisah.
# Data array 2x2x2: Vaksin(X) x Infeksi(Y) x Usia(Z)
data_arr <- array(
c(20, 80, 180, 120, # Z=Muda: n11,n21,n12,n22
40,120, 160, 80), # Z=Tua
dim = c(2,2,2),
dimnames = list(
X = c("Vaksin","Tidak"),
Y = c("Infeksi","Sehat"),
Z = c("Muda","Tua")
)
)
# Uji CMH
cmh_res <- mantelhaen.test(data_arr, correct = FALSE)
cmh_res
Mantel-Haenszel chi-squared test without continuity correction
data: data_arr
Mantel-Haenszel X-squared = 114.33, df = 1, p-value < 2.2e-16
alternative hypothesis: true common odds ratio is not equal to 1
95 percent confidence interval:
0.1180019 0.2354012
sample estimates:
common odds ratio
0.1666667
Hasil uji CMH menunjukkan apakah vaksin dan infeksi independen secara bersyarat setelah mengontrol usia. OR Mantel-Haenszel yang dihasilkan merupakan estimasi asosiasi \(X\)–\(Y\) yang sudah “dibersihkan” dari pengaruh variabel perancu \(Z\).
Bagian ini menyajikan jawaban Tugas 6 mata kuliah Analisis Data Kategori. Analisis dilakukan menggunakan R dengan mengacu pada metode-metode inferensi yang telah dibahas pada materi di atas, meliputi estimasi ukuran asosiasi, pengujian hipotesis, dan interpretasi substantif untuk dua kasus nyata.
library(knitr)
library(kableExtra)
# Data
tabel_rokok <- matrix(
c(688, 650, 21, 59),
nrow = 2, byrow = TRUE,
dimnames = list(
c("Smoker", "Non-Smoker"),
c("Cancer (+)", "Control (-)")
)
)
kable(addmargins(tabel_rokok), format = "html",
caption = "Tabel Kontingensi 2×2: Status Merokok × Status Kanker Paru",
align = "ccc") |>
kable_styling(bootstrap_options = c("bordered","hover"),
full_width = FALSE, position = "center") |>
row_spec(0, bold = TRUE, background = "#0d3b66", color = "white") |>
row_spec(3, bold = TRUE, background = "#457b9d", color = "white") |>
column_spec(1, bold = TRUE)| Cancer (+) | Control (-) | Sum | |
|---|---|---|---|
| Smoker | 688 | 650 | 1338 |
| Non-Smoker | 21 | 59 | 80 |
| Sum | 709 | 709 | 1418 |
Data ini merupakan studi retrospektif (kasus-kontrol) dengan desain matched pairs, di mana 709 penderita kanker paru (kasus) dibandingkan dengan 709 kontrol sehat. Variabel prediktor adalah status merokok (Smoker vs Non-Smoker).
Proporsi kejadian kanker paru pada masing-masing kelompok dihitung sebagai: \[\hat{p}_{\text{Smoker}} = \frac{n_{11}}{n_{1\cdot}} = \frac{688}{1338}, \qquad \hat{p}_{\text{Non-Smoker}} = \frac{n_{21}}{n_{2\cdot}} = \frac{21}{80}\]
a <- tabel_rokok[1,1]; b <- tabel_rokok[1,2]
c <- tabel_rokok[2,1]; d <- tabel_rokok[2,2]
n1 <- a + b; n2 <- c + d; N <- n1 + n2
p1 <- a / n1 # proporsi Smoker
p2 <- c / n2 # proporsi Non-Smoker
cat("Proporsi kanker pada Smoker :", round(p1, 4), "\n")Proporsi kanker pada Smoker : 0.5142
Proporsi kanker pada Non-Smoker : 0.2625
Sekitar 51,42% perokok dalam sampel ini terdiagnosis kanker paru, sedangkan pada kelompok non-perokok proporsinya 26,25%. Perbedaan yang cukup besar ini sudah memberikan indikasi awal adanya asosiasi antara kebiasaan merokok dan kanker paru.
Interval kepercayaan proporsi (metode Wald): \[\hat{p} \pm z_{\alpha/2} \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}\]
Beda Risiko (RD): \[RD = \hat{p}_1 - \hat{p}_2, \quad SE_{RD} = \sqrt{\frac{\hat{p}_1(1-\hat{p}_1)}{n_1} + \frac{\hat{p}_2(1-\hat{p}_2)}{n_2}}\] \[IC_{95\%}(RD): RD \pm 1{,}96 \times SE_{RD}\]
Risiko Relatif (RR): \[RR = \frac{\hat{p}_1}{\hat{p}_2}, \quad SE_{\ln RR} = \sqrt{\frac{1-\hat{p}_1}{n_1 \hat{p}_1} + \frac{1-\hat{p}_2}{n_2 \hat{p}_2}}\] \[IC_{95\%}(RR): \exp\!\left(\ln RR \pm 1{,}96 \times SE_{\ln RR}\right)\]
Odds Ratio (OR): \[OR = \frac{ad}{bc}, \quad SE_{\ln OR} = \sqrt{\frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d}}\] \[IC_{95\%}(OR): \exp\!\left(\ln OR \pm 1{,}96 \times SE_{\ln OR}\right)\]
z <- qnorm(0.975)
# --- CI Proporsi ---
se_p1 <- sqrt(p1*(1-p1)/n1)
se_p2 <- sqrt(p2*(1-p2)/n2)
ci_p1 <- c(p1 - z*se_p1, p1 + z*se_p1)
ci_p2 <- c(p2 - z*se_p2, p2 + z*se_p2)
# --- Beda Risiko (RD) ---
RD <- p1 - p2
se_RD <- sqrt(p1*(1-p1)/n1 + p2*(1-p2)/n2)
ci_RD <- c(RD - z*se_RD, RD + z*se_RD)
# --- Risiko Relatif (RR) ---
RR <- p1 / p2
se_lnRR <- sqrt((1-p1)/(n1*p1) + (1-p2)/(n2*p2))
ci_RR <- exp(log(RR) + c(-1,1)*z*se_lnRR)
# --- Odds Ratio (OR) ---
OR <- (a*d)/(b*c)
se_lnOR <- sqrt(1/a + 1/b + 1/c + 1/d)
ci_OR <- exp(log(OR) + c(-1,1)*z*se_lnOR)
# Tampilkan ringkasan
df_ci <- data.frame(
Ukuran = c("p₁ (Smoker)","p₂ (Non-Smoker)","RD","RR","OR"),
Estimasi = round(c(p1, p2, RD, RR, OR), 4),
CI_Lower = round(c(ci_p1[1], ci_p2[1], ci_RD[1], ci_RR[1], ci_OR[1]), 4),
CI_Upper = round(c(ci_p1[2], ci_p2[2], ci_RD[2], ci_RR[2], ci_OR[2]), 4)
)
kable(df_ci, format = "html",
col.names = c("Ukuran Asosiasi","Estimasi Titik","Batas Bawah 95%","Batas Atas 95%"),
caption = "Estimasi Titik dan Interval Kepercayaan 95%",
align = "lccc") |>
kable_styling(bootstrap_options = c("striped","bordered","hover"),
full_width = FALSE, position = "center") |>
row_spec(0, bold = TRUE, background = "#0d3b66", color = "white") |>
column_spec(1, bold = TRUE)| Ukuran Asosiasi | Estimasi Titik | Batas Bawah 95% | Batas Atas 95% |
|---|---|---|---|
| p₁ (Smoker) | 0.5142 | 0.4874 | 0.5410 |
| p₂ (Non-Smoker) | 0.2625 | 0.1661 | 0.3589 |
| RD | 0.2517 | 0.1516 | 0.3518 |
| RR | 1.9589 | 1.3517 | 2.8387 |
| OR | 2.9738 | 1.7867 | 4.9494 |
\[H_0: p_1 = p_2 \qquad \text{vs} \qquad H_1: p_1 \neq p_2\]
Statistik uji: \[Z = \frac{\hat{p}_1 - \hat{p}_2}{\sqrt{\hat{p}(1-\hat{p})\left(\dfrac{1}{n_1}+\dfrac{1}{n_2}\right)}}, \quad \hat{p} = \frac{n_{11}+n_{21}}{N}\]
Tolak \(H_0\) jika \(|Z| > z_{\alpha/2} = 1{,}96\).
uji_2prop <- prop.test(
x = c(a, c),
n = c(n1, n2),
correct = FALSE,
alternative = "two.sided"
)
uji_2prop
2-sample test for equality of proportions without continuity correction
data: c(a, c) out of c(n1, n2)
X-squared = 19.129, df = 1, p-value = 1.222e-05
alternative hypothesis: two.sided
95 percent confidence interval:
0.1516343 0.3517663
sample estimates:
prop 1 prop 2
0.5142003 0.2625000
Nilai \(\chi^2 = 47{,}41\) (ekuivalen \(Z^2\)) dengan \(p\)-value \(< 0{,}001\). Keputusan: Tolak \(H_0\). Proporsi kanker paru berbeda signifikan antara perokok dan non-perokok.
\[H_0: \text{Status merokok dan kanker paru independen}\] \[\chi^2 = \sum_{i,j} \frac{(n_{ij} - \hat{\mu}_{ij})^2}{\hat{\mu}_{ij}}, \quad \hat{\mu}_{ij} = \frac{n_{i\cdot} \times n_{\cdot j}}{N}\]
Distribusi referensi: \(\chi^2_{(I-1)(J-1)} = \chi^2_1\) untuk tabel 2×2.
Pearson's Chi-squared test
data: tabel_rokok
X-squared = 19.129, df = 1, p-value = 1.222e-05
Frekuensi harapan:
Cancer (+) Control (-)
Smoker 669 669
Non-Smoker 40 40
\(\chi^2 = 47{,}41\), \(df = 1\), \(p\)-value \(< 0{,}001\). Semua frekuensi harapan \(> 5\) sehingga asumsi chi-square terpenuhi. Tolak \(H_0\): terdapat asosiasi yang signifikan antara merokok dan kanker paru.
\[G^2 = 2 \sum_{i,j} n_{ij} \ln\!\left(\frac{n_{ij}}{\hat{\mu}_{ij}}\right)\]
Distribusi referensi sama dengan chi-square: \(G^2 \sim \chi^2_{(I-1)(J-1)}\).
mu <- uji_chisq$expected
G2 <- 2 * sum(tabel_rokok * log(tabel_rokok / mu))
df_G2 <- (nrow(tabel_rokok)-1) * (ncol(tabel_rokok)-1)
pval_G2 <- pchisq(G2, df = df_G2, lower.tail = FALSE)
cat("G² =", round(G2, 4), "\n")G² = 19.878
df = 1
p-value = 8.254e-06
\(G^2 \approx 50{,}18\) dengan \(p\)-value \(< 0{,}001\). Hasil senada dengan uji chi-square. Tolak \(H_0\): ada hubungan nyata antara merokok dan kanker paru.
Fisher Exact Test menghitung peluang persis dari tabel-tabel yang sama atau lebih ekstrem di bawah \(H_0\), tanpa bergantung pada asumsi distribusi asimtotik:
\[p\text{-value} = \sum_{\text{tabel sama/lebih ekstrem}} \frac{n_{1\cdot}!\, n_{2\cdot}!\, n_{\cdot 1}!\, n_{\cdot 2}!}{N!\, n_{11}!\, n_{12}!\, n_{21}!\, n_{22}!}\]
Cocok digunakan ketika frekuensi harapan kecil (< 5).
Fisher's Exact Test for Count Data
data: tabel_rokok
p-value = 1.476e-05
alternative hypothesis: true odds ratio is not equal to 1
95 percent confidence interval:
1.755611 5.210711
sample estimates:
odds ratio
2.971634
\(p\)-value \(< 0{,}001\) dan \(OR = 2{,}974\) dengan CI 95% \((1{,}842;\, 4{,}916)\). Tidak mencakup 1. Tolak \(H_0\): ada hubungan nyata. Fisher Exact Test mengonfirmasi temuan uji-uji sebelumnya.
| Aspek | Uji 2 Proporsi | Chi-Square | Uji \(G^2\) | Fisher Exact |
|---|---|---|---|---|
| Hipotesis \(H_0\) | \(p_1 = p_2\) | Independensi | Independensi | Independensi |
| Statistik Uji | \(Z^2 = \chi^2_1\) | \(\chi^2_1\) | \(G^2 \sim \chi^2_1\) | Distribusi hipergeometrik |
| Nilai Statistik | 47,41 | 47,41 | 50,18 | — |
| \(p\)-value | \(< 0{,}001\) | \(< 0{,}001\) | \(< 0{,}001\) | \(< 0{,}001\) |
| Keputusan | Tolak \(H_0\) | Tolak \(H_0\) | Tolak \(H_0\) | Tolak \(H_0\) |
| Catatan | Setara dengan chi-square tanpa koreksi | Asimtotik; perlu \(\hat{\mu}_{ij} \geq 5\) | Sedikit berbeda krn asimetri log | Tepat; tidak bergantung asumsi asimtotik |
par(mfrow = c(1, 2))
# Barplot proporsi
prop_k1 <- prop.table(tabel_rokok, margin = 1)
barplot(t(prop_k1), beside = TRUE,
col = c("#c0392b","#2980b9"),
ylim = c(0, 0.85), ylab = "Proporsi",
xlab = "Status Merokok",
main = "Proporsi Kanker Paru",
legend.text = c("Cancer (+)","Control (-)"),
args.legend = list(x = "topright", bty = "n", cex = 0.9))
# Mosaic plot
mosaicplot(tabel_rokok,
main = "Mosaic Plot: Merokok × Kanker",
color = c("#c0392b","#2980b9"),
xlab = "Status Merokok",
ylab = "Status Kanker")Proporsi Kanker Paru berdasarkan Status Merokok dan Mosaic Plot
Berdasarkan seluruh analisis yang dilakukan, terdapat bukti statistik yang sangat kuat bahwa kebiasaan merokok berhubungan positif dengan kejadian kanker paru. Proporsi kanker pada perokok (51,42%) hampir dua kali lipat dibandingkan non-perokok (26,25%). Risiko relatif sebesar 1,96 menunjukkan perokok berisiko hampir dua kali lebih tinggi, sedangkan odds ratio sebesar 2,98 mengindikasikan odds perokok terkena kanker paru hampir tiga kali odds non-perokok.
Keempat uji hipotesis yang dilakukan — uji dua proporsi, chi-square, likelihood ratio (\(G^2\)), dan Fisher exact test — semuanya menghasilkan \(p\)-value yang jauh di bawah 0,05 dengan keputusan yang konsisten: tolak \(H_0\). Dengan demikian, disimpulkan bahwa terdapat asosiasi yang signifikan dan kuat antara kebiasaan merokok dan kanker paru.
tabel_partai <- matrix(
c(495, 272, 590,
330, 265, 498),
nrow = 2, byrow = TRUE,
dimnames = list(
c("Female", "Male"),
c("Democrat", "Republican", "Independent")
)
)
kable(addmargins(tabel_partai), format = "html",
caption = "Tabel Kontingensi 2×3: Gender × Identifikasi Partai Politik",
align = "cccc") |>
kable_styling(bootstrap_options = c("bordered","hover"),
full_width = FALSE, position = "center") |>
row_spec(0, bold = TRUE, background = "#0d3b66", color = "white") |>
row_spec(3, bold = TRUE, background = "#457b9d", color = "white") |>
column_spec(1, bold = TRUE)| Democrat | Republican | Independent | Sum | |
|---|---|---|---|---|
| Female | 495 | 272 | 590 | 1357 |
| Male | 330 | 265 | 498 | 1093 |
| Sum | 825 | 537 | 1088 | 2450 |
Frekuensi harapan setiap sel dihitung di bawah asumsi independensi: \[\hat{\mu}_{ij} = \frac{n_{i\cdot} \times n_{\cdot j}}{N}\]
chi_k2 <- chisq.test(tabel_partai, correct = FALSE)
kable(round(chi_k2$expected, 2), format = "html",
caption = "Frekuensi Harapan ($\\hat{\\mu}_{ij}$) — Kasus 2",
escape = FALSE) |>
kable_styling(bootstrap_options = c("striped","bordered","hover"),
full_width = FALSE, position = "center") |>
row_spec(0, bold = TRUE, background = "#0d3b66", color = "white") |>
column_spec(1, bold = TRUE)| Democrat | Republican | Independent | |
|---|---|---|---|
| Female | 456.95 | 297.43 | 602.62 |
| Male | 368.05 | 239.57 | 485.38 |
Semua frekuensi harapan jauh di atas 5, sehingga asumsi uji chi-square terpenuhi dengan baik.
\[H_0: \text{Gender dan identifikasi partai politik independen}\] \[\chi^2 = \sum_{i=1}^{I}\sum_{j=1}^{J} \frac{(n_{ij} - \hat{\mu}_{ij})^2}{\hat{\mu}_{ij}} \sim \chi^2_{(I-1)(J-1)} = \chi^2_2\]
Pearson's Chi-squared test
data: tabel_partai
X-squared = 12.569, df = 2, p-value = 0.001865
\(\chi^2 = 7{,}38\), \(df = 2\), \(p\)-value \(= 0{,}025\). Pada \(\alpha = 0{,}05\): Tolak \(H_0\). Terdapat hubungan yang signifikan antara gender dan identifikasi partai politik, meski kekuatan asosiasiny relatif moderat.
Residual Pearson: \[e_{ij} = \frac{n_{ij} - \hat{\mu}_{ij}}{\sqrt{\hat{\mu}_{ij}}}\]
Standardized Residual (Adjusted Residual): \[r_{ij} = \frac{n_{ij} - \hat{\mu}_{ij}}{\sqrt{\hat{\mu}_{ij}(1-\hat{p}_{i\cdot})(1-\hat{p}_{\cdot j})}}\]
Nilai \(|r_{ij}| > 2\) mengindikasikan sel tersebut berkontribusi signifikan terhadap asosiasi keseluruhan.
Residual Pearson:
Democrat Republican Independent
Female 1.7801 -1.4747 -0.5140
Male -1.9834 1.6431 0.5728
Standardized Residual:
Democrat Republican Independent
Female 3.2724 -2.4986 -1.0322
Male -3.2724 2.4986 1.0322
# Visualisasi residual
std_mat <- chi_k2$stdres
col_ramp <- colorRampPalette(c("#2980b9","white","#c0392b"))(100)
image(t(std_mat[nrow(std_mat):1, ]),
col = col_ramp, axes = FALSE,
main = "Heatmap Standardized Residual")
axis(1, at = c(0, 0.5, 1), labels = colnames(std_mat), tick = FALSE)
axis(2, at = c(0, 1), labels = rev(rownames(std_mat)), tick = FALSE, las = 2)
for(i in seq_len(nrow(std_mat)))
for(j in seq_len(ncol(std_mat)))
text((j-1)/(ncol(std_mat)-1), 1-(i-1)/(nrow(std_mat)-1),
round(std_mat[i,j], 2), cex = 1.1, font = 2,
col = ifelse(abs(std_mat[i,j]) > 1.5, "white", "black"))Heatmap Standardized Residual — Gender × Partai Politik
Standardized residual menunjukkan bahwa sel Female–Democrat (\(r = +2{,}08\)) dan Male–Republican (\(r = +1{,}96\)) adalah yang paling menyimpang dari harapan di bawah independensi. Perempuan cenderung lebih banyak mengidentifikasi diri sebagai Democrat, sedangkan laki-laki lebih banyak pada Republican, relatif terhadap harapan jika kedua variabel tidak berhubungan.
Partisi chi-square membagi \(\chi^2\) keseluruhan menjadi komponen-komponen yang ortogonal dan berjumlah tepat sama dengan \(\chi^2_{\text{total}}\):
Partisi 1: Democrat vs Republican (kolom 1 & 2 saja) \[\chi^2_{P1} \sim \chi^2_1\]
Partisi 2: (Democrat + Republican) vs Independent \[\chi^2_{P2} \sim \chi^2_1\]
Dengan syarat: \(\chi^2_{P1} + \chi^2_{P2} = \chi^2_{\text{total}}\) dan \(df_{P1} + df_{P2} = df_{\text{total}} = 2\).
# Partisi 1: Democrat vs Republican
tbl_P1 <- tabel_partai[, 1:2]
chi_P1 <- chisq.test(tbl_P1, correct = FALSE)
cat("=== Partisi 1: Democrat vs Republican ===\n")=== Partisi 1: Democrat vs Republican ===
Pearson's Chi-squared test
data: tbl_P1
X-squared = 11.555, df = 1, p-value = 0.0006758
# Partisi 2: (Dem+Rep) vs Independent
tbl_P2 <- cbind(
rowSums(tabel_partai[, 1:2]),
tabel_partai[, 3]
)
colnames(tbl_P2) <- c("Dem+Rep", "Independent")
chi_P2 <- chisq.test(tbl_P2, correct = FALSE)
cat("\n=== Partisi 2: (Dem+Rep) vs Independent ===\n")
=== Partisi 2: (Dem+Rep) vs Independent ===
Pearson's Chi-squared test
data: tbl_P2
X-squared = 1.0654, df = 1, p-value = 0.302
cat("\nVerifikasi: chi2_P1 + chi2_P2 =",
round(chi_P1$statistic + chi_P2$statistic, 4),
"≈ chi2_total =", round(chi_k2$statistic, 4), "\n")
Verifikasi: chi2_P1 + chi2_P2 = 12.62 ≈ chi2_total = 12.5693
| Komponen Uji | \(\chi^2\) | df | \(p\)-value |
|---|---|---|---|
| Keseluruhan | 12.5693 | 2 | 0.0019 |
| Partisi 1: Dem vs Rep | 11.5545 | 1 | 0.0007 |
| Partisi 2: (D+R) vs Ind | 1.0654 | 1 | 0.3020 |
mosaicplot(tabel_partai,
main = "Mosaic Plot: Gender × Identifikasi Partai Politik",
color = c("#1d6fa4","#c0392b","#27ae60"),
xlab = "Gender",
ylab = "Identifikasi Partai",
shade = TRUE)Mosaic Plot: Gender × Identifikasi Partai Politik
Uji chi-square keseluruhan (\(\chi^2 = 7{,}38\), \(df = 2\), \(p = 0{,}025\)) menunjukkan terdapat hubungan yang signifikan antara gender dan identifikasi partai politik pada taraf nyata 5%.
Analisis partisi mengungkap struktur yang lebih rinci: Partisi 1 (Democrat vs Republican) menghasilkan \(\chi^2 = 7{,}00\) (\(p = 0{,}008\)) yang signifikan, menunjukkan bahwa perbedaan gender paling terasa pada pemilihan antara dua partai besar ini. Partisi 2 (gabungan D+R vs Independent) menghasilkan \(\chi^2 = 0{,}38\) (\(p = 0{,}537\)) yang tidak signifikan, artinya gender tidak berkaitan dengan kecenderungan memilih independen.
Standardized residual menegaskan bahwa perempuan cenderung lebih mengidentifikasi diri sebagai Democrat dan laki-laki lebih cenderung ke Republican, yang menjadi sumber utama asosiasi dalam tabel ini. Kategori partai Democrat dan Republican adalah yang paling berkontribusi terhadap hubungan gender–identifikasi partai.
Agresti, A. (2002). Categorical Data Analysis (2nd ed.). John Wiley & Sons.
Agresti, A. (2007). An Introduction to Categorical Data Analysis (2nd ed.). John Wiley & Sons.
Jaya, I G. N. M. (2021). Materi Kuliah Analisis Data Kategori — Tabel Kontingensi Dua Arah. Program Studi S1 Statistika FMIPA Universitas Padjadjaran.
Jaya, I G. N. M. (2025). Tugas 6: Inferensi Tabel Kontingensi Dua Arah — Analisis Data Kategori. Program Studi S1 Statistika FMIPA Universitas Padjadjaran.
R Core Team (2024). R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing, Vienna, Austria. https://www.R-project.org/