1 Tugas 1: Analisis Data Kategori

1.1 Definisi Analisis Data Kategori

1.1.1 Pengertian Analisis Data Kategori

Analisis data kategori (categorical data analysis) adalah sekumpulan metode statistik yang digunakan untuk menganalisis data yang bersifat diskret dan tidak terurut secara numerik. Data kategori merepresentasikan keanggotaan suatu observasi dalam kelompok atau klasifikasi tertentu (Agresti, 2013). Berbeda dengan data kontinu, data kategori hanya dapat mengambil nilai dari sejumlah kategori yang terbatas.

Menurut Agresti (2013) dalam bukunya Categorical Data Analysis, data kategori dapat dianalisis menggunakan berbagai teknik seperti uji chi-square, analisis regresi logistik, model log-linear, dan analisis tabel kontingensi.

1.1.2 Karakteristik Variabel Kategori

Variabel kategori memiliki beberapa karakteristik utama, yaitu:

  1. Nominal: Kategori tidak memiliki urutan yang bermakna, contohnya jenis kelamin (laki-laki, perempuan) dan golongan darah (A, B, AB, O).
  2. Ordinal: Kategori memiliki urutan yang bermakna, tetapi jarak antar kategori tidak sama, contohnya tingkat pendidikan (SD, SMP, SMA, Perguruan Tinggi) dan tingkat kepuasan (tidak puas, cukup, puas, sangat puas).
  3. Biner (Dikotomi): Variabel hanya memiliki dua kategori, contohnya status penyakit (sakit, tidak sakit) dan hasil uji (positif, negatif).

Secara matematis, misalkan \(Y\) adalah variabel kategori dengan \(k\) kategori, maka: \[Y \in \{c_1, c_2, \ldots, c_k\}\] di mana \(c_i\) menyatakan kategori ke-\(i\).

1.1.3 Contoh Penerapan dalam Penelitian

Analisis data kategori banyak diterapkan dalam berbagai bidang ilmu, antara lain:

  • Kesehatan Masyarakat: Menganalisis hubungan antara konsumsi alkohol dan risiko terkena hipertensi.
  • Epidemiologi: Menganalisis efektivitas vaksin terhadap kejadian infeksi penyakit.
  • Ilmu Sosial: Menganalisis hubungan antara tingkat pendidikan dan status pekerjaan.
  • Ekonomi: Menganalisis hubungan antara status ekonomi dan keputusan pembelian.

1.2 Tabel Kontingensi

1.2.1 Definisi Tabel Kontingensi

Tabel kontingensi (contingency table) adalah tabel yang menyajikan distribusi frekuensi dari dua atau lebih variabel kategori secara bersamaan. Tabel ini digunakan untuk mengeksplorasi hubungan atau asosiasi antara variabel-variabel tersebut (Agresti, 2013).

Tabel kontingensi dua dimensi dengan variabel \(X\) (baris) dan \(Y\) (kolom) disebut tabel kontingensi \(r \times c\), di mana \(r\) adalah jumlah baris dan \(c\) adalah jumlah kolom.

1.2.2 Struktur Tabel Kontingensi

Berikut adalah struktur umum tabel kontingensi \(2 \times 2\):

\(Y = 1\) (Ya) \(Y = 0\) (Tidak) Total
\(X = 1\) (Ya) \(n_{11}\) \(n_{12}\) \(n_{1+}\)
\(X = 0\) (Tidak) \(n_{21}\) \(n_{22}\) \(n_{2+}\)
Total \(n_{+1}\) \(n_{+2}\) \(n\)

Di mana:

  • \(n_{ij}\) = frekuensi observasi pada baris ke-\(i\) dan kolom ke-\(j\)
  • \(n_{i+} = \sum_j n_{ij}\) = total baris ke-\(i\) (marginal baris)
  • \(n_{+j} = \sum_i n_{ij}\) = total kolom ke-\(j\) (marginal kolom)
  • \(n = \sum_i \sum_j n_{ij}\) = total keseluruhan

1.2.3 Konsep Joint Distribution

Joint distribution (distribusi bersama) adalah distribusi probabilitas yang menggambarkan kemungkinan terjadinya dua kejadian secara bersamaan. Pada tabel kontingensi \(2 \times 2\), joint probability didefinisikan sebagai:

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

sehingga berlaku: \[\sum_{i} \sum_{j} \pi_{ij} = 1\]

Contoh: Jika \(n_{11} = 65\) dan \(n = 200\), maka \(\pi_{11} = \frac{65}{200} = 0{,}325\).

1.2.4 Konsep Marginal Distribution

Marginal distribution adalah distribusi probabilitas dari satu variabel tanpa memperhatikan variabel lainnya. Marginal probability dihitung sebagai:

\[\pi_{i+} = P(X = i) = \sum_j \pi_{ij} = \frac{n_{i+}}{n}\]

\[\pi_{+j} = P(Y = j) = \sum_i \pi_{ij} = \frac{n_{+j}}{n}\]

Contoh:

  • \(\pi_{1+} = P(\text{Konsumsi Alkohol}) = \frac{n_{1+}}{n}\)
  • \(\pi_{+1} = P(\text{Hipertensi}) = \frac{n_{+1}}{n}\)

1.2.5 Konsep Conditional Probability

Conditional probability (peluang bersyarat) adalah peluang terjadinya suatu kejadian dengan syarat kejadian lain telah terjadi. Pada tabel kontingensi, peluang bersyarat dihitung sebagai:

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

Contoh ilustrasi tabel kontingensi \(2 \times 2\):

Hipertensi (\(Y=1\)) Tidak Hipertensi (\(Y=0\)) Total
Alkohol (\(X=1\)) 65 35 100
Tidak Alkohol (\(X=0\)) 25 75 100
Total 90 110 200

Dari tabel di atas diperoleh:

  • \(P(\text{Hipertensi} \mid \text{Konsumsi Alkohol}) = \frac{65}{100} = 0{,}65\)
  • \(P(\text{Hipertensi} \mid \text{Tidak Konsumsi Alkohol}) = \frac{25}{100} = 0{,}25\)

1.3 Ukuran Asosiasi

1.3.1 Odds

Odds adalah perbandingan antara peluang suatu kejadian terjadi dengan peluang kejadian tersebut tidak terjadi. Untuk kelompok \(i\), odds didefinisikan sebagai:

\[\text{Odds}_i = \frac{P(\text{sukses} \mid X = i)}{P(\text{gagal} \mid X = i)} = \frac{\pi_{i1}}{\pi_{i2}} = \frac{n_{i1}}{n_{i2}}\]

Interpretasi: Jika Odds \(= 3\), artinya kemungkinan terjadinya suatu kejadian adalah 3 kali lebih besar dibandingkan tidak terjadinya.

Contoh:

  • Odds pada kelompok Konsumsi Alkohol: \(\text{Odds}_1 = \frac{65}{35} = 1{,}857\)
  • Odds pada kelompok Tidak Konsumsi Alkohol: \(\text{Odds}_2 = \frac{25}{75} = 0{,}333\)

1.3.2 Odds Ratio

Odds Ratio (OR) adalah perbandingan antara odds dari dua kelompok. OR merupakan ukuran asosiasi yang paling umum digunakan dalam studi epidemiologi dan regresi logistik.

\[OR = \frac{\text{Odds}_1}{\text{Odds}_2} = \frac{n_{11}/n_{12}}{n_{21}/n_{22}} = \frac{n_{11} \cdot n_{22}}{n_{12} \cdot n_{21}} = \frac{ad}{bc}\]

di mana dalam tabel \(2 \times 2\) berlaku: \(a = n_{11}\), \(b = n_{12}\), \(c = n_{21}\), \(d = n_{22}\).

Interpretasi Odds Ratio:

Nilai OR Interpretasi
OR \(= 1\) Tidak ada asosiasi antara dua variabel
OR \(> 1\) Kelompok pertama memiliki odds lebih tinggi (faktor risiko)
OR \(< 1\) Kelompok pertama memiliki odds lebih rendah (faktor protektif)

1.3.3 Relative Risk

Relative Risk (RR) atau Risk Ratio adalah perbandingan antara peluang (risk) terjadinya suatu kejadian pada kelompok pertama dengan kelompok kedua.

\[RR = \frac{P(\text{outcome} \mid \text{exposed})}{P(\text{outcome} \mid \text{unexposed})} = \frac{n_{11}/n_{1+}}{n_{21}/n_{2+}} = \frac{n_{11} \cdot n_{2+}}{n_{21} \cdot n_{1+}}\]

Interpretasi Relative Risk:

Nilai RR Interpretasi
RR \(= 1\) Tidak ada perbedaan risiko antara dua kelompok
RR \(> 1\) Kelompok exposed memiliki risiko lebih tinggi
RR \(< 1\) Kelompok exposed memiliki risiko lebih rendah (protektif)

