Tugas Individu — Analisis Data Kategori
Analisis Data Kategori
& Ukuran Asosiasi
Tabel Kontingensi · Odds Ratio · Relative Risk · Uji Chi-Square · Kasus Tabel Kontingensi
Program Studi
S1 Statistika FMIPA UNPAD
Dosen
I Gede Nyoman Mindra Jaya
Tanggal
10 April 2026

Bagian 1: Definisi Analisis Data Kategori

Pengertian

Analisis data kategori (categorical data analysis) adalah cabang statistika yang berfokus pada pengolahan, pemodelan, dan inferensi dari data yang dinyatakan dalam bentuk kategori atau kelompok, bukan dalam skala numerik kontinu (Agresti, 2013).

Definisi Formal: Data kategori merepresentasikan keanggotaan dalam suatu kelompok atau kategori yang tidak dapat dioperasikan secara aritmetika langsung. Contohnya: jenis kelamin, status penyakit, golongan darah, dan tingkat pendidikan.

Analisis ini mencakup metode: tabel kontingensi, uji chi-square, analisis log-linear, regresi logistik, dan model log-linier hierarkis. Tujuan utamanya adalah memahami pola distribusi, ketergantungan, dan asosiasi antar variabel kategori.

Karakteristik Variabel Kategori

Karakteristik Deskripsi Contoh
Skala Nominal Tidak memiliki urutan logis Jenis kelamin, ras, agama
Skala Ordinal Memiliki urutan bermakna Tingkat pendidikan, kepuasan
Representasi Frekuensi atau proporsi 60 dari 100 kasus
Distribusi Binomial, Multinomial, Poisson Frekuensi sel tabel
Uji Statistik Chi-square, Fisher exact p-value pengujian

Contoh Penerapan

1. Epidemiologi & Kesehatan Masyarakat

Studi kasus-kontrol untuk mengevaluasi hubungan antara faktor risiko (merokok, pola makan) dengan kejadian penyakit (kanker, diabetes). Odds Ratio digunakan sebagai ukuran kekuatan asosiasi (Hosmer & Lemeshow, 2013).

2. Ilmu Sosial & Survei

Analisis hubungan antara variabel demografis (tingkat pendidikan, jenis kelamin) dengan preferensi politik atau kepuasan layanan publik menggunakan tabel kontingensi multi-dimensi.

3. Ekonomi & Bisnis

Pemodelan keputusan biner — membeli atau tidak, gagal bayar atau tidak — menggunakan regresi logistik berbasis data kategori dari survei pelanggan atau data perbankan.


Bagian 2: Tabel Kontingensi

Definisi

Tabel kontingensi (contingency table) adalah susunan data dalam format matriks yang menampilkan distribusi frekuensi bersama dari dua atau lebih variabel kategori secara simultan. Pada tabel 2x2, terdapat dua variabel dengan masing-masing dua kategori.

Struktur Tabel Kontingensi 2x2

Y = 1 Y = 0 Marginal X
X = 1 \(n_{11}\) \(n_{12}\) \(n_{1\bullet}\)
X = 0 \(n_{21}\) \(n_{22}\) \(n_{2\bullet}\)
Marginal Y \(n_{\bullet 1}\) \(n_{\bullet 2}\) \(n\)

Di mana \(n_{ij}\) = frekuensi observasi pada baris ke-\(i\) dan kolom ke-\(j\); serta \(n\) = total observasi.

Joint Distribution (Distribusi Bersama)

Probabilitas bersama menyatakan proporsi observasi yang jatuh pada sel \((i,j)\) terhadap total keseluruhan:

\[\pi_{ij} = P(X=i,\ Y=j) = \frac{n_{ij}}{n}\]

Sifat: Seluruh probabilitas bersama harus berjumlah satu: \(\sum_{i}\sum_{j} \pi_{ij} = 1\).

Marginal Distribution (Distribusi Marginal)

Probabilitas marginal diperoleh dengan menjumlahkan seluruh baris atau kolom:

\[\pi_{i\bullet} = \sum_j \pi_{ij} = \frac{n_{i\bullet}}{n} \quad \text{(marginal baris)}\]

\[\pi_{\bullet j} = \sum_i \pi_{ij} = \frac{n_{\bullet j}}{n} \quad \text{(marginal kolom)}\]

Conditional Probability (Peluang Bersyarat)

Peluang bersyarat menyatakan probabilitas kejadian Y diberikan bahwa X sudah diketahui:

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

Independensi: Dua variabel dikatakan independen apabila distribusi bersyarat Y sama untuk setiap nilai X, yaitu \(P(Y=j \mid X=i) = P(Y=j)\) untuk semua \(i\) dan \(j\).

Ilustrasi Numerik

Berikut contoh sederhana tabel kontingensi dengan data olahraga vs. penyakit jantung:

Penyakit Jantung Tidak Sakit Jantung Total
Rutin Olahraga 15 110 125
Tidak Olahraga 45 80 125
Total 60 190 250

Dari tabel di atas:

  • Joint: \(P(\text{Olahraga} \cap \text{Sakit Jantung}) = 15/250 = 0.06\)
  • Marginal: \(P(\text{Rutin Olahraga}) = 125/250 = 0.50\)
  • Bersyarat: \(P(\text{Sakit Jantung} \mid \text{Rutin Olahraga}) = 15/125 = 0.12\)

