Dalam berbagai bidang ilmu seperti kesehatan, ekonomi, dan ilmu sosial, banyak data yang bersifat kategori (categorical data). Data kategori biasanya menyatakan kelompok atau klasifikasi seperti jenis kelamin, status penyakit, status merokok, atau tingkat pendidikan.
Laporan ini membahas konsep dasar analisis data kategori, membangun tabel kontingensi, menghitung ukuran asosiasi secara manual, serta mengimplementasikannya menggunakan R.
Analisis data kategori (categorical data analysis) adalah sekumpulan metode statistika yang digunakan untuk menganalisis data yang diukur dalam skala nominal atau ordinal — yaitu data yang merepresentasikan kategori atau kelompok, bukan nilai numerik kontinu (Agresti, 2013).
Menurut Agresti (2013), analisis data kategori mencakup metode seperti:
Variabel kategori memiliki karakteristik sebagai berikut:
| Karakteristik | Penjelasan |
|---|---|
| Tipe skala | Nominal (tidak berurutan) atau Ordinal (berurutan) |
| Nilai | Berupa label/kategori, bukan angka kontinu |
| Operasi aritmatika | Tidak dapat dijumlahkan atau dirata-ratakan secara langsung |
| Representasi | Frekuensi atau proporsi dalam setiap kategori |
Contoh variabel kategori:
Beberapa contoh nyata penerapan analisis data kategori:
Epidemiologi: Menganalisis hubungan antara paparan faktor risiko (merokok) dengan kejadian penyakit (kanker paru), diukur menggunakan Odds Ratio dan Relative Risk (Rothman et al., 2008).
Ilmu Sosial: Meneliti hubungan antara tingkat pendidikan dan preferensi politik menggunakan uji chi-square (Agresti & Finlay, 2009).
Farmasi: Membandingkan efektivitas vaksin (divaksinasi/tidak) terhadap kejadian infeksi pada uji klinis acak (Fleiss et al., 2003).
Agresti, A. (2013). Categorical Data Analysis (3rd ed.). Wiley.
Rothman, K. J., Greenland, S., & Lash, T. L. (2008). Modern Epidemiology (3rd ed.). Lippincott Williams & Wilkins.
Fleiss, J. L., Levin, B., & Paik, M. C. (2003). Statistical Methods for Rates and Proportions (3rd ed.). Wiley.
Tabel kontingensi (contingency table) adalah suatu matriks yang menampilkan distribusi frekuensi dari dua atau lebih variabel kategori secara bersamaan. Tabel ini digunakan untuk menyelidiki apakah terdapat hubungan (asosiasi) antara variabel-variabel tersebut (Agresti, 2013).
Tabel kontingensi berukuran \(r \times c\) memiliki \(r\) baris (variabel baris) dan \(c\) kolom (variabel kolom), sehingga terdapat \(r \times c\) sel.
Berikut adalah struktur umum tabel kontingensi \(2 \times 2\):
| Kolom 1 (\(B_1\)) | Kolom 2 (\(B_2\)) | Total | |
|---|---|---|---|
| Baris 1 (\(A_1\)) | \(n_{11}\) | \(n_{12}\) | \(n_{1+}\) |
| Baris 2 (\(A_2\)) | \(n_{21}\) | \(n_{22}\) | \(n_{2+}\) |
| Total | \(n_{+1}\) | \(n_{+2}\) | \(n\) |
Keterangan:
Berikut contoh tabel hubungan antara Status Merokok dan Kanker Paru:
| Kanker Paru (Ya) | Kanker Paru (Tidak) | Total | |
|---|---|---|---|
| Merokok | 60 | 40 | 100 |
| Tidak Merokok | 20 | 80 | 100 |
| Total | 80 | 120 | 200 |
Joint distribution atau distribusi bersama adalah peluang dua variabel terjadi secara bersamaan. Untuk setiap sel \((i,j)\):
\[\pi_{ij} = P(A = A_i,\ B = B_j) = \frac{n_{ij}}{n}\]
Menggunakan data di atas:
\[\pi_{11} = P(\text{Merokok dan Kanker}) = \frac{60}{200} = 0.30\]
\[\pi_{12} = P(\text{Merokok dan Tidak Kanker}) = \frac{40}{200} = 0.20\]
\[\pi_{21} = P(\text{Tidak Merokok dan Kanker}) = \frac{20}{200} = 0.10\]
\[\pi_{22} = P(\text{Tidak Merokok dan Tidak Kanker}) = \frac{80}{200} = 0.40\]
Sifat: \(\sum_i \sum_j \pi_{ij} = 1\)
Distribusi marginal adalah distribusi peluang dari satu variabel, tanpa memperhatikan variabel lainnya.
Marginal baris (distribusi variabel \(A\)):
\[\pi_{i+} = P(A = A_i) = \sum_j \pi_{ij} = \frac{n_{i+}}{n}\]
\[\pi_{1+} = P(\text{Merokok}) = \frac{100}{200} = 0.50\]
\[\pi_{2+} = P(\text{Tidak Merokok}) = \frac{100}{200} = 0.50\]
Marginal kolom (distribusi variabel \(B\)):
\[\pi_{+j} = P(B = B_j) = \sum_i \pi_{ij} = \frac{n_{+j}}{n}\]
\[\pi_{+1} = P(\text{Kanker}) = \frac{80}{200} = 0.40\]
\[\pi_{+2} = P(\text{Tidak Kanker}) = \frac{120}{200} = 0.60\]
Peluang bersyarat adalah peluang suatu kejadian terjadi dengan syarat kejadian lain telah diketahui.
\[P(B = B_j \mid A = A_i) = \frac{\pi_{ij}}{\pi_{i+}} = \frac{n_{ij}}{n_{i+}}\]
Contoh:
\[P(\text{Kanker} \mid \text{Merokok}) = \frac{60}{100} = 0.60\]
\[P(\text{Kanker} \mid \text{Tidak Merokok}) = \frac{20}{100} = 0.20\]
Perbedaan peluang bersyarat ini mengindikasikan bahwa terdapat asosiasi antara kebiasaan merokok dan kejadian kanker paru.
Ukuran asosiasi digunakan untuk mengkuantifikasi kekuatan hubungan antara dua variabel kategori dalam tabel kontingensi.
Odds adalah rasio antara peluang suatu kejadian terjadi dibanding tidak terjadi.
\[\text{Odds} = \frac{P(\text{event})}{1 - P(\text{event})} = \frac{p}{1-p}\]
Jika menggunakan frekuensi dari tabel kontingensi \(2 \times 2\) dengan sel \(a, b, c, d\):
| Kejadian (+) | Kejadian (−) | |
|---|---|---|
| Terpapar | \(a\) | \(b\) |
| Tidak Terpapar | \(c\) | \(d\) |
Odds pada kelompok Terpapar:
\[\text{Odds}_{\text{terpapar}} = \frac{a/n_1}{b/n_1} = \frac{a}{b}\]
Odds pada kelompok Tidak Terpapar:
\[\text{Odds}_{\text{tidak terpapar}} = \frac{c/n_2}{d/n_2} = \frac{c}{d}\]
Interpretasi:
Odds Ratio adalah rasio antara odds pada kelompok terpapar dibanding odds pada kelompok tidak terpapar.
\[OR = \frac{\text{Odds}_{\text{terpapar}}}{\text{Odds}_{\text{tidak terpapar}}} = \frac{a/b}{c/d} = \frac{ad}{bc}\]
Interpretasi:
| Nilai OR | Interpretasi |
|---|---|
| \(OR = 1\) | Tidak ada asosiasi antara paparan dan kejadian |
| \(OR > 1\) | Paparan meningkatkan risiko kejadian (risk factor) |
| \(OR < 1\) | Paparan menurunkan risiko kejadian (protective factor) |
Nilai OR sering dilengkapi dengan Confidence Interval (CI) 95%:
\[\ln(OR) \pm 1.96 \times SE_{\ln(OR)}\]
di mana \(SE_{\ln(OR)} = \sqrt{\frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d}}\)
Relative Risk (atau Risk Ratio) adalah rasio antara peluang kejadian pada kelompok terpapar dibanding kelompok tidak terpapar.
\[RR = \frac{P(\text{kejadian} \mid \text{terpapar})}{P(\text{kejadian} \mid \text{tidak terpapar})} = \frac{a/(a+b)}{c/(c+d)}\]
Interpretasi:
| Nilai RR | Interpretasi |
|---|---|
| \(RR = 1\) | Tidak ada perbedaan risiko antara kedua kelompok |
| \(RR > 1\) | Kelompok terpapar memiliki risiko lebih tinggi |
| \(RR < 1\) | Kelompok terpapar memiliki risiko lebih rendah (protektif) |
Catatan: Relative Risk dapat dihitung langsung pada studi kohort dan uji klinis, tetapi tidak dapat dihitung secara langsung pada studi kasus-kontrol. Pada studi kasus-kontrol, digunakan Odds Ratio sebagai pendekatan (approximation) terhadap RR ketika prevalensi penyakit rendah (Rothman et al., 2008).
Sebuah studi kohort dilakukan untuk menyelidiki hubungan antara kebiasaan merokok dan kejadian kanker paru-paru. Total 200 subjek diamati selama 10 tahun.
| Kanker Paru (Ya) | Kanker Paru (Tidak) | Total | |
|---|---|---|---|
| Merokok | \(a = 60\) | \(b = 40\) | \(n_1 = 100\) |
| Tidak Merokok | \(c = 20\) | \(d = 80\) | \(n_2 = 100\) |
| Total | 80 | 120 | \(n = 200\) |
\[P(\text{Kanker} \mid \text{Merokok}) = \frac{a}{n_1} = \frac{60}{100} = 0.60\]
\[P(\text{Kanker} \mid \text{Tidak Merokok}) = \frac{c}{n_2} = \frac{20}{100} = 0.20\]
Perokok memiliki peluang terkena kanker paru sebesar 60%, sedangkan bukan perokok hanya 20%.
Odds merokok (terpapar):
\[\text{Odds}_{\text{merokok}} = \frac{a}{b} = \frac{60}{40} = 1.50\]
Artinya, pada kelompok perokok, untuk setiap 1 orang yang tidak terkena kanker paru, terdapat 1.5 orang yang terkena kanker paru.
Odds tidak merokok (tidak terpapar):
\[\text{Odds}_{\text{tidak merokok}} = \frac{c}{d} = \frac{20}{80} = 0.25\]
Artinya, pada kelompok bukan perokok, untuk setiap 1 orang yang terkena kanker paru, terdapat 4 orang yang tidak terkena kanker paru.
\[OR = \frac{ad}{bc} = \frac{60 \times 80}{40 \times 20} = \frac{4800}{800} = 6.00\]
Confidence Interval 95% untuk OR:
\[SE_{\ln(OR)} = \sqrt{\frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d}} = \sqrt{\frac{1}{60} + \frac{1}{40} + \frac{1}{20} + \frac{1}{80}}\]
\[= \sqrt{0.0167 + 0.0250 + 0.0500 + 0.0125} = \sqrt{0.1042} \approx 0.3228\]
\[\ln(OR) = \ln(6) \approx 1.7918\]
\[\text{CI bawah} = e^{1.7918 - 1.96 \times 0.3228} = e^{1.1591} \approx 3.19\]
\[\text{CI atas} = e^{1.7918 + 1.96 \times 0.3228} = e^{2.4245} \approx 11.29\]
\[\boxed{OR = 6.00;\ 95\%\ CI: (3.19,\ 11.29)}\]
\[RR = \frac{a/(a+b)}{c/(c+d)} = \frac{60/100}{20/100} = \frac{0.60}{0.20} = 3.00\]
\[\boxed{RR = 3.00}\]
# Membuat matriks data
data <- matrix(c(60, 40, 20, 80),
nrow = 2,
byrow = TRUE)
# Memberi nama baris dan kolom
rownames(data) <- c("Merokok", "Tidak Merokok")
colnames(data) <- c("Kanker", "Tidak Kanker")
# Menampilkan tabel
data## Kanker Tidak Kanker
## Merokok 60 40
## Tidak Merokok 20 80
| Kanker | Tidak Kanker | |
|---|---|---|
| Merokok | 60 | 40 |
| Tidak Merokok | 20 | 80 |
epitools# Install jika belum ada
if (!require(epitools)) install.packages("epitools")
library(epitools)
# Menghitung Odds Ratio
or_result <- oddsratio(data, method = "wald")
print(or_result)## $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 NA NA
## Tidak Merokok 6 3.187331 11.29472
##
## $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] "Unconditional MLE & normal approximation (Wald) CI"
## $data
## Kanker Tidak Kanker Total
## Merokok 60 40 100
## Tidak Merokok 20 80 100
## Total 80 120 200
##
## $measure
## NA
## risk ratio with 95% C.I. estimate lower upper
## Merokok 1 NA NA
## Tidak Merokok 2 1.543216 2.59199
##
## $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] "Unconditional MLE & normal approximation (Wald) CI"
a <- data[1, 1] # Merokok & Kanker
b <- data[1, 2] # Merokok & Tidak Kanker
c <- data[2, 1] # Tidak Merokok & Kanker
d <- data[2, 2] # Tidak Merokok & Tidak Kanker
# Odds masing-masing kelompok
odds_merokok <- a / b
odds_tidak_merokok <- c / d
# Odds Ratio
OR <- (a * d) / (b * c)
# Relative Risk
RR <- (a / (a + b)) / (c / (c + d))
cat("=== Hasil Perhitungan Manual ===\n")## === Hasil Perhitungan Manual ===
## Odds Merokok : 1.5
## Odds Tidak Merokok : 0.25
## Odds Ratio (OR) : 6
## Relative Risk (RR) : 3
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data
## X-squared = 31.688, df = 1, p-value = 1.811e-08
# Visualisasi distribusi frekuensi
library(ggplot2)
# Menyiapkan data frame
df <- data.frame(
Status_Merokok = rep(c("Merokok", "Tidak Merokok"), each = 2),
Kanker = rep(c("Kanker", "Tidak Kanker"), 2),
Frekuensi = c(60, 40, 20, 80)
)
ggplot(df, aes(x = Status_Merokok, y = Frekuensi, fill = Kanker)) +
geom_bar(stat = "identity", position = "dodge", width = 0.6) +
geom_text(aes(label = Frekuensi),
position = position_dodge(width = 0.6),
vjust = -0.5, size = 4) +
scale_fill_manual(values = c("#E74C3C", "#3498DB")) +
labs(
title = "Distribusi Kejadian Kanker Paru berdasarkan Status Merokok",
x = "Status Merokok",
y = "Frekuensi",
fill = "Status Kanker"
) +
theme_minimal(base_size = 13) +
ylim(0, 95)Berdasarkan hasil analisis:
Uji Chi-Square:
Odds Ratio:
Relative Risk:
Dari studi kohort ini, ditemukan bahwa:
Prevalensi kanker paru pada kelompok perokok adalah 60%, jauh lebih tinggi dibandingkan pada kelompok bukan perokok (20%).
Odds Ratio sebesar 6.00 menunjukkan bahwa perokok memiliki odds terkena kanker paru 6 kali lebih besar dibandingkan bukan perokok. Ini merupakan ukuran asosiasi yang sangat kuat dalam epidemiologi.
Relative Risk sebesar 3.00 menunjukkan bahwa risiko absolut terkena kanker paru pada perokok adalah 3 kali lipat dibandingkan bukan perokok.
Temuan ini konsisten dengan literatur ilmiah yang menyatakan rokok sebagai faktor risiko utama kanker paru-paru (WHO, 2023; IARC, 2020).
Dari perspektif kesehatan masyarakat, hasil ini memperkuat urgensi program pengendalian tembakau dan kampanye berhenti merokok sebagai strategi pencegahan kanker paru.
Analisis data kategori menggunakan tabel kontingensi \(2 \times 2\) telah berhasil dilakukan untuk menyelidiki hubungan antara kebiasaan merokok dan kejadian kanker paru. Hasil analisis menunjukkan:
Analisis ini mendemonstrasikan pentingnya ukuran asosiasi dalam mengkuantifikasi kekuatan hubungan antar variabel kategori dalam penelitian epidemiologi dan kesehatan masyarakat.
Agresti, A. (2013). Categorical Data Analysis (3rd ed.). John Wiley & Sons.
Fleiss, J. L., Levin, B., & Paik, M. C. (2003). Statistical Methods for Rates and Proportions (3rd ed.). Wiley-Interscience.
IARC. (2020). Tobacco smoking and cancer: IARC Monographs on the Evaluation of Carcinogenic Risks to Humans. International Agency for Research on Cancer.
Rothman, K. J., Greenland, S., & Lash, T. L. (2008). Modern Epidemiology (3rd ed.). Lippincott Williams & Wilkins.
WHO. (2023). Tobacco. World Health Organization. https://www.who.int/news-room/fact-sheets/detail/tobacco
Tabel kontingensi dua arah merupakan alat utama dalam analisis data kategori untuk mempelajari hubungan antara dua variabel kategori. Inferensi pada tabel kontingensi mencakup estimasi proporsi dan ukuran asosiasi, pengujian hipotesis independensi, serta interpretasi substantif hasil analisis.
Laporan ini menyajikan analisis inferensi pada dua kasus:
Seluruh analisis dilakukan menggunakan perangkat lunak R dan disajikan secara reprodusibel dalam laporan ini.
Data berikut menggambarkan hubungan antara status merokok dan kejadian kanker paru dari sebuah studi kasus-kontrol.
k1 <- matrix(c(688, 650, 21, 59), nrow = 2, byrow = TRUE)
rownames(k1) <- c("Smoker", "Non-Smoker")
colnames(k1) <- c("Cancer (+)", "Control (-)")
k1_df <- as.data.frame(k1)
k1_df$Total <- rowSums(k1)
k1_df <- rbind(k1_df, Total = colSums(k1_df))
kable(k1_df,
caption = "Tabel 1. Tabel Kontingensi 2x2: Status Merokok dan Kanker Paru",
align = "ccc") |>
kable_styling(bootstrap_options = c("striped", "hover", "bordered"),
full_width = FALSE, position = "center") |>
add_header_above(c(" " = 1, "Status Kanker" = 2, " " = 1))| Cancer (+) | Control (-) | Total | |
|---|---|---|---|
| Smoker | 688 | 650 | 1338 |
| Non-Smoker | 21 | 59 | 80 |
| Total | 709 | 709 | 1418 |
Proporsi kejadian kanker dihitung sebagai:
\[\hat{p}_i = \frac{n_{i1}}{n_{i+}}\]
a <- k1[1,1]; b <- k1[1,2]; n1 <- a + b
c <- k1[2,1]; d <- k1[2,2]; n2 <- c + d
p1 <- a / n1
p2 <- c / n2
cat(sprintf("Proporsi kanker pada Smoker : %.4f (%.2f%%)\n", p1, p1*100))## Proporsi kanker pada Smoker : 0.5142 (51.42%)
## Proporsi kanker pada Non-Smoker : 0.2625 (26.25%)
Proporsi kanker paru pada kelompok Smoker adalah 51.42%, sedangkan pada kelompok Non-Smoker hanya 26.25%.
ci_p1 <- prop.test(a, n1, conf.level = 0.95)$conf.int
ci_p2 <- prop.test(c, n2, conf.level = 0.95)$conf.int
cat(sprintf("CI 95%% Smoker : (%.4f, %.4f)\n", ci_p1[1], ci_p1[2]))## CI 95% Smoker : (0.4870, 0.5413)
## CI 95% Non-Smoker : (0.1733, 0.3748)
\[RD = \hat{p}_1 - \hat{p}_2, \quad SE_{RD} = \sqrt{\frac{\hat{p}_1(1-\hat{p}_1)}{n_1} + \frac{\hat{p}_2(1-\hat{p}_2)}{n_2}}\]
RD <- p1 - p2
SE_RD <- sqrt(p1*(1-p1)/n1 + p2*(1-p2)/n2)
ci_RD <- c(RD - 1.96*SE_RD, RD + 1.96*SE_RD)
cat(sprintf("RD : %.4f\n", RD))## RD : 0.2517
## CI 95% RD : (0.1516, 0.3518)
\[RR = \frac{\hat{p}_1}{\hat{p}_2}, \quad SE_{\ln RR} = \sqrt{\frac{1-\hat{p}_1}{a} + \frac{1-\hat{p}_2}{c}}\]
RR <- p1 / p2
SE_lnRR <- sqrt((1-p1)/a + (1-p2)/c)
ci_RR <- exp(c(log(RR) - 1.96*SE_lnRR, log(RR) + 1.96*SE_lnRR))
cat(sprintf("RR : %.4f\n", RR))## RR : 1.9589
## CI 95% RR : (1.3517, 2.8387)
\[OR = \frac{ad}{bc}, \quad SE_{\ln OR} = \sqrt{\frac{1}{a}+\frac{1}{b}+\frac{1}{c}+\frac{1}{d}}\]
OR <- (a*d)/(b*c)
SE_lnOR <- sqrt(1/a + 1/b + 1/c + 1/d)
ci_OR <- exp(c(log(OR) - 1.96*SE_lnOR, log(OR) + 1.96*SE_lnOR))
cat(sprintf("OR : %.4f\n", OR))## OR : 2.9738
## CI 95% OR : (1.7867, 4.9495)
| Ukuran | Estimasi | CI Bawah (95%) | CI Atas (95%) |
|---|---|---|---|
| Proporsi Smoker | 0.5142 | 0.4870 | 0.5413 |
| Proporsi Non-Smoker | 0.2625 | 0.1733 | 0.3748 |
| Risk Difference (RD) | 0.2517 | 0.1516 | 0.3518 |
| Relative Risk (RR) | 1.9589 | 1.3517 | 2.8387 |
| Odds Ratio (OR) | 2.9738 | 1.7867 | 4.9495 |
Interpretasi:
Hipotesis:
uji_prop <- prop.test(c(a, c), c(n1, n2),
alternative = "two.sided", correct = FALSE)
print(uji_prop)##
## 2-sample test for equality of proportions without continuity correction
##
## data: c(a, c) 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
Hipotesis:
\[\chi^2 = \sum_{ij} \frac{(O_{ij} - E_{ij})^2}{E_{ij}}\]
##
## Pearson's Chi-squared test
##
## data: k1
## X-squared = 19.129, df = 1, p-value = 1.222e-05
##
## Frekuensi Harapan:
## Cancer (+) Control (-)
## Smoker 669 669
## Non-Smoker 40 40
Hipotesis: sama dengan uji chi-square.
\[G^2 = 2\sum_{ij} O_{ij} \ln\!\left(\frac{O_{ij}}{E_{ij}}\right)\]
O <- as.vector(k1)
E <- as.vector(chi1$expected)
G2 <- 2 * sum(O * log(O / E))
df_G2 <- (nrow(k1)-1) * (ncol(k1)-1)
pv_G2 <- pchisq(G2, df = df_G2, lower.tail = FALSE)
cat(sprintf("G-square (G^2) : %.4f\n", G2))## G-square (G^2) : 19.8780
## df : 1
## p-value : 8.2544e-06
Hipotesis: sama dengan uji chi-square.
##
## Fisher's Exact Test for Count Data
##
## data: k1
## 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
Catatan: Fisher exact test menghitung probabilitas eksak berdasarkan distribusi hipergeometrik, tidak bergantung pada asumsi ukuran sampel besar.
| Aspek | Uji Dua Proporsi | Chi-Square | Likelihood Ratio | Fisher Exact |
|---|---|---|---|---|
| Hipotesis Nol | p1 = p2 | Independensi | Independensi | Independensi |
| Statistik Uji | z^2 | chi^2 | G^2 | Prob. eksak |
| Nilai Statistik | 19.1292 | 19.1292 | 19.8780 | — |
| p-value | 1.222e-05 | 1.222e-05 | 8.254e-06 | 1.476e-05 |
| Keputusan (a=0.05) | Tolak H0 | Tolak H0 | Tolak H0 | Tolak H0 |
Interpretasi: Keempat uji menghasilkan keputusan yang konsisten — \(H_0\) ditolak pada taraf signifikansi 5%. Nilai \(p\) yang sangat kecil pada semua uji memperkuat kesimpulan adanya asosiasi signifikan antara merokok dan kanker paru.
Perbedaan utama keempat uji:
df1 <- data.frame(
Status = rep(c("Smoker", "Non-Smoker"), each = 2),
Kanker = rep(c("Cancer (+)", "Control (-)"), 2),
n = c(688, 650, 21, 59),
Total = c(1338, 1338, 80, 80)
)
df1$Pct <- df1$n / df1$Total * 100
df1$Status <- factor(df1$Status, levels = c("Smoker", "Non-Smoker"))
ggplot(df1, aes(x = Status, y = Pct, fill = Kanker)) +
geom_bar(stat = "identity", position = "dodge", width = 0.6) +
geom_text(aes(label = sprintf("%.1f%%", Pct)),
position = position_dodge(width = 0.6),
vjust = -0.5, size = 4) +
scale_fill_manual(values = c("#E74C3C", "#3498DB")) +
labs(title = "Proporsi Kanker Paru Berdasarkan Status Merokok",
x = "Status Merokok", y = "Proporsi (%)", fill = "Status Kanker") +
theme_minimal(base_size = 13) +
ylim(0, 70)mosaic(k1, shade = TRUE, legend = TRUE,
main = "Mosaic Plot: Status Merokok vs Kanker Paru",
labeling = labeling_border(rot_labels = c(0, 0)),
gp_labels = gpar(fontsize = 12))Berdasarkan seluruh uji hipotesis yang dilakukan, terdapat asosiasi yang signifikan secara statistik antara kebiasaan merokok dan kejadian kanker paru (semua \(p\text{-value} < 0.001\)).
Data berikut menggambarkan hubungan antara gender dan identifikasi partai politik pada sampel 2.450 responden.
k2 <- matrix(c(495, 272, 590, 330, 265, 498),
nrow = 2, byrow = TRUE)
rownames(k2) <- c("Female", "Male")
colnames(k2) <- c("Democrat", "Republican", "Independent")
k2_df <- as.data.frame(k2)
k2_df$Total <- rowSums(k2)
k2_df <- rbind(k2_df, Total = colSums(k2_df))
kable(k2_df,
caption = "Tabel 4. Tabel Kontingensi 2x3: Gender dan Identifikasi Partai",
align = "cccc") |>
kable_styling(bootstrap_options = c("striped", "hover", "bordered"),
full_width = FALSE, position = "center") |>
add_header_above(c(" " = 1, "Identifikasi Partai" = 3, " " = 1))| Democrat | Republican | Independent | Total | |
|---|---|---|---|---|
| Female | 495 | 272 | 590 | 1357 |
| Male | 330 | 265 | 498 | 1093 |
| Total | 825 | 537 | 1088 | 2450 |
Frekuensi harapan dihitung dengan rumus:
\[E_{ij} = \frac{n_{i+} \cdot n_{+j}}{n}\]
chi2 <- chisq.test(k2, correct = FALSE)
E_df <- as.data.frame(round(chi2$expected, 2))
E_df$Total <- rowSums(E_df)
E_df <- rbind(E_df, Total = colSums(E_df))
kable(E_df,
caption = "Tabel 5. Frekuensi Harapan (Expected Frequencies)",
align = "cccc", digits = 2) |>
kable_styling(bootstrap_options = c("striped", "hover", "bordered"),
full_width = FALSE, position = "center")| Democrat | Republican | Independent | Total | |
|---|---|---|---|---|
| Female | 456.95 | 297.43 | 602.62 | 1357 |
| Male | 368.05 | 239.57 | 485.38 | 1093 |
| Total | 825.00 | 537.00 | 1088.00 | 2450 |
Semua frekuensi harapan \(> 5\), sehingga asumsi uji chi-square terpenuhi.
Hipotesis:
##
## Pearson's Chi-squared test
##
## data: k2
## X-squared = 12.569, df = 2, p-value = 0.001865
## Statistik chi^2 : 12.5693
## df : 2
## p-value : 1.8648e-03
cat(sprintf("Keputusan : %s\n",
ifelse(chi2$p.value < 0.05,
"Tolak H0 -- terdapat asosiasi signifikan",
"Gagal tolak H0")))## Keputusan : Tolak H0 -- terdapat asosiasi signifikan
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})}}\]
## Pearson Residual:
## 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
| Gender | Partai | Frek. Obs | Frek. Harapan | Pearson Res. | Std. Residual |
|---|---|---|---|---|---|
| Female | Democrat | 495 | 456.95 | 1.7801 | 3.2724 |
| Female | Republican | 272 | 297.43 | -1.4747 | -2.4986 |
| Female | Independent | 590 | 602.62 | -0.5140 | -1.0322 |
| Male | Democrat | 330 | 368.05 | -1.9834 | -3.2724 |
| Male | Republican | 265 | 239.57 | 1.6431 | 2.4986 |
| Male | Independent | 498 | 485.38 | 0.5728 | 1.0322 |
Interpretasi: Standardized residual dengan nilai absolut \(> 2\) mengindikasikan sel yang memberikan kontribusi signifikan terhadap nilai \(\chi^2\) keseluruhan.
ggplot(res_df, aes(x = Partai, y = `Std. Residual`, fill = Gender)) +
geom_bar(stat = "identity", position = "dodge", width = 0.6) +
geom_hline(yintercept = c(-2, 2), linetype = "dashed",
colour = "#E74C3C", linewidth = 0.6) +
geom_hline(yintercept = 0, colour = "#2C3E50", linewidth = 0.4) +
geom_text(aes(label = round(`Std. Residual`, 2)),
position = position_dodge(width = 0.6),
vjust = -0.5, size = 4) +
scale_fill_manual(values = c("Female" = "#E74C3C", "Male" = "#3498DB")) +
labs(title = "Standardized Residual: Gender x Identifikasi Partai",
subtitle = "Garis putus-putus menunjukkan batas +-2",
x = "Identifikasi Partai", y = "Standardized Residual") +
theme_minimal(base_size = 13) +
ylim(-4, 4)k2_p1 <- k2[, c("Democrat", "Republican")]
chi2_p1 <- chisq.test(k2_p1, correct = FALSE)
print(chi2_p1)##
## Pearson's Chi-squared test
##
## data: k2_p1
## X-squared = 11.555, df = 1, p-value = 0.0006758
cat(sprintf("chi^2 = %.4f, df = %d, p-value = %.4f\n",
chi2_p1$statistic, chi2_p1$parameter, chi2_p1$p.value))## chi^2 = 11.5545, df = 1, p-value = 0.0007
k2_p2 <- cbind(
DemRep = k2[, "Democrat"] + k2[, "Republican"],
Independent = k2[, "Independent"]
)
chi2_p2 <- chisq.test(k2_p2, correct = FALSE)
print(chi2_p2)##
## Pearson's Chi-squared test
##
## data: k2_p2
## X-squared = 1.0654, df = 1, p-value = 0.302
cat(sprintf("chi^2 = %.4f, df = %d, p-value = %.4f\n",
chi2_p2$statistic, chi2_p2$parameter, chi2_p2$p.value))## chi^2 = 1.0654, df = 1, p-value = 0.3020
## chi^2 Partisi 1 : 11.5545 (df = 1)
## chi^2 Partisi 2 : 1.0654 (df = 1)
cat(sprintf("Jumlah Partisi 1 + 2 : %.4f (df = %d)\n",
chi2_p1$statistic + chi2_p2$statistic,
chi2_p1$parameter + chi2_p2$parameter))## Jumlah Partisi 1 + 2 : 12.6200 (df = 2)
## chi^2 Keseluruhan (2x3) : 12.5693 (df = 2)
| Uji | Statistik chi^2 | df | p-value | Keputusan |
|---|---|---|---|---|
| Chi-square Keseluruhan (2x3) | 12.5693 | 2 | 1.865e-03 | Tolak H0 |
| Partisi 1: Democrat vs Republican | 11.5545 | 1 | 6.758e-04 | Tolak H0 |
| Partisi 2: (Dem+Rep) vs Independent | 1.0654 | 1 | 3.020e-01 | Tolak H0 |
Jumlah \(\chi^2\) dari kedua partisi mendekati nilai \(\chi^2\) keseluruhan dengan total df yang sama (\(df = 2\)). Hal ini mengkonfirmasi bahwa kedua partisi secara bersama-sama menjelaskan seluruh asosiasi dalam tabel \(2 \times 3\).
mosaic(k2, shade = TRUE, legend = TRUE,
main = "Mosaic Plot: Gender vs Identifikasi Partai Politik",
labeling = labeling_border(rot_labels = c(0, 0)),
gp_labels = gpar(fontsize = 12))Berdasarkan analisis standardized residual dan partisi chi-square:
Dengan demikian, perbedaan terbesar antara perempuan dan laki-laki terletak pada preferensi Democrat vs Republican, sebagaimana dikonfirmasi oleh Partisi 1.
Terdapat asosiasi yang signifikan antara gender dan identifikasi partai politik (uji chi-square keseluruhan: \(p < 0.05\)). Partisi chi-square mengkonfirmasi bahwa asosiasi signifikan ditemukan baik pada perbandingan Democrat vs Republican (Partisi 1) maupun (Democrat+Republican) vs Independent (Partisi 2).
Kategori yang paling berkontribusi adalah sel Female–Democrat dan Male–Republican. Perempuan cenderung lebih banyak mengidentifikasi diri sebagai Democrat, sedangkan laki-laki lebih banyak sebagai Republican.
Kasus 1 — Merokok dan Kanker Paru: Keempat metode uji secara konsisten menunjukkan adanya asosiasi positif yang signifikan. Perokok berisiko hampir dua kali lebih besar terkena kanker paru dibanding bukan perokok (\(RR = 1.96\); \(OR = 2.97\)).
Kasus 2 — Gender dan Identifikasi Partai: Terdapat asosiasi signifikan antara gender dan pilihan partai. Perbedaan terbesar terjadi pada preferensi Democrat vs Republican. Perempuan lebih condong ke Democrat, laki-laki ke Republican.
Agresti, A. (2013). Categorical Data Analysis (3rd ed.). John Wiley & Sons.
Rothman, K. J., Greenland, S., & Lash, T. L. (2008). Modern Epidemiology (3rd ed.). Lippincott Williams & Wilkins.
R Core Team. (2024). R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing. https://www.r-project.org
Program Studi S1 Statistika FMIPA Universitas Padjadjaran, 2026.