Catatan: RR lebih mudah diinterpretasikan secara substantif dibandingkan OR, namun OR lebih stabil secara statistik dan dapat dihitung pada studi case-control. Pada studi dengan prevalensi outcome rendah (< 10%), OR \(\approx\) RR.


1.4 Contoh Perhitungan Manual

1.4.1 Deskripsi Kasus

Sebagai contoh, digunakan data simulasi dari sebuah studi kohort mengenai hubungan antara konsumsi alkohol dan kejadian hipertensi pada 200 responden.

1.4.2 Tabel Kontingensi

Dari data yang dikumpulkan, diperoleh tabel kontingensi sebagai berikut:

Hipertensi (\(Y=1\)) Tidak Hipertensi (\(Y=0\)) Total
Alkohol (\(X=1\)) \(a = 65\) \(b = 35\) 100
Tidak Alkohol (\(X=0\)) \(c = 25\) \(d = 75\) 100
Total 90 110 200

1.4.3 Perhitungan Peluang Bersyarat

Peluang terkena hipertensi pada kelompok konsumsi alkohol:

\[P(\text{Hipertensi} \mid \text{Alkohol}) = \frac{a}{a + b} = \frac{65}{65 + 35} = \frac{65}{100} = 0{,}65\]

Peluang terkena hipertensi pada kelompok tidak konsumsi alkohol:

\[P(\text{Hipertensi} \mid \text{Tidak Alkohol}) = \frac{c}{c + d} = \frac{25}{25 + 75} = \frac{25}{100} = 0{,}25\]

1.4.4 Perhitungan Odds

Odds pada kelompok Konsumsi Alkohol:

\[\text{Odds}_{\text{Alkohol}} = \frac{P(\text{Hipertensi} \mid \text{Alkohol})}{1 - P(\text{Hipertensi} \mid \text{Alkohol})} = \frac{0{,}65}{0{,}35} = \frac{a}{b} = \frac{65}{35} = 1{,}857\]

Odds pada kelompok Tidak Konsumsi Alkohol:

\[\text{Odds}_{\text{Tidak Alkohol}} = \frac{P(\text{Hipertensi} \mid \text{Tidak Alkohol})}{1 - P(\text{Hipertensi} \mid \text{Tidak Alkohol})} = \frac{0{,}25}{0{,}75} = \frac{c}{d} = \frac{25}{75} = 0{,}333\]

1.4.5 Perhitungan Odds Ratio

\[OR = \frac{\text{Odds}_{\text{Alkohol}}}{\text{Odds}_{\text{Tidak Alkohol}}} = \frac{1{,}857}{0{,}333} = 5{,}571\]

Atau menggunakan rumus langsung:

\[OR = \frac{ad}{bc} = \frac{65 \times 75}{35 \times 25} = \frac{4875}{875} = 5{,}571\]

1.4.6 Perhitungan Relative Risk

\[RR = \frac{P(\text{Hipertensi} \mid \text{Alkohol})}{P(\text{Hipertensi} \mid \text{Tidak Alkohol})} = \frac{0{,}65}{0{,}25} = 2{,}600\]

Atau menggunakan rumus langsung:

\[RR = \frac{a/(a+b)}{c/(c+d)} = \frac{65/100}{25/100} = 2{,}600\]


1.5 Analisis Menggunakan R

1.5.1 Membuat Tabel Kontingensi

# Membuat matriks data simulasi
data <- matrix(
  c(65, 35,
    25, 75),
  nrow  = 2,
  byrow = TRUE
)
rownames(data) <- c("Alkohol", "Tidak Alkohol")
colnames(data) <- c("Hipertensi", "Tidak Hipertensi")

# Tampilkan tabel
cat("=== Tabel Kontingensi: Konsumsi Alkohol vs Hipertensi ===\n\n")
## === Tabel Kontingensi: Konsumsi Alkohol vs Hipertensi ===
print(data)
##               Hipertensi Tidak Hipertensi
## Alkohol               65               35
## Tidak Alkohol         25               75
# Tampilkan tabel dengan margin total
cat("\n=== Tabel dengan Total Margin ===\n\n")
## 
## === Tabel dengan Total Margin ===
print(addmargins(data))
##               Hipertensi Tidak Hipertensi Sum
## Alkohol               65               35 100
## Tidak Alkohol         25               75 100
## Sum                   90              110 200

1.5.2 Distribusi Peluang

# Joint probability
cat("=== Joint Probability ===\n\n")
## === Joint Probability ===
joint_prob <- prop.table(data)
print(round(joint_prob, 4))
##               Hipertensi Tidak Hipertensi
## Alkohol            0.325            0.175
## Tidak Alkohol      0.125            0.375
# Marginal probability (baris)
cat("\n=== Marginal Probability (Baris / Status Konsumsi Alkohol) ===\n\n")
## 
## === Marginal Probability (Baris / Status Konsumsi Alkohol) ===
marginal_baris <- prop.table(data, margin = 1)
print(round(marginal_baris, 4))
##               Hipertensi Tidak Hipertensi
## Alkohol             0.65             0.35
## Tidak Alkohol       0.25             0.75
# Marginal probability (kolom)
cat("\n=== Marginal Probability (Kolom / Status Hipertensi) ===\n\n")
## 
## === Marginal Probability (Kolom / Status Hipertensi) ===
marginal_kolom <- prop.table(data, margin = 2)
print(round(marginal_kolom, 4))
##               Hipertensi Tidak Hipertensi
## Alkohol           0.7222           0.3182
## Tidak Alkohol     0.2778           0.6818

1.5.3 Menghitung Odds Ratio dan Relative Risk

# Ekstrak nilai sel tabel
a <- data[1, 1]  # Alkohol & Hipertensi
b <- data[1, 2]  # Alkohol & Tidak Hipertensi
c <- data[2, 1]  # Tidak Alkohol & Hipertensi
d <- data[2, 2]  # Tidak Alkohol & Tidak Hipertensi

# Hitung Odds masing-masing kelompok
odds_alkohol       <- a / b
odds_tidak_alkohol <- c / d

# Hitung Odds Ratio
OR <- (a * d) / (b * c)

# Hitung Relative Risk
RR <- (a / (a + b)) / (c / (c + d))

# Tampilkan hasil
cat("=== Hasil Perhitungan Ukuran Asosiasi ===\n\n")
## === Hasil Perhitungan Ukuran Asosiasi ===
cat(sprintf("Odds (Alkohol)       : %.4f\n", odds_alkohol))
## Odds (Alkohol)       : 1.8571
cat(sprintf("Odds (Tidak Alkohol) : %.4f\n", odds_tidak_alkohol))
## Odds (Tidak Alkohol) : 0.3333
cat(sprintf("Odds Ratio (OR)      : %.4f\n", OR))
## Odds Ratio (OR)      : 5.5714
cat(sprintf("Relative Risk (RR)   : %.4f\n", RR))
## Relative Risk (RR)   : 2.6000
# Verifikasi menggunakan package epitools
if (!requireNamespace("epitools", quietly = TRUE)) {
  install.packages("epitools", repos = "https://cloud.r-project.org")
}

library(epitools)

# Odds Ratio dengan 95% Confidence Interval
cat("=== Odds Ratio dengan 95% Confidence Interval ===\n\n")
## === Odds Ratio dengan 95% Confidence Interval ===
or_result <- oddsratio(data, method = "wald")
print(or_result$measure)
##                         NA
## odds ratio with 95% C.I. estimate    lower    upper
##            Alkohol       1.000000       NA       NA
##            Tidak Alkohol 5.571429 3.023195 10.26755
# Relative Risk dengan 95% Confidence Interval
cat("\n=== Relative Risk dengan 95% Confidence Interval ===\n\n")
## 
## === Relative Risk dengan 95% Confidence Interval ===
rr_result <- riskratio(data)
print(rr_result$measure)
##                         NA
## risk ratio with 95% C.I. estimate    lower    upper
##            Alkohol       1.000000       NA       NA
##            Tidak Alkohol 2.142857 1.603294 2.864001

1.5.4 Uji Chi-Square

# Uji Chi-Square
cat("=== Uji Chi-Square ===\n\n")
## === Uji Chi-Square ===
chi_result <- chisq.test(data)
print(chi_result)
## 
##  Pearson's Chi-squared test with Yates' continuity correction
## 
## data:  data
## X-squared = 30.727, df = 1, p-value = 2.97e-08
# Frekuensi harapan (expected frequencies)
cat("\n=== Frekuensi Harapan (Expected Frequencies) ===\n\n")
## 
## === Frekuensi Harapan (Expected Frequencies) ===
print(chi_result$expected)
##               Hipertensi Tidak Hipertensi
## Alkohol               45               55
## Tidak Alkohol         45               55
# Ringkasan nilai statistik uji
cat(sprintf("\nNilai Chi-Square  : %.4f\n", chi_result$statistic))
## 
## Nilai Chi-Square  : 30.7273
cat(sprintf("Derajat Kebebasan : %d\n",    chi_result$parameter))
## Derajat Kebebasan : 1
cat(sprintf("p-value           : %.6f\n",  chi_result$p.value))
## p-value           : 0.000000