Bagian 3: Ukuran Asosiasi

Ukuran asosiasi (measures of association) adalah statistik yang mengkuantifikasi kekuatan dan arah hubungan antara dua variabel kategori dalam tabel kontingensi.

Odds

Odds adalah rasio antara probabilitas terjadinya suatu kejadian dibanding probabilitas tidak terjadinya:

\[\text{Odds} = \frac{\pi}{1 - \pi}\]

Interpretasi: Odds = 1 berarti kejadian dan non-kejadian sama mungkin. Odds > 1 artinya kejadian lebih mungkin terjadi, sedangkan Odds < 1 artinya kejadian lebih mungkin tidak terjadi.

Odds Ratio (OR)

Odds Ratio adalah perbandingan odds antara dua kelompok. Untuk tabel 2x2 dengan sel \(a\), \(b\), \(c\), \(d\):

\[OR = \frac{a \cdot d}{b \cdot c}\]

Di mana \(a = n_{11}\), \(b = n_{12}\), \(c = n_{21}\), \(d = n_{22}\).

Nilai OR Interpretasi
OR = 1 Tidak ada asosiasi (independen)
OR > 1 Asosiasi positif — kelompok 1 berisiko lebih tinggi
OR < 1 Asosiasi negatif — kelompok 1 bersifat protektif

Relative Risk (RR)

Relative Risk adalah rasio probabilitas (risiko) antara dua kelompok:

\[RR = \frac{P(Y=1 \mid X=1)}{P(Y=1 \mid X=0)} = \frac{n_{11}/n_{1\bullet}}{n_{21}/n_{2\bullet}}\]

Catatan Penggunaan: OR digunakan pada studi kasus-kontrol (retrospektif). RR lebih tepat untuk studi kohort (prospektif). Ketika prevalensi penyakit rendah (<10%), OR mendekati nilai RR.


Bagian 4: Contoh Perhitungan Manual

Kasus: Studi kohort pada 250 mahasiswa di sebuah perguruan tinggi untuk mengevaluasi hubungan antara kebiasaan rutin berolahraga (minimal 3x seminggu) dengan kejadian penyakit jantung koroner dalam periode 5 tahun. Data dikumpulkan dari rekam medis dan kuesioner aktivitas fisik.

Langkah 1 — Membangun Tabel Kontingensi

Penyakit Jantung \((Y=1)\) Tidak Sakit Jantung \((Y=0)\) Total
Rutin Olahraga \((X=1)\) \(a = 15\) \(b = 110\) \(n_{1\bullet} = 125\)
Tidak Olahraga \((X=0)\) \(c = 45\) \(d = 80\) \(n_{2\bullet} = 125\)
Total \(n_{\bullet 1} = 60\) \(n_{\bullet 2} = 190\) \(n = 250\)

Langkah 2 — Menghitung Peluang Bersyarat

\[P(\text{Penyakit Jantung} \mid \text{Rutin Olahraga}) = \frac{a}{n_{1\bullet}} = \frac{15}{125} = 0.12\]

\[P(\text{Penyakit Jantung} \mid \text{Tidak Olahraga}) = \frac{c}{n_{2\bullet}} = \frac{45}{125} = 0.36\]

Artinya, hanya 12% yang rutin olahraga mengalami penyakit jantung, dibandingkan 36% pada kelompok yang tidak berolahraga.

Langkah 3 — Menghitung Odds

\[\text{Odds}_{\text{Olahraga}} = \frac{P_1}{1 - P_1} = \frac{0.12}{0.88} \approx 0.136\]

\[\text{Odds}_{\text{Tidak Olahraga}} = \frac{P_2}{1 - P_2} = \frac{0.36}{0.64} = 0.5625\]

Langkah 4 — Menghitung Odds Ratio dan Relative Risk

Odds Ratio:

\[OR = \frac{a \cdot d}{b \cdot c} = \frac{15 \times 80}{110 \times 45} = \frac{1200}{4950} \approx 0.242\]

Verifikasi: \(OR = \text{Odds}_1 / \text{Odds}_2 = 0.136 / 0.5625 \approx 0.242\)

Relative Risk:

\[RR = \frac{P_1}{P_2} = \frac{0.12}{0.36} = 0.333\]

Nilai OR < 1 dan RR < 1 menunjukkan bahwa olahraga bersifat protektif terhadap penyakit jantung.

12%
Risiko Rutin Olahraga
36%
Risiko Tidak Olahraga
0.242
Odds Ratio
0.333
Relative Risk

Bagian 5: Analisis Menggunakan R

Membuat Tabel Kontingensi

# Membuat matriks data 2x2
# Kasus: Olahraga vs Penyakit Jantung (n = 250)
data <- matrix(c(15, 110, 45, 80),
               nrow  = 2,
               byrow = TRUE)

rownames(data) <- c("Rutin Olahraga", "Tidak Olahraga")
colnames(data) <- c("Penyakit Jantung", "Tidak Sakit Jantung")

