1 Pendahuluan

📌 Informasi Tugas

Laporan ini disusun sebagai penyelesaian Tugas-tugas Mata Kuliah Analisis Data Kategori yang dibimbing oleh Prof. I Gede Nyoman Mindra Jaya, Ph.D. Tugas ini mencakup dua kasus analisis inferensi tabel kontingensi dua arah menggunakan perangkat lunak R.

Inferensi pada tabel kontingensi dua arah merupakan salah satu metode statistik yang digunakan untuk menguji dan mengukur hubungan (asosiasi) antara dua variabel kategori. Dalam laporan ini, dibahas dua kasus utama:

  • Kasus 1 — Tabel kontingensi 2×2: Hubungan antara kebiasaan merokok dan kejadian kanker paru
  • Kasus 2 — Tabel kontingensi 2×3: Hubungan antara gender dan identifikasi partai politik
# Load semua paket yang dibutuhkan
library(knitr)       # tabel rapi
library(kableExtra)  # styling tabel tambahan
library(epitools)    # RR, OR + CI
library(vcd)         # mosaic plot, residual
library(ggplot2)     # visualisasi
library(scales)      # format axis
library(dplyr)       # manipulasi data

2 Materi Dasar: Tabel Kontingensi

2.1 Definisi Tabel Kontingensi

📌 Definisi Formal

Tabel kontingensi (contingency table) adalah suatu tabel klasifikasi silang (cross-tabulation) dari dua atau lebih variabel yang bersifat kategori. Tabel ini menampilkan frekuensi kemunculan setiap kombinasi kategori sehingga memungkinkan peneliti untuk melihat pola hubungan secara ringkas dan sistematis.

Penamaan tabel kontingensi didasarkan pada jumlah variabel dan kategori: 2 variabel → tabel dua arah; jika variabel X memiliki \(I\) kategori dan Y memiliki \(J\) kategori → Tabel I × J. Dalam laporan ini mencakup tabel 2×2 (Kasus 1) dan 2×3 (Kasus 2).

2.2 Struktur dan Notasi Tabel 2×2

Untuk tabel kontingensi 2×2 dengan variabel \(X\) (baris, 2 kategori) dan \(Y\) (kolom, 2 kategori):

\[ \begin{array}{c|cc|c} X \backslash Y & y_1 & y_2 & \text{Total} \\ \hline x_1 & n_{11} & n_{12} & n_{1.} \\ x_2 & n_{21} & n_{22} & n_{2.} \\ \hline \text{Total} & n_{.1} & n_{.2} & n_{..} \end{array} \]

Notasi Keterangan
\(n_{ij}\) Frekuensi sel baris ke-\(i\), kolom ke-\(j\)
\(n_{i.} = \sum_j n_{ij}\) Total baris ke-\(i\)
\(n_{.j} = \sum_i n_{ij}\) Total kolom ke-\(j\)
\(n_{..} = \sum_i \sum_j n_{ij}\) Total keseluruhan
\(\pi_{ij} = n_{ij}/n_{..}\) Peluang bersama (joint probability)
\(\pi_{j \mid i} = n_{ij}/n_{i.}\) Peluang bersyarat \(Y=j\) given \(X=i\)

2.3 Distribusi Peluang Tabel Kontingensi

2.3.1 Peluang Bersama, Marginal, dan Bersyarat

Rumus Distribusi Peluang

Bersama (Joint): \(\pi_{ij} = P(X=i, Y=j) = \dfrac{n_{ij}}{n_{..}}\)

Marginal: \(\pi_{i.} = \dfrac{n_{i.}}{n_{..}}\), \(\quad \pi_{.j} = \dfrac{n_{.j}}{n_{..}}\)

Bersyarat (Conditional): \(\pi_{j \mid i} = P(Y=j \mid X=i) = \dfrac{n_{ij}}{n_{i.}}\)

Independensi: \(X \perp Y \iff \pi_{ij} = \pi_{i.} \times \pi_{.j}\)

2.4 Ukuran Asosiasi

2.4.1 Beda Peluang / Risk Difference (RD)

Rumus Risk Difference

\[RD = \pi_{1|1} - \pi_{1|2} = \frac{n_{11}}{n_{1.}} - \frac{n_{21}}{n_{2.}}\]

Interval Kepercayaan \((1-\alpha)\)%: \[RD \pm z_{\alpha/2} \sqrt{\frac{\hat{\pi}_{1|1}(1-\hat{\pi}_{1|1})}{n_{1.}} + \frac{\hat{\pi}_{1|2}(1-\hat{\pi}_{1|2})}{n_{2.}}}\]

  • \(RD = 0\) → tidak ada asosiasi
  • \(RD \in [-1, 1]\)

2.4.2 Risiko Relatif / Relative Risk (RR)

Rumus Relative Risk

\[RR = \frac{\pi_{1|1}}{\pi_{1|2}} = \frac{n_{11}/n_{1.}}{n_{21}/n_{2.}}\]

Interval Kepercayaan (via log-transformasi): \[\exp\!\left(\ln RR \pm z_{\alpha/2} \cdot SE_{\ln RR}\right), \quad SE_{\ln RR} = \sqrt{\frac{1-\hat{\pi}_{1|1}}{n_{11}} + \frac{1-\hat{\pi}_{1|2}}{n_{21}}}\]

  • \(RR = 1\) → independen; \(RR > 1\) → asosiasi positif; \(RR < 1\) → protektif

