Analisis data kategori (categorical data analysis) adalah sekumpulan metode statistik yang digunakan untuk menganalisis data yang diukur dalam skala nominal atau ordinal, yaitu data yang nilainya berupa kategori atau label dan bukan angka kontinu (Agresti, 2013).
Secara formal, variabel kategori membagi observasi ke dalam kelompok-kelompok yang saling eksklusif (mutually exclusive) dan mencakup semua kemungkinan (exhaustive). Metode analisis data kategori mencakup, antara lain:
Variabel kategori memiliki beberapa karakteristik utama yang membedakannya dari variabel kontinu:
| Karakteristik | Penjelasan | Contoh |
|---|---|---|
| Skala Pengukuran | Nominal (tanpa urutan) atau Ordinal (dengan urutan) | Jenis kelamin, golongan darah |
| Tipe Nilai | Label atau kategori, bukan angka | Sakit / Tidak Sakit |
| Operasi Matematika | Tidak dapat dijumlahkan/dikalikan secara langsung | Tidak bisa: Laki-laki + Perempuan |
| Ringkasan Statistik | Disajikan dengan frekuensi dan proporsi | 40% konsumsi fast food, 60% tidak |
| Subtipe Umum | Nominal, Ordinal, Biner/Dikotom | Ya/Tidak, Rendah/Sedang/Tinggi |
Menurut Agresti (2013), variabel kategori dibedakan menjadi tiga subtipe utama:
| Bidang Ilmu | Contoh Kasus | Metode Analisis |
|---|---|---|
| Epidemiologi | Hubungan konsumsi fast food dengan kejadian obesitas | Odds Ratio, Uji Chi-Square |
| Ilmu Sosial | Hubungan tingkat pendidikan dengan preferensi politik | Uji Chi-Square, Cramér’s V |
| Ekonomi | Hubungan status pekerjaan dengan kepemilikan asuransi | Regresi Logistik |
| Kedokteran Klinis | Efektivitas vaksin terhadap kejadian infeksi | Relative Risk, Uji Fisher |
Referensi: Agresti, A. (2013). Categorical Data Analysis (3rd ed.). John Wiley & Sons.
Tabel kontingensi (contingency table) adalah tabel yang menyajikan distribusi frekuensi dari dua atau lebih variabel kategori secara bersama-sama. Tabel ini memungkinkan kita mengamati bagaimana nilai satu variabel “tersebar” (contingent) di setiap kategori variabel lainnya (Agresti, 2013).
Tabel kontingensi paling sederhana adalah tabel \(2 \times 2\), yang melibatkan dua variabel dengan masing-masing dua kategori.
Misalkan kita memiliki dua variabel:
| Sakit (Y = 1) | Tidak Sakit (Y = 0) | Total | |
|---|---|---|---|
| Fast Food (X = 1) | \(n_{11}\) | \(n_{12}\) | \(n_{1+}\) |
| Tidak Fast Food (X = 0) | \(n_{21}\) | \(n_{22}\) | \(n_{2+}\) |
| Total | \(n_{+1}\) | \(n_{+2}\) | \(n\) |
Di mana:
Joint distribution (distribusi bersama) adalah distribusi probabilitas dari dua variabel secara simultan. Probabilitas bersama dari sel \((i, j)\) diestimasi dengan:
Untuk tabel \(2 \times 2\) terdapat 4 sel dengan syarat: \(\sum_{i}\sum_{j} \hat{\pi}_{ij} = 1\).
Marginal distribution adalah distribusi probabilitas dari salah satu variabel tanpa memperhatikan variabel lainnya, diperoleh dengan menjumlahkan probabilitas bersama sepanjang baris atau kolom.
Marginal untuk variabel baris (X):
Marginal untuk variabel kolom (Y):
Conditional probability (peluang bersyarat) adalah probabilitas suatu kejadian terjadi dengan syarat kejadian lain sudah diketahui terjadi:
Dalam konteks tabel kita:
Perbandingan probabilitas bersyarat inilah yang menjadi dasar ukuran asosiasi seperti Relative Risk dan Odds Ratio.
Odds adalah rasio antara peluang suatu kejadian terjadi dibandingkan peluang kejadian tersebut tidak terjadi:
Untuk masing-masing kelompok pada tabel \(2 \times 2\):
| Nilai Odds | Interpretasi |
|---|---|
| Odds = 1 | Peluang terjadi sama dengan peluang tidak terjadi |
| Odds > 1 | Kejadian lebih mungkin terjadi daripada tidak terjadi |
| Odds < 1 | Kejadian lebih mungkin tidak terjadi |
Odds Ratio adalah perbandingan odds dari dua kelompok. OR mengukur seberapa besar odds suatu outcome pada kelompok terpapar dibandingkan kelompok tidak terpapar:
Interval kepercayaan 95% untuk OR dihitung via transformasi logaritma natural:
| Nilai OR | Interpretasi |
|---|---|
| OR = 1 | Tidak ada asosiasi antara paparan dan outcome |
| OR > 1 | Paparan meningkatkan odds terjadinya outcome |
| OR < 1 | Paparan menurunkan odds terjadinya outcome (protektif) |
Relative Risk (atau Risk Ratio) adalah rasio langsung antara probabilitas bersyarat pada kelompok terpapar dibandingkan tidak terpapar:
| Nilai RR | Interpretasi |
|---|---|
| RR = 1 | Risiko sama pada kedua kelompok (tidak ada asosiasi) |
| RR > 1 | Kelompok terpapar memiliki risiko lebih tinggi |
| RR < 1 | Kelompok terpapar memiliki risiko lebih rendah (protektif) |
Catatan: RR hanya valid pada studi kohort atau eksperimental. Pada studi kasus-kontrol, gunakan OR karena proporsi kasus ditentukan oleh desain studi, bukan prevalensi populasi.
Uji Chi-Square (Pearson’s Chi-Square Test) digunakan untuk menguji apakah terdapat hubungan yang signifikan antara dua variabel kategori. Hipotesis yang diuji adalah:
Di mana frekuensi harapan dihitung dengan:
Statistik \(\chi^2\) mengikuti distribusi Chi-Square dengan derajat bebas \(df = (r-1)(c-1)\), di mana \(r\) = jumlah baris dan \(c\) = jumlah kolom. Untuk tabel \(2\times2\), \(df = 1\).
| Kondisi | Interpretasi |
|---|---|
| p-value < α | Tolak H0: terdapat asosiasi yang signifikan |
| p-value ≥ α | Gagal tolak H0: tidak cukup bukti adanya asosiasi |
| χ² besar | Frekuensi observasi jauh dari yang diharapkan jika independen |
| χ² ≈ 0 | Frekuensi observasi mendekati frekuensi harapan (mendukung independensi) |
Uji Chi-Square hanya menunjukkan ada atau tidaknya asosiasi, bukan seberapa kuat asosiasi tersebut. Untuk mengukur kekuatan asosiasi, digunakan Cramér’s V.
Cramér’s V adalah ukuran kekuatan asosiasi berbasis Chi-Square yang nilainya berkisar antara 0 sampai 1, sehingga lebih mudah diinterpretasikan daripada nilai \(\chi^2\) mentah.
| Nilai Cramér’s V | Kekuatan Asosiasi |
|---|---|
| V = 0 | Tidak ada asosiasi |
| 0 < V ≤ 0,10 | Asosiasi sangat lemah |
| 0,10 < V ≤ 0,30 | Asosiasi lemah–sedang |
| 0,30 < V ≤ 0,50 | Asosiasi sedang–kuat |
| V > 0,50 | Asosiasi kuat |
Uji Fisher adalah alternatif uji Chi-Square yang digunakan ketika ukuran sampel kecil atau frekuensi harapan pada salah satu sel kurang dari 5. Uji ini menghitung probabilitas eksak dari tabel yang teramati dan semua tabel yang lebih ekstrem.
| Kondisi | Interpretasi |
|---|---|
| p-value < α | Tolak H0: terdapat asosiasi yang signifikan |
| p-value ≥ α | Gagal tolak H0: tidak cukup bukti adanya asosiasi |
| Digunakan saat | Sampel kecil (n < 20) atau ada sel dengan frekuensi harapan < 5 |
Sebuah penelitian kohort dilakukan untuk menyelidiki apakah kebiasaan konsumsi fast food secara rutin (≥4 kali/minggu) berhubungan dengan kejadian obesitas pada usia dewasa muda. Peneliti mengikuti 200 responden selama 2 tahun dan memperoleh data berikut:
| Kebiasaan Makan | Obesitas | Tidak Obesitas | Total |
|---|---|---|---|
| Konsumsi Fast Food | 60 | 40 | 100 |
| Tidak Konsumsi Fast Food | 20 | 80 | 100 |
| Total | 80 | 120 | 200 |
Notasi: \(a = 60\), \(b = 40\), \(c = 20\), \(d = 80\), \(n = 200\)
Peluang obesitas pada kelompok konsumsi fast food:
\[P(\text{Obesitas} \mid \text{Fast Food}) = \frac{a}{a+b} = \frac{60}{100} = 0{,}60\]
Peluang obesitas pada kelompok tidak konsumsi fast food:
\[P(\text{Obesitas} \mid \text{Tidak Fast Food}) = \frac{c}{c+d} = \frac{20}{100} = 0{,}20\]
Artinya, 60% responden yang rutin mengonsumsi fast food mengalami obesitas, sementara hanya 20% yang tidak mengonsumsi fast food mengalami obesitas.
Odds obesitas pada kelompok fast food:
\[\text{Odds}_{\text{Fast Food}} = \frac{a}{b} = \frac{60}{40} = 1{,}50\]
Odds obesitas pada kelompok tidak fast food:
\[\text{Odds}_{\text{Tidak Fast Food}} = \frac{c}{d} = \frac{20}{80} = 0{,}25\]
Odds 1,50 berarti pada kelompok konsumsi fast food, peluang mengalami obesitas 1,5× lebih besar dari peluang tidak mengalaminya. Sebaliknya, odds 0,25 menunjukkan kelompok yang tidak konsumsi fast food jauh lebih mungkin tidak mengalami obesitas.
\[OR = \frac{\text{Odds}_{\text{Fast Food}}}{\text{Odds}_{\text{Tidak Fast Food}}} = \frac{a/b}{c/d} = \frac{ad}{bc} = \frac{60 \times 80}{40 \times 20} = \frac{4800}{800} = \mathbf{6{,}00}\]
Interval Kepercayaan 95% untuk OR:
\[SE_{\ln(OR)} = \sqrt{\frac{1}{60} + \frac{1}{40} + \frac{1}{20} + \frac{1}{80}} = \sqrt{0{,}0167 + 0{,}0250 + 0{,}0500 + 0{,}0125} = \sqrt{0{,}1042} \approx 0{,}3228\]
\[\ln(OR) = \ln(6) \approx 1{,}7918\]
\[\text{95\% CI untuk } \ln(OR): \quad 1{,}7918 \pm 1{,}96 \times 0{,}3228 = (1{,}1591 \;;\; 2{,}4245)\]
\[\text{95\% CI untuk OR}: \quad \left(e^{1{,}1591} \;;\; e^{2{,}4245}\right) \approx \mathbf{(3{,}19 \;;\; 11{,}35)}\]
\[RR = \frac{P(\text{Obesitas} \mid \text{Fast Food})}{P(\text{Obesitas} \mid \text{Tidak Fast Food})} = \frac{60/100}{20/100} = \frac{0{,}60}{0{,}20} = \mathbf{3{,}00}\]
Hitung terlebih dahulu frekuensi harapan (\(E_{ij}\)) untuk setiap sel:
\[E_{11} = \frac{n_{1+} \times n_{+1}}{n} = \frac{100 \times 80}{200} = 40, \quad E_{12} = \frac{100 \times 120}{200} = 60\]
\[E_{21} = \frac{100 \times 80}{200} = 40, \quad E_{22} = \frac{100 \times 120}{200} = 60\]
Karena semua \(E_{ij} \geq 5\), syarat uji Chi-Square terpenuhi. Hitung statistik uji menggunakan Pers. (11):
\[\chi^2 = \frac{(60-40)^2}{40} + \frac{(40-60)^2}{60} + \frac{(20-40)^2}{40} + \frac{(80-60)^2}{60}\]
\[\chi^2 = \frac{400}{40} + \frac{400}{60} + \frac{400}{40} + \frac{400}{60} = 10 + 6{,}667 + 10 + 6{,}667 = \mathbf{33{,}33}\]
Keputusan: Karena \(\chi^2 = 33{,}33 > 3{,}841\) (nilai kritis \(\alpha=0{,}05\), \(df=1\)), maka tolak \(H_0\). Terdapat asosiasi yang signifikan antara konsumsi fast food dan obesitas.
Dengan \(n = 200\) dan \(\min(r-1, c-1) = 1\):
\[V = \sqrt{\frac{\chi^2}{n \cdot \min(r-1,\, c-1)}} = \sqrt{\frac{33{,}33}{200 \times 1}} = \sqrt{0{,}1667} \approx \mathbf{0{,}408}\]
Uji Fisher menghitung probabilitas eksak dengan distribusi hipergeometrik. Untuk data ini dengan total marginal tetap (\(n_{1+} = n_{2+} = 100\), \(n_{+1} = 80\), \(n_{+2} = 120\)):
\[p = \frac{100!\; 100!\; 80!\; 120!}{200!\; 60!\; 40!\; 20!\; 80!}\]
Pada sampel besar (\(n = 200\)) dengan semua frekuensi harapan \(\geq 5\), uji Chi-Square dan Fisher biasanya memberikan kesimpulan yang sama. Uji Fisher lebih relevan digunakan ketika \(n\) kecil atau ada sel dengan \(E_{ij} < 5\).
| Ukuran | Nilai |
|---|---|
| P(Obesitas | Fast Food) | 0,60 |
| P(Obesitas | Tidak Fast Food) | 0,20 |
| Odds Fast Food | 1,50 |
| Odds Tidak Fast Food | 0,25 |
| Odds Ratio (OR) | 6,00 |
| 95% CI untuk OR | (3,19 ; 11,35) |
| Relative Risk (RR) | 3,00 |
| Chi-Square (χ²) | 33,33 |
| Cramér’s V | 0,408 |
| Fisher’s p-value | < 0,001 |
# Membuat matriks data
data <- matrix(c(60, 40, 20, 80),
nrow = 2,
byrow = TRUE)
rownames(data) <- c("Fast Food", "Tidak Fast Food")
colnames(data) <- c("Obesitas", "Tidak Obesitas")
data## Obesitas Tidak Obesitas
## Fast Food 60 40
## Tidak Fast Food 20 80
| Kebiasaan Makan | Obesitas | Tidak Obesitas |
|---|---|---|
| Fast Food | 60 | 40 |
| Tidak Fast Food | 20 | 80 |
## === Proporsi Baris ===
## Obesitas Tidak Obesitas
## Fast Food 0.6 0.4
## Tidak Fast Food 0.2 0.8
##
## === Proporsi Total ===
## Obesitas Tidak Obesitas
## Fast Food 0.3 0.2
## Tidak Fast Food 0.1 0.4
a <- data[1, 1]; b <- data[1, 2]
c <- data[2, 1]; d <- data[2, 2]
odds_fastfood <- a / b
odds_tidak_fastfood <- c / d
OR <- (a * d) / (b * c)
RR <- (a / (a + b)) / (c / (c + d))
SE_ln_OR <- sqrt(1/a + 1/b + 1/c + 1/d)
CI_lower <- exp(log(OR) - 1.96 * SE_ln_OR)
CI_upper <- exp(log(OR) + 1.96 * SE_ln_OR)
cat(sprintf("Odds Fast Food : %.4f\n", odds_fastfood))## Odds Fast Food : 1.5000
## Odds Tidak Fast Food : 0.2500
## Odds Ratio (OR) : 6.0000
## 95% CI untuk OR : (3.1873 ; 11.2948)
## Relative Risk (RR) : 3.0000
##
## Pearson's Chi-squared test
##
## data: data
## X-squared = 33.333, df = 1, p-value = 7.764e-09
##
## === Frekuensi yang Diharapkan ===
## Obesitas Tidak Obesitas
## Fast Food 40 60
## Tidak Fast Food 40 60
# Cramér's V
chi2 <- hasil_chisq$statistic
n <- sum(data)
k <- min(nrow(data) - 1, ncol(data) - 1)
V <- sqrt(chi2 / (n * k))
cat(sprintf("Chi-Square (χ²) : %.4f\n", chi2))## Chi-Square (χ²) : 33.3333
## n : 200
## Cramér's V : 0.4082
kekuatan <- ifelse(V <= 0.10, "Sangat lemah",
ifelse(V <= 0.30, "Lemah–sedang",
ifelse(V <= 0.50, "Sedang–kuat", "Kuat")))
cat(sprintf("Kekuatan asosiasi: %s\n", kekuatan))## Kekuatan asosiasi: Sedang–kuat
##
## Fisher's Exact Test for Count Data
##
## data: data
## p-value = 1.064e-08
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
## 3.055033 11.932317
## sample estimates:
## odds ratio
## 5.940316
##
## Odds Ratio (Fisher) : 5.9403
cat(sprintf("95%% CI (Fisher) : (%.4f ; %.4f)\n",
hasil_fisher$conf.int[1], hasil_fisher$conf.int[2]))## 95% CI (Fisher) : (3.0550 ; 11.9323)
## p-value (Fisher) : 0.000000
p1 <- ggplot(prop_df, aes(x = Kelompok, y = Proporsi, fill = Status)) +
geom_col(position = "dodge", width = 0.6, color = "white", linewidth = 0.4) +
geom_text(aes(label = Label),
position = position_dodge(width = 0.6),
vjust = -0.5, fontface = "bold", size = 3.8, color = "#2c3e50") +
scale_fill_manual(values = c("Obesitas" = "#e74c3c", "Tidak Obesitas" = "#3498db")) +
scale_y_continuous(labels = percent_format(), limits = c(0, 0.85),
breaks = seq(0, 0.8, 0.2)) +
labs(
title = "Proporsi Status Obesitas Berdasarkan Kebiasaan Konsumsi Fast Food",
subtitle = "Perbandingan proporsi obesitas dan tidak obesitas pada setiap kelompok paparan",
x = "Kebiasaan Konsumsi Fast Food",
y = "Proporsi (%)",
caption = "Sumber: Data simulasi studi cross-sectional, n = 200 responden"
) +
tema_laporan
print(p1)Interpretasi Grafik 1: Proporsi Obesitas per Kelompok
Grafik batang berdampingan ini membandingkan proporsi status obesitas antara kelompok yang rutin mengonsumsi fast food dan kelompok yang tidak. Terlihat perbedaan yang sangat mencolok:
Perbedaan proporsi sebesar 40 poin persentase (60% vs 20%) merupakan indikasi visual yang kuat bahwa terdapat asosiasi antara konsumsi fast food dan kejadian obesitas, konsisten dengan nilai RR = 3,00.
p2 <- ggplot(odds_df, aes(x = Kelompok, y = Odds, color = Kelompok)) +
geom_segment(aes(xend = Kelompok, y = 0, yend = Odds),
linewidth = 1.8, alpha = 0.7) +
geom_point(size = 7, alpha = 0.9) +
geom_text(aes(label = sprintf("Odds = %.2f", Odds)),
vjust = -1.1, fontface = "bold", size = 4, color = "#2c3e50") +
geom_hline(yintercept = 1, linetype = "dashed", color = "#7f8c8d", linewidth = 0.8) +
annotate("text", x = 2.45, y = 1.05, label = "Odds = 1
(titik netral)",
size = 3.2, color = "#7f8c8d", fontface = "italic") +
scale_color_manual(values = c("Fast Food" = "#e74c3c", "Tidak Fast Food" = "#3498db")) +
scale_y_continuous(limits = c(0, 2), breaks = seq(0, 2, 0.25)) +
labs(
title = "Perbandingan Odds Obesitas antar Kelompok",
subtitle = "Odds Fast Food (1,50) vs Odds Tidak Fast Food (0,25)",
x = "Kelompok Paparan",
y = "Odds Obesitas",
caption = "Garis putus-putus menandai titik netral Odds = 1"
) +
tema_laporan +
theme(legend.position = "none")
print(p2)Interpretasi Grafik 2: Perbandingan Odds
Grafik lollipop ini membandingkan nilai odds obesitas pada dua kelompok, dengan garis putus-putus sebagai titik netral odds = 1.
Rasio antara kedua nilai ini menghasilkan Odds Ratio = 6,00, yang berarti odds obesitas pada kelompok fast food adalah 6 kali lebih besar.
| Ukuran | Nilai | Interpretasi |
|---|---|---|
| Chi-Square (χ²) | 33,33 | Nilai uji besar → distribusi antar kelompok berbeda nyata |
| p-value (Chi-Square) | < 0,001 | Sangat signifikan, tolak H0 pada alpha = 0,05 maupun alpha = 0,01 |
| Cramér’s V | 0,408 | Asosiasi sedang–kuat (0,30 < V ≤ 0,50) |
| p-value (Fisher) | < 0,001 | Konfirmasi independen: asosiasi signifikan secara eksak |
| Odds Ratio (OR) | 6,00 | Odds obesitas kelompok fast food 6× lebih besar dari kelompok tidak fast food |
| 95% CI untuk OR | (3,19 ; 11,35) | Tidak mencakup 1 → asosiasi signifikan secara statistik |
| Relative Risk (RR) | 3,00 | Risiko obesitas kelompok fast food 3× lebih tinggi dari kelompok tidak fast food |
Berdasarkan hasil analisis, dapat disimpulkan bahwa:
Catatan Kausal: Asosiasi statistik tidak serta-merta membuktikan hubungan sebab-akibat. Faktor perancu seperti tingkat aktivitas fisik, genetik, dan pola makan keseluruhan perlu dikendalikan dalam studi yang lebih komprehensif.
Kesimpulan Utama: Terdapat asosiasi yang signifikan dan kuat antara kebiasaan konsumsi fast food dan kejadian obesitas. Hal ini dikonfirmasi oleh Chi-Square, Fisher’s Exact Test, Cramér’s V, OR, dan RR secara konsisten.