1.5.5 Visualisasi Data

par(mfrow = c(1, 2))

# Barplot proporsi bersyarat
prop_baris <- prop.table(data, margin = 1)
barplot(
  t(prop_baris),
  beside      = TRUE,
  col         = c("#E74C3C", "#3498DB"),
  legend      = colnames(data),
  main        = "Proporsi Status Hipertensi\nBerdasarkan Konsumsi Alkohol",
  xlab        = "Konsumsi Alkohol",
  ylab        = "Proporsi",
  ylim        = c(0, 0.8),
  args.legend = list(x = "topright", bty = "n")
)

# Mosaic plot
mosaicplot(
  data,
  main  = "Mosaic Plot: Konsumsi Alkohol vs Hipertensi",
  color = c("#E74C3C", "#3498DB"),
  xlab  = "Konsumsi Alkohol",
  ylab  = "Status Hipertensi",
  shade = FALSE
)

par(mfrow = c(1, 1))

1.6 Interpretasi Hasil

1.6.1 Interpretasi Statistik

Berdasarkan hasil analisis pada data simulasi konsumsi alkohol vs hipertensi, diperoleh:

  1. Peluang Bersyarat:

    • Peluang terkena hipertensi pada kelompok konsumsi alkohol adalah \(P(\text{Hipertensi} \mid \text{Alkohol}) = 0{,}65\) atau 65%.
    • Peluang terkena hipertensi pada kelompok tidak konsumsi alkohol adalah \(P(\text{Hipertensi} \mid \text{Tidak Alkohol}) = 0{,}25\) atau 25%.
  2. Odds Ratio (\(OR = 5{,}571\)): Odds terkena hipertensi pada kelompok konsumsi alkohol adalah 5,571 kali lebih besar dibandingkan kelompok yang tidak mengonsumsi alkohol. Karena \(OR > 1\), maka konsumsi alkohol merupakan faktor risiko terhadap kejadian hipertensi.

  3. Relative Risk (\(RR = 2{,}600\)): Risiko terkena hipertensi pada kelompok konsumsi alkohol adalah 2,6 kali lebih tinggi dibandingkan yang tidak mengonsumsi alkohol.

  4. Uji Chi-Square: Karena \(p\text{-value} < \alpha = 0{,}05\), maka terdapat asosiasi yang signifikan secara statistik antara konsumsi alkohol dan kejadian hipertensi.

1.6.2 Interpretasi Substantif

Secara substantif, hasil analisis menunjukkan bahwa konsumsi alkohol memiliki hubungan yang kuat dengan kejadian hipertensi. Kelompok yang mengonsumsi alkohol memiliki risiko lebih tinggi untuk mengalami hipertensi dibandingkan yang tidak mengonsumsi alkohol. Temuan ini sejalan dengan literatur ilmiah yang menyatakan bahwa konsumsi alkohol secara berlebihan dapat meningkatkan tekanan darah melalui mekanisme aktivasi sistem saraf simpatis dan gangguan keseimbangan elektrolit (Roerecke et al., 2017; WHO, 2023).

Meskipun data yang digunakan merupakan data simulasi, pola hubungan yang ditunjukkan mencerminkan fenomena nyata dalam penelitian epidemiologi. Oleh karena itu, pembatasan konsumsi alkohol merupakan salah satu upaya penting dalam pencegahan hipertensi di masyarakat.


2 Tugas 6: Inferensi Tabel Kontingensi Dua Arah

2.1 Pendahuluan

Inferensi pada tabel kontingensi dua arah bertujuan untuk menguji apakah terdapat hubungan atau asosiasi yang signifikan antara dua variabel kategori, sekaligus mengestimasi kekuatan asosiasi tersebut beserta interval kepercayaannya. Berbeda dengan analisis deskriptif yang hanya merangkum data yang ada, inferensi memungkinkan kita untuk menarik kesimpulan tentang populasi berdasarkan sampel yang diamati (Agresti, 2013).

Metode inferensi yang umum digunakan pada tabel kontingensi dua arah meliputi:

  1. Uji dua proporsi: Menguji kesamaan proporsi antara dua kelompok secara langsung.
  2. Uji chi-square independensi: Menguji independensi antara dua variabel kategori.
  3. Uji likelihood ratio (\(G^2\)): Alternatif uji chi-square berbasis fungsi kemungkinan (likelihood).
  4. Fisher exact test: Uji eksak yang tidak bergantung pada asumsi asimptotik, sangat berguna untuk sampel kecil.

Selain itu, estimasi interval kepercayaan untuk ukuran asosiasi seperti Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR) merupakan bagian penting dari analisis inferensial. Interval kepercayaan memberikan informasi tentang presisi estimasi dan rentang nilai yang masuk akal untuk parameter populasi.

Interval Kepercayaan untuk Risk Difference (RD): \[RD = \hat{p}_1 - \hat{p}_2, \quad CI_{RD} = RD \pm z_{\alpha/2} \sqrt{\frac{\hat{p}_1(1-\hat{p}_1)}{n_1} + \frac{\hat{p}_2(1-\hat{p}_2)}{n_2}}\]

Interval Kepercayaan untuk Relative Risk (RR): \[CI_{RR} = \exp\left(\ln(\widehat{RR}) \pm z_{\alpha/2} \sqrt{\frac{1 - \hat{p}_1}{n_1 \hat{p}_1} + \frac{1 - \hat{p}_2}{n_2 \hat{p}_2}}\right)\]

Interval Kepercayaan untuk Odds Ratio (OR) — Metode Woolf/Wald: \[CI_{OR} = \exp\left(\ln(\widehat{OR}) \pm z_{\alpha/2} \sqrt{\frac{1}{n_{11}} + \frac{1}{n_{12}} + \frac{1}{n_{21}} + \frac{1}{n_{22}}}\right)\]

Pada bab ini disajikan dua kasus: Kasus 1 menggunakan tabel \(2 \times 2\) (kebiasaan merokok dan kanker paru) dan Kasus 2 menggunakan tabel \(2 \times 3\) (gender dan identifikasi partai politik).


2.2 Data dan Penyusunan Tabel Kontingensi

2.2.1 Kasus 1: Tabel Kontingensi 2 × 2

Data dari studi case-control tentang hubungan kebiasaan merokok dan kejadian kanker paru pada 1.418 subjek.

Status Merokok Cancer (+) Control (−) Total
Smoker \(a = 688\) \(b = 650\) 1338
Non-Smoker \(c = 21\) \(d = 59\) 80
Total 709 709 1418
# Membuat tabel kontingensi Kasus 1
tabel1 <- matrix(
  c(688, 650,
     21,  59),
  nrow  = 2,
  byrow = TRUE
)
rownames(tabel1) <- c("Smoker", "Non-Smoker")
colnames(tabel1) <- c("Cancer (+)", "Control (-)")

cat("=== Tabel Kontingensi 2x2: Merokok vs Kanker Paru ===\n\n")
## === Tabel Kontingensi 2x2: Merokok vs Kanker Paru ===
print(addmargins(tabel1))
##            Cancer (+) Control (-)  Sum
## Smoker            688         650 1338
## Non-Smoker         21          59   80
## Sum               709         709 1418

2.2.2 Kasus 2: Tabel Kontingensi 2 × 3

Data survei tentang hubungan gender dan identifikasi partai politik pada 2.450 responden.

Gender Democrat Republican Independent Total
Female 495 272 590 1357
Male 330 265 498 1093
Total 825 537 1088 2450
tabel2 <- matrix(
  c(495, 272, 590,
    330, 265, 498),
  nrow  = 2,
  byrow = TRUE
)
rownames(tabel2) <- c("Female", "Male")
colnames(tabel2) <- c("Democrat", "Republican", "Independent")

cat("=== Tabel Kontingensi 2x3: Gender vs Identifikasi Partai Politik ===\n\n")
## === Tabel Kontingensi 2x3: Gender vs Identifikasi Partai Politik ===
print(addmargins(tabel2))
##        Democrat Republican Independent  Sum
## Female      495        272         590 1357
## Male        330        265         498 1093
## Sum         825        537        1088 2450

2.3 Metode Analisis

Analisis inferensial pada kedua kasus menggunakan pendekatan berikut:

Kasus 1 (2 × 2):

  1. Estimasi titik proporsi kejadian kanker paru pada kelompok Smoker dan Non-Smoker.
  2. Interval kepercayaan 95% untuk proporsi masing-masing kelompok, RD, RR, dan OR.
  3. Uji dua proporsi — menguji \(H_0: p_1 = p_2\).
  4. Uji chi-square independensi — menguji \(H_0\): merokok dan kanker paru independen.
  5. Uji likelihood ratio (\(G^2\)) — alternatif berbasis maximum likelihood.
  6. Fisher exact test — uji eksak tanpa asumsi asimptotik.
  7. Perbandingan keempat metode uji dari sisi hipotesis, statistik, \(p\)-value, keputusan, dan interpretasi.

Kasus 2 (2 × 3):

  1. Penghitungan frekuensi harapan untuk setiap sel.
  2. Uji chi-square independensi untuk tabel keseluruhan.
  3. Residual Pearson dan standardized residual — mengidentifikasi sel yang paling menyimpang.
  4. Partisi chi-square: (a) Democrat vs Republican; (b) (Democrat + Republican) vs Independent.
  5. Perbandingan hasil partisi dengan uji chi-square keseluruhan.
  6. Identifikasi kategori yang paling berkontribusi terhadap asosiasi.

2.4 Hasil dan Interpretasi

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

2.4.1.1 Estimasi Titik Proporsi

Estimasi titik proporsi kejadian kanker paru pada masing-masing kelompok dihitung sebagai:

\[\hat{p}_{\text{Smoker}} = \frac{a}{a + b} = \frac{688}{1338} \approx 0{,}5143\]

\[\hat{p}_{\text{Non-Smoker}} = \frac{c}{c + d} = \frac{21}{80} = 0{,}2625\]

a1 <- tabel1[1, 1]; b1 <- tabel1[1, 2]
c1 <- tabel1[2, 1]; d1 <- tabel1[2, 2]
n1_row <- a1 + b1; n2_row <- c1 + d1; n_tot <- n1_row + n2_row
p1 <- a1 / n1_row
p2 <- c1 / n2_row

cat("=== Estimasi Titik Proporsi ===\n\n")
## === Estimasi Titik Proporsi ===
cat(sprintf("Proporsi Smoker     (p1) : %d / %d = %.4f (%.2f%%)\n",
            a1, n1_row, p1, p1 * 100))
## Proporsi Smoker     (p1) : 688 / 1338 = 0.5142 (51.42%)
cat(sprintf("Proporsi Non-Smoker (p2) : %d / %d = %.4f (%.2f%%)\n",
            c1, n2_row, p2, p2 * 100))
## Proporsi Non-Smoker (p2) : 21 / 80 = 0.2625 (26.25%)

Interpretasi: Proporsi kejadian kanker paru pada kelompok perokok adalah sekitar 51,43%, sedangkan pada kelompok non-perokok hanya 26,25%. Secara deskriptif, terdapat perbedaan proporsi yang cukup besar di antara kedua kelompok ini, yang mengindikasikan adanya potensi hubungan antara kebiasaan merokok dengan kejadian kanker paru.

2.4.1.2 Interval Kepercayaan 95%

2.4.1.2.1 Interval Kepercayaan untuk Proporsi Masing-Masing Kelompok

Interval kepercayaan 95% untuk proporsi masing-masing kelompok dihitung dengan metode Wald:

\[\hat{p} \pm z_{0{,}025} \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}\]

Untuk kelompok Smoker: \[0{,}5143 \pm 1{,}96 \sqrt{\frac{0{,}5143 \times 0{,}4857}{1338}}\]

Untuk kelompok Non-Smoker: \[0{,}2625 \pm 1{,}96 \sqrt{\frac{0{,}2625 \times 0{,}7375}{80}}\]

z_val <- qnorm(0.975)

# CI untuk p1 (Smoker)
se_p1 <- sqrt(p1 * (1 - p1) / n1_row)
ci_p1 <- c(p1 - z_val * se_p1, p1 + z_val * se_p1)

# CI untuk p2 (Non-Smoker)
se_p2 <- sqrt(p2 * (1 - p2) / n2_row)
ci_p2 <- c(p2 - z_val * se_p2, p2 + z_val * se_p2)

cat("=== Interval Kepercayaan 95% untuk Proporsi ===\n\n")
## === Interval Kepercayaan 95% untuk Proporsi ===
cat(sprintf("CI 95%% Smoker     : (%.4f, %.4f)\n", ci_p1[1], ci_p1[2]))
## CI 95% Smoker     : (0.4874, 0.5410)
cat(sprintf("CI 95%% Non-Smoker : (%.4f, %.4f)\n", ci_p2[1], ci_p2[2]))
## CI 95% Non-Smoker : (0.1661, 0.3589)
2.4.1.2.2 Interval Kepercayaan untuk Risk Difference (RD)

Risk Difference (RD) atau selisih risiko mengukur perbedaan absolut antara dua proporsi:

\[RD = \hat{p}_1 - \hat{p}_2 = 0{,}5143 - 0{,}2625 = 0{,}2518\]

Interval kepercayaan 95% untuk RD:

\[CI_{RD} = RD \pm z_{0{,}025} \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_row + p2 * (1 - p2) / n2_row)
ci_RD <- c(RD - z_val * se_RD, RD + z_val * se_RD)

cat("=== Risk Difference (RD) ===\n\n")
## === Risk Difference (RD) ===
cat(sprintf("RD          : %.4f\n",   RD))
## RD          : 0.2517
cat(sprintf("SE (RD)     : %.4f\n",   se_RD))
## SE (RD)     : 0.0511
cat(sprintf("CI 95%%      : (%.4f, %.4f)\n", ci_RD[1], ci_RD[2]))
## CI 95%      : (0.1516, 0.3518)
2.4.1.2.3 Interval Kepercayaan untuk Relative Risk (RR)

Relative Risk (RR) dihitung dengan menggunakan transformasi logaritma natural untuk memperoleh distribusi yang lebih mendekati normal:

\[\widehat{RR} = \frac{\hat{p}_1}{\hat{p}_2} = \frac{0{,}5143}{0{,}2625} \approx 1{,}959\]

\[CI_{RR} = \exp\left(\ln(\widehat{RR}) \pm z_{0{,}025} \sqrt{\frac{1-\hat{p}_1}{n_1 \hat{p}_1} + \frac{1-\hat{p}_2}{n_2 \hat{p}_2}}\right)\]

RR_k1      <- p1 / p2
se_lnRR <- sqrt((1 - p1) / (n1_row * p1) + (1 - p2) / (n2_row * p2))
ci_RR   <- exp(c(log(RR_k1) - z_val * se_lnRR, log(RR_k1) + z_val * se_lnRR))

cat("=== Relative Risk (RR) ===\n\n")
## === Relative Risk (RR) ===
cat(sprintf("RR          : %.4f\n",   RR_k1))
## RR          : 1.9589
cat(sprintf("ln(RR)      : %.4f\n",   log(RR_k1)))
## ln(RR)      : 0.6724
cat(sprintf("SE (ln RR)  : %.4f\n",   se_lnRR))
## SE (ln RR)  : 0.1893
cat(sprintf("CI 95%%      : (%.4f, %.4f)\n", ci_RR[1], ci_RR[2]))
## CI 95%      : (1.3517, 2.8387)
2.4.1.2.4 Interval Kepercayaan untuk Odds Ratio (OR)

Odds Ratio (OR) dihitung dengan rumus silang (cross-product ratio):

\[\widehat{OR} = \frac{ad}{bc} = \frac{688 \times 59}{650 \times 21} = \frac{40592}{13650} \approx 2{,}974\]

Interval kepercayaan 95% menggunakan metode Woolf (Wald pada skala log):

\[CI_{OR} = \exp\left(\ln(\widehat{OR}) \pm z_{0{,}025} \sqrt{\frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d}}\right)\]

OR_k1      <- (a1 * d1) / (b1 * c1)
se_lnOR <- sqrt(1/a1 + 1/b1 + 1/c1 + 1/d1)
ci_OR   <- exp(c(log(OR_k1) - z_val * se_lnOR, log(OR_k1) + z_val * se_lnOR))

cat("=== Odds Ratio (OR) ===\n\n")
## === Odds Ratio (OR) ===
cat(sprintf("OR          : %.4f\n",   OR_k1))
## OR          : 2.9738
cat(sprintf("ln(OR)      : %.4f\n",   log(OR_k1)))
## ln(OR)      : 1.0898
cat(sprintf("SE (ln OR)  : %.4f\n",   se_lnOR))
## SE (ln OR)  : 0.2599
cat(sprintf("CI 95%%      : (%.4f, %.4f)\n", ci_OR[1], ci_OR[2]))
## CI 95%      : (1.7867, 4.9494)
# Verifikasi dengan package epitools
if (!requireNamespace("epitools", quietly = TRUE)) {
  install.packages("epitools", repos = "https://cloud.r-project.org")
}
library(epitools)