2.4.3 Rasio Odds / Odds Ratio (OR)

Rumus Odds Ratio

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

Interval Kepercayaan (metode Woolf): \[\exp\!\left(\ln OR \pm z_{\alpha/2} \cdot SE_{\ln OR}\right), \quad SE_{\ln OR} = \sqrt{\frac{1}{n_{11}} + \frac{1}{n_{12}} + \frac{1}{n_{21}} + \frac{1}{n_{22}}}\]

  • \(OR = 1\) → independen; berlaku untuk semua desain sampling (termasuk retrospektif)

3 Kasus 1: Tabel Kontingensi 2×2

3.1 Data dan Penyusunan Tabel

📋 Soal 1 — Penyusunan Tabel

Susun kembali tabel kontingensi 2×2 tentang hubungan kebiasaan merokok dan kanker paru.

tabel1 <- matrix(
  c(688, 650,
     21,  59),
  nrow  = 2,
  byrow = TRUE
)
rownames(tabel1) <- c("Smoker", "Non-Smoker")
colnames(tabel1) <- c("Cancer (+)", "Control (-)")

addmargins(tabel1)
#>            Cancer (+) Control (-)  Sum
#> Smoker            688         650 1338
#> Non-Smoker         21          59   80
#> Sum               709         709 1418
Tabel 1.1 — Tabel Kontingensi 2x2: Merokok dan Kanker Paru
Status Merokok Cancer (+) Control (-) Total
Smoker 688 650 1338
Non-Smoker 21 59 80
Total 709 709 1418

3.2 Estimasi Titik Proporsi

📋 Soal 2 — Estimasi Titik

Hitung estimasi titik proporsi kejadian kanker paru pada kelompok Smoker dan Non-Smoker.

📌 Konsep

Estimasi titik proporsi merupakan proporsi sampel \(\hat{\pi}_{1|i}\) yang menjadi penduga tak bias untuk parameter populasi \(\pi_{1|i}\): \[\hat{\pi}_{1|1} = \frac{n_{11}}{n_{1.}}, \qquad \hat{\pi}_{1|2} = \frac{n_{21}}{n_{2.}}\]

n1.  <- sum(tabel1[1, ])
n2.  <- sum(tabel1[2, ])
n_total <- sum(tabel1)

pi_smoker    <- tabel1[1, 1] / n1.
pi_nonsmoker <- tabel1[2, 1] / n2.

cat("Smoker     :", tabel1[1,1], "/", n1., "=", round(pi_smoker, 4),
    "(", round(pi_smoker*100, 2), "%)\n")
#> Smoker     : 688 / 1338 = 0.5142 ( 51.42 %)
cat("Non-Smoker :", tabel1[2,1], "/", n2., "=", round(pi_nonsmoker, 4),
    "(", round(pi_nonsmoker*100, 2), "%)\n")
#> Non-Smoker : 21 / 80 = 0.2625 ( 26.25 %)

✅ Interpretasi

Proporsi kejadian kanker paru pada kelompok Smoker sebesar \(\hat{\pi}_{1|1} = 0.5142\) (51.42%), sedangkan pada kelompok Non-Smoker sebesar \(\hat{\pi}_{1|2} = 0.2625\) (26.25%). Terdapat perbedaan proporsi yang cukup besar antara kedua kelompok.

3.3 Interval Kepercayaan 95%

📋 Soal 3 — Interval Kepercayaan

Hitung interval kepercayaan 95% untuk proporsi masing-masing kelompok, RD, RR, dan OR.

z <- qnorm(0.975)

se_smoker    <- sqrt(pi_smoker    * (1 - pi_smoker)    / n1.)
ci_smoker_lo <- pi_smoker    - z * se_smoker
ci_smoker_hi <- pi_smoker    + z * se_smoker

se_nonsmoker    <- sqrt(pi_nonsmoker * (1 - pi_nonsmoker) / n2.)
ci_nonsmoker_lo <- pi_nonsmoker - z * se_nonsmoker
ci_nonsmoker_hi <- pi_nonsmoker + z * se_nonsmoker

cat("CI 95% Proporsi:\n")
#> CI 95% Proporsi:
cat("Smoker     :", paste0("[", round(ci_smoker_lo, 4), ", ", round(ci_smoker_hi, 4), "]"), "\n")
#> Smoker     : [0.4874, 0.541]
cat("Non-Smoker :", paste0("[", round(ci_nonsmoker_lo, 4), ", ", round(ci_nonsmoker_hi, 4), "]"), "\n")
#> Non-Smoker : [0.1661, 0.3589]
RD <- pi_smoker - pi_nonsmoker
se_RD <- sqrt(
  pi_smoker    * (1 - pi_smoker)    / n1. +
  pi_nonsmoker * (1 - pi_nonsmoker) / n2.
)
ci_RD_lo <- RD - z * se_RD
ci_RD_hi <- RD + z * se_RD

hasil_rr <- riskratio(tabel1, method = "wald", rev = "neither")
RR       <- hasil_rr$measure[2, 1]
ci_RR_lo <- hasil_rr$measure[2, 2]
ci_RR_hi <- hasil_rr$measure[2, 3]

