1 Definisi Analisis Data Kategori

1.1 Apa yang Dimaksud dengan Analisis Data Kategori?

Analisis data kategori (categorical data analysis) adalah kumpulan metode statistik yang digunakan untuk menganalisis data yang diukur dalam skala nominal atau ordinal, di mana setiap observasi dikelompokkan ke dalam kategori-kategori yang saling eksklusif (mutually exclusive) dan lengkap (exhaustive).

Berbeda dengan data kontinu, data kategori tidak memiliki nilai numerik yang bermakna secara inheren — data ini merepresentasikan keanggotaan dalam suatu kelompok atau kelas tertentu. Metode analisisnya mencakup berbagai prosedur statistik, mulai dari tabel kontingensi sederhana, uji chi-square, hingga model regresi logistik dan log-linear yang lebih kompleks (Agresti, 2002).

Tujuan utama analisis data kategori meliputi:

  • Memahami pola distribusi frekuensi variabel kategori dalam populasi
  • Mengidentifikasi hubungan atau asosiasi antar variabel kategori
  • Mengukur kekuatan asosiasi dengan ukuran statistik yang tepat
  • Melakukan inferensi statistik terhadap parameter populasi

1.2 Karakteristik Variabel Kategori

Variabel kategori memiliki karakteristik utama yang membedakannya dari variabel kontinu (Agresti, 2013; Hosmer & Lemeshow, 2013):

1.2.1 Skala Pengukuran

Jenis Skala Karakteristik Contoh
Nominal Kategori tanpa urutan yang bermakna Jenis kelamin, golongan darah, agama
Ordinal Kategori berurutan, jarak tidak seragam Tingkat pendidikan, derajat nyeri
Dikotomi/Biner Hanya dua kategori Sakit/sehat, ya/tidak, sukses/gagal

1.2.2 Sifat Data Kategori

  • Data dinyatakan sebagai frekuensi atau proporsi pada setiap kategori
  • Nilai antar kategori tidak dapat dioperasikan secara aritmatika langsung
  • Distribusi data mengikuti distribusi multinomial (umum) atau binomial (dikotomi)
  • Representasi data utama berbentuk tabel frekuensi atau tabel kontingensi

1.2.3 Ukuran Statistik yang Digunakan

Karena sifat datanya yang tidak kontinu, analisis data kategori menggunakan ukuran-ukuran khusus:

  • Beda peluang (difference of proportions): \(\Delta = \pi_{j|h} - \pi_{j|i}\)
  • Risiko relatif (relative risk): \(RR = \pi_{j|h} / \pi_{j|i}\)
  • Rasio odds (odds ratio): \(OR = ad/bc\)
  • Uji chi-square: untuk pengujian independensi antar variabel

1.3 Desain Sampling dalam Penelitian Data Kategori

Berdasarkan ADK Pertemuan 2 (UNPAD, 2021), terdapat tiga desain sampling utama dalam penelitian yang melibatkan variabel kategori:

1. Desain Prospektif (Kohort / Clinical Trial)

Variabel respons \(Y\) diukur setelah perlakuan atau pengelompokan dikerjakan terlebih dulu. Peneliti menetapkan pengelompokan subjek sehingga memiliki kendali penuh. Contoh: clinical trial vaksin; studi kohort perokok vs bukan perokok.

2. Desain Retrospektif (Kasus-Kontrol)

Variabel respons \(Y\) (outcome) ditentukan terlebih dulu, kemudian ditelusuri variabel prediktor \(X\) ke masa lampau. Contoh: pasien kanker (kasus) dan non-kanker (kontrol) ditetapkan dulu, lalu ditanya riwayat merokok.

Perhatian: Desain ini mengakibatkan distribusi \(Y\) bersyarat \(X\) tidak bisa dikerjakan langsung. Ukuran asosiasi yang valid hanya Odds Ratio (OR).

3. Desain Cross Sectional

Tidak membatasi variabel mana yang menjadi prediktor dan respons. Sampel acak diambil dari populasi, lalu setiap unit diklasifikasi menurut \(X\) dan \(Y\) secara bersamaan.

1.4 Contoh Penerapan Analisis Data Kategori dalam Penelitian

Bidang Variabel X (Prediktor) Variabel Y (Respons) Ukuran Asosiasi
Epidemiologi Status merokok Kanker paru OR, RR
Kesehatan Masyarakat Vaksinasi Kejadian infeksi RR
Kedokteran Jenis terapi Respons pasien OR
Sosial Tingkat pendidikan Status pekerjaan Cramér’s V
Pemasaran Kelompok usia Preferensi produk Log-linear model

1.5 Referensi (Bagian 1)

  • Agresti, A. (2002). Categorical Data Analysis (2nd ed.). John Wiley & Sons.
  • Agresti, A. (2013). Categorical Data Analysis (3rd ed.). John Wiley & Sons.
  • Hosmer, D. W., Lemeshow, S., & Sturdivant, R. X. (2013). Applied Logistic Regression (3rd ed.). Wiley.
  • ADK Pertemuan 2. (2021). Tabel Kontingensi Dua Arah. Universitas Padjadjaran.

2 Tabel Kontingensi

2.1 Definisi Tabel Kontingensi

Tabel kontingensi (contingency table atau cross-tabulation) adalah tabel klasifikasi silang dari variabel-variabel yang bersifat kategori (ADK Pertemuan 2, UNPAD 2021). Tabel ini dapat menggambarkan hubungan di antara variabel-variabel kategori tersebut.

Berdasarkan jumlah variabel yang terlibat:

  • Tabel kontingensi dua arah (\(I \times J\)): dua variabel kategori
  • Tabel kontingensi tiga arah: tiga variabel kategori
  • Tabel kontingensi multi arah: lebih dari tiga variabel kategori

2.2 Struktur Tabel Kontingensi

Misalkan terdapat dua variabel \(X\) dan \(Y\) yang masing-masing bersifat kategori. Variabel \(X\) terdiri dari \(I\) kategori dan variabel \(Y\) terdiri dari \(J\) kategori. Tabel klasifikasi silang antara \(X\) dengan \(Y\) adalah tabel kontingensi \(I \times J\).

Tabel kontingensi yang paling sederhana adalah ketika variabel \(X\) memiliki 2 kategori dan \(Y\) memiliki 2 kategori, disebut tabel kontingensi \(2 \times 2\).

Struktur tabel kontingensi \(2 \times 2\):

\(X\) \(Y = y_1\) \(Y = y_2\) Total Baris
\(x_1\) \(n_{11}\) \(n_{12}\) \(n_{1.}\)
\(x_2\) \(n_{21}\) \(n_{22}\) \(n_{2.}\)
Total Kolom \(n_{.1}\) \(n_{.2}\) \(n_{..}\)

Keterangan notasi (ADK Pertemuan 2, UNPAD):

  • \(x_i\) : kategori ke-\(i\) variabel \(X\)
  • \(y_j\) : kategori ke-\(j\) variabel \(Y\)
  • \(n_{ij}\) : frekuensi sel baris ke-\(i\) kolom ke-\(j\)
  • \(n_{i.} = n_{i1} + n_{i2}\) : total baris ke-\(i\)
  • \(n_{.j} = n_{1j} + n_{2j}\) : total kolom ke-\(j\)
  • \(n_{..} = n_{1.} + n_{2.} = n_{.1} + n_{.2}\) : total keseluruhan

2.3 Distribusi Peluang Tabel Kontingensi

Untuk setiap tabel kontingensi dua arah, apabila variabel \(X\) dan \(Y\) merupakan variabel acak dan pemilihan sampel dilakukan secara acak, maka tabel kontingensi tersebut memiliki distribusi peluang (ADK Pertemuan 2, UNPAD 2021).

Distribusi peluang dari tabel kontingensi terdiri atas:

  1. Distribusi peluang bersama (Joint probability)
  2. Distribusi peluang marginal (Marginal probability)
  3. Distribusi peluang bersyarat (Conditional probability)

2.3.1 Distribusi Peluang Bersama (Joint Probability)

\(\pi_{ij}\) adalah peluang bersama untuk kategori \(X\) ke-\(i\) dan kategori \(Y\) ke-\(j\):

