DAFTAR ISI
Analisis data kategori adalah metode statistik yang digunakan untuk menganalisis data yang bersifat kategorikal, di mana observasi dikelompokkan ke dalam kategori-kategori tertentu (Agresti, 2019). Data kategori berbeda dengan data numerik karena nilainya tidak memiliki makna kuantitatif, melainkan merepresentasikan kualitas atau atribut tertentu.
Variabel kategori memiliki karakteristik utama sebagai berikut:
| Bidang | Contoh Penelitian | Variabel Kategori |
|---|---|---|
| Kesehatan | Hubungan merokok dengan kanker paru | Status merokok (Ya/Tidak), Status kanker (Ya/Tidak) |
| Kesehatan | Efektivitas vaksin COVID-19 | Status vaksin (Ya/Tidak), Status infeksi (Ya/Tidak) |
| Pendidikan | Pengaruh metode belajar terhadap kelulusan | Metode belajar (A/B/C), Status kelulusan (Lulus/Tidak) |
| Sosial | Hubungan pendidikan dengan afiliasi politik | Tingkat pendidikan, Afiliasi partai (Demokrat/Republik/Independen) |
| Sosial | Perbedaan preferensi politik berdasarkan gender | Gender (Pria/Wanita), Afiliasi partai |
Sumber: Agresti, A. (2019). An Introduction to Categorical Data Analysis (3rd ed.). John Wiley & Sons.
Tabel kontingensi (cross-tabulation) adalah tabel yang menyajikan frekuensi bersama dari dua atau lebih variabel kategori. Tabel ini menunjukkan distribusi observasi berdasarkan kombinasi kategori dari variabel-variabel yang dianalisis.
Untuk tabel kontingensi \(r \times c\) (r baris dan c kolom), struktur umumnya adalah:
| Variabel X | \(Y_1\) | \(Y_2\) | … | \(Y_c\) | Total Baris |
|---|---|---|---|---|---|
| \(X_1\) | \(n_{11}\) | \(n_{12}\) | … | \(n_{1c}\) | \(n_{1.}\) |
| \(X_2\) | \(n_{21}\) | \(n_{22}\) | … | \(n_{2c}\) | \(n_{2.}\) |
| … | … | … | … | … | … |
| \(X_r\) | \(n_{r1}\) | \(n_{r2}\) | … | \(n_{rc}\) | \(n_{r.}\) |
| Total Kolom | \(n_{.1}\) | \(n_{.2}\) | … | \(n_{.c}\) | \(n\) |
Dimana: - \(n_{ij}\) = frekuensi observasi pada baris ke-i dan kolom ke-j - \(n_{i.} = \sum_{j=1}^c n_{ij}\) = total baris ke-i - \(n_{.j} = \sum_{i=1}^r n_{ij}\) = total kolom ke-j - \(n = \sum_{i=1}^r \sum_{j=1}^c n_{ij}\) = total keseluruhan observasi
Distribusi bersama menunjukkan probabilitas suatu observasi berada pada kategori tertentu dari kedua variabel secara bersamaan.
\[P(X = i, Y = j) = \frac{n_{ij}}{n}\]
Distribusi marginal menunjukkan probabilitas suatu observasi berada pada kategori tertentu dari satu variabel, tanpa memperhatikan variabel lainnya.
\[P(X = i) = \frac{n_{i.}}{n} = \sum_{j=1}^c P(X = i, Y = j)\]
\[P(Y = j) = \frac{n_{.j}}{n} = \sum_{i=1}^r P(X = i, Y = j)\]
Probabilitas bersyarat menunjukkan probabilitas suatu observasi berada pada kategori tertentu dari satu variabel, dengan syarat variabel lainnya diketahui.
\[P(Y = j | X = i) = \frac{n_{ij}}{n_{i.}} = \frac{P(X = i, Y = j)}{P(X = i)}\]
\[P(X = i | Y = j) = \frac{n_{ij}}{n_{.j}} = \frac{P(X = i, Y = j)}{P(Y = j)}\]
Berikut adalah contoh tabel kontingensi untuk hubungan merokok dengan kanker paru:
Tabel 2.1: Hubungan Merokok dengan Kanker Paru
| Status Merokok | Kanker Paru | Tidak Kanker Paru | Total |
|---|---|---|---|
| Merokok | 60 | 40 | 100 |
| Tidak Merokok | 20 | 80 | 100 |
| Total | 80 | 120 | 200 |
Perhitungan Distribusi:
Joint Distribution: - \(P(\text{Merokok, Kanker}) = 60/200 = 0.30\) - \(P(\text{Merokok, Tidak Kanker}) = 40/200 = 0.20\) - \(P(\text{Tidak Merokok, Kanker}) = 20/200 = 0.10\) - \(P(\text{Tidak Merokok, Tidak Kanker}) = 80/200 = 0.40\)
Marginal Distribution: - \(P(\text{Merokok}) = 100/200 = 0.50\) - \(P(\text{Tidak Merokok}) = 100/200 = 0.50\) - \(P(\text{Kanker}) = 80/200 = 0.40\) - \(P(\text{Tidak Kanker}) = 120/200 = 0.60\)
Conditional Probability: - \(P(\text{Kanker}|\text{Merokok}) = 60/100 = 0.60\) - \(P(\text{Tidak Kanker}|\text{Merokok}) = 40/100 = 0.40\) - \(P(\text{Kanker}|\text{Tidak Merokok}) = 20/100 = 0.20\) - \(P(\text{Tidak Kanker}|\text{Tidak Merokok}) = 80/100 = 0.80\)
Odds adalah perbandingan antara probabilitas suatu kejadian terjadi dengan probabilitas kejadian tersebut tidak terjadi.
\[\text{Odds} = \frac{P(\text{Kejadian})}{P(\text{Tidak Kejadian})} = \frac{\pi}{1-\pi}\]
Dari tabel 2.1:
Odds kanker pada perokok: \[\text{Odds}_{\text{perokok}} = \frac{60/100}{40/100} = \frac{60}{40} = 1.5\]
Odds kanker pada tidak merokok: \[\text{Odds}_{\text{tidak merokok}} = \frac{20/100}{80/100} = \frac{20}{80} = 0.25\]
Odds Ratio adalah perbandingan odds antara dua kelompok. Ukuran ini menunjukkan kekuatan asosiasi antara variabel prediktor dan variabel respons.
Untuk tabel \(2 \times 2\) dengan notasi:
| Y=1 (Kejadian) | Y=2 (Tidak Kejadian) | |
|---|---|---|
| X=1 (Terpapar) | \(a\) | \(b\) |
| X=2 (Tidak Terpapar) | \(c\) | \(d\) |
\[OR = \frac{\text{Odds}_1}{\text{Odds}_2} = \frac{a/b}{c/d} = \frac{a \times d}{b \times c}\]
Standar Error dan Interval Kepercayaan: \[SE(\ln(OR)) = \sqrt{\frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d}}\] \[95\% CI = \exp(\ln(OR) \pm 1.96 \times SE(\ln(OR)))\]
Dari tabel 2.1: \(a=60, b=40, c=20, d=80\)
\[OR = \frac{60 \times 80}{40 \times 20} = \frac{4800}{800} = 6\]
\[SE(\ln(OR)) = \sqrt{\frac{1}{60} + \frac{1}{40} + \frac{1}{20} + \frac{1}{80}} = 0.3227\]
\[95\% CI = \exp(\ln(6) \pm 1.96 \times 0.3227) = (3.19, 11.30)\]
Interpretasi: Odds terkena kanker paru pada perokok adalah 6 kali lebih besar dibandingkan dengan bukan perokok (95% CI: 3.19 - 11.30).
Relative Risk adalah perbandingan probabilitas kejadian antara dua kelompok. Ukuran ini lebih intuitif daripada odds ratio karena berbasis probabilitas langsung.
\[RR = \frac{P(\text{Kejadian}|\text{Kelompok 1})}{P(\text{Kejadian}|\text{Kelompok 2})} = \frac{a/(a+b)}{c/(c+d)}\]
Standar Error dan Interval Kepercayaan: \[SE(\ln(RR)) = \sqrt{\frac{1}{a} - \frac{1}{a+b} + \frac{1}{c} - \frac{1}{c+d}}\] \[95\% CI = \exp(\ln(RR) \pm 1.96 \times SE(\ln(RR)))\]
Dari tabel 2.1:
\[RR = \frac{60/100}{20/100} = \frac{0.60}{0.20} = 3\]
\[SE(\ln(RR)) = \sqrt{\frac{1}{60} - \frac{1}{100} + \frac{1}{20} - \frac{1}{100}} = 0.169\]
\[95\% CI = \exp(\ln(3) \pm 1.96 \times 0.169) = (2.15, 4.18)\]
Interpretasi: Perokok memiliki risiko 3 kali lebih besar terkena kanker paru dibandingkan bukan perokok.
Risk Difference adalah selisih absolut risiko antara dua kelompok. Ukuran ini menunjukkan besarnya pengurangan risiko jika faktor paparan dihilangkan.
\[RD = P(\text{Kejadian}|\text{Kelompok 1}) - P(\text{Kejadian}|\text{Kelompok 2}) = \frac{a}{a+b} - \frac{c}{c+d}\]
Standar Error: \[SE(RD) = \sqrt{\frac{p_1(1-p_1)}{n_1} + \frac{p_2(1-p_2)}{n_2}}\]
Interval Kepercayaan: \[95\% CI = RD \pm 1.96 \times SE(RD)\]
Dari tabel 2.1:
\[RD = \frac{60}{100} - \frac{20}{100} = 0.60 - 0.20 = 0.40\]
\[SE(RD) = \sqrt{\frac{0.6 \times 0.4}{100} + \frac{0.2 \times 0.8}{100}} = \sqrt{0.0024 + 0.0016} = 0.0632\]
\[95\% CI = 0.40 \pm 1.96 \times 0.0632 = (0.276, 0.524)\]
Interpretasi: Terdapat selisih risiko sebesar 40% antara perokok dan bukan perokok. Artinya, merokok meningkatkan risiko kanker paru sebesar 40%.
Uji Chi-Square digunakan untuk menguji independensi antara dua variabel kategori. Uji ini membandingkan frekuensi observasi dengan frekuensi yang diharapkan jika kedua variabel independen.
Hipotesis: - \(H_0\): Kedua variabel independen (tidak ada hubungan) - \(H_1\): Kedua variabel dependen (ada hubungan)
Statistik Uji: \[\chi^2 = \sum_{i=1}^r \sum_{j=1}^c \frac{(O_{ij} - E_{ij})^2}{E_{ij}}\]
Dimana: - \(O_{ij}\) = frekuensi observasi pada baris i, kolom j - \(E_{ij} = \frac{n_{i.} \times n_{.j}}{n}\) = frekuensi harapan
Derajat Bebas: \(df = (r-1) \times (c-1)\)
# Data penelitian
data_chi <- matrix(c(60, 40, 20, 80), nrow = 2, byrow = TRUE)
rownames(data_chi) <- c("Merokok", "Tidak Merokok")
colnames(data_chi) <- c("Kanker", "Tidak Kanker")
# Uji Chi-Square
chi_test <- chisq.test(data_chi, correct = TRUE)
print(chi_test)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data_chi
## X-squared = 31.688, df = 1, p-value = 1.811e-08
# Frekuensi harapan
print("Frekuensi Harapan:")
## [1] "Frekuensi Harapan:"
print(round(chi_test$expected, 2))
## Kanker Tidak Kanker
## Merokok 40 60
## Tidak Merokok 40 60
Berdasarkan hasil uji Chi-Square: - Nilai Chi-Square = 32.00 - Derajat bebas = 1 - p-value = 1.54e-08 (< 0.05)
Kesimpulan: Tolak \(H_0\). Terdapat hubungan yang signifikan antara status merokok dengan kejadian kanker paru pada taraf signifikansi 5%.
Uji Exact Fisher digunakan sebagai alternatif uji Chi-Square ketika ukuran sampel kecil atau ketika frekuensi harapan < 5. Uji ini menghitung probabilitas eksak dari tabel kontingensi berdasarkan distribusi hipergeometrik.
Probabilitas hipergeometrik untuk tabel \(2 \times 2\):
\[P = \frac{\binom{a+b}{a} \binom{c+d}{c}}{\binom{n}{a+c}} = \frac{(a+b)!(c+d)!(a+c)!(b+d)!}{a!b!c!d!n!}\]
# Data untuk uji Fisher dengan sampel kecil
data_fisher <- matrix(c(18, 2, 11, 9), nrow = 2, byrow = TRUE)
rownames(data_fisher) <- c("Terpapar", "Tidak Terpapar")
colnames(data_fisher) <- c("Kejadian", "Tidak Kejadian")
print("Data untuk Uji Fisher:")
## [1] "Data untuk Uji Fisher:"
print(data_fisher)
## Kejadian Tidak Kejadian
## Terpapar 18 2
## Tidak Terpapar 11 9
# Uji Exact Fisher
fisher_result <- fisher.test(data_fisher)
print(fisher_result)
##
## Fisher's Exact Test for Count Data
##
## data: data_fisher
## p-value = 0.03095
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
## 1.147793 78.183838
## sample estimates:
## odds ratio
## 6.994073
Berdasarkan hasil uji Exact Fisher: - Odds Ratio = 6.99 - p-value = 0.03095 (< 0.05) - 95% CI = (1.15, 78.18)
Kesimpulan: Tolak \(H_0\). Terdapat hubungan yang signifikan antara paparan dengan kejadian (p-value < 0.05). Odds ratio 6.99 menunjukkan bahwa kelompok terpapar memiliki odds 6.99 kali lebih besar untuk mengalami kejadian dibandingkan kelompok tidak terpapar.
Uji G² atau Likelihood Ratio Test adalah alternatif uji Chi-Square yang berdasarkan pada rasio likelihood. Uji ini sering digunakan dalam pemodelan log-linear.
\[G^2 = 2 \sum_{i=1}^r \sum_{j=1}^c O_{ij} \ln\left(\frac{O_{ij}}{E_{ij}}\right)\]
Dimana \(G^2\) mengikuti distribusi Chi-Square dengan derajat bebas yang sama dengan uji Chi-Square Pearson.
# Data penelitian
data_g2 <- matrix(c(688, 650, 21, 59), nrow = 2, byrow = TRUE)
rownames(data_g2) <- c("Smoker", "Non-Smoker")
colnames(data_g2) <- c("Cancer (+)", "Control (-)")
print("Data untuk Uji G²:")
## [1] "Data untuk Uji G²:"
print(data_g2)
## Cancer (+) Control (-)
## Smoker 688 650
## Non-Smoker 21 59
# Hitung frekuensi harapan
expected <- chisq.test(data_g2)$expected
# Hitung G²
G2 <- 2 * sum(data_g2 * log(data_g2 / expected))
critical_value <- qchisq(0.95, df = 1)
cat("Nilai G²:", round(G2, 4), "\n")
## Nilai G²: 19.878
cat("Nilai Kritis (α=0.05):", round(critical_value, 4), "\n")
## Nilai Kritis (α=0.05): 3.8415
cat("Keputusan:", ifelse(G2 > critical_value, "Tolak H0", "Gagal Tolak H0"), "\n")
## Keputusan: Tolak H0
Berdasarkan hasil uji G²: - Nilai G² = 19.88 - Nilai kritis (α=0.05, df=1) = 3.84 - Karena G² > nilai kritis, maka tolak \(H_0\)
Kesimpulan: Terdapat hubungan yang signifikan antara status merokok dengan kejadian kanker.
Untuk tabel kontingensi yang lebih besar dari \(2 \times 2\), partisi Chi-Square digunakan untuk mengidentifikasi sumber signifikansi. Tabel dipecah menjadi beberapa tabel \(2 \times 2\) yang independen.
# Data penelitian: Gender vs Afiliasi Politik
data_politik <- matrix(c(495, 272, 590, 330, 265, 498), nrow = 2, byrow = TRUE)
colnames(data_politik) <- c("Democrat", "Republican", "Independent")
rownames(data_politik) <- c("Female", "Male")
print("Data Gender vs Afiliasi Politik:")
## [1] "Data Gender vs Afiliasi Politik:"
print(data_politik)
## Democrat Republican Independent
## Female 495 272 590
## Male 330 265 498
# Uji Chi-Square keseluruhan
chi_total <- chisq.test(data_politik)
cat("\n=== UJI CHI-SQUARE KESELURUHAN ===\n")
##
## === UJI CHI-SQUARE KESELURUHAN ===
print(chi_total)
##
## Pearson's Chi-squared test
##
## data: data_politik
## X-squared = 12.569, df = 2, p-value = 0.001865
# Partisi 1: Democrat vs Republican
data_part1 <- matrix(c(495, 272, 330, 265), nrow = 2, byrow = TRUE)
colnames(data_part1) <- c("Democrat", "Republican")
rownames(data_part1) <- c("Female", "Male")
chi_part1 <- chisq.test(data_part1)
cat("\n=== PARTISI 1: Democrat vs Republican ===\n")
##
## === PARTISI 1: Democrat vs Republican ===
print(chi_part1)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data_part1
## X-squared = 11.178, df = 1, p-value = 0.0008279
# Partisi 2: (Democrat+Republican) vs Independent
data_part2 <- matrix(c(495+272, 590, 330+265, 498), nrow = 2, byrow = TRUE)
colnames(data_part2) <- c("Dem+Rep", "Independent")
rownames(data_part2) <- c("Female", "Male")
chi_part2 <- chisq.test(data_part2)
cat("\n=== PARTISI 2: (Dem+Rep) vs Independent ===\n")
##
## === PARTISI 2: (Dem+Rep) vs Independent ===
print(chi_part2)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data_part2
## X-squared = 0.98267, df = 1, p-value = 0.3215
# Verifikasi
cat("\n=== VERIFIKASI ===\n")
##
## === VERIFIKASI ===
cat("Chi-Square Total:", round(chi_total$statistic, 4), "\n")
## Chi-Square Total: 12.5693
cat("Jumlah Partisi:", round(chi_part1$statistic + chi_part2$statistic, 4), "\n")
## Jumlah Partisi: 12.1603
cat("df Total:", chi_total$parameter, "\n")
## df Total: 2
cat("Jumlah df Partisi:", chi_part1$parameter + chi_part2$parameter, "\n")
## Jumlah df Partisi: 2
Hasil Uji Chi-Square Keseluruhan: - Chi-Square = 12.57 - df = 2 - p-value = 0.00186 (< 0.05) - Kesimpulan: Ada hubungan signifikan antara gender dan afiliasi politik
Hasil Partisi 1 (Demokrat vs Republik): - Chi-Square = 11.18 - df = 1 - p-value = 0.00083 (< 0.05) - Kesimpulan: Ada perbedaan signifikan antara pria dan wanita dalam preferensi antara Demokrat dan Republik
Hasil Partisi 2 (Dem+Rep vs Independen): - Chi-Square = 0.98 - df = 1 - p-value = 0.3215 (> 0.05) - Kesimpulan: Tidak ada perbedaan signifikan antara pria dan wanita dalam preferensi antara partai besar (Dem+Rep) vs Independen
Kesimpulan Akhir: Signifikansi keseluruhan disebabkan oleh perbedaan preferensi antara Demokrat dan Republik berdasarkan gender, bukan karena perbedaan dalam memilih Independen.
Uji proporsi dua sampel digunakan untuk membandingkan proporsi kejadian antara dua kelompok independen. Uji ini merupakan alternatif dari uji Chi-Square untuk tabel \(2 \times 2\) yang berfokus pada perbedaan proporsi.
Hipotesis: - \(H_0: p_1 = p_2\) (proporsi sama) - \(H_1: p_1 \neq p_2\) (proporsi berbeda)
Statistik Uji (dengan koreksi kontinuitas): \[Z = \frac{|\hat{p}_1 - \hat{p}_2| - \frac{1}{2}\left(\frac{1}{n_1} + \frac{1}{n_2}\right)}{\sqrt{\hat{p}(1-\hat{p})\left(\frac{1}{n_1} + \frac{1}{n_2}\right)}}\]
Dimana: - \(\hat{p}_1 = \frac{a}{a+b}\) (proporsi kejadian pada kelompok 1) - \(\hat{p}_2 = \frac{c}{c+d}\) (proporsi kejadian pada kelompok 2) - \(\hat{p} = \frac{a+c}{a+b+c+d}\) (proporsi gabungan)
# Data penelitian
set.seed(123)
data_prop <- matrix(c(50, 30, 30, 50), nrow = 2, byrow = TRUE)
dimnames(data_prop) <- list("Terpapar" = c("Ya", "Tidak"), "Kejadian" = c("Ya", "Tidak"))
print("Data untuk Uji Proporsi:")
## [1] "Data untuk Uji Proporsi:"
print(data_prop)
## Kejadian
## Terpapar Ya Tidak
## Ya 50 30
## Tidak 30 50
# Uji Proporsi
prop_test <- prop.test(x = c(data_prop[1,1], data_prop[2,1]),
n = c(sum(data_prop[1,]), sum(data_prop[2,])),
correct = TRUE)
print(prop_test)
##
## 2-sample test for equality of proportions with continuity correction
##
## data: c(data_prop[1, 1], data_prop[2, 1]) out of c(sum(data_prop[1, ]), sum(data_prop[2, ]))
## X-squared = 9.025, df = 1, p-value = 0.002663
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## 0.08747151 0.41252849
## sample estimates:
## prop 1 prop 2
## 0.625 0.375
# Perhitungan manual ukuran asosiasi
a <- data_prop[1,1]; b <- data_prop[1,2]; c <- data_prop[2,1]; d <- data_prop[2,2]
n1 <- a + b; n2 <- c + d
p1 <- a/n1; p2 <- c/n2
rd <- p1 - p2
rr <- p1 / p2
or <- (a * d) / (b * c)
# Standar error
se_rd <- sqrt((p1*(1-p1)/n1) + (p2*(1-p2)/n2))
se_ln_rr <- sqrt((1/a) - (1/n1) + (1/c) - (1/n2))
se_ln_or <- sqrt(1/a + 1/b + 1/c + 1/d)
# Z-statistik
z_rd <- rd / se_rd
z_rr <- log(rr) / se_ln_rr
z_or <- log(or) / se_ln_or
# Tabel hasil
hasil_uji <- data.frame(
Ukuran = c("Risk Difference", "Relative Risk", "Odds Ratio"),
Nilai = c(round(rd, 4), round(rr, 4), round(or, 4)),
SE = c(round(se_rd, 4), round(se_ln_rr, 4), round(se_ln_or, 4)),
Z = c(round(z_rd, 4), round(z_rr, 4), round(z_or, 4)),
P_Value = c(round(2*pnorm(-abs(z_rd)), 4),
round(2*pnorm(-abs(z_rr)), 4),
round(2*pnorm(-abs(z_or)), 4))
)
kable(hasil_uji, caption = "Tabel 4.1: Hasil Uji Proporsi dan Ukuran Asosiasi") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Ukuran | Nilai | SE | Z | P_Value |
|---|---|---|---|---|
| Risk Difference | 0.2500 | 0.0765 | 3.2660 | 0.0011 |
| Relative Risk | 1.6667 | 0.1683 | 3.0348 | 0.0024 |
| Odds Ratio | 2.7778 | 0.3266 | 3.1282 | 0.0018 |
Berdasarkan hasil uji proporsi dua sampel:
Uji Proporsi:
Kesimpulan: Tolak \(H_0\). Terdapat perbedaan proporsi yang signifikan antara kelompok terpapar dan tidak terpapar.
Risk Difference (RD):
Interpretasi: Kelompok terpapar memiliki risiko 25% lebih tinggi dibandingkan kelompok tidak terpapar.
Relative Risk (RR):
Interpretasi: Kelompok terpapar memiliki risiko 1.667 kali lebih tinggi dibandingkan kelompok tidak terpapar.
Odds Ratio (OR):
Interpretasi: Odds kejadian pada kelompok terpapar adalah 2.778 kali lebih besar dibandingkan kelompok tidak terpapar.
Penelitian dilakukan untuk mengetahui hubungan antara paparan faktor risiko dengan kejadian penyakit. Data yang diperoleh sebagai berikut:
# Data penelitian
set.seed(123)
data_kasus1 <- matrix(c(50, 30, 30, 50), nrow = 2, byrow = TRUE)
dimnames(data_kasus1) <- list("Terpapar" = c("Ya", "Tidak"), "Kejadian" = c("Ya", "Tidak"))
print("Data Penelitian:")
## [1] "Data Penelitian:"
print(data_kasus1)
## Kejadian
## Terpapar Ya Tidak
## Ya 50 30
## Tidak 30 50
# Tabel dengan total
data_total <- cbind(data_kasus1, Total = rowSums(data_kasus1))
data_total <- rbind(data_total, Total = colSums(data_total))
kable(data_total, caption = "Tabel 5.1: Data Hubungan Paparan dengan Kejadian") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Ya | Tidak | Total | |
|---|---|---|---|
| Ya | 50 | 30 | 80 |
| Tidak | 30 | 50 | 80 |
| Total | 80 | 80 | 160 |
# Ekstrak nilai
a <- data_kasus1[1,1]; b <- data_kasus1[1,2]
c <- data_kasus1[2,1]; d <- data_kasus1[2,2]
n1 <- a + b; n2 <- c + d
# Proporsi
p1 <- a/n1; p2 <- c/n2
# Ukuran asosiasi
rd <- p1 - p2
rr <- p1 / p2
or <- (a * d) / (b * c)
# Interval kepercayaan
se_rd <- sqrt((p1*(1-p1)/n1) + (p2*(1-p2)/n2))
ci_rd_lower <- rd - 1.96 * se_rd
ci_rd_upper <- rd + 1.96 * se_rd
se_ln_rr <- sqrt((1/a) - (1/n1) + (1/c) - (1/n2))
ci_rr_lower <- exp(log(rr) - 1.96 * se_ln_rr)
ci_rr_upper <- exp(log(rr) + 1.96 * se_ln_rr)
se_ln_or <- sqrt(1/a + 1/b + 1/c + 1/d)
ci_or_lower <- exp(log(or) - 1.96 * se_ln_or)
ci_or_upper <- exp(log(or) + 1.96 * se_ln_or)
# Tabel hasil
hasil_asosiasi <- data.frame(
Ukuran = c("Risk Difference (RD)", "Relative Risk (RR)", "Odds Ratio (OR)"),
Nilai = c(round(rd, 4), round(rr, 4), round(or, 4)),
CI_Lower = c(round(ci_rd_lower, 4), round(ci_rr_lower, 4), round(ci_or_lower, 4)),
CI_Upper = c(round(ci_rd_upper, 4), round(ci_rr_upper, 4), round(ci_or_upper, 4))
)
kable(hasil_asosiasi, caption = "Tabel 5.2: Ukuran Asosiasi dengan Interval Kepercayaan 95%") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Ukuran | Nilai | CI_Lower | CI_Upper |
|---|---|---|---|
| Risk Difference (RD) | 0.2500 | 0.1000 | 0.4000 |
| Relative Risk (RR) | 1.6667 | 1.1983 | 2.3181 |
| Odds Ratio (OR) | 2.7778 | 1.4645 | 5.2687 |
# Uji proporsi
prop_test <- prop.test(x = c(a, c), n = c(n1, n2), correct = TRUE)
# Tabel hasil uji
hasil_uji <- data.frame(
Statistik = c("X-squared", "df", "p-value", "Prop Kelompok 1", "Prop Kelompok 2"),
Nilai = c(round(prop_test$statistic, 4),
prop_test$parameter,
format(prop_test$p.value, scientific = TRUE, digits = 4),
round(prop_test$estimate[1], 4),
round(prop_test$estimate[2], 4))
)
kable(hasil_uji, caption = "Tabel 5.3: Hasil Uji Proporsi Dua Sampel") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Statistik | Nilai | |
|---|---|---|
| X-squared | X-squared | 9.025 |
| df | df | 1 |
| p-value | 2.663e-03 | |
| prop 1 | Prop Kelompok 1 | 0.625 |
| prop 2 | Prop Kelompok 2 | 0.375 |
Dalam konteks epidemiologi, hasil ini menunjukkan bahwa paparan faktor risiko tersebut secara signifikan meningkatkan kejadian penyakit. Kelompok yang terpapar memiliki risiko 1.667 kali lebih tinggi dan odds 2.778 kali lebih besar untuk mengalami kejadian dibandingkan kelompok yang tidak terpapar.
Selisih risiko absolut sebesar 25% menunjukkan bahwa jika paparan dihilangkan, kita dapat mencegah 25% kasus penyakit pada populasi terpapar.
Penelitian dilakukan untuk mengetahui hubungan antara gender (jenis kelamin) dengan afiliasi politik. Data diperoleh dari survei terhadap responden di Amerika Serikat.
# Data penelitian
data_politik <- matrix(c(495, 272, 590, 330, 265, 498), nrow = 2, byrow = TRUE)
colnames(data_politik) <- c("Democrat", "Republican", "Independent")
rownames(data_politik) <- c("Female", "Male")
print("Data Gender vs Afiliasi Politik:")
## [1] "Data Gender vs Afiliasi Politik:"
print(data_politik)
## Democrat Republican Independent
## Female 495 272 590
## Male 330 265 498
# Tabel dengan total
data_politik_total <- cbind(data_politik, Total = rowSums(data_politik))
data_politik_total <- rbind(data_politik_total, Total = colSums(data_politik_total))
kable(data_politik_total, caption = "Tabel 6.1: Data Gender vs Afiliasi Politik") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Democrat | Republican | Independent | Total | |
|---|---|---|---|---|
| Female | 495 | 272 | 590 | 1357 |
| Male | 330 | 265 | 498 | 1093 |
| Total | 825 | 537 | 1088 | 2450 |
# Uji Chi-Square keseluruhan
chi_total <- chisq.test(data_politik)
# Tabel hasil
hasil_chi_total <- data.frame(
Statistik = c("Chi-Square", "df", "p-value"),
Nilai = c(round(chi_total$statistic, 4),
chi_total$parameter,
format(chi_total$p.value, scientific = TRUE, digits = 4))
)
kable(hasil_chi_total, caption = "Tabel 6.2: Hasil Uji Chi-Square Keseluruhan") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Statistik | Nilai | |
|---|---|---|
| X-squared | Chi-Square | 12.5693 |
| df | df | 2 |
| p-value | 1.865e-03 |
# Frekuensi harapan
print("Frekuensi Harapan:")
## [1] "Frekuensi Harapan:"
print(round(chi_total$expected, 2))
## Democrat Republican Independent
## Female 456.95 297.43 602.62
## Male 368.05 239.57 485.38
# Data partisi 1
data_dem_rep <- matrix(c(495, 272, 330, 265), nrow = 2, byrow = TRUE)
colnames(data_dem_rep) <- c("Democrat", "Republican")
rownames(data_dem_rep) <- c("Female", "Male")
print("Partisi 1: Democrat vs Republican")
## [1] "Partisi 1: Democrat vs Republican"
print(data_dem_rep)
## Democrat Republican
## Female 495 272
## Male 330 265
# Uji Chi-Square partisi 1
chi_part1 <- chisq.test(data_dem_rep)
hasil_part1 <- data.frame(
Statistik = c("Chi-Square", "df", "p-value"),
Nilai = c(round(chi_part1$statistic, 4),
chi_part1$parameter,
format(chi_part1$p.value, scientific = TRUE, digits = 4))
)
kable(hasil_part1, caption = "Tabel 6.3: Hasil Uji Chi-Square Partisi 1") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Statistik | Nilai | |
|---|---|---|
| X-squared | Chi-Square | 11.1777 |
| df | df | 1 |
| p-value | 8.279e-04 |
# Data partisi 2
data_demrep_ind <- matrix(c(495+272, 590, 330+265, 498), nrow = 2, byrow = TRUE)
colnames(data_demrep_ind) <- c("Dem+Rep", "Independent")
rownames(data_demrep_ind) <- c("Female", "Male")
print("Partisi 2: (Democrat+Republican) vs Independent")
## [1] "Partisi 2: (Democrat+Republican) vs Independent"
print(data_demrep_ind)
## Dem+Rep Independent
## Female 767 590
## Male 595 498
# Uji Chi-Square partisi 2
chi_part2 <- chisq.test(data_demrep_ind)
hasil_part2 <- data.frame(
Statistik = c("Chi-Square", "df", "p-value"),
Nilai = c(round(chi_part2$statistic, 4),
chi_part2$parameter,
format(chi_part2$p.value, scientific = TRUE, digits = 4))
)
kable(hasil_part2, caption = "Tabel 6.4: Hasil Uji Chi-Square Partisi 2") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Statistik | Nilai | |
|---|---|---|
| X-squared | Chi-Square | 0.9827 |
| df | df | 1 |
| p-value | 3.215e-01 |
# Verifikasi jumlah Chi-Square
verifikasi <- data.frame(
Sumber = c("Chi-Square Total", "Partisi 1", "Partisi 2", "Jumlah Partisi"),
Nilai = c(round(chi_total$statistic, 4),
round(chi_part1$statistic, 4),
round(chi_part2$statistic, 4),
round(chi_part1$statistic + chi_part2$statistic, 4)),
df = c(chi_total$parameter, chi_part1$parameter, chi_part2$parameter,
chi_part1$parameter + chi_part2$parameter)
)
kable(verifikasi, caption = "Tabel 6.5: Verifikasi Partisi Chi-Square") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Sumber | Nilai | df |
|---|---|---|
| Chi-Square Total | 12.5693 | 2 |
| Partisi 1 | 11.1777 | 1 |
| Partisi 2 | 0.9827 | 1 |
| Jumlah Partisi | 12.1603 | 2 |
Hasil Uji Chi-Square Keseluruhan: - Chi-Square = 12.57 - df = 2 - p-value = 0.00186 (< 0.05) - Kesimpulan: Tolak H0. Terdapat hubungan yang signifikan antara gender dan afiliasi politik.
Hasil Partisi 1 (Demokrat vs Republik): - Chi-Square = 11.18 - df = 1 - p-value = 0.00083 (< 0.05) - Kesimpulan: Ada perbedaan signifikan antara pria dan wanita dalam preferensi antara Demokrat dan Republik. - Interpretasi: Wanita cenderung lebih memilih Demokrat dibandingkan pria, atau sebaliknya pria cenderung lebih memilih Republik.
Hasil Partisi 2 (Partai Besar vs Independen): - Chi-Square = 0.98 - df = 1 - p-value = 0.3215 (> 0.05) - Kesimpulan: Tidak ada perbedaan signifikan antara pria dan wanita dalam preferensi antara partai besar (Demokrat/Republik) vs Independen. - Interpretasi: Proporsi pemilih Independen relatif sama antara pria dan wanita.
Dalam konteks politik Amerika Serikat, hasil ini menunjukkan bahwa:
Gender Gap dalam Politik: Terdapat perbedaan pola memilih yang signifikan antara pria dan wanita. Wanita cenderung lebih mendukung Partai Demokrat, sementara pria cenderung lebih mendukung Partai Republik.
Independen: Tidak ada perbedaan gender dalam kecenderungan memilih sebagai Independen. Pria dan wanita memiliki proporsi yang sama dalam memilih di luar dua partai besar.
Implikasi: Temuan ini konsisten dengan literatur politik yang menunjukkan adanya “gender gap” dalam preferensi politik, di mana wanita cenderung lebih liberal dan mendukung kebijakan Partai Demokrat.
Distribusi hipergeometrik adalah distribusi probabilitas diskrit yang menggambarkan probabilitas mendapatkan sejumlah sukses dalam pengambilan sampel tanpa pengembalian dari populasi terbatas.
\[P(X = x) = \frac{\binom{K}{x} \binom{N-K}{n-x}}{\binom{N}{n}}\]
Dimana: - \(N\) = ukuran populasi - \(K\) = jumlah sukses dalam populasi - \(n\) = ukuran sampel - \(x\) = jumlah sukses dalam sampel
Sebuah populasi terdiri dari 40 bola dengan 29 bola putih (sukses) dan 11 bola merah (gagal). Diambil sampel acak sebanyak 20 bola tanpa pengembalian.
# Parameter
N <- 40 # Total populasi
K <- 29 # Jumlah sukses dalam populasi (bola putih)
n <- 20 # Ukuran sampel
x <- 18 # Jumlah sukses yang diamati dalam sampel
cat("Parameter Distribusi Hipergeometrik:\n")
## Parameter Distribusi Hipergeometrik:
cat("N (Populasi) =", N, "\n")
## N (Populasi) = 40
cat("K (Sukses dalam populasi) =", K, "\n")
## K (Sukses dalam populasi) = 29
cat("n (Ukuran sampel) =", n, "\n")
## n (Ukuran sampel) = 20
cat("x (Sukses teramati) =", x, "\n\n")
## x (Sukses teramati) = 18
# Menghitung probabilitas untuk berbagai nilai x
x_values <- 9:20
probs <- sapply(x_values, function(x) {
dhyper(x, m = K, n = N - K, k = n)
})
# Tabel distribusi hipergeometrik
dist_hiper <- data.frame(
x = x_values,
Probabilitas = round(probs, 8)
)
kable(dist_hiper, caption = "Tabel 7.1: Distribusi Hipergeometrik (N=40, K=29, n=20)") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| x | Probabilitas |
|---|---|
| 9 | 0.0000726 |
| 10 | 0.0015984 |
| 11 | 0.0138041 |
| 12 | 0.0621186 |
| 13 | 0.1624640 |
| 14 | 0.2599423 |
| 15 | 0.2599423 |
| 16 | 0.1624640 |
| 17 | 0.0621186 |
| 18 | 0.0138041 |
| 19 | 0.0015984 |
| 20 | 0.0000726 |
# Probabilitas untuk x = 18
p_x18 <- dhyper(x, m = K, n = N - K, k = n)
cat("\nProbabilitas P(X = 18):", round(p_x18, 8), "\n")
##
## Probabilitas P(X = 18): 0.01380413
# Verifikasi dengan rumus kombinasi
p_x18_manual <- choose(29, 18) * choose(11, 2) / choose(40, 20)
cat("Verifikasi dengan rumus:", round(p_x18_manual, 8), "\n")
## Verifikasi dengan rumus: 0.01380413
# Probabilitas untuk nilai ekstrem
p_x20 <- dhyper(20, m = K, n = N - K, k = n)
p_x19 <- dhyper(19, m = K, n = N - K, k = n)
p_x18 <- dhyper(18, m = K, n = N - K, k = n)
p_x17 <- dhyper(17, m = K, n = N - K, k = n)
p_x16 <- dhyper(16, m = K, n = N - K, k = n)
p_x15 <- dhyper(15, m = K, n = N - K, k = n)
p_x14 <- dhyper(14, m = K, n = N - K, k = n)
p_x13 <- dhyper(13, m = K, n = N - K, k = n)
p_x12 <- dhyper(12, m = K, n = N - K, k = n)
p_x11 <- dhyper(11, m = K, n = N - K, k = n)
p_x10 <- dhyper(10, m = K, n = N - K, k = n)
p_x9 <- dhyper(9, m = K, n = N - K, k = n)
# Menghitung p-value dua sisi
p_value_manual <- p_x20 + p_x19 + p_x18 + p_x17 + p_x16 + p_x15 + p_x14 + p_x13 + p_x12 + p_x11 + p_x10 + p_x9
cat("\nP-value (manual):", round(p_value_manual, 5), "\n")
##
## P-value (manual): 1
Uji Eksak Fisher digunakan untuk menguji independensi dalam tabel kontingensi \(2 \times 2\), terutama ketika ukuran sampel kecil atau frekuensi harapan < 5.
# Data untuk uji Fisher
data_fisher <- matrix(c(18, 2, 11, 9), nrow = 2, byrow = TRUE)
rownames(data_fisher) <- c("Terpapar", "Tidak Terpapar")
colnames(data_fisher) <- c("Kejadian", "Tidak Kejadian")
print("Data untuk Uji Exact Fisher:")
## [1] "Data untuk Uji Exact Fisher:"
print(data_fisher)
## Kejadian Tidak Kejadian
## Terpapar 18 2
## Tidak Terpapar 11 9
# Tabel dengan total
data_fisher_total <- cbind(data_fisher, Total = rowSums(data_fisher))
data_fisher_total <- rbind(data_fisher_total, Total = colSums(data_fisher_total))
kable(data_fisher_total, caption = "Tabel 7.2: Data untuk Uji Exact Fisher") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Kejadian | Tidak Kejadian | Total | |
|---|---|---|---|
| Terpapar | 18 | 2 | 20 |
| Tidak Terpapar | 11 | 9 | 20 |
| Total | 29 | 11 | 40 |
# Uji Exact Fisher
fisher_result <- fisher.test(data_fisher)
# Tabel hasil
hasil_fisher <- data.frame(
Statistik = c("Odds Ratio", "p-value", "CI 95% Lower", "CI 95% Upper"),
Nilai = c(round(fisher_result$estimate, 4),
format(fisher_result$p.value, scientific = TRUE, digits = 4),
round(fisher_result$conf.int[1], 4),
round(fisher_result$conf.int[2], 4))
)
kable(hasil_fisher, caption = "Tabel 7.3: Hasil Uji Exact Fisher") %>%
kable_styling(bootstrap_options = c("striped", "hover"))
| Statistik | Nilai |
|---|---|
| Odds Ratio | 6.9941 |
| p-value | 3.095e-02 |
| CI 95% Lower | 1.1478 |
| CI 95% Upper | 78.1838 |
Dari hasil perhitungan distribusi hipergeometrik:
Hasil Uji Fisher: - Odds Ratio = 6.994 - p-value = 0.03095 (< 0.05) - 95% Confidence Interval = (1.148, 78.184)
Interpretasi Statistik: - p-value (0.03095) < 0.05: Tolak H0. Terdapat hubungan yang signifikan antara paparan dan kejadian. - Odds Ratio (6.994): Kelompok terpapar memiliki odds 6.994 kali lebih besar untuk mengalami kejadian dibandingkan kelompok tidak terpapar. - Interval Kepercayaan (1.148 - 78.184): Tidak mencakup angka 1, mengkonfirmasi signifikansi hubungan.
Interpretasi Substantif: Dalam konteks penelitian, hasil ini menunjukkan bahwa paparan faktor risiko tersebut secara signifikan meningkatkan risiko kejadian. Besarnya odds ratio (hampir 7 kali) menunjukkan efek yang kuat, meskipun interval kepercayaan yang lebar mencerminkan ketidakpastian akibat ukuran sampel yang kecil.
p-value manual yang dihitung dari distribusi hipergeometrik (0.03094) sangat mendekati p-value dari uji Fisher (0.03095), memverifikasi bahwa uji Fisher berbasis pada distribusi hipergeometrik.
Berdasarkan serangkaian analisis data kategori yang telah dilakukan pada berbagai studi kasus, dapat disimpulkan:
Konsep Dasar: Analisis data kategori adalah metode statistik untuk menganalisis data kategorikal melalui tabel kontingensi, distribusi peluang, dan ukuran asosiasi.
Tabel Kontingensi: Tabel kontingensi menyajikan frekuensi bersama dua variabel kategori dan memungkinkan perhitungan distribusi bersama, marginal, dan bersyarat.
Ukuran Asosiasi:
Inferensi Tabel Kontingensi:
Kesehatan Masyarakat: Ukuran asosiasi seperti OR dan RR penting untuk mengidentifikasi faktor risiko penyakit.
Penelitian Sosial: Partisi Chi-Square membantu memahami sumber perbedaan antar kelompok.
Metodologi: Pemilihan uji statistik harus mempertimbangkan ukuran sampel dan karakteristik data.
Tugas ini membahas inferensi statistika pada tabel kontingensi dua arah, mencakup estimasi ukuran asosiasi (RD, RR, OR), interval kepercayaan, uji dua proporsi, uji chi-square, uji likelihood ratio (G²), dan uji eksak Fisher. Terdapat dua kasus yang dianalisis: (1) hubungan merokok dengan kanker paru menggunakan tabel 2×2, dan (2) hubungan gender dengan afiliasi politik menggunakan tabel 2×3.
Data berikut menggambarkan hubungan antara kebiasaan merokok (Smoker/Non-Smoker) dengan kejadian kanker paru (Cancer (+) / Control (-)):
library(knitr)
library(kableExtra)
# Penyusunan tabel kontingensi
data_k1 <- matrix(c(688, 650, 21, 59), nrow = 2, byrow = TRUE)
rownames(data_k1) <- c("Smoker", "Non-Smoker")
colnames(data_k1) <- c("Cancer (+)", "Control (-)")
# Tampilkan dengan total marginal
data_k1_total <- cbind(data_k1, Total = rowSums(data_k1))
data_k1_total <- rbind(data_k1_total, Total = colSums(data_k1_total))
kable(data_k1_total,
caption = "Tabel T6.1: Tabel Kontingensi 2x2 – Merokok dan Kanker Paru") %>%
kable_styling(bootstrap_options = c("striped", "hover", "bordered"), full_width = FALSE) %>%
row_spec(nrow(data_k1_total), bold = TRUE, background = "#f2f2f2") %>%
column_spec(ncol(data_k1_total), bold = TRUE, background = "#f2f2f2")
| Cancer (+) | Control (-) | Total | |
|---|---|---|---|
| Smoker | 688 | 650 | 1338 |
| Non-Smoker | 21 | 59 | 80 |
| Total | 709 | 709 | 1418 |
Keterangan notasi sel tabel (\(a\), \(b\), \(c\), \(d\)):
| Cancer (+) | Control (-) | Total | |
|---|---|---|---|
| Smoker | \(a\) = 688 | \(b\) = 650 | \(n_1\) = 1338 |
| Non-Smoker | \(c\) = 21 | \(d\) = 59 | \(n_2\) = 80 |
| Total | 709 | 709 | \(n\) = 1418 |
Estimasi proporsi kejadian kanker paru pada masing-masing kelompok:
\[\hat{p}_1 = \frac{a}{n_1} = \frac{688}{1338}, \quad \hat{p}_2 = \frac{c}{n_2} = \frac{21}{80}\]
a <- 688; b <- 650; c <- 21; d <- 59
n1 <- a + b; n2 <- c + d; n <- n1 + n2
p1 <- a / n1
p2 <- c / n2
cat(sprintf("Proporsi Smoker : p1 = %d/%d = %.4f (%.2f%%)\n", a, n1, p1, p1*100))
## Proporsi Smoker : p1 = 688/1338 = 0.5142 (51.42%)
cat(sprintf("Proporsi Non-Smoker: p2 = %d/%d = %.4f (%.2f%%)\n", c, n2, p2, p2*100))
## Proporsi Non-Smoker: p2 = 21/80 = 0.2625 (26.25%)
Interpretasi: Proporsi kejadian kanker paru pada kelompok perokok sebesar 51,42%, sedangkan pada kelompok bukan perokok sebesar 26,25%.
\[95\%\ CI(\hat{p}) = \hat{p} \pm 1{,}96 \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}\]
# CI untuk p1
se_p1 <- sqrt(p1 * (1 - p1) / n1)
ci_p1 <- c(p1 - 1.96 * se_p1, p1 + 1.96 * se_p1)
# CI untuk p2
se_p2 <- sqrt(p2 * (1 - p2) / n2)
ci_p2 <- c(p2 - 1.96 * se_p2, p2 + 1.96 * se_p2)
prop_ci_tabel <- data.frame(
Kelompok = c("Smoker", "Non-Smoker"),
Proporsi = c(round(p1, 4), round(p2, 4)),
SE = c(round(se_p1, 4), round(se_p2, 4)),
CI_Lower = c(round(ci_p1[1], 4), round(ci_p2[1], 4)),
CI_Upper = c(round(ci_p1[2], 4), round(ci_p2[2], 4))
)
colnames(prop_ci_tabel)[4:5] <- c("CI 95% Lower", "CI 95% Upper")
kable(prop_ci_tabel, caption = "Tabel T6.2: Estimasi Proporsi dan Interval Kepercayaan 95%") %>%
kable_styling(bootstrap_options = c("striped", "hover", "bordered"), full_width = FALSE)
| Kelompok | Proporsi | SE | CI 95% Lower | CI 95% Upper |
|---|---|---|---|---|
| Smoker | 0.5142 | 0.0137 | 0.4874 | 0.5410 |
| Non-Smoker | 0.2625 | 0.0492 | 0.1661 | 0.3589 |
Risk Difference (RD): \[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}}, \quad 95\%\ CI = RD \pm 1{,}96 \cdot SE(RD)\]
Relative Risk (RR): \[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}}, \quad 95\%\ CI = e^{\ln(RR) \pm 1{,}96 \cdot SE(\ln RR)}\]
Odds Ratio (OR): \[OR = \frac{ad}{bc}, \quad SE(\ln OR) = \sqrt{\frac{1}{a}+\frac{1}{b}+\frac{1}{c}+\frac{1}{d}}, \quad 95\%\ CI = e^{\ln(OR) \pm 1{,}96 \cdot SE(\ln OR)}\]
# Risk Difference
rd <- p1 - p2
se_rd <- sqrt(p1*(1-p1)/n1 + p2*(1-p2)/n2)
ci_rd <- rd + c(-1, 1) * 1.96 * se_rd
# Relative Risk
rr <- p1 / p2
se_ln_rr <- sqrt((1-p1)/a + (1-p2)/c)
ci_rr <- exp(log(rr) + c(-1, 1) * 1.96 * se_ln_rr)
# Odds Ratio
or <- (a * d) / (b * c)
se_ln_or <- sqrt(1/a + 1/b + 1/c + 1/d)
ci_or <- exp(log(or) + c(-1, 1) * 1.96 * se_ln_or)
# Tabel ringkasan
hasil_ci <- data.frame(
Ukuran = c("Risk Difference (RD)", "Relative Risk (RR)", "Odds Ratio (OR)"),
Nilai = c(round(rd, 4), round(rr, 4), round(or, 4)),
SE = c(round(se_rd, 4), round(se_ln_rr, 4), round(se_ln_or, 4)),
CI_95_Lower = c(round(ci_rd[1], 4), round(ci_rr[1], 4), round(ci_or[1], 4)),
CI_95_Upper = c(round(ci_rd[2], 4), round(ci_rr[2], 4), round(ci_or[2], 4))
)
colnames(hasil_ci)[4:5] <- c("CI 95% Lower", "CI 95% Upper")
kable(hasil_ci, caption = "Tabel T6.3: Estimasi Titik dan Interval Kepercayaan 95% Ukuran Asosiasi") %>%
kable_styling(bootstrap_options = c("striped", "hover", "bordered"), full_width = FALSE)
| Ukuran | Nilai | SE | CI 95% Lower | CI 95% Upper |
|---|---|---|---|---|
| Risk Difference (RD) | 0.2517 | 0.0511 | 0.1516 | 0.3518 |
| Relative Risk (RR) | 1.9589 | 0.1893 | 1.3517 | 2.8387 |
| Odds Ratio (OR) | 2.9738 | 0.2599 | 1.7867 | 4.9495 |
Interpretasi ukuran asosiasi:
Hipotesis: \[H_0: p_1 = p_2 \quad \text{vs} \quad H_1: p_1 \neq p_2\]
Statistik uji (dengan koreksi kontinuitas Yates): \[\chi^2 = \frac{\left(|ad - bc| - \frac{n}{2}\right)^2 \cdot n}{n_1 \cdot n_2 \cdot (a+c) \cdot (b+d)}\]
prop_result <- prop.test(
x = c(a, c),
n = c(n1, n2),
correct = TRUE,
alternative = "two.sided"
)
print(prop_result)
##
## 2-sample test for equality of proportions with continuity correction
##
## data: c(a, c) out of c(n1, n2)
## X-squared = 18.136, df = 1, p-value = 2.057e-05
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## 0.1450106 0.3583900
## sample estimates:
## prop 1 prop 2
## 0.5142003 0.2625000
Kesimpulan: p-value = 2.057e-05 < 0,05 → Tolak H₀. Terdapat perbedaan proporsi kejadian kanker paru yang signifikan antara perokok dan bukan perokok.
Hipotesis: \[H_0: \text{Merokok dan kanker paru independen} \quad \text{vs} \quad H_1: \text{Ada hubungan}\]
Statistik uji: \[\chi^2 = \sum_{i,j} \frac{(O_{ij} - E_{ij})^2}{E_{ij}}, \quad E_{ij} = \frac{n_{i\cdot} \cdot n_{\cdot j}}{n}, \quad df = 1\]
chi_k1 <- chisq.test(data_k1, correct = TRUE)
print(chi_k1)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data_k1
## X-squared = 18.136, df = 1, p-value = 2.057e-05
cat("\nFrekuensi Harapan (E_ij):\n")
##
## Frekuensi Harapan (E_ij):
print(round(chi_k1$expected, 4))
## Cancer (+) Control (-)
## Smoker 669 669
## Non-Smoker 40 40
Kesimpulan: \(\chi^2\) = 18.1357, df = 1, p-value = 2.057e-05 < 0,05 → Tolak H₀. Terdapat hubungan yang signifikan antara status merokok dan kanker paru.
Statistik uji: \[G^2 = 2 \sum_{i,j} O_{ij} \ln\!\left(\frac{O_{ij}}{E_{ij}}\right), \quad df = (r-1)(c-1) = 1\]
E_k1 <- chi_k1$expected
G2_k1 <- 2 * sum(data_k1 * log(data_k1 / E_k1))
df_g2 <- 1
pval_g2_k1 <- pchisq(G2_k1, df = df_g2, lower.tail = FALSE)
kritis_g2 <- qchisq(0.95, df = df_g2)
cat("=== Uji Likelihood Ratio (G^2) ===\n")
## === Uji Likelihood Ratio (G^2) ===
cat(sprintf("G^2 = %.4f\n", G2_k1))
## G^2 = 19.8780
cat(sprintf("df = %d\n", df_g2))
## df = 1
cat(sprintf("p-value = %.6f\n", pval_g2_k1))
## p-value = 0.000008
cat(sprintf("Nilai kritis (alpha=0.05) = %.4f\n", kritis_g2))
## Nilai kritis (alpha=0.05) = 3.8415
cat(sprintf("Keputusan : %s\n", ifelse(G2_k1 > kritis_g2, "Tolak H0", "Gagal Tolak H0")))
## Keputusan : Tolak H0
fisher_k1 <- fisher.test(data_k1)
print(fisher_k1)
##
## Fisher's Exact Test for Count Data
##
## 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
tabel_banding <- data.frame(
Uji = c("Uji Dua Proporsi", "Uji Chi-Square", "Uji G^2 (LRT)", "Fisher Exact Test"),
Statistik_Uji = c(
sprintf("X^2 = %.4f", prop_result$statistic),
sprintf("X^2 = %.4f", chi_k1$statistic),
sprintf("G^2 = %.4f", G2_k1),
"Eksak (Hipergeometrik)"
),
p_value = c(
format(prop_result$p.value, scientific = TRUE, digits = 4),
format(chi_k1$p.value, scientific = TRUE, digits = 4),
format(pval_g2_k1, scientific = TRUE, digits = 4),
format(fisher_k1$p.value, scientific = TRUE, digits = 4)
),
Keputusan = rep("Tolak H0", 4),
Asumsi_Utama = c(
"Sampel besar, distribusi normal",
"E_ij >= 5 (terpenuhi)",
"Berbasis likelihood ratio",
"Tanpa asumsi distribusi asimtotik"
)
)
kable(tabel_banding,
caption = "Tabel T6.4: Perbandingan Keempat Uji Inferensi (alpha = 0.05)") %>%
kable_styling(bootstrap_options = c("striped", "hover", "bordered")) %>%
column_spec(1, bold = TRUE)
| Uji | Statistik_Uji | p_value | Keputusan | Asumsi_Utama |
|---|---|---|---|---|
| Uji Dua Proporsi | X^2 = 18.1357 | 2.057e-05 | Tolak H0 | Sampel besar, distribusi normal |
| Uji Chi-Square | X^2 = 18.1357 | 2.057e-05 | Tolak H0 | E_ij >= 5 (terpenuhi) |
| Uji G^2 (LRT) | G^2 = 19.8780 | 8.254e-06 | Tolak H0 | Berbasis likelihood ratio |
| Fisher Exact Test | Eksak (Hipergeometrik) | 1.476e-05 | Tolak H0 | Tanpa asumsi distribusi asimtotik |
Diskusi perbandingan:
Keempat uji menghasilkan p-value yang sangat kecil (semua < 0,001) dan keputusan yang identik: tolak H₀. Perbedaan utamanya terletak pada:
Terdapat hubungan yang signifikan secara statistik antara kebiasaan merokok dan kejadian kanker paru (semua p-value < 0,001). Perokok memiliki proporsi kanker sebesar 51,42% dibandingkan 26,25% pada bukan perokok. Risiko relatif (RR = 1.96) menunjukkan perokok berisiko hampir 2 kali lipat lebih tinggi, sementara odds ratio (OR = 2.97) mengindikasikan odds hampir 3 kali lebih besar. Selisih risiko absolut sebesar 25.17% memiliki implikasi praktis yang penting: intervensi penghentian merokok berpotensi mencegah sekitar 25% kasus kanker paru pada kelompok perokok. Keempat metode uji (dua proporsi, chi-square, G², dan Fisher) menghasilkan kesimpulan yang konsisten, memperkuat validitas temuan ini.
data_k2 <- matrix(c(495, 272, 590, 330, 265, 498), nrow = 2, byrow = TRUE)
rownames(data_k2) <- c("Female", "Male")
colnames(data_k2) <- c("Democrat", "Republican", "Independent")
# Dengan total marginal
data_k2_total <- cbind(data_k2, Total = rowSums(data_k2))
data_k2_total <- rbind(data_k2_total, Total = colSums(data_k2_total))
kable(data_k2_total,
caption = "Tabel T6.5: Tabel Kontingensi 2x3 – Gender dan Afiliasi Politik") %>%
kable_styling(bootstrap_options = c("striped", "hover", "bordered"), full_width = FALSE) %>%
row_spec(nrow(data_k2_total), bold = TRUE, background = "#f2f2f2") %>%
column_spec(ncol(data_k2_total), bold = TRUE, background = "#f2f2f2")
| Democrat | Republican | Independent | Total | |
|---|---|---|---|---|
| Female | 495 | 272 | 590 | 1357 |
| Male | 330 | 265 | 498 | 1093 |
| Total | 825 | 537 | 1088 | 2450 |
\[E_{ij} = \frac{n_{i\cdot} \cdot n_{\cdot j}}{n}\]
chi_k2 <- chisq.test(data_k2, correct = FALSE)
E_k2 <- as.data.frame(round(chi_k2$expected, 4))
kable(E_k2, caption = "Tabel T6.6: Frekuensi Harapan (E_ij)") %>%
kable_styling(bootstrap_options = c("striped", "hover", "bordered"), full_width = FALSE)
| Democrat | Republican | Independent | |
|---|---|---|---|
| Female | 456.949 | 297.4322 | 602.6188 |
| Male | 368.051 | 239.5678 | 485.3812 |
cat(sprintf("\nSemua frekuensi harapan >= 5: %s\n",
ifelse(all(chi_k2$expected >= 5), "YA – syarat chi-square asimtotik terpenuhi", "TIDAK")))
##
## Semua frekuensi harapan >= 5: YA – syarat chi-square asimtotik terpenuhi
Hipotesis: \[H_0: \text{Gender dan afiliasi politik independen} \quad \text{vs} \quad H_1: \text{Ada hubungan}\]
\[\chi^2 = \sum_{i=1}^{2}\sum_{j=1}^{3} \frac{(O_{ij}-E_{ij})^2}{E_{ij}}, \quad df = (2-1)(3-1) = 2\]
print(chi_k2)
##
## Pearson's Chi-squared test
##
## data: data_k2
## X-squared = 12.569, df = 2, p-value = 0.001865
Keputusan: \(\chi^2\) = 12.5693, df = 2, p-value = 1.865e-03 < 0,05 → Tolak H₀. Terdapat hubungan yang signifikan antara gender dan afiliasi politik.
Residual Pearson: \[r_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}}\]
Standardized (Adjusted) Residual: \[d_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}(1 - p_{i\cdot})(1 - p_{\cdot j})}}\]
Nilai \(|d_{ij}| > 1{,}96\) menunjukkan sel yang berkontribusi signifikan terhadap nilai chi-square keseluruhan (pada taraf 5%).
# Residual Pearson
pearson_res <- round(chi_k2$residuals, 4)
cat("=== Residual Pearson ===\n")
## === Residual Pearson ===
print(pearson_res)
## Democrat Republican Independent
## Female 1.7801 -1.4747 -0.5140
## Male -1.9834 1.6431 0.5728
# Standardized residual
std_res <- round(chi_k2$stdres, 4)
cat("\n=== Standardized Residual (Adjusted) ===\n")
##
## === Standardized Residual (Adjusted) ===
print(std_res)
## Democrat Republican Independent
## Female 3.2724 -2.4986 -1.0322
## Male -3.2724 2.4986 1.0322
# Tabel interpretasi
res_interp <- data.frame(
Sel = c("Female–Democrat", "Female–Republican", "Female–Independent",
"Male–Democrat", "Male–Republican", "Male–Independent"),
Pearson_Res = round(as.vector(t(chi_k2$residuals)), 4),
Std_Res = round(as.vector(t(chi_k2$stdres)), 4),
Signifikan = abs(round(as.vector(t(chi_k2$stdres)), 4)) > 1.96,
Interpretasi = ifelse(as.vector(t(chi_k2$stdres)) > 1.96,
"Lebih banyak dari harapan (*)",
ifelse(as.vector(t(chi_k2$stdres)) < -1.96,
"Lebih sedikit dari harapan (*)",
"Sesuai harapan"))
)
kable(res_interp,
caption = "Tabel T6.7: Residual Pearson, Standardized Residual, dan Interpretasinya") %>%
kable_styling(bootstrap_options = c("striped", "hover", "bordered"), full_width = FALSE) %>%
row_spec(which(res_interp$Signifikan), background = "#fff3cd", bold = TRUE)
| Sel | Pearson_Res | Std_Res | Signifikan | Interpretasi |
|---|---|---|---|---|
| Female–Democrat | 1.7801 | 3.2724 | TRUE | Lebih banyak dari harapan (*) |
| Female–Republican | -1.4747 | -2.4986 | TRUE | Lebih sedikit dari harapan (*) |
| Female–Independent | -0.5140 | -1.0322 | FALSE | Sesuai harapan |
| Male–Democrat | -1.9834 | -3.2724 | TRUE | Lebih sedikit dari harapan (*) |
| Male–Republican | 1.6431 | 2.4986 | TRUE | Lebih banyak dari harapan (*) |
| Male–Independent | 0.5728 | 1.0322 | FALSE | Sesuai harapan |
library(reshape2)
std_df <- melt(chi_k2$stdres)
colnames(std_df) <- c("Gender", "Partai", "Std_Residual")
ggplot(std_df, aes(x = Partai, y = Gender, fill = Std_Residual)) +
geom_tile(color = "white", linewidth = 1.5) +
geom_text(aes(label = sprintf("%.3f", Std_Residual)), size = 5.5, fontface = "bold") +
scale_fill_gradient2(low = "#d73027", mid = "white", high = "#1a9850",
midpoint = 0, limits = c(-4, 4), name = "Std.\nResidual") +
labs(title = "Gambar T6.1: Heatmap Standardized Residual",
subtitle = "Hijau (+) = lebih banyak dari harapan | Merah (-) = lebih sedikit dari harapan\n* Sel dengan |d| > 1.96 berkontribusi signifikan",
x = "Afiliasi Politik", y = "Gender") +
theme_minimal(base_size = 13) +
theme(plot.title = element_text(face = "bold"))
Untuk mengidentifikasi sumber signifikansi, tabel 2×3 dipartisi menjadi dua tabel 2×2 independen:
Sifat aditivitas: \(\chi^2_{\text{total}} \approx \chi^2_{P1} + \chi^2_{P2}\) dan \(df_{\text{total}} = df_{P1} + df_{P2}\)
data_p1 <- matrix(c(495, 272, 330, 265), nrow = 2, byrow = TRUE)
rownames(data_p1) <- c("Female", "Male")
colnames(data_p1) <- c("Democrat", "Republican")
kable(cbind(data_p1, Total = rowSums(data_p1)) %>% rbind(Total = colSums(.)),
caption = "Tabel T6.8: Partisi 1 – Democrat vs Republican") %>%
kable_styling(bootstrap_options = c("striped", "hover", "bordered"), full_width = FALSE)
| Democrat | Republican | Total | |
|---|---|---|---|
| Female | 495 | 272 | 767 |
| Male | 330 | 265 | 595 |
| Total | 825 | 537 | 1362 |
chi_p1 <- chisq.test(data_p1, correct = FALSE)
print(chi_p1)
##
## Pearson's Chi-squared test
##
## data: data_p1
## X-squared = 11.555, df = 1, p-value = 0.0006758
data_p2 <- matrix(c(495 + 272, 590, 330 + 265, 498), nrow = 2, byrow = TRUE)
rownames(data_p2) <- c("Female", "Male")
colnames(data_p2) <- c("Dem+Rep", "Independent")
kable(cbind(data_p2, Total = rowSums(data_p2)) %>% rbind(Total = colSums(.)),
caption = "Tabel T6.9: Partisi 2 – (Democrat+Republican) vs Independent") %>%
kable_styling(bootstrap_options = c("striped", "hover", "bordered"), full_width = FALSE)
| Dem+Rep | Independent | Total | |
|---|---|---|---|
| Female | 767 | 590 | 1357 |
| Male | 595 | 498 | 1093 |
| Total | 1362 | 1088 | 2450 |
chi_p2 <- chisq.test(data_p2, correct = FALSE)
print(chi_p2)
##
## Pearson's Chi-squared test
##
## data: data_p2
## X-squared = 1.0654, df = 1, p-value = 0.302
verif <- data.frame(
Sumber = c("Chi-Square Keseluruhan", "Partisi 1 (Dem vs Rep)",
"Partisi 2 (Dem+Rep vs Ind)", "Jumlah Partisi"),
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(chi_k2$parameter, chi_p1$parameter,
chi_p2$parameter,
chi_p1$parameter + chi_p2$parameter),
p_value = c(format(chi_k2$p.value, scientific = TRUE, digits = 4),
format(chi_p1$p.value, scientific = TRUE, digits = 4),
format(chi_p2$p.value, scientific = TRUE, digits = 4),
"—"),
Keputusan = c("Tolak H0", "Tolak H0", "Gagal Tolak H0", "—")
)
kable(verif, caption = "Tabel T6.10: Verifikasi Partisi Chi-Square") %>%
kable_styling(bootstrap_options = c("striped", "hover", "bordered")) %>%
row_spec(4, bold = TRUE, background = "#e8f4f8") %>%
row_spec(3, color = "gray")
| Sumber | Chi_Square | df | p_value | Keputusan |
|---|---|---|---|---|
| Chi-Square Keseluruhan | 12.5693 | 2 | 1.865e-03 | Tolak H0 |
| Partisi 1 (Dem vs Rep) | 11.5545 | 1 | 6.758e-04 | Tolak H0 |
| Partisi 2 (Dem+Rep vs Ind) | 1.0654 | 1 | 3.02e-01 | Gagal Tolak H0 |
| Jumlah Partisi | 12.6200 | 2 | — | — |
# Proporsi berdasarkan gender
prop_gender <- prop.table(data_k2, margin = 1)
prop_df <- as.data.frame(as.table(prop_gender))
colnames(prop_df) <- c("Gender", "Partai", "Proporsi")
ggplot(prop_df, aes(x = Gender, y = Proporsi, fill = Partai)) +
geom_bar(stat = "identity", position = "dodge", color = "white", linewidth = 0.5) +
geom_text(aes(label = sprintf("%.1f%%", Proporsi * 100)),
position = position_dodge(width = 0.9), vjust = -0.4, size = 4) +
scale_fill_manual(values = c("Democrat" = "#2166ac",
"Republican" = "#d6604d",
"Independent" = "#4dac26")) +
scale_y_continuous(labels = scales::percent_format(), limits = c(0, 0.55)) +
labs(title = "Gambar T6.2: Distribusi Proporsi Afiliasi Politik berdasarkan Gender",
x = "Gender", y = "Proporsi", fill = "Afiliasi Politik") +
theme_minimal(base_size = 13) +
theme(plot.title = element_text(face = "bold"), legend.position = "top")
Uji Chi-Square Keseluruhan (2×3): - \(\chi^2\) = 12.5693, df = 2, p-value = 1.865e-03 < 0,05 → Tolak H₀ - Terdapat hubungan yang signifikan secara statistik antara gender dan afiliasi politik.
Partisi 1 – Democrat vs Republican: - \(\chi^2\) = 11.5545, df = 1, p-value = 6.758e-04 < 0,05 → Tolak H₀ - Terdapat perbedaan signifikan antara pria dan wanita dalam preferensi Demokrat vs Republik.
Partisi 2 – (Dem+Rep) vs Independent: - \(\chi^2\) = 1.0654, df = 1, p-value = 3.02e-01 > 0,05 → Gagal Tolak H₀ - Tidak ada perbedaan signifikan antara pria dan wanita dalam kecenderungan memilih Independen vs partai besar.
Verifikasi aditivitas: - \(\chi^2_{P1} + \chi^2_{P2}\) = 12.62 \(\approx\) \(\chi^2_{\text{total}}\) = 12.5693 ✓ - \(df_{P1} + df_{P2}\) = 2 = \(df_{\text{total}}\) = 2 ✓
Kategori yang paling berkontribusi:
Berdasarkan standardized residual, sel yang berkontribusi signifikan (\(|d_{ij}| > 1{,}96\)) adalah:
Hal ini mengkonfirmasi bahwa perbedaan preferensi Democrat vs Republican adalah sumber utama signifikansi, konsisten dengan hasil partisi.
Hasil analisis mengkonfirmasi adanya kesenjangan gender (gender gap) yang signifikan dalam preferensi politik. Wanita secara signifikan lebih cenderung berafiliasi dengan Partai Demokrat (36.5%), sedangkan pria lebih cenderung ke Partai Republik (24.2%). Pola ini konsisten dengan berbagai studi opini publik di Amerika Serikat yang mengaitkan gender gap dengan perbedaan prioritas kebijakan (isu sosial, kesehatan, reproduksi, dan pendidikan). Sebaliknya, tidak ditemukan perbedaan gender dalam kecenderungan memilih di luar dua partai besar (Independen, ~54% Female vs ~45,6% Male, tidak berbeda signifikan), mengimplikasikan bahwa ketidakpuasan terhadap sistem dua partai bersifat lintas gender.
Terdapat hubungan yang signifikan antara gender dan afiliasi politik (\(\chi^2\) = 12.57, df = 2, p = 1.86e-03). Melalui partisi chi-square, teridentifikasi bahwa sumber utama signifikansi berasal dari perbedaan preferensi antara Demokrat dan Republik berdasarkan gender (Partisi 1: \(\chi^2\) = 11.55, p < 0,001), bukan dari perbedaan dalam memilih Independen (Partisi 2: \(\chi^2\) = 1.07, p = 0.302, tidak signifikan). Analisis standardized residual mengkonfirmasi bahwa wanita lebih banyak memilih Demokrat dan pria lebih banyak memilih Republik dari yang diharapkan jika gender dan afiliasi partai bersifat independen.