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 | 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 |
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.
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.
| 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.
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\).
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)}\]
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\).
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:
Ukuran asosiasi (measures of association) adalah statistik yang mengkuantifikasi kekuatan dan arah hubungan antara dua variabel kategori dalam tabel kontingensi.
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 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 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.
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.
| 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\) |
\[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.
\[\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\]
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.
# 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
#> Penyakit Jantung Tidak Sakit Jantung Sum
#> Rutin Olahraga 15 110 125
#> Tidak Olahraga 45 80 125
#> Sum 60 190 250
#> === Joint Distribution ===
#> 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) ===
#> Penyakit Jantung Tidak Sakit Jantung
#> Rutin Olahraga 0.12 0.88
#> Tidak Olahraga 0.36 0.64
# 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
#> Odds Tidak Olahraga : 0.5625
#> Odds Ratio (OR) : 0.2424
#> Relative Risk (RR) : 0.3333
#>
#> Pearson's Chi-squared test with Yates' continuity correction
#>
#> data: data
#> X-squared = 18.443, df = 1, p-value = 1.751e-05
#>
#> === Frekuensi Harapan ===
#> Penyakit Jantung Tidak Sakit Jantung
#> Rutin Olahraga 30 95
#> Tidak Olahraga 30 95
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.
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.
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.
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.
# 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"
)| Cancer (+) | Control (-) | Sum | |
|---|---|---|---|
| Smoker | 688 | 650 | 1338 |
| Non-Smoker | 21 | 59 | 80 |
| Sum | 709 | 709 | 1418 |
# 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
#> 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.
# 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 ===
#> Smoker : [ 0.487 , 0.5413 ]
#> Non-Smoker: [ 0.1733 , 0.3748 ]
# 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
#> CI 95% RD: [ 0.1516 , 0.3518 ]
# 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
#> CI 95% RR: [ 1.3517 , 2.8387 ]
library(epitools)
# Odds Ratio dan CI menggunakan paket epitools
or_result <- oddsratio(kasus1, method = "wald")
cat("=== Odds Ratio (Wald) ===\n")#> === Odds Ratio (Wald) ===
#> 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
#> 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 |
# 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) ===
#>
#> 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}}\)
# Uji chi-square Pearson
chi_k1 <- chisq.test(kasus1, correct = FALSE)
cat("=== Uji Chi-Square Pearson ===\n")#> === Uji Chi-Square Pearson ===
#>
#> Pearson's Chi-squared test
#>
#> data: kasus1
#> X-squared = 19.129, df = 1, p-value = 1.222e-05
#>
#> Frekuensi Harapan:
#> 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)
library(DescTools)
# G-square (Likelihood Ratio Test)
g2_k1 <- GTest(kasus1)
cat("=== Uji Likelihood Ratio (G²) ===\n")#> === Uji Likelihood Ratio (G²) ===
#>
#> 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)\)
# Fisher exact test (two-sided)
fisher_k1 <- fisher.test(kasus1, alternative = "two.sided")
cat("=== Fisher Exact Test ===\n")#> === Fisher Exact Test ===
#>
#> 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)
# 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"
)| 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:
Keempat uji memberikan kesimpulan yang sama: tolak \(H_0\) dengan p-value sangat kecil, menunjukkan asosiasi yang sangat kuat antara merokok dan kanker paru.
Berdasarkan seluruh analisis inferensi pada tabel kontingensi 2×2:
Proporsi kejadian kanker paru pada perokok (51.4%) jauh lebih tinggi dibandingkan bukan perokok (26.2%).
Risk Difference = 0.2517 artinya risiko absolut kanker paru lebih tinggi 25.2 poin persentase pada kelompok perokok.
Relative Risk = 1.9589 (CI: [1.352, 2.839]) menunjukkan bahwa perokok berisiko sekitar 2 kali lebih tinggi untuk terkena kanker paru.
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.
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.
Konteks: Data survei nasional tentang hubungan antara gender dan preferensi identifikasi partai politik (Democrat, Republican, Independent) pada 2450 responden.
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"
)| Democrat | Republican | Independent | Sum | |
|---|---|---|---|---|
| Female | 495 | 272 | 590 | 1357 |
| Male | 330 | 265 | 498 | 1093 |
| Sum | 825 | 537 | 1088 | 2450 |
chi_k2 <- chisq.test(kasus2, correct = FALSE)
cat("=== Frekuensi Harapan (Expected Frequencies) ===\n")#> === Frekuensi Harapan (Expected Frequencies) ===
| Democrat | Republican | Independent | |
|---|---|---|---|
| Female | 456.949 | 297.432 | 602.619 |
| Male | 368.051 | 239.568 | 485.381 |
#>
#> 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.
#> === Uji Chi-Square Pearson (Tabel 2×3) ===
#>
#> 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\).
#> === Residual Pearson ===
| 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 ===
| 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.
#> 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
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.
# 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 ===
| Democrat | Republican | Sum | |
|---|---|---|---|
| Female | 495 | 272 | 767 |
| Male | 330 | 265 | 595 |
| Sum | 825 | 537 | 1362 |
#>
#> Pearson's Chi-squared test
#>
#> data: tbl_p1
#> X-squared = 11.555, df = 1, p-value = 0.0006758
# 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 ===
| Dem+Rep | Independent | Sum | |
|---|---|---|---|
| Female | 767 | 590 | 1357 |
| Male | 595 | 498 | 1093 |
| Sum | 1362 | 1088 | 2450 |
#>
#> Pearson's Chi-squared test
#>
#> data: tbl_p2
#> X-squared = 1.0654, df = 1, p-value = 0.302
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"
)| 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.
# 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 ===
| 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 (%) ===
| 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:
Dengan demikian, perbedaan gender paling menonjol pada identifikasi partai Democrat dan Republican, bukan pada Independent.
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.
Frekuensi harapan semuanya > 5, sehingga asumsi uji chi-square asimtotik terpenuhi.
Standardized residual menunjukkan bahwa sel Female–Democrat dan Male–Republican berkontribusi paling besar, dengan nilai absolut yang melampaui nilai kritis 1.96.
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.
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.