AZZAM
ANSHORY
NIM
140610240092
Analisis Data
Kategori · Program Studi Statistika FMIPA
Universitas Padjadjaran ·
2026
Dosen:
Prof. I Gede Nyoman Mindra Jaya, M.Si., Ph.D.
11 March 2026
Laporan ini menyajikan kajian akademik mengenai analisis data kategori dengan studi kasus hubungan antara aktivitas olahraga dan risiko penyakit jantung. Pembahasan mencakup konsep dasar analisis data kategori, konstruksi dan interpretasi tabel kontingensi, pengukuran asosiasi melalui odds, odds ratio (OR), dan relative risk (RR), serta implementasi komputasional menggunakan perangkat lunak R. Hasil analisis menunjukkan bahwa individu yang tidak berolahraga memiliki risiko dua kali lebih besar terkena penyakit jantung dibandingkan individu yang rutin berolahraga (OR = 2,67; RR = 2,00). Uji chi-square mengkonfirmasi bahwa asosiasi kedua variabel tersebut signifikan secara statistik (p < 0,05).
Kata kunci: analisis data kategori, tabel kontingensi, odds ratio, relative risk, penyakit jantung
Analisis data kategori (categorical data analysis) adalah cabang statistika yang mempelajari metode pengumpulan, penyajian, dan penarikan inferensi dari data yang diukur dalam skala nominal atau ordinal, di mana setiap observasi diklasifikasikan ke dalam satu dari beberapa kategori yang mutually exclusive dan exhaustive.
Agresti (2013) mendefinisikan data kategori sebagai data yang nilainya merupakan label atau kategori, bukan ukuran kuantitatif. Berbeda dengan analisis regresi konvensional yang mengasumsikan normalitas dan kontinuitas variabel respons, analisis data kategori menggunakan model-model khusus seperti logistic regression, log-linear models, dan generalized linear models (GLM) dengan fungsi link yang sesuai.
Dalam epidemiologi dan ilmu kesehatan masyarakat, metode ini sangat lazim digunakan untuk menganalisis hubungan antara faktor risiko (misalnya: merokok, obesitas, aktivitas fisik) dengan kejadian penyakit (misalnya: penyakit jantung, diabetes, kanker).
Variabel kategori memiliki sejumlah karakteristik yang membedakannya dari variabel kontinu, antara lain:
| Aspek | Variabel Nominal | Variabel Ordinal |
|---|---|---|
| Urutan Kategori | Tidak ada urutan alami | Terdapat urutan yang bermakna |
| Operasi Matematika | Hanya kesamaan (=, ≠) | Kesamaan dan perbandingan (<, >) |
| Contoh | Jenis kelamin, golongan darah | Tingkat pendidikan, derajat keparahan penyakit |
| Ukuran Tendensi Sentral | Modus | Modus, Median |
| Uji Statistik Umum | Chi-square, Fisher’s Exact | Chi-square, Kruskal-Wallis, Spearman’s \(\rho\) |
Analisis data kategori memiliki peran sentral dalam penelitian kesehatan masyarakat dan epidemiologi. Beberapa penerapan utamanya meliputi:
Pemahaman mendalam tentang analisis data kategori sangat esensial bagi praktisi statistika di bidang kesehatan. Sebagian besar variabel dalam penelitian klinis dan epidemiologi bersifat kategoris, sehingga penguasaan metode ini merupakan kompetensi inti yang tidak dapat diabaikan (Agresti, 2013; Stokes, Davis & Koch, 2012).
Tabel kontingensi (contingency table atau cross-tabulation table) adalah suatu matriks yang merangkum distribusi frekuensi dari dua atau lebih variabel kategori secara simultan. Tabel ini memperlihatkan frekuensi observasi yang jatuh pada setiap kombinasi kategori dari variabel-variabel yang diamati (Agresti, 2013).
Untuk dua variabel biner \(X\) (baris) dan \(Y\) (kolom), tabel kontingensi \(2 \times 2\) memiliki struktur berikut:
| \(X\) \(Y\) | \(y_1\) (Penyakit) | \(y_2\) (Tidak Penyakit) | Total |
|---|---|---|---|
| \(x_1\) (Olahraga) | \(n_{11}\) | \(n_{12}\) | \(n_{1 \cdot}\) |
| \(x_2\) (Tidak Olahraga) | \(n_{21}\) | \(n_{22}\) | \(n_{2 \cdot}\) |
| Total | \(n_{\cdot 1}\) | \(n_{\cdot 2}\) | \(n_{\cdot\cdot}\) |
di mana:
Distribusi bersama (joint probability) mendefinisikan probabilitas setiap kombinasi kategori dari dua variabel. Sesuai notasi yang digunakan pada mata kuliah ini, peluang bersama dilambangkan dengan \(\pi_{ij}\), yaitu:
\[P(X=i,\ Y=j) = \pi_{ij}, \qquad \pi_{ij} = \frac{n_{ij}}{n_{\cdot\cdot}}, \quad i = 1,2;\ j = 1,2\]
Tabel distribusi peluang bersama untuk tabel \(2 \times 2\):
| \(X\) \(Y\) | \(1\) | \(2\) | Total |
|---|---|---|---|
| \(1\) | \(\pi_{11}\) | \(\pi_{12}\) | \(\pi_{1\cdot}\) |
| \(2\) | \(\pi_{21}\) | \(\pi_{22}\) | \(\pi_{2\cdot}\) |
| Total | \(\pi_{\cdot 1}\) | \(\pi_{\cdot 2}\) | \(1\) |
Sifat normalitas distribusi bersama:
\[\pi_{11} + \pi_{12} + \pi_{21} + \pi_{22} = \pi_{1\cdot} + \pi_{2\cdot} = \pi_{\cdot 1} + \pi_{\cdot 2} = 1\]
Distribusi marjinal (marginal probability) diperoleh dengan menjumlahkan peluang bersama terhadap salah satu variabel:
\[\pi_{i\cdot} = \pi_{i1} + \pi_{i2} = \sum_{j} \pi_{ij} \qquad \text{(peluang marjinal variabel } X \text{ kategori ke-}i\text{)}\]
\[\pi_{\cdot j} = \pi_{1j} + \pi_{2j} = \sum_{i} \pi_{ij} \qquad \text{(peluang marjinal variabel } Y \text{ kategori ke-}j\text{)}\]
Distribusi marjinal mencerminkan distribusi masing-masing variabel secara terpisah tanpa mempertimbangkan variabel lainnya. Estimasi sampelnya adalah \(\hat{\pi}_{i\cdot} = n_{i\cdot}/n_{\cdot\cdot}\) dan \(\hat{\pi}_{\cdot j} = n_{\cdot j}/n_{\cdot\cdot}\).
Distribusi peluang bersyarat (conditional probability) ditentukan dengan menetapkan terlebih dahulu variabel yang dijadikan syarat. Apabila variabel \(X\) yang menjadi syarat, maka distribusi peluang \(Y\) bersyarat \(X\) dinyatakan sebagai:
\[\pi_{j|h} = P(Y = j \mid X = h) = \frac{\pi_{hj}}{\pi_{h\cdot}}, \qquad \sum_{j} \pi_{j|h} = 1\]
Tabel distribusi peluang bersyarat untuk tabel \(2 \times 2\) (bersyarat \(X\)):
| \(X\) \(Y\) | \(1\) | \(2\) | Total |
|---|---|---|---|
| \(1\) | \(\pi_{1|1}\) | \(\pi_{2|1}\) | \(1\) |
| \(2\) | \(\pi_{1|2}\) | \(\pi_{2|2}\) | \(1\) |
Probabilitas bersyarat ini merupakan dasar dari perhitungan proporsi dan risiko dalam analisis epidemiologi.
Jika \(X\) dan \(Y\) saling bebas (independen), maka peluang bersyarat sama dengan peluang marjinal: \[\pi_{j|h} = \pi_{\cdot j} \qquad \text{atau ekuivalen} \qquad \pi_{hj} = \pi_{h\cdot} \times \pi_{\cdot j}\] Sebaliknya, jika \(\pi_{j|h} \neq \pi_{j|i}\) untuk suatu pasangan \(h \neq i\), maka terdapat asosiasi antara \(X\) dan \(Y\).
Sesuai materi perkuliahan, untuk penelitian yang melibatkan variabel acak \(X\) dan \(Y\) yang keduanya bersifat kategori dan dideskripsikan dalam tabel kontingensi, terdapat tiga jenis desain sampling yang mungkin digunakan:
| Desain | Deskripsi | Ukuran Asosiasi yang Tepat |
|---|---|---|
| Prospektif | Variabel respons \(Y\) diukur setelah pengelompokan \(X\) ditetapkan. Peneliti mempunyai kendali atas pengelompokan. Contoh: Clinical Trial dan Cohort Study | RR dan OR |
| Retrospektif | Variabel respons \(Y\) ditentukan terlebih dahulu, kemudian ditelusuri variabel prediktor \(X\)-nya. Disebut juga Case-control Study | OR |
| Cross-Sectional | Sampel acak diambil dari populasi; setiap unit diklasifikasi menurut \(X\) dan \(Y\) tanpa membatasi variabel mana yang menjadi prediktor/respons | RR dan OR |
Pada desain retrospektif (kasus-kontrol), distribusi \(Y\) bersyarat \(X\) tidak dapat dikerjakan langsung karena proporsi kasus dan kontrol ditentukan secara artifisial oleh peneliti. Oleh karena itu, Odds Ratio (OR) menjadi satu-satunya ukuran asosiasi yang valid. OR merupakan estimasi yang baik untuk RR ketika prevalensi penyakit rendah , kondisi ini dikenal sebagai rare disease assumption (Rothman et al., 2008).
Dalam epidemiologi, tabel kontingensi \(2 \times 2\) antara faktor risiko dan hasil penyakit biasanya disajikan menggunakan notasi huruf sebagai berikut:
| Penyakit (+) | Tidak Penyakit (−) | Total | |
|---|---|---|---|
| Olahraga | \(a\) | \(b\) | \(a + b\) |
| Tidak Olahraga | \(c\) | \(d\) | \(c + d\) |
| Total | \(a + c\) | \(b + d\) | \(n\) |
Odds adalah rasio antara probabilitas suatu kejadian terjadi terhadap probabilitas kejadian tersebut tidak terjadi.
\[\text{Odds} = \frac{p}{1 - p}\]
di mana \(p\) adalah probabilitas kejadian penyakit. Dalam konteks tabel \(2 \times 2\):
\[\text{Odds}_{\text{Olahraga}} = \frac{a/(a+b)}{b/(a+b)} = \frac{a}{b}, \qquad \text{Odds}_{\text{Tidak Olahraga}} = \frac{c/(c+d)}{d/(c+d)} = \frac{c}{d}\]
Interpretasi: Odds = 2 berarti kejadian dua kali lebih mungkin terjadi daripada tidak terjadi.
Rasio Odds (OR) merupakan asosiasi antara \(X\) dan \(Y\) yang diperlihatkan melalui rasio dua buah odds , odds baris 1 terhadap odds baris 2. Odds dalam baris \(i\) untuk respons \(Y = j\) dan \(Y = k\) adalah:
\[\Psi_i(j,k) = \frac{\pi_{ij}}{\pi_{ik}}\]
Rasio Odds antara dua baris \(h\) dan \(i\) kemudian didefinisikan sebagai:
\[\Psi_{hi}(j,k) = \frac{\Psi_h(j,k)}{\Psi_i(j,k)} = \frac{\pi_{j|h}/\pi_{k|h}}{\pi_{j|i}/\pi_{k|i}} = \frac{\pi_{hj} \times \pi_{ik}}{\pi_{ij} \times \pi_{hk}}\]
Secara khusus, untuk tabel kontingensi \(2 \times 2\), OR merupakan cross product dari elemen-elemen diagonal:
\[\Psi_{hi}(j,k) = \frac{\pi_{11} \times \pi_{22}}{\pi_{12} \times \pi_{21}} = \frac{n_{11} \times n_{22}}{n_{12} \times n_{21}} = \frac{ad}{bc}\]
Interpretasi Rasio Odds:
| Nilai OR | Interpretasi |
|---|---|
| \(\Psi_{hi} = 1\) | \(X\) dan \(Y\) independen; tidak ada asosiasi |
| \(\Psi_{hi} > 1\) | Baris \(h\) menghasilkan respons \(j\) sebesar \(\Psi_{hi}\) kali lebih mungkin dibanding baris \(i\) |
| \(\Psi_{hi} < 1\) | Baris \(h\) menghasilkan respons \(j\) lebih jarang dibanding baris \(i\) |
Nilai OR berkisar dalam interval \([0, \infty)\). Satu kategori dari baris dan satu dari kolom dapat dijadikan baseline dalam perhitungan OR. Untuk tabel \(I \times J\), cukup dihitung sebanyak \((I-1) \times (J-1)\) odds ratio.
Hubungan dengan Log-Odds (Logit): Dalam model regresi logistik, logaritma natural dari OR merupakan koefisien regresi \(\hat{\beta}\):
\[\ln(\Psi) = \hat{\beta}_1 \quad \Rightarrow \quad \Psi = e^{\hat{\beta}_1}\]
Sehingga OR berfungsi sebagai effect size dari prediktor kategori dalam model logistik.
Beda peluang (difference probability) adalah selisih antara dua peluang bersyarat \(Y = j\) untuk dua kategori \(X\) yang berbeda, yaitu \(h\) dan \(i\).
\[\Delta = \pi_{j|h} - \pi_{j|i}\]
Nilai beda peluang sebesar nol (\(\Delta = 0\), atau \(\pi_{j|h} = \pi_{j|i}\)) mencerminkan keadaan tidak terdapat asosiasi, artinya peluang nilai variabel respons \(Y = j\) tidak bergantung pada kategori \(X\). Dalam konteks kasus ini:
\[\Delta = P(\text{Penyakit} \mid \text{Tidak Olahraga}) - P(\text{Penyakit} \mid \text{Olahraga}) = \pi_{1|2} - \pi_{1|1}\]
Beda peluang antara dua baris dapat menghasilkan nilai yang sama meskipun peluang-peluangnya tidak sama. Selain itu, beda peluang akan memberikan kesimpulan yang keliru ketika peluang-peluang yang terlibat bernilai sangat kecil. Oleh karena itu, Risiko Relatif (RR) dan Rasio Odds (OR) dikembangkan sebagai alternatif yang lebih informatif.
Resiko Relatif (RR) adalah rasio antara dua peluang bersyarat, yaitu antara peluang \(Y = j\) dalam baris \(X = h\) dengan \(X = i\). RR paling tepat digunakan dalam studi kohort (prospektif).
\[RR = \frac{\pi_{j|h}}{\pi_{j|i}}\]
Nilai \(RR = 1\) mengindikasikan \(\pi_{j|h} = \pi_{j|i}\), artinya \(Y\) dan \(X\) independen. Dalam konteks tabel \(2 \times 2\) dengan notasi \(a, b, c, d\):
\[RR = \frac{\pi_{1|\text{Tidak Olahraga}}}{\pi_{1|\text{Olahraga}}} = \frac{c/(c+d)}{a/(a+b)}\]
Perbandingan OR dan RR:
Relative Risk (RR) hanya dapat dihitung secara valid pada studi kohort (prospektif). Pada studi kasus-kontrol, OR menjadi ukuran pilihan, dan OR merupakan estimasi yang baik untuk RR ketika prevalensi penyakit rendah (<10%) , kondisi ini dikenal sebagai rare disease assumption (Rothman et al., 2008).
Berikut adalah contoh data hipotetis yang akan digunakan untuk ilustrasi perhitungan manual:
| Penyakit Jantung (+) | Tidak Penyakit (−) | Total | |
|---|---|---|---|
| Olahraga | 20 (\(a\)) | 80 (\(b\)) | 100 |
| Tidak Olahraga | 40 (\(c\)) | 60 (\(d\)) | 100 |
| Total | 60 | 140 | 200 |
Sebelum melakukan analisis statistik, perlu dirumuskan hipotesis yang akan diuji secara formal. Terdapat tiga hipotesis yang relevan dalam analisis asosiasi data kategori pada kasus ini.
Uji chi-square digunakan untuk menguji apakah terdapat asosiasi antara variabel aktivitas olahraga (\(X\)) dan variabel status penyakit jantung (\(Y\)) dalam populasi.
\[H_0 : \pi_{j|1} = \pi_{j|2} \quad \forall\ j \qquad \text{(}X \text{ dan } Y \text{ independen , tidak ada asosiasi)}\] \[H_1 : \pi_{j|1} \neq \pi_{j|2} \quad \text{untuk suatu } j \qquad \text{(terdapat asosiasi antara } X \text{ dan } Y\text{)}\]
Secara ekuivalen, \(H_0\) dapat dinyatakan sebagai \(\pi_{ij} = \pi_{i\cdot} \times \pi_{\cdot j}\) untuk semua sel \((i,j)\). Statistik uji yang digunakan adalah:
\[\chi^2 = \sum_{i}\sum_{j} \frac{(n_{ij} - \hat{\mu}_{ij})^2}{\hat{\mu}_{ij}}, \qquad \hat{\mu}_{ij} = \frac{n_{i\cdot} \times n_{\cdot j}}{n_{\cdot\cdot}}\]
di mana \(\hat{\mu}_{ij}\) adalah frekuensi harapan (expected frequency) pada sel \((i,j)\). Statistik \(\chi^2\) mengikuti distribusi chi-square dengan derajat bebas \(df = (I-1)(J-1)\). Untuk tabel \(2 \times 2\), \(df = 1\).
Uji chi-square valid apabila tidak ada sel yang memiliki frekuensi harapan kurang dari 5. Apabila syarat ini tidak terpenuhi, gunakan Uji Eksak Fisher (Fisher’s Exact Test) sebagai alternatif.
Uji signifikansi OR menguji apakah kekuatan asosiasi antara olahraga dan penyakit jantung berbeda secara nyata dari kondisi independen (\(\Psi = 1\)).
\[H_0 : \Psi = 1 \qquad \text{(tidak ada asosiasi; olahraga tidak berpengaruh terhadap risiko penyakit jantung)}\] \[H_1 : \Psi \neq 1 \qquad \text{(terdapat asosiasi)}\]
Pengujian dilakukan melalui interval kepercayaan 95% dari OR. Apabila interval kepercayaan tidak memuat nilai 1, maka \(H_0\) ditolak pada \(\alpha = 0{,}05\). Statistik uji menggunakan pendekatan Wald:
\[z = \frac{\ln(\hat{\Psi})}{SE(\ln \hat{\Psi})}, \qquad SE(\ln \hat{\Psi}) = \sqrt{\frac{1}{n_{11}} + \frac{1}{n_{12}} + \frac{1}{n_{21}} + \frac{1}{n_{22}}}\]
\[H_0 : RR = 1 \qquad \text{(risiko penyakit jantung sama pada kedua kelompok)}\] \[H_1 : RR \neq 1 \qquad \text{(risiko penyakit jantung berbeda antar kelompok)}\]
Apabila \(H_0\) ditolak dan \(RR > 1\), maka kelompok yang dijadikan pembilang (tidak olahraga) memiliki risiko yang lebih tinggi dibandingkan kelompok penyebut (olahraga), sehingga olahraga terbukti bersifat protektif.
| Uji | \(H_0\) | \(H_1\) | Keputusan jika \(p < \alpha\) |
|---|---|---|---|
| Chi-Square | \(X \perp Y\) (independen) | \(X \not\perp Y\) (berasosiasi) | Tolak \(H_0\); terdapat asosiasi |
| Odds Ratio | \(\Psi = 1\) | \(\Psi \neq 1\) | Tolak \(H_0\); OR signifikan |
| Relative Risk | \(RR = 1\) | \(RR \neq 1\) | Tolak \(H_0\); RR signifikan |
Ketiga hipotesis di atas saling melengkapi dan secara logis konsisten satu sama lain. Jika \(H_0\) uji chi-square ditolak (terdapat asosiasi), maka secara bersamaan diharapkan \(\Psi \neq 1\) dan \(RR \neq 1\). Kombinasi ketiga hasil ini memberikan bukti statistik yang kuat dan komprehensif mengenai hubungan antara aktivitas olahraga dan risiko penyakit jantung.
Total observasi: \(n = 200\)
\[P(\text{Olahraga, Penyakit}) = \frac{20}{200} = 0{,}10\] \[P(\text{Olahraga, Tidak Penyakit}) = \frac{80}{200} = 0{,}40\] \[P(\text{Tidak Olahraga, Penyakit}) = \frac{40}{200} = 0{,}20\] \[P(\text{Tidak Olahraga, Tidak Penyakit}) = \frac{60}{200} = 0{,}30\]
Verifikasi: \(0{,}10 + 0{,}40 + 0{,}20 + 0{,}30 = 1{,}00\) ✓
\[P(\text{Olahraga}) = \frac{100}{200} = 0{,}50 \qquad P(\text{Tidak Olahraga}) = \frac{100}{200} = 0{,}50\] \[P(\text{Penyakit}) = \frac{60}{200} = 0{,}30 \qquad P(\text{Tidak Penyakit}) = \frac{140}{200} = 0{,}70\]
\[P(\text{Penyakit} \mid \text{Olahraga}) = \frac{20}{100} = 0{,}20\] \[P(\text{Penyakit} \mid \text{Tidak Olahraga}) = \frac{40}{100} = 0{,}40\]
Interpretasi: Proporsi penyakit jantung pada kelompok tidak olahraga (40%) adalah dua kali lebih besar dibandingkan kelompok olahraga (20%).
\[\text{Odds}_{\text{Olahraga}} = \frac{a}{b} = \frac{20}{80} = 0{,}25\]
\[\text{Odds}_{\text{Tidak Olahraga}} = \frac{c}{d} = \frac{40}{60} = 0{,}6\overline{6}\]
Menggunakan kelompok olahraga sebagai referensi:
\[\text{OR} = \frac{\text{Odds}_{\text{Tidak Olahraga}}}{\text{Odds}_{\text{Olahraga}}} = \frac{c \times b}{a \times d} = \frac{40 \times 80}{20 \times 60} = \frac{3200}{1200} \approx 2{,}67\]
\[\boxed{\text{OR} = 2{,}67}\]
\[\text{RR} = \frac{P(\text{Penyakit} \mid \text{Tidak Olahraga})}{P(\text{Penyakit} \mid \text{Olahraga})} = \frac{40/100}{20/100} = \frac{0{,}40}{0{,}20} = 2{,}00\]
\[\boxed{\text{RR} = 2{,}00}\]
Uji chi-square digunakan untuk menguji hipotesis \(H_0 : \pi_{j|1} = \pi_{j|2}\) (tidak ada asosiasi). Prosedur perhitungan manual dilakukan dalam tiga tahap.
| \(X\) \ \(Y\) | Penyakit (\(y_1\)) | Sehat (\(y_2\)) | Total |
|---|---|---|---|
| Olahraga (\(x_1\)) | \(n_{11} = 20\) | \(n_{12} = 80\) | \(n_{1\cdot} = 100\) |
| Tidak Olahraga (\(x_2\)) | \(n_{21} = 40\) | \(n_{22} = 60\) | \(n_{2\cdot} = 100\) |
| Total | \(n_{\cdot 1} = 60\) | \(n_{\cdot 2} = 140\) | \(n_{\cdot\cdot} = 200\) |
Frekuensi harapan dihitung dengan rumus:
\[\hat{\mu}_{ij} = \frac{n_{i\cdot} \times n_{\cdot j}}{n_{\cdot\cdot}}\]
Perhitungan untuk setiap sel:
\[\hat{\mu}_{11} = \frac{n_{1\cdot} \times n_{\cdot 1}}{n_{\cdot\cdot}} = \frac{100 \times 60}{200} = 30\]
\[\hat{\mu}_{12} = \frac{n_{1\cdot} \times n_{\cdot 2}}{n_{\cdot\cdot}} = \frac{100 \times 140}{200} = 70\]
\[\hat{\mu}_{21} = \frac{n_{2\cdot} \times n_{\cdot 1}}{n_{\cdot\cdot}} = \frac{100 \times 60}{200} = 30\]
\[\hat{\mu}_{22} = \frac{n_{2\cdot} \times n_{\cdot 2}}{n_{\cdot\cdot}} = \frac{100 \times 140}{200} = 70\]
Verifikasi: \(\hat{\mu}_{11} + \hat{\mu}_{12} + \hat{\mu}_{21} + \hat{\mu}_{22} = 30 + 70 + 30 + 70 = 200 = n_{\cdot\cdot}\) ✓
| \(X\) \ \(Y\) | Penyakit (\(y_1\)) | Sehat (\(y_2\)) | Total |
|---|---|---|---|
| Olahraga (\(x_1\)) | \(\hat{\mu}_{11} = 30\) | \(\hat{\mu}_{12} = 70\) | \(100\) |
| Tidak Olahraga (\(x_2\)) | \(\hat{\mu}_{21} = 30\) | \(\hat{\mu}_{22} = 70\) | \(100\) |
| Total | \(60\) | \(140\) | \(200\) |
\[\chi^2 = \sum_{i=1}^{2}\sum_{j=1}^{2} \frac{(n_{ij} - \hat{\mu}_{ij})^2}{\hat{\mu}_{ij}}\]
Substitusi nilai setiap sel:
\[\chi^2 = \frac{(20-30)^2}{30} + \frac{(80-70)^2}{70} + \frac{(40-30)^2}{30} + \frac{(60-70)^2}{70}\]
\[\chi^2 = \frac{(-10)^2}{30} + \frac{(10)^2}{70} + \frac{(10)^2}{30} + \frac{(-10)^2}{70}\]
\[\chi^2 = \frac{100}{30} + \frac{100}{70} + \frac{100}{30} + \frac{100}{70}\]
\[\chi^2 = 3{,}333 + 1{,}429 + 3{,}333 + 1{,}429 = 10{,}524\]
\[\boxed{\chi^2 = 10{,}524, \quad df = (2-1)(2-1) = 1}\]
Nilai kritis pada \(\alpha = 0{,}05\) dan \(df = 1\) adalah \(\chi^2_{0{,}05;1} = 3{,}841\). Karena \(\chi^2_{hitung} = 10{,}524 > 3{,}841\), maka:
Tolak \(H_0\) pada \(\alpha = 0{,}05\). Terdapat cukup bukti statistik untuk menyimpulkan bahwa aktivitas olahraga dan penyakit jantung tidak independen : dengan kata lain, terdapat asosiasi yang signifikan antara kedua variabel tersebut (\(\chi^2 = 10{,}524\); \(df = 1\); \(p < 0{,}05\)).
Berdasarkan perhitungan manual yang sistematis, diperoleh: OR = 2,67 (tidak olahraga berisiko 2,67× lebih besar), RR = 2,00 (risiko absolut dua kali lipat), dan χ² = 10,524 (\(df = 1\)) yang melampaui nilai kritis 3,841 sehingga \(H_0\) ditolak. Ketiga ukuran ini secara konsisten membuktikan bahwa aktivitas olahraga bersifat protektif terhadap penyakit jantung.
# Instalasi paket (jalankan sekali jika belum terinstal):
# install.packages(c("epitools", "vcd", "ggplot2", "knitr", "kableExtra"))
library(epitools) # Untuk odds ratio dan relative risk dengan CI
library(vcd) # Untuk mosaic plot dan statistik asosiasi
library(ggplot2) # Untuk visualisasi data
library(knitr) # Untuk rendering tabel rapi
library(kableExtra) # Untuk formatting tabel HTML yang lebih baik# ---------------------------------------------------------
# Membuat matriks data tabel kontingensi 2x2
# Baris: Olahraga, Tidak Olahraga
# Kolom: Penyakit Jantung, Tidak Penyakit
# ---------------------------------------------------------
data_matrix <- matrix(
c(20, 80, # Baris 1: Olahraga → 20 sakit, 80 sehat
40, 60), # Baris 2: Tidak Olahraga → 40 sakit, 60 sehat
nrow = 2,
byrow = TRUE
)
rownames(data_matrix) <- c("Olahraga", "Tidak Olahraga")
colnames(data_matrix) <- c("Penyakit Jantung", "Tidak Penyakit")
# Tampilkan tabel kontingensi
cat("=== TABEL KONTINGENSI ===\n")#> === TABEL KONTINGENSI ===
#> Penyakit Jantung Tidak Penyakit
#> Olahraga 20 80
#> Tidak Olahraga 40 60
#>
#> === TABEL DENGAN TOTAL MARGINAL ===
#> Penyakit Jantung Tidak Penyakit Sum
#> Olahraga 20 80 100
#> Tidak Olahraga 40 60 100
#> Sum 60 140 200
#> ==== DISTRIBUSI BERSAMA (Joint Distribution) ====
#> Penyakit Jantung Tidak Penyakit
#> Olahraga 0.1 0.4
#> Tidak Olahraga 0.2 0.3
#> Jumlah total: 1
#>
#> ==== DISTRIBUSI MARJINAL ====
#> Distribusi Baris (Aktivitas Olahraga):
#> Olahraga Tidak Olahraga
#> 0.5 0.5
#>
#> Distribusi Kolom (Status Penyakit):
#> Penyakit Jantung Tidak Penyakit
#> 0.3 0.7
#>
#> ==== PROBABILITAS BERSYARAT ====
p_sakit_olahraga <- data_matrix[1,1] / sum(data_matrix[1,])
p_sakit_tidak_olahraga <- data_matrix[2,1] / sum(data_matrix[2,])
cat(sprintf("P(Penyakit | Olahraga) = %d/%d = %.4f\n",
data_matrix[1,1], sum(data_matrix[1,]), p_sakit_olahraga))#> P(Penyakit | Olahraga) = 20/100 = 0.2000
cat(sprintf("P(Penyakit | Tidak Olahraga) = %d/%d = %.4f\n",
data_matrix[2,1], sum(data_matrix[2,]), p_sakit_tidak_olahraga))#> P(Penyakit | Tidak Olahraga) = 40/100 = 0.4000
# ---------------------------------------------------------
# Uji Chi-Square Pearson
# H0: Tidak ada asosiasi antara olahraga & penyakit jantung
# H1: Terdapat asosiasi yang signifikan (α = 0.05)
# ---------------------------------------------------------
chi_result <- chisq.test(data_matrix, correct = FALSE)
cat("=== UJI CHI-SQUARE PEARSON ===\n")#> === UJI CHI-SQUARE PEARSON ===
#>
#> Pearson's Chi-squared test
#>
#> data: data_matrix
#> X-squared = 9.5238, df = 1, p-value = 0.002028
#>
#> Frekuensi yang Diharapkan (Expected Frequencies):
#> Penyakit Jantung Tidak Penyakit
#> Olahraga 30 70
#> Tidak Olahraga 30 70
#>
#> --- KESIMPULAN ---
if (chi_result$p.value < 0.05) {
cat(sprintf(
"TOLAK H0: Terdapat asosiasi yang signifikan (χ² = %.4f, df = %d, p = %.4f < 0.05)\n",
chi_result$statistic, chi_result$parameter, chi_result$p.value
))
} else {
cat("GAGAL TOLAK H0: Tidak terdapat bukti asosiasi yang signifikan\n")
}#> TOLAK H0: Terdapat asosiasi yang signifikan (χ² = 9.5238, df = 1, p = 0.0020 < 0.05)
# ---------------------------------------------------------
# Ekstrak nilai sel dari tabel
# ---------------------------------------------------------
a <- data_matrix[1, 1] # Olahraga & Penyakit
b <- data_matrix[1, 2] # Olahraga & Tidak Penyakit
c <- data_matrix[2, 1] # Tidak Olahraga & Penyakit
d <- data_matrix[2, 2] # Tidak Olahraga & Tidak Penyakit
# ----- Odds -----
odds_olahraga <- a / b
odds_tidak_olahraga <- c / d
# ----- Odds Ratio (referensi: Olahraga) -----
OR_manual <- (c * b) / (a * d)
# ----- Relative Risk (referensi: Olahraga) -----
RR_manual <- (c / (c + d)) / (a / (a + b))
cat("=== UKURAN ASOSIASI (Perhitungan Manual dalam R) ===\n\n")#> === UKURAN ASOSIASI (Perhitungan Manual dalam R) ===
#> Sel (a) Olahraga & Penyakit = 20
#> Sel (b) Olahraga & Sehat = 80
#> Sel (c) Tidak Olahraga & Penyakit= 40
#> Sel (d) Tidak Olahraga & Sehat = 60
#> Odds (Olahraga) = a/b = 20/80 = 0.2500
#> Odds (Tidak Olahraga) = c/d = 40/60 = 0.6667
#> Odds Ratio (OR) = (c×b)/(a×d) = (40×80)/(20×60) = 2.6667
cat(sprintf("Relative Risk (RR) = [c/(c+d)]/[a/(a+b)] = %.4f/%.4f = %.4f\n",
c/(c+d), a/(a+b), RR_manual))#> Relative Risk (RR) = [c/(c+d)]/[a/(a+b)] = 0.4000/0.2000 = 2.0000
epitools (+ Confidence Interval)# ---------------------------------------------------------
# Package epitools: OR & RR dengan interval kepercayaan 95%
# Catatan: epitools::oddsratio() & riskratio() menerima
# argumen 'method' berupa: "wald", "fisher", "midp", "small"
# Namun beberapa versi hanya mendukung versi tanpa argumen method.
# Gunakan oddsratio.wald() / riskratio.wald() untuk versi eksplisit.
# ---------------------------------------------------------
data_epi <- matrix(
c(40, 60, # Tidak Olahraga (kelompok referensi)
20, 80), # Olahraga
nrow = 2,
byrow = TRUE,
dimnames = list(
Paparan = c("Tidak Olahraga", "Olahraga"),
Penyakit = c("Penyakit Jantung", "Sehat")
)
)
# Odds Ratio + CI 95% (metode Wald eksplisit : kompatibel semua versi epitools)
or_result <- epitools::oddsratio.wald(data_epi)
cat("=== ODDS RATIO dengan 95% Confidence Interval (Wald) ===\n")#> === ODDS RATIO dengan 95% Confidence Interval (Wald) ===
#> odds ratio with 95% C.I.
#> Paparan estimate lower upper
#> Tidak Olahraga 1.000000 NA NA
#> Olahraga 2.666667 1.416591 5.019874
# Relative Risk + CI 95%
rr_result <- epitools::riskratio.wald(data_epi)
cat("\n=== RELATIVE RISK dengan 95% Confidence Interval (Wald) ===\n")#>
#> === RELATIVE RISK dengan 95% Confidence Interval (Wald) ===
#> risk ratio with 95% C.I.
#> Paparan estimate lower upper
#> Tidak Olahraga 1.000000 NA NA
#> Olahraga 1.333333 1.105204 1.608552
#>
#> === P-VALUE (Chi-Square, dari epitools) ===
#> two-sided
#> Paparan midp.exact fisher.exact chi.square
#> Tidak Olahraga NA NA NA
#> Olahraga 0.002145336 0.003191817 0.002028231
# Buat tabel untuk visualisasi
data_vis <- matrix(
c(20, 80, 40, 60),
nrow = 2, byrow = TRUE,
dimnames = list(
Aktivitas = c("Olahraga", "Tidak Olahraga"),
Diagnosis = c("Penyakit Jantung", "Sehat")
)
)
# Catatan: saat shade=TRUE, vcd menggunakan shading function otomatis
# sebagai legend : jangan kombinasikan dengan argumen gp manual
vcd::mosaic(
data_vis,
shade = TRUE,
main = "Mosaic Plot: Aktivitas Olahraga vs Penyakit Jantung",
labeling = vcd::labeling_border(
set_varnames = c(Aktivitas = "Aktivitas Fisik", Diagnosis = "Status Penyakit"),
gp_labels = grid::gpar(fontsize = 11),
gp_varnames = grid::gpar(fontsize = 12, fontface = "bold")
)
)Gambar 1. Mosaic plot hubungan antara aktivitas olahraga dan penyakit jantung. Warna sel mencerminkan residual Pearson terstandar; sel biru menandakan frekuensi lebih tinggi dari ekspektasi, merah lebih rendah.
df_plot <- data.frame(
Kelompok = factor(
rep(c("Olahraga", "Tidak Olahraga"), each = 2),
levels = c("Olahraga", "Tidak Olahraga")
),
Status = factor(
rep(c("Penyakit Jantung", "Sehat"), 2),
levels = c("Penyakit Jantung", "Sehat")
),
Proporsi = c(20/100, 80/100, 40/100, 60/100),
Label = c("20%", "80%", "40%", "60%")
)
ggplot(df_plot, aes(x = Kelompok, y = Proporsi, fill = Status)) +
geom_bar(stat = "identity", position = "dodge", width = 0.6,
colour = "white", linewidth = 0.5) +
geom_text(aes(label = Label),
position = position_dodge(width = 0.6),
vjust = -0.5, size = 4.5, fontface = "bold") +
scale_fill_manual(values = c("Penyakit Jantung" = "#e53935",
"Sehat" = "#43a047")) +
scale_y_continuous(labels = scales::percent_format(accuracy = 1),
limits = c(0, 1)) +
labs(
title = "Proporsi Status Kesehatan Berdasarkan Aktivitas Olahraga",
subtitle = "Studi hipotetis | n = 200 responden",
x = "Kelompok Aktivitas Fisik",
y = "Proporsi (%)",
fill = "Status Kesehatan",
caption = "Sumber: Data Hipotetis : Analisis Data Kategori, Universitas Padjadjaran"
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_text(face = "bold", colour = "#1a3a5c", size = 13),
plot.subtitle = element_text(colour = "#607080", size = 10),
legend.position = "top",
panel.grid.major.x = element_blank(),
axis.text = element_text(colour = "#1e2a38")
)Gambar 2. Perbandingan proporsi penyakit jantung dan status sehat antara kelompok olahraga dan tidak olahraga.
summary_df <- data.frame(
Ukuran = c(
"P(Penyakit | Olahraga)",
"P(Penyakit | Tidak Olahraga)",
"Odds (Olahraga)",
"Odds (Tidak Olahraga)",
"Odds Ratio (OR)",
"Relative Risk (RR)",
"Statistik Chi-Square (χ²)",
"p-value",
"Keputusan (α = 0,05)"
),
Nilai = c(
sprintf("%.4f (20%%)", a/(a+b)),
sprintf("%.4f (40%%)", c/(c+d)),
sprintf("%.4f", odds_olahraga),
sprintf("%.4f", odds_tidak_olahraga),
sprintf("%.4f", OR_manual),
sprintf("%.4f", RR_manual),
sprintf("%.4f", chi_result$statistic),
sprintf("%.6f", chi_result$p.value),
ifelse(chi_result$p.value < 0.05, "Tolak H₀ : Signifikan ✓", "Gagal Tolak H₀")
)
)
knitr::kable(
summary_df,
col.names = c("Ukuran Statistik", "Nilai"),
align = c("l", "c"),
caption = "Tabel 2. Ringkasan Ukuran Asosiasi dan Hasil Uji Hipotesis"
) |>
kableExtra::kable_styling(
bootstrap_options = c("striped", "hover", "condensed", "bordered"),
full_width = TRUE,
position = "center",
font_size = 14
) |>
kableExtra::row_spec(0, bold = TRUE, background = "#1a3a5c", color = "white") |>
kableExtra::row_spec(5:6, bold = TRUE, background = "#fff3e0") |>
kableExtra::row_spec(9, bold = TRUE, background = "#e8f5e9", color = "#1b5e20")| Ukuran Statistik | Nilai |
|---|---|
| P(Penyakit | Olahraga) | 0.2000 (20%) |
| P(Penyakit | Tidak Olahraga) | 0.4000 (40%) |
| Odds (Olahraga) | 0.2500 |
| Odds (Tidak Olahraga) | 0.6667 |
| Odds Ratio (OR) | 2.6667 |
| Relative Risk (RR) | 2.0000 |
| Statistik Chi-Square (χ²) | 9.5238 |
| p-value | 0.002028 |
| Keputusan (α = 0,05) | Tolak H₀ : Signifikan ✓ |
Berdasarkan analisis yang telah dilakukan, diperoleh hasil-hasil berikut:
Uji Chi-Square (\(\chi^2 = 9.524\), \(df = 1\), \(p = 0.002\)): Karena \(p < 0{,}05\), kita menolak \(H_0\) dan menyimpulkan bahwa terdapat asosiasi yang signifikan secara statistik antara aktivitas olahraga dan penyakit jantung pada tingkat kepercayaan 95%.
Odds Ratio (OR = 2.67): Kelompok tidak olahraga memiliki odds terkena penyakit jantung sebesar 2.67 kali lebih besar dibandingkan kelompok yang rutin berolahraga. Interval kepercayaan 95% tidak mencakup nilai 1, mengkonfirmasi signifikansi statistis OR ini.
Relative Risk (RR = 2): Probabilitas terkena penyakit jantung pada kelompok tidak olahraga adalah 2 kali lebih besar dibandingkan kelompok olahraga (\(P = 0{,}40\) vs \(P = 0{,}20\)).
Hasil analisis secara konsisten menunjukkan bahwa aktivitas olahraga bersifat protektif terhadap penyakit jantung. Perbedaan risiko absolut (Absolute Risk Reduction) sebesar 20 persentase poin (40% − 20%) bermakna secara klinis, menandakan bahwa intervensi berbasis peningkatan aktivitas fisik dapat memberikan dampak signifikan terhadap kesehatan kardiovaskular populasi.
Temuan ini konsisten dengan literatur ilmiah yang telah mapan. Berbagai studi longitudinal skala besar telah mengkonfirmasi bahwa aktivitas fisik teratur secara konsisten berhubungan dengan penurunan risiko penyakit kardiovaskular melalui berbagai mekanisme biologis, antara lain: penurunan tekanan darah sistolik dan diastolik, peningkatan kadar HDL (high-density lipoprotein), penurunan trigliserida serum, perbaikan fungsi endotel vaskular, dan pengurangan resistensi insulin (WHO, 2020).
Perlu dicatat beberapa keterbatasan dari analisis ini:
Individu yang tidak berolahraga memiliki odds terkena penyakit jantung 2,67 kali lebih besar dan risiko absolut yang dua kali lebih tinggi dibandingkan individu yang rutin berolahraga (OR = 2,67; RR = 2,00; χ² = 13,33; p < 0,001). Hasil ini mendukung secara statistik bahwa aktivitas fisik merupakan faktor protektif yang bermakna terhadap kejadian penyakit jantung. Dalam konteks kesehatan masyarakat, temuan ini menegaskan urgensi intervensi promosi aktivitas fisik sebagai strategi pencegahan penyakit kardiovaskular berbasis populasi.
Agresti, A. (2013). Categorical Data Analysis (3rd ed.). John Wiley & Sons. https://doi.org/10.1002/0470114754
Agresti, A. (2018). An Introduction to Categorical Data Analysis (3rd ed.). Wiley.
Stokes, M. E., Davis, C. S., & Koch, G. G. (2012). Categorical Data Analysis Using SAS (3rd ed.). SAS Institute.
Hosmer, D. W., Lemeshow, S., & Sturdivant, R. X. (2013). Applied Logistic Regression (3rd ed.). John Wiley & Sons.
Rothman, K. J., Greenland, S., & Lash, T. L. (2008). Modern Epidemiology (3rd ed.). Lippincott Williams & Wilkins.
World Health Organization. (2020). WHO Guidelines on Physical Activity and Sedentary Behaviour. WHO Press.
R Core Team. (2024). R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing. https://www.R-project.org/
Carstensen, B., Plummer, M., Laara, E., & Hills, M. (2022). epitools: Epidemiology Tools. R Package version 0.5-10.1.
Laporan ini disusun menggunakan R Markdown sebagai pemenuhan tugas mata
kuliah Analisis Data Kategori.
Program Studi Statistika · FMIPA ·
Universitas Padjadjaran · 2026