hasil_or <- fisher.test(tabel1)
OR       <- hasil_or$estimate
ci_OR_lo <- hasil_or$conf.int[1]
ci_OR_hi <- hasil_or$conf.int[2]

df_ci <- data.frame(
  Ukuran   = c("RD (Risk Difference)", "RR (Relative Risk)", "OR (Odds Ratio)"),
  Estimasi = round(c(RD, RR, OR), 4),
  `CI 95% Bawah` = round(c(ci_RD_lo, ci_RR_lo, ci_OR_lo), 4),
  `CI 95% Atas`  = round(c(ci_RD_hi, ci_RR_hi, ci_OR_hi), 4),
  check.names = FALSE
)
kable(df_ci,
  caption = "Tabel 1.2 — Ringkasan Estimasi Titik dan Interval Kepercayaan 95%",
  align   = "c"
)
Tabel 1.2 — Ringkasan Estimasi Titik dan Interval Kepercayaan 95%
Ukuran Estimasi CI 95% Bawah CI 95% Atas
RD (Risk Difference) 0.2517 0.1516 0.3518
RR (Relative Risk) 1.5181 1.3173 1.7495
OR (Odds Ratio) 2.9716 1.7556 5.2107

✅ Interpretasi

  • RD = 0.2517: Smoker memiliki probabilitas terkena kanker paru 25.17% lebih tinggi secara absolut dibanding Non-Smoker. CI 95% = [0.1516, 0.3518] tidak mencakup 0, menandakan RD signifikan.
  • RR = 1.5181: Risiko kanker paru pada Smoker 1.52 kali lebih besar dibanding Non-Smoker. CI 95% tidak mencakup 1.
  • OR = 2.9716: Odds kanker paru pada Smoker 2.97 kali lebih besar dibanding Non-Smoker. CI 95% tidak mencakup 1.

3.4 Uji Dua Proporsi

📋 Soal 4 — Uji Dua Proporsi

Lakukan uji dua proporsi untuk menguji apakah proporsi kanker paru berbeda antara Smoker dan Non-Smoker.

Hipotesis dan Statistik Uji

Hipotesis: \[H_0: \pi_{1|1} = \pi_{1|2} \quad \text{vs} \quad H_1: \pi_{1|1} \neq \pi_{1|2}\]

Statistik Uji (proporsi gabungan): \[\hat{\pi}_p = \frac{n_{11} + n_{21}}{n_{..}}, \quad z = \frac{\hat{\pi}_{1|1} - \hat{\pi}_{1|2}}{\sqrt{\hat{\pi}_p(1-\hat{\pi}_p)\left(\frac{1}{n_{1.}} + \frac{1}{n_{2.}}\right)}} \sim N(0,1)\]

hasil_prop <- prop.test(
  x       = c(tabel1[1,1], tabel1[2,1]),
  n       = c(n1., n2.),
  correct = FALSE,
  alternative = "two.sided"
)

cat("Proporsi Smoker     :", round(pi_smoker, 4), "\n")
#> Proporsi Smoker     : 0.5142
cat("Proporsi Non-Smoker :", round(pi_nonsmoker, 4), "\n")
#> Proporsi Non-Smoker : 0.2625
cat("Statistik chi2 (=z2):", round(hasil_prop$statistic, 4), "\n")
#> Statistik chi2 (=z2): 19.1292
cat("Nilai z             :", round(sqrt(hasil_prop$statistic), 4), "\n")
#> Nilai z             : 4.3737
cat("p-value             :", format(hasil_prop$p.value, scientific = TRUE, digits = 2), "\n")
#> p-value             : 1.2e-05
cat("Keputusan           :", ifelse(hasil_prop$p.value < 0.05, "TOLAK H0", "GAGAL TOLAK H0"), "\n")
#> Keputusan           : TOLAK H0

✅ Interpretasi

Dengan \(p\text{-value} \approx 1.22e-05\) yang jauh lebih kecil dari \(\alpha = 0{,}05\), kita menolak \(H_0\). Terdapat cukup bukti statistik bahwa proporsi kejadian kanker paru pada kelompok Smoker berbeda secara signifikan dari kelompok Non-Smoker.

3.5 Uji Chi-Square Independensi

📋 Soal 5 — Uji Chi-Square

Lakukan uji chi-square independensi untuk menguji apakah terdapat asosiasi antara status merokok dan kanker paru.

Hipotesis dan Statistik Uji

Hipotesis: \[H_0: \pi_{ij} = \pi_{i.} \times \pi_{.j} \text{ (independen)} \quad \text{vs} \quad H_1: \text{tidak independen}\]

Frekuensi harapan: \(\hat{\mu}_{ij} = \dfrac{n_{i.} \times n_{.j}}{n_{..}}\)

Statistik uji Pearson: \[X^2 = \sum_{i}\sum_{j} \frac{(n_{ij} - \hat{\mu}_{ij})^2}{\hat{\mu}_{ij}} \sim \chi^2_{(I-1)(J-1)}\]

hasil_chisq <- chisq.test(tabel1, correct = FALSE)

