1 Bagian 1: Definisi Analisis Data Kategori


1.1 Pengertian Analisis Data Kategori

Analisis data kategori (categorical data analysis) adalah cabang statistika yang mempelajari metode-metode untuk mengumpulkan, merangkum, mendeskripsikan, dan menarik inferensi dari data yang nilainya berupa kategori atau label — bukan besaran numerik kontinu. Tujuan utamanya adalah memahami distribusi frekuensi suatu variabel kategori dan menguji ada tidaknya asosiasi (hubungan) antara dua atau lebih variabel kategori dalam suatu populasi.

Secara historis, analisis data kategori berkembang pesat sejak Karl Pearson memperkenalkan Uji Chi-Square pada tahun 1900 sebagai alat untuk menguji kecocokan distribusi frekuensi. Sejak itu, berbagai metode berkembang mulai dari tabel kontingensi, odds ratio, regresi logistik, hingga model log-linear untuk tabel multidimensional.

Yang membedakan analisis data kategori dari statistika konvensional adalah sifat datanya: nilai-nilai dalam data kategori tidak dapat diaritmetikakan secara bermakna. Tidak ada konsep “rata-rata agama” atau “selisih antara Merah dan Biru”. Oleh karena itu, diperlukan pendekatan yang berfokus pada frekuensi, proporsi, dan peluang kemunculan setiap kategori.


1.2 Karakteristik Variabel Kategori

Variabel kategori memiliki sejumlah karakteristik yang membedakannya dari variabel numerik:

No. Karakteristik Penjelasan Contoh
1 Nilai berupa label Data hanya berupa nama atau kode, bukan angka sejati “Laki-laki”, “Perempuan”; “Positif”, “Negatif”
2 Saling eksklusif Setiap observasi hanya dapat masuk ke satu kategori Seseorang tidak bisa sekaligus “lulus” dan “tidak lulus”
3 Exhaustive Seluruh kemungkinan nilai sudah tercakup dalam kategori yang ada Kategori “Ya / Tidak” mencakup semua kemungkinan jawaban
4 Tidak memiliki jarak yang terdefinisi Pada skala nominal, tidak ada urutan; pada ordinal ada urutan tapi jarak tidak terdefinisi “SMP < SMA < S1” tapi selisih antar jenjang tidak sama
5 Direpresentasikan sebagai frekuensi Analisis berfokus pada jumlah/proporsi observasi per kategori 60 laki-laki, 40 perempuan dari 100 responden

1.2.1 Tipe-Tipe Skala Variabel Kategori

Variabel kategori dibagi menjadi tiga tipe utama berdasarkan ada tidaknya urutan dan jumlah kategori:

Tipe Skala Deskripsi Lengkap Jumlah Kategori Contoh Variabel Ukuran Statistik yang Tepat
Nominal Kategori murni tanpa urutan alami. Label hanya berfungsi sebagai pembeda, bukan peringkat. ≥ 2 Jenis kelamin, golongan darah, kota asal, agama, warna Modus, Chi-Square, Cramér’s V, Phi
Ordinal Kategori memiliki urutan yang bermakna, namun jarak antarkategori tidak terdefinisi secara numerik. ≥ 3 Tingkat pendidikan (SD/SMP/SMA/PT), skala Likert (1–5), status sosial (rendah/menengah/tinggi) Median, persentil, Spearman, Gamma
Dikotomis Kasus khusus nominal dengan tepat dua kategori yang saling eksklusif dan exhaustive. = 2 Lulus/Tidak Lulus, Sakit/Sehat, Hadir/Absen, Ya/Tidak Phi, Odds Ratio, Point-Biserial

💡 Catatan: Variabel dikotomis adalah kasus khusus dari variabel nominal. Karena hanya dua kategori, ukuran asosiasi seperti Phi dan Odds Ratio dapat dihitung lebih langsung dan diinterpretasikan lebih intuitif dibandingkan pada data nominal dengan banyak kategori.


1.3 Mengapa Diperlukan Metode Khusus?

Banyak mahasiswa bertanya: mengapa tidak menggunakan saja mean atau korelasi Pearson untuk data kategori? Jawabannya terletak pada asumsi dasar yang dilanggar jika metode numerik diterapkan pada data kategori:

  1. Mean tidak bermakna: Rata-rata dari kode “1 = Laki-laki” dan “2 = Perempuan” adalah 1.5 — angka yang tidak merepresentasikan kategori apa pun.
  2. Normalitas tidak terpenuhi: Metode parametrik (uji-t, ANOVA) mengasumsikan distribusi normal pada data. Data kategori mengikuti distribusi Binomial atau Multinomial, bukan Normal.
  3. Homogenitas variansi tidak relevan: Konsep variansi tidak berlaku pada skala nominal.
  4. Korelasi Pearson mensyaratkan linearitas: Hubungan linear antarvariabel kategori tidak terdefinisi.

Karena itu, statistika mengembangkan metode khusus seperti yang dirangkum berikut:

Metode Fungsi Utama Jenis Data
Tabel Kontingensi Merangkum distribusi bersama dua variabel kategori Nominal, Ordinal
Uji Chi-Square (\(\chi^2\)) Menguji independensi statistik dua variabel kategori Nominal, Ordinal
Odds Ratio (OR) Mengukur kekuatan dan arah asosiasi pada tabel 2×2 Nominal (dikotomis)
Relative Risk (RR) Membandingkan risiko relatif antardua kelompok Nominal (dikotomis)
Cramér’s V Mengukur kekuatan asosiasi pada tabel \(r \times c\) Nominal
Korelasi Spearman / Gamma Mengukur asosiasi pada variabel ordinal Ordinal
Regresi Logistik Memodelkan peluang kejadian variabel respons dikotomis Campuran
Fisher’s Exact Test Alternatif Chi-Square untuk sampel kecil (\(E_{ij} < 5\)) Nominal

1.4 Contoh Penerapan dalam Penelitian

Analisis data kategori digunakan secara luas di berbagai bidang penelitian:

No. Bidang Pertanyaan Penelitian Variabel Metode
1 Epidemiologi Apakah merokok meningkatkan risiko kanker paru-paru? Merokok (Ya/Tidak) × Kanker (Ya/Tidak) Odds Ratio, Chi-Square
2 Kesehatan Masyarakat Apakah vaksinasi mengurangi insiden infeksi? Status vaksin (Vaksin/Tidak) × Status infeksi (Terinfeksi/Tidak) Relative Risk, Chi-Square
3 Pendidikan Apakah gender berpengaruh terhadap kelulusan tepat waktu? Jenis kelamin × Status kelulusan Chi-Square, Cramér’s V
4 Sosiologi Apakah tingkat pendidikan berkaitan dengan preferensi politik? Pendidikan × Pilihan partai Chi-Square, Cramér’s V
5 Psikologi Apakah perlakuan terapi A lebih efektif daripada terapi B? Jenis terapi × Respons pasien Chi-Square, Odds Ratio
6 Pemasaran Apakah jenis iklan berpengaruh terhadap keputusan pembelian? Jenis iklan × Pembelian (Ya/Tidak) Chi-Square, Cramér’s V

2 Bagian 2: Tabel Kontingensi


2.1 Definisi Tabel Kontingensi

Tabel kontingensi (contingency table), juga dikenal sebagai cross-tabulation atau crosstab, adalah tabel berbentuk matriks yang menyajikan distribusi frekuensi bersama dari dua atau lebih variabel kategori secara simultan. Setiap sel dalam tabel menunjukkan berapa banyak observasi yang memiliki kombinasi nilai tertentu dari variabel-variabel tersebut.

Nama “kontingensi” berasal dari kata Latin contingere yang berarti “bergantung pada” — karena tabel ini memungkinkan kita melihat apakah distribusi satu variabel bergantung pada (atau berubah sesuai dengan) nilai variabel lain. Jika distribusinya tidak berubah, kedua variabel dikatakan independen atau tidak berasosiasi.

Tabel kontingensi pertama kali diperkenalkan oleh Karl Pearson pada akhir abad ke-19 dan hingga kini tetap menjadi alat analisis eksplorasi yang paling mendasar dalam statistika kategori.


2.2 Struktur Tabel Kontingensi

2.2.1 Tabel Kontingensi Umum \(r \times c\)

Untuk dua variabel kategori \(X\) (dengan \(r\) kategori baris) dan \(Y\) (dengan \(c\) kategori kolom), struktur tabelnya adalah:

\(Y_1\) \(Y_2\) \(\cdots\) \(Y_c\) Total Baris
\(X_1\) \(n_{11}\) \(n_{12}\) \(\cdots\) \(n_{1c}\) \(n_{1\cdot}\)
\(X_2\) \(n_{21}\) \(n_{22}\) \(\cdots\) \(n_{2c}\) \(n_{2\cdot}\)
\(\vdots\) \(\vdots\) \(\vdots\) \(\ddots\) \(\vdots\) \(\vdots\)
\(X_r\) \(n_{r1}\) \(n_{r2}\) \(\cdots\) \(n_{rc}\) \(n_{r\cdot}\)
Total Kolom \(n_{\cdot1}\) \(n_{\cdot2}\) \(\cdots\) \(n_{\cdot c}\) \(n\)

Notasi penting:

Simbol Nama Rumus / Keterangan
\(n_{ij}\) Frekuensi sel Jumlah observasi dengan \(X = i\) dan \(Y = j\)
\(n_{i\cdot}\) Marginal baris ke-\(i\) \(\displaystyle\sum_{j=1}^{c} n_{ij}\) — total baris ke-\(i\)
\(n_{\cdot j}\) Marginal kolom ke-\(j\) \(\displaystyle\sum_{i=1}^{r} n_{ij}\) — total kolom ke-\(j\)
\(n\) Total keseluruhan \(\displaystyle\sum_{i=1}^{r}\sum_{j=1}^{c} n_{ij}\)
\(r\) Jumlah baris Banyaknya kategori variabel \(X\)
\(c\) Jumlah kolom Banyaknya kategori variabel \(Y\)

2.2.2 Tabel Kontingensi 2×2 (Kasus Khusus)

Tabel 2×2 adalah bentuk paling sederhana dan paling sering digunakan, terutama untuk dua variabel dikotomis. Ia memiliki bentuk baku sebagai berikut:

\(Y = 1\) (Positif) \(Y = 0\) (Negatif) Total
\(X = 1\) (Terekspos) \(a = n_{11}\) \(b = n_{12}\) \(a + b = n_{1\cdot}\)
\(X = 0\) (Tidak Terekspos) \(c = n_{21}\) \(d = n_{22}\) \(c + d = n_{2\cdot}\)
Total \(a + c = n_{\cdot1}\) \(b + d = n_{\cdot2}\) \(n\)

📌 Konvensi label sel \(a, b, c, d\) ini sangat umum digunakan dalam epidemiologi dan akan dipakai sepanjang dokumen ini. Hafalkan posisinya karena rumus Odds Ratio dan Relative Risk diturunkan dari notasi ini.


2.3 Konsep Joint Distribution (Distribusi Bersama)

Distribusi bersama (joint distribution) dari dua variabel \(X\) dan \(Y\) adalah distribusi yang menggambarkan peluang kemunculan setiap kombinasi nilai \(X\) dan \(Y\) secara bersamaan dalam satu observasi. Dinotasikan sebagai \(P(X = i, Y = j)\) atau \(P(X = i \cap Y = j)\).

\[P(X = i,\ Y = j) = \frac{n_{ij}}{n}, \quad \text{untuk semua } i = 1, \ldots, r \text{ dan } j = 1, \ldots, c\]

Sifat distribusi bersama: \[\sum_{i=1}^{r} \sum_{j=1}^{c} P(X = i, Y = j) = 1\]

Ilustrasi dengan contoh konkret:

Misalkan dari 200 mahasiswa diperoleh tabel berikut:

Lulus (Y=1) Tidak Lulus (Y=0) Total
Laki-laki (X=1) 60 50 110
Perempuan (X=2) 63 27 90
Total 123 77 200

Maka distribusi bersama:

\(P(Y=1)\) \(P(Y=0)\) Total
\(P(X=1)\) \(P(X=1, Y=1) = 60/200 = 0.30\) \(P(X=1, Y=0) = 50/200 = 0.25\) \(0.55\)
\(P(X=2)\) \(P(X=2, Y=1) = 63/200 = 0.315\) \(P(X=2, Y=0) = 27/200 = 0.135\) \(0.45\)
Total \(0.615\) \(0.385\) \(1.00\)