\[P(X = i,\ Y = j) = \pi_{ij}, \qquad \hat{\pi}_{ij} = \frac{n_{ij}}{n_{..}}\]

Tabel distribusi peluang bersama \(2 \times 2\):

\(X\) \(Y = 1\) \(Y = 2\) Total
\(1\) \(\pi_{11}\) \(\pi_{12}\) \(\pi_{1.}\)
\(2\) \(\pi_{21}\) \(\pi_{22}\) \(\pi_{2.}\)
Total \(\pi_{.1}\) \(\pi_{.2}\) \(1\)

Sifat: \(\pi_{11} + \pi_{12} + \pi_{21} + \pi_{22} = \pi_{1.} + \pi_{2.} = \pi_{.1} + \pi_{.2} = 1\)


2.3.2 Distribusi Peluang Marginal (Marginal Probability)

Peluang marginal diperoleh dengan menjumlahkan peluang bersama sepanjang baris atau kolom:

Peluang marginal baris (\(\pi_{i.}\)):

\[\pi_{i.} = P(X = i) = \sum_{j} \pi_{ij} = \pi_{i1} + \pi_{i2}, \qquad \hat{\pi}_{i.} = \frac{n_{i.}}{n_{..}}\]

Peluang marginal kolom (\(\pi_{.j}\)):

\[\pi_{.j} = P(Y = j) = \sum_{i} \pi_{ij} = \pi_{1j} + \pi_{2j}, \qquad \hat{\pi}_{.j} = \frac{n_{.j}}{n_{..}}\]

Kondisi independensi: \(X\) dan \(Y\) dikatakan saling bebas apabila:

\[\pi_{ij} = \pi_{i.} \times \pi_{.j} \qquad \text{untuk semua } i, j\]


2.3.3 Distribusi Peluang Bersyarat (Conditional Probability)

Untuk menentukan distribusi peluang bersyarat, harus ditetapkan terlebih dahulu variabel yang dijadikan syarat (ADK Pertemuan 2, UNPAD 2021).

Apabila variabel \(X\) yang menjadi syarat, maka distribusi peluang \(Y\) bersyarat \(X\) dinyatakan sebagai:

\[\pi_{j|i} = P(Y = j \mid X = i) = \frac{\pi_{ij}}{\pi_{i.}}, \qquad \hat{\pi}_{j|i} = \frac{n_{ij}}{n_{i.}}\]

Untuk tiap \(i\) berlaku:

\[\sum_j \pi_{j|i} = 1 \quad \Rightarrow \quad \pi_{1|i} + \pi_{2|i} = 1\]

Tabel peluang bersyarat \(2 \times 2\) (syarat \(X\)):

\(X\) \(Y = 1\) \(Y = 2\) Total
\(1\) \(\pi_{1|1}\) \(\pi_{2|1}\) \(1\)
\(2\) \(\pi_{1|2}\) \(\pi_{2|2}\) \(1\)

Jika \(X\) dan \(Y\) saling bebas, maka:

\[\pi_{j|h} = \pi_{j|i} = \pi_{.j}\]


2.4 Contoh Tabel Kontingensi \(2 \times 2\): Merokok vs. Kanker Paru

Kanker Paru Tidak Kanker Total
Merokok 60 40 100
Tidak Merokok 20 80 100
Total 80 120 200

Peluang bersama:

\[\hat{\pi}_{11} = \tfrac{60}{200} = 0.30,\quad \hat{\pi}_{12} = \tfrac{40}{200} = 0.20,\quad \hat{\pi}_{21} = \tfrac{20}{200} = 0.10,\quad \hat{\pi}_{22} = \tfrac{80}{200} = 0.40\]

Peluang marginal baris: \(\hat{\pi}_{1.} = 0.50\), \(\hat{\pi}_{2.} = 0.50\)

Peluang marginal kolom: \(\hat{\pi}_{.1} = 0.40\), \(\hat{\pi}_{.2} = 0.60\)

Peluang bersyarat:

\[\hat{\pi}_{1|1} = P(\text{Kanker} \mid \text{Merokok}) = \tfrac{60}{100} = 0.60\] \[\hat{\pi}_{1|2} = P(\text{Kanker} \mid \text{Tidak Merokok}) = \tfrac{20}{100} = 0.20\]

Karena \(\hat{\pi}_{1|1} = 0.60 \neq \hat{\pi}_{1|2} = 0.20\), terdapat indikasi asosiasi antara merokok dan kanker paru.


3 Ukuran Asosiasi

Hubungan antar variabel acak \(X\) dan \(Y\) yang keduanya bersifat kategori dalam tabel kontingensi dinamakan asosiasi. Asosiasi dalam tabel kontingensi dibentuk berdasarkan distribusi peluang bersyaratnya (ADK Pertemuan 2, UNPAD 2021).

Ada tiga ukuran asosiasi yang dapat digunakan untuk tabel kontingensi dua arah:

3.1 Beda Peluang (Difference of Probabilities)

Beda peluang adalah selisih peluang bersyarat \(Y = j\) untuk dua kategori \(X\), yaitu \(h\) dan \(i\):

\[\Delta = \pi_{j|h} - \pi_{j|i}\]

Nilai beda sebesar nol (\(\Delta = 0\), atau \(\pi_{j|h} = \pi_{j|i}\)) mencerminkan tidak terdapat asosiasi:

\[\pi_{j|h} = \pi_{j|i} = \pi_{.j} \quad \Rightarrow \quad X \text{ dan } Y \text{ independen}\]

Keterbatasan: Beda peluang dapat memberikan kesimpulan keliru saat peluang yang terlibat bernilai sangat kecil.

3.2 Odds

Odds adalah perbandingan kemungkinan terjadinya respons \(j\) berbanding dengan respons \(k\) dalam kelompok \(X = i\) yang sama (ADK Pertemuan 2, UNPAD 2021):

\[\Psi_i(j,k) = \frac{\pi_{j|i}}{\pi_{k|i}} = \frac{\pi_{ij}}{\pi_{ik}}, \qquad j \neq k = 1,\ldots,J,\quad i = 1,\ldots,I\]

Untuk tabel \(2 \times 2\) menggunakan notasi \(a, b, c, d\):

\[\text{Odds}_{\text{baris 1}} = \frac{n_{11}}{n_{12}} = \frac{a}{b}, \qquad \text{Odds}_{\text{baris 2}} = \frac{n_{21}}{n_{22}} = \frac{c}{d}\]

Interpretasi: Nilai odds non-negatif. Jika \(\Psi_i(j,k) = 4\), artinya respons \(j\) empat kali lebih mungkin terjadi dibandingkan respons \(k\) pada kelompok \(X = i\).

3.3 Odds Ratio (Rasio Odds)

Odds Ratio (OR) adalah rasio dua buah odds dari dua baris berbeda. Asosiasi antara \(X\) dengan \(Y\) diperlihatkan melalui ratio dua buah odds (baris 1 dan baris 2) tersebut (ADK Pertemuan 2, UNPAD 2021).

Untuk dua 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}} = \frac{\pi_{hj} \times \pi_{ik}}{\pi_{ij} \times \pi_{hk}}\]

Untuk tabel \(2 \times 2\), OR merupakan cross product dari elemen-elemen diagonal:

\[\boxed{OR = \frac{n_{11} \times n_{22}}{n_{12} \times n_{21}} = \frac{ad}{bc}}\]

Interval Kepercayaan 95% untuk OR (metode Woolf):

\[CI_{95\%} = \exp\!\left(\ln(\widehat{OR}) \pm 1.96 \sqrt{\frac{1}{n_{11}} + \frac{1}{n_{12}} + \frac{1}{n_{21}} + \frac{1}{n_{22}}}\right)\]

Interpretasi Odds Ratio:

Nilai OR Interpretasi
\(OR = 1\) Tidak ada asosiasi; \(X\) dan \(Y\) independen
\(OR > 1\) Baris \(h\) menghasilkan respons \(j\) sebesar \(\Psi_{hi}\) kali lebih mungkin dibanding baris \(i\)
\(OR < 1\) Baris \(h\) menghasilkan respons \(j\) lebih rendah dibanding baris \(i\) (faktor protektif)

3.4 Relative Risk (Risiko Relatif)