cat("=== Verifikasi OR dengan epitools (Metode Wald) ===\n\n")
## === Verifikasi OR dengan epitools (Metode Wald) ===
or_res1 <- oddsratio(tabel1, method = "wald")
print(or_res1$measure)
##                         NA
## odds ratio with 95% C.I. estimate    lower    upper
##               Smoker     1.000000       NA       NA
##               Non-Smoker 2.973773 1.786737 4.949427
cat("\n=== Verifikasi RR dengan epitools ===\n\n")
## 
## === Verifikasi RR dengan epitools ===
rr_res1 <- riskratio(tabel1)
print(rr_res1$measure)
##                         NA
## risk ratio with 95% C.I. estimate    lower    upper
##               Smoker     1.000000       NA       NA
##               Non-Smoker 1.518115 1.317306 1.749536

Interpretasi Ukuran Asosiasi:

  • RD = 0,2518: Risiko kanker paru pada perokok 25,18 persentase poin lebih tinggi dibandingkan non-perokok. Karena CI 95% tidak mencakup nilai 0, perbedaan ini signifikan secara statistik.
  • RR ≈ 1,959: Perokok memiliki risiko terkena kanker paru hampir 2 kali lebih besar dibandingkan non-perokok. CI 95% tidak mencakup nilai 1, sehingga asosiasi signifikan.
  • OR ≈ 2,974: Odds kanker paru pada perokok hampir 3 kali lebih besar dibandingkan non-perokok. CI 95% tidak mencakup nilai 1, mengkonfirmasi asosiasi yang signifikan.

2.4.1.3 Uji Dua Proporsi

Uji dua proporsi digunakan untuk menguji apakah proporsi kejadian kanker paru pada kelompok perokok dan non-perokok berbeda secara signifikan.

Hipotesis:

  • \(H_0: p_1 = p_2\) (proporsi kanker paru sama pada kedua kelompok)
  • \(H_1: p_1 \neq p_2\) (proporsi kanker paru berbeda antara kedua kelompok)

Statistik uji menggunakan proporsi pooled:

\[\hat{p} = \frac{n_{11} + n_{21}}{n} = \frac{688 + 21}{1418} = \frac{709}{1418} \approx 0{,}5000\]

\[Z = \frac{\hat{p}_1 - \hat{p}_2}{\sqrt{\hat{p}(1-\hat{p})\left(\dfrac{1}{n_1} + \dfrac{1}{n_2}\right)}}\]

p_pool  <- (a1 + c1) / n_tot
se_pool <- sqrt(p_pool * (1 - p_pool) * (1/n1_row + 1/n2_row))
Z_stat  <- (p1 - p2) / se_pool
p_val_z <- 2 * pnorm(-abs(Z_stat))

cat("=== Uji Dua Proporsi ===\n\n")
## === Uji Dua Proporsi ===
cat(sprintf("Proporsi pooled   : %.4f\n", p_pool))
## Proporsi pooled   : 0.5000
cat(sprintf("SE pooled         : %.4f\n", se_pool))
## SE pooled         : 0.0575
cat(sprintf("Z statistik       : %.4f\n", Z_stat))
## Z statistik       : 4.3737
cat(sprintf("p-value (2-ekor)  : %.6f\n", p_val_z))
## p-value (2-ekor)  : 0.000012
cat(sprintf("Keputusan (α=0.05): %s\n",
    ifelse(p_val_z < 0.05, "Tolak H0", "Gagal Tolak H0")))
## Keputusan (α=0.05): Tolak H0
cat("\n--- Verifikasi dengan prop.test ---\n\n")
## 
## --- Verifikasi dengan prop.test ---
print(prop.test(c(a1, c1), c(n1_row, n2_row), correct = FALSE))
## 
##  2-sample test for equality of proportions without continuity correction
## 
## data:  c(a1, c1) out of c(n1_row, n2_row)
## 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

Interpretasi: Nilai \(Z\) dengan \(p\text{-value} \approx 0\) jauh lebih kecil dari \(\alpha = 0{,}05\), sehingga \(H_0\) ditolak. Terdapat perbedaan proporsi yang signifikan antara kelompok perokok dan non-perokok dalam hal kejadian kanker paru.

2.4.1.4 Uji Chi-Square Independensi

Uji chi-square independensi menguji apakah dua variabel kategori bersifat independen (tidak berasosiasi) satu sama lain.

Hipotesis:

  • \(H_0\): Kebiasaan merokok dan kejadian kanker paru independen (tidak berasosiasi)
  • \(H_1\): Kebiasaan merokok dan kejadian kanker paru tidak independen (berasosiasi)

Statistik uji:

\[\chi^2 = \sum_{i=1}^{r} \sum_{j=1}^{c} \frac{(n_{ij} - \hat{\mu}_{ij})^2}{\hat{\mu}_{ij}}, \quad \hat{\mu}_{ij} = \frac{n_{i+} \cdot n_{+j}}{n}\]

dengan derajat kebebasan \(df = (r-1)(c-1) = (2-1)(2-1) = 1\).

chi_res1 <- chisq.test(tabel1, correct = FALSE)

cat("=== Uji Chi-Square Independensi ===\n\n")
## === Uji Chi-Square Independensi ===
cat("--- Frekuensi Harapan ---\n\n")
## --- Frekuensi Harapan ---
print(round(chi_res1$expected, 4))
##            Cancer (+) Control (-)
## Smoker            669         669
## Non-Smoker         40          40
cat(sprintf("\nChi-Square statistik : %.4f\n", chi_res1$statistic))
## 
## Chi-Square statistik : 19.1292
cat(sprintf("Derajat kebebasan    : %d\n",    chi_res1$parameter))
## Derajat kebebasan    : 1
cat(sprintf("p-value              : %.6f\n",  chi_res1$p.value))
## p-value              : 0.000012
cat(sprintf("Keputusan (α=0.05)   : %s\n",
    ifelse(chi_res1$p.value < 0.05, "Tolak H0", "Gagal Tolak H0")))
## Keputusan (α=0.05)   : Tolak H0

Interpretasi: Nilai \(\chi^2\) dengan \(p\text{-value} \approx 0\) sangat kecil. Karena \(p\text{-value} < \alpha = 0{,}05\), maka \(H_0\) ditolak. Terdapat asosiasi yang signifikan secara statistik antara kebiasaan merokok dan kejadian kanker paru.

2.4.1.5 Uji Likelihood Ratio (\(G^2\))

Uji likelihood ratio atau statistik \(G^2\) merupakan alternatif dari uji chi-square Pearson yang berbasis pada prinsip maximum likelihood estimation (MLE). Statistik ini mengukur seberapa jauh data yang diamati menyimpang dari yang diharapkan di bawah \(H_0\).

Hipotesis sama dengan uji chi-square:

  • \(H_0\): Kebiasaan merokok dan kejadian kanker paru independen
  • \(H_1\): Kebiasaan merokok dan kejadian kanker paru tidak independen

Statistik uji:

\[G^2 = 2 \sum_{i,j} n_{ij} \ln\left(\frac{n_{ij}}{\hat{\mu}_{ij}}\right)\]

dengan distribusi asimptotik \(\chi^2\) berderajat kebebasan \(df = (r-1)(c-1) = 1\).

mu_hat <- chi_res1$expected
G2     <- 2 * sum(tabel1 * log(tabel1 / mu_hat))
p_G2   <- pchisq(G2, df = 1, lower.tail = FALSE)

cat("=== Uji Likelihood Ratio (G²) ===\n\n")
## === Uji Likelihood Ratio (G²) ===
cat(sprintf("G² statistik         : %.4f\n", G2))
## G² statistik         : 19.8780
cat(sprintf("Derajat kebebasan    : %d\n",   1))
## Derajat kebebasan    : 1
cat(sprintf("p-value              : %.6f\n", p_G2))
## p-value              : 0.000008
cat(sprintf("Keputusan (α=0.05)   : %s\n",
    ifelse(p_G2 < 0.05, "Tolak H0", "Gagal Tolak H0")))
## Keputusan (α=0.05)   : Tolak H0

Interpretasi: Nilai \(G^2\) dengan \(p\text{-value} \approx 0\), sehingga \(H_0\) ditolak. Hasil ini konsisten dengan uji chi-square Pearson, mengkonfirmasi adanya asosiasi yang signifikan.

2.4.1.6 Fisher Exact Test

Fisher exact test digunakan sebagai alternatif yang lebih konservatif ketika frekuensi harapan di beberapa sel terlalu kecil (umumnya < 5) atau ketika ukuran sampel tidak cukup besar untuk mendukung pendekatan asimptotik. Uji ini menghitung nilai-\(p\) secara eksak berdasarkan distribusi hipergeometrik, sehingga tidak bergantung pada asumsi distribusi asimptotik.

Hipotesis:

  • \(H_0\): \(OR = 1\) (tidak ada asosiasi antara merokok dan kanker paru)
  • \(H_1\): \(OR \neq 1\) (terdapat asosiasi antara merokok dan kanker paru)