Distribusi bersama memberikan gambaran lengkap tentang bagaimana kedua variabel berperilaku secara simultan dalam populasi.


2.4 Konsep Marginal Distribution (Distribusi Marginal)

Distribusi marginal adalah distribusi peluang dari satu variabel saja, diperoleh dengan menjumlahkan distribusi bersama atas semua nilai variabel yang lain. Distribusi marginal mengabaikan informasi tentang variabel lainnya.

Marginal distribusi \(X\) (baris): \[P(X = i) = \sum_{j=1}^{c} P(X = i, Y = j) = \frac{n_{i\cdot}}{n}\]

Marginal distribusi \(Y\) (kolom): \[P(Y = j) = \sum_{i=1}^{r} P(X = i, Y = j) = \frac{n_{\cdot j}}{n}\]

Mengapa disebut “marginal”? Karena nilainya ditempatkan di margin (tepi/pinggir) tabel kontingensi — yaitu pada baris total paling bawah dan kolom total paling kanan.

Melanjutkan contoh di atas:

Variabel Kategori Frekuensi Peluang Marginal
Jenis Kelamin (\(X\)) Laki-laki \(n_{1\cdot} = 110\) \(P(X=1) = 110/200 = 0.55\)
Jenis Kelamin (\(X\)) Perempuan \(n_{2\cdot} = 90\) \(P(X=2) = 90/200 = 0.45\)
Status Lulus (\(Y\)) Lulus \(n_{\cdot1} = 123\) \(P(Y=1) = 123/200 = 0.615\)
Status Lulus (\(Y\)) Tidak Lulus \(n_{\cdot2} = 77\) \(P(Y=0) = 77/200 = 0.385\)

Distribusi marginal berguna untuk mengetahui karakteristik masing-masing variabel secara terpisah, tanpa mempertimbangkan hubungannya dengan variabel lain.


2.5 Konsep Conditional Probability (Peluang Bersyarat)

Peluang bersyarat (conditional probability) \(P(Y = j \mid X = i)\) adalah peluang bahwa variabel \(Y\) bernilai \(j\), diberikan bahwa variabel \(X\) sudah diketahui bernilai \(i\). Peluang bersyarat hanya mempertimbangkan observasi dalam subkelompok \(X = i\), bukan keseluruhan sampel.

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

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

Mengapa peluang bersyarat penting? Karena ia menangkap inti dari konsep asosiasi: jika \(P(Y = j \mid X = 1) \neq P(Y = j \mid X = 2)\), artinya distribusi \(Y\) berbeda tergantung pada nilai \(X\) — dengan kata lain, ada asosiasi antara \(X\) dan \(Y\).

Sebaliknya, jika \(P(Y = j \mid X = i) = P(Y = j)\) untuk semua \(i\) dan \(j\), maka kedua variabel independen — mengetahui nilai \(X\) tidak memberikan informasi apapun tentang \(Y\).

Kondisi independensi secara formal: \[X \perp Y \iff P(X = i, Y = j) = P(X = i) \times P(Y = j) \quad \forall i, j\]

Ilustrasi peluang bersyarat dari contoh:

Lulus \(P(Y=1 \mid X)\) Tidak Lulus \(P(Y=0 \mid X)\) Total
Laki-laki \(60/110 = 0.545\) \(50/110 = 0.455\) \(1.00\)
Perempuan \(63/90 = 0.700\) \(27/90 = 0.300\) \(1.00\)

Perhatikan: \(P(Y=1 \mid X=\text{Laki-laki}) = 0.545 \neq P(Y=1 \mid X=\text{Perempuan}) = 0.700\). Karena berbeda, ada indikasi asosiasi antara jenis kelamin dan kelulusan.


3 Bagian 3: Ukuran Asosiasi


3.1 Pengantar: Mengapa Perlu Ukuran Asosiasi?

Ukuran asosiasi (measures of association) adalah nilai numerik yang merangkum kekuatan dan/atau arah hubungan antara dua variabel kategori dalam satu angka yang mudah dikomunikasikan. Uji Chi-Square hanya menjawab pertanyaan “apakah ada asosiasi?” (ya/tidak), tetapi tidak memberitahu seberapa kuat atau seberapa besar asosiasi tersebut secara praktis.

Ukuran asosiasi menjawab pertanyaan yang lebih informatif:

  • “Seberapa besar kemungkinan seseorang yang merokok terkena kanker dibanding yang tidak merokok?”
  • “Berapa kali lipat risiko terinfeksi bagi yang tidak divaksin?”

3.2 Odds (Peluang Relatif)

3.2.1 Definisi Odds

Odds adalah perbandingan antara peluang suatu kejadian terjadi dengan peluang kejadian tersebut tidak terjadi. Odds berbeda dari peluang biasa: peluang adalah \(p\), sedangkan odds adalah \(p/(1-p)\).

\[\text{Odds} = \frac{p}{1 - p} = \frac{\text{Peluang kejadian terjadi}}{\text{Peluang kejadian tidak terjadi}}\]

Atau dalam konteks tabel 2×2, odds kejadian \(Y=1\) pada kelompok \(X=1\) (baris pertama):

\[\text{Odds}_1 = \frac{a / (a+b)}{b / (a+b)} = \frac{a}{b}\]

Dan odds pada kelompok \(X=0\) (baris kedua):

\[\text{Odds}_2 = \frac{c / (c+d)}{d / (c+d)} = \frac{c}{d}\]

Contoh interpretasi Odds:

Jika peluang lulus = \(p = 0.7\), maka: \[\text{Odds} = \frac{0.7}{0.3} = 2.333\] Artinya: untuk setiap 1 mahasiswa yang tidak lulus, ada 2.333 mahasiswa yang lulus. Atau lebih mudah: peluang lulus 2.333 kali lebih besar daripada peluang tidak lulus.

Nilai Odds Interpretasi
\(< 1\) Kejadian lebih kecil peluangnya daripada tidak terjadi (\(p < 0.5\))
\(= 1\) Peluang terjadi sama dengan peluang tidak terjadi (\(p = 0.5\))
\(> 1\) Kejadian lebih besar peluangnya daripada tidak terjadi (\(p > 0.5\))

3.3 Odds Ratio (OR)

3.3.1 Definisi dan Rumus