Risiko Relatif (RR) adalah rasio antara dua peluang bersyarat — peluang \(Y = j\) dalam baris \(X = h\) dengan baris \(X = i\) (ADK Pertemuan 2, UNPAD 2021):

\[RR = \frac{\pi_{j|h}}{\pi_{j|i}}\]

Estimasi dari data:

\[\boxed{\widehat{RR} = \frac{n_{11}/n_{1.}}{n_{21}/n_{2.}} = \frac{n_{11} \times n_{2.}}{n_{21} \times n_{1.}}}\]

Interpretasi Relative Risk:

Nilai RR Interpretasi
\(RR = 1\) \(\pi_{j|h} = \pi_{j|i}\); tidak ada asosiasi; \(X\) dan \(Y\) independen
\(RR > 1\) Kelompok \(h\) berisiko \(RR\) kali lebih tinggi dari kelompok \(i\)
\(RR < 1\) Kelompok \(h\) berisiko lebih rendah (faktor protektif)

Catatan: RR tepat untuk desain prospektif (kohort). Untuk desain retrospektif (kasus-kontrol), hanya OR yang valid karena distribusi \(Y\) bersyarat \(X\) tidak bisa dikerjakan langsung. OR \(\approx\) RR ketika prevalensi outcome rendah (\(< 10\%\)).


4 Contoh Perhitungan Manual

4.1 Kasus: Hubungan Merokok dengan Kanker Paru

Sebuah studi kasus-kontrol dilakukan untuk menyelidiki hubungan antara kebiasaan merokok dan kejadian kanker paru pada 200 subjek.

4.2 Langkah 1: Membuat Tabel Kontingensi

Kanker Paru (\(Y=1\)) Tidak Kanker (\(Y=2\)) Total Baris
Merokok (\(X=1\)) \(a = 60\) \(b = 40\) \(n_{1.} = 100\)
Tidak Merokok (\(X=2\)) \(c = 20\) \(d = 80\) \(n_{2.} = 100\)
Total Kolom \(n_{.1} = 80\) \(n_{.2} = 120\) \(n_{..} = 200\)

4.3 Langkah 2: Menghitung Peluang Bersyarat

Peluang kanker paru pada perokok: \[\hat{\pi}_{1|1} = P(Y=1 \mid X=1) = \frac{n_{11}}{n_{1.}} = \frac{60}{100} = \mathbf{0.60}\]

Peluang kanker paru pada bukan perokok: \[\hat{\pi}_{1|2} = P(Y=1 \mid X=2) = \frac{n_{21}}{n_{2.}} = \frac{20}{100} = \mathbf{0.20}\]

Peluang tidak kanker pada perokok: \[\hat{\pi}_{2|1} = P(Y=2 \mid X=1) = \frac{n_{12}}{n_{1.}} = \frac{40}{100} = \mathbf{0.40}\]

Peluang tidak kanker pada bukan perokok: \[\hat{\pi}_{2|2} = P(Y=2 \mid X=2) = \frac{n_{22}}{n_{2.}} = \frac{80}{100} = \mathbf{0.80}\]

Beda peluang: \[\Delta = \hat{\pi}_{1|1} - \hat{\pi}_{1|2} = 0.60 - 0.20 = \mathbf{0.40} \neq 0 \quad \Rightarrow \text{ Ada indikasi asosiasi}\]

4.4 Langkah 3: Menghitung Odds

Odds kanker pada perokok: \[\Psi_1(1,2) = \frac{\hat{\pi}_{1|1}}{\hat{\pi}_{2|1}} = \frac{0.60}{0.40} = \frac{a}{b} = \frac{60}{40} = \mathbf{1.50}\]

Odds kanker pada bukan perokok: \[\Psi_2(1,2) = \frac{\hat{\pi}_{1|2}}{\hat{\pi}_{2|2}} = \frac{0.20}{0.80} = \frac{c}{d} = \frac{20}{80} = \mathbf{0.25}\]

Pada perokok, kejadian kanker paru 1.5 kali lebih mungkin dibandingkan tidak kanker.

4.5 Langkah 4: Menghitung Odds Ratio

\[\widehat{OR} = \frac{\Psi_1(1,2)}{\Psi_2(1,2)} = \frac{1.50}{0.25} = 6.00\]

Verifikasi dengan rumus cross product:

\[\widehat{OR} = \frac{ad}{bc} = \frac{n_{11} \times n_{22}}{n_{12} \times n_{21}} = \frac{60 \times 80}{40 \times 20} = \frac{4800}{800} = \mathbf{6.00}\]

Interval Kepercayaan 95%:

\[\ln(\widehat{OR}) = \ln(6) = 1.7918\]

\[SE_{\ln(OR)} = \sqrt{\frac{1}{60} + \frac{1}{40} + \frac{1}{20} + \frac{1}{80}} = \sqrt{0.01\overline{6} + 0.025 + 0.05 + 0.0125} = \sqrt{0.1042} = 0.3228\]

\[CI_{95\%} = e^{1.7918 \pm 1.96 \times 0.3228} = e^{1.7918 \pm 0.6327} = \left(\mathbf{3.19},\ \mathbf{11.30}\right)\]

Relative Risk (sebagai perbandingan):

\[\widehat{RR} = \frac{n_{11}/n_{1.}}{n_{21}/n_{2.}} = \frac{60/100}{20/100} = \frac{0.60}{0.20} = \mathbf{3.00}\]

Ringkasan hasil perhitungan manual:

Ukuran Asosiasi Nilai Keterangan
Beda Peluang \((\Delta)\) \(0.40\) \(\neq 0\) → ada asosiasi
Odds (Perokok) \(1.50\) Kanker 1.5× lebih mungkin dari tidak kanker
Odds (Tdk Merokok) \(0.25\) Kanker 0.25× lebih mungkin dari tidak kanker
Odds Ratio (OR) \(\mathbf{6.00}\) Perokok 6× lebih berisiko
95% CI untuk OR \((3.19;\ 11.30)\) Signifikan (tidak mencakup 1)
Relative Risk (RR) \(\mathbf{3.00}\) Peluang kanker perokok 3× lebih besar

5 Analisis Menggunakan R

5.1 Membuat Tabel Kontingensi

# Membuat matriks data
data <- matrix(c(60, 40, 20, 80),
               nrow  = 2,
               byrow = TRUE)

rownames(data) <- c("Merokok", "Tidak Merokok")
colnames(data) <- c("Kanker", "Tidak Kanker")

cat("=== TABEL KONTINGENSI ===\n")
#> === TABEL KONTINGENSI ===
print(data)
#>               Kanker Tidak Kanker
#> Merokok           60           40
#> Tidak Merokok     20           80
cat("\n=== TABEL DENGAN TOTAL MARGINAL ===\n")
#> 
#> === TABEL DENGAN TOTAL MARGINAL ===
print(addmargins(data))
#>               Kanker Tidak Kanker Sum
#> Merokok           60           40 100
#> Tidak Merokok     20           80 100
#> Sum               80          120 200

5.2 Distribusi Peluang

n_total <- sum(data)

# Joint distribution
cat("=== JOINT DISTRIBUTION (pi_ij = n_ij / n..) ===\n")
#> === JOINT DISTRIBUTION (pi_ij = n_ij / n..) ===
joint <- data / n_total
print(round(joint, 4))
#>               Kanker Tidak Kanker
#> Merokok          0.3          0.2
#> Tidak Merokok    0.1          0.4
cat("  Verifikasi total:", sum(joint), "\n")
#>   Verifikasi total: 1
# Marginal distribution
cat("\n=== MARGINAL DISTRIBUTION BARIS (pi_i.) ===\n")
#> 
#> === MARGINAL DISTRIBUTION BARIS (pi_i.) ===
print(round(rowSums(joint), 4))
#>       Merokok Tidak Merokok 
#>           0.5           0.5
cat("\n=== MARGINAL DISTRIBUTION KOLOM (pi_.j) ===\n")
#> 
#> === MARGINAL DISTRIBUTION KOLOM (pi_.j) ===
print(round(colSums(joint), 4))
#>       Kanker Tidak Kanker 
#>          0.4          0.6
# Conditional probability bersyarat baris
cat("\n=== CONDITIONAL PROBABILITY P(Y | X) ===\n")
#> 
#> === CONDITIONAL PROBABILITY P(Y | X) ===
cond_baris <- prop.table(data, margin = 1)
print(round(cond_baris, 4))
#>               Kanker Tidak Kanker
#> Merokok          0.6          0.4
#> Tidak Merokok    0.2          0.8