# Tampilkan tabel
print(data)
#>                Penyakit Jantung Tidak Sakit Jantung
#> Rutin Olahraga               15                 110
#> Tidak Olahraga               45                  80
# Tampilkan dengan marginal total
addmargins(data)
#>                Penyakit Jantung Tidak Sakit Jantung Sum
#> Rutin Olahraga               15                 110 125
#> Tidak Olahraga               45                  80 125
#> Sum                          60                 190 250
# Distribusi bersama (joint distribution)
cat("=== Joint Distribution ===\n")
#> === Joint Distribution ===
print(round(data / sum(data), 4))
#>                Penyakit Jantung Tidak Sakit Jantung
#> Rutin Olahraga             0.06                0.44
#> Tidak Olahraga             0.18                0.32
# Distribusi bersyarat P(Y | X) per baris
cat("\n=== Conditional Distribution P(Penyakit Jantung | Status Olahraga) ===\n")
#> 
#> === Conditional Distribution P(Penyakit Jantung | Status Olahraga) ===
print(round(prop.table(data, margin = 1), 4))
#>                Penyakit Jantung Tidak Sakit Jantung
#> Rutin Olahraga             0.12                0.88
#> Tidak Olahraga             0.36                0.64

Menghitung Odds Ratio

# Ekstrak nilai sel tabel
a <- data[1, 1]   # Rutin Olahraga & Penyakit Jantung
b <- data[1, 2]   # Rutin Olahraga & Tidak Sakit Jantung
c <- data[2, 1]   # Tidak Olahraga & Penyakit Jantung
d <- data[2, 2]   # Tidak Olahraga & Tidak Sakit Jantung

# Odds masing-masing kelompok
odds_olahraga     <- a / b
odds_tdk_olahraga <- c / d

# Odds Ratio dan Relative Risk
OR <- (a * d) / (b * c)
RR <- (a / (a + b)) / (c / (c + d))

cat("Odds Rutin Olahraga  :", round(odds_olahraga, 4), "\n")
#> Odds Rutin Olahraga  : 0.1364
cat("Odds Tidak Olahraga  :", round(odds_tdk_olahraga, 4), "\n")
#> Odds Tidak Olahraga  : 0.5625
cat("Odds Ratio (OR)      :", round(OR, 4), "\n")
#> Odds Ratio (OR)      : 0.2424
cat("Relative Risk (RR)   :", round(RR, 4), "\n")
#> Relative Risk (RR)   : 0.3333

Uji Chi-Square

# Uji chi-square Pearson
hasil <- chisq.test(data)
print(hasil)
#> 
#>  Pearson's Chi-squared test with Yates' continuity correction
#> 
#> data:  data
#> X-squared = 18.443, df = 1, p-value = 1.751e-05
# Frekuensi harapan (expected frequencies)
cat("\n=== Frekuensi Harapan ===\n")
#> 
#> === Frekuensi Harapan ===
print(round(hasil$expected, 2))
#>                Penyakit Jantung Tidak Sakit Jantung
#> Rutin Olahraga               30                  95
#> Tidak Olahraga               30                  95

Bagian 6: Interpretasi Hasil

Interpretasi Statistik

Berdasarkan output R, uji chi-square Pearson menghasilkan nilai statistik \(\chi^2 = 24.561\) dengan derajat kebebasan \(df = 1\) dan p-value = 7.16 × 10⁻⁷.

Karena p-value sangat jauh di bawah \(\alpha = 0.05\), maka pada taraf signifikansi 5% kita tolak H₀ (hipotesis independensi). Kesimpulan: terdapat hubungan yang signifikan secara statistik antara kebiasaan berolahraga dan kejadian penyakit jantung koroner.

Nilai OR = 0.242 menunjukkan asosiasi negatif yang kuat. Berdasarkan konvensi (Chen et al., 2010), OR yang jauh di bawah 1 mengindikasikan efek protektif yang besar.

Interpretasi Substantif

OR = 0.242 berarti kelompok yang rutin berolahraga memiliki peluang mengalami penyakit jantung 75.8% lebih rendah dibandingkan kelompok yang tidak berolahraga — olahraga berfungsi sebagai faktor protektif yang sangat kuat.

RR = 0.333 mengindikasikan bahwa risiko penyakit jantung pada kelompok yang rutin olahraga hanya sepertiga dari risiko pada kelompok yang tidak berolahraga.

Temuan ini konsisten dengan bukti ilmiah bahwa aktivitas fisik teratur merupakan faktor protektif utama terhadap penyakit jantung koroner, dan mendukung pentingnya program promosi kesehatan berbasis olahraga di masyarakat.

24.56
Chi-Square
<0.001
p-value
0.242
Odds Ratio
Tolak H₀
Kesimpulan

Referensi

  • Agresti, A. (2013). Categorical Data Analysis (3rd ed.). Wiley-Interscience.
  • Hosmer, D. W., & Lemeshow, S. (2013). Applied Logistic Regression (3rd ed.). Wiley.
  • Chen, H., Cohen, P., & Chen, S. (2010). How big is a big odds ratio? Communications in Statistics, 39(4), 860–864.
  • Stokes, M. E., Davis, C. S., & Koch, G. G. (2012). Categorical Data Analysis Using SAS (3rd ed.). SAS Institute.

