Analisis data kategori adalah metode statistik yang digunakan untuk menganalisis variabel yang berbentuk kategori atau klasifikasi. Variabel kategori merepresentasikan kelompok seperti jenis kelamin, status merokok, atau status penyakit.
Menurut Agresti (2019), analisis data kategori mempelajari hubungan antar variabel kategori yang biasanya disajikan menggunakan tabel kontingensi.
Analisis ini sering digunakan dalam berbagai bidang penelitian seperti kesehatan, ilmu sosial, dan pemasaran untuk memahami pola hubungan antar kategori. Selain itu, teknik analisis data kategori memungkinkan peneliti menguji apakah terdapat hubungan yang signifikan antara dua atau lebih variabel kategori. Metode yang umum digunakan dalam analisis ini antara lain uji chi-square, ukuran asosiasi, serta model regresi logistik untuk mempelajari keterkaitan antar variabel kategori (Agresti, 2019; McHugh, 2013).
Berikut adalah karakteristik utama variabel kategori:
Nilai variabel berupa kategori atau label Variabel kategori tidak dinyatakan dalam bentuk angka yang memiliki makna kuantitatif, melainkan dalam bentuk kelompok atau label seperti jenis kelamin, status perkawinan, tingkat pendidikan, atau jenis pekerjaan (Agresti, 2019).
Kategori bersifat saling eksklusif (mutually exclusive) Setiap pengamatan hanya dapat masuk ke dalam satu kategori dan tidak dapat berada pada dua kategori sekaligus. Misalnya seseorang hanya dapat diklasifikasikan sebagai laki-laki atau perempuan dalam variabel jenis kelamin (McHugh, 2013).
Kategori bersifat lengkap atau mencakup semua kemungkinan (collectively exhaustive) Seluruh kategori yang dibuat harus mampu menampung seluruh kemungkinan nilai dari variabel yang diamati sehingga setiap observasi dapat diklasifikasikan dengan jelas (Agresti, 2019).
Data biasanya disajikan dalam bentuk frekuensi atau proporsi Karena berupa kategori, analisis variabel ini umumnya dilakukan dengan menghitung banyaknya observasi pada setiap kategori yang kemudian disajikan dalam tabel frekuensi atau tabel kontingensi (Agresti, 2019).
Dapat dibedakan menjadi skala nominal dan ordinal Variabel kategori dapat berupa nominal (tidak memiliki urutan, misalnya jenis kelamin atau agama) atau ordinal (memiliki urutan atau tingkatan, misalnya tingkat pendidikan atau tingkat kepuasan) (Agresti, 2019; Moore, McCabe, & Craig, 2017).
Nominal Variabel nominal adalah variabel kategori yang tidak memiliki urutan atau tingkatan tertentu antar kategorinya.Contoh variabel nominal antara lain jenis kelamin (laki-laki, perempuan), status perkawinan (belum menikah, menikah, cerai), agama, atau jenis pekerjaan. Dalam analisis statistik, data nominal biasanya disajikan dalam bentuk frekuensi atau proporsi dan sering dianalisis menggunakan tabel kontingensi atau uji chi-square.
Ordinal Variabel ordinal adalah variabel kategori yang memiliki urutan atau tingkatan tertentu antar kategorinya, namun jarak antar kategori tidak dapat diukur secara pasti. Contoh variabel ordinal antara lain tingkat pendidikan (SD, SMP, SMA, Perguruan Tinggi), tingkat kepuasan (tidak puas, cukup puas, puas, sangat puas), dan status ekonomi (rendah, menengah, tinggi).
Penelitian di bidang kesehatan Misalnya, penelitian yang mengkaji hubungan antara status merokok (perokok / tidak perokok) dengan kejadian penyakit paru-paru (ya / tidak).
Penelitian di bidang pendidikan Dalam penelitian pendidikan, analisis data kategori dapat digunakan untuk melihat hubungan antara jenis sekolah (negeri / swasta) dengan kelulusan siswa (lulus / tidak lulus).
Penelitian di bidang sosial Dalam penelitian sosial, analisis data kategori dapat digunakan untuk mengkaji hubungan antara tingkat pendidikan (SD, SMP, SMA, Perguruan Tinggi) dengan status pekerjaan (bekerja / tidak bekerja).
Tabel kontingensi menyajikan distribusi frekuensi dari dua atau lebih variabel kategori secara bersamaan.Secara umum, tabel kontingensi disusun dalam bentuk baris dan kolom, di mana setiap baris mewakili kategori dari satu variabel dan setiap kolom mewakili kategori dari variabel lainnya.
| Penyakit jantung | Tidak sakit jantung | Total | |
|---|---|---|---|
| Olahraga | a | b | a+b |
| Tidak Olahraga | c | d | c+d |
| Total | a+c | b+d | n |
Joint Distribution atau distribusi bersama adalah distribusi peluang yang menunjukkan probabilitas atau proporsi dari kombinasi kategori dua variabel secara bersamaan.Dalam tabel kontingensi, distribusi bersama diperoleh dari frekuensi pada setiap sel tabel yang kemudian dibagi dengan jumlah total observasi. Dengan kata lain, distribusi ini menggambarkan peluang terjadinya dua kategori sekaligus.
\[ P(A,B) = \frac{{frekuensi pada sel}}{n} \]
Distribusi marginal adalah distribusi peluang dari satu variabel saja tanpa memperhatikan variabel lainnya. Distribusi ini diperoleh dengan menjumlahkan frekuensi pada setiap baris atau kolom tabel kontingensi. Hasilnya biasanya ditampilkan dalam total baris atau total kolom pada tabel.
\[ P(X=Olahraga) = \frac{a+b}{n} \]
Distribusi kondisional adalah distribusi peluang dari satu variabel dengan syarat bahwa variabel lainnya memiliki kategori tertentu. Distribusi ini diperoleh dengan membagi frekuensi pada suatu sel dengan total frekuensi pada baris atau kolom yang bersesuaian.
\[ P(Penyakit jantung|Olahraga) = \frac{P(A,B)}{P(X=Olahraga)} = \frac{a}{a+b} \]
Ukuran asosiasi adalah ukuran statistik yang digunakan untuk menilai kekuatan hubungan atau keterkaitan antara dua variabel kategori dalam suatu tabel kontingensi.
Odds adalah ukuran yang menyatakan perbandingan antara peluang suatu kejadian terjadi dengan peluang kejadian tersebut tidak terjadi.
Jika peluang suatu kejadian dinyatakan sebagai:
\[ P = \frac{a}{a+b} \]
maka peluang tidak terjadinya kejadian adalah:
\[ 1 - P = \frac{b}{a+b} \]
Odds didefinisikan sebagai perbandingan antara peluang kejadian dengan peluang tidak terjadinya kejadian, yaitu:
\[ Odds = \frac{P}{1-P} \]
Dengan mensubstitusikan nilai peluang ke dalam rumus odds diperoleh:
\[ Odds = \frac{\frac{a}{a+b}}{\frac{b}{a+b}} = \frac{a}{b} \] Interpretasi:
Odds ratio (OR) adalah ukuran yang digunakan untuk membandingkan odds dari suatu kejadian antara dua kelompok yang berbeda.
Odds Ratio (OR) adalah ukuran asosiasi yang membandingkan odds antara dua kelompok. Jika odds pada kelompok pertama adalah:
\[ Odds_1 = \frac{a}{b} \]
dan odds pada kelompok kedua adalah:
\[ Odds_2 = \frac{c}{d} \]
maka Odds Ratio didefinisikan sebagai:
\[ OR = \frac{Odds_1}{Odds_2} \]
Sehingga diperoleh:
\[ OR = \frac{a/b}{c/d} = \frac{ad}{bc} \]
Interpretasi:
Relative Risk (RR) atau risiko relatif adalah ukuran asosiasi yang digunakan untuk membandingkan probabilitas terjadinya suatu kejadian pada kelompok yang terpapar dengan probabilitas kejadian pada kelompok yang tidak terpapar. Relative risk sering digunakan dalam penelitian epidemiologi, khususnya pada studi kohort, untuk mengetahui apakah suatu paparan meningkatkan atau menurunkan risiko terjadinya suatu kejadian atau penyakit.
Relative Risk (RR) adalah ukuran asosiasi yang membandingkan risiko kejadian antara dua kelompok.
Risiko pada kelompok pertama adalah:
\[ P_1 = \frac{a}{a+b} \]
Risiko pada kelompok kedua adalah:
\[ P_0 = \frac{c}{c+d} \]
Relative Risk didefinisikan sebagai:
\[ RR = \frac{P_1}{P_0} \]
Sehingga diperoleh:
\[ RR = \frac{\frac{a}{a+b}}{\frac{c}{c+d}} \]
| Penyakit jantung | Tidak | Total | |
|---|---|---|---|
| Olahraga | 20 | 80 | 100 |
| Tidak Olahraga | 40 | 60 | 100 |
a = 20 b = 80 c = 40 d = 60 n = 200
\[ P(Penyakit jantung|Tidak Olahraga) = \frac{40}{100} = 0.4 \] Artinya, dari seluruh individu yang tidak berolahraga, sekitar 40% di antaranya mengalami penyakit jantung.
\[ P(Penyakit jantung|Olahraga) = \frac{20}{100} = 0.2 \] Artinya, dari seluruh individu yang berolahraga, sekitar 20% di antaranya mengalami penyakit jantung.
\[ Odds_{TidakOlahraga} = \frac{40}{60} = 0,67 \] Nilai 0,67 menunjukkan bahwa pada kelompok yang tidak berolahraga, perbandingan antara orang yang mengalami penyakit jantung dengan yang tidak mengalami penyakit jantung adalah sekitar 0,67 banding 1. Artinya, peluang mengalami penyakit jantung pada kelompok yang tidak berolahraga sekitar 0,67 kali dibandingkan peluang tidak mengalami penyakit jantung.
\[ Odds_{Olahraga} = \frac{20}{80} = 0,25 \] Nilai 0,25 menunjukkan bahwa pada kelompok yang berolahraga, perbandingan antara orang yang mengalami penyakit jantung dengan yang tidak mengalami penyakit jantung adalah sekitar 0,25 banding 1. Artinya, peluang mengalami penyakit jantung pada kelompok yang berolahraga adalah 0,25 kali dibandingkan peluang tidak mengalami penyakit jantung.
\[ OR = \frac{40 \times 80}{60 \times 20} = 2.67 \] Nilai OR sebesar 2,67 menunjukkan bahwa odds terjadinya penyakit jantung pada individu yang tidak berolahraga sekitar 2,67 kali lebih besar dibandingkan dengan individu yang berolahraga. Dengan kata lain, tidak berolahraga dapat diinterpretasikan sebagai faktor risiko yang meningkatkan kemungkinan terjadinya penyakit jantung.
Karena nilai OR > 1, maka dapat disimpulkan bahwa terdapat asosiasi positif antara tidak berolahraga dan kejadian penyakit jantung, yang berarti kelompok yang tidak berolahraga memiliki peluang lebih besar mengalami penyakit jantung dibandingkan kelompok yang berolahraga.
Barplot
barplot(data,
beside = TRUE,
col = c("pink","lightblue"),
main = "Perbandingan Kasus Penyakit Jantung Berdasarkan Status Olahraga",
xlab = "Status Olahraga",
ylab = "Jumlah Individu",
legend.text = colnames(data),
args.legend = list(x="topright"),
ylim = c(0, max(data) + 20))Interpretasi grafik:
Dari grafik terlihat bahwa
Pada kelompok berolahraga, jumlah individu yang mengalami penyakit jantung (20) lebih sedikit dibandingkan yang tidak mengalami penyakit jantung (80).
Pada kelompok tidak berolahraga, jumlah individu yang mengalami penyakit jantung (40) lebih banyak dibandingkan kelompok yang berolahraga.
Hal ini menunjukkan bahwa aktivitas olahraga kemungkinan berkaitan dengan penurunan risiko penyakit jantung.
Secara statistik, nilai odds ratio sebesar 2,67 menunjukkan bahwa odds terjadinya penyakit jantung pada individu yang tidak berolahraga adalah sekitar 2,67 kali odds pada individu yang berolahraga. Karena nilai OR > 1, maka terdapat asosiasi positif antara tidak berolahraga dan kejadian penyakit jantung. Hal ini menunjukkan bahwa status tidak berolahraga berkaitan dengan peningkatan peluang terjadinya penyakit jantung dibandingkan dengan kelompok yang berolahraga.
Dalam konteks kasus ini, hasil tersebut dapat diartikan bahwa individu yang tidak melakukan olahraga memiliki kecenderungan lebih besar mengalami penyakit jantung dibandingkan individu yang melakukan olahraga. Dengan kata lain, aktivitas olahraga berpotensi menjadi faktor yang berhubungan dengan penurunan risiko penyakit jantung.
Hasil ini menggambarkan bahwa olahraga dapat berperan sebagai faktor protektif terhadap penyakit jantung, karena kelompok yang berolahraga memiliki peluang lebih kecil untuk mengalami penyakit tersebut dibandingkan kelompok yang tidak berolahraga.
Agresti, A. (2019). An Introduction to Categorical Data Analysis. Wiley.
McHugh, M. L. (2013). The chi-square test of independence. Biochemia Medica, 23(2), 143–149. https://doi.org/10.11613/BM.2013.018
Moore, D. S., McCabe, G. P., & Craig, B. A. (2017). Introduction to the Practice of Statistics (9th ed.). W. H. Freeman.
# Input data
data_matrix <- matrix(
c(688, 650, 21, 59),
nrow = 2,
byrow = TRUE,
dimnames = list(
"Status Merokok" = c("Smoker", "Non-Smoker"),
"Status Kanker" = c("Cancer (+)", "Control (-)")
)
)
# Tampilkan tabel
knitr::kable(
addmargins(data_matrix),
caption = "Tabel Kontingensi 2×2: Merokok dan Kanker Paru",
align = "c"
)| Cancer (+) | Control (-) | Sum | |
|---|---|---|---|
| Smoker | 688 | 650 | 1338 |
| Non-Smoker | 21 | 59 | 80 |
| Sum | 709 | 709 | 1418 |
Keterangan sel:
| Sel | Notasi | Nilai |
|---|---|---|
| Smoker & Cancer (+) | a | 688 |
| Smoker & Control (-) | b | 650 |
| Non-Smoker & Cancer (+) | c | 21 |
| Non-Smoker & Control (-) | d | 59 |
| Total | n | 1418 |
Tabel keterangan sel menunjukkan distribusi data dalam bentuk notasi a, b, c, dan d yang merepresentasikan kombinasi antara status merokok dan kejadian kanker paru. Nilai a (688) menunjukkan jumlah individu yang merokok dan mengalami kanker paru, sedangkan b (650) menunjukkan perokok yang tidak mengalami kanker. Pada kelompok non-perokok, c (21) merupakan jumlah yang mengalami kanker dan d (59) yang tidak.Terlihat bahwa jumlah kasus kanker paru lebih banyak terjadi pada kelompok perokok dibandingkan non-perokok, yang mengindikasikan adanya hubungan antara kedua variabel tersebut.
\[\hat{p}_{\text{Smoker}} = \frac{a}{a+b} = \frac{688}{1338}, \quad \hat{p}_{\text{Non-Smoker}} = \frac{c}{c+d} = \frac{21}{80}\]
a <- 688; b <- 650; c <- 21; d <- 59
n1 <- a + b # total smoker
n2 <- c + d # total non-smoker
N <- a + b + c + d
p1 <- a / n1
p2 <- c / n2
cat("Proporsi Kanker pada Smoker :", round(p1, 4), "\n")## Proporsi Kanker pada Smoker : 0.5142
## Proporsi Kanker pada Non-Smoker: 0.2625
Interpretasi: Proporsi kejadian kanker paru pada kelompok perokok sebesar 51.42%, sedangkan pada kelompok non-perokok sebesar 26.25%. Hal ini menunjukkan bahwa kejadian kanker paru lebih tinggi pada individu yang merokok dibandingkan yang tidak merokok. Perbedaan proporsi yang cukup besar ini mengindikasikan adanya hubungan antara kebiasaan merokok dengan peningkatan risiko kanker paru, di mana perokok memiliki kemungkinan sekitar dua kali lebih besar untuk mengalami kanker paru dibandingkan non-perokok.
\[\text{IC}_{95\%}(\hat{p}) = \hat{p} \pm z_{0.025} \sqrt{\frac{\hat{p}(1-\hat{p})}{n}}\]
# IC Smoker
ic_smoker <- prop.test(a, n1, conf.level = 0.95)$conf.int
# IC Non-Smoker
ic_nonsmoker <- prop.test(c, n2, conf.level = 0.95)$conf.int
cat("IC 95% Proporsi Smoker : [", round(ic_smoker[1],4), ",", round(ic_smoker[2],4), "]\n")## IC 95% Proporsi Smoker : [ 0.487 , 0.5413 ]
cat("IC 95% Proporsi Non-Smoker: [", round(ic_nonsmoker[1],4), ",", round(ic_nonsmoker[2],4), "]\n")## IC 95% Proporsi Non-Smoker: [ 0.1733 , 0.3748 ]
Interpretasi: Hasil analisis menunjukkan bahwa proporsi kejadian kanker paru pada kelompok smoker sebesar 0,5142 (51,42%), sedangkan pada kelompok non-smoker sebesar 0,2625 (26,25%). Interval kepercayaan 95% untuk proporsi pada kelompok smoker berada pada rentang 0,487 hingga 0,5413, yang berarti dengan tingkat kepercayaan 95% proporsi sebenarnya kejadian kanker paru pada populasi perokok diperkirakan berada antara 48,7% hingga 54,13%. Sementara itu, interval kepercayaan 95% pada kelompok non-smoker berada pada rentang 0,1733 hingga 0,3748, sehingga proporsi sebenarnya kejadian kanker paru pada populasi non-perokok diperkirakan berada antara 17,33% hingga 37,48%. Perbedaan nilai proporsi ini menunjukkan bahwa kejadian kanker paru cenderung lebih tinggi pada kelompok perokok dibandingkan dengan kelompok non-perokok.
\[RD = \hat{p}_1 - \hat{p}_2, \quad \text{SE}_{RD} = \sqrt{\frac{\hat{p}_1(1-\hat{p}_1)}{n_1} + \frac{\hat{p}_2(1-\hat{p}_2)}{n_2}}\]
RD <- p1 - p2
SE_RD <- sqrt(p1*(1-p1)/n1 + p2*(1-p2)/n2)
IC_RD_low <- RD - 1.96 * SE_RD
IC_RD_high <- RD + 1.96 * SE_RD
cat("Risk Difference (RD):", round(RD, 4), "\n")## Risk Difference (RD): 0.2517
## IC 95% RD: [ 0.1516 , 0.3518 ]
Interpretasi: Hasil analisis menunjukkan bahwa proporsi kejadian kanker paru pada kelompok smoker sebesar 0,5142 (51,42%), sedangkan pada kelompok non-smoker sebesar 0,2625 (26,25%). Selisih risiko antara kedua kelompok yang diukur menggunakan Risk Difference (RD) adalah sebesar 0,2517, yang berarti terdapat peningkatan risiko kejadian kanker paru sekitar 25,17% lebih tinggi pada kelompok perokok dibandingkan non-perokok. Interval kepercayaan 95% untuk nilai RD berada pada rentang 0,1516 hingga 0,3518, yang menunjukkan bahwa dengan tingkat kepercayaan 95% selisih risiko sebenarnya di populasi diperkirakan berada antara 15,16% hingga 35,18%. Karena seluruh rentang interval kepercayaan bernilai positif, hal ini mengindikasikan bahwa risiko kanker paru secara konsisten lebih tinggi pada kelompok perokok dibandingkan non-perokok.
\[RR = \frac{\hat{p}_1}{\hat{p}_2}, \quad \ln(RR) \pm 1.96 \cdot \text{SE}_{\ln RR}\]
data_matrix <- matrix(c(688,650,21,59), nrow=2, byrow=TRUE)
rr_result <- epitools::riskratio(data_matrix, method="wald", rev="columns")
rr_result$measure## risk ratio with 95% C.I.
## Predictor estimate lower upper
## Exposed1 1.0000000 NA NA
## Exposed2 0.5105015 0.352278 0.73979
Interpretasi: Hasil analisis Risk Ratio (RR) menunjukkan bahwa nilai estimasi untuk kelompok Exposed2 adalah 0,5105 dengan interval kepercayaan 95% sebesar 0,3523 hingga 0,7398. Nilai RR yang lebih kecil dari 1 menunjukkan bahwa risiko kejadian kanker paru pada kelompok non-smoker sekitar 0,51 kali dibandingkan dengan kelompok smoker, atau dengan kata lain kelompok non-smoker memiliki risiko yang lebih rendah mengalami kanker paru dibandingkan kelompok perokok. Selain itu, karena seluruh rentang interval kepercayaan 95% berada di bawah 1, hal ini menunjukkan bahwa perbedaan risiko tersebut konsisten dan mengindikasikan adanya hubungan antara status merokok dan kejadian kanker paru.
\[OR = \frac{a \cdot d}{b \cdot c}, \quad \ln(OR) \pm 1.96 \cdot \text{SE}_{\ln OR}\]
## odds ratio with 95% C.I.
## Predictor estimate lower upper
## Exposed1 1.000000 NA NA
## Exposed2 2.973773 1.786737 4.949427
Interpretasi: Hasil analisis menunjukkan bahwa proporsi kanker pada perokok (51,42%) lebih tinggi dibandingkan non-perokok (26,25%). Nilai Risk Difference sebesar 0,2517 (CI 95%: 0,1516–0,3518) menandakan adanya peningkatan risiko sekitar 25% pada perokok dan signifikan secara statistik. Selain itu, Risk Ratio menunjukkan bahwa perokok memiliki risiko hampir 2 kali lebih besar terkena kanker, sedangkan Odds Ratio sebesar 2,97 (CI 95%: 1,79–4,95) menunjukkan bahwa peluang perokok untuk mengalami kanker hampir 3 kali lebih tinggi dibandingkan non-perokok. Secara keseluruhan, merokok berhubungan signifikan dengan peningkatan risiko kanker.
\[H_0: p_1 = p_2 \quad \text{vs} \quad H_1: p_1 \neq p_2\]
\[z = \frac{\hat{p}_1 - \hat{p}_2}{\sqrt{\hat{p}(1-\hat{p})\left(\frac{1}{n_1}+\frac{1}{n_2}\right)}}, \quad \hat{p} = \frac{a+c}{N}\]
uji2prop <- prop.test(
x = c(a, c),
n = c(n1, n2),
alternative = "two.sided",
correct = FALSE
)
print(uji2prop)##
## 2-sample test for equality of proportions without continuity correction
##
## data: c(a, c) out of c(n1, n2)
## X-squared = 19.129, df = 1, p-value = 1.222e-05
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## 0.1516343 0.3517663
## sample estimates:
## prop 1 prop 2
## 0.5142003 0.2625000
Keputusan: p-value = 1.22e-05 < 0.05 → Tolak H₀
Interpretasi: Terdapat perbedaan proporsi kejadian kanker yang signifikan antara kelompok perokok dan non-perokok. Secara interpretatif, proporsi kanker pada perokok (0,5142) lebih tinggi dibandingkan non-perokok (0,2625), dengan selisih proporsi yang berada pada interval kepercayaan 95% sebesar [0,1516 ; 0,3518]. Dengan demikian, dapat disimpulkan bahwa merokok berhubungan signifikan dengan peningkatan kejadian kanker.
\[H_0: \text{Status merokok dan kanker paru independen} \quad \text{vs} \quad H_1: \text{Tidak independen}\]
\[\chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}}, \quad E_{ij} = \frac{n_{i\cdot} \cdot n_{\cdot j}}{n}\]
##
## Pearson's Chi-squared test
##
## data: data_matrix
## X-squared = 19.129, df = 1, p-value = 1.222e-05
##
## Frekuensi yang Diharapkan (E_ij):
## [,1] [,2]
## [1,] 669 669
## [2,] 40 40
##
## Residual Pearson:
## [,1] [,2]
## [1,] 0.735 -0.735
## [2,] -3.004 3.004
Keputusan: p-value = 1.22e-05 < 0.05 → Tolak H₀
Interpretasi: Terdapat hubungan yang signifikan antara status merokok dan kejadian kanker. Frekuensi yang diharapkan (Eᵢⱼ) menunjukkan distribusi yang seimbang jika tidak ada hubungan, namun residual Pearson mengindikasikan adanya penyimpangan, terutama pada sel dengan nilai residual ±3,004 yang tergolong besar. Ini berarti terdapat perbedaan nyata antara frekuensi yang diamati dan yang diharapkan, sehingga memperkuat kesimpulan bahwa kejadian kanker tidak independen terhadap status merokok, di mana perokok cenderung memiliki kejadian kanker yang lebih tinggi dibandingkan non-perokok.
Sama dengan uji Chi-Square: \(H_0\) independensi vs \(H_1\) asosiasi.
\[G^2 = 2 \sum O_{ij} \ln\left(\frac{O_{ij}}{E_{ij}}\right)\]
# Hitung G^2 secara manual
O <- as.vector(data_matrix)
E <- as.vector(chi_result$expected)
G2 <- 2 * sum(O * log(O / E))
df_g2 <- (nrow(data_matrix) - 1) * (ncol(data_matrix) - 1)
pval_g2 <- pchisq(G2, df = df_g2, lower.tail = FALSE)
cat("Statistik G² :", round(G2, 4), "\n")## Statistik G² : 19.878
## Derajat bebas : 1
## p-value : 8.25e-06
Keputusan: p-value = 8.25e-06 < 0.05 → Tolak H₀
Interpretasi: Uji likelihood ratio menunjukkan terdapat hubungan yang signifikan antara status merokok dan kejadian kanker. Dengan demikian, kejadian kanker tidak bersifat independen terhadap kebiasaan merokok, di mana individu yang merokok cenderung memiliki risiko kanker yang lebih tinggi dibandingkan yang tidak merokok.
\[H_0: OR = 1 \quad \text{vs} \quad H_1: OR \neq 1\]
Fisher Exact Test menghitung probabilitas eksak menggunakan distribusi hipergeometrik, tanpa asumsi distribusi asimptotik. Cocok untuk sel dengan frekuensi kecil.
##
## Fisher's Exact Test for Count Data
##
## data: data_matrix
## p-value = 1.476e-05
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
## 1.755611 5.210711
## sample estimates:
## odds ratio
## 2.971634
Keputusan: p-value = 1.48e-05 < 0.05 → Tolak H₀
Interpretasi: Fisher Exact Test menunjukkan terdapat hubungan yang signifikan antara status merokok dan kejadian kanker. Nilai odds ratio sebesar 2,97 dengan interval kepercayaan 95% [1,76 ; 5,21] mengindikasikan bahwa perokok memiliki peluang hampir 3 kali lebih besar untuk mengalami kanker dibandingkan non-perokok, dan karena interval kepercayaan tidak mencakup nilai 1, hasil ini signifikan secara statistik.
hasil <- data.frame(
Uji = c("Uji Dua Proporsi", "Chi-Square", "Likelihood Ratio (G²)", "Fisher Exact Test"),
Hipotesis_H0 = c(
"p1 = p2",
"Independen",
"Independen",
"OR = 1"
),
Statistik_Uji = c(
paste0("z = ", round(sqrt(uji2prop$statistic), 3)),
paste0("χ² = ", round(chi_result$statistic, 3)),
paste0("G² = ", round(G2, 3)),
paste0("OR = ", round(fisher_result$estimate, 3))
),
p_value = c(
format(uji2prop$p.value, scientific=TRUE, digits=3),
format(chi_result$p.value, scientific=TRUE, digits=3),
format(pval_g2, scientific=TRUE, digits=3),
format(fisher_result$p.value, scientific=TRUE, digits=3)
),
Keputusan = rep("Tolak H₀", 4),
Interpretasi = rep("Terdapat asosiasi signifikan", 4)
)
knitr::kable(hasil, caption = "Perbandingan Hasil Keempat Uji Statistik", align = "l")| Uji | Hipotesis_H0 | Statistik_Uji | p_value | Keputusan | Interpretasi |
|---|---|---|---|---|---|
| Uji Dua Proporsi | p1 = p2 | z = 4.374 | 1.22e-05 | Tolak H₀ | Terdapat asosiasi signifikan |
| Chi-Square | Independen | χ² = 19.129 | 1.22e-05 | Tolak H₀ | Terdapat asosiasi signifikan |
| Likelihood Ratio (G²) | Independen | G² = 19.878 | 8.25e-06 | Tolak H₀ | Terdapat asosiasi signifikan |
| Fisher Exact Test | OR = 1 | OR = 2.972 | 1.48e-05 | Tolak H₀ | Terdapat asosiasi signifikan |
Perbandingan:
par(mfrow = c(1, 3))
# 1. Mosaic Plot
mosaicplot(
data_matrix,
main = "Mosaic Plot: Merokok vs Kanker Paru",
color = c("#E74C3C", "#3498DB"),
xlab = "Status Merokok",
ylab = "Status Kanker",
las = 1
)
# 2. Grafik Proporsi
proporsi_df <- data.frame(
Kelompok = c("Smoker", "Non-Smoker"),
Proporsi = c(p1, p2),
Lower = c(ic_smoker[1], ic_nonsmoker[1]),
Upper = c(ic_smoker[2], ic_nonsmoker[2])
)
barplot_pos <- barplot(
proporsi_df$Proporsi,
names.arg = proporsi_df$Kelompok,
col = c("#E74C3C", "#3498DB"),
ylim = c(0, 0.8),
main = "Proporsi Kanker Paru\nper Kelompok (±95% CI)",
ylab = "Proporsi",
las = 1
)
arrows(
barplot_pos, proporsi_df$Lower,
barplot_pos, proporsi_df$Upper,
angle = 90, code = 3, length = 0.1
)
# 3. Plot Residual Pearson
residuals_mat <- chi_result$residuals
barplot(
t(residuals_mat),
beside = TRUE,
col = c("#E74C3C", "#3498DB"),
main = "Residual Pearson\n(Chi-Square)",
ylab = "Residual",
legend.text = c("Cancer (+)", "Control (-)"),
args.legend = list(x = "topright", cex = 0.8),
las = 1
)
abline(h = c(-1.96, 1.96), lty = 2, col = "gray50")Interpretasi visualisasi:
Berdasarkan seluruh analisis inferensi yang dilakukan:
Proporsi: Proporsi kanker paru pada perokok (≈51.4%) jauh lebih tinggi dibandingkan bukan perokok (≈26.25%).
Ukuran asosiasi:
Uji statistik (butir 4–7): Keempat metode uji—uji dua proporsi, chi-square, likelihood ratio (G²), dan Fisher exact test—seluruhnya menghasilkan p-value yang sangat kecil (< 0.001) dan secara konsisten menolak hipotesis nol pada tingkat signifikansi α = 0.05.
Kesimpulan umum: Terdapat hubungan yang signifikan secara statistik antara kebiasaan merokok dan kejadian kanker paru. Temuan ini konsisten di seluruh metode inferensi yang digunakan. Perokok memiliki risiko dan odds yang jauh lebih tinggi untuk menderita kanker paru dibandingkan bukan perokok, yang mendukung konsensus ilmiah tentang bahaya merokok sebagai faktor risiko utama kanker paru.
| Gender | Democrat | Republican | Independent | Total |
|---|---|---|---|---|
| Female | 495 | 272 | 590 | 1357 |
| Male | 330 | 265 | 498 | 1093 |
| Total | 825 | 537 | 1088 | 2450 |
# Input data
data_partai <- matrix(
c(495, 272, 590,
330, 265, 498),
nrow = 2,
byrow = TRUE,
dimnames = list(
"Gender" = c("Female", "Male"),
"Partai" = c("Democrat", "Republican", "Independent")
)
)
# Tampilkan dengan margin total
knitr::kable(
addmargins(data_partai),
caption = "Tabel Kontingensi 2×3: Gender dan Identifikasi Partai Politik",
align = "c"
)| Democrat | Republican | Independent | Sum | |
|---|---|---|---|---|
| Female | 495 | 272 | 590 | 1357 |
| Male | 330 | 265 | 498 | 1093 |
| Sum | 825 | 537 | 1088 | 2450 |
Keterangan notasi:
| Sel | Nilai |
|---|---|
| Female–Democrat | 495 |
| Female–Republican | 272 |
| Female–Independent | 590 |
| Male–Democrat | 330 |
| Male–Republican | 265 |
| Male–Independent | 498 |
| Total (n) | 2450 |
Frekuensi harapan untuk setiap sel dihitung dengan:
\[E_{ij} = \frac{n_{i\cdot} \times n_{\cdot j}}{n}\]
di mana:
Total baris: Female = 1357, Male = 1093
Total kolom: Democrat = 825, Republican = 537, Independent = 1088
\[E_{\text{Female,Dem}} = \frac{1357 \times 825}{2450} = \frac{1119525}{2450} = 456{,}95\]
\[E_{\text{Female,Rep}} = \frac{1357 \times 537}{2450} = \frac{728709}{2450} = 297{,}43\]
\[E_{\text{Female,Ind}} = \frac{1357 \times 1088}{2450} = \frac{1476416}{2450} = 602{,}62\]
\[E_{\text{Male,Dem}} = \frac{1093 \times 825}{2450} = \frac{901725}{2450} = 368{,}05\]
\[E_{\text{Male,Rep}} = \frac{1093 \times 537}{2450} = \frac{586941}{2450} = 239{,}57\]
\[E_{\text{Male,Ind}} = \frac{1093 \times 1088}{2450} = \frac{1189184}{2450} = 485{,}38\]
## Frekuensi yang Diamati (O_ij):
| Democrat | Republican | Independent | |
|---|---|---|---|
| Female | 495 | 272 | 590 |
| Male | 330 | 265 | 498 |
| Democrat | Republican | Independent | |
|---|---|---|---|
| Female | 456.949 | 297.432 | 602.619 |
| Male | 368.051 | 239.568 | 485.381 |
Interpretasi: Semua sel memiliki frekuensi harapan > 5 (syarat uji chi-square terpenuhi). Tidak ada sel yang memerlukan penggabungan kategori.
\[H_0: \text{Gender dan identifikasi partai politik saling independen}\] \[H_1: \text{Gender dan identifikasi partai politik tidak independen (ada asosiasi)}\]
\[\chi^2 = \sum_{i=1}^{r}\sum_{j=1}^{c} \frac{(O_{ij} - E_{ij})^2}{E_{ij}}\]
Derajat bebas:
\[df = (r - 1)(c - 1) = (2 - 1)(3 - 1) = 2\]
\[\frac{(495 - 456{,}95)^2}{456{,}95} + \frac{(272 - 297{,}43)^2}{297{,}43} + \frac{(590 - 602{,}62)^2}{602{,}62} + \frac{(330 - 368{,}05)^2}{368{,}05} + \frac{(265 - 239{,}57)^2}{239{,}57} + \frac{(498 - 485{,}38)^2}{485{,}38}\]
O <- as.vector(data_partai)
E <- as.vector(chi_partai$expected)
komponen <- (O - E)^2 / E
df_komponen <- data.frame(
Sel = c("Female-Dem", "Male-Dem",
"Female-Rep", "Male-Rep",
"Female-Ind", "Male-Ind"),
O = O,
E = round(E, 3),
`(O-E)^2/E` = round(komponen, 4)
)
knitr::kable(
df_komponen,
caption = "Komponen Chi-Square per Sel",
align = "c"
)| Sel | O | E | X.O.E..2.E |
|---|---|---|---|
| Female-Dem | 495 | 456.949 | 3.1686 |
| Male-Dem | 330 | 368.051 | 3.9339 |
| Female-Rep | 272 | 297.432 | 2.1746 |
| Male-Rep | 265 | 239.568 | 2.6999 |
| Female-Ind | 590 | 602.619 | 0.2642 |
| Male-Ind | 498 | 485.381 | 0.3281 |
##
## Total Chi-Square: 12.5693
##
## Pearson's Chi-squared test
##
## data: data_partai
## X-squared = 12.569, df = 2, p-value = 0.001865
## Statistik chi-square: 12.5693
## Derajat bebas : 2
## p-value : 1.86e-03
## Nilai kritis (α=0.05): 5.9915
Keputusan: p-value = 1.86e-03 < 0.05 dan χ² = 12.5693 > χ²_kritis = 5.9915 → Tolak H₀
Interpretasi: Terdapat hubungan yang signifikan secara statistik antara gender dan identifikasi partai politik pada tingkat signifikansi α = 0.05.
Residual Pearson:
\[r_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}}\]
Standardized Residual (Residual Terstandarisasi):
\[d_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}(1 - p_{i\cdot})(1 - p_{\cdot j})}}\]
di mana \(p_{i\cdot} = n_{i\cdot}/n\) dan \(p_{\cdot j} = n_{\cdot j}/n\).
Nilai \(|d_{ij}| > 1{,}96\) menandakan sel berkontribusi signifikan pada α = 0.05.
## Residual Pearson (r_ij):
| Democrat | Republican | Independent | |
|---|---|---|---|
| Female | 1.7801 | -1.4747 | -0.5140 |
| Male | -1.9834 | 1.6431 | 0.5728 |
## Standardized Residual (d_ij):
| Democrat | Republican | Independent | |
|---|---|---|---|
| Female | 3.2724 | -2.4986 | -1.0322 |
| Male | -3.2724 | 2.4986 | 1.0322 |
stdres_df <- data.frame(
Sel = c("Female–Democrat", "Female–Republican", "Female–Independent",
"Male–Democrat", "Male–Republican", "Male–Independent"),
Std_Residual = round(as.vector(t(chi_partai$stdres)), 3),
Signifikan = ifelse(abs(as.vector(t(chi_partai$stdres))) > 1.96, "Ya (|d| > 1.96)", "Tidak"),
Arah = ifelse(as.vector(t(chi_partai$stdres)) > 0,
"Lebih banyak dari harapan",
"Lebih sedikit dari harapan")
)
knitr::kable(
stdres_df,
caption = "Interpretasi Standardized Residual per Sel",
align = "c"
)| Sel | Std_Residual | Signifikan | Arah |
|---|---|---|---|
| Female–Democrat | 3.272 | Ya (|d| > 1.96) | Lebih banyak dari harapan |
| Female–Republican | -2.499 | Ya (|d| > 1.96) | Lebih sedikit dari harapan |
| Female–Independent | -1.032 | Tidak | Lebih sedikit dari harapan |
| Male–Democrat | -3.272 | Ya (|d| > 1.96) | Lebih sedikit dari harapan |
| Male–Republican | 2.499 | Ya (|d| > 1.96) | Lebih banyak dari harapan |
| Male–Independent | 1.032 | Tidak | Lebih banyak dari harapan |
Partisi chi-square memecah \(\chi^2\) keseluruhan (df = 2) menjadi dua komponen independen masing-masing berdf = 1:
\[H_0: \text{Gender tidak berhubungan dengan pilihan Democrat vs Republican}\]
data_DR <- data_partai[, c("Democrat", "Republican")]
knitr::kable(
addmargins(data_DR),
caption = "Partisi 1: Democrat vs Republican"
)| Democrat | Republican | Sum | |
|---|---|---|---|
| Female | 495 | 272 | 767 |
| Male | 330 | 265 | 595 |
| Sum | 825 | 537 | 1362 |
chi_DR <- chisq.test(data_DR, correct = FALSE)
cat("\nChi-square:", round(chi_DR$statistic, 4), "\n")##
## Chi-square: 11.5545
## df : 1
## p-value : 6.76e-04
Keputusan: p-value = 6.76e-04 < 0.05 → Tolak H₀
Interpretasi: Gender berpengaruh signifikan terhadap pilihan antara Democrat dan Republican. Perempuan lebih cenderung Democrat, laki-laki lebih cenderung Republican.
\[H_0: \text{Gender tidak berhubungan dengan pilihan partai vs Independent}\]
data_DRvsI <- matrix(
c(data_partai[1,1] + data_partai[1,2], data_partai[1,3],
data_partai[2,1] + data_partai[2,2], data_partai[2,3]),
nrow = 2,
byrow = TRUE,
dimnames = list(
c("Female", "Male"),
c("Dem + Rep", "Independent")
)
)
knitr::kable(
addmargins(data_DRvsI),
caption = "Partisi 2: (Democrat+Republican) vs Independent"
)| Dem + Rep | Independent | Sum | |
|---|---|---|---|
| Female | 767 | 590 | 1357 |
| Male | 595 | 498 | 1093 |
| Sum | 1362 | 1088 | 2450 |
chi_DRvsI <- chisq.test(data_DRvsI, correct = FALSE)
cat("\nChi-square:", round(chi_DRvsI$statistic, 4), "\n")##
## Chi-square: 1.0654
## df : 1
## p-value : 3.02e-01
Keputusan: p-value = 3.02e-01 → Gagal Tolak H₀
Interpretasi: Gender tidak berpengaruh signifikan terhadap kecenderungan memilih partai (Democrat/Republican) vs Independent.
tbl_partisi <- data.frame(
Komponen = c(
"Keseluruhan (2×3)",
"Partisi 1: Democrat vs Republican",
"Partisi 2: (Dem+Rep) vs Independent",
"Jumlah Partisi 1 + 2"
),
Chi_Square = c(
round(chi_partai$statistic, 4),
round(chi_DR$statistic, 4),
round(chi_DRvsI$statistic, 4),
round(chi_DR$statistic + chi_DRvsI$statistic, 4)
),
df = c(2, 1, 1, 2),
p_value = c(
format(chi_partai$p.value, scientific=TRUE, digits=3),
format(chi_DR$p.value, scientific=TRUE, digits=3),
format(chi_DRvsI$p.value, scientific=TRUE, digits=3),
"-"
),
Keputusan = c(
"Tolak H₀", "Tolak H₀",
ifelse(chi_DRvsI$p.value < 0.05, "Tolak H₀", "Gagal Tolak H₀"),
"-"
)
)
knitr::kable(
tbl_partisi,
caption = "Perbandingan Chi-Square Keseluruhan dan Partisi",
align = "c"
)| Komponen | Chi_Square | df | p_value | Keputusan |
|---|---|---|---|---|
| Keseluruhan (2×3) | 12.5693 | 2 | 1.86e-03 | Tolak H₀ |
| Partisi 1: Democrat vs Republican | 11.5545 | 1 | 6.76e-04 | Tolak H₀ |
| Partisi 2: (Dem+Rep) vs Independent | 1.0654 | 1 | 3.02e-01 | Gagal Tolak H₀ |
| Jumlah Partisi 1 + 2 | 12.6200 | 2 | - | - |
total_partisi <- chi_DR$statistic + chi_DRvsI$statistic
cat("Chi-square keseluruhan :", round(chi_partai$statistic, 4), "(df = 2)\n")## Chi-square keseluruhan : 12.5693 (df = 2)
## Partisi 1 : 11.5545 (df = 1)
## Partisi 2 : 1.0654 (df = 1)
## Jumlah partisi : 12.62 (df = 2)
## Selisih : -0.0507
par(mfrow = c(1, 3))
# 1. Mosaic Plot
mosaicplot(
data_partai,
main = "Mosaic Plot:\nGender vs Partai Politik",
color = c("#E74C3C", "#2ECC71", "#3498DB"),
xlab = "Gender",
ylab = "Identifikasi Partai",
las = 1
)
# 2. Grouped Barplot Proporsi
prop_mat <- prop.table(data_partai, margin = 1)
barplot(
t(prop_mat),
beside = FALSE,
col = c("#E74C3C", "#2ECC71", "#3498DB"),
main = "Proporsi Identifikasi Partai\nper Gender",
ylab = "Proporsi",
legend.text = colnames(data_partai),
args.legend = list(x = "topright", cex = 0.8),
ylim = c(0, 1.2),
las = 1
)
# 3. Heatmap Standardized Residual
stdres <- chi_partai$stdres
image(
1:ncol(stdres), 1:nrow(stdres),
t(stdres),
col = colorRampPalette(c("#3498DB", "white", "#E74C3C"))(100),
axes = FALSE,
main = "Heatmap Standardized Residual",
xlab = "Partai",
ylab = "Gender"
)
axis(1, at = 1:3, labels = colnames(stdres))
axis(2, at = 1:2, labels = rownames(stdres), las = 1)
for (i in 1:nrow(stdres)) {
for (j in 1:ncol(stdres)) {
text(j, i, labels = round(stdres[i,j], 2), cex = 1.3, font = 2)
}
}
box()stdres_vec <- round(as.vector(t(chi_partai$stdres)), 3)
pearson_vec <- round(as.vector(t(chi_partai$residuals)), 3)
kontrib_vec <- round((pearson_vec)^2, 3)
rangkuman <- data.frame(
Sel = c("Female–Democrat","Female–Republican","Female–Independent",
"Male–Democrat","Male–Republican","Male–Independent"),
O = as.vector(t(data_partai)),
E = round(as.vector(t(chi_partai$expected)), 3),
Res_Pearson = pearson_vec,
Std_Residual = stdres_vec,
Kontribusi_X2 = kontrib_vec,
Persen_Kontribusi = paste0(round(kontrib_vec / chi_partai$statistic * 100, 1), "%")
)
knitr::kable(
rangkuman,
caption = "Rangkuman Kontribusi Setiap Sel terhadap Chi-Square",
align = "c"
)| Sel | O | E | Res_Pearson | Std_Residual | Kontribusi_X2 | Persen_Kontribusi |
|---|---|---|---|---|---|---|
| Female–Democrat | 495 | 456.949 | 1.780 | 3.272 | 3.168 | 25.2% |
| Female–Republican | 272 | 297.432 | -1.475 | -2.499 | 2.176 | 17.3% |
| Female–Independent | 590 | 602.619 | -0.514 | -1.032 | 0.264 | 2.1% |
| Male–Democrat | 330 | 368.051 | -1.983 | -3.272 | 3.932 | 31.3% |
| Male–Republican | 265 | 239.568 | 1.643 | 2.499 | 2.699 | 21.5% |
| Male–Independent | 498 | 485.381 | 0.573 | 1.032 | 0.328 | 2.6% |
Berdasarkan standardized residual dan kontribusi terhadap χ²:
Kategori yang paling berkontribusi terhadap hubungan antara gender dan identifikasi partai politik adalah:
Female–Democrat (stdres = 3.27) — Perempuan jauh lebih banyak memilih Democrat dari yang diharapkan. Ini adalah sel dengan kontribusi terbesar dan merupakan pola paling mencolok dalam data.
Male–Democrat (stdres = -3.27) — Laki-laki jauh lebih sedikit memilih Democrat dari yang diharapkan. Merupakan bayangan cermin dari pola Female–Democrat.
Female–Republican (stdres = -2.5) — Perempuan lebih sedikit mengidentifikasi diri sebagai Republican.
Male–Republican (stdres = 2.5) — Laki-laki lebih banyak mengidentifikasi diri sebagai Republican.
Female–Independent dan Male–Independent — Kontribusi tidak signifikan (|stdres| < 1.96), artinya distribusi gender pada Independent sesuai dengan yang diharapkan di bawah independensi.
Pola utama: Perbedaan gender paling kuat ditemukan pada dimensi Democrat vs Republican, perempuan lebih condong ke Democrat, laki-laki lebih condong ke Republican. Afiliasi terhadap Independent relatif serupa antara kedua gender.
Berdasarkan hasil seluruh analisis:
Uji Chi-Square Keseluruhan: χ² = 12.5693, df = 2, p-value = 1.86e-03 → terdapat hubungan yang signifikan antara gender dan identifikasi partai politik.
Frekuensi harapan seluruh sel > 5, sehingga asumsi chi-square terpenuhi.
Residual: Sel Female–Democrat dan Male–Democrat memiliki standardized residual terbesar (|d| > 1.96), menjadikannya kontributor utama terhadap asosiasi.
Partisi chi-square mengonfirmasi bahwa perbedaan gender paling dominan pada dimensi Democrat vs Republican (Partisi 1), sedangkan perbedaan pada dimensi partai vs Independent (Partisi 2) lebih kecil.
Kesimpulan substantif: Perempuan secara signifikan lebih cenderung mengidentifikasi diri sebagai Democrat, sedangkan laki-laki lebih cenderung mengidentifikasi diri sebagai Republican. Kecenderungan terhadap Independent relatif tidak berbeda antara kedua gender.
Agresti, A. (2019). An Introduction to Categorical Data Analysis. Wiley.
McHugh, M. L. (2013). The chi-square test of independence. Biochemia Medica, 23(2), 143–149. https://doi.org/10.11613/BM.2013.018
Moore, D. S., McCabe, G. P., & Craig, B. A. (2017). Introduction to the Practice of Statistics (9th ed.). W. H. Freeman.