5.3 Menghitung Odds Ratio

a <- data[1, 1]; b <- data[1, 2]
c <- data[2, 1]; d <- data[2, 2]

# Beda peluang
p1 <- a / (a + b)
p2 <- c / (c + d)
cat("=== BEDA PELUANG ===\n")
#> === BEDA PELUANG ===
cat(sprintf("P(Kanker | Merokok)      = %.4f\n", p1))
#> P(Kanker | Merokok)      = 0.6000
cat(sprintf("P(Kanker | Tdk Merokok)  = %.4f\n", p2))
#> P(Kanker | Tdk Merokok)  = 0.2000
cat(sprintf("Delta                    = %.4f\n", p1 - p2))
#> Delta                    = 0.4000
# Odds
cat("\n=== ODDS ===\n")
#> 
#> === ODDS ===
cat(sprintf("Odds (Merokok)           = %.4f\n", a/b))
#> Odds (Merokok)           = 1.5000
cat(sprintf("Odds (Tidak Merokok)     = %.4f\n", c/d))
#> Odds (Tidak Merokok)     = 0.2500
# Odds Ratio
OR_manual <- (a * d) / (b * c)
ln_OR     <- log(OR_manual)
SE_OR     <- sqrt(1/a + 1/b + 1/c + 1/d)
CI_low    <- exp(ln_OR - 1.96 * SE_OR)
CI_up     <- exp(ln_OR + 1.96 * SE_OR)

cat("\n=== ODDS RATIO ===\n")
#> 
#> === ODDS RATIO ===
cat(sprintf("OR = ad/bc = (%d x %d) / (%d x %d) = %d / %d\n",
            a, d, b, c, a*d, b*c))
#> OR = ad/bc = (60 x 80) / (40 x 20) = 4800 / 800
cat(sprintf("OR = %.4f\n", OR_manual))
#> OR = 6.0000
cat(sprintf("95%% CI : (%.4f , %.4f)\n", CI_low, CI_up))
#> 95% CI : (3.1873 , 11.2948)
# Relative Risk
RR <- (a / (a + b)) / (c / (c + d))
cat("\n=== RELATIVE RISK ===\n")
#> 
#> === RELATIVE RISK ===
cat(sprintf("RR = (%.0f/%.0f) / (%.0f/%.0f) = %.4f\n",
            a, a+b, c, c+d, RR))
#> RR = (60/100) / (20/100) = 3.0000

5.4 Uji Chi-Square

cat("=== UJI CHI-SQUARE ===\n")
#> === UJI CHI-SQUARE ===
hasil_chisq <- chisq.test(data, correct = FALSE)
print(hasil_chisq)
#> 
#>  Pearson's Chi-squared test
#> 
#> data:  data
#> X-squared = 33.333, df = 1, p-value = 7.764e-09
cat("--- Komponen Uji ---\n")
#> --- Komponen Uji ---
cat(sprintf("Statistik X2  : %.4f\n", hasil_chisq$statistic))
#> Statistik X2  : 33.3333
cat(sprintf("Derajat bebas : %d\n",   hasil_chisq$parameter))
#> Derajat bebas : 1
cat(sprintf("P-value       : %.6f\n",  hasil_chisq$p.value))
#> P-value       : 0.000000
if (hasil_chisq$p.value < 0.05) {
  cat("\n=> Tolak H0: Terdapat hubungan signifikan antara merokok dan kanker paru.\n")
} else {
  cat("\n=> Gagal tolak H0.\n")
}
#> 
#> => Tolak H0: Terdapat hubungan signifikan antara merokok dan kanker paru.
cat("\n--- Frekuensi Harapan (Expected) ---\n")
#> 
#> --- Frekuensi Harapan (Expected) ---
print(round(hasil_chisq$expected, 2))
#>               Kanker Tidak Kanker
#> Merokok           40           60
#> Tidak Merokok     40           60

5.5 Visualisasi

library(ggplot2)
library(gridExtra)

# ---- Plot 1: Grouped bar (proporsi bersyarat) ----
df_prop <- data.frame(
  Status   = rep(rownames(data), 2),
  Outcome  = rep(colnames(data), each = 2),
  Proporsi = c(cond_baris[, 1], cond_baris[, 2])
)
df_prop$Status <- factor(df_prop$Status, levels = c("Merokok","Tidak Merokok"))

p1 <- ggplot(df_prop, aes(x = Status, y = Proporsi, fill = Outcome)) +
  geom_bar(stat = "identity", position = "dodge",
           color = "white", width = 0.6) +
  geom_text(aes(label = scales::percent(Proporsi, accuracy = 1)),
            position = position_dodge(width = 0.6),
            vjust = -0.4, size = 4, fontface = "bold") +
  scale_fill_manual(values = c("#E74C3C","#2ECC71")) +
  scale_y_continuous(labels = scales::percent_format(), limits = c(0, 0.75)) +
  labs(title    = "P(Y | X): Distribusi Peluang Bersyarat",
       subtitle = "Proporsi Kanker Paru per Kelompok Status Merokok",
       x = "Status Merokok", y = "Proporsi (%)", fill = "Outcome") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold", hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5, color = "gray40"),
        legend.position = "top")

# ---- Plot 2: Stacked bar ----
p2 <- ggplot(df_prop, aes(x = Status, y = Proporsi, fill = Outcome)) +
  geom_bar(stat = "identity", position = "stack",
           color = "white", width = 0.5) +
  geom_text(aes(label = scales::percent(Proporsi, accuracy = 1)),
            position = position_stack(vjust = 0.5),
            color = "white", size = 4.5, fontface = "bold") +
  scale_fill_manual(values = c("#E74C3C","#2ECC71")) +
  scale_y_continuous(labels = scales::percent_format()) +
  labs(title = "Stacked Bar: Perbandingan Proporsi",
       x = "Status Merokok", y = "Proporsi (%)", fill = "Outcome") +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold", hjust = 0.5),
        legend.position = "top")

grid.arrange(p1, p2, ncol = 2)


6 Interpretasi Hasil

6.1 Interpretasi Statistik

Berdasarkan hasil analisis diperoleh:

1. Uji Chi-Square

\[\chi^2 = 33.33, \quad df = 1, \quad p\text{-value} < 0.001\]

Karena \(p\text{-value} < \alpha = 0.05\), maka \(H_0\) ditolak. Terdapat bukti statistik yang sangat kuat bahwa kebiasaan merokok dan kejadian kanker paru tidak independen — ada asosiasi yang signifikan secara statistik.

2. Beda Peluang

\[\Delta = 0.60 - 0.20 = 0.40 \neq 0\]

Terdapat perbedaan peluang sebesar 40 poin persentase antara kelompok perokok dan bukan perokok.

3. Odds Ratio

\[\widehat{OR} = 6.00 \quad \left(95\%\ CI:\ 3.19\ \text{–}\ 11.30\right)\]

Karena interval kepercayaan tidak mencakup nilai 1, OR ini signifikan secara statistik. Baris perokok menghasilkan respons “kanker paru” 6 kali lebih mungkin dibandingkan baris bukan perokok.

4. Relative Risk

\[\widehat{RR} = 3.00\]

Proporsi kejadian kanker paru pada perokok 3 kali lebih besar dibandingkan bukan perokok.


6.2 Interpretasi Substantif dalam Konteks Kasus

Secara substantif, hasil analisis ini memiliki makna kesehatan masyarakat yang penting:

Perokok memiliki odds 6 kali lebih besar untuk menderita kanker paru dibandingkan dengan bukan perokok (\(\widehat{OR} = 6.00\); \(95\%\ CI: 3.19\text{–}11.30\); \(p < 0.001\)).

Poin-poin interpretasi substantif:

  • Kekuatan asosiasi tinggi: Nilai \(OR = 6\) termasuk asosiasi yang kuat secara epidemiologi
  • Konsistensi arah: Ketiga ukuran (\(\Delta = 0.40\), \(OR = 6\), \(RR = 3\)) secara konsisten menunjukkan merokok meningkatkan risiko kanker paru
  • Relevansi kebijakan: Temuan ini mendukung pentingnya program pengendalian tembakau