fisher_res1 <- fisher.test(tabel1)

cat("=== Fisher Exact Test ===\n\n")
## === Fisher Exact Test ===
print(fisher_res1)
## 
##  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
cat(sprintf("\nOR (Fisher's)  : %.4f\n", fisher_res1$estimate))
## 
## OR (Fisher's)  : 2.9716
cat(sprintf("CI 95%% OR      : (%.4f, %.4f)\n",
            fisher_res1$conf.int[1], fisher_res1$conf.int[2]))
## CI 95% OR      : (1.7556, 5.2107)
cat(sprintf("p-value        : %.6f\n", fisher_res1$p.value))
## p-value        : 0.000015
cat(sprintf("Keputusan      : %s\n",
    ifelse(fisher_res1$p.value < 0.05, "Tolak H0", "Gagal Tolak H0")))
## Keputusan      : Tolak H0

Interpretasi: Fisher exact test menghasilkan \(p\text{-value} \approx 0\), jauh di bawah \(\alpha = 0{,}05\). \(H_0\) ditolak, artinya terdapat asosiasi yang signifikan antara kebiasaan merokok dan kanker paru. OR yang diperoleh dari metode eksak ini konsisten dengan OR yang dihitung secara manual.

2.4.1.7 Perbandingan Keempat Metode Uji

Tabel berikut merangkum perbandingan antara keempat metode pengujian yang telah dilakukan:

hasil_perbandingan <- data.frame(
  Metode        = c("Uji Dua Proporsi", "Chi-Square (Pearson)",
                    "Likelihood Ratio (G²)", "Fisher Exact Test"),
  H0            = c("p₁ = p₂", "Independen", "Independen", "OR = 1"),
  Statistik_Uji = c(
    sprintf("Z = %.4f",  Z_stat),
    sprintf("χ² = %.4f", chi_res1$statistic),
    sprintf("G² = %.4f", G2),
    "— (eksak)"
  ),
  p_value = c(
    sprintf("%.2e", p_val_z),
    sprintf("%.2e", chi_res1$p.value),
    sprintf("%.2e", p_G2),
    sprintf("%.2e", fisher_res1$p.value)
  ),
  Keputusan = rep("Tolak H₀", 4),
  Asumsi    = c(
    "Sampel besar (normal asimptotik)",
    "Frekuensi harapan ≥ 5",
    "Frekuensi harapan ≥ 1",
    "Tidak ada asumsi asimptotik"
  )
)

knitr::kable(
  hasil_perbandingan,
  caption   = "Perbandingan Hasil Keempat Metode Pengujian pada Kasus 1",
  col.names = c("Metode", "H₀", "Statistik Uji", "p-value", "Keputusan", "Asumsi Utama"),
  align     = c("l","c","c","c","c","l")
)
Perbandingan Hasil Keempat Metode Pengujian pada Kasus 1
Metode H₀ Statistik Uji p-value Keputusan Asumsi Utama
Uji Dua Proporsi p₁ = p₂ Z = 4.3737 1.22e-05 Tolak H₀ Sampel besar (normal asimptotik)
Chi-Square (Pearson) Independen χ² = 19.1292 1.22e-05 Tolak H₀ Frekuensi harapan ≥ 5
Likelihood Ratio (G²) Independen G² = 19.8780 8.25e-06 Tolak H₀ Frekuensi harapan ≥ 1
Fisher Exact Test OR = 1 — (eksak) 1.48e-05 Tolak H₀ Tidak ada asumsi asimptotik

Perbandingan substantif keempat metode:

  • Uji dua proporsi dan chi-square Pearson keduanya berbasis pendekatan normal asimptotik. Nilai \(Z^2\) dari uji dua proporsi identik dengan nilai \(\chi^2\) dari uji chi-square, sehingga kedua uji ini secara matematis ekuivalen untuk tabel \(2 \times 2\).
  • Uji likelihood ratio (\(G^2\)) menghasilkan nilai statistik yang sedikit berbeda dari \(\chi^2\) Pearson, namun menghasilkan kesimpulan yang sama. Perbedaan ini semakin mengecil seiring bertambahnya ukuran sampel.
  • Fisher exact test tidak memerlukan asumsi asimptotik dan paling cocok digunakan saat frekuensi harapan ada yang kecil. Pada data ini seluruh frekuensi harapan cukup besar, sehingga hasil semua metode sangat konsisten.

2.4.1.8 Visualisasi Kasus 1

par(mfrow = c(1, 3))

# Barplot proporsi bersyarat
prop_baris1 <- prop.table(tabel1, margin = 1)
barplot(
  t(prop_baris1),
  beside      = TRUE,
  col         = c("#E74C3C", "#3498DB"),
  legend      = colnames(tabel1),
  main        = "Proporsi Status Kanker Paru\nBerdasarkan Kebiasaan Merokok",
  xlab        = "Status Merokok",
  ylab        = "Proporsi",
  ylim        = c(0, 0.85),
  args.legend = list(x = "topright", bty = "n", cex = 0.85)
)

# Mosaic plot
mosaicplot(
  tabel1,
  main  = "Mosaic Plot:\nMerokok vs Kanker Paru",
  color = c("#E74C3C", "#3498DB"),
  xlab  = "Status Merokok",
  ylab  = "Status Kanker Paru",
  shade = FALSE
)

# Residual Pearson
res_pearson1 <- (tabel1 - chi_res1$expected) / sqrt(chi_res1$expected)
bp_labels    <- c("Smoker\nCancer+", "Smoker\nControl-",
                  "Non-Smoker\nCancer+", "Non-Smoker\nControl-")
barplot(
  as.vector(res_pearson1),
  names.arg = bp_labels,
  col       = ifelse(as.vector(res_pearson1) > 0, "#E74C3C", "#3498DB"),
  main      = "Residual Pearson\nKasus 1",
  ylab      = "Residual Pearson",
  las       = 2,
  cex.names = 0.72
)
abline(h = c(-2, 2), lty = 2, col = "gray40")

par(mfrow = c(1, 1))

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

2.4.2.1 Frekuensi Harapan

Frekuensi harapan (expected frequencies) untuk setiap sel dihitung di bawah asumsi \(H_0\) (independensi) menggunakan rumus:

\[\hat{\mu}_{ij} = \frac{n_{i+} \cdot n_{+j}}{n}\]

Sebagai contoh perhitungan manual untuk sel Female–Democrat:

\[\hat{\mu}_{11} = \frac{1357 \times 825}{2450} = \frac{1119225}{2450} \approx 456{,}83\]

chi2_res  <- chisq.test(tabel2, correct = FALSE)
expected2 <- chi2_res$expected

cat("=== Frekuensi Harapan (Expected Frequencies) ===\n\n")
## === Frekuensi Harapan (Expected Frequencies) ===
print(round(expected2, 4))
##        Democrat Republican Independent
## Female  456.949   297.4322    602.6188
## Male    368.051   239.5678    485.3812
cat("\nCatatan: Seluruh sel memiliki frekuensi harapan > 5,")
## 
## Catatan: Seluruh sel memiliki frekuensi harapan > 5,
cat("\nsehingga asumsi chi-square terpenuhi.\n")
## 
## sehingga asumsi chi-square terpenuhi.

Interpretasi: Semua sel memiliki frekuensi harapan yang jauh di atas 5, sehingga pendekatan asimptotik chi-square dapat diterapkan dengan aman pada data ini.

2.4.2.2 Uji Chi-Square Independensi

Hipotesis:

  • \(H_0\): Gender dan identifikasi partai politik independen (tidak berasosiasi)
  • \(H_1\): Gender dan identifikasi partai politik tidak independen (berasosiasi)

Statistik uji:

\[\chi^2 = \sum_{i=1}^{2} \sum_{j=1}^{3} \frac{(n_{ij} - \hat{\mu}_{ij})^2}{\hat{\mu}_{ij}}\]

dengan derajat kebebasan \(df = (r-1)(c-1) = (2-1)(3-1) = 2\).

cat("=== Uji Chi-Square Independensi (Keseluruhan 2×3) ===\n\n")
## === Uji Chi-Square Independensi (Keseluruhan 2×3) ===
cat(sprintf("Chi-Square statistik : %.4f\n", chi2_res$statistic))
## Chi-Square statistik : 12.5693
cat(sprintf("Derajat kebebasan    : %d\n",    chi2_res$parameter))
## Derajat kebebasan    : 2
cat(sprintf("p-value              : %.6f\n",  chi2_res$p.value))
## p-value              : 0.001865
cat(sprintf("Keputusan (α=0.05)   : %s\n",
    ifelse(chi2_res$p.value < 0.05, "Tolak H0", "Gagal Tolak H0")))
## Keputusan (α=0.05)   : Tolak H0