Odds Ratio (OR) adalah perbandingan odds pada dua kelompok berbeda. OR menjawab pertanyaan: “Berapa kali lipat odds kejadian pada kelompok terekspos dibandingkan odds pada kelompok tidak terekspos?” OR merupakan ukuran asosiasi utama dalam studi case-control dan sangat populer di epidemiologi.

Untuk tabel 2×2 dengan sel \(a, b, c, d\):

\[\boxed{OR = \frac{a/b}{c/d} = \frac{ad}{bc}}\]

Di mana: - \(a\) = terekspos & outcome positif - \(b\) = terekspos & outcome negatif - \(c\) = tidak terekspos & outcome positif - \(d\) = tidak terekspos & outcome negatif

Confidence Interval 95% untuk OR:

\[CI_{95\%} = \left[\exp\!\left(\ln\widehat{OR} - 1.96 \cdot SE\right),\ \exp\!\left(\ln\widehat{OR} + 1.96 \cdot SE\right)\right]\]

\[\text{dengan} \quad SE = \sqrt{\frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d}}\]

3.3.2 Interpretasi Odds Ratio

Nilai OR Interpretasi
\(OR = 1\) Tidak ada asosiasi; odds sama pada kedua kelompok
\(OR > 1\) Kelompok terekspos memiliki odds lebih tinggi untuk outcome positif
\(OR < 1\) Kelompok terekspos memiliki odds lebih rendah untuk outcome positif (bersifat protektif)
\(OR = 2\) Odds outcome pada kelompok terekspos 2 kali lipat dibanding tidak terekspos
\(OR = 0.5\) Odds outcome pada kelompok terekspos hanya setengah dari yang tidak terekspos

📌 Signifikansi OR: Jika confidence interval 95% CI mencakup nilai 1, maka OR tidak berbeda signifikan dari 1 pada \(\alpha = 0.05\), artinya tidak ada bukti asosiasi yang signifikan secara statistik.


3.4 Relative Risk (RR)

3.4.1 Definisi dan Rumus

Relative Risk (RR), atau Risk Ratio, adalah perbandingan peluang langsung (bukan odds) dari outcome pada dua kelompok. RR lebih intuitif daripada OR karena membandingkan probabilitas secara langsung, bukan rasio odds. RR paling tepat digunakan pada studi cohort (prospektif) di mana proporsi kejadian dapat diestimasi secara langsung.

\[\boxed{RR = \frac{p_1}{p_2} = \frac{a / (a+b)}{c / (c+d)}}\]

Di mana: - \(p_1 = a/(a+b)\) = peluang outcome pada kelompok terekspos (baris 1) - \(p_2 = c/(c+d)\) = peluang outcome pada kelompok tidak terekspos (baris 2)

Confidence Interval 95% untuk RR:

\[CI_{95\%} = \left[\exp\!\left(\ln\widehat{RR} - 1.96 \cdot SE\right),\ \exp\!\left(\ln\widehat{RR} + 1.96 \cdot SE\right)\right]\]

\[\text{dengan} \quad SE = \sqrt{\frac{b}{a(a+b)} + \frac{d}{c(c+d)}}\]

3.4.2 Interpretasi Relative Risk

Nilai RR Interpretasi
\(RR = 1\) Risiko sama pada kedua kelompok; tidak ada asosiasi
\(RR > 1\) Kelompok terekspos memiliki risiko lebih tinggi daripada tidak terekspos
\(RR < 1\) Paparan bersifat protektif — menurunkan risiko outcome
\(RR = 3\) Risiko outcome pada kelompok terekspos 3 kali lebih besar daripada tidak terekspos

3.5 Perbandingan OR vs RR

Aspek Odds Ratio (OR) Relative Risk (RR)
Definisi Rasio odds antar kelompok Rasio peluang langsung antar kelompok
Cocok untuk Studi case-control, regresi logistik Studi cohort, uji klinis (RCT)
Intuisi Kurang intuitif Lebih intuitif dan langsung
Nilai saat outcome langka Mendekati RR (rare disease assumption) Nilai langsung
Syarat perhitungan Selalu dapat dihitung dari tabel 2×2 Hanya valid jika proporsi dapat diestimasi secara langsung

💡 Aturan praktis: Ketika prevalensi outcome sangat kecil (< 10%), OR dan RR memberikan nilai yang hampir sama. Namun ketika prevalensi besar, OR selalu melebih-lebihkan kekuatan asosiasi dibanding RR. Dalam kasus seperti itu, gunakan RR bila memungkinkan.


4 Bagian 4: Contoh Perhitungan Manual


4.1 Kasus: Hubungan Merokok dan Kanker Paru-Paru

Latar Belakang Kasus: Seorang peneliti epidemiologi melakukan studi case-control untuk menyelidiki apakah kebiasaan merokok berkaitan dengan kejadian kanker paru-paru. Sebanyak 200 subjek direkrut, terdiri dari 100 pasien terdiagnosis kanker paru-paru (case) dan 100 orang sehat sebagai pembanding (control). Setiap subjek ditanyakan riwayat merokoknya.

Variabel penelitian: - \(X\): Status merokok (Merokok / Tidak Merokok) - \(Y\): Diagnosis kanker paru (Kanker / Tidak Kanker)


4.1.1 Langkah 1: Membuat Tabel Kontingensi

Data yang dikumpulkan peneliti adalah sebagai berikut: dari 200 subjek, ditemukan bahwa 90 perokok terdiri dari 70 orang yang mengidap kanker paru dan 20 orang sehat; sementara 110 bukan perokok terdiri dari 30 orang yang mengidap kanker paru dan 80 orang sehat.

Tabel Kontingensi: Status Merokok × Diagnosis Kanker Paru

Kanker Paru (\(Y=1\)) Tidak Kanker (\(Y=0\)) Total
Merokok (\(X=1\)) \(a = 70\) \(b = 20\) \(a+b = 90\)
Tidak Merokok (\(X=0\)) \(c = 30\) \(d = 80\) \(c+d = 110\)
Total \(a+c = 100\) \(b+d = 100\) \(n = 200\)

Dari tabel di atas, kita dapat langsung melihat secara deskriptif bahwa dari 90 perokok, 70 (77.8%) mengidap kanker, sedangkan dari 110 bukan perokok, hanya 30 (27.3%) yang mengidap kanker. Perbedaan yang sangat mencolok ini adalah sinyal awal adanya asosiasi yang kuat.