Catatan metodologis:

Karena data berasal dari desain kasus-kontrol (retrospektif):

  • OR adalah ukuran asosiasi yang paling tepat dan valid untuk diinterpretasikan
  • Interpretasi RR = 3.00 harus dilakukan hati-hati; secara teknis RR tidak dapat dihitung langsung dari studi kasus-kontrol
  • Dalam studi ini, karena prevalensi outcome tidak terlalu rendah (40% pada perokok), OR dan RR memberikan nilai yang berbeda (\(OR = 6\) vs \(RR = 3\)), sehingga penggunaan OR lebih disarankan

Referensi

  • Agresti, A. (2002). Categorical Data Analysis (2nd ed.). John Wiley & Sons.
  • Agresti, A. (2013). Categorical Data Analysis (3rd ed.). John Wiley & Sons.
  • Hosmer, D. W., Lemeshow, S., & Sturdivant, R. X. (2013). Applied Logistic Regression (3rd ed.). John Wiley & Sons.
  • Szklo, M., & Nieto, F. J. (2014). Epidemiology: Beyond the Basics (3rd ed.). Jones & Bartlett Learning.
  • Stokes, M. E., Davis, C. S., & Koch, G. G. (2012). Categorical Data Analysis Using SAS (3rd ed.). SAS Institute.
  • ADK Pertemuan 2. (2021). Tabel Kontingensi Dua Arah: Distribusi Peluang dan Asosiasi. Universitas Padjadjaran (UNPAD).

7 Inferensi Tabel Kontingensi Dua Arah


pkgs <- c("knitr","kableExtra","ggplot2","scales")
invisible(lapply(pkgs, function(p) {
  if (!requireNamespace(p, quietly=TRUE)) install.packages(p)
  library(p, character.only=TRUE)
}))

Pendahuluan

Tabel kontingensi dua arah digunakan untuk menyajikan hubungan antara dua variabel kategorik. Inferensi pada tabel ini mencakup estimasi ukuran asosiasi beserta interval kepercayaannya, serta berbagai uji hipotesis untuk menguji ada tidaknya hubungan antar variabel.

Tugas ini mengkaji dua kasus:

  1. Kasus 1 — Tabel 2×2: Hubungan antara kebiasaan merokok dan kejadian kanker paru. Analisis meliputi estimasi proporsi, Risk Difference (RD), Risk Ratio (RR), Odds Ratio (OR), serta perbandingan empat metode uji hipotesis: uji dua proporsi, chi-square, likelihood ratio (G²), dan Fisher exact test.
  2. Kasus 2 — Tabel 2×3: Hubungan antara gender dan identifikasi partai politik. Analisis meliputi frekuensi harapan, uji chi-square, residual Pearson dan standardized residual, serta partisi chi-square.

8 Kasus 1: Tabel Kontingensi 2×2 — Merokok dan Kanker Paru

8.1 Data dan Penyusunan Tabel Kontingensi

Data berikut berasal dari studi kasus-kontrol yang meneliti hubungan antara kebiasaan merokok dan kejadian kanker paru pada 1.418 subjek.

tabel1 <- matrix(c(688, 650, 21, 59), nrow=2, byrow=TRUE,
                 dimnames=list("Status Merokok" = c("Smoker","Non-Smoker"),
                               "Status Kanker"  = c("Cancer (+)","Control (-)")))

tabel1 |> addmargins() |>
  kable(caption="Tabel 1. Kontingensi 2×2: Status Merokok dan Kanker Paru", align="c") |>
  kable_styling(bootstrap_options=c("striped","hover","bordered"), full_width=FALSE) |>
  row_spec(3, bold=TRUE, background="#f0f0f0") |>
  column_spec(4, bold=TRUE, background="#f0f0f0")
Tabel 1. Kontingensi 2×2: Status Merokok dan Kanker Paru
Cancer (+) Control (-) Sum
Smoker 688 650 1338
Non-Smoker 21 59 80
Sum 709 709 1418

8.2 Metode Analisis

Notasi sel tabel 2×2:

\[\begin{array}{c|cc|c} & \text{Cancer (+)} & \text{Control (−)} & \text{Total} \\ \hline \text{Smoker} & a=688 & b=650 & n_1=1338 \\ \text{Non-Smoker} & c=21 & d=59 & n_2=80 \\ \hline \text{Total} & 709 & 709 & n=1418 \\ \end{array}\]

Metode yang digunakan:

Analisis Rumus / Fungsi R
Estimasi proporsi + CI \(\hat{p} = x/n\); prop.test() (metode Wilson)
Risk Difference (RD) + CI \(RD = \hat{p}_1 - \hat{p}_2\); metode Wald
Risk Ratio (RR) + CI \(RR = \hat{p}_1/\hat{p}_2\); CI via transformasi log
Odds Ratio (OR) + CI \(OR = ad/bc\); fisher.test()
Uji dua proporsi prop.test()
Uji chi-square chisq.test()
Uji Likelihood Ratio G² \(G^2 = 2\sum O\ln(O/E)\)
Fisher Exact Test fisher.test()

8.3 Hasil dan Interpretasi

8.3.1 Estimasi Titik Proporsi dan CI 95%

\[\hat{p}_1 = \frac{a}{n_1} = \frac{688}{1338}, \qquad \hat{p}_2 = \frac{c}{n_2} = \frac{21}{80}\]

CI 95% proporsi menggunakan metode Wilson via prop.test():

\[CI_{95\%}(p) \approx \hat{p} \pm z_{0{,}025}\sqrt{\frac{\hat{p}(1-\hat{p})}{n}}\]

p1 <- prop.test(688, 1338)
p2 <- prop.test(21, 80)

data.frame(
  Kelompok = c("Smoker","Non-Smoker"),
  n        = c(1338, 80),
  Proporsi = round(c(p1$estimate, p2$estimate), 4),
  CI_Bawah = round(c(p1$conf.int[1], p2$conf.int[1]), 4),
  CI_Atas  = round(c(p1$conf.int[2], p2$conf.int[2]), 4)
) |>
  kable(col.names=c("Kelompok","n","Proporsi (p̂)","CI Bawah 95%","CI Atas 95%"),
        caption="Tabel 2. Estimasi Proporsi dan CI 95% per Kelompok", align="c") |>
  kable_styling(bootstrap_options=c("striped","hover","bordered"), full_width=FALSE)
Tabel 2. Estimasi Proporsi dan CI 95% per Kelompok
Kelompok n Proporsi (p̂)
CI Bawah 95%
Smoker 1338 0.5142 0.4870 0.5413
Non-Smoker 80 0.2625 0.1733 0.3748

Interpretasi: Proporsi kanker paru pada perokok (51,42%) jauh lebih tinggi dibandingkan bukan perokok (26,25%). Kedua interval kepercayaan tidak saling tumpang tindih, mengindikasikan perbedaan yang bermakna secara statistik.

8.3.2 Interval Kepercayaan 95% untuk RD, RR, dan OR

Risk Difference (RD): \[RD = \hat{p}_1 - \hat{p}_2, \qquad SE_{RD} = \sqrt{\frac{\hat{p}_1(1-\hat{p}_1)}{n_1}+\frac{\hat{p}_2(1-\hat{p}_2)}{n_2}}\]

Risk Ratio (RR): \[RR = \frac{\hat{p}_1}{\hat{p}_2}, \qquad CI: \exp\!\left(\ln RR \pm z \cdot \sqrt{\frac{1-\hat{p}_1}{a}+\frac{1-\hat{p}_2}{c}}\right)\]

Odds Ratio (OR): \[OR = \frac{ad}{bc}, \qquad CI \text{ via } \texttt{fisher.test()}\]

a <- 688; b <- 650; cc <- 21; d <- 59
n1 <- a+b; n2 <- cc+d
p1e <- a/n1; p2e <- cc/n2
z95 <- qnorm(0.975)

# RD + CI (Wald)
RD    <- p1e - p2e
se_RD <- sqrt(p1e*(1-p1e)/n1 + p2e*(1-p2e)/n2)
ci_RD <- RD + c(-1,1)*z95*se_RD

