Program Studi S1 Statistika · FMIPA Universitas Padjadjaran · Dosen: Prof. I Gede Nyoman Mindra Jaya, Ph.D
Kumpulan tugas mata kuliah Analisis Data Kategori 1 yang mencakup konsep dasar data kategori, tabel kontingensi, ukuran asosiasi, hingga inferensi statistik. Seluruh analisis dilakukan menggunakan R/RStudio dengan pendekatan yang reprodusibel.
Analisis data kategori adalah cabang statistika yang digunakan untuk menganalisis variabel yang berbentuk kategori atau klasifikasi. Berbeda dengan data kontinu, data kategori merepresentasikan keanggotaan suatu objek pada kelompok tertentu dan tidak memiliki makna numerik langsung.
Karakteristik Variabel Kategori:
Contoh Penerapan:
Dalam penelitian kesehatan, metode ini sering digunakan untuk melihat hubungan antara kebiasaan gaya hidup (seperti merokok) dengan status penyakit (seperti kanker). Selain itu, bidang sosial menggunakannya untuk menganalisis tingkat kepuasan atau status ekonomi masyarakat.
Tabel kontingensi adalah tabel yang menyajikan distribusi frekuensi dari dua atau lebih variabel kategori secara bersamaan untuk melihat hubungan antar kategori tersebut.
Contoh struktur hubungan antara variabel baris (X) dan kolom (Y):
| Kolom 1 (\(j=1\)) | Kolom 2 (\(j=2\)) | Total | |
|---|---|---|---|
| Baris 1 (\(i=1\)) | \(n_{11}\) | \(n_{12}\) | \(n_{1.}\) |
| Baris 2 (\(i=2\)) | \(n_{21}\) | \(n_{22}\) | \(n_{2.}\) |
| Total | \(n_{.1}\) | \(n_{.2}\) | \(n\) |
Keterangan Notasi:
Berdasarkan struktur tabel di atas, terdapat tiga konsep probabilitas utama:
Joint Distribution — probabilitas elemen baris \(i\) dan kolom \(j\) terjadi bersamaan: \[P_{ij} = \frac{n_{ij}}{n}\]
Marginal Distribution — probabilitas satu variabel tanpa memperhatikan variabel lain: \[P_{i.} = \sum_{j} P_{ij} \qquad P_{.j} = \sum_{i} P_{ij}\]
Conditional Probability — probabilitas suatu kejadian dengan syarat kategori tertentu sudah diketahui: \[P(j \mid i) = \frac{P_{ij}}{P_{i.}}\]
Ukuran asosiasi digunakan untuk mengukur kekuatan dan arah hubungan antara dua variabel kategori.
Perbandingan antara peluang kejadian terjadi dengan peluang kejadian tidak terjadi:
\[\text{Odds} = \frac{P}{1-P}\]
Interpretasi: Mengukur kecenderungan terjadinya suatu peristiwa pada satu kelompok. Odds = 2 berarti peristiwa 2× lebih mungkin terjadi daripada tidak terjadi.
Rasio antara odds pada kelompok pertama dengan odds pada kelompok kedua:
\[OR = \frac{ad}{bc}\]
Interpretasi: Jika \(OR > 1\), odds pada kelompok pertama lebih besar dari kelompok kedua. Jika \(OR = 1\), tidak ada hubungan. Jika \(OR < 1\), kelompok pertama memiliki odds lebih kecil.
Perbandingan risiko (probabilitas) kejadian antara dua kelompok:
\[RR = \frac{a/(a+b)}{c/(c+d)}\]
Interpretasi: Menunjukkan berapa kali lipat risiko kelompok terpapar dibandingkan kelompok tidak terpapar. RR = 3 artinya kelompok terpapar berisiko 3× lebih tinggi.
Kasus: Hubungan Merokok vs Kanker Paru
Data observasi (\(n = 200\)):
| Kanker | Tidak Kanker | Total | |
|---|---|---|---|
| Merokok | 60 (\(a\)) | 40 (\(b\)) | 100 |
| Tidak Merokok | 20 (\(c\)) | 80 (\(d\)) | 100 |
\[P(K \mid M) = \frac{60}{100} = 0.60 \qquad P(K \mid TM) = \frac{20}{100} = 0.20\]
\[\text{Odds}_{\text{Merokok}} = \frac{60}{40} = 1.5 \qquad \text{Odds}_{\text{Tidak Merokok}} = \frac{20}{80} = 0.25\]
\[OR = \frac{60 \times 80}{40 \times 20} = \frac{4800}{800} = 6\]
Interpretasi: Individu yang merokok memiliki odds kejadian kanker paru 6 kali lebih tinggi dibandingkan individu yang tidak merokok.
# 1. Membuat tabel kontingensi
data_kasus <- matrix(c(60, 40, 20, 80), nrow = 2, byrow = TRUE)
rownames(data_kasus) <- c("Merokok", "Tidak Merokok")
colnames(data_kasus) <- c("Kanker", "Tidak Kanker")
knitr::kable(data_kasus,
caption = "Tabel Kontingensi: Merokok vs Kanker Paru (n=200)")| Kanker | Tidak Kanker | |
|---|---|---|
| Merokok | 60 | 40 |
| Tidak Merokok | 20 | 80 |
## === Odds Ratio ===
## $data
## Kanker Tidak Kanker Total
## Merokok 60 40 100
## Tidak Merokok 20 80 100
## Total 80 120 200
##
## $measure
## NA
## odds ratio with 95% C.I. estimate lower upper
## Merokok 1.000000 NA NA
## Tidak Merokok 5.915517 3.181806 11.37695
##
## $p.value
## NA
## two-sided midp.exact fisher.exact chi.square
## Merokok NA NA NA
## Tidak Merokok 6.163344e-09 1.063603e-08 7.764037e-09
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
##
## === Uji Chi-Square ===
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data_kasus
## X-squared = 31.688, df = 1, p-value = 1.811e-08
Interpretasi Statistik
Pada pengujian asosiasi menggunakan Pearson’s Chi-squared test, diperoleh nilai p-value yang sangat mendekati angka 0 (\(3.32 \times 10^{-9}\)). Karena p-value jauh lebih kecil dibandingkan taraf signifikansi standar (\(\alpha = 0.05\)), maka terdapat cukup bukti statistika empiris untuk menolak \(H_0\). Secara statistik, hal ini membuktikan adanya hubungan asosiasi yang sangat signifikan antara variabel status merokok dengan insiden kejadian kanker paru.
Interpretasi Substantif
Berdasarkan ukuran asosiasi deskriptif, diperoleh nilai Odds Ratio (\(OR\)) sebesar 6. Secara substantif, hal ini mengindikasikan bahwa kelompok individu dengan kebiasaan merokok memiliki kecenderungan atau peluang (odds) sekitar 6 kali lebih besar untuk mengalami penyakit kanker paru dibandingkan dengan kelompok individu yang tidak merokok.
Tugas ini membahas inferensi pada tabel kontingensi dua arah, yang merupakan salah satu metode utama dalam Analisis Data Kategori untuk menguji hubungan antar variabel kategorikal. Dua kasus dianalisis:
Analisis mencakup estimasi proporsi, interval kepercayaan 95%, ukuran asosiasi (RD, RR, OR), serta empat uji hipotesis: uji dua proporsi, chi-square, likelihood ratio (\(G^2\)), dan Fisher exact test.
Data yang digunakan adalah studi kasus-kontrol mengenai hubungan antara kebiasaan merokok dan kejadian kanker paru. Setiap sel merepresentasikan jumlah individu berdasarkan kombinasi status merokok dan status kanker.
tabel1 <- matrix(c(688, 650, 21, 59),
nrow = 2, byrow = TRUE,
dimnames = list(
"Status Merokok" = c("Smoker", "Non-Smoker"),
"Status Kanker" = c("Cancer (+)", "Control (-)")
))
tabel1_df <- as.data.frame(tabel1)
tabel1_df$Total <- rowSums(tabel1_df)
tabel1_df <- rbind(tabel1_df, Total = colSums(tabel1_df))
knitr::kable(tabel1_df,
caption = "Tabel 1.1 Tabel Kontingensi 2×2: Merokok dan Kanker Paru",
align = "c")| Cancer (+) | Control (-) | Total | |
|---|---|---|---|
| Smoker | 688 | 650 | 1338 |
| Non-Smoker | 21 | 59 | 80 |
| Total | 709 | 709 | 1418 |
Estimasi titik proporsi kejadian kanker paru dihitung untuk masing-masing kelompok. Proporsi ini menjadi dasar perhitungan ukuran asosiasi selanjutnya.
\[\hat{p}_{\text{Smoker}} = \frac{n_{11}}{n_{1.}} \qquad \hat{p}_{\text{Non-Smoker}} = \frac{n_{21}}{n_{2.}}\]
n_smoker <- 1338; n_nonsmoker <- 80
cancer_s <- 688; cancer_ns <- 21
p_s <- cancer_s / n_smoker
p_ns <- cancer_ns / n_nonsmoker
cat(sprintf("Proporsi kanker — Smoker : %.4f (%.2f%%)\n", p_s, p_s * 100))## Proporsi kanker — Smoker : 0.5142 (51.42%)
## Proporsi kanker — Non-Smoker : 0.2625 (26.25%)
Interpretasi: Proporsi kejadian kanker paru pada kelompok perokok adalah 51.42%, jauh lebih tinggi dibandingkan non-perokok sebesar 26.25%. Perbedaan sebesar ±25.2 poin persentase ini sudah terlihat secara deskriptif sebelum dilakukan uji formal.
Interval kepercayaan memberikan rentang estimasi parameter populasi dengan tingkat keyakinan 95%.
ci_s <- prop.test(cancer_s, n_smoker, conf.level = 0.95)
ci_ns <- prop.test(cancer_ns, n_nonsmoker, conf.level = 0.95)
cat("─── Smoker ───\n")## ─── Smoker ───
cat(sprintf(" Estimasi : %.4f\n 95%% CI : (%.4f, %.4f)\n\n",
ci_s$estimate, ci_s$conf.int[1], ci_s$conf.int[2]))## Estimasi : 0.5142
## 95% CI : (0.4870, 0.5413)
## ─── Non-Smoker ───
cat(sprintf(" Estimasi : %.4f\n 95%% CI : (%.4f, %.4f)\n",
ci_ns$estimate, ci_ns$conf.int[1], ci_ns$conf.int[2]))## Estimasi : 0.2625
## 95% CI : (0.1733, 0.3748)
Interpretasi: CI untuk Smoker adalah (0.487, 0.5413) dan untuk Non-Smoker adalah (0.1733, 0.3748). Kedua interval tidak saling tumpang tindih, mengindikasikan perbedaan proporsi yang bermakna secara statistik.
Risk Difference mengukur perbedaan absolut risiko antara dua kelompok.
\[RD = \hat{p}_1 - \hat{p}_2, \qquad SE(RD) = \sqrt{\frac{\hat{p}_1(1-\hat{p}_1)}{n_1} + \frac{\hat{p}_2(1-\hat{p}_2)}{n_2}}\] \[CI_{95\%}(RD) = RD \pm 1.96 \times SE(RD)\]
z <- qnorm(0.975)
RD <- p_s - p_ns
SE_RD <- sqrt((p_s*(1-p_s)/n_smoker) + (p_ns*(1-p_ns)/n_nonsmoker))
CI_RD <- c(RD - z*SE_RD, RD + z*SE_RD)
cat(sprintf("Risk Difference (RD) : %.4f\n95%% CI RD : (%.4f, %.4f)\n",
RD, CI_RD[1], CI_RD[2]))## Risk Difference (RD) : 0.2517
## 95% CI RD : (0.1516, 0.3518)
Interpretasi: Kelompok perokok memiliki risiko kanker paru 25.17 poin persentase lebih tinggi secara absolut dibandingkan non-perokok. CI tidak mencakup 0, sehingga perbedaan ini signifikan.
Relative Risk mengukur berapa kali lipat risiko kelompok terpapar dibandingkan kelompok referensi.
\[RR = \frac{\hat{p}_1}{\hat{p}_2}, \qquad SE(\ln RR) = \sqrt{\frac{1-\hat{p}_1}{n_1 \hat{p}_1} + \frac{1-\hat{p}_2}{n_2 \hat{p}_2}}\] \[CI_{95\%}(RR) = \exp\!\left[\ln(RR) \pm 1.96 \times SE(\ln RR)\right]\]
RR <- p_s / p_ns
SE_lnRR <- sqrt((1-p_s)/(n_smoker*p_s) + (1-p_ns)/(n_nonsmoker*p_ns))
CI_RR <- exp(log(RR) + c(-1,1)*z*SE_lnRR)
cat(sprintf("Relative Risk (RR) : %.4f\n95%% CI RR : (%.4f, %.4f)\n",
RR, CI_RR[1], CI_RR[2]))## Relative Risk (RR) : 1.9589
## 95% CI RR : (1.3517, 2.8387)
Interpretasi: Perokok memiliki risiko kanker paru 1.96 kali lebih tinggi dibandingkan non-perokok. CI (1.35, 2.84) tidak mencakup nilai 1, mengkonfirmasi hubungan yang signifikan.
Odds Ratio mengukur perbandingan odds kejadian antar kelompok. Khususnya berguna pada studi kasus-kontrol.
\[OR = \frac{ad}{bc}, \qquad SE(\ln OR) = \sqrt{\frac{1}{a}+\frac{1}{b}+\frac{1}{c}+\frac{1}{d}}\] \[CI_{95\%}(OR) = \exp\!\left[\ln(OR) \pm 1.96 \times SE(\ln OR)\right]\]
a <- 688; b <- 650; cc <- 21; d <- 59
OR <- (a*d)/(b*cc)
SE_lnOR <- sqrt(1/a + 1/b + 1/cc + 1/d)
CI_OR <- exp(log(OR) + c(-1,1)*z*SE_lnOR)
cat(sprintf("Odds Ratio (OR) : %.4f\n95%% CI OR : (%.4f, %.4f)\n",
OR, CI_OR[1], CI_OR[2]))## Odds Ratio (OR) : 2.9738
## 95% CI OR : (1.7867, 4.9494)
Interpretasi: Odds kejadian kanker paru pada perokok 2.97 kali lebih tinggi dibandingkan non-perokok. Nilai OR yang sangat jauh di atas 1 menandakan asosiasi positif yang kuat.
ringkasan <- data.frame(
Ukuran = c("RD", "RR", "OR"),
Estimasi = c(round(RD,4), round(RR,4), round(OR,4)),
CI_Bawah = c(round(CI_RD[1],4), round(CI_RR[1],4), round(CI_OR[1],4)),
CI_Atas = c(round(CI_RD[2],4), round(CI_RR[2],4), round(CI_OR[2],4)),
Mencakup_Null = c("Tidak (0)", "Tidak (1)", "Tidak (1)")
)
knitr::kable(ringkasan,
col.names = c("Ukuran Asosiasi", "Estimasi", "CI 95% Bawah",
"CI 95% Atas", "CI Mencakup Nilai Null?"),
caption = "Tabel 1.2 Ringkasan Ukuran Asosiasi — Kasus 1", align = "c")| Ukuran Asosiasi | Estimasi | CI 95% Bawah | CI 95% Atas | CI Mencakup Nilai Null? |
|---|---|---|---|---|
| RD | 0.2517 | 0.1516 | 0.3518 | Tidak (0) |
| RR | 1.9589 | 1.3517 | 2.8387 | Tidak (1) |
| OR | 2.9738 | 1.7867 | 4.9494 | Tidak (1) |
Uji ini membandingkan dua proporsi populasi secara langsung menggunakan statistik uji berbasis distribusi normal.
Hipotesis: \[H_0: p_{\text{Smoker}} = p_{\text{Non-Smoker}} \qquad H_1: p_{\text{Smoker}} \neq p_{\text{Non-Smoker}}\]
Statistik Uji: \[Z = \frac{\hat{p}_1 - \hat{p}_2}{\sqrt{\hat{p}(1-\hat{p})\left(\dfrac{1}{n_1}+\dfrac{1}{n_2}\right)}}, \quad \hat{p} = \frac{x_1+x_2}{n_1+n_2}\]
uji_prop <- prop.test(c(cancer_s, cancer_ns), c(n_smoker, n_nonsmoker),
alternative = "two.sided", correct = FALSE)
print(uji_prop)##
## 2-sample test for equality of proportions without continuity correction
##
## data: c(cancer_s, cancer_ns) out of c(n_smoker, n_nonsmoker)
## 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
Keputusan: p-value = 1.22e-05 \(< 0.05\) → Tolak \(H_0\)
Interpretasi: Terdapat perbedaan proporsi kejadian kanker paru yang signifikan secara statistik antara kelompok perokok dan non-perokok.
Uji chi-square menguji independensi dua variabel kategorikal berdasarkan selisih antara frekuensi observasi dan frekuensi harapan.
Hipotesis: \[H_0: \text{Status merokok dan kanker paru saling independen}\] \[H_1: \text{Status merokok dan kanker paru tidak independen}\]
Statistik Uji: \[\chi^2 = \sum_{i,j} \frac{(O_{ij} - E_{ij})^2}{E_{ij}}, \quad E_{ij} = \frac{n_{i.} \cdot n_{.j}}{n}\]
##
## Pearson's Chi-squared test
##
## data: tabel1
## X-squared = 19.129, df = 1, p-value = 1.222e-05
##
## Frekuensi Harapan:
## Status Kanker
## Status Merokok Cancer (+) Control (-)
## Smoker 669 669
## Non-Smoker 40 40
Keputusan: \(\chi^2\) = 19.1292, df = 1, p-value = 1.22e-05 \(< 0.05\) → Tolak \(H_0\)
Interpretasi: Terdapat hubungan yang signifikan antara kebiasaan merokok dan kejadian kanker paru. Semua frekuensi harapan > 5, sehingga asumsi uji terpenuhi.
Uji likelihood ratio (\(G^2\)) merupakan alternatif chi-square berbasis logaritma rasio kemungkinan, yang memberikan hasil lebih akurat pada sampel besar.
Hipotesis: (sama dengan uji chi-square)
Statistik Uji: \[G^2 = 2 \sum_{i,j} O_{ij} \ln\!\left(\frac{O_{ij}}{E_{ij}}\right)\]
O1 <- as.vector(tabel1)
E1 <- as.vector(uji_chisq1$expected)
G2_1 <- 2 * sum(O1 * log(O1 / E1))
df_G2_1 <- (nrow(tabel1)-1) * (ncol(tabel1)-1)
pval_G2_1 <- pchisq(G2_1, df = df_G2_1, lower.tail = FALSE)
cat(sprintf("Statistik G² : %.4f\nDerajat Bebas : %d\np-value : %s\n",
G2_1, df_G2_1, format(pval_G2_1, scientific=TRUE, digits=3)))## Statistik G² : 19.8780
## Derajat Bebas : 1
## p-value : 8.25e-06
Keputusan: \(G^2\) = 19.878, p-value = 8.25e-06 \(< 0.05\) → Tolak \(H_0\)
Interpretasi: Hasil konsisten dengan uji chi-square. Pada ukuran sampel besar seperti ini, \(G^2\) dan \(\chi^2\) memberikan nilai yang sangat berdekatan.
Fisher exact test menghitung probabilitas eksak berdasarkan distribusi hipergeometrik, tanpa bergantung pada asumsi distribusi besar.
##
## Fisher's Exact Test for Count Data
##
## data: tabel1
## 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
Keputusan: p-value = 1.48e-05 \(< 0.05\) → Tolak \(H_0\)
Interpretasi: Fisher exact test mengkonfirmasi adanya asosiasi signifikan. OR dari Fisher = 2.9716, dengan 95% CI: (1.7556, 5.2107).
perbandingan1 <- data.frame(
Uji = c("Uji Dua Proporsi", "Chi-Square (Pearson)", "Likelihood Ratio (G²)", "Fisher Exact Test"),
Pendekatan = c("Normal asimtotik", "Penyimpangan O vs E", "Rasio kemungkinan (log)", "Distribusi hipergeometrik eksak"),
Statistik = c(
sprintf("χ² = %.4f", uji_prop$statistic),
sprintf("χ² = %.4f", uji_chisq1$statistic),
sprintf("G² = %.4f", G2_1),
"— (eksak)"
),
p_value = c(
format(uji_prop$p.value, scientific=TRUE, digits=3),
format(uji_chisq1$p.value, scientific=TRUE, digits=3),
format(pval_G2_1, scientific=TRUE, digits=3),
format(uji_fisher1$p.value, scientific=TRUE, digits=3)
),
Keputusan = rep("Tolak Hâ‚€", 4),
Cocok_Untuk = c("n besar", "n besar, E ≥ 5", "n besar", "n kecil / sel kecil")
)
knitr::kable(perbandingan1,
col.names = c("Uji", "Pendekatan", "Statistik Uji", "p-value", "Keputusan", "Cocok Untuk"),
caption = "Tabel 1.3 Perbandingan Keempat Uji Hipotesis — Kasus 1",
align = "c")| Uji | Pendekatan | Statistik Uji | p-value | Keputusan | Cocok Untuk |
|---|---|---|---|---|---|
| Uji Dua Proporsi | Normal asimtotik | χ² = 19.1292 | 1.22e-05 | Tolak H₀ | n besar |
| Chi-Square (Pearson) | Penyimpangan O vs E | χ² = 19.1292 | 1.22e-05 | Tolak H₀ | n besar, E ≥ 5 |
| Likelihood Ratio (G²) | Rasio kemungkinan (log) | G² = 19.8780 | 8.25e-06 | Tolak H₀ | n besar |
| Fisher Exact Test | Distribusi hipergeometrik eksak | — (eksak) | 1.48e-05 | Tolak H₀ | n kecil / sel kecil |
Pembahasan: Keempat uji memberikan kesimpulan yang identik (semua tolak \(H_0\)). Ini wajar mengingat sampel cukup besar (\(n=1418\)) dan asosiasi yang sangat kuat. Nilai p-value seluruh uji berada di kisaran \(10^{-12}\) hingga \(10^{-10}\), jauh melampaui batas signifikansi 0.05. Fisher exact test direkomendasikan sebagai referensi karena tidak bergantung pada asumsi distribusi besar.
library(vcd)
par(mfrow = c(1, 2), mar = c(4, 4, 3, 2))
# Mosaic Plot
mosaic(tabel1,
shade = TRUE, legend = TRUE,
main = "Mosaic Plot: Merokok vs Kanker Paru",
labeling_args = list(set_varnames = c(
"Status Merokok" = "Status Merokok",
"Status Kanker" = "Status Kanker")))# Bar chart proporsi
prop_vals <- c(p_s, p_ns) * 100
barplot(prop_vals,
names.arg = c("Smoker", "Non-Smoker"),
col = c("#3a7bd5", "#bdd7ff"),
ylim = c(0, 65),
ylab = "Proporsi Kanker Paru (%)",
main = "Proporsi Kanker Paru per Kelompok",
border = NA,
cex.names = 1.1)
abline(h = 0, col = "gray40")
text(c(0.7, 1.9), prop_vals + 2.5,
labels = paste0(round(prop_vals, 1), "%"),
font = 2, col = c("#1e3a5f", "#3a7bd5"))Interpretasi Visualisasi: Mosaic plot menunjukkan sel Smoker–Cancer(+) berwarna biru (lebih besar dari harapan) dan sel Non-Smoker–Cancer(+) berwarna merah (lebih kecil dari harapan), mengindikasikan asosiasi positif yang kuat. Bar chart memperjelas selisih proporsi yang sangat besar antara kedua kelompok (~51.4% vs 26.2%).
Data mengenai hubungan antara gender dan kecenderungan identifikasi partai politik pada sampel pemilih Amerika Serikat.
tabel2 <- matrix(c(495, 272, 590,
330, 265, 498),
nrow = 2, byrow = TRUE,
dimnames = list(
"Gender" = c("Female", "Male"),
"Partai" = c("Democrat", "Republican", "Independent")
))
tabel2_df <- as.data.frame(tabel2)
tabel2_df$Total <- rowSums(tabel2_df)
tabel2_df <- rbind(tabel2_df, Total = colSums(tabel2_df))
knitr::kable(tabel2_df,
caption = "Tabel 2.1 Tabel Kontingensi 2×3: Gender dan Identifikasi Partai Politik",
align = "c")| Democrat | Republican | Independent | Total | |
|---|---|---|---|---|
| Female | 495 | 272 | 590 | 1357 |
| Male | 330 | 265 | 498 | 1093 |
| Total | 825 | 537 | 1088 | 2450 |
Frekuensi harapan dihitung dengan asumsi bahwa kedua variabel saling independen.
\[E_{ij} = \frac{n_{i.} \times n_{.j}}{n}\]
uji_chisq2 <- chisq.test(tabel2, correct = FALSE)
knitr::kable(round(uji_chisq2$expected, 4),
caption = "Tabel 2.2 Frekuensi Harapan ($E_{ij}$) — Kasus 2",
align = "c")| Democrat | Republican | Independent | |
|---|---|---|---|
| Female | 456.949 | 297.4322 | 602.6188 |
| Male | 368.051 | 239.5678 | 485.3812 |
Catatan: Semua frekuensi harapan > 5, sehingga asumsi uji chi-square terpenuhi.
Hipotesis: \[H_0: \text{Gender dan identifikasi partai politik saling independen}\] \[H_1: \text{Gender dan identifikasi partai politik tidak independen}\]
\[\chi^2 = \sum_{i=1}^{2}\sum_{j=1}^{3} \frac{(O_{ij} - E_{ij})^2}{E_{ij}}, \quad df = (r-1)(c-1) = (2-1)(3-1) = 2\]
##
## Pearson's Chi-squared test
##
## data: tabel2
## X-squared = 12.569, df = 2, p-value = 0.001865
Keputusan: \(\chi^2\) = 12.5693, df = 2, p-value = 0.0019
Interpretasi: p-value < 0.05 → Tolak H₀. Terdapat hubungan yang signifikan antara gender dan identifikasi partai politik. Perempuan dan laki-laki memiliki distribusi preferensi partai yang berbeda secara statistik.
Residual digunakan untuk mengidentifikasi sel mana yang paling berkontribusi pada ketidakindependenan.
Residual Pearson: \[r_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}}\]
Standardized Residual: \[d_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}(1-p_{i+})(1-p_{+j})}}\]
## ── Residual Pearson ──
| Democrat | Republican | Independent | |
|---|---|---|---|
| Female | 1.7801 | -1.4747 | -0.5140 |
| Male | -1.9834 | 1.6431 | 0.5728 |
##
## ── Standardized Residual ──
| Democrat | Republican | Independent | |
|---|---|---|---|
| Female | 3.2724 | -2.4986 | -1.0322 |
| Male | -3.2724 | 2.4986 | 1.0322 |
Interpretasi: Standardized residual dengan \(|d_{ij}| > 2\) menunjukkan sel yang berkontribusi signifikan terhadap ketidakindependenan. Nilai positif berarti observasi lebih banyak dari harapan; nilai negatif berarti lebih sedikit dari harapan.
std_resid2 <- uji_chisq2$stdres
par(mar = c(4, 5, 3, 2))
barplot(t(std_resid2),
beside = TRUE,
col = c("#3a7bd5", "#e05c5c", "#6dcfc2"),
legend.text = colnames(tabel2),
args.legend = list(x = "topright", bty = "n"),
main = "Standardized Residual: Gender × Partai Politik",
xlab = "Gender",
ylab = "Standardized Residual",
names.arg = c("Female", "Male"),
ylim = c(-5, 5),
border = NA)
abline(h = c(-2, 2), lty = 2, col = "gray50", lwd = 1.5)
abline(h = 0, col = "gray20")Interpretasi Plot: Garis putus-putus pada ±2 merupakan ambang batas signifikansi. Sel-sel yang melampaui batas ini adalah sel yang paling berkontribusi terhadap hubungan gender–partai.
Partisi chi-square memecah statistik keseluruhan menjadi komponen yang lebih interpretable, dengan derajat bebas yang aditif.
tabel_DR <- tabel2[, c("Democrat", "Republican")]
uji_DR <- chisq.test(tabel_DR, correct = FALSE)
cat(sprintf("χ² = %.4f\ndf = %d\np = %.4f\n",
uji_DR$statistic, uji_DR$parameter, uji_DR$p.value))## χ² = 11.5545
## df = 1
## p = 0.0007
tabel_DRI <- cbind(
"Dem+Rep" = rowSums(tabel2[, c("Democrat","Republican")]),
"Independent" = tabel2[, "Independent"]
)
rownames(tabel_DRI) <- rownames(tabel2)
uji_DRI <- chisq.test(tabel_DRI, correct = FALSE)
cat(sprintf("χ² = %.4f\ndf = %d\np = %.4f\n",
uji_DRI$statistic, uji_DRI$parameter, uji_DRI$p.value))## χ² = 1.0654
## df = 1
## p = 0.3020
total_part <- uji_DR$statistic + uji_DRI$statistic
part_tbl <- data.frame(
Sumber = c("Keseluruhan (2×3)", "Partisi 1: Dem vs Rep",
"Partisi 2: (Dem+Rep) vs Ind", "Total Partisi (1+2)"),
Chi_Square = round(c(uji_chisq2$statistic, uji_DR$statistic,
uji_DRI$statistic, total_part), 4),
df = c(uji_chisq2$parameter, uji_DR$parameter,
uji_DRI$parameter,
uji_DR$parameter + uji_DRI$parameter),
p_value = round(c(uji_chisq2$p.value, uji_DR$p.value,
uji_DRI$p.value,
pchisq(total_part, df=uji_DR$parameter+uji_DRI$parameter,
lower.tail=FALSE)), 4)
)
knitr::kable(part_tbl,
col.names = c("Sumber", "χ²", "df", "p-value"),
caption = "Tabel 2.5 Perbandingan Partisi Chi-Square — Kasus 2",
align = "c")| Sumber | χ² | df | p-value |
|---|---|---|---|
| Keseluruhan (2×3) | 12.5693 | 2 | 0.0019 |
| Partisi 1: Dem vs Rep | 11.5545 | 1 | 0.0007 |
| Partisi 2: (Dem+Rep) vs Ind | 1.0654 | 1 | 0.3020 |
| Total Partisi (1+2) | 12.6200 | 2 | 0.0018 |
Interpretasi Partisi:
- Total df partisi (1 + 1 = 2) sama dengan df keseluruhan → partisi valid dan exhaustif
- Nilai \(\chi^2\) total partisi ≈ \(\chi^2\) keseluruhan (perbedaan kecil akibat pembulatan)
- Setiap partisi menguji hipotesis yang lebih spesifik sehingga lebih informatif dari uji global
library(vcd)
par(mfrow = c(1, 2), mar = c(4, 4, 3, 2))
# Mosaic plot
mosaic(tabel2,
shade = TRUE, legend = TRUE,
main = "Mosaic Plot: Gender vs Partai Politik",
labeling_args = list(set_varnames = c(
Gender = "Gender", Partai = "Partai Politik")))# Stacked bar chart proporsi
prop2 <- prop.table(tabel2, margin = 1) * 100
barplot(t(prop2),
beside = FALSE,
col = c("#3a7bd5", "#e05c5c", "#6dcfc2"),
legend.text = colnames(tabel2),
args.legend = list(x = "topright", bty = "n"),
main = "Distribusi Identifikasi Partai per Gender (%)",
xlab = "Gender",
ylab = "Persentase (%)",
names.arg = c("Female", "Male"),
ylim = c(0, 115),
border = NA)kontribusi2 <- (tabel2 - uji_chisq2$expected)^2 / uji_chisq2$expected
pct2 <- round(kontribusi2 / uji_chisq2$statistic * 100, 2)
knitr::kable(pct2,
caption = "Tabel 2.6 Kontribusi Setiap Sel terhadap χ² (%)",
align = "c")| Democrat | Republican | Independent | |
|---|---|---|---|
| Female | 25.21 | 17.30 | 2.10 |
| Male | 31.30 | 21.48 | 2.61 |
Interpretasi: Sel dengan persentase kontribusi tertinggi adalah penentu utama hubungan antara gender dan identifikasi partai. Sel dengan kontribusi > 25% menandakan pola ketidakindependenan yang paling dominan.