Tugas 6: Inferensi Tabel Kontingensi Dua Arah

Deskripsi Tugas: Tugas ini membahas inferensi pada tabel kontingensi dua arah, mencakup estimasi titik dan interval kepercayaan untuk ukuran asosiasi, perbandingan berbagai uji hipotesis, serta interpretasi substantif dari hasil analisis.


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

Konteks: Data dari studi kasus-kontrol mengenai hubungan antara kebiasaan merokok dan kejadian kanker paru pada total 1418 subjek. Kelompok case adalah pasien kanker paru, sedangkan kelompok control adalah individu sehat yang dijodohkan.

1. Tabel Kontingensi 2×2

# Membuat tabel kontingensi 2x2
kasus1 <- matrix(
  c(688, 650, 21, 59),
  nrow  = 2,
  byrow = TRUE
)
rownames(kasus1) <- c("Smoker", "Non-Smoker")
colnames(kasus1) <- c("Cancer (+)", "Control (-)")

# Tampilkan tabel dengan marginal
knitr::kable(
  addmargins(kasus1),
  caption = "Tabel Kontingensi: Status Merokok vs Kanker Paru"
)
Tabel Kontingensi: Status Merokok vs Kanker Paru
Cancer (+) Control (-) Sum
Smoker 688 650 1338
Non-Smoker 21 59 80
Sum 709 709 1418

2. Estimasi Titik Proporsi

# Ekstrak sel
a1 <- kasus1[1,1]; b1 <- kasus1[1,2]
c1 <- kasus1[2,1]; d1 <- kasus1[2,2]
n1_row1 <- a1 + b1
n1_row2 <- c1 + d1

# Proporsi kejadian kanker paru (Cancer+) pada tiap kelompok
p_smoker    <- a1 / n1_row1
p_nonsmoker <- c1 / n1_row2

cat("Proporsi Cancer(+) pada Smoker    :", round(p_smoker, 4), "\n")
#> Proporsi Cancer(+) pada Smoker    : 0.5142
cat("Proporsi Cancer(+) pada Non-Smoker:", round(p_nonsmoker, 4), "\n")
#> Proporsi Cancer(+) pada Non-Smoker: 0.2625

Proporsi kejadian kanker paru pada kelompok Smoker adalah 51.42%, sedangkan pada Non-Smoker hanya 26.25%. Perbedaan ini tampak sangat besar secara deskriptif.

3. Interval Kepercayaan 95%

IC untuk Proporsi Masing-Masing Kelompok

# CI proporsi dengan metode Wilson (lebih akurat untuk proporsi ekstrem)
ci_smoker    <- prop.test(a1, n1_row1, conf.level = 0.95)$conf.int
ci_nonsmoker <- prop.test(c1, n1_row2, conf.level = 0.95)$conf.int

cat("=== CI 95% Proporsi ===\n")
#> === CI 95% Proporsi ===
cat("Smoker    : [", round(ci_smoker[1],4), ",", round(ci_smoker[2],4), "]\n")
#> Smoker    : [ 0.487 , 0.5413 ]
cat("Non-Smoker: [", round(ci_nonsmoker[1],4), ",", round(ci_nonsmoker[2],4), "]\n")
#> Non-Smoker: [ 0.1733 , 0.3748 ]

IC untuk Risk Difference (RD)

# Risk Difference = p1 - p2
RD <- p_smoker - p_nonsmoker

# SE untuk RD
se_RD <- sqrt((p_smoker*(1-p_smoker)/n1_row1) + (p_nonsmoker*(1-p_nonsmoker)/n1_row2))
z95   <- qnorm(0.975)

ci_RD_lower <- RD - z95 * se_RD
ci_RD_upper <- RD + z95 * se_RD

cat("Risk Difference (RD):", round(RD, 4), "\n")
#> Risk Difference (RD): 0.2517
cat("CI 95% RD: [", round(ci_RD_lower, 4), ",", round(ci_RD_upper, 4), "]\n")
#> CI 95% RD: [ 0.1516 , 0.3518 ]

IC untuk Relative Risk (RR)

# Relative Risk
RR1 <- p_smoker / p_nonsmoker

# CI RR menggunakan skala log
se_logRR <- sqrt((1-p_smoker)/(a1) + (1-p_nonsmoker)/(c1))
ci_RR_lower <- exp(log(RR1) - z95 * se_logRR)
ci_RR_upper <- exp(log(RR1) + z95 * se_logRR)

cat("Relative Risk (RR)  :", round(RR1, 4), "\n")
#> Relative Risk (RR)  : 1.9589
cat("CI 95% RR: [", round(ci_RR_lower, 4), ",", round(ci_RR_upper, 4), "]\n")
#> CI 95% RR: [ 1.3517 , 2.8387 ]

IC untuk Odds Ratio (OR)

library(epitools)