# RR + CI (log-normal)
RR      <- p1e / p2e
se_lnRR <- sqrt((1-p1e)/a + (1-p2e)/cc)
ci_RR   <- exp(log(RR) + c(-1,1)*z95*se_lnRR)

# OR + CI (Fisher)
ft    <- fisher.test(tabel1)
OR    <- as.numeric(ft$estimate)
ci_OR <- as.numeric(ft$conf.int)

data.frame(
  Ukuran      = c("RD","RR","OR"),
  Estimasi    = round(c(RD, RR, OR), 4),
  CI_Bawah    = round(c(ci_RD[1], ci_RR[1], ci_OR[1]), 4),
  CI_Atas     = round(c(ci_RD[2], ci_RR[2], ci_OR[2]), 4),
  Nilai_Null  = c("0","1","1"),
  Signifikan  = c("Ya (CI > 0)","Ya (CI > 1)","Ya (CI > 1)")
) |>
  kable(col.names=c("Ukuran","Estimasi","CI Bawah 95%","CI Atas 95%","Nilai Null","Signifikan?"),
        caption="Tabel 3. Ukuran Asosiasi dan CI 95%", align="c") |>
  kable_styling(bootstrap_options=c("striped","hover","bordered"), full_width=FALSE) |>
  row_spec(0, bold=TRUE, background="#2c3e50", color="white")
Tabel 3. Ukuran Asosiasi dan CI 95%
Ukuran Estimasi CI Bawah 95% CI Atas 95% Nilai Null Signifikan?
RD 0.2517 0.1516 0.3518 0 Ya (CI > 0)
RR 1.9589 1.3517 2.8387 1 Ya (CI > 1)
OR 2.9716 1.7556 5.2107 1 Ya (CI > 1)

Interpretasi:

  • RD = 0.2517: Risiko kanker paru pada perokok lebih tinggi 25.17% secara absolut dibanding bukan perokok. CI 95% [0.1516 ; 0.3518] tidak memuat 0 → signifikan.
  • RR = 1.9589: Perokok memiliki risiko 1.96× lebih besar terkena kanker paru. CI 95% tidak memuat 1 → signifikan.
  • OR = 2.9716: Odds kanker paru pada perokok 2.97× lebih besar dibanding bukan perokok. CI 95% tidak memuat 1 → signifikan.

8.3.3 Visualisasi

data.frame(
  Kelompok = c("Smoker","Non-Smoker"),
  Proporsi = c(p1e, p2e),
  lo = c(p1$conf.int[1], p2$conf.int[1]),
  hi = c(p1$conf.int[2], p2$conf.int[2])
) |>
  ggplot(aes(Kelompok, Proporsi, fill=Kelompok)) +
  geom_col(width=0.5, alpha=0.85, color="white") +
  geom_errorbar(aes(ymin=lo, ymax=hi), width=0.15, linewidth=0.9) +
  geom_text(aes(label=percent(Proporsi, .1)), vjust=-2.2, fontface="bold", size=5) +
  scale_fill_manual(values=c("Smoker"="#e74c3c","Non-Smoker"="#3498db")) +
  scale_y_continuous(labels=percent_format(), limits=c(0,.75)) +
  labs(title="Proporsi Kanker Paru berdasarkan Status Merokok",
       subtitle="Error bar = 95% CI (Wilson)", x=NULL, y="Proporsi") +
  theme_minimal(base_size=13) + theme(legend.position="none")
Gambar 1. Proporsi Kanker Paru per Kelompok dengan CI 95%

Gambar 1. Proporsi Kanker Paru per Kelompok dengan CI 95%

mosaicplot(tabel1, color=c("#e74c3c","#3498db"),
           main="Mosaic Plot: Status Merokok vs Kanker Paru",
           xlab="Status Merokok", ylab="Status Kanker", cex.axis=1.1)
Gambar 2. Mosaic Plot: Status Merokok vs Kanker Paru

Gambar 2. Mosaic Plot: Status Merokok vs Kanker Paru

Interpretasi visualisasi: Lebar kotak Smoker jauh lebih besar daripada Non-Smoker (n=1338 vs n=80), mencerminkan ketidakseimbangan ukuran sampel. Proporsi Cancer(+) pada kelompok Smoker tampak lebih dominan secara visual, konsisten dengan nilai RR dan OR yang tinggi.

8.3.4 Uji Hipotesis

Hipotesis yang diuji: \[H_0: p_1 = p_2 \quad \text{(atau: Merokok dan Kanker Paru independen)}\] \[H_1: p_1 \neq p_2 \quad \text{(atau: Ada asosiasi)}\]

8.3.4.1 Uji Dua Proporsi

\[Z = \frac{\hat{p}_1-\hat{p}_2}{\sqrt{\hat{p}(1-\hat{p})\left(\frac{1}{n_1}+\frac{1}{n_2}\right)}}, \quad \hat{p}=\frac{a+c}{n}\]

8.3.4.2 Uji Chi-Square

\[\chi^2 = \sum_{i,j}\frac{(O_{ij}-E_{ij})^2}{E_{ij}}, \quad E_{ij}=\frac{n_{i\cdot}n_{\cdot j}}{n}, \quad df=1\]

8.3.4.3 Uji Likelihood Ratio (G²)

\[G^2 = 2\sum_{i,j} O_{ij}\ln\!\left(\frac{O_{ij}}{E_{ij}}\right), \quad df=1\]

8.3.4.4 Fisher Exact Test

Menghitung probabilitas eksak dari semua tabel dengan marginal tetap: \[p = \frac{\binom{n_1}{a}\binom{n_2}{c}}{\binom{n}{m_1}}\]

uji_prop <- prop.test(tabel1, correct=FALSE)
uji_chi  <- chisq.test(tabel1, correct=FALSE)
uji_fish <- fisher.test(tabel1)

O <- as.vector(tabel1); E <- as.vector(uji_chi$expected)
G2  <- 2*sum(O*log(O/E))
pG2 <- pchisq(G2, df=1, lower.tail=FALSE)

data.frame(
  Metode    = c("Uji Dua Proporsi (Z)","Chi-Square (χ²)","Likelihood Ratio (G²)","Fisher Exact Test"),
  Hipotesis = rep("H₀: p₁ = p₂ / Independen", 4),
  Statistik = c(paste0("Z = ",round(sqrt(uji_prop$statistic),4)),
                paste0("χ² = ",round(uji_chi$statistic,4)),
                paste0("G² = ",round(G2,4)),
                "—"),
  df        = c("1","1","1","—"),
  p_value   = formatC(c(uji_prop$p.value, uji_chi$p.value, pG2, uji_fish$p.value),
                      format="e", digits=3),
  Keputusan = rep("Tolak H₀", 4),
  Interpretasi = rep("Ada asosiasi signifikan antara merokok dan kanker paru", 4)
) |>
  kable(col.names=c("Metode","H₀","Statistik Uji","df","p-value","Keputusan","Interpretasi"),
        caption="Tabel 4. Perbandingan Keempat Metode Uji Hipotesis — Kasus 1", align="c") |>
  kable_styling(bootstrap_options=c("striped","hover","bordered"), full_width=TRUE, font_size=12) |>
  column_spec(7, width="18em")
Tabel 4. Perbandingan Keempat Metode Uji Hipotesis — Kasus 1
Metode H₀ Statistik Uji df p-value Keputusan Interpretasi
Uji Dua Proporsi (Z) H₀: p₁ = p₂ / Independen Z = 4.3737 1 1.222e-05 Tolak H₀ Ada asosiasi signifikan antara merokok dan kanker paru
Chi-Square (χ²) H₀: p₁ = p₂ / Independen χ² = 19.1292 1 1.222e-05 Tolak H₀ Ada asosiasi signifikan antara merokok dan kanker paru
Likelihood Ratio (G²) H₀: p₁ = p₂ / Independen G² = 19.878 1 8.254e-06 Tolak H₀ Ada asosiasi signifikan antara merokok dan kanker paru
Fisher Exact Test H₀: p₁ = p₂ / Independen 1.476e-05 Tolak H₀ Ada asosiasi signifikan antara merokok dan kanker paru