4.1.2 Langkah 2: Menghitung Peluang Bersyarat

Peluang bersyarat dihitung dengan membagi frekuensi sel dengan marginal baris yang bersesuaian:

Peluang kanker pada perokok: \[P(Y=1 \mid X=1) = \frac{a}{a+b} = \frac{70}{90} = 0.7\overline{7} \approx \mathbf{0.7778}\]

Peluang kanker pada bukan perokok: \[P(Y=1 \mid X=0) = \frac{c}{c+d} = \frac{30}{110} = 0.2\overline{72} \approx \mathbf{0.2727}\]

Peluang tidak kanker pada perokok: \[P(Y=0 \mid X=1) = \frac{b}{a+b} = \frac{20}{90} = 0.2\overline{2} \approx \mathbf{0.2222}\]

Peluang tidak kanker pada bukan perokok: \[P(Y=0 \mid X=0) = \frac{d}{c+d} = \frac{80}{110} = 0.7\overline{27} \approx \mathbf{0.7273}\]

Rangkuman peluang bersyarat:

Kelompok \(P(\text{Kanker} \mid \text{Kelompok})\) \(P(\text{Tidak Kanker} \mid \text{Kelompok})\) Total
Merokok \(70/90 = 0.7778\) \(20/90 = 0.2222\) \(1.0000\)
Tidak Merokok \(30/110 = 0.2727\) \(80/110 = 0.7273\) \(1.0000\)

Perbandingan \(P(\text{Kanker} \mid \text{Merokok}) = 0.7778\) vs \(P(\text{Kanker} \mid \text{Tidak Merokok}) = 0.2727\) menunjukkan perbedaan yang sangat besar — mahasiswa yang merokok memiliki peluang kanker yang jauh lebih tinggi.


4.1.3 Langkah 3: Menghitung Odds

Odds dihitung sebagai rasio peluang kejadian terhadap peluang ketidakjadian, atau secara langsung sebagai \(a/b\) dan \(c/d\):

Odds kanker pada kelompok perokok (\(X=1\)): \[\text{Odds}_{\text{Merokok}} = \frac{a}{b} = \frac{70}{20} = \mathbf{3.5000}\]

Artinya: Pada perokok, untuk setiap 1 orang yang tidak kanker, terdapat 3.5 orang yang kanker.

Odds kanker pada kelompok tidak merokok (\(X=0\)): \[\text{Odds}_{\text{Tidak Merokok}} = \frac{c}{d} = \frac{30}{80} = \mathbf{0.3750}\]

Artinya: Pada bukan perokok, untuk setiap 1 orang yang kanker, terdapat \(1/0.375 = 2.667\) orang yang tidak kanker.

Perbandingan Odds:

Kelompok Rumus Nilai Odds Interpretasi
Merokok \(70 / 20\) \(3.5000\) Perokok lebih besar peluang kankernya daripada tidak kanker
Tidak Merokok \(30 / 80\) \(0.3750\) Bukan perokok lebih kecil peluang kankernya daripada tidak kanker

4.1.4 Langkah 4: Menghitung Odds Ratio

Odds Ratio dihitung dengan membagi odds kelompok terekspos dengan odds kelompok tidak terekspos:

\[OR = \frac{\text{Odds}_{\text{Merokok}}}{\text{Odds}_{\text{Tidak Merokok}}} = \frac{a/b}{c/d} = \frac{ad}{bc}\]

\[OR = \frac{70 \times 80}{20 \times 30} = \frac{5600}{600} = \mathbf{9.3333}\]

Menghitung Confidence Interval 95%:

\[SE = \sqrt{\frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d}} = \sqrt{\frac{1}{70} + \frac{1}{20} + \frac{1}{30} + \frac{1}{80}}\]

\[SE = \sqrt{0.01429 + 0.05000 + 0.03333 + 0.01250} = \sqrt{0.11012} = 0.33184\]

\[\ln(\widehat{OR}) = \ln(9.3333) = 2.2336\]

\[CI_{\text{bawah}} = \exp(2.2336 - 1.96 \times 0.33184) = \exp(1.5832) = \mathbf{4.8703}\]

\[CI_{\text{atas}} = \exp(2.2336 + 1.96 \times 0.33184) = \exp(2.8840) = \mathbf{17.8964}\]

\[\therefore \quad OR = 9.333 \quad [95\% \ CI: 4.870,\ 17.896]\]

Menghitung Relative Risk sebagai perbandingan:

\[RR = \frac{a/(a+b)}{c/(c+d)} = \frac{70/90}{30/110} = \frac{0.7778}{0.2727} = \mathbf{2.8519}\]

Tabel Ringkasan Perhitungan Manual:

Ukuran Rumus Substitusi Hasil
Odds (Merokok) \(a / b\) \(70 / 20\) \(3.5000\)
Odds (Tidak Merokok) \(c / d\) \(30 / 80\) \(0.3750\)
Odds Ratio \(ad / bc\) \((70 \times 80)/(20 \times 30)\) \(9.3333\)
95% CI (bawah) \(\exp(\ln OR - 1.96 \cdot SE)\) \(\exp(2.2336 - 0.6504)\) \(4.8703\)
95% CI (atas) \(\exp(\ln OR + 1.96 \cdot SE)\) \(\exp(2.2336 + 0.6504)\) \(17.8964\)
Relative Risk \([a/(a+b)] / [c/(c+d)]\) \((70/90) / (30/110)\) \(2.8519\)

5 Bagian 5: Analisis Menggunakan R


5.1 Persiapan: Memuat Paket

# ── Memuat paket yang dibutuhkan ───────────────────────────────────────────
library(vcd)          # Mosaic plot dan ukuran asosiasi
library(DescTools)    # OddsRatio, RelRisk, CramerV, dll.
library(ggplot2)      # Visualisasi tingkat lanjut
library(dplyr)        # Manipulasi data
library(knitr)        # Render tabel
library(kableExtra)   # Styling tabel HTML
library(scales)       # Format angka dan persen

5.2 Langkah 1: Membuat Tabel Kontingensi

# ── Input data sesuai kasus merokok vs kanker paru ─────────────────────────
# Matriks 2x2: baris = Merokok/Tidak, kolom = Kanker/Tidak Kanker