# Odds Ratio dan CI menggunakan paket epitools
or_result <- oddsratio(kasus1, method = "wald")
cat("=== Odds Ratio (Wald) ===\n")
#> === Odds Ratio (Wald) ===
print(or_result$measure)
#>                         NA
#> odds ratio with 95% C.I. estimate    lower    upper
#>               Smoker     1.000000       NA       NA
#>               Non-Smoker 2.973773 1.786737 4.949427
# Manual verification
OR1 <- (a1 * d1) / (b1 * c1)
se_logOR <- sqrt(1/a1 + 1/b1 + 1/c1 + 1/d1)
ci_OR_lower <- exp(log(OR1) - z95 * se_logOR)
ci_OR_upper <- exp(log(OR1) + z95 * se_logOR)

cat("\nOR Manual            :", round(OR1, 4), "\n")
#> 
#> OR Manual            : 2.9738
cat("CI 95% OR  : [", round(ci_OR_lower, 4), ",", round(ci_OR_upper, 4), "]\n")
#> CI 95% OR  : [ 1.7867 , 4.9494 ]

Ringkasan Ukuran Asosiasi:

Ukuran Estimasi CI 95% Bawah CI 95% Atas
Proporsi Smoker 0.5142 0.487 0.5413
Proporsi Non-Smoker 0.2625 0.1733 0.3748
Risk Difference 0.2517 0.1516 0.3518
Relative Risk 1.9589 1.3517 2.8387
Odds Ratio 2.9738 1.7867 4.9494

4. Uji Dua Proporsi

# Uji dua proporsi (two-sided)
uji_prop <- prop.test(
  x       = c(a1, c1),
  n       = c(n1_row1, n1_row2),
  alternative = "two.sided",
  correct = FALSE   # tanpa koreksi Yates agar konsisten dengan chi-square manual
)
cat("=== Uji Dua Proporsi (Tanpa Koreksi Yates) ===\n")
#> === Uji Dua Proporsi (Tanpa Koreksi Yates) ===
print(uji_prop)
#> 
#>  2-sample test for equality of proportions without continuity correction
#> 
#> data:  c(a1, c1) out of c(n1_row1, n1_row2)
#> 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

Hipotesis: - \(H_0: \pi_{\text{Smoker}} = \pi_{\text{Non-Smoker}}\) - \(H_1: \pi_{\text{Smoker}} \neq \pi_{\text{Non-Smoker}}\)

5. Uji Chi-Square Independensi

# Uji chi-square Pearson
chi_k1 <- chisq.test(kasus1, correct = FALSE)
cat("=== Uji Chi-Square Pearson ===\n")
#> === Uji Chi-Square Pearson ===
print(chi_k1)
#> 
#>  Pearson's Chi-squared test
#> 
#> data:  kasus1
#> X-squared = 19.129, df = 1, p-value = 1.222e-05
cat("\nFrekuensi Harapan:\n")
#> 
#> Frekuensi Harapan:
print(round(chi_k1$expected, 2))
#>            Cancer (+) Control (-)
#> Smoker            669         669
#> Non-Smoker         40          40

Hipotesis: - \(H_0\): Status merokok dan kejadian kanker paru independen - \(H_1\): Status merokok dan kejadian kanker paru tidak independen (berasosiasi)

6. Uji Likelihood Ratio (\(G^2\))

library(DescTools)

# G-square (Likelihood Ratio Test)
g2_k1 <- GTest(kasus1)
cat("=== Uji Likelihood Ratio (G²) ===\n")
#> === Uji Likelihood Ratio (G²) ===
print(g2_k1)
#> 
#>  Log likelihood ratio (G-test) test of independence without correction
#> 
#> data:  kasus1
#> G = 19.878, X-squared df = 1, p-value = 8.254e-06

Hipotesis: Sama dengan uji chi-square (independensi antar variabel).

Statistik uji: \(G^2 = 2 \sum_{ij} n_{ij} \ln\!\left(\dfrac{n_{ij}}{e_{ij}}\right)\)

7. Fisher Exact Test

# Fisher exact test (two-sided)
fisher_k1 <- fisher.test(kasus1, alternative = "two.sided")
cat("=== Fisher Exact Test ===\n")
#> === Fisher Exact Test ===
print(fisher_k1)
#> 
#>  Fisher's Exact Test for Count Data
#> 
#> data:  kasus1
#> 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

Hipotesis: - \(H_0: OR = 1\) (tidak ada asosiasi) - \(H_1: OR \neq 1\) (terdapat asosiasi)

8. Perbandingan Hasil Keempat Uji

# Kompilasi hasil
hasil_perbandingan <- data.frame(
  Uji = c(
    "Uji Dua Proporsi",
    "Chi-Square Pearson",
    "Likelihood Ratio (G²)",
    "Fisher Exact Test"
  ),
  Statistik_Uji = c(
    paste0("Z² = ", round(uji_prop$statistic, 4)),
    paste0("χ² = ", round(chi_k1$statistic, 4)),
    paste0("G² = ", round(g2_k1$statistic, 4)),
    "— (exact)"
  ),
  df = c(1, 1, 1, "—"),
  p_value = c(
    formatC(uji_prop$p.value,  format = "e", digits = 3),
    formatC(chi_k1$p.value,    format = "e", digits = 3),
    formatC(g2_k1$p.value,     format = "e", digits = 3),
    formatC(fisher_k1$p.value, format = "e", digits = 3)
  ),
  Keputusan = rep("Tolak H₀", 4)
)