cat("Frekuensi Harapan:\n")
#> Frekuensi Harapan:
print(round(hasil_chisq$expected, 2))
#>            Cancer (+) Control (-)
#> Smoker            669         669
#> Non-Smoker         40          40
kontribusi <- (tabel1 - hasil_chisq$expected)^2 / hasil_chisq$expected
cat("\nKontribusi per Sel terhadap X2:\n")
#> 
#> Kontribusi per Sel terhadap X2:
print(round(kontribusi, 4))
#>            Cancer (+) Control (-)
#> Smoker         0.5396      0.5396
#> Non-Smoker     9.0250      9.0250
cat("\nX2 hitung :", round(hasil_chisq$statistic, 4), "\n")
#> 
#> X2 hitung : 19.1292
cat("df        :", hasil_chisq$parameter, "\n")
#> df        : 1
cat("p-value   :", format(hasil_chisq$p.value, scientific = TRUE, digits = 2), "\n")
#> p-value   : 1.2e-05
cat("Keputusan :", ifelse(hasil_chisq$p.value < 0.05, "TOLAK H0", "GAGAL TOLAK H0"), "\n")
#> Keputusan : TOLAK H0

✅ Interpretasi

Statistik uji \(X^2 = 19.1292\) dengan \(df = 1\) menghasilkan \(p\text{-value} \approx 1.22e-05\). Karena \(p < 0{,}05\), kita menolak \(H_0\). Terdapat asosiasi yang signifikan antara status merokok dan kejadian kanker paru.

3.6 Uji Likelihood Ratio (G²)

📋 Soal 6 — Uji Likelihood Ratio

Lakukan uji likelihood ratio (\(G^2\)) sebagai alternatif uji chi-square.

Statistik Uji G²

\[G^2 = 2 \sum_{i}\sum_{j} n_{ij} \ln\!\left(\frac{n_{ij}}{\hat{\mu}_{ij}}\right) \sim \chi^2_{(I-1)(J-1)}\]

\(G^2\) dan \(X^2\) memiliki distribusi asimtotik yang sama, namun \(G^2\) didasarkan pada prinsip maximum likelihood.

mu_hat <- hasil_chisq$expected

G2 <- 2 * sum(tabel1 * log(tabel1 / mu_hat))
df_lr <- (nrow(tabel1) - 1) * (ncol(tabel1) - 1)
pval_lr <- pchisq(G2, df = df_lr, lower.tail = FALSE)

cat("G2 hitung  :", round(G2, 4), "\n")
#> G2 hitung  : 19.878
cat("df         :", df_lr, "\n")
#> df         : 1
cat("p-value    :", format(pval_lr, scientific = TRUE, digits = 2), "\n")
#> p-value    : 8.3e-06
cat("Keputusan  :", ifelse(pval_lr < 0.05, "TOLAK H0", "GAGAL TOLAK H0"), "\n")
#> Keputusan  : TOLAK H0
cat("\nPerbandingan: X2 =", round(hasil_chisq$statistic, 4), ", G2 =", round(G2, 4), "\n")
#> 
#> Perbandingan: X2 = 19.1292 , G2 = 19.878

✅ Interpretasi

\(G^2 = 19.878\) dengan \(df = 1\) menghasilkan \(p\text{-value} \approx 8.25e-06\). Keputusan konsisten dengan uji chi-square: tolak \(H_0\). Nilai \(G^2\) (19.878) sangat dekat dengan \(X^2\) (19.1292), sesuai teori asimtotik yang menyatakan kedua statistik setara untuk sampel besar.

3.7 Fisher Exact Test

📋 Soal 7 — Fisher Exact Test

Lakukan Fisher Exact Test dan bandingkan hasilnya dengan uji sebelumnya.

Ide Fisher Exact Test

Fisher Exact Test menghitung probabilitas tepat (exact p-value) berdasarkan distribusi hipergeometrik, tanpa asumsi sampel besar. Dengan baris dan kolom marginal tetap:

\[P(\text{tabel} \mid \text{marginal tetap}) = \frac{\binom{n_{1.}}{n_{11}} \binom{n_{2.}}{n_{21}}}{\binom{n_{..}}{n_{.1}}}\]

p-value adalah jumlah peluang semua tabel yang sama ekstrem atau lebih ekstrem dari yang diamati.

hasil_fisher <- fisher.test(tabel1, alternative = "two.sided")

cat("OR estimasi :", round(hasil_fisher$estimate, 4), "\n")
#> OR estimasi : 2.9716
cat("95% CI OR   :", paste0("[", round(hasil_fisher$conf.int[1], 4), ", ", round(hasil_fisher$conf.int[2], 4), "]"), "\n")
#> 95% CI OR   : [1.7556, 5.2107]
cat("p-value     :", format(hasil_fisher$p.value, scientific = TRUE, digits = 2), "\n")
#> p-value     : 1.5e-05
cat("Keputusan   :", ifelse(hasil_fisher$p.value < 0.05, "TOLAK H0", "GAGAL TOLAK H0"), "\n")
#> Keputusan   : TOLAK H0

✅ Interpretasi

Fisher Exact Test memberikan \(p\text{-value} = 1.48e-05\) dan OR = 2.9716 dengan 95% CI = [1.7556, 5.2107]. Karena CI tidak mencakup 1 dan \(p < 0{,}05\), kita menolak \(H_0\).