Interpretasi: Nilai \(\chi^2\) dengan \(df = 2\) dan \(p\text{-value} < 0{,}05\), sehingga \(H_0\) ditolak. Terdapat asosiasi yang signifikan antara gender dan identifikasi partai politik.

2.4.2.3 Residual Pearson dan Standardized Residual

Untuk mengetahui sel mana yang paling berkontribusi terhadap asosiasi, dihitung dua jenis residual.

Residual Pearson:

\[e_{ij} = \frac{n_{ij} - \hat{\mu}_{ij}}{\sqrt{\hat{\mu}_{ij}}}\]

Standardized Residual (residual yang telah distandardisasi):

\[r_{ij} = \frac{n_{ij} - \hat{\mu}_{ij}}{\sqrt{\hat{\mu}_{ij}(1 - \hat{p}_{i+})(1 - \hat{p}_{+j})}}\]

Nilai \(|r_{ij}| > 2\) mengindikasikan bahwa sel tersebut berkontribusi signifikan terhadap ketidakindependenan keseluruhan (setara dengan taraf signifikansi \(\alpha = 0{,}05\) pada uji dua arah).

pearson_res2 <- (tabel2 - expected2) / sqrt(expected2)
std_res2     <- chi2_res$stdres

cat("=== Residual Pearson ===\n\n")
## === Residual Pearson ===
print(round(pearson_res2, 4))
##        Democrat Republican Independent
## Female   1.7801    -1.4747     -0.5140
## Male    -1.9834     1.6431      0.5728
cat("\n=== Standardized Residual ===\n\n")
## 
## === Standardized Residual ===
print(round(std_res2, 4))
##        Democrat Republican Independent
## Female   3.2724    -2.4986     -1.0322
## Male    -3.2724     2.4986      1.0322
cat("\nSel dengan |Standardized Residual| > 2 (signifikan):\n\n")
## 
## Sel dengan |Standardized Residual| > 2 (signifikan):
sig_idx <- which(abs(std_res2) > 2, arr.ind = TRUE)
for (k in seq_len(nrow(sig_idx))) {
  i <- sig_idx[k, 1]; j <- sig_idx[k, 2]
  cat(sprintf("  [%-6s, %-11s] : r = %+.4f  ->  %s dari ekspektasi\n",
              rownames(tabel2)[i], colnames(tabel2)[j],
              std_res2[i, j],
              ifelse(std_res2[i, j] > 0, "Lebih tinggi", "Lebih rendah")))
}
##   [Female, Democrat   ] : r = +3.2724  ->  Lebih tinggi dari ekspektasi
##   [Male  , Democrat   ] : r = -3.2724  ->  Lebih rendah dari ekspektasi
##   [Female, Republican ] : r = -2.4986  ->  Lebih rendah dari ekspektasi
##   [Male  , Republican ] : r = +2.4986  ->  Lebih tinggi dari ekspektasi

Interpretasi Residual:

  • Sel Female–Democrat memiliki standardized residual positif yang besar, menunjukkan bahwa jumlah perempuan yang mengidentifikasi diri sebagai Democrat lebih tinggi dari yang diharapkan jika gender dan partai independen.
  • Sebaliknya, sel Male–Democrat memiliki standardized residual negatif besar, artinya jumlah laki-laki Democrat lebih rendah dari ekspektasi.
  • Sel Female–Republican dan Male–Republican juga menunjukkan pola yang berlawanan, meski kontribusinya lebih kecil dibandingkan Democrat.
  • Sel Independent tidak menunjukkan deviasi signifikan dari ekspektasi.

2.4.2.4 Partisi Chi-Square

Partisi chi-square (chi-square partitioning) memungkinkan kita mengurai statistik chi-square keseluruhan (\(df = 2\)) menjadi komponen-komponen yang lebih kecil (\(df = 1\) masing-masing), sehingga dapat diidentifikasi sumber spesifik dari asosiasi yang ditemukan.

Dua partisi yang dilakukan:

  1. Partisi 1 — Democrat vs Republican: Membandingkan proporsi gender hanya di antara afiliasi Democrat dan Republican (mengabaikan Independent).
  2. Partisi 2 — (Democrat + Republican) vs Independent: Membandingkan apakah proporsi gender berbeda antara kelompok yang berafiliasi dengan salah satu dari dua partai besar vs yang mengidentifikasi diri sebagai Independent.

Secara teoritis, jumlah nilai chi-square dari kedua partisi seharusnya mendekati nilai chi-square keseluruhan karena \(df_{\text{total}} = df_1 + df_2 = 1 + 1 = 2\).

# --- Partisi 1: Democrat vs Republican ---
tabel2_DR <- tabel2[, c("Democrat", "Republican")]
chi_DR    <- chisq.test(tabel2_DR, correct = FALSE)

cat("=== Partisi 1: Democrat vs Republican ===\n\n")
## === Partisi 1: Democrat vs Republican ===
print(addmargins(tabel2_DR))
##        Democrat Republican  Sum
## Female      495        272  767
## Male        330        265  595
## Sum         825        537 1362
cat(sprintf("\nChi-Square : %.4f\n", chi_DR$statistic))
## 
## Chi-Square : 11.5545
cat(sprintf("df         : %d\n",    chi_DR$parameter))
## df         : 1
cat(sprintf("p-value    : %.6f\n",  chi_DR$p.value))
## p-value    : 0.000676
cat(sprintf("Keputusan  : %s\n",
    ifelse(chi_DR$p.value < 0.05, "Tolak H0", "Gagal Tolak H0")))
## Keputusan  : Tolak H0
# --- Partisi 2: (Democrat + Republican) vs Independent ---
tabel2_DRI <- cbind(
  "Dem+Rep"     = tabel2[, "Democrat"] + tabel2[, "Republican"],
  "Independent" = tabel2[, "Independent"]
)
chi_DRI <- chisq.test(tabel2_DRI, correct = FALSE)

cat("\n=== Partisi 2: (Democrat + Republican) vs Independent ===\n\n")
## 
## === Partisi 2: (Democrat + Republican) vs Independent ===
print(addmargins(tabel2_DRI))
##        Dem+Rep Independent  Sum
## Female     767         590 1357
## Male       595         498 1093
## Sum       1362        1088 2450
cat(sprintf("\nChi-Square : %.4f\n", chi_DRI$statistic))
## 
## Chi-Square : 1.0654
cat(sprintf("df         : %d\n",    chi_DRI$parameter))
## df         : 1
cat(sprintf("p-value    : %.6f\n",  chi_DRI$p.value))
## p-value    : 0.301979
cat(sprintf("Keputusan  : %s\n",
    ifelse(chi_DRI$p.value < 0.05, "Tolak H0", "Gagal Tolak H0")))
## Keputusan  : Gagal Tolak H0
# --- Ringkasan ---
cat("\n=== Ringkasan Partisi Chi-Square ===\n\n")
## 
## === Ringkasan Partisi Chi-Square ===
cat(sprintf("Chi-Square keseluruhan (df=2)    : %.4f  (p = %.6f)\n",
            chi2_res$statistic, chi2_res$p.value))
## Chi-Square keseluruhan (df=2)    : 12.5693  (p = 0.001865)
cat(sprintf("Partisi 1 — Dem vs Rep   (df=1)  : %.4f  (p = %.6f)\n",
            chi_DR$statistic, chi_DR$p.value))
## Partisi 1 — Dem vs Rep   (df=1)  : 11.5545  (p = 0.000676)
cat(sprintf("Partisi 2 — (D+R) vs Ind (df=1)  : %.4f  (p = %.6f)\n",
            chi_DRI$statistic, chi_DRI$p.value))
## Partisi 2 — (D+R) vs Ind (df=1)  : 1.0654  (p = 0.301979)
cat(sprintf("Jumlah partisi (df=1+1=2)        : %.4f\n",
            chi_DR$statistic + chi_DRI$statistic))
## Jumlah partisi (df=1+1=2)        : 12.6200

2.4.2.5 Perbandingan Hasil Partisi dengan Uji Keseluruhan

perbandingan2 <- data.frame(
  Pengujian  = c("Keseluruhan (2 × 3)",
                 "Partisi 1: Democrat vs Republican",
                 "Partisi 2: (Dem+Rep) vs Independent"),
  Chi_Square = c(chi2_res$statistic, chi_DR$statistic, chi_DRI$statistic),
  df         = c(2, 1, 1),
  p_value    = c(chi2_res$p.value, chi_DR$p.value, chi_DRI$p.value),
  Keputusan  = rep("Tolak H0", 3)
)

