Dokumen ini membahas konsep dasar analisis data kategori dengan fokus pada penggunaan tabel kontingensi 2×2. Pembahasan meliputi definisi analisis data kategori, karakteristik variabel kategori, serta cara penyajian dan interpretasi hubungan antara dua variabel kategorik. Selain itu, disertakan pula contoh penerapan dalam konteks penelitian untuk memberikan gambaran mengenai penggunaan metode ini dalam analisis data.
Analisis data kategori merupakan metode statistik yang digunakan untuk menganalisis data yang berbentuk kategori atau klasifikasi, yaitu variabel yang memiliki skala pengukuran berupa sekumpulan kategori yang digunakan untuk mengklasifikasikan suatu objek, individu, atau kejadian ke dalam kelompok tertentu. Sebagai contoh, pandangan politik dapat dikategorikan sebagai liberal, moderat, atau konservatif. Variabel kategorik dapat dibedakan berdasarkan skala pengukurannya, yaitu nominal dan ordinal, serta berdasarkan jumlah kategorinya, yaitu biner (dikotomik) dan multikategori. Variabel nominal merupakan variabel kategori yang tidak memiliki urutan tertentu, sedangkan variabel ordinal memiliki urutan atau tingkatan antar kategori. Sementara itu, variabel biner hanya memiliki dua kategori, seperti ya dan tidak, sedangkan variabel multikategori memiliki lebih dari dua kategori, seperti pilihan tempat tinggal yang dapat berupa rumah, kondominium, atau apartemen.
Analisis data kategori banyak digunakan dalam berbagai bidang penelitian. Beberapa contoh penerapannya adalah sebagai berikut:
Tabel kontingensi adalah tabel yang menyajikan distribusi frekuensi dari dua atau lebih variabel kategorik secara simultan, sehingga setiap sel menunjukkan jumlah observasi pada setiap kombinasi kategori dari variabel-variabel tersebut. Tabel ini digunakan untuk melihat pola atau hubungan antar variabel kategorik.
Struktur tabel kontingensi untuk dua variabel kategorik disajikan dalam bentuk tabel persegi panjang dengan \(I\) baris yang mewakili kategori variabel \(X\) dan \(J\) kolom yang mewakili variabel \(Y\). Setiap sel dalam tabel menunjukkan kombinasi kategori dari kedua variabel tersebut, sehingga terdapat \(I \times J\) kemungkinan kombinasi hasil. Berikut disajikan contoh tabel kontingensi dua arah yang menunjukkan kombinasi kategori dari dua variabel kategorik.
Tabel 1. Struktur Tabel Kontingensi 2×2
| \(Y=1\) | \(Y=0\) | Total | |
|---|---|---|---|
| \(X=1\) | \(n_{11}\) | \(n_{12}\) | \(n_{1\cdot}\) |
| \(X=0\) | \(n_{21}\) | \(n_{22}\) | \(n_{2\cdot}\) |
| Total | \(n_{\cdot1}\) | \(n_{\cdot2}\) | \(n\) |
dengan:
\(n_{ij} = \text{jumlah observasi pada kategori } X=i \text{ dan } Y=j\)
\(n = \sum_{i=1}^{2}\sum_{j=1}^{2} n_{ij}\)
Distribusi peluang bersama dinyatakan dengan \(\pi_{ij}\), yaitu peluang bahwa variabel \(X\) berada pada kategori ke-\(i\) dan variabel \(Y\) berada pada kategori ke-\(j\). Dalam praktiknya, nilai peluang tersebut dapat diestimasi menggunakan proporsi frekuensi pada setiap sel tabel kontingensi, yaitu
\[ \pi_{ij} = \frac{n_{ij}}{n} \]
dengan \(n_{ij}\) menyatakan jumlah observasi pada sel ke-\((i,j)\) dan \(n\) menyatakan jumlah total observasi.
Distribusi peluang marginal merupakan distribusi peluang dari masing-masing variabel secara terpisah tanpa memperhatikan variabel lainnya. Pada tabel kontingensi, distribusi marginal diperoleh dengan menjumlahkan peluang pada setiap baris atau kolom.
Distribusi marginal untuk variabel \(X\) dinyatakan sebagai
\[ \pi_{i.} = \sum_{j=1}^{2} \pi_{ij}, \]
sedangkan distribusi marginal untuk variabel \(Y\) dinyatakan sebagai
\[ \pi_{.j} = \sum_{i=1}^{2} \pi_{ij}. \]
Sebagai contoh, berdasarkan Tabel 1, peluang marginal dapat diperoleh dari proporsi frekuensi pada setiap baris atau kolom tabel kontingensi. Karena peluang bersama diestimasi dengan
\[ \pi_{ij} = \frac{n_{ij}}{n}, \]
maka peluang marginal untuk kategori pertama variabel \(X\) diperoleh dengan
\[ \pi_{1.} = \pi_{11} + \pi_{12}. \]
Sedangkan peluang marginal untuk kategori pertama variabel \(Y\) diperoleh dengan
\[ \pi_{.1} = \pi_{11} + \pi_{21}. \]
Distribusi peluang bersyarat (conditional probability) menyatakan peluang suatu kategori dari satu variabel dengan syarat bahwa kategori variabel lainnya telah diketahui. Dalam konteks tabel kontingensi, peluang bersyarat dihitung dengan membandingkan peluang bersama dengan peluang marginal.
\[ P(Y=j \mid X=i) = \frac{\pi_{ij}}{\pi_{i.}} \]
Sebaliknya, peluang bersyarat variabel \(X\) pada kategori ke-\(i\) dengan syarat variabel \(Y\) berada pada kategori ke-\(j\) dinyatakan sebagai
\[ P(X=i \mid Y=j) = \frac{\pi_{ij}}{\pi_{.j}} \]
Ukuran asosiasi digunakan untuk mengukur kekuatan hubungan antara dua variabel dalam tabel kontingensi.
Odds merupakan perbandingan antara probabilitas terjadinya suatu kejadian dengan probabilitas tidak terjadinya kejadian tersebut. Dalam konteks tabel kontingensi, odds dapat dinyatakan sebagai perbandingan antara peluang suatu kejadian dan peluang komplemennya.
Secara umum, jika probabilitas suatu kejadian dinyatakan dengan \(\pi\), maka odds didefinisikan sebagai:
\[ \text{Odds} = \frac{\pi}{1-\pi}. \]
Odds Ratio (OR) digunakan untuk membandingkan odds antara dua kelompok pada tabel kontingensi \(2 \times 2\). Misalkan probabilitas kejadian pada kelompok 1 adalah \(\pi_1\) dan pada kelompok 2 adalah \(\pi_2\). Maka odds pada masing-masing kelompok adalah:
\[ \text{Odds}_1 = \frac{\pi_1}{1-\pi_1}, \qquad \text{Odds}_2 = \frac{\pi_2}{1-\pi_2}. \]
Odds Ratio didefinisikan sebagai
\[ OR = \frac{\text{Odds}_1}{\text{Odds}_2} = \frac{\pi_1/(1-\pi_1)}{\pi_2/(1-\pi_2)}. \]
Pada tabel kontingensi \(2 \times 2\) dengan probabilitas sel \(\pi_{ij}\), Odds Ratio juga dapat dituliskan sebagai
\[ OR = \frac{\pi_{11}\pi_{22}}{\pi_{12}\pi_{21}}. \]
Interpretasi nilai Odds Ratio adalah sebagai berikut:
Relative Risk (RR) merupakan ukuran yang digunakan untuk membandingkan probabilitas terjadinya suatu kejadian pada dua kondisi atau kelompok yang berbeda. Secara umum, Relative Risk didefinisikan sebagai rasio antara dua probabilitas bersyarat.
\[ RR = \frac{P(Y=1 \mid X=1)}{P(Y=1 \mid X=0)} = \frac{\pi_{11}/\pi_{1.}}{\pi_{21}/\pi_{2.}} \]
Nilai Relative Risk diinterpretasikan sebagai berikut:
Risk difference (RD) adalah ukuran yang menyatakan selisih probabilitas terjadinya suatu kejadian antara dua kelompok yang dibandingkan. Ukuran ini menunjukkan seberapa besar perbedaan risiko kejadian pada kelompok yang terpapar suatu faktor dibandingkan dengan kelompok yang tidak terpapar.
Secara matematis, risk difference dinyatakan sebagai: \[ RD = \frac{\pi_{11}}{\pi_{1.}} - \frac{\pi_{21}}{\pi_{2.}} \]
Estimasi titik adalah metode dalam inferensi statistik yang digunakan untuk menaksir nilai suatu parameter populasi menggunakan satu nilai yang diperoleh dari data sampel. Estimasi titik untuk proporsi populasi \(\pi\) diberikan oleh:
\[ \hat{p} = \frac{x}{n} \]
dengan:
Selain estimasi titik, sering kali diperlukan ukuran yang menggambarkan ketidakpastian dari estimasi tersebut. Estimasi interval memberikan suatu rentang nilai yang kemungkinan besar memuat parameter populasi yang sebenarnya. Rentang ini disebut interval kepercayaan (confidence interval).
Untuk ukuran sampel yang cukup besar, interval kepercayaan untuk proporsi populasi dapat didekati menggunakan distribusi normal sebagai berikut:
\[ \hat{p} \pm z_{\alpha/2} \sqrt{\frac{\hat{p}(1-\hat{p})}{n}} \]
dengan:
Uji proporsi digunakan untuk mengetahui apakah terdapat perbedaan proporsi antara dua kelompok dalam populasi. Pada analisis tabel kontingensi 2×2, pengujian ini dilakukan dengan membandingkan proporsi kejadian pada dua kelompok yang berbeda. Hipotesis yang diuji adalah sebagai berikut:
Estimasi proporsi sampel untuk masing-masing kelompok dinyatakan sebagai:
\[ \hat{p}_1 = \frac{x_1}{n_1}, \qquad \hat{p}_2 = \frac{x_2}{n_2} \]
dengan:
Statistik uji yang digunakan adalah statistik uji Z yang dirumuskan sebagai:
\[ Z = \frac{\hat{p}_1 - \hat{p}_2}{\sqrt{\hat{p}(1-\hat{p})\left(\frac{1}{n_1} + \frac{1}{n_2}\right)}} \]
dengan \(\hat{p}\) merupakan proporsi gabungan (pooled proportion) yang dihitung sebagai:
\[ \hat{p} = \frac{x_1 + x_2}{n_1 + n_2} \] Keputusan pengujian dilakukan dengan membandingkan nilai statistik uji dengan distribusi normal standar atau dengan menggunakan nilai p-value. Jika nilai p-value < atau Z > nilai kritis pada tertentu, maka hipotesis nol ditolak sehingga dapat disimpulkan bahwa terdapat perbedaan proporsi yang signifikan antara kedua kelompok.
Uji asosiasi digunakan untuk mengetahui apakah terdapat hubungan antara dua variabel kategorik pada tabel kontingensi. Pada tabel kontingensi 2×2, hubungan antar variabel dapat diukur menggunakan beberapa ukuran asosiasi seperti Risk Difference (RD), Relative Risk (RR), dan Odds Ratio (OR). Hipotesis yang diujikan adalah sebagai berikut:
Risk Difference merupakan selisih antara dua proporsi kejadian.
\[ RD = \frac{\pi_{11}}{\pi_{1.}} - \frac{\pi_{21}}{\pi_{2.}} \]
Standard error untuk Risk Difference adalah:
\[ SE(RD) = \sqrt{\frac{\hat{p}_1(1-\hat{p}_1)}{n_1} + \frac{\hat{p}_2(1-\hat{p}_2)}{n_2}} \]
Statistik uji:
\[ Z = \frac{RD}{SE(RD)} \]
Relative Risk merupakan rasio antara dua proporsi kejadian.
\[ RR = \frac{\pi_{11}/\pi_{1.}}{\pi_{21}/\pi_{2.}} \]
Standard error dihitung menggunakan transformasi logaritma:
\[ SE(\ln(RR)) = \sqrt{\frac{1}{n_{11}} - \frac{1}{n_{1.}} + \frac{1}{n_{21}} - \frac{1}{n_{2.}}} \]
Statistik uji:
\[ Z = \frac{\ln(RR)}{SE(\ln(RR))} \]
Odds Ratio merupakan rasio antara odds kejadian pada dua kelompok.
\[ OR = \frac{\pi_{11}\pi_{22}}{\pi_{12}\pi_{21}}. \]
Standard error dihitung dengan:
\[ SE(\ln(OR)) = \sqrt{\frac{1}{n_{11}} + \frac{1}{n_{12}} + \frac{1}{n_{21}} + \frac{1}{n_{22}}} \]
Statistik uji:
\[ Z = \frac{\ln(OR)}{SE(\ln(OR))} \]
Uji independensi digunakan untuk mengetahui apakah terdapat hubungan signifikan antara dua variabel kategorik pada tabel kontingensi. Hipotesis yang diuji adalah:
Uji Chi-Square membandingkan frekuensi observasi dengan frekuensi harapan jika kedua variabel bersifat independen. Statistik uji Chi-Square diperoleh sebagai berikut:
\[ \chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \]
dengan:
\[ E_{ij} = \frac{n_{i.} n_{.j}}{n} \]
Partisi Chi-Square digunakan untuk menentukan kontribusi tiap sel atau sub-tabel terhadap statistik Chi-Square total. Metode ini membantu mengidentifikasi sel atau kategori mana yang paling memengaruhi asosiasi.
Langkah-Langkah Partisi Chi-Square:
\[\chi^2_\text{total} = \sum_{i=1}^{I} \sum_{j=1}^{J} \frac{(O_{ij} - E_{ij})^2}{E_{ij}} ; E_{ij} = \frac{n_{i.} \cdot n_{.j}}{n}\]
\[R_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}}\]
Likelihood Ratio atau G² adalah alternatif uji Chi-Square menggunakan log-likelihood. Statistik uji yang digunakan adalah:
\[ G^2 = 2 \sum O_{ij} \ln \frac{O_{ij}}{E_{ij}} \] Nilai kritisnya didaapatkan dari distribusi Chi-square dengan \(df = (baris-1)*(kolom-1)\)
Uji Fisher digunakan untuk menguji asosiasi antara dua variabel kategorik ketika jumlah sampel kecil atau ada sel yang frekuensinya <5. Berbeda dengan chi-square, Fisher menghitung probabilitas exact dari tabel kontingensi. Probabilitas tabel tertentu dihitung dengan rumus hypergeometric:
\[P(X = x) = \frac{\binom{K}{x} \cdot \binom{N-K}{n-x}}{\binom{N}{n}}\] dengan:
p-value uji Fisher didapatkan dari total probabilitas semua tabel yang sama atau lebih ekstrem daripada tabel yang diamati
Analisis residual digunakan untuk menilai sejauh mana setiap sel dalam tabel kontingensi menyimpang dari nilai yang diharapkan berdasarkan distribusi independen. Residual standar (\(R_{ij}\)) menunjukkan besarnya penyimpangan tiap sel relatif terhadap ekspektasi dan variabilitasnya. Residual standar yang besar menunjukkan kontribusi signifikan terhadap statistik Chi-Square total dan dapat membantu mendeteksi sel-sel yang berperilaku tidak biasa atau outlier. Dengan mengetahui sel yang menyimpang, kita dapat meninjau data lebih lanjut, memvalidasi kesalahan pengukuran, atau memahami fenomena yang tidak sesuai dengan pola umum.
Langkah-langkah analisis residual dan deteksi outlier adalah sebagai berikut:
1. Hitung Chi-Square Total
\[ \chi^2_\text{total} = \sum_{i=1}^{I} \sum_{j=1}^{J} \frac{(O_{ij} - E_{ij})^2}{E_{ij}} ; E_{ij} = \frac{n_{i.} \cdot n_{.j}}{n} \]
2. Hitung Residual Standar (Standardized Residual) per
Sel
\[
R_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}}
\]
3. Analisis Residual Standar
4. Deteksi Outlier
5. Interpretasi
- \(R_{ij} \approx 0\) → Observasi
sesuai ekspektasi, tidak ada hubungan kuat antar kategori. - \(R_{ij}\) positif besar → Observasi lebih
tinggi dari ekspektasi → hubungan positif antar kategori.
- \(R_{ij}\) negatif besar → Observasi
lebih rendah dari ekspektasi → hubungan negatif atau tidak ada asosiasi.
- Outlier harus diperiksa apakah representatif atau error pengukuran
Sebuah toko ingin mengetahui apakah promosi diskon mempengaruhi keputusan konsumen untuk membeli produk. Dari survei terhadap 200 konsumen diperoleh data yang disajikan dalam tabel kontingensi berikut.
| Membeli | Tidak Membeli | Total | |
|---|---|---|---|
| Promosi | 70 | 30 | 100 |
| Tidak Promosi | 40 | 60 | 100 |
| Total | 110 | 90 | 200 |
Peluang membeli dengan promosi:
\[ P(Y=1|X=1)=\frac{n_{11}}{n_{11}+n_{12}} \]
\[ P(Y=1|X=1)=\frac{70}{70+30}=\frac{70}{100}=0.7 \]
Peluang membeli tanpa promosi:
\[ P(Y=1|X=0)=\frac{n_{21}}{n_{21}+n_{22}} \]
\[ P(Y=1|X=0)=\frac{40}{40+60}=\frac{40}{100}=0.4 \]
Odds membeli ketika ada promosi:
\[ \text{Odds}_1=\frac{P(Y=1|X=1)}{P(Y=0|X=1)} \]
\[ \text{Odds}_1=\frac{70/100}{30/100}=\frac{70}{30}=2.33 \]
Odds membeli tanpa promosi:
\[ \text{Odds}_0=\frac{P(Y=1|X=0)}{P(Y=0|X=0)} \]
\[ \text{Odds}_0=\frac{40/100}{60/100}=\frac{40}{60}=0.67 \]
Odds Ratio didefinisikan sebagai:
\[ OR=\frac{\text{Odds}_1}{\text{Odds}_0} \]
atau dapat dihitung langsung dari tabel:
\[ OR=\frac{n_{11}n_{22}}{n_{12}n_{21}} \]
Substitusi nilai:
\[ OR=\frac{70\times60}{30\times40} \]
\[ OR=\frac{4200}{1200}=3.5 \]
# ================================
# Contoh Kasus 2x2
# ================================
# Membuat tabel kontingensi
data <- matrix(c(70, 30,
40, 60),
nrow = 2,
byrow = TRUE)
rownames(data) <- c("Promosi","Tidak_Promosi")
colnames(data) <- c("Membeli","Tidak_Membeli")
data
## Membeli Tidak_Membeli
## Promosi 70 30
## Tidak_Promosi 40 60
# ================================
# 1. Menghitung Odds Ratio (OR), Risk Ratio (RR), dan Risk Difference (RD)
# ================================
# Odds Ratio
OR <- (data[1,1] * data[2,2]) / (data[1,2] * data[2,1])
OR
## [1] 3.5
# Risiko membeli di masing-masing grup
risk_promosi <- data[1,1] / sum(data[1,])
risk_tidak <- data[2,1] / sum(data[2,])
# Risk Ratio
RR <- risk_promosi / risk_tidak
RR
## [1] 1.75
# Risk Difference
RD <- risk_promosi - risk_tidak
RD
## [1] 0.3
# ================================
# 2. Uji Chi-Square
# ================================
uji_chi <- chisq.test(data)
uji_chi
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data
## X-squared = 16.99, df = 1, p-value = 3.758e-05
# Expected frequency
uji_chi$expected
## Membeli Tidak_Membeli
## Promosi 55 45
## Tidak_Promosi 55 45
# ================================
# 3. Hitung Residual Standar (Standardized Residual)
# ================================
residual <- (data - uji_chi$expected) / sqrt(uji_chi$expected)
residual
## Membeli Tidak_Membeli
## Promosi 2.0226 -2.236068
## Tidak_Promosi -2.0226 2.236068
# ================================
# 4. Interpretasi Residual
# ================================
# Aturan sederhana:
# |R_ij| ≈ 0 → Observasi sesuai ekspektasi
# R_ij positif besar → Observasi lebih tinggi dari ekspektasi
# R_ij negatif besar → Observasi lebih rendah dari ekspektasi
interpretasi <- apply(residual, c(1,2), function(x){
if(abs(x) < 2){
"Sesuai ekspektasi"
} else if(x >= 2){
"Positif signifikan"
} else {
"Negatif signifikan"
}
})
interpretasi
## Membeli Tidak_Membeli
## Promosi "Positif signifikan" "Negatif signifikan"
## Tidak_Promosi "Negatif signifikan" "Positif signifikan"
Hasil analisis menunjukkan bahwa konsumen yang menerima promosi diskon memiliki peluang lebih besar untuk membeli produk dibandingkan yang tidak menerima promosi. Nilai Odds Ratio (OR = 3.5) lebih besar dari 1, menunjukkan hubungan positif antara promosi dan keputusan membeli, artinya konsumen yang menerima promosi sekitar 3.5 kali lebih mungkin membeli. Risk Ratio (RR = 1.75) mendukung hal ini dengan menunjukkan konsumen pada kelompok promosi sekitar 1.75 kali lebih mungkin melakukan pembelian dibandingkan kelompok tanpa promosi, sedangkan Risk Difference (RD = 0.3) menunjukkan selisih probabilitas membeli sebesar 0.3 atau sekitar 30% lebih banyak konsumen membeli pada kelompok promosi.
Uji Chi-Square digunakan untuk menilai apakah hubungan tersebut signifikan secara statistik. Hasil uji Chi-Square menunjukkan p-value sebesar 3.7579211^{-5}. Karena p-value < 0.05, maka dapat disimpulkan bahwa terdapat hubungan yang signifikan secara statistik antara promosi dan keputusan membeli. Pemeriksaan expected frequency juga menunjukkan bahwa seluruh nilai harapan lebih besar dari 5, sehingga asumsi uji Chi-Square terpenuhi dan hasil pengujian dapat dianggap valid.
Selain itu, residual standar per sel menunjukkan sel-sel tertentu
berkontribusi signifikan terhadap Chi-Square, misal:
- Membeli-Promosi: positif signifikan
- Tidak Membeli-Promosi: negatif signifikan
- Membeli-Tidak Promosi: negatif signifikan
- Tidak Membeli-Tidak Promosi: positif signifikan
Hal ini menandakan adanya penyimpangan yang signifikan yang mendukung hubungan antara variabel.
Secara substantif, hasil analisis menunjukkan bahwa promosi memiliki pengaruh terhadap keputusan konsumen dalam membeli produk. Berdasarkan hasil analisis, konsumen yang menerima promosi diskon memiliki peluang sekitar 3.5 kali lebih besar untuk melakukan pembelian dibandingkan konsumen yang tidak menerima promosi.
Berdasarkan tabel kontingensi, dari 100 konsumen yang menerima promosi, sekitar 70% melakukan pembelian, sedangkan pada kelompok yang tidak menerima promosi hanya sekitar 40% yang melakukan pembelian. Hasil ini mengindikasikan bahwa pemberian promosi diskon dapat meningkatkan kemungkinan konsumen membeli produk di toko tersebut.
# Pastikan variabel data_matrix terdefinisi sebelum digunakan
set.seed(123)
data<- matrix(c(50, 30, 30, 50), nrow = 2, byrow = TRUE)
dimnames(data) <- list("Terpapar" = c("Ya", "Tidak"), "Kejadian" = c("Ya", "Tidak"))
print(data)
## Kejadian
## Terpapar Ya Tidak
## Ya 50 30
## Tidak 30 50
# Uji Proporsi dengan variabel yang benar
prop_test <- prop.test(x = c(data[1,1], data[2,1]),
n = c(sum(data[1,]), sum(data[2,])))
print(prop_test)
##
## 2-sample test for equality of proportions with continuity correction
##
## data: c(data[1, 1], data[2, 1]) out of c(sum(data[1, ]), sum(data[2, ]))
## X-squared = 9.025, df = 1, p-value = 0.002663
## alternative hypothesis: two.sided
## 95 percent confidence interval:
## 0.08747151 0.41252849
## sample estimates:
## prop 1 prop 2
## 0.625 0.375
n11 <- 50; n12 <- 30; n21 <- 30; n22 <- 50
n1. <- n11 + n12; n2. <- n21 + n22
# Risk Difference
p1<-(n11/n1.)
p2<-(n21/n2.)
rd <- p1 - p2
se_rd <- sqrt((p1 * (1 - p1) / n1.) + p2*((1 - p2) / n2.))
z_rd <- rd / se_rd
# Relative Risk
rr <- (n11/n1.) / (n21/n2.)
se_ln_rr <- sqrt((1/n11) - (1/n1.) + (1/n21) - (1/n2.))
z_rr <- log(rr) / se_ln_rr
# Odds Ratio
or <- (n11 * n22) / (n12 * n21)
se_ln_or <- sqrt((1/n11) + (1/n12) + (1/n21) + (1/n22))
z_or <- log(or) / se_ln_or
# Hasil
list(RD = rd, SE_RD = se_rd, Z_RD = z_rd, RR = rr, SE_Ln_RR = se_ln_rr, Z_RR = z_rr, OR = or, SE_Ln_OR = se_ln_or, Z_OR = z_or)
## $RD
## [1] 0.25
##
## $SE_RD
## [1] 0.07654655
##
## $Z_RD
## [1] 3.265986
##
## $RR
## [1] 1.666667
##
## $SE_Ln_RR
## [1] 0.1683251
##
## $Z_RR
## [1] 3.034756
##
## $OR
## [1] 2.777778
##
## $SE_Ln_OR
## [1] 0.3265986
##
## $Z_OR
## [1] 3.128155
# Contoh Data
set.seed(123)
data <- matrix(c(30, 10, 15, 45), nrow = 2, byrow = TRUE)
dimnames(data) <- list("Terpapar" = c("Ya", "Tidak"), "Kejadian" = c("Ya", "Tidak"))
print(data)
## Kejadian
## Terpapar Ya Tidak
## Ya 30 10
## Tidak 15 45
# Uji Chi-Square
chisq_test <- chisq.test(data)
print(chisq_test)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data
## X-squared = 22.264, df = 1, p-value = 2.376e-06
# Data Observasi
data_matrix <- matrix(c(495, 272, 590, 330, 265, 498), nrow = 2, byrow = TRUE)
colnames(data_matrix) <- c("Democrat", "Republican", "Independent")
rownames(data_matrix) <- c("Female", "Male")
# Uji Chi-Square
chi_test <- chisq.test(data_matrix)
# Hasil
list(Chi_Square = chi_test$statistic, P_Value = chi_test$p.value, Decision = ifelse(chi_test$p.value < 0.05, "Reject H0", "Fail to Reject H0"))
## $Chi_Square
## X-squared
## 12.56926
##
## $P_Value
## [1] 0.00186475
##
## $Decision
## [1] "Reject H0"
# Uji Chi-Square Partisi 1
chi_test1 <- chisq.test(data_matrix)
# Data Partisi 2
data_matrix2 <- matrix(c(767, 590, 595, 498), nrow = 2, byrow = TRUE)
colnames(data_matrix2) <- c("Dem+Rep", "Independent")
rownames(data_matrix2) <- c("Female", "Male")
# Uji Chi-Square Partisi 2
chi_test2 <- chisq.test(data_matrix2)
# Hasil
list(Chi_Square_Partisi1 = chi_test1, Chi_Square_Partisi2 = chi_test2)
## $Chi_Square_Partisi1
##
## Pearson's Chi-squared test
##
## data: data_matrix
## X-squared = 12.569, df = 2, p-value = 0.001865
##
##
## $Chi_Square_Partisi2
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data_matrix2
## X-squared = 0.98267, df = 1, p-value = 0.3215
# Data Observasi
data_matrix <- matrix(c(688, 650, 21, 59), nrow = 2, byrow = TRUE)
colnames(data_matrix) <- c("Cancer (+)", "Control (-)")
rownames(data_matrix) <- c("Smoker", "Non-Smoker")
# Hitung Frekuensi Ekspektasi
data_expected <- chisq.test(data_matrix)$expected
# Hitung Statistik G²
G2 <- 2 * sum(data_matrix * log(data_matrix / data_expected))
# Nilai kritis chi-square untuk df = 1 dan alpha = 0.05
critical_value <- qchisq(0.95, df = 1)
# Hasil
list(G2 = G2, Critical_Value = critical_value, Decision = ifelse(G2 > critical_value, "Reject H0", "Fail to Reject H0"))
## $G2
## [1] 19.87802
##
## $Critical_Value
## [1] 3.841459
##
## $Decision
## [1] "Reject H0"
# Definisi parameter
N <- 40 # Total populasi
K <- 29 # Jumlah kategori sukses (bola putih)
n <- 20 # Jumlah sampel diambil
x <- 18 # Jumlah sukses dalam sampel
# Hitung probabilitas P(X = 18)
dhyper(x, m = K, n = N - K, k = n)
## [1] 0.01380413
choose(29, 18) * choose(11, 2) / choose(40, 20)
## [1] 0.01380413
choose(29, 20) * choose(11, 0) / choose(40, 20)
## [1] 7.26533e-05
choose(29, 19) * choose(11, 1) / choose(40, 20)
## [1] 0.001598373
choose(29, 18) * choose(11, 2) / choose(40, 20)
## [1] 0.01380413
choose(29, 17) * choose(11, 3) / choose(40, 20)
## [1] 0.06211857
choose(29, 16) * choose(11, 4) / choose(40, 20)
## [1] 0.162464
choose(29, 15) * choose(11, 5) / choose(40, 20)
## [1] 0.2599423
choose(29, 14) * choose(11, 6) / choose(40, 20)
## [1] 0.2599423
choose(29, 13) * choose(11, 7) / choose(40, 20)
## [1] 0.162464
choose(29, 12) * choose(11, 8) / choose(40, 20)
## [1] 0.06211857
choose(29, 11) * choose(11, 9) / choose(40, 20)
## [1] 0.01380413
choose(29, 10) * choose(11, 10) / choose(40, 20)
## [1] 0.001598373
choose(29, 9) * choose(11, 11) / choose(40, 20)
## [1] 7.26533e-05
choose(29, 18) * choose(11, 2) / choose(40, 20)
## [1] 0.01380413
p.value <- 0.00007+0.00160+0.01380+0.01380+0.00160+0.00007
p.value
## [1] 0.03094
# Menggunakan Package
data <- matrix(c(18, 2, 11, 9), nrow = 2, byrow = TRUE)
fisher.test(data)
##
## Fisher's Exact Test for Count Data
##
## data: data
## p-value = 0.03095
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
## 1.147793 78.183838
## sample estimates:
## odds ratio
## 6.994073
Buatlah fungsi untuk menghitung dan melakukan pegujian hipotesis untuk RD, RR, dan OR. Gunakan data berikut Dataset dari Agresti (2019, hlm. 35, Tabel 2.3):
| Smoker | Lung Cancer (Cases) | Control |
|---|---|---|
| Yes | 688 | 650 |
| No | 21 | 59 |
Struktur Tabel Untuk Pembuatan Function
| Exposure | Cases | Control | Total |
|---|---|---|---|
| Yes | a | c | a+c |
| No | b | d | b+d |
| Total | a+b | c+d | a+b+c+d |
# Uji Proporsi
## Membuat Fungsi
prop_diff <- function(a, b, c, d, alpha = 0.05) {
ph <- a / (a + c)
pi <- b / (b + d)
nh <- a + c
ni <- b + d
se_bp <- sqrt((ph * (1 - ph) / nh) + (pi * (1 - pi) / ni))
z_alpha <- qnorm(1 - alpha / 2)
ci_lower <- (ph - pi) - z_alpha * se_bp
ci_upper <- (ph - pi) + z_alpha * se_bp
list(estimate = ph - pi, ci = c(ci_lower, ci_upper))
}
## Input data
hasil <- prop_diff(a = 688, b = 21, c = 650, d = 59)
## Menampilkan hasil
print(hasil)
## $estimate
## [1] 0.2517003
##
## $ci
## [1] 0.1516343 0.3517663
# Relative Risk
## Membuat Fungsi
relative_risk <- function(a, b, c, d, alpha = 0.05) {
ph <- a / (a + c)
pi <- b / (b + d)
nh <- a + c
ni <- b + d
ln_rr <- log(ph / pi)
se_ln_rr <- sqrt(((1 - ph) / (ph * nh)) + ((1 - pi) / (pi * ni)))
z_alpha <- qnorm(1 - alpha / 2)
ci_lower <- exp(ln_rr - z_alpha * se_ln_rr)
ci_upper <- exp(ln_rr + z_alpha * se_ln_rr)
list(estimate = exp(ln_rr), ci = c(ci_lower, ci_upper))
}
## Input data
hasil <- relative_risk(a = 688, b = 21, c = 650, d = 59)
## Menampilkan hasil
print(hasil)
## $estimate
## [1] 1.958858
##
## $ci
## [1] 1.351735 2.838667
# Odds Ratio
## Membuat Fungsi
odds_ratio <- function(a, b, c, d, alpha = 0.05) {
ln_or <- log((a * d) / (b * c))
se_ln_or <- sqrt(1/a + 1/b + 1/c + 1/d)
z_alpha <- qnorm(1 - alpha / 2)
ci_lower <- exp(ln_or - z_alpha * se_ln_or)
ci_upper <- exp(ln_or + z_alpha * se_ln_or)
list(estimate = exp(ln_or), ci = c(ci_lower, ci_upper))
}
## Input data
hasil <- odds_ratio(a = 688, b = 21, c = 650, d = 59)
## Menampilkan hasil
print(hasil)
## $estimate
## [1] 2.973773
##
## $ci
## [1] 1.786737 4.949427
# Perhitungan Manual
a <- 688
b <- 21
c <- 650
d <- 59
# Risk Difference
RD_manual <- (a / (a + c)) - (b / (b + d))
SE_RD <- sqrt((a/(a+c)*(1 - a/(a+c)))/(a+c) + (b/(b+d)*(1 - b/(b+d)))/(b+d))
CI_RD <- c(RD_manual - 1.96 * SE_RD, RD_manual + 1.96 * SE_RD)
# Relative Risk
RR_manual <- (a / (a + c)) / (b / (b + d))
SE_RR <- sqrt(1/a - 1/(a+c) + 1/b - 1/(b+d))
CI_RR <- exp(log(RR_manual) + c(-1.96, 1.96) * SE_RR)
# Odds Ratio
OR_manual <- (a * d) / (b * c)
SE_OR <- sqrt(1/a + 1/b + 1/c + 1/d)
CI_OR <- exp(log(OR_manual) + c(-1.96, 1.96) * SE_OR)
list(RD = RD_manual, CI_RD = CI_RD, RR = RR_manual, CI_RR = CI_RR, OR = OR_manual, CI_OR = CI_OR)
## $RD
## [1] 0.2517003
##
## $CI_RD
## [1] 0.1516324 0.3517682
##
## $RR
## [1] 1.958858
##
## $CI_RR
## [1] 1.351726 2.838687
##
## $OR
## [1] 2.973773
##
## $CI_OR
## [1] 1.786720 4.949474
# Perbandingan dengan Output R
library(epiR)
## Warning: package 'epiR' was built under R version 4.4.3
## Loading required package: survival
## Package epiR 2.0.91 is loaded
## Type help(epi.about) for summary information
## Type browseVignettes(package = 'epiR') to learn how to use epiR for applied epidemiological analyses
##
table_data <- matrix(c(a, c, b, d), nrow = 2, byrow = TRUE)
colnames(table_data) <- c("Lung Cancer", "Control")
rownames(table_data) <- c("Yes", "No")
res <- epi.2by2(table_data)
print(res)
## Outcome+ Outcome- Total Inc risk *
## Exposure+ 688 650 1338 51.42 (48.70 to 54.13)
## Exposure- 21 59 80 26.25 (17.04 to 37.29)
## Total 709 709 1418 50.00 (47.36 to 52.64)
##
## Point estimates and 95% CIs:
## -------------------------------------------------------------------
## Inc risk ratio 1.96 (1.35, 2.84)
## Inc odds ratio 2.97 (1.79, 4.95)
## Attrib risk in the exposed * 25.17 (15.16, 35.18)
## Attrib fraction in the exposed (%) 48.95 (28.08, 65.39)
## Attrib risk in the population * 23.75 (13.76, 33.74)
## Attrib fraction in the population (%) 47.50 (29.16, 64.02)
## -------------------------------------------------------------------
## Uncorrected chi2 test that OR = 1: chi2(1) = 19.129 Pr>chi2 = <0.001
## Fisher exact test that OR = 1: Pr>chi2 = <0.001
## Wald confidence limits
## CI: confidence interval
## * Outcomes per 100 population units
# Data Observasi
observed <- matrix(c(20, 10, 30, 20), nrow = 2, byrow = TRUE)
# Hitung nilai ekspektasi
expected <- chisq.test(observed)$expected
# Pearson Residual
pearson_residual <- (observed - expected) / sqrt(expected)
# Standardized Residual
row_sum <- rowSums(observed)
col_sum <- colSums(observed)
total_sum <- sum(observed)
standardized_residual <- (observed - expected) / sqrt(expected * (1 - row_sum / total_sum) * (1 - col_sum / total_sum))
# Menampilkan hasil
list(
Pearson_Residual = pearson_residual,
Standardized_Residual = standardized_residual
)
## $Pearson_Residual
## [,1] [,2]
## [1,] 0.2886751 -0.3726780
## [2,] -0.2236068 0.2886751
##
## $Standardized_Residual
## [,1] [,2]
## [1,] 0.5962848 -0.7698004
## [2,] -0.4618802 0.5962848
# Data Observasi
observed <- matrix(c(50, 20, 30, 50), nrow = 2, byrow = TRUE)
colnames(observed) <- c("Sukses", "Gagal")
rownames(observed) <- c("Grup A", "Grup B")
# Hitung nilai ekspektasi
expected <- chisq.test(observed)$expected
# Pearson Residual
pearson_residual <- (observed - expected) / sqrt(expected)
# Standardized Residual
row_sum <- rowSums(observed)
col_sum <- colSums(observed)
total_sum <- sum(observed)
standardized_residual <- (observed - expected) / sqrt(expected * (1 - row_sum / total_sum) * (1 - col_sum / total_sum))
# Menampilkan hasil
list(
Observed = observed,
Expected = expected,
Pearson_Residual = pearson_residual,
Standardized_Residual = standardized_residual
)
## $Observed
## Sukses Gagal
## Grup A 50 20
## Grup B 30 50
##
## $Expected
## Sukses Gagal
## Grup A 37.33333 32.66667
## Grup B 42.66667 37.33333
##
## $Pearson_Residual
## Sukses Gagal
## Grup A 2.073070 -2.216205
## Grup B -1.939179 2.073070
##
## $Standardized_Residual
## Sukses Gagal
## Grup A 4.155384 -4.442293
## Grup B -3.887006 4.155384
Seorang peneliti ingin mengetahui apakah ada hubungan antara kebiasaan merokok dan kejadian kanker paru-paru. Data yang diperoleh dari sebuah penelitian medis ditampilkan dalam tabel kontingensi berikut:
| Kanker Paru (+) | Kanker Paru (-) | Total | |
|---|---|---|---|
| Perokok | 450 | 200 | 650 |
| Bukan Perokok | 50 | 300 | 350 |
| Total | 500 | 500 | 1000 |
# Data Observasi
observed <- matrix(c(450, 200, 50, 300), nrow = 2, byrow = TRUE)
colnames(observed) <- c("Kanker Paru (+)", "Kanker Paru (-)")
rownames(observed) <- c("Perokok", "Bukan Perokok")
# Hitung nilai ekspektasi
expected <- chisq.test(observed)$expected
# Pearson Residual
pearson_residual <- (observed - expected) / sqrt(expected)
# Standardized Residual
row_sum <- rowSums(observed)
col_sum <- colSums(observed)
total_sum <- sum(observed)
standardized_residual <- (observed - expected) / sqrt(expected * (1 - row_sum / total_sum) * (1 - col_sum / total_sum))
# Menampilkan hasil
list(
Observed = observed,
Expected = expected,
Pearson_Residual = pearson_residual,
Standardized_Residual = standardized_residual
)
## $Observed
## Kanker Paru (+) Kanker Paru (-)
## Perokok 450 200
## Bukan Perokok 50 300
##
## $Expected
## Kanker Paru (+) Kanker Paru (-)
## Perokok 325 325
## Bukan Perokok 175 175
##
## $Pearson_Residual
## Kanker Paru (+) Kanker Paru (-)
## Perokok 6.933752 -6.933752
## Bukan Perokok -9.449112 9.449112
##
## $Standardized_Residual
## Kanker Paru (+) Kanker Paru (-)
## Perokok 16.57484 -16.57484
## Bukan Perokok -16.57484 16.57484
Agresti, A. (2013). Categorical Data Analysis. Wiley.