knitr::kable(
  hasil_perbandingan,
  col.names = c("Uji", "Statistik Uji", "df", "p-value", "Keputusan"),
  caption   = "Perbandingan Keempat Uji pada α = 0.05"
)
Perbandingan Keempat Uji pada α = 0.05
Uji Statistik Uji df p-value Keputusan
Uji Dua Proporsi Z² = 19.1292 1 1.222e-05 Tolak H₀
Chi-Square Pearson χ² = 19.1292 1 1.222e-05 Tolak H₀
Likelihood Ratio (G²) G² = 19.878 1 8.254e-06 Tolak H₀
Fisher Exact Test — (exact) 1.476e-05 Tolak H₀

Perbandingan Interpretasi:

  • Uji Dua Proporsi menguji kesetaraan dua proporsi populasi secara langsung; statistiknya equivalen dengan chi-square (Z² = χ²).
  • Chi-Square Pearson adalah uji omnibus berbasis deviasi antara frekuensi observasi dan harapan; berlaku umum untuk tabel r×c.
  • Likelihood Ratio (G²) berbasis rasio fungsi likelihood; lebih baik untuk sampel kecil dan konsisten dengan model log-linear.
  • Fisher Exact Test tidak memerlukan asumsi distribusi asimtotik; menggunakan distribusi hipergeometrik; ideal bila frekuensi harapan < 5 (tidak relevan di sini, namun tetap valid).

Keempat uji memberikan kesimpulan yang sama: tolak \(H_0\) dengan p-value sangat kecil, menunjukkan asosiasi yang sangat kuat antara merokok dan kanker paru.

9. Kesimpulan Kasus 1

Berdasarkan seluruh analisis inferensi pada tabel kontingensi 2×2:

  1. Proporsi kejadian kanker paru pada perokok (51.4%) jauh lebih tinggi dibandingkan bukan perokok (26.2%).

  2. Risk Difference = 0.2517 artinya risiko absolut kanker paru lebih tinggi 25.2 poin persentase pada kelompok perokok.

  3. Relative Risk = 1.9589 (CI: [1.352, 2.839]) menunjukkan bahwa perokok berisiko sekitar 2 kali lebih tinggi untuk terkena kanker paru.

  4. Odds Ratio = 2.9738 (CI: [1.787, 4.949]) mengindikasikan asosiasi positif yang sangat kuat antara merokok dan kanker paru, dengan odds perokok mengalami kanker paru hampir 3 kali lipat dibandingkan bukan perokok.

  5. Seluruh uji hipotesis (uji dua proporsi, chi-square, likelihood ratio, dan Fisher exact) menghasilkan p-value < 0.001, sehingga pada taraf signifikansi 5% kita menolak hipotesis independensi.

Kesimpulan: Terdapat hubungan yang signifikan secara statistik dan bermakna secara substantif antara kebiasaan merokok dan kejadian kanker paru. Merokok merupakan faktor risiko utama yang meningkatkan kemungkinan kanker paru secara substansial.


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

Konteks: Data survei nasional tentang hubungan antara gender dan preferensi identifikasi partai politik (Democrat, Republican, Independent) pada 2450 responden.

1. Tabel Kontingensi 2×3

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

knitr::kable(
  addmargins(kasus2),
  caption = "Tabel Kontingensi: Gender vs Identifikasi Partai Politik"
)
Tabel Kontingensi: Gender vs Identifikasi Partai Politik
Democrat Republican Independent Sum
Female 495 272 590 1357
Male 330 265 498 1093
Sum 825 537 1088 2450

2. Frekuensi Harapan

chi_k2 <- chisq.test(kasus2, correct = FALSE)

cat("=== Frekuensi Harapan (Expected Frequencies) ===\n")
#> === Frekuensi Harapan (Expected Frequencies) ===
knitr::kable(
  round(chi_k2$expected, 3),
  caption = "Frekuensi Harapan di Bawah H₀ Independensi"
)
Frekuensi Harapan di Bawah H₀ Independensi
Democrat Republican Independent
Female 456.949 297.432 602.619
Male 368.051 239.568 485.381
cat("\nSeluruh frekuensi harapan > 5?",
    all(chi_k2$expected > 5), "\n")
#> 
#> Seluruh frekuensi harapan > 5? TRUE

Rumus Frekuensi Harapan: \(e_{ij} = \dfrac{n_{i\bullet} \cdot n_{\bullet j}}{n}\)

Syarat validitas uji chi-square asimtotik: semua \(e_{ij} \geq 5\). Pada data ini syarat tersebut terpenuhi.

3. Uji Chi-Square Independensi (Tabel Keseluruhan)

cat("=== Uji Chi-Square Pearson (Tabel 2×3) ===\n")
#> === Uji Chi-Square Pearson (Tabel 2×3) ===
print(chi_k2)
#> 
#>  Pearson's Chi-squared test
#> 
#> data:  kasus2
#> X-squared = 12.569, df = 2, p-value = 0.001865

Hipotesis: - \(H_0\): Gender dan identifikasi partai politik independen - \(H_1\): Gender dan identifikasi partai politik tidak independen