3.8 Perbandingan Keempat Uji

📋 Soal 8 — Perbandingan Keempat Uji

Bandingkan hasil uji dua proporsi, chi-square, likelihood ratio, dan Fisher exact test dari sisi hipotesis, statistik uji, p-value, keputusan, dan interpretasi substantif.

Tabel 1.3 — Perbandingan Keempat Uji Hipotesis
Aspek Uji 2 Proporsi Chi-Square Likelihood Ratio Fisher Exact
Hipotesis H0 pi1|1 = pi1|2 Independensi Independensi OR = 1 (independen)
Statistik Uji z (atau chi2 = z2) X2 Pearson G2 Distribusi Hipergeometrik
Nilai Statistik chi2 = 19.1292 19.1292 19.878 OR = 2.9716
Distribusi N(0,1) atau chi2(1) chi2(1) chi2(1) Hipergeometrik (exact)
p-value 1.22e-05 1.22e-05 8.25e-06 1.48e-05
Keputusan (a=0,05) Tolak H0 Tolak H0 Tolak H0 Tolak H0

💡 Diskusi Perbandingan Uji

Keempat uji memberikan kesimpulan yang konsisten: terdapat asosiasi signifikan antara merokok dan kanker paru. Perbedaannya terletak pada:

Uji 2 Proporsi dan Chi-Square secara matematis ekuivalen (\(X^2 = z^2\)) — keduanya menggunakan pendekatan frekuensi harapan yang sama.

Likelihood Ratio (\(G^2\)) memberikan nilai yang sangat dekat dengan \(X^2\) (19.878 vs 19.1292) karena sampel besar (\(n=1418\)) — kedua statistik konvergen secara asimtotik.

Fisher Exact Test tidak memerlukan asumsi sampel besar dan memberikan nilai exact. Untuk data besar ini hasilnya konsisten dengan ketiga uji lainnya.

3.9 Visualisasi Kasus 1

par(mfrow = c(1, 3), mar = c(4, 4, 3, 1), family = "sans")

barplot(
  height = c(pi_smoker, pi_nonsmoker),
  names.arg = c("Smoker\n(51.42%)", "Non-Smoker\n(26.25%)"),
  col    = c("#f43f5e", "#0d9488"),
  ylim   = c(0, 0.75),
  main   = "Proporsi Kanker Paru",
  ylab   = "P(Cancer | Status Merokok)",
  border = NA, las = 1, cex.main = 1
)
abline(h = 0, col = "gray70")

mosaicplot(
  tabel1,
  color  = c("#f43f5e", "#0d9488"),
  main   = "Mosaic Plot",
  xlab   = "Status Merokok",
  ylab   = "Diagnosis",
  cex.axis = 0.85,
  border = "white"
)

plot(
  x = OR, y = 1,
  pch = 15, col = "#7c3aed", cex = 2.5,
  xlim = c(0, 8), ylim = c(0.5, 1.5),
  yaxt = "n",
  main = sprintf("Odds Ratio + 95%% CI\nOR = %.4f", OR),
  xlab = "Odds Ratio", ylab = "",
  las = 1, cex.main = 1
)
arrows(ci_OR_lo, 1, ci_OR_hi, 1,
       angle = 90, code = 3, length = 0.1,
       col = "#7c3aed", lwd = 2.5)
abline(v = 1, col = "#f43f5e", lty = 2, lwd = 1.5)
text(1.3, 1.35, "H0: OR=1", col = "#f43f5e", cex = 0.75)
text(OR, 0.7,
     sprintf("[%.2f, %.2f]", ci_OR_lo, ci_OR_hi),
     col = "#7c3aed", cex = 0.8)
Visualisasi Kasus 1: Proporsi, Mosaic Plot, dan Ukuran Asosiasi

Visualisasi Kasus 1: Proporsi, Mosaic Plot, dan Ukuran Asosiasi

par(mfrow = c(1, 1))

3.10 Kesimpulan Kasus 1

📋 Soal 9 — Kesimpulan Akhir

Buat kesimpulan akhir tentang hubungan antara merokok dan kanker paru.

🎯 Kesimpulan Kasus 1

Berdasarkan seluruh analisis pada data 1418 subjek (709 kasus kanker, 709 kontrol), diperoleh kesimpulan:

1. Terdapat asosiasi positif yang kuat dan signifikan antara kebiasaan merokok dan kejadian kanker paru. Keempat metode uji hipotesis (uji dua proporsi, chi-square, likelihood ratio, dan Fisher exact test) secara konsisten menolak \(H_0\) independensi dengan \(p\text{-value}\) yang sangat kecil.

2. Besaran asosiasi: RD = 0.2517 (Smoker 25,17% lebih berisiko secara absolut), RR = 1.5181 (Smoker 1.52 kali lebih berisiko), OR = 2.9716 (odds Smoker 2.97 kali lebih besar). Ketiga ukuran konsisten menunjukkan asosiasi positif kuat.

3. Secara substantif: Temuan ini konsisten dengan bukti epidemiologi global bahwa merokok merupakan faktor risiko utama kanker paru. Perokok memiliki risiko kanker paru hampir 2 kali lipat dibanding bukan perokok dalam studi case-control ini.