Perbandingan dan interpretasi substantif:

  • Uji dua proporsi dan chi-square memberikan hasil yang identik secara asimtotik (\(Z^2 = \chi^2\)), keduanya menolak \(H_0\) dengan p < 0,001.
  • Likelihood ratio (G²) sedikit berbeda nilai statistiknya dibanding \(\chi^2\) Pearson karena menggunakan informasi log-likelihood, namun kesimpulannya sama.
  • Fisher exact test adalah metode paling tepat secara teori karena tidak bergantung pada asumsi asimtotik, terutama berguna saat ada sel dengan frekuensi harapan kecil. Hasilnya konsisten dengan ketiga metode lainnya.
  • Keempat metode bulat menolak \(H_0\) dengan p-value < 0,001, menunjukkan bukti yang sangat kuat adanya asosiasi antara merokok dan kanker paru.

8.4 Kesimpulan Kasus 1

Berdasarkan seluruh analisis pada Kasus 1:

  1. Proporsi kanker paru pada perokok (51,42%) secara substansial lebih tinggi daripada bukan perokok (26,25%).
  2. RD = 0.2517 → perokok menanggung risiko absolut 25,17% lebih tinggi.
  3. RR = 1.9589 → perokok hampir 2 kali lebih berisiko terkena kanker paru.
  4. OR = 2.9716 → odds kanker paru pada perokok hampir 3 kali lebih besar. Semua CI tidak memuat nilai null.
  5. Keempat metode uji (Z, χ², G², Fisher) secara konsisten menolak \(H_0\) (p < 0,001).
  6. Kesimpulan akhir: Terdapat asosiasi positif yang kuat dan signifikan secara statistik antara kebiasaan merokok dan kejadian kanker paru. Merokok merupakan faktor risiko yang bermakna terhadap kanker paru.

9 Kasus 2: Tabel Kontingensi 2×3 — Gender dan Identifikasi Partai Politik

9.1 Data dan Penyusunan Tabel Kontingensi

Data berikut menggambarkan distribusi identifikasi partai politik (Democrat, Republican, Independent) berdasarkan gender pada 2.450 responden.

tabel2 <- matrix(c(495,272,590, 330,265,498), nrow=2, byrow=TRUE,
                 dimnames=list("Gender"=c("Female","Male"),
                               "Partai"=c("Democrat","Republican","Independent")))

tabel2 |> addmargins() |>
  kable(caption="Tabel 5. Kontingensi 2×3: Gender vs Identifikasi Partai Politik", align="c") |>
  kable_styling(bootstrap_options=c("striped","hover","bordered"), full_width=FALSE) |>
  row_spec(3, bold=TRUE, background="#f0f0f0") |>
  column_spec(5, bold=TRUE, background="#f0f0f0")
Tabel 5. Kontingensi 2×3: Gender vs Identifikasi Partai Politik
Democrat Republican Independent Sum
Female 495 272 590 1357
Male 330 265 498 1093
Sum 825 537 1088 2450

9.2 Metode Analisis

Analisis Rumus / Fungsi R
Frekuensi harapan \(E_{ij} = n_{i\cdot}n_{\cdot j}/n\)
Uji chi-square keseluruhan chisq.test(), \(df=(r-1)(c-1)=2\)
Residual Pearson \(r_{ij}=(O_{ij}-E_{ij})/\sqrt{E_{ij}}\)
Standardized residual \(d_{ij}\) dari chisq.test()$stdres
Partisi chi-square Sub-tabel via chisq.test()

9.3 Hasil dan Interpretasi

9.3.1 Frekuensi Harapan

\[E_{ij} = \frac{n_{i\cdot} \times n_{\cdot j}}{n}\]

chi2 <- chisq.test(tabel2, correct=FALSE)

chi2$expected |> addmargins() |> round(2) |>
  kable(caption="Tabel 6. Frekuensi Harapan E_ij", align="c") |>
  kable_styling(bootstrap_options=c("striped","hover","bordered"), full_width=FALSE)
Tabel 6. Frekuensi Harapan E_ij
Democrat Republican Independent Sum
Female 456.95 297.43 602.62 1357
Male 368.05 239.57 485.38 1093
Sum 825.00 537.00 1088.00 2450

Interpretasi: Semua \(E_{ij} > 5\), sehingga asumsi uji chi-square terpenuhi dan uji dapat dilanjutkan tanpa koreksi.

9.3.2 Uji Chi-Square Keseluruhan

\[H_0: \text{Gender dan preferensi partai independen} \quad \text{vs} \quad H_1: \text{Ada asosiasi}\]

\[\chi^2 = \sum_{i,j}\frac{(O_{ij}-E_{ij})^2}{E_{ij}}, \quad df=(2-1)(3-1)=2\]

print(chi2)
#> 
#>  Pearson's Chi-squared test
#> 
#> data:  tabel2
#> X-squared = 12.569, df = 2, p-value = 0.001865

Interpretasi: Nilai \(\chi^2\) = 12.5693 dengan df = 2 dan p-value = 1.865e-03. Karena p < 0,05 maka \(H_0\) ditolak — terdapat asosiasi yang signifikan antara gender dan identifikasi partai politik.

9.3.3 Residual Pearson dan Standardized Residual

\[r_{ij} = \frac{O_{ij}-E_{ij}}{\sqrt{E_{ij}}}, \qquad d_{ij} = \frac{O_{ij}-E_{ij}}{\sqrt{E_{ij}(1-p_{i\cdot})(1-p_{\cdot j})}}\]

Sel dengan \(|d_{ij}| > 1{,}96\) dinyatakan berkontribusi signifikan terhadap asosiasi (α = 0,05).

sr <- round(as.vector(t(chi2$stdres)), 4)

data.frame(
  Sel          = c("Female-Democrat","Female-Republican","Female-Independent",
                   "Male-Democrat","Male-Republican","Male-Independent"),
  O            = as.vector(t(tabel2)),
  E            = round(as.vector(t(chi2$expected)), 2),
  Pearson      = round(as.vector(t(chi2$residuals)), 4),
  Standardized = sr
) |>
  kable(col.names=c("Sel","O","E","Residual Pearson","Std. Residual"),
        caption="Tabel 7. Residual Pearson dan Standardized Residual per Sel", align="c") |>
  kable_styling(bootstrap_options=c("striped","hover","bordered"), full_width=FALSE) |>
  row_spec(which(abs(sr) > 1.96), background="#ffeeba") |>
  footnote(general="Sel kuning: |Std. Residual| > 1.96 — berkontribusi signifikan pada α = 0.05")
Tabel 7. Residual Pearson dan Standardized Residual per Sel
Sel O E Residual Pearson Std. Residual
Female-Democrat 495 456.95 1.7801 3.2724
Female-Republican 272 297.43 -1.4747 -2.4986
Female-Independent 590 602.62 -0.5140 -1.0322
Male-Democrat 330 368.05 -1.9834 -3.2724
Male-Republican 265 239.57 1.6431 2.4986
Male-Independent 498 485.38 0.5728 1.0322
Note:
Sel kuning: |Std. Residual| > 1.96 — berkontribusi signifikan pada α = 0.05

Interpretasi residual:

  • Female-Democrat (d > 1,96): Wanita memilih Democrat lebih banyak dari yang diharapkan jika tidak ada asosiasi.
  • Male-Democrat (d < −1,96): Pria memilih Democrat lebih sedikit dari yang diharapkan.
  • Female-Republican (d < −1,96): Wanita memilih Republican lebih sedikit dari yang diharapkan.
  • Male-Republican (d > 1,96): Pria memilih Republican lebih banyak dari yang diharapkan.
  • Independent (Female & Male): Tidak ada penyimpangan signifikan — preferensi Independent tidak berbeda antar gender (|d| < 1,96).

9.3.4 Visualisasi

mosaicplot(tabel2, color=c("#3498db","#e74c3c","#2ecc71"),
           main="Mosaic Plot: Gender vs Identifikasi Partai Politik",
           xlab="Gender", ylab="Identifikasi Partai", cex.axis=1.1)
Gambar 3. Mosaic Plot: Gender vs Identifikasi Partai Politik

Gambar 3. Mosaic Plot: Gender vs Identifikasi Partai Politik