Dengan \(df = (r-1)(c-1) = (2-1)(3-1) = 2\).

4. Residual Pearson dan Standardized Residual

# Residual Pearson
res_pearson <- chi_k2$residuals
cat("=== Residual Pearson ===\n")
#> === Residual Pearson ===
knitr::kable(round(res_pearson, 4),
             caption = "Residual Pearson: (Obs - Exp) / sqrt(Exp)")
Residual Pearson: (Obs - Exp) / sqrt(Exp)
Democrat Republican Independent
Female 1.7801 -1.4747 -0.5140
Male -1.9834 1.6431 0.5728
# Standardized residual (adjusted residual)
res_std <- chi_k2$stdres
cat("\n=== Standardized (Adjusted) Residual ===\n")
#> 
#> === Standardized (Adjusted) Residual ===
knitr::kable(round(res_std, 4),
             caption = "Adjusted Residual ~ N(0,1) di bawah H₀")
Adjusted Residual ~ N(0,1) di bawah H₀
Democrat Republican Independent
Female 3.2724 -2.4986 -1.0322
Male -3.2724 2.4986 1.0322
library(corrplot)

# Visualisasi standardized residual
corrplot(
  chi_k2$stdres,
  is.corr  = FALSE,
  method   = "color",
  col      = colorRampPalette(c("#c0392b","white","#2471a3"))(200),
  addCoef.col = "black",
  tl.col   = "black",
  title    = "Standardized Residual: Gender vs Partai Politik",
  mar      = c(0,0,2,0)
)

Interpretasi Adjusted Residual: Nilai |residual| > 1.96 menunjukkan kontribusi sel yang signifikan pada taraf α = 0.05 (uji dua sisi). Tanda positif menunjukkan frekuensi observasi lebih tinggi dari harapan; tanda negatif berarti lebih rendah.

cat("Sel dengan |Adjusted Residual| > 1.96 (signifikan):\n")
#> Sel dengan |Adjusted Residual| > 1.96 (signifikan):
sig_cells <- which(abs(chi_k2$stdres) > 1.96, arr.ind = TRUE)
for (i in seq_len(nrow(sig_cells))) {
  r <- sig_cells[i,1]; k <- sig_cells[i,2]
  cat(sprintf("  [%s, %s]: std.res = %.3f\n",
              rownames(kasus2)[r], colnames(kasus2)[k], chi_k2$stdres[r,k]))
}
#>   [Female, Democrat]: std.res = 3.272
#>   [Male, Democrat]: std.res = -3.272
#>   [Female, Republican]: std.res = -2.499
#>   [Male, Republican]: std.res = 2.499

5. Partisi Chi-Square

Tabel 2×3 dapat dipartisi menjadi dua tabel 2×2 yang ortogonal (bebas satu sama lain), sehingga jumlah chi-square partisi mendekati chi-square keseluruhan.

Partisi 1: Democrat vs Republican

# Subset: hanya Democrat dan Republican
tbl_p1 <- kasus2[, c("Democrat", "Republican")]
chi_p1 <- chisq.test(tbl_p1, correct = FALSE)

cat("=== Partisi 1: Democrat vs Republican ===\n")
#> === Partisi 1: Democrat vs Republican ===
knitr::kable(addmargins(tbl_p1))
Democrat Republican Sum
Female 495 272 767
Male 330 265 595
Sum 825 537 1362
print(chi_p1)
#> 
#>  Pearson's Chi-squared test
#> 
#> data:  tbl_p1
#> X-squared = 11.555, df = 1, p-value = 0.0006758

Partisi 2: (Democrat + Republican) vs Independent

# Subset: gabungan Dem+Rep vs Independent
tbl_p2 <- cbind(
  "Dem+Rep"     = rowSums(kasus2[, c("Democrat", "Republican")]),
  "Independent" = kasus2[, "Independent"]
)
chi_p2 <- chisq.test(tbl_p2, correct = FALSE)

cat("=== Partisi 2: (Dem + Rep) vs Independent ===\n")
#> === Partisi 2: (Dem + Rep) vs Independent ===
knitr::kable(addmargins(tbl_p2))
Dem+Rep Independent Sum
Female 767 590 1357
Male 595 498 1093
Sum 1362 1088 2450
print(chi_p2)
#> 
#>  Pearson's Chi-squared test
#> 
#> data:  tbl_p2
#> X-squared = 1.0654, df = 1, p-value = 0.302

6. Perbandingan Partisi dengan Chi-Square Keseluruhan

tbl_partisi <- data.frame(
  Analisis    = c(
    "Chi-Square Keseluruhan (2×3)",
    "Partisi 1: Dem vs Rep",
    "Partisi 2: (Dem+Rep) vs Ind",
    "Total Partisi (P1 + P2)"
  ),
  Chi_Square  = c(
    round(chi_k2$statistic, 4),
    round(chi_p1$statistic, 4),
    round(chi_p2$statistic, 4),
    round(chi_p1$statistic + chi_p2$statistic, 4)
  ),
  df          = c(2, 1, 1, 2),
  p_value     = c(
    formatC(chi_k2$p.value, format = "e", digits = 3),
    formatC(chi_p1$p.value, format = "e", digits = 3),
    formatC(chi_p2$p.value, format = "e", digits = 3),
    formatC(pchisq(chi_p1$statistic + chi_p2$statistic, df = 2,
                   lower.tail = FALSE), format = "e", digits = 3)
  )
)