4 Kasus 2: Tabel Kontingensi 2×3

4.1 Data dan Penyusunan Tabel

📋 Soal 1 — Penyusunan Tabel

Susun kembali tabel kontingensi 2×3 tentang hubungan gender dan identifikasi partai politik.

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

addmargins(tabel2)
#>        Democrat Republican Independent  Sum
#> Female      495        272         590 1357
#> Male        330        265         498 1093
#> Sum         825        537        1088 2450
Tabel 2.1 — Tabel Kontingensi 2x3: Gender dan Identifikasi Partai Politik
Gender Democrat Republican Independent Total
Female 495 272 590 1357
Male 330 265 498 1093
Total 825 537 1088 2450

4.2 Frekuensi Harapan

📋 Soal 2 — Frekuensi Harapan

Hitung frekuensi harapan untuk setiap sel.

Rumus Frekuensi Harapan

\[\hat{\mu}_{ij} = \frac{n_{i.} \times n_{.j}}{n_{..}}\]

Frekuensi harapan merepresentasikan nilai yang diharapkan di setiap sel jika \(H_0\) (independensi) benar.

chisq_k2  <- chisq.test(tabel2, correct = FALSE)
mu_hat_k2 <- chisq_k2$expected

cat("Frekuensi Harapan:\n")
#> Frekuensi Harapan:
print(round(mu_hat_k2, 4))
#>        Democrat Republican Independent
#> Female  456.949   297.4322    602.6188
#> Male    368.051   239.5678    485.3812
cat("\nMin mu_hat =", round(min(mu_hat_k2), 4), "->",
    ifelse(min(mu_hat_k2) >= 5, "Syarat Cochran terpenuhi", "Gunakan Fisher/simulasi"), "\n")
#> 
#> Min mu_hat = 239.5678 -> Syarat Cochran terpenuhi
Tabel 2.2 — Frekuensi Harapan di Bawah H0 Independensi
Gender Democrat Republican Independent
Female Female 456.949 297.4322 602.6188
Male Male 368.051 239.5678 485.3812

✅ Interpretasi

Seluruh frekuensi harapan \(\hat{\mu}_{ij} \geq 5\) (minimum = 239.57), sehingga syarat Cochran terpenuhi dan uji chi-square asimtotik dapat digunakan dengan valid.

4.3 Uji Chi-Square Independensi Keseluruhan

📋 Soal 3 — Uji Chi-Square Keseluruhan

Lakukan uji chi-square independensi untuk tabel keseluruhan.

cat("X2 hitung :", round(chisq_k2$statistic, 4), "\n")
#> X2 hitung : 12.5693
cat("df        :", chisq_k2$parameter, "[(2-1)x(3-1)]\n")
#> df        : 2 [(2-1)x(3-1)]
cat("p-value   :", round(chisq_k2$p.value, 4), "\n")
#> p-value   : 0.0019
cat("Keputusan :", ifelse(chisq_k2$p.value < 0.05, "TOLAK H0", "GAGAL TOLAK H0"), "\n")
#> Keputusan : TOLAK H0

✅ Interpretasi

\(X^2 = 12.5693\) dengan \(df = 2\) menghasilkan \(p\text{-value} = 0.0019\). Karena \(p < 0{,}05\), tolak \(H_0\) — terdapat asosiasi signifikan antara gender dan identifikasi partai politik.

4.4 Residual Pearson dan Standardized Residual

📋 Soal 4 — Residual Pearson

Hitung dan interpretasikan residual Pearson atau standardized residual untuk mengidentifikasi sel yang paling berkontribusi.

Rumus Residual

Residual Pearson: \(r_{ij} = \dfrac{n_{ij} - \hat{\mu}_{ij}}{\sqrt{\hat{\mu}_{ij}}}\)

Standardized Residual (Adjusted): \(d_{ij} = \dfrac{n_{ij} - \hat{\mu}_{ij}}{\sqrt{\hat{\mu}_{ij}(1 - \hat{p}_{i.})(1 - \hat{p}_{.j})}}\)

Aturan: \(|d_{ij}| > 2\) → sel berkontribusi signifikan; \(|d_{ij}| > 3\) → sangat signifikan.

res_pearson <- chisq_k2$residuals
cat("Residual Pearson (rij):\n")
#> Residual Pearson (rij):
print(round(res_pearson, 4))
#>        Democrat Republican Independent
#> Female   1.7801    -1.4747     -0.5140
#> Male    -1.9834     1.6431      0.5728
res_std <- chisq_k2$stdres
cat("\nStandardized Residual (dij):\n")
#> 
#> Standardized Residual (dij):
print(round(res_std, 4))
#>        Democrat Republican Independent
#> Female   3.2724    -2.4986     -1.0322
#> Male    -3.2724     2.4986      1.0322
contrib <- res_pearson^2
cat("\nKontribusi Sel terhadap X2:\n")
#> 
#> Kontribusi Sel terhadap X2:
print(round(contrib, 4))
#>        Democrat Republican Independent
#> Female   3.1686     2.1746      0.2642
#> Male     3.9339     2.6999      0.3281
cat("\nTotal X2 =", round(sum(contrib), 4), "(verifikasi:", round(chisq_k2$statistic, 4), ")\n")
#> 
#> Total X2 = 12.5693 (verifikasi: 12.5693 )
res_df <- as.data.frame(as.table(round(res_std, 3)))
names(res_df) <- c("Gender", "Partai", "Residual")