Interpretasi mosaic plot: Lebar setiap kolom mencerminkan total masing-masing gender (Female lebih besar). Perbedaan tinggi kotak antara Democrat dan Republican pada dua gender mengindikasikan asosiasi — wanita lebih condong ke Democrat, pria ke Republican. Kotak Independent relatif seimbang antara dua gender.

as.data.frame.table(prop.table(tabel2, margin=1)) |>
  setNames(c("Gender","Partai","Proporsi")) |>
  ggplot(aes(Gender, Proporsi, fill=Partai)) +
  geom_col(position="dodge", width=0.6, alpha=0.88, color="white") +
  geom_text(aes(label=percent(Proporsi,.1)),
            position=position_dodge(.6), vjust=-.5, size=3.8, fontface="bold") +
  scale_fill_manual(values=c("Democrat"="#3498db","Republican"="#e74c3c",
                              "Independent"="#2ecc71")) +
  scale_y_continuous(labels=percent_format(), limits=c(0,.6)) +
  labs(title="Proporsi Identifikasi Partai berdasarkan Gender",
       subtitle="Proporsi dihitung dalam baris (per gender)",
       x=NULL, y="Proporsi", fill="Partai") +
  theme_minimal(base_size=13) + theme(legend.position="top")
Gambar 4. Proporsi Identifikasi Partai per Gender

Gambar 4. Proporsi Identifikasi Partai per Gender

Interpretasi grafik proporsi: Female mengalokasikan proporsi lebih besar ke Democrat (36,5%) dibandingkan Male (30,2%), sementara Male mengalokasikan lebih besar ke Republican (24,2%) dibandingkan Female (20,0%). Proporsi Independent relatif serupa antara kedua gender.

nms <- c("Female\nDemocrat","Female\nRepublican","Female\nIndependent",
         "Male\nDemocrat","Male\nRepublican","Male\nIndependent")
data.frame(Sel=factor(nms,nms), SR=sr,
           Arah=ifelse(sr>0,"Lebih dari harapan","Kurang dari harapan")) |>
  ggplot(aes(Sel, SR, fill=Arah)) +
  geom_col(width=0.6, alpha=0.85, color="white") +
  geom_hline(yintercept=c(-1.96,1.96), linetype="dashed", color="red", linewidth=.8) +
  geom_text(aes(label=round(SR,2)), vjust=ifelse(sr>0,-.4,1.3), fontface="bold", size=4) +
  scale_fill_manual(values=c("Lebih dari harapan"="#27ae60",
                              "Kurang dari harapan"="#e74c3c")) +
  labs(title="Standardized Residual per Sel",
       subtitle="Garis merah putus-putus = batas ±1.96 (α = 0.05)",
       x=NULL, y="Standardized Residual", fill=NULL) +
  theme_minimal(base_size=12) + theme(legend.position="top")
Gambar 5. Standardized Residual per Sel

Gambar 5. Standardized Residual per Sel

Interpretasi plot residual: Empat sel melewati batas ±1,96: Female-Democrat dan Male-Republican (di atas +1,96), serta Male-Democrat dan Female-Republican (di bawah −1,96). Hal ini menegaskan bahwa perbedaan gender dalam identifikasi partai terpusat pada Democrat dan Republican, bukan pada Independent.

9.3.5 Partisi Chi-Square

Uji chi-square keseluruhan (df = 2) dipartisi menjadi dua kontras ortogonal yang aditif:

  • Partisi 1: Democrat vs Republican → apakah gender memengaruhi pilihan di antara dua partai utama?
  • Partisi 2: (Democrat + Republican) vs Independent → apakah gender memengaruhi kecenderungan memilih partai vs. independen?
chi_DR  <- chisq.test(tabel2[, c("Democrat","Republican")], correct=FALSE)
chi_DRI <- chisq.test(cbind(rowSums(tabel2[,1:2]), tabel2[,"Independent"]),
                      correct=FALSE)

data.frame(
  Sumber    = c("Partisi 1: Democrat vs Republican",
                "Partisi 2: (Dem+Rep) vs Independent",
                "Total Keseluruhan"),
  Chi2      = round(c(chi_DR$statistic, chi_DRI$statistic, chi2$statistic), 4),
  df        = c(1, 1, 2),
  p_value   = formatC(c(chi_DR$p.value, chi_DRI$p.value, chi2$p.value),
                      format="e", digits=3),
  Keputusan = c(ifelse(chi_DR$p.value<.05,"Tolak H₀","Gagal Tolak H₀"),
                ifelse(chi_DRI$p.value<.05,"Tolak H₀","Gagal Tolak H₀"),
                "Tolak H₀")
) |>
  kable(col.names=c("Sumber Variasi","χ²","df","p-value","Keputusan"),
        caption="Tabel 8. Partisi Chi-Square — Kasus 2", align="c") |>
  kable_styling(bootstrap_options=c("striped","hover","bordered"), full_width=FALSE) |>
  row_spec(3, bold=TRUE, background="#f0f0f0")
Tabel 8. Partisi Chi-Square — Kasus 2
Sumber Variasi χ² df p-value Keputusan
Partisi 1: Democrat vs Republican 11.5545 1 6.758e-04 Tolak H₀
Partisi 2: (Dem+Rep) vs Independent 1.0654 1 3.020e-01 Gagal Tolak H₀
Total Keseluruhan 12.5693 2 1.865e-03 Tolak H₀

Perbandingan partisi dengan uji keseluruhan:

  • Partisi 1 (Dem vs Rep): signifikan (p < 0,05) → gender secara nyata memengaruhi pilihan antara Democrat dan Republican. Ini adalah sumber utama asosiasi dalam uji keseluruhan.
  • Partisi 2 ((Dem+Rep) vs Ind): tidak signifikan (p > 0,05) → gender tidak memengaruhi secara bermakna apakah seseorang memilih salah satu partai atau menjadi Independent.
  • Aditivitas: \(\chi^2_{P1}\) + \(\chi^2_{P2}\) = 11.5545 + 1.0654 = 12.62 \(\approx\) \(\chi^2_{\text{total}}\) = 12.5693 ✓
  • Kategori paling berkontribusi: Democrat dan Republican — dikonfirmasi oleh Partisi 1 yang signifikan dan standardized residual yang terbesar pada keempat sel tersebut.

9.4 Kesimpulan Kasus 2

Berdasarkan seluruh analisis pada Kasus 2:

  1. Uji chi-square keseluruhan: Terdapat asosiasi signifikan antara gender dan identifikasi partai (\(\chi^2\) = 12.569, df = 2, p < 0,001).
  2. Analisis residual: Wanita cenderung lebih banyak mengidentifikasi sebagai Democrat dan lebih sedikit sebagai Republican dibanding yang diharapkan; pria sebaliknya. Keempat sel ini memiliki standardized residual melampaui ±1,96.
  3. Partisi chi-square: Asosiasi keseluruhan didominasi oleh kontras Democrat vs Republican (Partisi 1 signifikan), bukan oleh kontras partai vs Independent (Partisi 2 tidak signifikan). Aditivitas \(\chi^2\) terpenuhi.
  4. Kesimpulan akhir: Terdapat asosiasi signifikan antara gender dan identifikasi partai politik, yang terutama bersumber dari perbedaan preferensi antara Democrat dan Republican. Wanita lebih condong ke Democrat, pria lebih condong ke Republican. Preferensi terhadap Independent tidak berbeda secara signifikan berdasarkan gender.

10 Kesimpulan Umum

Aspek Kasus 1 (2×2) Kasus 2 (2×3)
Variabel Status Merokok vs Kanker Paru Gender vs Identifikasi Partai
Asosiasi Signifikan (p < 0,001) Signifikan (p < 0,001)
Ukuran efek RD=0,25; RR≈1,96; OR≈2,97 Residual besar: Dem & Rep
Kontributor utama Semua sel Kontras Democrat vs Republican
Metode terbaik Fisher exact test Chi-square + partisi
Kesimpulan Merokok meningkatkan risiko kanker paru secara signifikan Wanita cenderung ke Democrat; Pria cenderung ke Republican

Analisis tabel kontingensi dengan berbagai ukuran asosiasi, uji hipotesis, dan visualisasi yang saling melengkapi terbukti menjadi alat yang komprehensif dan informatif dalam mengungkap hubungan antar variabel kategorik.