1 Definisi Tabel Kontingensi

Tabel kontingensi (sering juga disebut tabulasi silang atau crosstab) adalah sebuah tabel matriks yang menampilkan distribusi frekuensi multivariat dari variabel-variabel kategorik. Tabel ini digunakan untuk merangkum data, menganalisis pola, dan mencari hubungan (asosiasi) antara dua atau lebih variabel yang berskala nominal atau ordinal.

1.1 Struktur Tabel Kontingensi 2x2

Tabel kontingensi 2x2 adalah bentuk tabel paling sederhana yang membandingkan dua variabel, di mana masing-masing variabel memiliki tepat dua kategori (dikotomi). Variabel pertama biasanya ditempatkan pada baris, dan variabel kedua pada kolom.

Kategori Kolom 1 (\(Y=1\)) Kategori Kolom 2 (\(Y=2\)) Total Baris
Kategori Baris 1 (\(X=1\)) \(n_{11}\) \(n_{12}\) \(n_{1+}\)
Kategori Baris 2 (\(X=2\)) \(n_{21}\) \(n_{22}\) \(n_{2+}\)
Total Kolom \(n_{+1}\) \(n_{+2}\) \(N\)

Keterangan: \(n_{ij}\) = frekuensi observasi sel \((i,j)\); \(n_{i+}\) = total marginal baris; \(n_{+j}\) = total marginal kolom; \(N\) = total sampel.


2 Distribusi Peluang dalam Tabel Kontingensi 2x2

2.1 Peluang Bersama

\[\pi_{ij} = P(X=i,\,Y=j) = \frac{n_{ij}}{N}, \qquad \sum_{i}\sum_{j}\pi_{ij}=1\]

2.2 Peluang Marginal

\[\pi_{i+} = \frac{n_{i+}}{N} \qquad \pi_{+j} = \frac{n_{+j}}{N}\]

2.3 Peluang Bersyarat

\[\pi_{j|i} = P(Y=j\mid X=i) = \frac{\pi_{ij}}{\pi_{i+}} = \frac{n_{ij}}{n_{i+}}\]

2.3.1 Contoh Perhitungan: Studi Kasus Penyakit Paru

data_paru  <- matrix(c(40,60,10,90), nrow=2, byrow=TRUE)
rownames(data_paru) <- c("Merokok","Tidak Merokok")
colnames(data_paru) <- c("Sakit Paru","Tidak Sakit")
N_paru <- sum(data_paru)

kable(addmargins(data_paru),
      caption = "Tabel Kontingensi: Kebiasaan Merokok vs Penyakit Paru",
      align   = "c") %>%
  kable_styling(bootstrap_options = c("striped","hover","bordered"),
                full_width = FALSE, position = "center") %>%
  row_spec(3, bold=TRUE, background="#f0f0f0") %>%
  column_spec(4, bold=TRUE, background="#f0f0f0")
Tabel Kontingensi: Kebiasaan Merokok vs Penyakit Paru
Sakit Paru Tidak Sakit Sum
Merokok 40 60 100
Tidak Merokok 10 90 100
Sum 50 150 200
pi_11       <- data_paru[1,1] / N_paru
pi_1_plus   <- sum(data_paru[1,]) / N_paru
pi_1_given1 <- pi_11 / pi_1_plus

tabel_peluang <- data.frame(
  Jenis  = c("Peluang Bersama (Perokok & Sakit Paru)",
             "Peluang Marginal Baris (Perokok)",
             "Peluang Bersyarat (Sakit Paru | Perokok)"),
  Notasi = c("π₁₁","π₁₊","π₁|₁"),
  Nilai  = round(c(pi_11, pi_1_plus, pi_1_given1), 4)
)
kable(tabel_peluang,
      col.names = c("Jenis Peluang","Notasi","Nilai"),
      caption   = "Ringkasan Perhitungan Peluang",
      align     = c("l","c","c")) %>%
  kable_styling(bootstrap_options = c("striped","hover","bordered"),
                full_width = FALSE, position = "center")