ggplot(res_df, aes(x = Partai, y = Gender, fill = Residual)) +
  geom_tile(color = "white", linewidth = 1.5) +
  geom_text(aes(label = sprintf("%.3f", Residual)),
            size = 5, fontface = "bold",
            color = ifelse(abs(res_df$Residual) > 1.5, "white", "#1e293b")) +
  scale_fill_gradient2(
    low      = "#f43f5e",
    mid      = "#f8fafc",
    high     = "#0d9488",
    midpoint = 0,
    limits   = c(-4, 4),
    name     = "Std. Residual"
  ) +
  labs(
    title    = "Standardized Residual per Sel",
    subtitle = "Merah = lebih rendah dari harapan | Hijau = lebih tinggi dari harapan",
    x = "Identifikasi Partai Politik",
    y = "Gender"
  ) +
  theme_minimal(base_family = "sans") +
  theme(
    plot.title    = element_text(face = "bold", size = 14, color = "#1a2744"),
    plot.subtitle = element_text(size = 11, color = "#64748b"),
    axis.text     = element_text(size = 12, color = "#334155"),
    panel.grid    = element_blank()
  )
Heatmap Standardized Residual — Kasus 2

Heatmap Standardized Residual — Kasus 2

✅ Interpretasi Residual

Dari standardized residual: - Female–Democrat (\(d = 3.272\)): Female lebih banyak dari yang diharapkan mengidentifikasi sebagai Democrat (signifikan, \(|d|>2\)). - Female–Republican (\(d = -2.499\)): Female lebih sedikit dari yang diharapkan mengidentifikasi sebagai Republican (signifikan). - Male–Democrat (\(d = -3.272\)): Male lebih sedikit dari yang diharapkan mengidentifikasi sebagai Democrat. - Male–Republican (\(d = 2.499\)): Male lebih banyak dari yang diharapkan mengidentifikasi sebagai Republican. - Independent relatif lebih kecil residualnya, menandakan distribusinya lebih seimbang antar gender.

4.5 Partisi Chi-Square

📋 Soal 5 — Partisi Chi-Square

Lakukan partisi chi-square untuk (a) Democrat vs Republican, dan (b) (Democrat + Republican) vs Independent.

Konsep Partisi Chi-Square

Untuk tabel \(I \times J\), chi-square total dengan \(df = (I-1)(J-1)\) dapat dipartisi menjadi komponen-komponen yang aditif: \[X^2_{\text{total}} = X^2_{\text{partisi 1}} + X^2_{\text{partisi 2}} + \cdots\] \[df_{\text{total}} = df_1 + df_2 + \cdots\]

Dengan \(df_1 + df_2 = (I-1)(J-1) = 2\) untuk tabel 2×3.

tabel_DR <- tabel2[, 1:2]
chisq_DR <- chisq.test(tabel_DR, correct = FALSE)

cat("PARTISI 1: Democrat vs Republican\n")
#> PARTISI 1: Democrat vs Republican
print(addmargins(tabel_DR))
#>        Democrat Republican  Sum
#> Female      495        272  767
#> Male        330        265  595
#> Sum         825        537 1362
cat("\nX2_1 =", round(chisq_DR$statistic, 4), ", df =", chisq_DR$parameter,
    ", p-value =", round(chisq_DR$p.value, 4), "\n")
#> 
#> X2_1 = 11.5545 , df = 1 , p-value = 7e-04
tabel_DRI <- cbind(rowSums(tabel2[, 1:2]), tabel2[, 3])
rownames(tabel_DRI) <- rownames(tabel2)
colnames(tabel_DRI) <- c("Dem+Rep", "Independent")
chisq_DRI <- chisq.test(tabel_DRI, correct = FALSE)

cat("\nPARTISI 2: (Dem+Rep) vs Independent\n")
#> 
#> PARTISI 2: (Dem+Rep) vs Independent
print(addmargins(tabel_DRI))
#>        Dem+Rep Independent  Sum
#> Female     767         590 1357
#> Male       595         498 1093
#> Sum       1362        1088 2450
cat("\nX2_2 =", round(chisq_DRI$statistic, 4), ", df =", chisq_DRI$parameter,
    ", p-value =", round(chisq_DRI$p.value, 4), "\n")
#> 
#> X2_2 = 1.0654 , df = 1 , p-value = 0.302
cat("\nRingkasan Partisi:\n")
#> 
#> Ringkasan Partisi:
cat("X2_1 (Dem vs Rep)     :", round(chisq_DR$statistic, 4), " (df =", chisq_DR$parameter, ")\n")
#> X2_1 (Dem vs Rep)     : 11.5545  (df = 1 )
cat("X2_2 (Dem+Rep vs Ind) :", round(chisq_DRI$statistic, 4), " (df =", chisq_DRI$parameter, ")\n")
#> X2_2 (Dem+Rep vs Ind) : 1.0654  (df = 1 )
cat("Total Partisi         :", round(chisq_DR$statistic + chisq_DRI$statistic, 4),
    " (df =", chisq_DR$parameter + chisq_DRI$parameter, ")\n")
