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.
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 |
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.
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:
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 |
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 |
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.
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\) |
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.
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.
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.
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.
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:
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\)) |
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}}\]
| 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.
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)}}\]
| 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 |
| 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.
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)
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.
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.
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 |
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\) |
# ── 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# ── 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")| 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")| Kanker | Tidak Kanker | |
|---|---|---|
| Merokok | 0.7778 | 0.2222 |
| Tidak Merokok | 0.2727 | 0.7273 |
# ── 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 ════════════════════════════════════════════════════════════
#> Odds (Merokok) = 70 / 20 = 3.5000
#> 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 ══════════════════════════════════════════════════════
#> OR = (70 × 80) / (20 × 30)
#> = 5600 / 600
#> = 9.3333
#> SE(ln OR) = 0.3318
#> 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) ═══════════════
#> 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 ═══════════════════════════════════════════════════
#> p1 (Merokok) = 70 / 90 = 0.7778
#> p2 (Tidak Merokok) = 30 / 110 = 0.2727
#> RR = 0.7778 / 0.2727 = 2.8519
#> 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")| 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] |
# ── 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 ══════════════════════════════════════════════════
#>
#> Pearson's Chi-squared test
#>
#> data: tabel_kont
#> X-squared = 50.505, df = 1, p-value = 1.189e-12
#>
#> ── Frekuensi Ekspektasi E_ij ───────────────────────────────────────
#> Kanker Paru
#> Status Merokok Kanker Tidak Kanker
#> Merokok 45 45
#> Tidak Merokok 55 55
#>
#> ── 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")| Sel (i, j) | O | E | O − E | (O−E)² / E |
|---|---|---|---|---|
| Merokok | Kanker | 70 | 45 | 25 | 13.8889 |
| Merokok | Tidak Kanker | 20 | 45 | -25 | 13.8889 |
| Tidak Merokok | Kanker | 30 | 55 | -25 | 11.3636 |
| Tidak Merokok | Tidak Kanker | 80 | 55 | 25 | 11.3636 |
# ── 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
# ── 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
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]\]
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:
| 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