tabel_kont <- matrix(
  c(70, 20,   # baris 1: Merokok    → Kanker=70, Tidak Kanker=20
    30, 80),  # baris 2: Tidak Merokok → Kanker=30, Tidak Kanker=80
  nrow = 2,
  byrow = TRUE,
  dimnames = list(
    "Status Merokok" = c("Merokok", "Tidak Merokok"),
    "Kanker Paru"    = c("Kanker", "Tidak Kanker")
  )
)

# Simpan total
n_total <- sum(tabel_kont)

# Tampilkan tabel dengan marginal
kable(
  addmargins(tabel_kont),
  caption = "Tabel 6. Tabel Kontingensi: Status Merokok × Diagnosis Kanker Paru",
  align   = "c"
) |>
  kable_styling(
    bootstrap_options = c("bordered", "hover"),
    full_width        = TRUE
  ) |>
  add_header_above(c(" " = 1, "Diagnosis Kanker Paru" = 2, " " = 1)) |>
  row_spec(0, bold = TRUE, background = "#1a5c5a", color = "white") |>
  row_spec(nrow(addmargins(tabel_kont)),
           bold = TRUE, background = "#d4edec") |>
  column_spec(1, bold = TRUE, background = "#eef7f6") |>
  column_spec(ncol(addmargins(tabel_kont)),
              bold = TRUE, background = "#d4edec")
Tabel 6. Tabel Kontingensi: Status Merokok × Diagnosis Kanker Paru
Diagnosis Kanker Paru
Kanker Tidak Kanker Sum
Merokok 70 20 90
Tidak Merokok 30 80 110
Sum 100 100 200
# ── Tabel proporsi bersyarat (per baris) ───────────────────────────────────
prop_baris <- prop.table(tabel_kont, margin = 1)

kable(
  round(prop_baris, 4),
  caption = "Tabel 7. Distribusi Peluang Bersyarat P(Kanker Paru | Status Merokok)",
  align   = "c"
) |>
  kable_styling(
    bootstrap_options = c("bordered", "hover", "striped"),
    full_width        = FALSE,
    position          = "center"
  ) |>
  row_spec(0, bold = TRUE, background = "#1a5c5a", color = "white") |>
  column_spec(2, bold = TRUE, color = "#8b3a1e")
Tabel 7. Distribusi Peluang Bersyarat P(Kanker Paru | Status Merokok)
Kanker Tidak Kanker
Merokok 0.7778 0.2222
Tidak Merokok 0.2727 0.7273

5.3 Langkah 2: Menghitung Odds Ratio

# ── Ekstrak nilai sel ───────────────────────────────────────────────────────
a <- tabel_kont[1, 1]  # Merokok & Kanker
b <- tabel_kont[1, 2]  # Merokok & Tidak Kanker
c_val <- tabel_kont[2, 1]  # Tidak Merokok & Kanker
d <- tabel_kont[2, 2]  # Tidak Merokok & Tidak Kanker

# ── Hitung Odds masing-masing kelompok ─────────────────────────────────────
odds_merokok      <- a / b
odds_tidak_merokok <- c_val / d

cat("══ ODDS ════════════════════════════════════════════════════════════\n")
#> ══ ODDS ════════════════════════════════════════════════════════════
cat(sprintf("  Odds (Merokok)      = %d / %d = %.4f\n", a, b, odds_merokok))
#>   Odds (Merokok)      = 70 / 20 = 3.5000
cat(sprintf("  Odds (Tidak Merokok) = %d / %d = %.4f\n",
            c_val, d, odds_tidak_merokok))
#>   Odds (Tidak Merokok) = 30 / 80 = 0.3750
# ── Hitung OR secara manual ─────────────────────────────────────────────────
OR_manual <- (a * d) / (b * c_val)
log_OR    <- log(OR_manual)
SE_log    <- sqrt(1/a + 1/b + 1/c_val + 1/d)
CI_low    <- exp(log_OR - 1.96 * SE_log)
CI_high   <- exp(log_OR + 1.96 * SE_log)

cat("\n══ ODDS RATIO ══════════════════════════════════════════════════════\n")
#> 
#> ══ ODDS RATIO ══════════════════════════════════════════════════════
cat(sprintf("  OR  = (%d × %d) / (%d × %d)\n", a, d, b, c_val))
#>   OR  = (70 × 80) / (20 × 30)
cat(sprintf("      = %d / %d\n", a*d, b*c_val))
#>       = 5600 / 600
cat(sprintf("      = %.4f\n", OR_manual))
#>       = 9.3333
cat(sprintf("  SE(ln OR) = %.4f\n", SE_log))
#>   SE(ln OR) = 0.3318
cat(sprintf("  95%% CI    = [%.4f, %.4f]\n", CI_low, CI_high))
#>   95% CI    = [4.8704, 17.8857]
# ── Hitung OR menggunakan fungsi R (verifikasi) ─────────────────────────────
OR_r <- OddsRatio(tabel_kont, conf.level = 0.95)
cat("\n══ VERIFIKASI DENGAN FUNGSI R (DescTools::OddsRatio) ═══════════════\n")
#> 
#> ══ VERIFIKASI DENGAN FUNGSI R (DescTools::OddsRatio) ═══════════════
print(OR_r)
#> odds ratio     lwr.ci     upr.ci 
#>   9.333333   4.870488  17.885501
# ── Menghitung Relative Risk ────────────────────────────────────────────────
p1   <- a / (a + b)          # peluang kanker pada perokok
p2   <- c_val / (c_val + d)  # peluang kanker pada bukan perokok
RR   <- p1 / p2
SE_RR <- sqrt(b / (a * (a+b)) + d / (c_val * (c_val+d)))
CI_RR_low  <- exp(log(RR) - 1.96 * SE_RR)
CI_RR_high <- exp(log(RR) + 1.96 * SE_RR)