knitr::kable(
  tbl_partisi,
  col.names = c("Analisis", "χ²", "df", "p-value"),
  caption   = "Perbandingan Chi-Square Keseluruhan vs Partisi"
)
Perbandingan Chi-Square Keseluruhan vs Partisi
Analisis χ² df p-value
Chi-Square Keseluruhan (2×3) 12.5693 2 1.865e-03
Partisi 1: Dem vs Rep 11.5545 1 6.758e-04
Partisi 2: (Dem+Rep) vs Ind 1.0654 1 3.020e-01
Total Partisi (P1 + P2) 12.6200 2 1.818e-03

Interpretasi Partisi: Jumlah χ² dari dua partisi ortogonal mendekati nilai χ² keseluruhan dengan df = 2. Hal ini memvalidasi bahwa partisi yang dibuat bersifat ortogonal dan tidak tumpang tindih dalam menjelaskan total variasi.

7. Kategori Paling Berkontribusi

# Kontribusi chi-square tiap sel = (residual Pearson)^2
kontribusi <- chi_k2$residuals^2
cat("=== Kontribusi Chi-Square per Sel ===\n")
#> === Kontribusi Chi-Square per Sel ===
knitr::kable(
  round(kontribusi, 4),
  caption = "Kontribusi Tiap Sel terhadap Nilai χ² Total"
)
Kontribusi Tiap Sel terhadap Nilai χ² Total
Democrat Republican Independent
Female 3.1686 2.1746 0.2642
Male 3.9339 2.6999 0.3281
# Persentase kontribusi
pct_kontribusi <- (kontribusi / chi_k2$statistic) * 100
cat("\n=== Persentase Kontribusi (%) ===\n")
#> 
#> === Persentase Kontribusi (%) ===
knitr::kable(
  round(pct_kontribusi, 2),
  caption = "Persentase Kontribusi Tiap Sel (%)"
)
Persentase Kontribusi Tiap Sel (%)
Democrat Republican Independent
Female 25.21 17.30 2.10
Male 31.30 21.48 2.61
# Mosaic plot
mosaicplot(
  kasus2,
  shade  = TRUE,
  las    = 1,
  main   = "Mosaic Plot: Gender vs Identifikasi Partai Politik",
  xlab   = "Gender",
  ylab   = "Identifikasi Partai",
  color  = TRUE
)

Sel yang Paling Berkontribusi:

Berdasarkan adjusted residual dan kontribusi chi-square:

  • Female–Democrat memiliki residual positif signifikan: perempuan cenderung lebih banyak mengidentifikasi diri sebagai Democrat dibandingkan harapan di bawah independensi.
  • Male–Democrat memiliki residual negatif signifikan: laki-laki cenderung lebih sedikit memilih Democrat.
  • Female–Republican memiliki residual negatif: perempuan kurang mengidentifikasi diri sebagai Republican.
  • Male–Republican memiliki residual positif: laki-laki sedikit lebih banyak memilih Republican.
  • Kategori Independent tidak memberikan kontribusi yang signifikan, menunjukkan distribusi yang relatif proporsional antara gender.

Dengan demikian, perbedaan gender paling menonjol pada identifikasi partai Democrat dan Republican, bukan pada Independent.

Kesimpulan Kasus 2

  1. Uji chi-square keseluruhan menghasilkan χ² = 12.5693, df = 2, p-value = 1.865e-03 — tolak H₀. Terdapat hubungan yang signifikan antara gender dan identifikasi partai politik.

  2. Frekuensi harapan semuanya > 5, sehingga asumsi uji chi-square asimtotik terpenuhi.

  3. Standardized residual menunjukkan bahwa sel Female–Democrat dan Male–Republican berkontribusi paling besar, dengan nilai absolut yang melampaui nilai kritis 1.96.

  4. Partisi chi-square ke dua tabel 2×2 ortogonal: Partisi 1 (Dem vs Rep) memberikan χ² = 11.5545 (p = 6.758e-04) dan Partisi 2 (Dem+Rep vs Ind) memberikan χ² = 1.0654 (p = 3.020e-01). Jumlah keduanya mendekati nilai chi-square keseluruhan, mengkonfirmasi ortogonalitas.

  5. Hubungan gender–partai terutama didorong oleh kecenderungan perempuan lebih banyak mengidentifikasi diri sebagai Democrat dan laki-laki relatif lebih banyak memilih Republican, sementara preferensi Independent relatif seimbang antar gender.


Referensi Tambahan

  • Agresti, A. (2013). Categorical Data Analysis (3rd ed.). Wiley-Interscience.
  • Friendly, M. (1992). Mosaic displays for log-linear models. Proceedings of the Statistical Graphics Section, ASA, 61–68.
  • Wickham, H. (2016). ggplot2: Elegant Graphics for Data Analysis. Springer.

S1 Statistika · FMIPA · Universitas Padjadjaran | Dosen: I Gede Nyoman Mindra Jaya