Ringkasan Perhitungan Peluang
Jenis Peluang Notasi Nilai
Peluang Bersama (Perokok & Sakit Paru) π₁₁ 0.2
Peluang Marginal Baris (Perokok) π₁₊ 0.5
Peluang Bersyarat (Sakit Paru &#124; Perokok) π₁&#124;₁ 0.4
barplot(t(data_paru), beside=TRUE,
        legend.text = colnames(data_paru),
        args.legend = list(x="topright", bty="n"),
        col  = c("darkred","lightblue"),
        main = "Distribusi Penyakit Paru Berdasarkan Status Merokok",
        xlab = "Status Merokok", ylab = "Jumlah Pasien")


3 Inferensi Tabel Kontingensi Dua Arah

Inferensi pada tabel kontingensi mencakup dua pendekatan utama:

  • Estimasi — pendugaan parameter populasi dari sampel (estimasi titik dan interval kepercayaan).
  • Uji Hipotesis — pengujian ada tidaknya asosiasi antar variabel.

Dua kasus yang dianalisis:

  1. Kasus 1 — Tabel 2×2: Hubungan kebiasaan merokok dan kejadian kanker paru.
  2. Kasus 2 — Tabel 2×3: Hubungan gender dan identifikasi partai politik.

Catatan Pemilihan Ukuran Asosiasi: Kasus 1 adalah studi kasus-kontrol (case-control study). Pada desain ini Odds Ratio (OR) adalah ukuran yang paling tepat karena proporsi kasus/kontrol ditentukan peneliti, bukan prevalensi alami populasi. RR dan RD tetap ditampilkan sebagai pelengkap, namun interpretasi utama berfokus pada OR.


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

4.1 Penyusunan Tabel dan Eksplorasi Awal

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

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

Keterangan notasi:

Notasi Nilai Keterangan
\(n_{11}\) 688 Smoker dengan Cancer (+)
\(n_{12}\) 650 Smoker dengan Control (−)
\(n_{21}\) 21 Non-Smoker dengan Cancer (+)
\(n_{22}\) 59 Non-Smoker dengan Control (−)
\(N\) 1418 Total seluruh observasi

4.1.1 Eksplorasi: Distribusi Marginal dan Proporsi Bersyarat

n11 <- 688; n12 <- 650; n21 <- 21; n22 <- 59
n1. <- n11+n12;  n2. <- n21+n22;  N <- n1.+n2.

# Distribusi marginal baris
tabel_marg1 <- data.frame(
  Kelompok  = c("Smoker","Non-Smoker","Total"),
  Frekuensi = c(n1., n2., N),
  Proporsi  = round(c(n1./N, n2./N, 1), 4)
)
kable(tabel_marg1,
      col.names = c("Kelompok","Frekuensi (nᵢ₊)","Proporsi Marginal (πᵢ₊)"),
      caption   = "Distribusi Marginal Baris — Status Merokok",
      align     = "c") %>%
  kable_styling(bootstrap_options = c("striped","hover","bordered"),
                full_width = FALSE, position = "center") %>%
  row_spec(3, bold=TRUE, background="#f0f0f0")
Distribusi Marginal Baris — Status Merokok
Kelompok Frekuensi (nᵢ₊) Proporsi Marginal (πᵢ₊)
Smoker 1338 0.9436
Non-Smoker 80 0.0564
Total 1418 1.0000
# Proporsi bersyarat per baris P(Kanker | Merokok)
prop_baris1 <- prop.table(data1, margin=1)
kable(round(prop_baris1, 4),
      caption = "Proporsi Bersyarat per Baris — P(Status Kanker | Status Merokok)",
      align   = "c") %>%
  kable_styling(bootstrap_options = c("striped","hover","bordered"),
                full_width = FALSE, position = "center")
Proporsi Bersyarat per Baris — P(Status Kanker | Status Merokok)
Cancer (+) Control (-)
Smoker 0.5142 0.4858
Non-Smoker 0.2625 0.7375
# Proporsi bersyarat per kolom P(Merokok | Kanker)
prop_kolom1 <- prop.table(data1, margin=2)
kable(round(prop_kolom1, 4),
      caption = "Proporsi Bersyarat per Kolom — P(Status Merokok | Status Kanker)",
      align   = "c") %>%
  kable_styling(bootstrap_options = c("striped","hover","bordered"),
                full_width = FALSE, position = "center")
Proporsi Bersyarat per Kolom — P(Status Merokok | Status Kanker)
Cancer (+) Control (-)
Smoker 0.9704 0.9168
Non-Smoker 0.0296 0.0832

Interpretasi Eksplorasi: Dari 1418 observasi, 94.4% adalah perokok. Proporsi bersyarat menunjukkan 51.4% perokok mengalami Cancer (+), jauh lebih tinggi dibanding 26.2% pada non-perokok — selisih 25.2 poin persentase yang mengindikasikan asosiasi kuat.


4.2 Estimasi

4.2.1 Estimasi Titik Proporsi

\[\hat{p}_1 = \frac{n_{11}}{n_{1+}} = \frac{688}{1338}, \quad \hat{p}_2 = \frac{n_{21}}{n_{2+}} = \frac{21}{80}\]

p1 <- n11/n1.;  p2 <- n21/n2.

tabel_est <- data.frame(
  Kelompok = c("Smoker","Non-Smoker"),
  Cancer   = c(n11, n21),
  Total    = c(n1., n2.),
  Proporsi = round(c(p1,p2), 4),
  Persen   = paste0(round(c(p1,p2)*100, 2),"%")
)
kable(tabel_est,
      col.names = c("Kelompok","Cancer (+)","Total","Proporsi (p̂)","Persentase"),
      caption   = "Estimasi Titik Proporsi Kejadian Kanker Paru",
      align     = "c") %>%
  kable_styling(bootstrap_options = c("striped","hover","bordered"),
                full_width = FALSE, position = "center")
Estimasi Titik Proporsi Kejadian Kanker Paru
Kelompok Cancer (+) Total Proporsi (p̂)
Persentase
Smoker 688 1338 0.5142 51.42%
Non-Smoker 21 80 0.2625 26.25%

Interpretasi: Proporsi kanker paru pada Smoker \(\hat{p}_1 =\) 0.5142 (51.42%), pada Non-Smoker \(\hat{p}_2 =\) 0.2625 (26.25%). Selisih absolut sebesar 25.17pp tampak substansial.


4.2.2 Estimasi Interval Kepercayaan 95%

4.2.2.1 IK Proporsi Masing-Masing Kelompok

ik_p1 <- prop.test(n11, n1., conf.level=0.95, correct=FALSE)
ik_p2 <- prop.test(n21, n2., conf.level=0.95, correct=FALSE)

tabel_ik <- data.frame(
  Kelompok    = c("Smoker","Non-Smoker"),
  Proporsi    = round(c(p1,p2), 4),
  Batas_Bawah = round(c(ik_p1$conf.int[1], ik_p2$conf.int[1]), 4),
  Batas_Atas  = round(c(ik_p1$conf.int[2], ik_p2$conf.int[2]), 4)
)
kable(tabel_ik,
      col.names = c("Kelompok","Proporsi (p̂)","Batas Bawah 95%","Batas Atas 95%"),
      caption   = "Interval Kepercayaan 95% Proporsi Masing-Masing Kelompok",
      align     = "c") %>%
  kable_styling(bootstrap_options = c("striped","hover","bordered"),
                full_width = FALSE, position = "center")
Interval Kepercayaan 95% Proporsi Masing-Masing Kelompok
Kelompok Proporsi (p̂)
Batas Bawah 95%
Smoker 0.5142 0.4874 0.5409
Non-Smoker 0.2625 0.1786 0.3682

4.2.2.2 IK untuk RD, RR, dan OR

Rumus:

\[\text{RD}=\hat{p}_1-\hat{p}_2, \quad \text{SE(RD)}=\sqrt{\tfrac{\hat{p}_1(1-\hat{p}_1)}{n_{1+}}+\tfrac{\hat{p}_2(1-\hat{p}_2)}{n_{2+}}}\]

\[\text{RR}=\frac{\hat{p}_1}{\hat{p}_2}, \quad \text{SE}(\ln\widehat{\text{RR}})=\sqrt{\tfrac{1}{n_{11}}-\tfrac{1}{n_{1+}}+\tfrac{1}{n_{21}}-\tfrac{1}{n_{2+}}}\]

\[\text{OR}=\frac{n_{11}\cdot n_{22}}{n_{12}\cdot n_{21}}, \quad \text{SE}(\ln\widehat{\text{OR}})=\sqrt{\tfrac{1}{n_{11}}+\tfrac{1}{n_{12}}+\tfrac{1}{n_{21}}+\tfrac{1}{n_{22}}}\]

z95 <- qnorm(0.975)

RD    <- p1-p2
SE_RD <- sqrt(p1*(1-p1)/n1. + p2*(1-p2)/n2.)
RD_lo <- RD - z95*SE_RD;  RD_hi <- RD + z95*SE_RD

RR      <- p1/p2
SE_lnRR <- sqrt(1/n11 - 1/n1. + 1/n21 - 1/n2.)
RR_lo   <- exp(log(RR)-z95*SE_lnRR);  RR_hi <- exp(log(RR)+z95*SE_lnRR)

OR      <- (n11*n22)/(n12*n21)
SE_lnOR <- sqrt(1/n11+1/n12+1/n21+1/n22)
OR_lo   <- exp(log(OR)-z95*SE_lnOR);  OR_hi <- exp(log(OR)+z95*SE_lnOR)

tabel_ukuran <- data.frame(
  Ukuran      = c("Risk Difference (RD)*","Risk Ratio (RR)*","Odds Ratio (OR) ✓"),
  Estimasi    = round(c(RD,RR,OR), 4),
  Batas_Bawah = round(c(RD_lo,RR_lo,OR_lo), 4),
  Batas_Atas  = round(c(RD_hi,RR_hi,OR_hi), 4),
  Nilai_Null  = c("0","1","1"),
  Signifikan  = c("Ya","Ya","Ya")
)
kable(tabel_ukuran,
      col.names = c("Ukuran Asosiasi","Estimasi","Batas Bawah 95%",
                    "Batas Atas 95%","Nilai Null (H₀)","Signifikan?"),
      caption   = "Estimasi Titik dan IK 95% untuk RD, RR, dan OR",
      align     = "c") %>%
  kable_styling(bootstrap_options = c("striped","hover","bordered"),
                full_width = FALSE, position = "center") %>%
  row_spec(0, bold=TRUE) %>%
  row_spec(3, bold=TRUE, background="#d4edda") %>%
  footnote(general = "✓ = Ukuran utama untuk studi kasus-kontrol.  * = Ditampilkan sebagai pelengkap.",
           general_title = "Catatan:")
Estimasi Titik dan IK 95% untuk RD, RR, dan OR
Ukuran Asosiasi Estimasi Batas Bawah 95% Batas Atas 95% Nilai Null (H₀) Signifikan?
Risk Difference (RD)* 0.2517 0.1516 0.3518 0 Ya
Risk Ratio (RR)* 1.9589 1.3517 2.8387 1 Ya
Odds Ratio (OR) ✓ 2.9738 1.7867 4.9494 1 Ya
Catatan:
✓ = Ukuran utama untuk studi kasus-kontrol. * = Ditampilkan sebagai pelengkap.
cat("=== Verifikasi OR dengan epitools::oddsratio() ===\n")
## === Verifikasi OR dengan epitools::oddsratio() ===
print(oddsratio(data1,  method="wald")$measure)
##                         NA
## odds ratio with 95% C.I. estimate    lower    upper
##               Smoker     1.000000       NA       NA
##               Non-Smoker 2.973773 1.786737 4.949427
cat("\n=== Verifikasi RR dengan epitools::riskratio() ===\n")
## 
## === Verifikasi RR dengan epitools::riskratio() ===
print(riskratio(data1, method="wald")$measure)
##                         NA
## risk ratio with 95% C.I. estimate    lower    upper
##               Smoker     1.000000       NA       NA
##               Non-Smoker 1.518115 1.317306 1.749536

Interpretasi:

  • RD = 0.2517 (IK 95%: [0.1516, 0.3518]): Perokok memiliki risiko absolut 25.17% lebih tinggi. IK tidak mencakup 0 → signifikan.
  • RR = 1.9589 (IK 95%: [1.3517, 2.8387]): Risiko 1.96 kali lebih tinggi. (Pada studi kasus-kontrol, RR tidak mencerminkan risiko populasi sebenarnya.)
  • OR = 2.9738 (IK 95%: [1.7867, 4.9494]) — Ukuran utama. Odds kanker paru pada perokok 2.97 kali lebih besar. IK tidak mencakup 1 → asosiasi positif sangat signifikan. Konsisten dengan verifikasi epitools.

4.3 Uji Hipotesis

4.3.1 Uji Dua Proporsi

Hipotesis: \(H_0: \pi_1=\pi_2\) vs \(H_1: \pi_1\neq\pi_2\)

Statistik uji (df = 1): \[z=\frac{\hat{p}_1-\hat{p}_2}{\sqrt{\hat{p}(1-\hat{p})\left(\tfrac{1}{n_{1+}}+\tfrac{1}{n_{2+}}\right)}},\quad \hat{p}=\frac{n_{11}+n_{21}}{N}\]

uji_prop <- prop.test(x=c(n11,n21), n=c(n1.,n2.),
                      correct=FALSE, conf.level=0.95)
print(uji_prop)
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  c(n11, n21) 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
prop_data <- prop.table(data1, margin=1)
barplot(t(prop_data), beside=TRUE,
        legend.text = colnames(prop_data),
        args.legend = list(x="topright", bty="n"),
        col  = c("tomato","steelblue"),
        main = "Proporsi Status Kanker Berdasarkan Kebiasaan Merokok",
        xlab = "Status Merokok", ylab = "Proporsi", ylim=c(0,1))

Interpretasi: \(\chi^2=\) 19.1292 (df=1), p-value = 1.222e-05 \(<0.05\). Tolak \(H_0\) — terdapat perbedaan proporsi yang signifikan antara perokok (51.42%) dan non-perokok (26.25%).


4.3.2 Uji Chi-Square Independensi

Hipotesis: \(H_0:\) status merokok dan kanker paru saling bebas vs \(H_1:\) terdapat asosiasi.

Statistik uji (df = \((r-1)(c-1)=1\)): \[\chi^2=\sum_{i,j}\frac{(n_{ij}-\hat{\mu}_{ij})^2}{\hat{\mu}_{ij}},\quad \hat{\mu}_{ij}=\frac{n_{i+}\cdot n_{+j}}{N}\]

uji_chisq <- chisq.test(data1, correct=FALSE)
print(uji_chisq)
## 
##  Pearson's Chi-squared test
## 
## data:  data1
## X-squared = 19.129, df = 1, p-value = 1.222e-05
kable(round(uji_chisq$expected, 2),
      caption = "Frekuensi Harapan $\\hat{\\mu}_{ij}$ (semua sel > 5 ✓)",
      align   = "c") %>%
  kable_styling(bootstrap_options = c("striped","hover","bordered"),
                full_width = FALSE, position = "center")
Frekuensi Harapan \(\hat{\mu}_{ij}\) (semua sel > 5 ✓)
Cancer (+) Control (-)
Smoker 669 669
Non-Smoker 40 40

Interpretasi: \(\chi^2=\) 19.1292 (df=1), p-value = 1.222e-05 \(<0.05\). Tolak \(H_0\) — terdapat asosiasi yang sangat signifikan. Semua frekuensi harapan > 5, asumsi terpenuhi.


4.3.3 Uji Likelihood Ratio (\(G^2\))

Hipotesis: Sama dengan chi-square (df = 1).

\[G^2=2\sum_{i,j}n_{ij}\ln\!\left(\frac{n_{ij}}{\hat{\mu}_{ij}}\right)\]

uji_g2 <- GTest(data1)
print(uji_g2)
## 
##  Log likelihood ratio (G-test) test of independence without correction
## 
## data:  data1
## G = 19.878, X-squared df = 1, p-value = 8.254e-06
G2_val <- as.numeric(uji_g2$statistic);  G2_pv <- uji_g2$p.value

Interpretasi: \(G^2=\) 19.878 (df=1), p-value = 8.254e-06 \(<0.05\). Tolak \(H_0\) — konsisten dengan chi-square. \(G^2\) lebih sensitif terhadap sel dengan frekuensi kecil karena menggunakan pendekatan log-likelihood.


4.3.4 Fisher Exact Test

Fisher exact test digunakan sebagai verifikasi karena sel Non-Smoker+Cancer (\(n_{21}=21\)) relatif kecil.

Ilustrasi hipergeometrik: \(N=40\), \(K=29\) positif, \(n=20\) sampel, \(x=18\):

cat("P(X=18):", round(dhyper(18, m=29, n=11, k=20), 6))
## P(X=18): 0.013804
uji_fisher <- fisher.test(data1)
print(uji_fisher)
## 
##  Fisher's Exact Test for Count Data
## 
## data:  data1
## 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

Interpretasi: p-value = 1.476e-05 \(<0.05\). Tolak \(H_0\) — asosiasi sangat signifikan. OR eksak = 2.9716 (IK 95%: [1.7556, 5.2107]).


4.4 Perbandingan Hasil Keempat Uji

tabel_banding <- data.frame(
  Aspek = c("Metode","Statistik Uji","df","Distribusi",
            "p-value","Keputusan (α=0.05)","Interpretasi"),
  Prop = c("Uji Z dua proporsi",
           paste0("χ²=",round(uji_prop$statistic,3)),"1","χ²(1)",
           format(uji_prop$p.value,scientific=TRUE,digits=3),
           "Tolak H₀","Beda proporsi signifikan"),
  ChiSq = c("Pearson Chi-Square",
            paste0("χ²=",round(uji_chisq$statistic,3)),"1","χ²(1)",
            format(uji_chisq$p.value,scientific=TRUE,digits=3),
            "Tolak H₀","Ada asosiasi signifikan"),
  LRT = c("Likelihood Ratio",
          paste0("G²=",round(G2_val,3)),"1","χ²(1)",
          format(G2_pv,scientific=TRUE,digits=3),
          "Tolak H₀","Deviasi log-likelihood signifikan"),
  Fish = c("Fisher Exact",
           paste0("OR=",round(uji_fisher$estimate,3)),"—","Hipergeometrik",
           format(uji_fisher$p.value,scientific=TRUE,digits=3),
           "Tolak H₀","Asosiasi sangat signifikan")
)
kable(tabel_banding,
      col.names = c("Aspek","Uji Proporsi","Chi-Square","Likelihood Ratio","Fisher Exact"),
      caption   = "Perbandingan Hasil Keempat Metode Uji — Kasus 1",
      align     = "l") %>%
  kable_styling(bootstrap_options = c("striped","hover","bordered"),
                full_width = TRUE) %>%
  column_spec(1, bold=TRUE, width="16%") %>%
  row_spec(c(5,6), background="#fff3cd")
Perbandingan Hasil Keempat Metode Uji — Kasus 1
Aspek Uji Proporsi Chi-Square Likelihood Ratio Fisher Exact
Metode Uji Z dua proporsi Pearson Chi-Square Likelihood Ratio Fisher Exact
Statistik Uji χ²=19.129 χ²=19.129 G²=19.878 OR=2.972
df 1 1 1
Distribusi χ²(1) χ²(1) χ²(1) Hipergeometrik
p-value 1.22e-05 1.22e-05 8.25e-06 1.48e-05
Keputusan (α=0.05) Tolak H₀ Tolak H₀ Tolak H₀ Tolak H₀
Interpretasi Beda proporsi signifikan Ada asosiasi signifikan Deviasi log-likelihood signifikan Asosiasi sangat signifikan

Perbandingan Substantif: Keempat metode secara konsisten menolak \(H_0\) (p-value \(\ll 0.001\)). Chi-square dan \(G^2\) bersifat asimtotik; Fisher exact bersifat eksak. Semua metode saling mengkonfirmasi.


4.5 Visualisasi Kasus 1

4.5.1 Mosaic Plot

chisq_m1   <- chisq.test(data1, correct=FALSE)
res_m1     <- chisq_m1$residuals
warna_sel1 <- matrix(ifelse(res_m1>2,"#6baed6",
                     ifelse(res_m1< -2,"#fc8d59","#d9d9d9")),
                     nrow=nrow(data1))

par(mar=c(4,4,4,2))
mosaicplot(data1, shade=FALSE, color=warna_sel1,
           main="Mosaic Plot: Status Merokok vs Kanker Paru",
           xlab="Status Merokok", ylab="Status Kanker",
           cex.axis=1.1, border="white", las=1)
legend("bottomright",
       legend=c("Residual > +2","Residual < -2","|Residual| ≤ 2"),
       fill=c("#6baed6","#fc8d59","#d9d9d9"),
       border="white", bty="n", cex=0.85, title="Pearson Residuals:")

cat("Pearson Residuals:\n"); print(round(res_m1,3))
## Pearson Residuals:
##            Cancer (+) Control (-)
## Smoker          0.735      -0.735
## Non-Smoker     -3.004       3.004
cat("p-value:", format(chisq_m1$p.value, scientific=TRUE, digits=4))
## p-value: 1.222e-05

Interpretasi: Smoker–Cancer(+) biru = frekuensi jauh melebihi ekspektasi. Non-Smoker–Cancer(+) merah/oranye = frekuensi di bawah ekspektasi. Secara visual mengkonfirmasi asosiasi positif yang kuat.

4.5.2 Grafik Proporsi Kelompok

df_prop1 <- data.frame(
  Kelompok = rep(c("Smoker","Non-Smoker"), each=2),
  Status   = rep(c("Cancer (+)","Control (-)"), 2),
  Proporsi = c(p1,1-p1,p2,1-p2)
)
df_prop1$Kelompok <- factor(df_prop1$Kelompok, levels=c("Smoker","Non-Smoker"))

ggplot(df_prop1, aes(x=Kelompok, y=Proporsi, fill=Status)) +
  geom_bar(stat="identity", position="dodge", width=0.6, color="white") +
  geom_text(aes(label=paste0(round(Proporsi*100,1),"%")),
            position=position_dodge(width=0.6), vjust=-0.5, size=4, fontface="bold") +
  scale_fill_manual(values=c("Cancer (+)"="#e74c3c","Control (-)"="#3498db")) +
  scale_y_continuous(labels=percent_format(), limits=c(0,1.1)) +
  labs(title="Perbandingan Proporsi Status Kanker Berdasarkan Kebiasaan Merokok",
       subtitle="Studi Kasus-Kontrol Kanker Paru",
       x="Status Merokok", y="Proporsi", fill="Status") +
  theme_minimal(base_size=13) +
  theme(plot.title=element_text(face="bold"),
        plot.subtitle=element_text(color="gray50"),
        legend.position="top")

4.5.3 Forest Plot Ukuran Asosiasi

df_forest <- data.frame(
  Ukuran   = factor(c("Risk Difference (RD)","Risk Ratio (RR)","Odds Ratio (OR) ← Utama"),
                    levels=rev(c("Risk Difference (RD)","Risk Ratio (RR)","Odds Ratio (OR) ← Utama"))),
  Estimasi = c(RD,RR,OR),
  Lower    = c(RD_lo,RR_lo,OR_lo),
  Upper    = c(RD_hi,RR_hi,OR_hi),
  Null     = c(0,1,1),
  Utama    = c("Tidak","Tidak","Ya")
)
ggplot(df_forest, aes(x=Estimasi, y=Ukuran, color=Utama)) +
  geom_vline(aes(xintercept=Null), linetype="dashed", color="gray60", linewidth=0.8) +
  geom_errorbarh(aes(xmin=Lower, xmax=Upper), height=0.2, linewidth=1) +
  geom_point(size=4) +
  geom_text(aes(label=paste0(round(Estimasi,3)," [",round(Lower,3),", ",round(Upper,3),"]")),
            hjust=-0.07, size=3.2, color="#2c3e50") +
  scale_color_manual(values=c("Ya"="#e74c3c","Tidak"="#7f8c8d"), name="Ukuran Utama?") +
  scale_x_continuous(limits=c(-0.5,6.5)) +
  labs(title="Forest Plot: Ukuran Asosiasi dengan IK 95%",
       subtitle="Garis putus-putus = nilai null | OR adalah ukuran utama pada studi kasus-kontrol",
       x="Nilai Estimasi", y="") +
  theme_minimal(base_size=13) +
  theme(plot.title=element_text(face="bold"),
        plot.subtitle=element_text(color="gray50"))

Interpretasi: Ketiga ukuran tidak mencakup nilai null → signifikan. OR (merah) = 2.97 adalah fokus utama: odds kanker paru pada perokok 2.97 kali lebih besar, suatu besaran yang sangat kuat secara substantif.


4.6 Kesimpulan Kasus 1

  1. Eksplorasi: 51.4% perokok vs 26.2% non-perokok mengalami Cancer (+) — selisih 25.2pp.
  2. Estimasi: OR = 2.9738 (IK 95%: [1.7867, 4.9494]) — odds kanker pada perokok 2.97 kali lebih besar, IK tidak mencakup 1.
  3. Uji hipotesis: Keempat metode menghasilkan p-value \(\ll 0.05\)Tolak \(H_0\) secara konsisten.

Kesimpulan: Terdapat bukti statistik yang sangat kuat bahwa kebiasaan merokok berkaitan secara signifikan dengan kejadian kanker paru. OR = 2.97 merupakan ukuran asosiasi yang valid dan menunjukkan kekuatan hubungan yang besar.


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

5.1 Penyusunan Tabel dan Eksplorasi Awal

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

kable(addmargins(data2),
      caption = "Tabel Kontingensi 2×3: Gender vs Identifikasi Partai Politik",
      align   = "c") %>%
  kable_styling(bootstrap_options = c("striped","hover","bordered"),
                full_width = FALSE, position = "center") %>%
  row_spec(3, bold=TRUE, background="#f0f0f0") %>%
  column_spec(5, bold=TRUE, background="#f0f0f0")
Tabel 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

5.1.1 Eksplorasi: Distribusi Marginal dan Proporsi Bersyarat

N2 <- sum(data2)
marg_baris2 <- rowSums(data2)

tabel_marg2 <- data.frame(
  Gender    = c("Female","Male","Total"),
  Frekuensi = c(marg_baris2, N2),
  Proporsi  = round(c(marg_baris2/N2, 1), 4)
)
kable(tabel_marg2,
      col.names = c("Gender","Frekuensi (nᵢ₊)","Proporsi Marginal (πᵢ₊)"),
      caption   = "Distribusi Marginal Baris — Gender",
      align     = "c") %>%
  kable_styling(bootstrap_options = c("striped","hover","bordered"),
                full_width = FALSE, position = "center") %>%
  row_spec(3, bold=TRUE, background="#f0f0f0")
Distribusi Marginal Baris — Gender
Gender Frekuensi (nᵢ₊) Proporsi Marginal (πᵢ₊)
Female Female 1357 0.5539
Male Male 1093 0.4461
Total 2450 1.0000
prop_baris2 <- prop.table(data2, margin=1)
kable(round(prop_baris2, 4),
      caption = "Proporsi Bersyarat per Baris — P(Partai | Gender)",
      align   = "c") %>%
  kable_styling(bootstrap_options = c("striped","hover","bordered"),
                full_width = FALSE, position = "center")
Proporsi Bersyarat per Baris — P(Partai | Gender)
Democrat Republican Independent
Female 0.3648 0.2004 0.4348
Male 0.3019 0.2425 0.4556
prop_kolom2 <- prop.table(data2, margin=2)
kable(round(prop_kolom2, 4),
      caption = "Proporsi Bersyarat per Kolom — P(Gender | Partai)",
      align   = "c") %>%
  kable_styling(bootstrap_options = c("striped","hover","bordered"),
                full_width = FALSE, position = "center")
Proporsi Bersyarat per Kolom — P(Gender | Partai)
Democrat Republican Independent
Female 0.6 0.5065 0.5423
Male 0.4 0.4935 0.4577

Interpretasi Eksplorasi: Dari 2450 responden, 55.4% Female dan 44.6% Male. Proporsi bersyarat: Female lebih banyak memilih Democrat (36.5% vs 30.2%), Male lebih banyak memilih Republican (24.2% vs 20%). Pola ini mengindikasikan adanya asosiasi gender–partai.

Catatan: Untuk tabel 2×3, ukuran asosiasi biner (RD/RR/OR) tidak dihitung karena variabel respons memiliki lebih dari dua kategori. Asosiasi dianalisis melalui uji chi-square, \(G^2\), residual standardized, dan partisi.


5.2 Frekuensi Harapan

\[\hat{\mu}_{ij}=\frac{n_{i+}\cdot n_{+j}}{N}\]

uji_chisq2 <- chisq.test(data2, correct=FALSE)
kable(round(uji_chisq2$expected, 2),
      caption = "Frekuensi Harapan $\\hat{\\mu}_{ij}$ di Bawah $H_0$ (semua sel > 5 ✓)",
      align   = "c") %>%
  kable_styling(bootstrap_options = c("striped","hover","bordered"),
                full_width = FALSE, position = "center")
Frekuensi Harapan \(\hat{\mu}_{ij}\) di Bawah \(H_0\) (semua sel > 5 ✓)
Democrat Republican Independent
Female 456.95 297.43 602.62
Male 368.05 239.57 485.38

Interpretasi: Semua sel memiliki frekuensi harapan \(>5\) → asumsi chi-square terpenuhi, Fisher exact tidak diperlukan.


5.3 Uji Chi-Square Independensi

Hipotesis: \(H_0:\) gender dan partai saling bebas vs \(H_1:\) terdapat asosiasi (df \(=(2-1)(3-1)=2\)).

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

Interpretasi: \(\chi^2=\) 12.5693 (df=2), p-value = 0.00186 \(<0.05\). Tolak \(H_0\) — asosiasi gender–partai signifikan.


5.4 Uji Likelihood Ratio (\(G^2\))

Hipotesis: Sama dengan chi-square (df = 2).

\[G^2=2\sum_{i,j}n_{ij}\ln\!\left(\frac{n_{ij}}{\hat{\mu}_{ij}}\right)\]

uji_g2_k2 <- GTest(data2)
print(uji_g2_k2)
## 
##  Log likelihood ratio (G-test) test of independence without correction
## 
## data:  data2
## G = 12.601, X-squared df = 2, p-value = 0.001835
G2_val2 <- as.numeric(uji_g2_k2$statistic);  G2_pv2 <- uji_g2_k2$p.value

Interpretasi: \(G^2=\) 12.6009 (df=2), p-value = 1.835e-03 \(<0.05\). Tolak \(H_0\) — konsisten dengan chi-square. Keduanya mengkonfirmasi asosiasi yang signifikan.


5.5 Perbandingan Chi-Square dan \(G^2\) — Kasus 2

tabel_banding2 <- data.frame(
  Aspek = c("Metode","Statistik Uji","df","p-value","Keputusan","Interpretasi"),
  ChiSq = c("Pearson Chi-Square",
            paste0("χ²=",round(uji_chisq2$statistic,4)),"2",
            round(uji_chisq2$p.value,6),"Tolak H₀","Ada asosiasi signifikan"),
  G2    = c("Likelihood Ratio G²",
            paste0("G²=",round(G2_val2,4)),"2",
            format(G2_pv2,scientific=TRUE,digits=4),"Tolak H₀",
            "Deviasi log-likelihood signifikan")
)
kable(tabel_banding2,
      col.names = c("Aspek","Chi-Square","Likelihood Ratio G²"),
      caption   = "Perbandingan Metode Uji — Kasus 2",
      align     = "l") %>%
  kable_styling(bootstrap_options = c("striped","hover","bordered"),
                full_width = FALSE, position = "center") %>%
  column_spec(1, bold=TRUE) %>%
  row_spec(c(4,5), background="#fff3cd")
Perbandingan Metode Uji — Kasus 2
Aspek Chi-Square Likelihood Ratio G²
Metode Pearson Chi-Square Likelihood Ratio G²
Statistik Uji χ²=12.5693 G²=12.6009
df 2 2
p-value 0.001865 1.835e-03
Keputusan Tolak H₀ Tolak H₀
Interpretasi Ada asosiasi signifikan Deviasi log-likelihood signifikan

5.6 Residual Pearson dan Standardized Residual

\[e_{ij}=\frac{n_{ij}-\hat{\mu}_{ij}}{\sqrt{\hat{\mu}_{ij}}}\qquad d_{ij}=\frac{n_{ij}-\hat{\mu}_{ij}}{\sqrt{\hat{\mu}_{ij}(1-p_{i+})(1-p_{+j})}}\]

res_pearson <- uji_chisq2$residuals
res_std     <- uji_chisq2$stdres

kable(round(res_pearson, 4),
      caption = "Residual Pearson ($e_{ij}$)", align="c") %>%
  kable_styling(bootstrap_options=c("striped","hover","bordered"),
                full_width=FALSE, position="center")
Residual Pearson (\(e_{ij}\))
Democrat Republican Independent
Female 1.7801 -1.4747 -0.5140
Male -1.9834 1.6431 0.5728
kable(round(res_std, 4),
      caption = "Standardized Residual ($d_{ij}$) — |d|>1.96 berkontribusi signifikan",
      align="c") %>%
  kable_styling(bootstrap_options=c("striped","hover","bordered"),
                full_width=FALSE, position="center") %>%
  column_spec(2, color=ifelse(round(res_std[,1],1)> 1.96,"#e74c3c",
                       ifelse(round(res_std[,1],1)< -1.96,"#3498db","black"))) %>%
  column_spec(3, color=ifelse(round(res_std[,2],1)> 1.96,"#e74c3c",
                       ifelse(round(res_std[,2],1)< -1.96,"#3498db","black"))) %>%
  column_spec(4, color=ifelse(round(res_std[,3],1)> 1.96,"#e74c3c",
                       ifelse(round(res_std[,3],1)< -1.96,"#3498db","black")))
Standardized Residual (\(d_{ij}\)) — |d|>1.96 berkontribusi signifikan
Democrat Republican Independent
Female 3.2724 -2.4986 -1.0322
Male -3.2724 2.4986 1.0322

Interpretasi (\(|d_{ij}|>1.96\), α=0.05):

  • Female–Democrat (\(d=\) 3.272): Wanita lebih banyak memilih Democrat dari ekspektasi.
  • Male–Democrat (\(d=\) -3.272): Pria lebih sedikit memilih Democrat.
  • Female–Republican (\(d=\) -2.499): Wanita lebih sedikit memilih Republican.
  • Male–Republican (\(d=\) 2.499): Pria lebih banyak memilih Republican.
  • Independent kedua gender: \(|d_{ij}|<1.96\) → tidak berbeda signifikan.

5.7 Partisi Chi-Square

part1 <- matrix(c(495,272,330,265), nrow=2, byrow=TRUE)
rownames(part1)<-c("Female","Male"); colnames(part1)<-c("Democrat","Republican")
uji_part1 <- chisq.test(part1, correct=FALSE)

part2 <- matrix(c(495+272,590,330+265,498), nrow=2, byrow=TRUE)
rownames(part2)<-c("Female","Male"); colnames(part2)<-c("Dem+Rep","Independent")
uji_part2 <- chisq.test(part2, correct=FALSE)

cat("=== Partisi 1: Democrat vs Republican ===\n"); print(uji_part1)
## === Partisi 1: Democrat vs Republican ===
## 
##  Pearson's Chi-squared test
## 
## data:  part1
## X-squared = 11.555, df = 1, p-value = 0.0006758
cat("\n=== Partisi 2: (Dem+Rep) vs Independent ===\n"); print(uji_part2)
## 
## === Partisi 2: (Dem+Rep) vs Independent ===
## 
##  Pearson's Chi-squared test
## 
## data:  part2
## X-squared = 1.0654, df = 1, p-value = 0.302
tabel_partisi <- data.frame(
  Uji  = c("Chi-Square Keseluruhan","P1: Dem vs Rep","P2: (Dem+Rep) vs Ind","Jumlah Partisi"),
  Chi2 = round(c(uji_chisq2$statistic, uji_part1$statistic,
                 uji_part2$statistic, uji_part1$statistic+uji_part2$statistic), 4),
  df   = c(2,1,1,2),
  pval = round(c(uji_chisq2$p.value, uji_part1$p.value, uji_part2$p.value, NA), 5),
  Kep  = c("Tolak H₀","Tolak H₀","Gagal Tolak H₀","—")
)
kable(tabel_partisi,
      col.names=c("Uji","χ²","df","p-value","Keputusan"),
      caption="Perbandingan Chi-Square Keseluruhan vs Partisi",
      align="c", na="—") %>%
  kable_styling(bootstrap_options=c("striped","hover","bordered"),
                full_width=FALSE, position="center") %>%
  row_spec(4, bold=TRUE, background="#d4edda") %>%
  row_spec(3, background="#fff3cd")
Perbandingan Chi-Square Keseluruhan vs Partisi
Uji χ² df p-value Keputusan
Chi-Square Keseluruhan 12.5693 2 0.00186 Tolak H₀
P1: Dem vs Rep 11.5545 1 0.00068 Tolak H₀
P2: (Dem+Rep) vs Ind 1.0654 1 0.30198 Gagal Tolak H₀
Jumlah Partisi 12.6200 2 NA

Interpretasi:

  • P1 (Dem vs Rep): \(\chi^2=\) 11.5545, p=6.8^{-4} → Signifikan. Gender memengaruhi pilihan Dem/Rep.
  • P2 (berpartai vs independen): \(\chi^2=\) 1.0654, p=0.30198 → Tidak signifikan. Gender tidak memengaruhi keputusan menjadi independen.
  • Verifikasi: \(\chi^2_{P1}+\chi^2_{P2}=\) 12.62 \(\approx\) 12.5693 ✓

5.8 Visualisasi Kasus 2

5.8.1 Mosaic Plot dengan Residual

chisq_m2   <- chisq.test(data2, correct=FALSE)
res_m2     <- chisq_m2$residuals
warna_sel2 <- matrix(ifelse(res_m2>2,"#6baed6",
                     ifelse(res_m2< -2,"#fc8d59","#d9d9d9")),
                     nrow=nrow(data2))

par(mar=c(4,4,4,2))
mosaicplot(data2, shade=FALSE, color=warna_sel2,
           main="Mosaic Plot: Gender vs Identifikasi Partai Politik",
           xlab="Gender", ylab="Partai Politik",
           cex.axis=1.1, border="white", las=1)
legend("bottomright",
       legend=c("Residual > +2","Residual < -2","|Residual| ≤ 2"),
       fill=c("#6baed6","#fc8d59","#d9d9d9"),
       border="white", bty="n", cex=0.85, title="Pearson Residuals:")

cat("Pearson Residuals:\n"); print(round(res_m2,3))
## Pearson Residuals:
##        Democrat Republican Independent
## Female    1.780     -1.475      -0.514
## Male     -1.983      1.643       0.573
cat("p-value:", round(chisq_m2$p.value,7))
## p-value: 0.0018648

Interpretasi: Female–Democrat dan Male–Republican (biru) di atas ekspektasi. Male–Democrat dan Female–Republican (merah/oranye) di bawah ekspektasi. Independent abu — mendekati ekspektasi, konsisten dengan partisi tidak signifikan.

5.8.2 Grouped Bar Chart Proporsi

df_bar2 <- data.frame(
  Gender   = rep(rownames(prop_baris2), each=3),
  Partai   = rep(colnames(prop_baris2), 2),
  Proporsi = as.vector(t(prop_baris2))
)
df_bar2$Partai <- factor(df_bar2$Partai, levels=c("Democrat","Republican","Independent"))

ggplot(df_bar2, aes(x=Partai, y=Proporsi, fill=Gender)) +
  geom_bar(stat="identity", position="dodge", width=0.6, color="white") +
  geom_text(aes(label=paste0(round(Proporsi*100,1),"%")),
            position=position_dodge(width=0.6), vjust=-0.5, size=3.8, fontface="bold") +
  scale_fill_manual(values=c("Female"="#e91e8c","Male"="#1e90e9")) +
  scale_y_continuous(labels=percent_format(), limits=c(0,0.65)) +
  labs(title="Proporsi Identifikasi Partai Berdasarkan Gender",
       subtitle="Proporsi dihitung dalam baris (per gender)",
       x="Partai Politik", y="Proporsi", fill="Gender") +
  theme_minimal(base_size=13) +
  theme(plot.title=element_text(face="bold"),
        plot.subtitle=element_text(color="gray50"),
        legend.position="top")

5.8.3 Heatmap Standardized Residual

df_res <- as.data.frame(as.table(res_std))
colnames(df_res) <- c("Gender","Partai","Residual")

ggplot(df_res, aes(x=Partai, y=Gender, fill=Residual)) +
  geom_tile(color="white", linewidth=1.5) +
  geom_text(aes(label=round(Residual,3)), size=5, fontface="bold", color="white") +
  scale_fill_gradient2(low="#3498db", mid="white", high="#e74c3c",
                       midpoint=0, name="Std. Residual") +
  labs(title="Heatmap Standardized Residual",
       subtitle="Merah = lebih dari ekspektasi | Biru = kurang dari ekspektasi\n|d| > 1.96 → kontribusi signifikan (α = 0.05)",
       x="Partai Politik", y="Gender") +
  theme_minimal(base_size=13) +
  theme(plot.title=element_text(face="bold"),
        plot.subtitle=element_text(color="gray50", size=10))

Interpretasi: Female–Democrat (\(d=\) 3.272) dan Male–Republican (\(d=\) 2.499) adalah kontributor terbesar. Sel Independent mendekati nol — hampir tidak berkontribusi pada ketidakindependenan.


5.9 Kontribusi Sel terhadap \(\chi^2\)

kontrib <- round(res_pearson^2, 4)
kable(kontrib,
      caption="Kontribusi Tiap Sel terhadap Statistik χ² ($= e_{ij}^2$)",
      align="c") %>%
  kable_styling(bootstrap_options=c("striped","hover","bordered"),
                full_width=FALSE, position="center")
Kontribusi Tiap Sel terhadap Statistik χ² (\(= e_{ij}^2\))
Democrat Republican Independent
Female 3.1686 2.1746 0.2642
Male 3.9339 2.6999 0.3281
cat("Total dari kontribusi sel:", round(sum(kontrib),4))
## Total dari kontribusi sel: 12.5693
cat("\nChi-square keseluruhan   :", round(uji_chisq2$statistic,4))
## 
## Chi-square keseluruhan   : 12.5693

Interpretasi: Democrat memberikan kontribusi terbesar (Female: 3.1686, Male: 3.9339), disusul Republican. Independent paling kecil.


5.10 Kesimpulan Kasus 2

  1. Eksplorasi: Female lebih memilih Democrat (36.5%), Male lebih memilih Republican (24.2%).
  2. Chi-Square: \(\chi^2=\) 12.5693 (df=2), p=0.00186 → Tolak \(H_0\).
  3. \(G^2\): \(G^2=\) 12.6009 (df=2), p=1.84e-03 → Tolak \(H_0\). Konsisten.
  4. Residual: Female–Democrat dan Male–Republican berkontribusi paling besar.
  5. Partisi: Gender berpengaruh pada Dem vs Rep (signifikan), tidak berpengaruh pada berpartai vs independen.

Kesimpulan: Asosiasi signifikan gender–partai, khususnya dimensi Democrat vs Republican. Wanita condong Democrat, pria condong Republican. Keputusan menjadi Independent tidak dipengaruhi gender.


6 Kesimpulan Umum

tabel_akhir <- data.frame(
  Kasus    = c("Kasus 1 (2×2)","Kasus 2 (2×3)"),
  Variabel = c("Merokok vs Kanker Paru","Gender vs Partai Politik"),
  Metode   = c("Prop, Chi-sq, G², Fisher Exact","Chi-sq, G², Residual, Partisi"),
  Hasil    = c(paste0("Tolak H₀ | OR=",round(OR,2)," (IK: [",
                      round(OR_lo,2),", ",round(OR_hi,2),"])"),
               paste0("Tolak H₀ | χ²=",round(uji_chisq2$statistic,2),
                      " (p=",round(uji_chisq2$p.value,4),")")),
  Kesimpulan = c("Asosiasi positif sangat kuat (OR utama)",
                 "Signifikan, terutama Dem vs Rep")
)
kable(tabel_akhir,
      col.names=c("Kasus","Variabel","Metode Uji","Hasil","Kesimpulan"),
      caption="Ringkasan Hasil Analisis Kedua Kasus",
      align="l") %>%
  kable_styling(bootstrap_options=c("striped","hover","bordered"),
                full_width=TRUE) %>%
  column_spec(1, bold=TRUE)
Ringkasan Hasil Analisis Kedua Kasus
Kasus Variabel Metode Uji Hasil Kesimpulan
Kasus 1 (2×2) Merokok vs Kanker Paru Prop, Chi-sq, G², Fisher Exact Tolak H₀ &#124; OR=2.97 (IK: [1.79, 4.95]) Asosiasi positif sangat kuat (OR utama)
Kasus 2 (2×3) Gender vs Partai Politik Chi-sq, G², Residual, Partisi Tolak H₀ &#124; χ²=12.57 (p=0.0019) Signifikan, terutama Dem vs Rep

Analisis ini menunjukkan bahwa:

  1. Eksplorasi distribusi marginal dan proporsi bersyarat adalah langkah krusial sebelum inferensi formal.
  2. Pemilihan ukuran asosiasi harus mempertimbangkan desain studi — OR adalah pilihan tepat untuk studi kasus-kontrol.
  3. Konsistensi hasil antar metode memperkuat validitas kesimpulan.
  4. Visualisasi (mosaic plot, bar chart, heatmap, forest plot) mengkomunikasikan temuan secara intuitif.

7 Informasi Sesi R

sessionInfo()
## R version 4.4.1 (2024-06-14 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 26200)
## 
## Matrix products: default
## 
## 
## locale:
## [1] LC_COLLATE=English_United States.utf8 
## [2] LC_CTYPE=English_United States.utf8   
## [3] LC_MONETARY=English_United States.utf8
## [4] LC_NUMERIC=C                          
## [5] LC_TIME=English_United States.utf8    
## 
## time zone: Asia/Bangkok
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] scales_1.4.0      kableExtra_1.4.0  knitr_1.50        ggplot2_4.0.1    
## [5] DescTools_0.99.60 epitools_0.5-10.1
## 
## loaded via a namespace (and not attached):
##  [1] gld_2.6.7          gtable_0.3.6       xfun_0.53          bslib_0.9.0       
##  [5] lattice_0.22-6     tzdb_0.5.0         vctrs_0.6.5        tools_4.4.1       
##  [9] generics_0.1.3     tibble_3.2.1       proxy_0.4-27       fansi_1.0.6       
## [13] pkgconfig_2.0.3    Matrix_1.7-0       data.table_1.17.2  RColorBrewer_1.1-3
## [17] S7_0.2.1           readxl_1.4.3       lifecycle_1.0.4    rootSolve_1.8.2.4 
## [21] compiler_4.4.1     farver_2.1.2       stringr_1.5.1      textshaping_1.0.4 
## [25] Exact_3.3          htmltools_0.5.8.1  class_7.3-22       sass_0.4.10       
## [29] yaml_2.3.10        pillar_1.9.0       jquerylib_0.1.4    MASS_7.3-60.2     
## [33] cachem_1.1.0       boot_1.3-30        tidyselect_1.2.1   digest_0.6.37     
## [37] mvtnorm_1.3-3      stringi_1.8.4      dplyr_1.1.4        labeling_0.4.3    
## [41] forcats_1.0.0      fastmap_1.2.0      grid_4.4.1         lmom_3.2          
## [45] expm_1.0-0         cli_3.6.3          magrittr_2.0.3     utf8_1.2.4        
## [49] e1071_1.7-16       readr_2.1.5        withr_3.0.1        rmarkdown_2.29    
## [53] httr_1.4.7         cellranger_1.1.0   hms_1.1.3          evaluate_1.0.4    
## [57] haven_2.5.4        viridisLite_0.4.2  rlang_1.1.4        Rcpp_1.0.13       
## [61] glue_1.7.0         xml2_1.4.0         svglite_2.2.2      rstudioapi_0.17.1 
## [65] jsonlite_2.0.0     R6_2.5.1           systemfonts_1.3.1  fs_1.6.6

Laporan ini dibuat menggunakan R Markdown sebagai bagian dari tugas mata kuliah Analisis Data Kategori. Seluruh kode dapat direproduksi dengan menjalankan file .Rmd ini pada lingkungan R yang memiliki package yang tercantum di atas.