cat("══ RELATIVE RISK ═══════════════════════════════════════════════════\n")
#> ══ RELATIVE RISK ═══════════════════════════════════════════════════
cat(sprintf("  p1 (Merokok)      = %d / %d = %.4f\n", a, a+b, p1))
#>   p1 (Merokok)      = 70 / 90 = 0.7778
cat(sprintf("  p2 (Tidak Merokok) = %d / %d = %.4f\n", c_val, c_val+d, p2))
#>   p2 (Tidak Merokok) = 30 / 110 = 0.2727
cat(sprintf("  RR  = %.4f / %.4f = %.4f\n", p1, p2, RR))
#>   RR  = 0.7778 / 0.2727 = 2.8519
cat(sprintf("  95%% CI = [%.4f, %.4f]\n", CI_RR_low, CI_RR_high))
#>   95% CI = [2.0615, 3.9452]
# ── Tabel ringkasan OR dan RR ───────────────────────────────────────────────
ringkasan_or <- data.frame(
  Ukuran  = c("Odds (Merokok)", "Odds (Tidak Merokok)",
              "Odds Ratio (OR)", "Relative Risk (RR)"),
  Rumus   = c("a/b", "c/d", "ad/bc", "p₁/p₂"),
  Nilai   = c(round(odds_merokok, 4), round(odds_tidak_merokok, 4),
              round(OR_manual, 4), round(RR, 4)),
  CI_95   = c("—", "—",
              paste0("[", round(CI_low,3), ", ", round(CI_high,3), "]"),
              paste0("[", round(CI_RR_low,3), ", ", round(CI_RR_high,3), "]"))
)

kable(
  ringkasan_or,
  col.names = c("Ukuran", "Rumus", "Nilai", "95% CI"),
  caption   = "Tabel 8. Ringkasan Odds, Odds Ratio, dan Relative Risk",
  align     = c("l", "c", "c", "c")
) |>
  kable_styling(
    bootstrap_options = c("bordered", "hover", "striped"),
    full_width        = TRUE
  ) |>
  row_spec(0, bold = TRUE, background = "#1a5c5a", color = "white") |>
  row_spec(3, bold = TRUE, background = "#fff5d4") |>
  row_spec(4, bold = TRUE, background = "#fff5d4") |>
  column_spec(3, bold = TRUE, color = "#1a5c5a")
Tabel 8. Ringkasan Odds, Odds Ratio, dan Relative Risk
Ukuran Rumus Nilai 95% CI
Odds (Merokok) a/b 3.5000
Odds (Tidak Merokok) c/d 0.3750
Odds Ratio (OR) ad/bc 9.3333 [4.87, 17.886]
Relative Risk (RR) p₁/p₂ 2.8519 [2.061, 3.945]

5.4 Langkah 3: Uji Chi-Square

# ── Uji Chi-Square (tanpa koreksi Yates) ───────────────────────────────────
hasil_chi2 <- chisq.test(tabel_kont, correct = FALSE)

# Ekstrak komponen penting
chi2_val    <- hasil_chi2$statistic
df_val      <- hasil_chi2$parameter
p_val       <- hasil_chi2$p.value
E_mat       <- hasil_chi2$expected
chi2_kritis <- qchisq(0.95, df = df_val)

cat("══ UJI CHI-SQUARE ══════════════════════════════════════════════════\n")
#> ══ UJI CHI-SQUARE ══════════════════════════════════════════════════
print(hasil_chi2)
#> 
#>  Pearson's Chi-squared test
#> 
#> data:  tabel_kont
#> X-squared = 50.505, df = 1, p-value = 1.189e-12
cat("\n── Frekuensi Ekspektasi E_ij ───────────────────────────────────────\n")
#> 
#> ── Frekuensi Ekspektasi E_ij ───────────────────────────────────────
print(round(E_mat, 4))
#>                Kanker Paru
#> Status Merokok  Kanker Tidak Kanker
#>   Merokok           45           45
#>   Tidak Merokok     55           55
cat(sprintf("\n── Nilai Kritis (df=%d, α=0.05): %.4f\n", df_val, chi2_kritis))
#> 
#> ── Nilai Kritis (df=1, α=0.05): 3.8415
cat(sprintf("── Keputusan: χ²_hitung (%.4f) %s χ²_kritis (%.4f) → %s\n",
            chi2_val,
            ifelse(chi2_val > chi2_kritis, ">", "≤"),
            chi2_kritis,
            ifelse(chi2_val > chi2_kritis, "TOLAK H₀", "GAGAL TOLAK H₀")))
#> ── Keputusan: χ²_hitung (50.5051) > χ²_kritis (3.8415) → TOLAK H₀
# ── Tabel detail Chi-Square per sel ────────────────────────────────────────
O_mat     <- tabel_kont
kontrib   <- (O_mat - E_mat)^2 / E_mat
sel_names <- c("Merokok | Kanker", "Tidak Merokok | Kanker",
                "Merokok | Tidak Kanker", "Tidak Merokok | Tidak Kanker")

detail_chi2 <- data.frame(
  Sel         = c("Merokok | Kanker", "Merokok | Tidak Kanker",
                  "Tidak Merokok | Kanker", "Tidak Merokok | Tidak Kanker"),
  O           = as.vector(t(O_mat)),
  E           = round(as.vector(t(E_mat)), 4),
  `O-E`       = round(as.vector(t(O_mat - E_mat)), 4),
  `(O-E)^2/E` = round(as.vector(t(kontrib)), 4)
)

kable(
  detail_chi2,
  col.names = c("Sel (i, j)", "O", "E", "O − E", "(O−E)² / E"),
  caption   = "Tabel 9. Kontribusi Tiap Sel terhadap Statistik Chi-Square",
  align     = c("l", "c", "c", "c", "c")
) |>
  kable_styling(
    bootstrap_options = c("bordered", "hover", "striped"),
    full_width        = TRUE
  ) |>
  row_spec(0, bold = TRUE, background = "#1a5c5a", color = "white") |>
  column_spec(5, bold = TRUE, color = "#8b3a1e")
Tabel 9. Kontribusi Tiap Sel terhadap Statistik Chi-Square
Sel (i, j) O E O − E (O−E)² / E
Merokok &#124; Kanker 70 45 25 13.8889
Merokok &#124; Tidak Kanker 20 45 -25 13.8889
Tidak Merokok &#124; Kanker 30 55 -25 11.3636
Tidak Merokok &#124; Tidak Kanker 80 55 25 11.3636

5.5 Visualisasi