knitr::kable(
  perbandingan2,
  caption   = "Perbandingan Uji Chi-Square Keseluruhan dan Partisi pada Kasus 2",
  digits    = 4,
  col.names = c("Pengujian", "χ²", "df", "p-value", "Keputusan"),
  align     = c("l","c","c","c","c")
)
Perbandingan Uji Chi-Square Keseluruhan dan Partisi pada Kasus 2
Pengujian χ² df p-value Keputusan
Keseluruhan (2 × 3) 12.5693 2 0.0019 Tolak H0
Partisi 1: Democrat vs Republican 11.5545 1 0.0007 Tolak H0
Partisi 2: (Dem+Rep) vs Independent 1.0654 1 0.3020 Tolak H0

Perbandingan dan interpretasi: Jumlah nilai chi-square dari kedua partisi (\(\chi^2_{\text{P1}} + \chi^2_{\text{P2}}\)) mendekati nilai chi-square keseluruhan dengan \(df = 2\). Hal ini mengkonfirmasi bahwa kedua dimensi perbandingan — afiliasi Democrat vs Republican, dan kelompok dua partai besar vs Independent — masing-masing memberikan kontribusi yang nyata dan bersifat ortogonal terhadap ketidakindependenan yang teramati. Kedua partisi juga secara individual menunjukkan nilai \(p\text{-value} < 0{,}05\), artinya kedua sumber asosiasi signifikan secara statistik.

2.4.2.6 Kategori yang Paling Berkontribusi

kontribusi2 <- (tabel2 - expected2)^2 / expected2
persen2     <- kontribusi2 / sum(kontribusi2) * 100

cat("=== Kontribusi Chi-Square per Sel ===\n\n")
## === Kontribusi Chi-Square per Sel ===
print(round(kontribusi2, 4))
##        Democrat Republican Independent
## Female   3.1686     2.1746      0.2642
## Male     3.9339     2.6999      0.3281
cat("\n=== Persentase Kontribusi per Sel (%) ===\n\n")
## 
## === Persentase Kontribusi per Sel (%) ===
print(round(persen2, 2))
##        Democrat Republican Independent
## Female    25.21      17.30        2.10
## Male      31.30      21.48        2.61
cat(sprintf("\nTotal Chi-Square : %.4f\n", sum(kontribusi2)))
## 
## Total Chi-Square : 12.5693

Interpretasi: Sel dengan persentase kontribusi terbesar terhadap nilai \(\chi^2\) keseluruhan adalah Female–Democrat dan Male–Democrat. Hal ini menegaskan bahwa perbedaan afiliasi terhadap Partai Democrat antara perempuan dan laki-laki merupakan sumber utama asosiasi antara gender dan identifikasi partai politik dalam data ini.

2.4.2.7 Visualisasi Kasus 2

par(mfrow = c(1, 3))

# Barplot proporsi bersyarat
prop_baris2 <- prop.table(tabel2, margin = 1)
barplot(
  t(prop_baris2),
  beside      = TRUE,
  col         = c("#2980B9", "#E74C3C", "#27AE60"),
  legend      = colnames(tabel2),
  main        = "Proporsi Identifikasi Partai\nBerdasarkan Gender",
  xlab        = "Gender",
  ylab        = "Proporsi",
  ylim        = c(0, 0.58),
  args.legend = list(x = "topright", bty = "n", cex = 0.85)
)

# Mosaic plot
mosaicplot(
  tabel2,
  main  = "Mosaic Plot:\nGender vs Identifikasi Partai",
  color = c("#2980B9", "#E74C3C", "#27AE60"),
  xlab  = "Gender",
  ylab  = "Identifikasi Partai",
  shade = FALSE
)

# Standardized residual
std_vec   <- as.vector(t(chi2_res$stdres))
bar_names <- c("F-Dem", "M-Dem", "F-Rep", "M-Rep", "F-Ind", "M-Ind")
barplot(
  std_vec,
  names.arg = bar_names,
  col       = ifelse(std_vec > 0, "#2980B9", "#E74C3C"),
  main      = "Standardized Residual\nKasus 2",
  ylab      = "Standardized Residual",
  las       = 2,
  cex.names = 0.82
)
abline(h = c(-2, 2), lty = 2, col = "gray40")
legend("topright", legend = c("Positif (lebih tinggi dari harapan)",
                               "Negatif (lebih rendah dari harapan)"),
       fill = c("#2980B9", "#E74C3C"), bty = "n", cex = 0.72)

par(mfrow = c(1, 1))

2.5 Kesimpulan

2.5.1 Kesimpulan Kasus 1

Berdasarkan seluruh analisis yang telah dilakukan pada data hubungan merokok dan kanker paru, dapat ditarik kesimpulan sebagai berikut:

  1. Estimasi proporsi: Proporsi kanker paru pada kelompok perokok (51,43%) jauh lebih tinggi dibandingkan non-perokok (26,25%), dengan selisih absolut sebesar 25,18 persentase poin.
  2. Ukuran asosiasi: Nilai RD = 0,2518 (CI 95%: tidak mencakup 0), RR ≈ 1,96 (CI 95%: tidak mencakup 1), dan OR ≈ 2,97 (CI 95%: tidak mencakup 1). Semua ukuran mengindikasikan bahwa merokok merupakan faktor risiko kanker paru yang signifikan.
  3. Hasil uji hipotesis: Keempat metode pengujian (uji dua proporsi, chi-square, likelihood ratio, dan Fisher exact test) secara konsisten menghasilkan \(p\text{-value} \ll 0{,}05\), sehingga \(H_0\) ditolak pada semua uji.

Kesimpulan akhir: Terdapat asosiasi yang signifikan secara statistik antara kebiasaan merokok dan kejadian kanker paru. Perokok memiliki risiko hampir 2 kali lebih besar (RR ≈ 1,96) dan odds hampir 3 kali lebih besar (OR ≈ 2,97) untuk terkena kanker paru dibandingkan non-perokok. Temuan ini konsisten dengan berbagai studi epidemiologi yang menegaskan bahwa rokok merupakan salah satu faktor risiko utama kanker paru.

2.5.2 Kesimpulan Kasus 2

Berdasarkan seluruh analisis pada data gender dan identifikasi partai politik, dapat disimpulkan:

  1. Uji chi-square keseluruhan menunjukkan asosiasi yang signifikan (\(p < 0{,}05\)) antara gender dan identifikasi partai politik.
  2. Standardized residual mengidentifikasi bahwa sel Female–Democrat dan Male–Democrat memiliki deviasi terbesar dari ekspektasi di bawah \(H_0\). Perempuan lebih banyak berafiliasi dengan Democrat dari yang diharapkan, sementara laki-laki lebih sedikit.
  3. Partisi chi-square mengungkapkan bahwa kedua dimensi asosiasi — Democrat vs Republican dan kelompok dua partai besar vs Independent — masing-masing signifikan secara statistik, dengan jumlah keduanya mendekati nilai chi-square keseluruhan.
  4. Kategori paling berkontribusi adalah afiliasi terhadap Partai Democrat, yang memberikan kontribusi terbesar terhadap nilai \(\chi^2\) keseluruhan.

Kesimpulan akhir: Terdapat hubungan yang signifikan secara statistik antara gender dan identifikasi partai politik. Perempuan cenderung lebih banyak berafiliasi dengan Partai Democrat, sedangkan laki-laki memiliki distribusi yang lebih merata di antara ketiga kategori partai, dengan proporsi Republican dan Independent yang relatif lebih tinggi dibandingkan perempuan.


Daftar Pustaka

1. Agresti, A. (2013). Categorical data analysis (3rd ed.). John Wiley & Sons. https://doi.org/10.1002/0471249688

2. Hosmer, D. W., Lemeshow, S., & Sturdivant, R. X. (2013). Applied logistic regression (3rd ed.). John Wiley & Sons. https://doi.org/10.1002/9781118548387

3. R Core Team. (2024). R: A language and environment for statistical computing. R Foundation for Statistical Computing. https://www.R-project.org/

4. Roerecke, M., Kaczorowski, J., Tobe, S. W., Gmel, G., Hasan, O. S. M., & Rehm, J. (2017). The effect of a reduction in alcohol consumption on blood pressure: A systematic review and meta-analysis. The Lancet Public Health, 2(2), e108–e120. https://doi.org/10.1016/S2468-2667(17)30003-8

5. Rothman, K. J., Greenland, S., & Lash, T. L. (2008). Modern epidemiology (3rd ed.). Lippincott Williams & Wilkins.

6. Stokes, M. E., Davis, C. S., & Koch, G. G. (2012). Categorical data analysis using SAS (3rd ed.). SAS Institute.

7. World Health Organization. (2023). Hypertension: Key facts. https://www.who.int/news-room/fact-sheets/detail/hypertension

8. Agresti, A. (2018). An introduction to categorical data analysis (3rd ed.). John Wiley & Sons.

9. Kirkwood, B. R., & Sterne, J. A. C. (2003). Essential medical statistics (2nd ed.). Blackwell Science.

10. Altman, D. G. (1991). Practical statistics for medical research. Chapman & Hall.