#> Total Partisi         : 12.62  (df = 2 )
cat("X2 Keseluruhan        :", round(chisq_k2$statistic, 4), " (df =", chisq_k2$parameter, ")\n")
#> X2 Keseluruhan        : 12.5693  (df = 2 )

4.6 Perbandingan Partisi vs Keseluruhan

📋 Soal 6 — Perbandingan Partisi vs Keseluruhan

Bandingkan hasil partisi dengan hasil uji chi-square keseluruhan.

Tabel 2.3 — Perbandingan Partisi Chi-Square vs Keseluruhan
Perbandingan X2 df p-value Keputusan
Partisi 1: Democrat vs Republican 11.5545 1 0.0007 Tolak H0
Partisi 2: (Dem+Rep) vs Independent 1.0654 1 0.3020 Gagal Tolak
Total Partisi 12.6200 2 NA -
Chi-Square Keseluruhan (2x3) 12.5693 2 0.0019 Tolak H0

✅ Interpretasi Perbandingan

  • Total \(X^2\) dari dua partisi = 12.62 ≈ \(X^2_{\text{total}}\) = 12.5693 dengan \(df\) yang juga terjumlah (1+1=2). Ini mengkonfirmasi bahwa partisi dilakukan secara ortogonal dan bersifat aditif.
  • Partisi 1 (Democrat vs Republican): \(X^2_1 = 11.5545\), \(p = 7\times 10^{-4}\)signifikan. Terdapat perbedaan gender yang bermakna dalam preferensi Democrat vs Republican.
  • Partisi 2 ((Dem+Rep) vs Independent): \(X^2_2 = 1.0654\), \(p = 0.302\)tidak signifikan. Perbedaan gender dalam memilih Independent dibandingkan kedua partai utama relatif lebih kecil.

4.7 Kategori Paling Berkontribusi

📋 Soal 7 — Identifikasi Kategori Paling Berkontribusi

Jelaskan kategori mana yang paling berkontribusi terhadap hubungan antara Gender dan Identifikasi Partai Politik.

par(mfrow = c(1, 2), mar = c(4, 4, 3, 1))

contrib_vec <- as.vector(t(contrib))
names(contrib_vec) <- paste0(
  rep(c("F-", "M-"), each = 3),
  rep(c("Dem", "Rep", "Ind"), 2)
)
warna_contrib <- ifelse(contrib_vec == max(contrib_vec), "#f43f5e",
                 ifelse(contrib_vec >= sort(contrib_vec, decreasing=TRUE)[2],
                        "#f59e0b", "#0d9488"))
barplot(
  contrib_vec,
  col    = warna_contrib,
  main   = "Kontribusi Sel\nterhadap X2",
  ylab   = "Kontribusi (r2ij)",
  las    = 2, border = NA, cex.names = 0.85, cex.main = 1
)
abline(h = 0, col = "gray70")

mosaicplot(
  tabel2,
  color  = c("#db2777", "#7c3aed", "#0d9488"),
  main   = "Mosaic Plot\nGender x Partai",
  xlab   = "Gender",
  shade  = TRUE,
  border = "white", cex.axis = 0.85
)
Kontribusi Sel terhadap Chi-Square dan Mosaic Plot — Kasus 2

Kontribusi Sel terhadap Chi-Square dan Mosaic Plot — Kasus 2

par(mfrow = c(1, 1))

🎯 Kategori Paling Berkontribusi

Berdasarkan standardized residual dan kontribusi terhadap \(X^2\):

1. Democrat adalah partai yang paling menunjukkan perbedaan gender. Female secara signifikan over-represented di Democrat (\(d_{F,Dem} = 3.272\), \(|d|>2\)) dan Male under-represented (\(d_{M,Dem} = -3.272\)).

2. Republican juga menunjukkan pola sebaliknya: Female under-represented (\(d_{F,Rep} = -2.499\)) dan Male over-represented (\(d_{M,Rep} = 2.499\)).

3. Independent memiliki residual yang paling kecil, artinya distribusi gender di kelompok Independent relatif paling proporsional dan berkontribusi paling sedikit terhadap ketidakindependensian.

Secara substantif: perbedaan gender dalam afiliasi partai paling kentara pada Democrat dan Republican, di mana wanita cenderung lebih condong ke Democrat sedangkan pria lebih condong ke Republican.


5 Kesimpulan Umum

🎯 Kesimpulan Laporan

Kasus 1 (Merokok & Kanker Paru): Terdapat asosiasi positif yang kuat dan signifikan antara kebiasaan merokok dan kejadian kanker paru (\(X^2 = 19.1292\), \(p \approx 0\)). Perokok memiliki RR = 1.5181 (hampir 2x lebih berisiko) dan OR = 2.9716. Keempat uji hipotesis memberikan keputusan yang konsisten.

Kasus 2 (Gender & Partai Politik): Terdapat asosiasi signifikan antara gender dan identifikasi partai politik (\(X^2 = 12.5693\), \(p = 0.0019\)). Partisi chi-square menunjukkan bahwa asosiasi ini terutama didorong oleh perbedaan preferensi Democrat vs Republican antar gender, bukan oleh kategori Independent.