# ── Bar chart proporsi bersyarat ────────────────────────────────────────────
# as.data.frame.table() mengubah ke long format: Var1, Var2, Freq
df_plot <- as.data.frame.table(prop.table(tabel_kont, margin = 1))
colnames(df_plot) <- c("Merokok", "Kanker_Paru", "Proporsi")

ggplot(df_plot, aes(x = Merokok, y = Proporsi, fill = Kanker_Paru)) +
  geom_col(position = "dodge", width = 0.6, alpha = 0.92, color = "white") +
  geom_text(aes(label = percent(Proporsi, accuracy = 0.1)),
            position = position_dodge(0.6), vjust = -0.5,
            size = 4.5, fontface = "bold") +
  scale_fill_manual(
    values = c("Kanker" = "#8b3a1e", "Tidak Kanker" = "#1a5c5a"),
    name   = "Diagnosis"
  ) +
  scale_y_continuous(labels = percent, limits = c(0, 0.95),
                     expand = c(0, 0)) +
  labs(
    title    = "Proporsi Kanker Paru berdasarkan Status Merokok",
    subtitle = bquote(chi^2 ~ "=" ~ .(round(chi2_val, 2)) ~
                      ", p < 0.001" ~
                      ", OR =" ~ .(round(OR_manual, 2))),
    x        = "Status Merokok",
    y        = "Proporsi (%)",
    caption  = "Catatan: Proporsi dihitung dalam masing-masing kelompok merokok"
  ) +
  theme_minimal(base_size = 13) +
  theme(
    plot.title    = element_text(face = "bold", color = "#1a5c5a", size = 14),
    plot.subtitle = element_text(color = "#555", size = 11),
    plot.caption  = element_text(color = "#888", face = "italic", size = 10),
    legend.position = "top",
    panel.grid.major.x = element_blank(),
    panel.grid.minor   = element_blank()
  )
Gambar 1. Proporsi Kanker Paru berdasarkan Status Merokok

Gambar 1. Proporsi Kanker Paru berdasarkan Status Merokok

# ── Mosaic plot dengan shade residual Pearson ───────────────────────────────
mosaic(
  tabel_kont,
  shade   = TRUE,
  legend  = TRUE,
  main    = "Mosaic Plot: Status Merokok × Kanker Paru",
  sub     = paste0("OR = ", round(OR_manual, 3),
                   "  |  χ² = ", round(chi2_val, 3),
                   "  |  p < 0.001")
)
Gambar 2. Mosaic Plot: Status Merokok × Kanker Paru

Gambar 2. Mosaic Plot: Status Merokok × Kanker Paru


5.6 Interpretasi Hasil Analisis

5.6.1 Interpretasi Statistik

Hasil Uji Chi-Square:

Diperoleh nilai statistik uji \(\chi^2(1) = 50.505\) dengan \(p\text{-value} = 1.19e-12\). Karena \(\chi^2_{\text{hitung}} = 50.505 > \chi^2_{\text{kritis}} = 3.841\) dan \(p\text{-value} < 0.001\), maka:

Keputusan: TOLAK H₀ pada taraf signifikansi \(\alpha = 0.05\) (bahkan pada \(\alpha = 0.001\)).

Terdapat asosiasi yang signifikan secara statistik antara kebiasaan merokok dan kejadian kanker paru-paru (\(p < 0.001\)).


Kekuatan Asosiasi (Odds Ratio):

\[OR = 9.3333 \quad [95\% \ CI: 4.87,\ 17.886]\]

Karena seluruh interval kepercayaan berada jauh di atas 1 (batas bawah CI = 4.87), OR ini signifikan secara statistik dan menunjukkan asosiasi positif yang sangat kuat.


Relative Risk:

\[RR = 2.8519 \quad [95\% \ CI: 2.061,\ 3.945]\]


5.6.2 Interpretasi Substantif dalam Konteks Kasus

1. Tentang Odds Ratio (\(OR = 9.333\)):

Odds terkena kanker paru pada kelompok perokok adalah 9.333 kali lebih tinggi dibandingkan odds pada kelompok bukan perokok (95% CI: 4.87 hingga 17.89). Ini berarti: dalam studi ini, perokok memiliki kemungkinan relatif terkena kanker paru yang jauh lebih besar secara praktis, bukan hanya secara statistik.

2. Tentang Relative Risk (\(RR = 2.852\)):

Peluang terkena kanker paru pada perokok (\(77.8\%\)) adalah 2.852 kali lebih besar dibandingkan pada bukan perokok (\(27.3\%\)). RR lebih kecil dari OR karena prevalensi outcome cukup tinggi dalam data ini (~50%) — OR melebih-lebihkan kekuatan asosiasi pada kondisi seperti ini.

3. Catatan Kausalitas dan Keterbatasan:

  • Asosiasi ≠ Kausalitas. Studi ini menunjukkan asosiasi yang kuat, namun untuk menyimpulkan kausalitas, diperlukan studi kohort prospektif jangka panjang dengan kontrol terhadap faktor perancu (usia, jenis pekerjaan, riwayat keluarga, paparan zat kimia lain).
  • Desain case-control memungkinkan perhitungan OR, tetapi RR yang dihitung dari studi case-control tidak valid secara langsung jika sampling dilakukan berdasarkan status penyakit (bukan secara acak dari populasi).
  • Variabel perancu seperti usia, lama merokok, jumlah rokok per hari, dan faktor lingkungan lain tidak dikontrol dalam analisis bivariat ini.
  • Data simulasi — angka-angka dalam contoh ini bersifat ilustratif dan tidak merepresentasikan studi epidemiologi nyata.

6 Referensi

No. Penulis Tahun Judul Penerbit/Jurnal
1 Agresti, A. 2013 Categorical Data Analysis, 3rd ed. Wiley
2 Friendly, M. 2000 Visualizing Categorical Data SAS Institute
3 Hosmer, D. W. & Lemeshow, S. 2013 Applied Logistic Regression, 3rd ed. Wiley
4 Rothman, K. J. 2012 Epidemiology: An Introduction, 2nd ed. Oxford University Press
5 R Core Team 2024 R: A Language and Environment for Statistical Computing R Foundation
6 Meyer, D., Zeileis, A., & Hornik, K. 2023 vcd: Visualizing Categorical Data R Package

Analisis Data Kategori  ·  Tabel Kontingensi, Ukuran Asosiasi & Implementasi R
Dibuat dengan R Markdown  ·  08 March 2026