Puji syukur ke hadirat Tuhan Yang Maha Esa, karena atas rahmat dan karunia-Nya, eBook ini dapat disusun dan diselesaikan dengan baik. Buku ini dibuat sebagai panduan belajar dan referensi dalam memahami konsep, metode, serta penerapan analisis data kategori yang banyak digunakan dalam penelitian di berbagai bidang, terutama ilmu sosial, kesehatan, dan statistika terapan.
Analisis data kategori merupakan salah satu cabang penting dalam statistika yang berfokus pada data dalam bentuk kategori atau klasifikasi. Materi dalam eBook ini mencakup dasar-dasar teori, pendekatan-pendekatan pengujian hipotesis, hingga penerapan praktis menggunakan perangkat lunak statistik seperti R. Disertai dengan contoh-contoh nyata dan interpretasi hasil, diharapkan pembaca dapat memahami serta menerapkan metode yang sesuai dalam analisis data kategori.
Saya menyadari bahwa eBook ini masih jauh dari sempurna. Oleh karena itu, saran dan kritik yang membangun sangat saya harapkan untuk perbaikan di edisi berikutnya.
Akhir kata, saya mengucapkan terima kasih kepada semua pihak yang telah membantu dalam penyusunan buku ini, baik secara langsung maupun tidak langsung. Semoga eBook ini dapat memberikan manfaat bagi para pembaca, khususnya mahasiswa, dosen, peneliti, dan praktisi yang berkecimpung di dunia statistik dan penelitian kuantitatif.
Jatinangor, 12 Juni 2025
Dinar Olivia Rahmadyta
Data kategori adalah data yang dapat dikelompokkan berdasarkan karakteristik atau ciri-ciri tertentu. Data ini biasanya terdiri dari skala nominal dan ordinal dan merupakan data kualitatif. Data kategorikal biasanya disebut data non-metrik atau tidak mengukur data.
Analisis data kategorik adalah pengumpulan data, pemodelan data, dan analisis data. Konsep analisis ini mengekstraksi data dan memberikan keuntungan. Dalam analisis ini, dapat dikatakan bahwa proses pembuangan data sampah yang mendapatkan data yang berguna. Data tersebut nantinya dapat memberikan manfaat dalam mengambil kesimpulan atau pun keputusan yang cerdas.
Dari pengertian analisis data kategorik di atas, tentunya analisis ini dilakukan untuk tujuan mengelompokkan data berdasarkan kategori tertentu. Selain itu, analisis data kategorik digunakan untuk memahami pola tertentu, korelasi (hubungan) dan perbedaan dari kelompok-kelompok atau pun kategori tertentu. Dengan memahami hal tersebut maka dapat lebih mudah dalam mengambil sebuah keputusan cerdas.
Ada dua jenis data kategorik utama yang sering digunakan. Beberapa macam-macam data kategorik adalah:
Data yang tidak memiliki urutan atau peringkat. Contohnya termasuk jenis kelamin (pria, wanita), warna mobil (merah, hijau, biru), atau nama negara.
Data yang memiliki urutan atau tingkatan tapi tidak memiliki jarak yang tetap antar kategori. Contohnya termasuk tingkat pendidikan (SD, SMP, SMA, S1), atau tingkat kepuasan (tidak puas, cukup puas, sangat puas).
Beberapa jenis uji statistik yang digunakan untuk menganalisis data kategorik diantaranya:
Uji Chi-Square digunakan untuk menguji hubungan antara dua variabel kategorik. Metode ini mengukur sejauh mana perbedaan antara frekuensi yang diamati dengan frekuensi yang diharapkan jika tidak ada hubungan antara variabel-variabel tersebut.
Hasil uji Chi-Square menghasilkan nilai statistik dan nilai p-value. Jika nilai p-value cukup kecil (biasanya di bawah tingkat signifikansi yang ditentukan sebelumnya, misalnya 0.05), maka kita dapat menyimpulkan bahwa terdapat hubungan yang signifikan antara variabel-variabel tersebut.
Hipotesis
H0: Tidak ada hubungan antara variabel (independen)
H1: Ada hubungan antara variabel (dependen)
\[ \chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \] - \(O_{ij}\): frekuensi observasi
Kriteria Uji
Bandingkan nilai \(\chi^2\) hitung dengan nilai kritis dari tabel distribusi chi-square dengan derajat bebas: \[ df = (r - 1)(c - 1) \] Jika \(\chi^2_{hitung} > \chi^2_{tabel}\), maka tolak \(H_0\).
Analisis frekuensi melibatkan penghitungan frekuensi kemunculan masing-masing kategori dalam data yang diamati. Frekuensi ini sering direpresentasikan dalam bentuk tabel atau diagram batang.
Analisis frekuensi memungkinkan kita untuk melihat distribusi data secara visual dan mengidentifikasi pola atau trend dalam data kategorik.
Hipotesis
Tidak diperlukan hipotesis formal; digunakan untuk eksplorasi deskriptif.
Statistik yang Dilaporkan
Frekuensi absolut
Frekuensi relatif (%)
Grafik: bar chart atau pie chart
data <- c("A", "A", "B", "C", "A", "B", "C", "C", "C")
table(data)
## data
## A B C
## 3 2 4
prop.table(table(data)) * 100
## data
## A B C
## 33.33333 22.22222 44.44444
Analisis kontingensi digunakan untuk menganalisis hubungan antara dua atau lebih variabel kategorik dengan menggunakan tabel kontingensi. Tabel kontingensi adalah tabel silang yang menunjukkan frekuensi kemunculan kombinasi kategori yang berbeda dalam data.
Metode yang umum digunakan dalam analisis kontingensi adalah uji Chi-Square yang telah disebutkan sebelumnya.
Analisis kontingensi memungkinkan kita untuk melihat hubungan antara variabel-variabel kategorik dan mengidentifikasi asosiasi atau ketergantungan antara variabel-variabel tersebut.
Hipotesis
H0: Tidak ada asosiasi antara dua variabel
H1: Ada asosiasi
Statistik yang Umum Digunakan :
Chi-Square (lihat atas)
Fisher’s Exact Test (untuk tabel kecil)
Korelasi Cramér’s V (ukuran asosiasi)
\[
V = \sqrt{\frac{\chi^2}{n \cdot \min(r - 1, c - 1)}}
\] - \(\chi^2\): nilai
chi-square dari tabel kontingensi
- \(n\): jumlah total observasi
- \(r\), \(c\): jumlah baris dan kolom
Interpretasi Nilai V (rule of thumb) - 0 – 0.1 : sangat lemah
- 0.1 – 0.3 : lemah
- 0.3 – 0.5 : sedang
- > 0.5 : kuat
Analisis multivariat melibatkan penggunaan teknik statistik yang lebih kompleks untuk menganalisis hubungan antara tiga atau lebih variabel kategorik.
Tujuan
Memprediksi variabel kategorik (biasanya biner) dari satu atau lebih prediktor.
Hipotesis
H0: Koefisien regresi = 0 (tidak berpengaruh)
H1: Koefisien ≠ 0 (berpengaruh)
\[ \log\left(\frac{p}{1 - p}\right) = \beta_0 + \beta_1 X_1 + \beta_2 X_2 + \dots + \beta_k X_k \]
atau dapat ditulis sebagai:
\[ p = \frac{1}{1 + e^{-(\beta_0 + \beta_1 X_1 + \beta_2 X_2 + \dots + \beta_k X_k)}} \] - \(p\): probabilitas terjadinya peristiwa (Y = 1) - \(\beta_0\): intercept - \(\beta_1, \beta_2, \dots, \beta_k\): koefisien regresi - \(X_1, X_2, \dots, X_k\): variabel prediktor
Tujuan
Visualisasi hubungan antar kategori dari dua variabel atau lebih.
Hipotesis
Tidak formal; fokus pada eksplorasi visual
Statistik
Inertia (sejenis varians)
Chi-Square Distance
Tujuan
Mengelompokkan observasi berdasarkan pola respons kategorik.
Hipotesis
H0: Jumlah kelas yang ditentukan cukup
H1: Tambahan kelas meningkatkan model
Statistik
AIC / BIC untuk pemilihan jumlah kelas
Probabilitas keanggotaan kelas
Distribusi Bernoulli menggambarkan hasil dari satu percobaan dengan dua kemungkinan: sukses (1) atau gagal (0). Dengan rumus Umum
\[ P(X = x) = p^x (1 - p)^{1 - x}, \quad \text{dengan } x \in \{0, 1\} \]
Contoh Soal :
Sebuah perusahaan elektronik memproduksi baterai isi ulang. Dari data historis, diketahui bahwa 30% baterai gagal berfungsi (gagal mengisi daya secara optimal). Seorang teknisi ingin mengetahui probabilitas bahwa sebuah baterai acak dari lini produksi akan berfungsi dengan normal (sukses).
Berapakah peluang bahwa satu unit baterai berfungsi normal?
# Peluang gagal 30% → maka peluang sukses (berfungsi normal) adalah 70%
p <- 0.7 # probabilitas sukses (produk berfungsi normal)
x <- 1 # x = 1 berarti kondisi sukses (berfungsi)
prob_berfungsi <- p^x * (1 - p)^(1 - x) # rumus distribusi Bernoulli
paste("Probabilitas produk berfungsi:", prob_berfungsi)
## [1] "Probabilitas produk berfungsi: 0.7"
Interpretasi
Peluang bahwa satu produk acak berfungsi normal (tidak gagal) adalah 70%. Ini adalah kasus distribusi Bernoulli, di mana hanya ada dua kemungkinan: sukses (fungsi) atau gagal.
Distribusi Binomial merupakan hasil dari \(n\) percobaan Bernoulli yang independen, masing-masing dengan probabilitas sukses \(p\).Dengan rumus umum: \[ P(X = k) = \binom{n}{k} p^k (1 - p)^{n - k} \]
Contoh Soal
Sebuah perusahaan teknologi sedang menguji perangkat lunak deteksi malware. Berdasarkan hasil uji coba sebelumnya, software ini berhasil mendeteksi malware dalam 60% kasus. Seorang peneliti keamanan siber ingin mengetahui probabilitas bahwa software akan berhasil mendeteksi malware tepat dalam 6 dari 10 percobaan.
Jika software diuji pada 10 file yang mengandung malware, berapa peluang bahwa tepat 6 dari 10 file tersebut berhasil terdeteksi?
# Parameter binomial
n <- 10 # jumlah percobaan
p <- 0.6 # peluang sukses pada tiap percobaan
k <- 6 # jumlah sukses yang diinginkan
# Hitung probabilitas tepat 6 sukses dari 10
prob_binomial <- dbinom(k, size = n, prob = p)
# Tampilkan hasil
paste("Probabilitas tepat 6 sukses dari 10:", prob_binomial)
## [1] "Probabilitas tepat 6 sukses dari 10: 0.250822656"
Interpretasi
Peluang bahwa tepat 6 dari 10 percobaan berhasil (sukses), jika peluang sukses tiap kali adalah 60%, adalah sekitar 25.08%. Ini adalah distribusi Binomial, karena jumlah percobaan tetap (n = 10) dan tiap percobaan independen.
Distribusi Multinomial adalah generalisasi dari distribusi Binomial untuk lebih dari dua kategori.Dengan rumus Umum
\[ P(X_1 = x_1, \dots, X_k = x_k) = \frac{n!}{x_1! x_2! \cdots x_k!} p_1^{x_1} p_2^{x_2} \cdots p_k^{x_k} \]
Contoh Soal
Sebuah perusahaan ingin mengetahui preferensi masyarakat terhadap tiga merek minuman populer: Aqua (A), Birama (B), dan Citrus (C). Survei dilakukan terhadap 10 responden, dan setiap orang hanya boleh memilih satu merek yang paling mereka sukai.
Dari data riset pasar sebelumnya, diperkirakan:
Peluang seseorang memilih merek A adalah 0.4
Peluang memilih merek B adalah 0.3
Peluang memilih merek C adalah 0.3
Berapakah peluang bahwa tepat 4 orang memilih A, 3 orang memilih B, dan 3 orang memilih C?
# Jumlah orang yang memilih tiap merek
x <- c(4, 3, 3) # 4 untuk A, 3 untuk B, 3 untuk C
# Peluang memilih masing-masing merek
p <- c(0.4, 0.3, 0.3)
# Hitung probabilitas kombinasi tersebut
prob_multinom <- dmultinom(x, prob = p)
# Tampilkan hasil
paste("Probabilitas kombinasi (4,3,3):", prob_multinom)
## [1] "Probabilitas kombinasi (4,3,3): 0.0783820800000002"
Interpretasi
Peluang bahwa 4 orang memilih merek A, 3 memilih B, dan 3 memilih C dari 10 responden, dengan probabilitas masing-masing merek adalah (0.4, 0.3, 0.3), adalah sekitar 22.74%. Ini menggunakan distribusi Multinomial, cocok untuk data kategori dengan >2 hasil.
Distribusi Poisson menggambarkan jumlah kejadian dalam suatu interval waktu atau ruang, dengan asumsi kejadian terjadi secara acak dan independen.Dengan rumus Umum
\[ P(X = k) = \frac{\lambda^k e^{-\lambda}}{k!} \]
Contoh Soal
Sebuah kedai kopi di pusat kota mencatat bahwa rata-rata terdapat 5 pelanggan yang datang setiap jam. Pemilik kedai ingin mengetahui kemungkinan bahwa tepat 3 pelanggan datang dalam satu jam tertentu, misalnya pada jam 3–4 sore.
Distribusi kedatangan pelanggan diasumsikan mengikuti distribusi Poisson, karena:
Kejadian bersifat acak dan independen,
Dihitung dalam satuan waktu (per jam),
Peluang kedatangan dalam interval kecil sangat kecil (rare events),
Tidak terjadi kedatangan bersamaan (tepat satu per waktu).
Berapakah probabilitas bahwa tepat 3 pelanggan datang dalam satu jam, jika rata-rata kedatangan adalah 5 pelanggan per jam?
lambda <- 5 # rata-rata kedatangan per jam
k <- 3 # jumlah pelanggan yang diharapkan
# Hitung probabilitas menggunakan distribusi Poisson
prob_poisson <- dpois(k, lambda = lambda)
# Tampilkan hasil
paste("Probabilitas tepat 3 pelanggan:", prob_poisson)
## [1] "Probabilitas tepat 3 pelanggan: 0.140373895814281"
Interpretasi
Peluang bahwa tepat 3 pelanggan datang dalam satu jam jika rata-rata kedatangan adalah 5 per jam adalah sekitar 14.04%. Distribusi Poisson cocok digunakan di sini karena kita mengukur jumlah kejadian dalam satu interval waktu tetap.
Dalam analisis data kategorik, penting untuk memahami bagaimana data dikumpulkan karena desain sampling sangat mempengaruhi jenis statistik yang dapat digunakan serta bagaimana hasilnya diinterpretasikan. Salah satu aspek penting adalah membedakan antara data yang dikumpulkan secara prospektif (maju ke depan dalam waktu) dan retrospektif (kembali ke masa lalu), serta bentuk studi seperti eksperimen, studi kohort, dan studi kasus-kontrol.
Desain prospektif mengamati subjek mulai dari paparan dan mengikuti ke depan waktu untuk melihat outcome. Cocok untuk studi yang ingin melihat hubungan kausal dan estimasi kejadian baru (insiden).
Teknik Sampling yang umum digunakan adalah: Simple Random Sampling - Setiap individu dalam populasi memiliki peluang yang sama untuk dipilih. - Cocok untuk eksperimen kecil dengan populasi yang homogen.
Stratified Random Sampling - Populasi dibagi menjadi strata (misalnya usia, jenis kelamin), lalu dilakukan pengambilan acak dalam tiap strata. - Menjamin representasi proporsional.
Cluster Sampling (lebih jarang digunakan) - Populasi dibagi ke dalam kelompok (cluster), lalu cluster dipilih secara acak. - Cocok untuk populasi yang tersebar geografis.
Block Randomization - Digunakan untuk menjaga keseimbangan jumlah subjek pada setiap kelompok perlakuan dalam percobaan. - Subjek diacak dalam blok kecil.
Catatan Penting: Dalam eksperimen, yang paling penting bukan hanya sampling, tapi juga random assignment (pengacakan ke perlakuan), untuk menghindari bias.
Teknik Sampling yang umum digunakan adalah: Simple Random Sampling dari populasi berdasarkan status paparan.
Stratified Sampling berdasarkan variabel seperti usia, jenis kelamin.
Systematic Sampling jika data daftar populasi tersedia.
Multistage Sampling (penggabungan cluster + stratified), untuk populasi besar dan menyebar.
Pada desain retrospektif, outcome telah terjadi dan peneliti melihat kembali ke masa lalu untuk mencari paparan. Efisien dalam biaya dan waktu, tetapi inferensi kausal lebih lemah.
Teknik Sampling yang umum digunakan adalah: Purposive
Sampling (bertujuan)
Memilih kasus dan kontrol berdasarkan kriteria tertentu.
Matching Sampling
Kasus dan kontrol dipasangkan berdasarkan variabel pengganggu seperti
usia, jenis kelamin (matching 1:1 atau 1:n).
Stratified Sampling
Jika populasi kontrol besar, digunakan untuk menjamin
proporsionalitas.
Teknik Sampling yang umum digunakan adalah: - Systematic
Sampling dari catatan historis berdasarkan status
paparan.
- Stratified Sampling jika data arsip lengkap dan
heterogen.
- Convenience Sampling (tidak disarankan untuk
inferensi statistik).
## Warning: package 'knitr' was built under R version 4.3.3
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
| Aspek | Eksperimen | Kohort Prospektif | Kasus-Kontrol | Kohort Retrospektif |
|---|---|---|---|---|
| Tujuan Utama | Menguji efek intervensi | Mengamati efek paparan | Mencari faktor risiko | Mengamati efek paparan (historis) |
| Arah Waktu | Prospektif | Prospektif | Retrospektif | Retrospektif |
| Dasar Pemilihan Subjek | Randomisasi ke perlakuan | Berdasarkan status paparan | Berdasarkan status outcome (kasus vs kontrol) | Berdasarkan status paparan dari data arsip |
| Contoh Sampling yang Umum | Simple, Stratified, Block | Simple, Stratified, Systematic | Purposive, Matching | Systematic, Stratified |
| Kemampuan Estimasi Insidensi | Ya | Ya | Tidak | Ya (dari arsip) |
| Kemampuan Estimasi Risiko Relatif | Ya | Ya | Tidak langsung | Ya |
| Kemampuan Estimasi Odds Ratio | Ya | Ya | Ya | Ya |
| Kelebihan | Kontrol kuat terhadap variabel luar | Data real-world, urutan waktu jelas | Cepat, hemat biaya | Lebih cepat dari prospektif, biaya lebih rendah |
| Keterbatasan | Mahal, etika, tidak selalu praktis | Waktu lama, mahal | Rentan bias, tidak estimasi insidensi | Kualitas data historis bisa bervariasi |
Tabel kontingensi 2x2 merupakan suatu metode statistik yang menggambarkan dua variabel secara simultan dan hasilnya ditampilkan dalam bentuk tabel yang merefleksikan distribusi bersama dua variabel dengan jumlah kategori yang terbatas. Tabel kontingensi sering disebut juga dengan cross tabulation yang digunakan untuk mengetahui hubungan antara dua variabel penelitian yang bukan hubungan sebab akibat
Misalkan terdapat 2 variabel, yaitu Variabel A dan B. Tabel kontingensi dua dimensi dapat disajikan dalam bentuk tabel 2 x 2 dengan:
2 baris atau kategori pada Variabel A.
2 kolom atau kategori pada Variabel B.
Terdapat 2 x 2 sel dalam tabel yang berisi frekuensi pengamatan yang terjadi dari kombinasi variabel A dan B.
tabel <- data.frame(
"Variabel A \\ Variabel B" = c("1", "2", "Total"),
"1" = c("a", "c", "a + c"),
"2" = c("b", "d", "b + d"),
"Total" = c("a + b", "c + d", "n")
)
knitr::kable(tabel, caption = "Tabel Kontingensi 2x2")
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
| Variabel.A…Variabel.B | X1 | X2 | Total |
|---|---|---|---|
| 1 | a | b | a + b |
| 2 | c | d | c + d |
| Total | a + c | b + d | n |
Keterangan Kolom dan Baris:
Variabel A dan Variabel B: Dua variabel kategorik yang ingin dianalisis. Contoh:
A = status merokok (1 = merokok, 2 = tidak merokok)
B = status penyakit (1 = sakit, 2 = sehat)
a: Jumlah individu yang termasuk kategori A = 1 dan B = 1
b: Jumlah individu yang termasuk A = 1 dan B = 2
c: Jumlah individu yang termasuk A = 2 dan B = 1
d: Jumlah individu yang termasuk A = 2 dan B = 2
a + b: Jumlah total untuk kategori A = 1
c + d: Jumlah total untuk kategori A = 2
a + c: Jumlah total untuk kategori B = 1
b + d: Jumlah total untuk kategori B = 2
n: Jumlah seluruh pengamatan, yaitu total keseluruhan (a + b + c + d)
Peluang bersama adalah peluang terjadinya dua kejadian secara bersamaan. Dalam tabel kontingensi 2x2, ini berarti peluang untuk suatu kombinasi nilai dari dua variabel kategorik.
Peluang marginal adalah peluang terjadinya satu kejadian tanpa mempertimbangkan kejadian lainnya. Ini diperoleh dari total baris atau kolom, dibagi dengan total keseluruhan.
Peluang bersyarat adalah peluang terjadinya suatu kejadian dengan asumsi kejadian lain telah terjadi. Dalam tabel 2x2, ini dilihat sebagai baris (A) terhadap kolom (B), atau sebaliknya.
Untuk variabel A:
\[ P(A=1) = \frac{a + b}{n} \]
\[ P(A=2) = \frac{c + d}{n} \]
Untuk variabel B:
\[ P(B=1) = \frac{a + c}{n} \]
\[ P(B=2) = \frac{b + d}{n} \]
Peluang B terjadi jika diketahui A:
\[ P(B=1 \mid A=1) = \frac{a}{a + b} \]
\[ P(B=2 \mid A=1) = \frac{b}{a + b} \]
\[ P(B=1 \mid A=2) = \frac{c}{c + d} \]
\[ P(B=2 \mid A=2) = \frac{d}{c + d} \]
Peluang A terjadi jika diketahui B:
\[ P(A=1 \mid B=1) = \frac{a}{a + c} \]
\[ P(A=2 \mid B=1) = \frac{c}{a + c} \]
\[ P(A=1 \mid B=2) = \frac{b}{b + d} \]
\[ P(A=2 \mid B=2) = \frac{d}{b + d} \]
Contoh Perhitungan manual
Misalkan sebuah perusahaan melakukan survei terhadap 200 pelanggan mengenai preferensi mereka terhadap dua merek produk A dan B berdasarkan jenis kelamin mereka.
| Prefer A | Prefer B | Total | |
|---|---|---|---|
| Laki-laki | 50 | 30 | 80 |
| Perempuan | 70 | 50 | 120 |
| Total | 120 | 80 | 200 |
Langkah 1: Hitung Peluang Bersama
Misalkan peluang bersama untuk masing-masing kategori:
total_responden <- 200
table_contingency <- matrix(c(50, 30, 70, 50), nrow = 2, byrow = TRUE)
colnames(table_contingency) <- c("Prefer A", "Prefer B")
rownames(table_contingency) <- c("Laki-laki", "Perempuan")
table_contingency
## Prefer A Prefer B
## Laki-laki 50 30
## Perempuan 70 50
# Menghitung peluang bersama
p_joint <- table_contingency / total_responden
p_joint
## Prefer A Prefer B
## Laki-laki 0.25 0.15
## Perempuan 0.35 0.25
Perhitungan manual: \[ P(Laki-laki \cap Prefer A) = \frac{50}{200} = 0.25 \] \[ P(Laki-laki \cap Prefer B) = \frac{30}{200} = 0.15 \] \[ P(Perempuan \cap Prefer A) = \frac{70}{200} = 0.35 \] \[ P(Perempuan \cap Prefer B) = \frac{50}{200} = 0.25 \]
Langkah 2: Hitung Peluang Marginal
# Menghitung peluang marginal
p_marginal_A <- rowSums(table_contingency) / total_responden
p_marginal_B <- colSums(table_contingency) / total_responden
p_marginal_A # Peluang berdasarkan jenis kelamin
## Laki-laki Perempuan
## 0.4 0.6
p_marginal_B # Peluang berdasarkan preferensi produk
## Prefer A Prefer B
## 0.6 0.4
Perhitungan manual: \[ P(Laki-laki) = \frac{80}{200} = 0.4 \] \[ P(Perempuan) = \frac{120}{200} = 0.6 \] \[ P(Prefer A) = \frac{120}{200} = 0.6 \] \[ P(Prefer B) = \frac{80}{200} = 0.4 \]
Langkah 3: Hitung Peluang Bersyarat
Contoh perhitungan peluang seorang pelanggan laki-laki lebih memilih produk A:
# Menghitung peluang bersyarat
p_A_given_B <- p_joint / p_marginal_B
p_A_given_B
## Prefer A Prefer B
## Laki-laki 0.4166667 0.250
## Perempuan 0.8750000 0.625
Perhitungan manual: \[ P(Laki-laki | Prefer A) = \frac{P(Laki-laki \cap Prefer A)}{P(Prefer A)} = \frac{0.25}{0.6} = 0.4167 \] \[ P(Laki-laki | Prefer B) = \frac{P(Laki-laki \cap Prefer B)}{P(Prefer B)} = \frac{0.15}{0.4} = 0.375 \] \[ P(Perempuan | Prefer A) = \frac{P(Perempuan \cap Prefer A)}{P(Prefer A)} = \frac{0.35}{0.6} = 0.5833 \] \[ P(Perempuan | Prefer B) = \frac{P(Perempuan \cap Prefer B)}{P(Prefer B)} = \frac{0.25}{0.4} = 0.625 \]
Ukuran asosiasi dalam tabel kontingensi 2x2 digunakan untuk mengukur hubungan atau perbedaan proporsi antara dua variabel kategorik. Biasanya digunakan untuk membandingkan risiko, peluang (odds), dan kekuatan asosiasi antar dua kelompok (misal: terpapar vs tidak terpapar).
| Bidang | Contoh Penggunaan |
|---|---|
| Kesehatan | Merokok vs Risiko Kanker Paru-paru |
| Sosial | Pendidikan vs Partisipasi dalam Pemilu |
| Psikologi | Terapi vs Perubahan Status Mental |
| Epidemiologi | Vaksinasi vs Infeksi COVID-19 |
Struktur Tabel Kontingensi 2x2
\[ \begin{array}{|c|c|c|c|} \hline & Y = 1 & Y = 0 & \text{Total} \\ \hline X = 1 & a & b & a + b \\ X = 0 & c & d & c + d \\ \hline \text{Total} & a + c & b + d & n \\ \hline \end{array} \]
Pengertian: Risk Difference adalah selisih antara proporsi kejadian pada dua kelompok. Ini menunjukkan seberapa besar perbedaan risiko kejadian antar dua kelompok (misalnya, kelompok terpapar vs tidak terpapar). Rumus: \[ RD = \frac{a}{a + b} - \frac{c}{c + d} \]
Interpretasi:
Jika \(RD > 0\): risiko kejadian lebih tinggi di Grup 1.
Jika \(RD < 0\): risiko kejadian lebih rendah di Grup 1.
Jika \(RD = 0\): tidak ada perbedaan risiko antar grup.
Pengertian: Relative Risk membandingkan risiko kejadian pada grup terpapar dengan risiko pada grup tidak terpapar. Cocok digunakan dalam studi prospektif (cohort, eksperimen).
Rumus: \[ RR = \frac{a / (a + b)}{c / (c + d)} \]
Interpretasi:
Jika \(RR = 1\): risiko sama antar grup.
Jika \(RR > 1\): risiko lebih tinggi di grup 1.
Jika \(RR < 1\): risiko lebih rendah di grup 1.
Pengertian: Odds adalah rasio antara kemungkinan kejadian dan tidak kejadian dalam satu kelompok. Digunakan sebagai dasar untuk Odds Ratio.
Rumus: Odds:
Grup 1: \(\text{Odds}_1 = \frac{a}{b}\)
Grup 2: \(\text{Odds}_0 = \frac{c}{d}\)
Odds Ratio (OR):
Pengertian:
Odds Ratio membandingkan odds kejadian antara dua kelompok. Sangat umum dalam studi kasus-kontrol dan digunakan dalam regresi logistik.
Rumus: \[ OR = \frac{a \cdot d}{b \cdot c} \]
Interpretasi:
\(OR = 1\): Tidak ada asosiasi
\(OR > 1\): Odds lebih tinggi pada grup 1
\(OR < 1\): Odds lebih rendah
Pengertian:
Uji Chi-Square digunakan untuk menguji apakah terdapat hubungan yang signifikan antara dua variabel kategorik dalam tabel kontingensi.
Rumus: \[ \chi^2 = \sum \frac{(O - E)^2}{E} \]
Hipotesis:
H0: Tidak ada asosiasi (variabel independen)
H1: Ada asosiasi (variabel dependen)
Kapan digunakan:
Ketika frekuensi di tiap sel cukup besar (umumnya semua sel ≥ 5).
Pengertian:
Fisher’s Exact Test digunakan untuk menguji hubungan antara dua variabel kategorik dalam tabel kecil (biasanya 2x2), terutama jika ada sel dengan frekuensi < 5.
Rumus probabilitas tabel 2x2: \[ P = \frac{(a + b)! (c + d)! (a + c)! (b + d)!}{a! b! c! d! n!} \]
Hipotesis:
H0: Tidak ada asosiasi antar variabel
H1: Ada asosiasi antar variabel
Kapan digunakan:
Sampel kecil
Frekuensi harapan (expected) < 5
Contoh Analisis di R
Hipotetsis
H0: Tidak ada asosiasi antara paparan dan kejadian penyakit. (Proporsi kejadian sama pada kedua kelompok)
H1: Ada asosiasi antara paparan dan kejadian penyakit. (Proporsi kejadian berbeda antara kelompok yang terpapar dan tidak terpapar)
# Data
a <- 40; b <- 60; c <- 10; d <- 90
n <- a + b + c + d
# Buat tabel
tabel <- matrix(c(a, b, c, d), nrow=2, byrow=TRUE,
dimnames = list("Paparan" = c("Ya", "Tidak"),
"Kejadian" = c("Ya", "Tidak")))
# Ukuran asosiasi
rd <- (a / (a + b)) - (c / (c + d))
rr <- (a / (a + b)) / (c / (c + d))
or <- (a * d) / (b * c)
# Uji chi-square & fisher
chisq <- chisq.test(tabel, correct = FALSE)
fisher <- fisher.test(tabel)
# Hasil
data.frame(
"Risk Difference" = round(rd, 3),
"Relative Risk" = round(rr, 3),
"Odds Ratio" = round(or, 3),
"Chi-square p-value" = chisq$p.value,
"Fisher's Exact p-value" = fisher$p.value
)
## Risk.Difference Relative.Risk Odds.Ratio Chi.square.p.value
## 1 0.3 4 6 9.63357e-07
## Fisher.s.Exact.p.value
## 1 1.243341e-06
Kesimpulan
Karena p-value < 0.05 baik pada Chi-square maupun Fisher’s Exact Test, maka: Tolak H0
Interpretasi
Risk Difference = 0.3 → Selisih risiko penyakit antara kelompok terpapar dan tidak terpapar adalah 30%. Artinya, paparan meningkatkan risiko penyakit sebesar 30% secara absolut.
Relative Risk = 4.0 → Orang yang terpapar zat kimia memiliki risiko 4 kali lebih tinggi mengalami penyakit dibanding yang tidak terpapar.
Odds Ratio = 6.0 → Odds (peluang relatif) terkena penyakit pada kelompok terpapar adalah 6 kali lebih besar dibanding kelompok yang tidak terpapar.
Chi-square test menghasilkan p-value (misalnya) p = 0.00001, yang berarti ada asosiasi signifikan antara paparan dan kejadian penyakit secara statistik.
Fisher’s Exact Test (p-value sangat kecil, < 0.05) → Hasil ini memvalidasi signifikansi temuan bahkan ketika frekuensi kejadian rendah, dan menghindari bias yang mungkin muncul pada Chi-square saat ukuran sampel kecil.
adalah proses penarikan kesimpulan statistik mengenai hubungan antara dua variabel kategori berdasarkan data dalam bentuk tabel kontingensi (tabel silang 2x2 atau lebih besar). Inferensi ini bertujuan untuk:
Menaksir parameter populasi seperti proporsi, perbedaan risiko, rasio risiko (relative risk), dan odds ratio.
Menguji apakah ada asosiasi atau ketergantungan antara dua variabel kategori dalam populasi.
Inferensi dalam tabel kontingensi dua arah dapat dibagi menjadi dua kategori utama:
Estimasi
Pengujian
Estimasi adalah proses untuk menaksir parameter populasi menggunakan data sampel. Dalam konteks tabel kontingensi, estimasi mencakup:
Proporsi:
\[ \hat{p} = \frac{x}{n} \] di mana
\(x\) adalah jumlah kasus sukses dan
\(n\) adalah total observasi.
Risk Difference (RD):
\[ \hat{RD} = \hat{p}_1 - \hat{p}_2 \]
Mengukur selisih risiko antara dua kelompok.
Relative Risk (RR):
\[ \hat{RR} = \frac{\hat{p}_1}{\hat{p}_2}
\] Mengukur perbandingan risiko kejadian antara dua
kelompok.
Odds Ratio (OR) (untuk tabel 2x2):
\[ \hat{OR} = \frac{a \cdot d}{b \cdot c}
\] Mengukur rasio odds antara dua kelompok. \(a, b, c, d\) berasal dari tabel 2x2
berikut:
| Kasus (+) | Kasus (−) | |
|---|---|---|
| Paparan (+) | \(a\) | \(b\) |
| Paparan (−) | \(c\) | \(d\) |
Memberikan batas bawah dan atas untuk parameter populasi dengan tingkat keyakinan tertentu.
Interval untuk Proporsi (CI untuk satu proporsi): \[ CI = \hat{p} \pm Z_{(1-\alpha/2)} \cdot \sqrt{ \frac{\hat{p}(1 - \hat{p})}{n} } \]
CI untuk Perbedaan Proporsi: \[ SE = \sqrt{ \frac{\hat{p}_1 (1 - \hat{p}_1)}{n_1} + \frac{\hat{p}_2 (1 - \hat{p}_2)}{n_2} } \] \[ CI = (\hat{p}_1 - \hat{p}_2) \pm Z_{(1-\alpha/2)} \cdot SE \]
CI untuk Odds Ratio (log OR): \[ SE(\log(OR)) = \sqrt{ \frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d} } \] \[ CI = \exp \left( \log(OR) \pm Z_{(1-\alpha/2)} \cdot SE \right) \]
Pengujian dalam tabel kontingensi dua arah bertujuan untuk menguji apakah terdapat asosiasi antara dua variabel kategori.
Pengujian dalam tabel kontingensi dua arah bertujuan untuk menguji apakah terdapat asosiasi antara dua variabel kategori.
Misalkan kita memiliki tabel kontingensi 2x2 berikut:
| Kejadian (+) | Tidak Kejadian (−) | Total | |
|---|---|---|---|
| Kelompok 1 | a | b | a + b |
| Kelompok 2 | c | d | c + d |
| Total | a + c | b + d | n |
Notasi:
\(a\): jumlah unit di kelompok 1 dengan kejadian
\(b\): jumlah unit di kelompok 1 tanpa kejadian
\(c\): jumlah unit di kelompok 2 dengan kejadian
\(d\): jumlah unit di kelompok 2 tanpa kejadian
\(n_1 = a + b\): total unit di kelompok 1
\(n_2 = c + d\): total unit di kelompok 2
\(n = n_1 + n_2 = a + b + c + d\): total keseluruhan
Estimasi Proporsi dalam Masing-Masing Kelompok
Kelompok 1 (Proporsi Kejadian): \[ \hat{p}_1 = \frac{a}{a + b} \]
Kelompok 2 (Proporsi Kejadian): \[ \hat{p}_2 = \frac{c}{c + d} \]
Estimasi Proporsi Gabungan (Pooled Proportion)
Proporsi gabungan dari seluruh unit yang mengalami kejadian: \[ \hat{p} = \frac{a + c}{a + b + c + d} = \frac{a + c}{n} \] Interpretasi Umum
Jika \(\hat{p}_1 > \hat{p}_2\), maka proporsi kejadian lebih tinggi di kelompok 1.
Jika \(\hat{p}_1 < \hat{p}_2\), maka proporsi kejadian lebih tinggi di kelompok 2.
Jika \(\hat{p}_1 = \hat{p}_2\), maka tidak ada perbedaan proporsi antara kedua kelompok.
Contoh Soal
Sebuah studi dilakukan untuk menilai efektivitas vaksin terhadap suatu penyakit. Penelitian dilakukan terhadap 200 orang, yang terdiri dari 100 orang divaksin dan 100 orang tidak divaksin. Hasilnya sebagai berikut:
| Sakit (+) | Tidak Sakit (−) | Total | |
|---|---|---|---|
| Vaksin (+) | 10 | 90 | 100 |
| Vaksin (−) | 30 | 70 | 100 |
| Total | 40 | 160 | 200 |
Estimasi Proporsi
Dalam Tiap Kelompok (Manual)
Kelompok Vaksin (+):
\[
\hat{p}_1 = \frac{10}{100} = 0.10
\]
Kelompok Vaksin (−):
\[
\hat{p}_2 = \frac{30}{100} = 0.30
\]
Proporsi Gabungan (Manual)
\[ \hat{p} = \frac{10 + 30}{100 + 100} = \frac{40}{200} = 0.20 \]
Uji Hipotesis Dua Proporsi (Z-Test)
Hipotesis: - \(H_0: p_1 = p_2\) (tidak ada perbedaan proporsi) - \(H_1: p_1 \neq p_2\) (ada perbedaan proporsi)
Rumus Uji-Z:
\[ Z = \frac{\hat{p}_1 - \hat{p}_2}{\sqrt{\hat{p}(1 - \hat{p}) \left(\frac{1}{n_1} + \frac{1}{n_2}\right)}} \]
Substitusi nilai:
\[ Z = \frac{0.10 - 0.30}{\sqrt{0.20(1 - 0.20)\left(\frac{1}{100} + \frac{1}{100}\right)}} = \frac{-0.20}{\sqrt{0.16 \cdot 0.02}} = \frac{-0.20}{\sqrt{0.0032}} \approx \frac{-0.20}{0.0566} \approx -3.53 \]
Keputusan:
Nilai kritis z untuk α = 0.05 dua arah adalah ±1.96
Karena \(|Z| = 3.53 > 1.96\), maka tolak \(H_0\)
Interpretasi: Terdapat perbedaan signifikan dalam proporsi kejadian sakit antara yang divaksin dan tidak divaksin.
Perhitungan di R
# Data
a <- 10 # sakit + vaksin
b <- 90 # tidak sakit + vaksin
c <- 30 # sakit + tidak vaksin
d <- 70 # tidak sakit + tidak vaksin
n1 <- a + b
n2 <- c + d
# Estimasi proporsi
p1 <- a / n1
p2 <- c / n2
p_pool <- (a + c) / (n1 + n2)
# Z-statistik
z <- (p1 - p2) / sqrt(p_pool * (1 - p_pool) * (1/n1 + 1/n2))
z
## [1] -3.535534
# P-value
p_value <- 2 * pnorm(-abs(z))
p_value
## [1] 0.000406952
Uji asosiasi dalam data kategorik bertujuan untuk mengetahui apakah terdapat hubungan atau asosiasi antara dua variabel kategorik. Dalam konteks tabel kontingensi 2x2, asosiasi antara dua kelompok (misalnya, terpapar vs tidak terpapar) dan suatu hasil (misalnya, sakit vs tidak sakit) sering diukur menggunakan:
Struktur Tabel Kontingensi 2x2
| Outcome: Yes (1) | Outcome: No (0) | Total | |
|---|---|---|---|
| Exposed (1) | a | b | a + b |
| Unexposed (0) | c | d | c + d |
| Total | a + c | b + d | N = a+b+c+d |
Hipotesis dalam Uji Asosiasi
Untuk semua ukuran asosiasi, hipotesis dapat dirumuskan sebagai berikut:
Pengertian: Selisih risiko (probabilitas) kejadian antara dua kelompok. Mengukur perbedaan absolut risiko antara dua kelompok.
\[ RD = \hat{p}_1 - \hat{p}_2 = \frac{a}{a + b} - \frac{c}{c + d} \]
Standar Error (SE) RD: \[ SE(RD) = \sqrt{ \frac{a}{(a + b)^2} + \frac{b}{(a + b)^2} + \frac{c}{(c + d)^2} + \frac{d}{(c + d)^2} } \]
Statistik Uji Z: \[ Z = \frac{RD}{SE(RD)} \]
Perbandingan risiko kejadian antara kelompok terpapar dan tidak terpapar. Mengukur seberapa besar risiko kejadian meningkat atau menurun akibat paparan.
Rumus: \[ RR = \frac{\hat{p}_1}{\hat{p}_2} = \frac{a / (a + b)}{c / (c + d)} \]
Standar Error (SE) log(RR): \[ SE(\log(RR)) = \sqrt{ \frac{1}{a} - \frac{1}{a + b} + \frac{1}{c} - \frac{1}{c + d} } \]
Statistik Uji Z: \[ Z = \frac{\log(RR)}{SE(\log(RR))} \]
Pengertian: Rasio odds kejadian antara dua kelompok. Lebih umum digunakan dalam studi kasus-kontrol.
Rumus: \[ OR = \frac{a/b}{c/d} = \frac{a \cdot d}{b \cdot c} \]
Standar Error (SE) log(OR): \[ SE(\log(OR)) = \sqrt{ \frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d} } \]
Statistik Uji Z: \[ Z = \frac{\log(OR)}{SE(\log(OR))} \]
Catatan Tambahan: - RR dan RD lebih sering digunakan pada studi prospektif (misalnya kohort). - OR umum digunakan pada studi retrospektif (kasus-kontrol).
Contoh Soal
Tabel Kontingensi 2x2 Sebuah studi dilakukan untuk menilai efektivitas vaksin terhadap suatu penyakit. Penelitian dilakukan terhadap 200 orang, yang terdiri dari 100 orang divaksin dan 100 orang tidak divaksin. Hasilnya sebagai berikut:
| Sakit (+) | Tidak Sakit (−) | Total | |
|---|---|---|---|
| Vaksin (+) | 10 | 90 | 100 |
| Vaksin (−) | 30 | 70 | 100 |
| Total | 40 | 160 | 200 |
Notasi:
a = 10 (Vaksin (+), Sakit)
b = 90 (Vaksin (+), Tidak Sakit)
c = 30 (Vaksin (−), Sakit)
d = 70 (Vaksin (−), Tidak Sakit)
Standar Error RD: \[ SE(RD) = \sqrt{ \frac{a}{(a + b)^2} + \frac{b}{(a + b)^2} + \frac{c}{(c + d)^2} + \frac{d}{(c + d)^2} } \] \[ SE(RD) = \sqrt{ \frac{10}{100^2} + \frac{90}{100^2} + \frac{30}{100^2} + \frac{70}{100^2} } = \sqrt{ \frac{200}{10000} } = \sqrt{0.02} \approx 0.1414 \]
Uji Z: \[ Z = \frac{-0.20}{0.1414} \approx -1.41 \]
SE(log(RR)): \[ SE(\log(RR)) = \sqrt{ \frac{1}{a} - \frac{1}{a + b} + \frac{1}{c} - \frac{1}{c + d} } \] \[ = \sqrt{ \frac{1}{10} - \frac{1}{100} + \frac{1}{30} - \frac{1}{100} } = \sqrt{ 0.1 - 0.01 + 0.0333 - 0.01 } = \sqrt{0.1133} \approx 0.3365 \]
Z-statistik: \[ Z = \frac{\log(0.33)}{0.3365} = \frac{-1.1087}{0.3365} \approx -3.29 \]
SE(log(OR)): \[ SE(\log(OR)) = \sqrt{ \frac{1}{a} + \frac{1}{b} + \frac{1}{c} + \frac{1}{d} } = \sqrt{ \frac{1}{10} + \frac{1}{90} + \frac{1}{30} + \frac{1}{70} } \approx \sqrt{0.1636} \approx 0.4045 \]
Z-statistik: \[ Z = \frac{\log(0.259)}{0.4045} = \frac{-1.350}{0.4045} \approx -3.34 \]
Perhitungan dengan R
# Data
a <- 10; b <- 90
c <- 30; d <- 70
# Risk Difference
RD <- (a / (a + b)) - (c / (c + d))
SE_RD <- sqrt(a / (a + b)^2 + b / (a + b)^2 + c / (c + d)^2 + d / (c + d)^2)
Z_RD <- RD / SE_RD
# Relative Risk
RR <- (a / (a + b)) / (c / (c + d))
SE_logRR <- sqrt(1/a - 1/(a + b) + 1/c - 1/(c + d))
Z_RR <- log(RR) / SE_logRR
# Odds Ratio
OR <- (a * d) / (b * c)
SE_logOR <- sqrt(1/a + 1/b + 1/c + 1/d)
Z_OR <- log(OR) / SE_logOR
list(RD = RD, SE_RD = SE_RD, Z_RD = Z_RD,
RR = RR, SE_logRR = SE_logRR, Z_RR = Z_RR,
OR = OR, SE_logOR = SE_logOR, Z_OR = Z_OR)
## $RD
## [1] -0.2
##
## $SE_RD
## [1] 0.1414214
##
## $Z_RD
## [1] -1.414214
##
## $RR
## [1] 0.3333333
##
## $SE_logRR
## [1] 0.3366502
##
## $Z_RR
## [1] -3.263365
##
## $OR
## [1] 0.2592593
##
## $SE_logOR
## [1] 0.3984095
##
## $Z_OR
## [1] -3.388289
Kesimpulan:
Vaksinasi secara statistik signifikan menurunkan risiko dan odds terkena sakit (berdasarkan RR dan OR), namun tidak signifikan jika dilihat dari Risk Difference.
Pengertian:
Uji independensi digunakan untuk menguji apakah dua variabel kategori saling bebas (independen) atau memiliki hubungan (dependen) dalam suatu populasi. Uji ini umumnya dilakukan pada tabel kontingensi, khususnya 2x2 atau RxC.
Tujuan:
Menilai apakah proporsi suatu kategori dalam baris bergantung pada kategori di kolom atau tidak.
Hipotesis
Untuk semua uji berikut:
Rumus: \[ \chi^2 = \sum \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \] - \(O_{ij}\): Frekuensi yang diamati pada sel ke-(i,j) - \(E_{ij}\): Frekuensi yang diharapkan pada sel ke-(i,j), dihitung dengan: \[ E_{ij} = \frac{( \text{jumlah baris}_i \times \text{jumlah kolom}_j )}{n} \]
Distribusi: Statistik uji mengikuti distribusi Chi-Square dengan derajat bebas: \[ df = (r - 1)(c - 1) \]
Contoh Soal
Sebuah kafe ingin mengetahui apakah terdapat perbedaan preferensi minuman antara pelanggan laki-laki dan perempuan. Sebuah survei dilakukan terhadap 100 pelanggan dan hasilnya dirangkum dalam tabel berikut:
| Kopi | Teh | Total | |
|---|---|---|---|
| Laki-laki | 30 | 10 | 40 |
| Perempuan | 20 | 40 | 60 |
| Total | 50 | 50 | 100 |
Hipotesis
H0: Tidak terdapat hubungan antara jenis kelamin dan preferensi minuman (variabel independen).
H1): Terdapat hubungan antara jenis kelamin dan preferensi minuman (variabel dependen).
Perhitungan Manual
# Observed values
observed <- matrix(c(30, 10, 20, 40), nrow=2, byrow=TRUE,
dimnames = list(Jenis_Kelamin = c("Laki-laki", "Perempuan"),
Minuman = c("Kopi", "Teh")))
observed
## Minuman
## Jenis_Kelamin Kopi Teh
## Laki-laki 30 10
## Perempuan 20 40
# Expected values
row_totals <- margin.table(observed, 1)
col_totals <- margin.table(observed, 2)
grand_total <- sum(observed)
expected <- outer(row_totals, col_totals) / grand_total
expected
## Minuman
## Jenis_Kelamin Kopi Teh
## Laki-laki 20 20
## Perempuan 30 30
# Chi-square statistic
chi_sq_manual <- sum((observed - expected)^2 / expected)
chi_sq_manual
## [1] 16.66667
Perhitungan di R
chisq.test(observed, correct = FALSE)
##
## Pearson's Chi-squared test
##
## data: observed
## X-squared = 16.667, df = 1, p-value = 4.456e-05
Keputusan
Karena p-value = 4.456e-05 < 0.05, maka: Tolak H0
Interpretasi
Terdapat hubungan signifikan antara jenis kelamin dan preferensi minuman. Artinya:
Contoh: Laki-laki cenderung memilih kopi (30 dari 40), sementara perempuan cenderung memilih teh (40 dari 60).
Pengertian: Partisi chi-square digunakan untuk menguraikan nilai χ² menjadi bagian-bagian berdasarkan hipotesis parsial tertentu, dan memungkinkan pengujian komponen atau interaksi tertentu dalam tabel.
Hipotesis:
H0: Tidak ada perbedaan atau interaksi antar kelompok tertentu (tergantung bentuk partisi).
H1: Ada perbedaan/interaksi antar kelompok yang diuji.
Rumus Umum:
Sama dengan uji chi-square, tetapi dihitung pada bagian (sub-tabel) tertentu dari tabel.
Contoh Soal
Sebuah sekolah ingin mengetahui apakah metode pembelajaran yang berbeda (Metode A dan Metode B) berpengaruh terhadap tingkat kelulusan siswa.
| Lulus | Tidak Lulus | Total | |
|---|---|---|---|
| Metode A | 40 | 10 | 50 |
| Metode B | 20 | 30 | 50 |
| Total | 60 | 40 | 100 |
Hipotesis
H0: Tidak terdapat perbedaan tingkat kelulusan antara metode A dan B (metode dan kelulusan tidak berhubungan).
H1: Terdapat perbedaan tingkat kelulusan antara metode A dan B (metode dan kelulusan berhubungan).
Perhitungan Manual
observed2 <- matrix(c(40, 10, 20, 30), nrow=2, byrow=TRUE,
dimnames = list(Metode = c("A", "B"),
Kelulusan = c("Lulus", "Tidak Lulus")))
expected2 <- outer(margin.table(observed2, 1), margin.table(observed2, 2)) / sum(observed2)
chi_sq_manual2 <- sum((observed2 - expected2)^2 / expected2)
chi_sq_manual2
## [1] 16.66667
Perhitungan di R
chisq.test(observed2, correct = FALSE)
##
## Pearson's Chi-squared test
##
## data: observed2
## X-squared = 16.667, df = 1, p-value = 4.456e-05
Pengertian:
Alternatif dari uji χ², menggunakan pendekatan likelihood. Cocok saat asumsi normalitas kurang terpenuhi.
Rumus: \[ G^2 = 2 \sum O_{ij} \cdot \ln\left(\frac{O_{ij}}{E_{ij}}\right) \]
Hipotesis :
H0: Tidak ada hubungan antara dua variabel → variabel-variabel tersebut independen. (Contoh: Metode pembelajaran tidak berpengaruh terhadap kelulusan)
H1: Ada hubungan antara dua variabel → variabel-variabel tersebut tidak independen. (Contoh: Metode pembelajaran berpengaruh terhadap kelulusan)
Distribusi:
Distribusi G² juga mengikuti Chi-Square dengan \(df = (r - 1)(c - 1)\)
Contoh Soal
Apakah jenis pekerjaan (Pegawai, Wirausaha) berpengaruh terhadap keputusan membeli asuransi (Ya, Tidak)?
| Ya | Tidak | Total | |
|---|---|---|---|
| Pegawai | 35 | 15 | 50 |
| Wirausaha | 25 | 25 | 50 |
| Total | 60 | 40 | 100 |
Hipotesis :
H0: Metode pembelajaran dan tingkat kelulusan tidak berhubungan (independen).
H1: Metode pembelajaran dan tingkat kelulusan berhubungan (tidak independen).
Perhitungan Manual \[ G^2 = 2 \sum O_{ij} \log\left(\frac{O_{ij}}{E_{ij}}\right) \]
observed3 <- matrix(c(35, 15, 25, 25), nrow=2, byrow=TRUE,
dimnames = list(Pekerjaan = c("Pegawai", "Wirausaha"),
Asuransi = c("Ya", "Tidak")))
expected3 <- outer(margin.table(observed3, 1), margin.table(observed3, 2)) / sum(observed3)
g_stat <- 2 * sum(observed3 * log(observed3 / expected3))
g_stat
## [1] 4.201185
Perhitungan di R
# Gunakan package 'DescTools'
if(!require(DescTools)) install.packages("DescTools")
## Loading required package: DescTools
## Warning: package 'DescTools' was built under R version 4.3.3
## Registered S3 method overwritten by 'DescTools':
## method from
## reorder.factor gdata
library(DescTools)
GTest(observed3)
##
## Log likelihood ratio (G-test) test of independence without correction
##
## data: observed3
## G = 4.2012, X-squared df = 1, p-value = 0.0404
Keputusan
Dengan p-value = 0.0404 dan asumsi taraf signifikansi α = 0.05:
Karena p-value < α, maka tolak H0.
Interpretasi:
Terdapat hubungan yang signifikan antara metode pembelajaran dan tingkat kelulusan. Artinya, kemungkinan kelulusan mahasiswa berbeda tergantung pada metode pembelajaran yang digunakan (A atau B).
Pengertian:
Uji ini digunakan pada tabel 2x2 terutama ketika
frekuensi yang diamati terlalu kecil (< 5), sehingga
pendekatan χ² tidak valid.
Uji Fisher menghitung probabilitas dari semua kemungkinan tabel
2x2 dengan marginal tetap yang lebih ekstrem
dari tabel aktual.
Hipotesis:
H0: Tidak ada asosiasi antara dua variabel (independen)
H1: Ada asosiasi antara dua variabel
Rumus Probabilitas (Distribusi Hipergeometrik): \[ P = \frac{ \binom{a + b}{a} \binom{c + d}{c} }{ \binom{n}{a + c} } \]
Di mana:
Contoh Soal
Apakah terapi baru lebih efektif dibandingkan terapi lama dalam menyembuhkan pasien? Sebuah penelitian dilakukan terhadap 20 pasien yang dibagi menjadi dua kelompok secara acak:
-10 pasien mendapatkan terapi baru
-10 pasien mendapatkan terapi lama
Hasil pengamatan ditampilkan sebagai berikut:
| Sembuh | Tidak Sembuh | Total | |
|---|---|---|---|
| Terapi Baru | 8 | 2 | 10 |
| Terapi Lama | 1 | 9 | 10 |
| Total | 9 | 11 | 20 |
Perhitungan Manual
Probabilitas persis (hipergeometrik): \[ P = \frac{\binom{a+b}{a} \binom{c+d}{c}}{\binom{n}{a+c}} \]
a <- 8; b <- 2; c <- 1; d <- 9
fisher_prob <- choose(10, 8) * choose(10, 1) / choose(20, 9)
fisher_prob
## [1] 0.002679209
Perhitungan di R
observed4 <- matrix(c(8, 2, 1, 9), nrow=2, byrow=TRUE,
dimnames = list(Terapi = c("Baru", "Lama"),
Hasil = c("Sembuh", "Tidak Sembuh")))
fisher.test(observed4)
##
## Fisher's Exact Test for Count Data
##
## data: observed4
## p-value = 0.005477
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
## 2.057999 1740.081669
## sample estimates:
## odds ratio
## 27.32632
Tabel Kesimpulan
| Nama Uji | Tujuan | Output Utama |
|---|---|---|
| Chi-Square Test | Menguji independensi antara dua variabel kategorik | Nilai Chi-square, p-value |
| Partisi Chi-Square | Menganalisis komponen penyebab utama dari ketidaksesuaian data | Nilai Chi-square terpartisi |
| Likelihood Ratio (G-Test) | Menguji hubungan antara dua variabel menggunakan pendekatan likelihood | Nilai G-statistik, p-value |
| Fisher Exact Test | Menguji independensi untuk tabel kecil menggunakan distribusi eksak | p-value dari distribusi eksak |
Dalam tabel kontingensi, residual adalah selisih antara nilai observasi (yang sebenarnya terjadi) dan nilai harapan (yang diharapkan jika tidak ada hubungan antara variabel). Residual membantu mengidentifikasi apakah ada penyimpangan antara hasil aktual dan asumsi independensi antar variabel.
Secara umum, residual dihitung sebagai:
\[ \text{Residual} = \text{Nilai Observasi} - \text{Nilai Harapan} \]
Ada juga versi standardized residual (residual terstandarisasi) yang digunakan untuk analisis statistik lebih lanjut.
Interpretasi Nilai Residual
Berikut adalah interpretasi nilai residual dalam tabel kontingensi:
Jika Residual = 0
Jika Residual Kecil (~0)
Jika Residual Positif Besar
Jika Residual Negatif Besar
Jika Residual Besar (Baik Positif maupun Negatif)
Biasanya, residual standar yang lebih besar dari |2| dianggap signifikan secara statistik dan menunjukkan bahwa ada kontribusi kuat dari sel tersebut terhadap hasil uji chi-square.
Pearson Residual adalah salah satu jenis residual yang digunakan dalam analisis tabel kontingensi, untuk mengevaluasi apakah terdapat perbedaan yang signifikan antara frekuensi observasi dan ekspektasi berdasarkan asumsi independensi.
Residual ini membantu mengidentifikasi sel mana yang memberikan kontribusi besar terhadap nilai statistik chi-square.
Rumus Pearson Residual
\[ R_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}} \]
Keterangan: - \(R_{ij}\) = Pearson residual untuk sel ke-(i,j) - \(O_{ij}\) = Nilai observasi (frekuensi aktual) - \(E_{ij}\) = Nilai harapan (ekspektasi jika tidak ada hubungan antara variabel)
Contoh
Apakah preferensi terhadap jenis produk (A atau B) berbeda menurut kelompok usia (< 30 tahun dan ≥ 30 tahun)?
Sebuah survei dilakukan terhadap 100 orang yang terbagi ke dalam dua kelompok usia:
50 responden berusia < 30 tahun
50 responden berusia ≥ 30 tahun
Mereka diminta memilih antara Produk A dan Produk B. Hasil pengamatan sebagai berikut:
| Produk A | Produk B | Total | |
|---|---|---|---|
| Usia < 30 | 20 | 30 | 50 |
| Usia ≥ 30 | 30 | 20 | 50 |
| Total | 50 | 50 | 100 |
Hipotesis
H0: Tidak ada hubungan antara kelompok usia dan preferensi produk (independen).
H1): Terdapat hubungan antara kelompok usia dan preferensi produk (tidak independen).
Langkah Perhitungan Manual
Hitung Nilai Ekspektasi (E) Gunakan rumus:
\[ E_{ij} = \frac{\text{Total baris i} \times \text{Total kolom j}}{\text{Grand total}} \]
Hitung Pearson Residual
\[ R_{ij} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}} \]
Perhitungan di R
# Buat tabel kontingensi
data <- matrix(c(20, 30, 30, 20), nrow = 2, byrow = TRUE)
colnames(data) <- c("Produk A", "Produk B")
rownames(data) <- c("Usia < 30", "Usia >= 30")
tabel <- as.table(data)
# Uji chi-square
hasil <- chisq.test(tabel)
# Tampilkan hasil
hasil
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: tabel
## X-squared = 3.24, df = 1, p-value = 0.07186
# Nilai ekspektasi
hasil$expected
## Produk A Produk B
## Usia < 30 25 25
## Usia >= 30 25 25
# Pearson residual
hasil$residuals # Sama dengan (observed - expected) / sqrt(expected)
## Produk A Produk B
## Usia < 30 -1 1
## Usia >= 30 1 -1
digunakan taraf signifikansi α=0.05
Karena p-value = 0.07186 > 0.05, maka gagal tolak H0
Interpretasi: Tidak terdapat cukup bukti statistik untuk menyimpulkan bahwa preferensi produk (A atau B) secara signifikan berbeda menurut kelompok usia pada taraf signifikansi 5%. Artinya, preferensi produk dan usia tidak berbeda secara signifikan, meskipun terlihat ada kecenderungan.
Kesimpulan
Pearson residual menunjukkan seberapa besar deviasi antara nilai observasi dan nilai harapan dalam satuan standar deviasi.
Nilai residual besar (positif/negatif) mengindikasikan hubungan yang kuat antara kategori tersebut.
Residual antara -2 dan 2 umumnya dianggap tidak signifikan, kecuali jika menggunakan signifikansi ketat.
Pengertian Outlier dalam Tabel Kontingensi
Dalam konteks tabel kontingensi, outlier adalah sel yang nilai observasinya (frekuensi aktual) sangat berbeda dari nilai yang diharapkan (ekspektasi) jika kedua variabel kategori independen.
Outlier dalam tabel kontingensi dapat menunjukkan hubungan yang tidak biasa atau anomali, yang bisa menjadi indikasi: - asosiasi kuat (positif/negatif), - kesalahan pengumpulan data, - atau kelompok yang sangat berbeda perilakunya.
Deteksi outlier dilakukan dengan residual, yaitu selisih antara nilai observasi dan ekspektasi.
Pearson residual mengukur deviasi antara nilai observasi dan nilai harapan dalam satuan standar deviasi dari harapan.
Rumus:
\[ R_{ij}^{(P)} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}} \]
Interpretasi:
Standardized residual memperbaiki Pearson residual dengan mempertimbangkan variabilitas lebih lengkap, termasuk proporsi total baris dan kolom.
Rumus:
\[ R_{ij}^{(S)} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}(1 - p_{i\cdot})(1 - p_{\cdot j})}} \]
Jika residual ini > |2|, maka sel tersebut berkontribusi signifikan terhadap deviasi dan bisa disebut outlier.
Kesimpulan Outlier dalam tabel kontingensi menunjukkan kategori yang tidak sesuai dengan pola umum.
Gunakan Pearson atau Standardized residual untuk mengidentifikasinya.
Residual yang besar (misal > |2|) → indikasi pentingnya hubungan atau penyimpangan signifikan dari asumsi independensi.
Deteksi Outlier dalam Tabel Kontingensi
Contoh Soal
Sebuah survei dilakukan untuk mengetahui preferensi minuman (Kopi atau Teh) berdasarkan jenis kelamin (Laki-laki atau Perempuan). Hasilnya sebagai berikut:
| Jenis Kelamin | Kopi | Teh | Total |
|---|---|---|---|
| Laki-laki | 30 | 10 | 40 |
| Perempuan | 20 | 40 | 60 |
| Total | 50 | 50 | 100 |
Langkah 1: Hitung Nilai Harapan (Expected Value)
Gunakan rumus:
\[ E_{ij} = \frac{\text{Total Baris}_i \times \text{Total Kolom}_j}{\text{Grand Total}} \]
Hitungan Manual:
Langkah 2: Hitung Pearson Residual
Gunakan rumus:
\[ R_{ij}^{(P)} = \frac{O_{ij} - E_{ij}}{\sqrt{E_{ij}}} \]
Hitungan Manual:
Langkah 3: Deteksi Outlier
Langkah 4: Perhitungan dengan R
# Buat tabel kontingensi
observed <- matrix(c(30, 10, 20, 40), nrow = 2, byrow = TRUE,
dimnames = list(Jenis_Kelamin = c("Laki-laki", "Perempuan"),
Minuman = c("Kopi", "Teh")))
# Uji chi-square
hasil <- chisq.test(observed)
# Nilai harapan
hasil$expected
## Minuman
## Jenis_Kelamin Kopi Teh
## Laki-laki 20 20
## Perempuan 30 30
# Pearson residual
hasil$residuals
## Minuman
## Jenis_Kelamin Kopi Teh
## Laki-laki 2.236068 -2.236068
## Perempuan -1.825742 1.825742
Langkah 5: Hitung Standardized Residual (Opsional)
# Hitung total
total <- sum(observed)
row_prop <- rowSums(observed) / total
col_prop <- colSums(observed) / total
# Hitung standardized residual secara manual
expected <- hasil$expected
standardized_resid <- matrix(0, nrow = 2, ncol = 2)
for (i in 1:2) {
for (j in 1:2) {
standardized_resid[i, j] <-
(observed[i, j] - expected[i, j]) /
sqrt(expected[i, j] * (1 - row_prop[i]) * (1 - col_prop[j]))
}
}
rownames(standardized_resid) <- rownames(observed)
colnames(standardized_resid) <- colnames(observed)
standardized_resid
## Kopi Teh
## Laki-laki 4.082483 -4.082483
## Perempuan -4.082483 4.082483
Kesimpulan Tabel kontingensi dapat mengungkap sel yang tidak sesuai dengan pola keseluruhan.
Pearson dan Standardized residual dapat digunakan untuk mendeteksi outlier.
Analisis residual sangat berguna dalam eksplorasi hubungan antar kategori sebelum membuat keputusan atau menyusun model lanjutan.
Tabel kontingensi tiga arah adalah bentuk perluasan dari tabel kontingensi dua arah yang melibatkan tiga variabel kategorik. Tabel ini menyajikan hubungan antara tiga dimensi sekaligus dan digunakan untuk menganalisis interaksi di antara ketiganya.
Tujuan penggunaan tabel ini adalah untuk: - Menilai apakah ada interaksi tiga arah antar variabel. - Mengidentifikasi apakah asosiasi antara dua variabel tergantung pada level variabel ketiga.
Tabel marginal adalah tabel yang diperoleh dengan menjumlahkan frekuensi terhadap salah satu variabel. Ini memberikan ringkasan hubungan dua variabel dengan mengabaikan variabel ketiga.
Contoh:
Tabel marginal untuk A dan B: \[ n_{ij\cdot} = \sum_{k} n_{ijk} \]
Contoh: jumlah seluruh nilai untuk A dan B, tanpa mempertimbangkan nilai C.
Tabel parsial adalah tabel kontingensi dua arah untuk A dan B pada satu tingkat tetap dari variabel C.
Contoh:
Tabel parsial A dan B pada C = C₁: \[ n_{ij1},\ \text{untuk semua } i, j \]
Tabel ini digunakan untuk menganalisis hubungan antara A dan B pada strata tertentu dari C (misalnya hanya untuk kelompok “Usia Muda”).
Kegunaan
Tabel tiga arah dituliskan sebagai berikut:
Let \(n_{ijk}\) menyatakan frekuensi pengamatan untuk: - Kategori ke-\(i\) dari variabel A (misal: Minuman) - Kategori ke-\(j\) dari variabel B (misal: Jenis Kelamin) - Kategori ke-\(k\) dari variabel C (misal: Usia)
Dengan demikian:
| B₁ (j=1) | B₂ (j=2) | |
|---|---|---|
| A₁, C₁ | \(n_{111}\) | \(n_{121}\) |
| A₂, C₁ | \(n_{211}\) | \(n_{221}\) |
| A₁, C₂ | \(n_{112}\) | \(n_{122}\) |
| A₂, C₂ | \(n_{212}\) | \(n_{222}\) |
Artinya: - Baris menunjukkan kombinasi nilai dari variabel A dan C (Minuman dan Usia) - Kolom menunjukkan nilai dari variabel B (Jenis Kelamin)
Tabel kontingensi tiga arah menyajikan distribusi frekuensi dari tiga variabel kategorikal. Pada contoh ini, kita akan menggunakan tiga variabel kategorikal:
Sebuah perusahaan ingin mengetahui apakah preferensi produk (A atau B) dipengaruhi oleh kombinasi antara jenis kelamin dan usia pelanggan. Untuk itu, dilakukan survei kepada responden yang diklasifikasikan berdasarkan 3 variabel:
Usia: Muda / Tua
Jenis Kelamin: Laki-laki / Perempuan
Preferensi Produk: Produk A / Produk B
Berikut adalah contoh tabel data yang digunakan:
| Usia | Jenis Kelamin | Preferensi A | Preferensi B |
|---|---|---|---|
| Muda | Laki-laki | 50 | 30 |
| Muda | Perempuan | 70 | 50 |
| Tua | Laki-laki | 40 | 60 |
| Tua | Perempuan | 60 | 40 |
Struktur Data dalam R
# Data contoh
data <- array(
c(50, 30, 70, 50, 40, 60, 60, 40),
dim = c(2, 2, 2),
dimnames = list(
Usia = c("Muda", "Tua"),
JenisKelamin = c("Laki-laki", "Perempuan"),
Preferensi = c("A", "B")
)
)
# Menampilkan array 3 dimensi
data
## , , Preferensi = A
##
## JenisKelamin
## Usia Laki-laki Perempuan
## Muda 50 70
## Tua 30 50
##
## , , Preferensi = B
##
## JenisKelamin
## Usia Laki-laki Perempuan
## Muda 40 60
## Tua 60 40
Tabel Parsial Tabel parsial didapat dengan memperbaiki satu variabel dan melihat hubungan antara dua variabel lainnya. Misalnya, kita dapat membuat tabel parsial untuk melihat hubungan Preferensi A dan B pada Usia Muda.
Dalam contoh ini, kita akan memperbaiki variabel usia dan melihat hubungan antara jenis kelamin dan preferensi.
Tabel Parsial untuk Usia Muda
Frekuensi:
| Jenis Kelamin | Preferensi A | Preferensi B |
|---|---|---|
| Laki-laki | 50 | 30 |
| Perempuan | 70 | 50 |
Interpretasi: - Pada usia muda, lebih banyak perempuan yang memilih Produk A dibanding laki-laki. - Produk B juga relatif lebih dipilih oleh perempuan muda dibanding laki-laki muda.
Tabel Parsial untuk Usia Tua
Frekuensi:
| Jenis Kelamin | Preferensi A | Preferensi B |
|---|---|---|
| Laki-laki | 40 | 60 |
| Perempuan | 60 | 40 |
Interpretasi: - Pada usia tua, laki-laki lebih dominan memilih Produk B. - Perempuan tua justru lebih memilih Produk A.
Tabel Parsial dalam R
# Buat kembali data dalam bentuk 3D array
parsial_data <- array(
c(50, 30, 70, 50, 40, 60, 60, 40),
dim = c(2, 2, 2),
dimnames = list(
JenisKelamin = c("Laki-laki", "Perempuan"),
Preferensi = c("Prefer A", "Prefer B"),
Usia = c("Muda", "Tua")
)
)
# Tabel parsial untuk Usia Muda
parsial_muda <- parsial_data[, , "Muda"]
parsial_muda
## Preferensi
## JenisKelamin Prefer A Prefer B
## Laki-laki 50 70
## Perempuan 30 50
# Tabel parsial untuk Usia Tua
parsial_tua <- parsial_data[, , "Tua"]
parsial_tua
## Preferensi
## JenisKelamin Prefer A Prefer B
## Laki-laki 40 60
## Perempuan 60 40
Tabel Marginal Tabel marginal didapatkan dengan menjumlahkan frekuensi berdasarkan satu variabel sambil mengabaikan dua variabel lainnya. Misalnya, kita akan menghitung jumlah total Preferensi A dan B, serta Jenis Kelamin.
Frekuensi marginal untuk jenis kelamin:
Frekuensi marginal untuk preferensi:
# Membuat data matrix
data <- matrix(c(50, 30, 70, 50, 40, 60, 60, 40), nrow = 4, byrow = TRUE)
# Menambahkan nama kolom dan baris
colnames(data) <- c("Prefer A", "Prefer B")
rownames(data) <- c("Muda Laki-laki", "Muda Perempuan", "Tua Laki-laki", "Tua Perempuan")
# Hitung frekuensi marginal berdasarkan jenis kelamin dan preferensi
marginal_jenis_kelamin <- rowSums(data)
marginal_preferensi <- colSums(data)
# Menampilkan hasil
marginal_jenis_kelamin
## Muda Laki-laki Muda Perempuan Tua Laki-laki Tua Perempuan
## 80 120 100 100
marginal_preferensi
## Prefer A Prefer B
## 220 180
Kesimpulan Tabel marginal memberikan informasi keseluruhan untuk masing-masing variabel kategori dengan mengabaikan variabel lainnya.
Tabel parsial menunjukkan distribusi dua variabel dalam satu strata variabel lainnya, memberikan pandangan lebih mendalam tentang interaksi antara variabel.
Perhitungan tabel marginal dan parsial di R membantu dalam analisis data kategorik dengan cara yang lebih efisien dan terstruktur.
Peluang bersama menyatakan probabilitas dua kejadian terjadi bersamaan.
Rumus: \[ P(A \cap B) = \frac{n_{A \cap B}}{n_{total}} \]
Perhitungan Manual
Contoh:
- \(P(\text{Muda, Laki-laki, Preferensi A}) =
\frac{50}{400} = 0.125\)
- \(P(\text{Tua, Perempuan, Preferensi B}) =
\frac{40}{400} = 0.10\)
Perhitungan di R
# Data vector
data_vector <- c(50, 30, 70, 50, 40, 60, 60, 40)
# Total
total <- sum(data_vector)
# Peluang bersama
joint_prob <- data_vector / total
# Nama kombinasi
names(joint_prob) <- c(
"Muda_Laki_A", "Muda_Laki_B",
"Muda_Perem_A", "Muda_Perem_B",
"Tua_Laki_A", "Tua_Laki_B",
"Tua_Perem_A", "Tua_Perem_B"
)
joint_prob
## Muda_Laki_A Muda_Laki_B Muda_Perem_A Muda_Perem_B Tua_Laki_A Tua_Laki_B
## 0.125 0.075 0.175 0.125 0.100 0.150
## Tua_Perem_A Tua_Perem_B
## 0.150 0.100
Pengertian Peluang marginal adalah probabilitas satu kejadian tanpa mempertimbangkan kejadian lainnya.
Rumus: P(A) = ∑ P(A ∩ B)
Perhitungan Manual 1. \(P(\text{Preferensi A}) = \frac{50 + 70 + 40 + 60}{400} = \frac{220}{400} = 0.55\)
Perhitungan di R
# Bentuk array 3D
data_array <- array(
data_vector,
dim = c(2, 2, 2),
dimnames = list(
Preferensi = c("A", "B"),
JenisKelamin = c("Laki-laki", "Perempuan"),
Usia = c("Muda", "Tua")
)
)
# Peluang marginal
p_marginal_preferensi <- margin.table(data_array, 1) / total
p_marginal_jeniskelamin <- margin.table(data_array, 2) / total
p_marginal_usia <- margin.table(data_array, 3) / total
p_marginal_preferensi
## Preferensi
## A B
## 0.55 0.45
p_marginal_jeniskelamin
## JenisKelamin
## Laki-laki Perempuan
## 0.45 0.55
p_marginal_usia
## Usia
## Muda Tua
## 0.5 0.5
Pengertian Peluang bersyarat adalah probabilitas suatu kejadian dengan syarat kejadian lain telah terjadi.
Rumus: P(A|B) = P(A ∩ B) / P(B)
# Contoh: Preferensi diberikan Jenis Kelamin
conditional_preferensi_given_gender <- prop.table(margin.table(data, c(1, 2)), margin = 2)
Perhitungan Manual 1. \(P(\text{Preferensi A} \mid \text{Laki-laki}) = \frac{50 + 40}{180} = \frac{90}{180} = 0.5\)
Perhitungan di R
# Preferensi A diberikan Jenis Kelamin
prefer_by_gender <- margin.table(data_array, c(1,2)) # preferensi vs jenis kelamin
p_conditional <- prop.table(prefer_by_gender, margin = 2) # bagi tiap kolom
p_conditional
## JenisKelamin
## Preferensi Laki-laki Perempuan
## A 0.5 0.5909091
## B 0.5 0.4090909
Kesimpulan Peluang bersama memperlihatkan proporsi dari kombinasi kategori.
Peluang marginal digunakan untuk mendapatkan distribusi satu variabel saja.
Peluang bersyarat menjelaskan bagaimana satu variabel terdistribusi pada kondisi tetap dari variabel lain.
Ukuran asosiasi digunakan untuk mengukur kekuatan hubungan antara dua variabel kategorik. Pada tabel kontingensi 3 arah, kita mengukur hubungan dua variabel sambil mengendalikan variabel ketiga.
Ukuran yang Dibahas: - Beda Peluang (Risk Difference / Absolute Risk Reduction) - Risiko Relatif (Risk Ratio / Relative Risk) - Odds Ratio (Perbandingan Odds)
Rumus
\[ RD = P(E|A) - P(E|B) \]
\[ RR = \frac{P(E|A)}{P(E|B)} \]
\[ OR = \frac{\frac{P(E|A)}{1-P(E|A)}}{\frac{P(E|B)}{1-P(E|B)}} \]
Contoh Soal
Peneliti ingin mengetahui apakah kebiasaan merokok berpengaruh terhadap risiko terkena penyakit paru-paru, dan apakah hubungan tersebut berbeda antara laki-laki dan perempuan. Diketahui bahwa jenis kelamin bisa menjadi confounder dalam hubungan antara merokok dan penyakit paru-paru.
| Jenis Kelamin | Merokok | Penyakit | Jumlah |
|---|---|---|---|
| L | Ya | Ya | 40 |
| L | Ya | Tidak | 60 |
| L | Tidak | Ya | 10 |
| L | Tidak | Tidak | 90 |
| P | Ya | Ya | 30 |
| P | Ya | Tidak | 70 |
| P | Tidak | Ya | 20 |
| P | Tidak | Tidak | 80 |
Perhitungan Manual (Untuk Jenis Kelamin = Laki-laki)
\[ RD = 0.40 - 0.10 = 0.30 \]
\[ RR = \frac{0.40}{0.10} = 4.0 \]
\[ OR = \frac{0.667}{0.111} \approx 6.0 \]
Perhitungan di R
# Data array 2x2x2: [Penyakit, Merokok, Jenis Kelamin]
data <- array(c(
# Laki-laki
40, 60, # Merokok: Ya (Penyakit = Ya, Tidak)
10, 90, # Merokok: Tidak
# Perempuan
30, 70, # Merokok: Ya
20, 80 # Merokok: Tidak
), dim = c(2, 2, 2),
dimnames = list(
Penyakit = c("Ya", "Tidak"),
Merokok = c("Ya", "Tidak"),
JenisKelamin = c("L", "P")
))
data
## , , JenisKelamin = L
##
## Merokok
## Penyakit Ya Tidak
## Ya 40 10
## Tidak 60 90
##
## , , JenisKelamin = P
##
## Merokok
## Penyakit Ya Tidak
## Ya 30 20
## Tidak 70 80
library(epitools)
# Hitung per jenis kelamin
for (jk in dimnames(data)$JenisKelamin) {
cat("\n=== Jenis Kelamin:", jk, "===\n")
# Ambil tabel 2x2 untuk strata tsb (Penyakit × Merokok)
tab <- data[ , , jk]
print(tab)
# Hitung ukuran asosiasi
hasil <- riskratio(tab)
print(hasil)
}
##
## === Jenis Kelamin: L ===
## Merokok
## Penyakit Ya Tidak
## Ya 40 10
## Tidak 60 90
## $data
## Merokok
## Penyakit Ya Tidak Total
## Ya 40 10 50
## Tidak 60 90 150
## Total 100 100 200
##
## $measure
## risk ratio with 95% C.I.
## Penyakit estimate lower upper
## Ya 1 NA NA
## Tidak 3 1.697336 5.302427
##
## $p.value
## two-sided
## Penyakit midp.exact fisher.exact chi.square
## Ya NA NA NA
## Tidak 7.190546e-07 1.243341e-06 9.63357e-07
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
##
## === Jenis Kelamin: P ===
## Merokok
## Penyakit Ya Tidak
## Ya 30 20
## Tidak 70 80
## $data
## Merokok
## Penyakit Ya Tidak Total
## Ya 30 20 50
## Tidak 70 80 150
## Total 100 100 200
##
## $measure
## risk ratio with 95% C.I.
## Penyakit estimate lower upper
## Ya 1.000000 NA NA
## Tidak 1.333333 0.9200446 1.932273
##
## $p.value
## two-sided
## Penyakit midp.exact fisher.exact chi.square
## Ya NA NA NA
## Tidak 0.1065195 0.1412067 0.1024704
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Kesimpulan
Conditional independence (ketidakbergantungan bersyarat) adalah kondisi di mana dua variabel dikatakan tidak saling bergantung secara langsung, setelah dikendalikan atau dikondisikan oleh variabel ketiga. Dalam konteks tabel kontingensi 2x2xK, kita ingin tahu apakah hubungan antara dua variabel tetap ada ketika stratifikasi dilakukan terhadap variabel ketiga.
Rumus
Jika variabel A dan B conditionally independent given C, maka: \[ P(A, B \mid C) = P(A \mid C) \cdot P(B \mid C) \]
Dalam tabel kontingensi, kita uji conditional independence dengan: - Menggunakan uji homogenitas odds ratio antar strata, atau - Uji Breslow-Day, atau - Melihat apakah odds ratio berbeda signifikan antar strata.
Contoh Soal
Penelitian ini bertujuan untuk mengetahui apakah jenis asupan makanan (Sehat/Tidak Sehat) berpengaruh terhadap status hipertensi (Ya/Tidak), dengan mempertimbangkan bahwa tingkat aktivitas fisik (Tinggi/Rendah) bisa menjadi variabel pengganggu (confounder).
| Aktivitas | Makanan | Hipertensi | Jumlah |
|---|---|---|---|
| Tinggi | Sehat | Ya | 20 |
| Tinggi | Sehat | Tidak | 80 |
| Tinggi | Tidak Sehat | Ya | 40 |
| Tinggi | Tidak Sehat | Tidak | 60 |
| Rendah | Sehat | Ya | 30 |
| Rendah | Sehat | Tidak | 70 |
| Rendah | Tidak Sehat | Ya | 50 |
| Rendah | Tidak Sehat | Tidak | 50 |
Perhitungan Manual
Aktivitas Tinggi:
OR = (20×60) / (80×40) = 1200 / 3200 = 0.375
Aktivitas Rendah:
OR = (30×50) / (70×50) = 1500 / 3500 = 0.429
Karena nilai odds ratio serupa (0.375 vs 0.429), secara kasar bisa dikatakan tidak ada interaksi antara makanan dan aktivitas → indikasi conditional independence.
Perhitungan R
library(epitools)
# Susun array 2x2x2: [Hipertensi, Makanan, Aktivitas]
tabel <- array(c(
20, 80, # Sehat, Aktif Tinggi
40, 60, # Tidak Sehat, Aktif Tinggi
30, 70, # Sehat, Aktif Rendah
50, 50 # Tidak Sehat, Aktif Rendah
), dim = c(2, 2, 2),
dimnames = list(
Hipertensi = c("Ya", "Tidak"),
Makanan = c("Sehat", "TidakSehat"),
Aktivitas = c("Tinggi", "Rendah")
))
# Lihat hasil OR dan CI
for (a in dimnames(tabel)$Aktivitas) {
cat("\n>> Aktivitas:", a, "\n")
tab <- tabel[,,a]
print(tab)
print(oddsratio(tab))
}
##
## >> Aktivitas: Tinggi
## Makanan
## Hipertensi Sehat TidakSehat
## Ya 20 40
## Tidak 80 60
## $data
## Makanan
## Hipertensi Sehat TidakSehat Total
## Ya 20 40 60
## Tidak 80 60 140
## Total 100 100 200
##
## $measure
## odds ratio with 95% C.I.
## Hipertensi estimate lower upper
## Ya 1.0000000 NA NA
## Tidak 0.3780748 0.197225 0.7064918
##
## $p.value
## two-sided
## Hipertensi midp.exact fisher.exact chi.square
## Ya NA NA NA
## Tidak 0.002145336 0.003191817 0.002028231
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
##
## >> Aktivitas: Rendah
## Makanan
## Hipertensi Sehat TidakSehat
## Ya 30 50
## Tidak 70 50
## $data
## Makanan
## Hipertensi Sehat TidakSehat Total
## Ya 30 50 80
## Tidak 70 50 120
## Total 100 100 200
##
## $measure
## odds ratio with 95% C.I.
## Hipertensi estimate lower upper
## Ya 1.000000 NA NA
## Tidak 0.431164 0.2389018 0.7676769
##
## $p.value
## two-sided
## Hipertensi midp.exact fisher.exact chi.square
## Ya NA NA NA
## Tidak 0.004138365 0.005937341 0.003892417
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "median-unbiased estimate & mid-p exact CI"
Interpretasi
Nilai odds ratio pada kedua strata relatif serupa (0.375 dan 0.429), sehingga kita simpulkan:
Tidak ada perbedaan besar efek makanan terhadap hipertensi di antara tingkat aktivitas
Jenis makanan dan status hipertensi conditionally independent terhadap aktivitas fisik
Namun, untuk kesimpulan kuat bisa digunakan uji homogenitas odds ratio atau uji Breslow-Day.
Uji Homogenitas Odds Ratio (Breslow-Day Test)
Setelah menghitung odds ratio per strata, kita bisa menguji apakah nilai-nilai OR tersebut homogen (tidak berbeda signifikan satu sama lain). Uji ini penting untuk mengetahui apakah ada interaksi antara variabel utama dengan variabel stratifikasi.
Hipotesis
H0 (null): Odds ratio homogen antar strata (tidak ada interaksi)
H1 (alternatif): Odds ratio tidak homogen antar strata (ada interaksi)
Rumus dan Konsep
Uji Breslow-Day menguji apakah variasi antar odds ratio di berbagai strata lebih besar dari yang diharapkan jika semua strata memiliki OR yang sama.
Digunakan dalam stratifikasi 2x2xK, dan bisa
dihitung menggunakan fungsi dari paket vcdExtra.
Perhitungan R
# Gunakan tabel dari sebelumnya
breslow.day.test <- BreslowDayTest(tabel)
breslow.day.test
##
## Breslow-Day test on Homogeneity of Odds Ratios
##
## data: tabel
## X-squared = 0.092991, df = 1, p-value = 0.7604
Interpretasi Jika nilai p-value > 0.05, maka: - Tidak ada bukti yang cukup untuk menolak H0 - Kesimpulan: odds ratio homogen, indikasi tidak ada interaksi - Maka, conditional independence dapat diasumsikan valid
Jika p-value < 0.05, maka: - Terdapat perbedaan signifikan antar strata - Maka, conditional independence tidak berlaku
Dalam tabel kontingensi 3 arah (misal: A × B × C), independensi bersyarat menyatakan bahwa dua variabel (A dan B) saling bebas jika dikondisikan pada variabel ketiga (C). Artinya, setelah mengontrol efek variabel C, tidak ada hubungan antara A dan B.
Uji Cochran-Mantel-Haenszel (CMH) digunakan untuk menguji apakah hubungan antara dua variabel (A dan B) tetap konsisten dalam setiap level dari variabel ketiga (C), serta untuk mengetahui apakah ada asosiasi bersyarat yang signifikan.
Rumus Statistika Cochran-Mantel-Haenszel (CMH)
Untuk tabel-tabel 2×2 sebanyak \(K\) strata:
\[ \chi^2_{CMH} = \frac{\left[ \sum_{k=1}^{K} \left( \frac{a_k d_k - b_k c_k}{n_k} \right) \right]^2} {\sum_{k=1}^{K} \left( \frac{a_k + b_k)(c_k + d_k)(a_k + c_k)(b_k + d_k)}{n_k^2 (n_k - 1)} \right)} \]
Dengan: - \(a_k, b_k, c_k, d_k\): frekuensi dari tabel 2x2 ke-k - \(n_k\): total observasi di strata ke-k
Contoh Soal
Penelitian ini bertujuan untuk mengevaluasi apakah konsumsi gorengan berkaitan dengan penyakit paru-paru, dan apakah hubungan ini tetap signifikan ketika dikendalikan berdasarkan jenis kelamin (L/P).
Tujuan Analisis
Mengetahui apakah ada hubungan antara konsumsi gorengan dan penyakit paru-paru.
Mengontrol potensi pengganggu dari variabel jenis kelamin menggunakan Uji Mantel-Haenszel.
Menginterpretasikan odds ratio dan signifikansi statistik.
| Jenis Kelamin | Gorengan | Penyakit | Jumlah |
|---|---|---|---|
| L | Sering | Ya | 35 |
| L | Sering | Tidak | 65 |
| L | Tidak | Ya | 20 |
| L | Tidak | Tidak | 80 |
| P | Sering | Ya | 30 |
| P | Sering | Tidak | 70 |
| P | Tidak | Ya | 15 |
| P | Tidak | Tidak | 85 |
Perhitungan Manual
# Data masing-masing strata (jenis kelamin)
L <- matrix(c(35, 65, 20, 80), nrow = 2, byrow = TRUE)
P <- matrix(c(30, 70, 15, 85), nrow = 2, byrow = TRUE)
# Fungsi hitung nilai CMH manual
cmh_manual <- function(tables) {
num <- 0
denom <- 0
for (tab in tables) {
a <- tab[1,1]; b <- tab[1,2]
c <- tab[2,1]; d <- tab[2,2]
n <- a + b + c + d
num <- num + ((a*d - b*c)/n)
denom <- denom + (((a + b)*(c + d)*(a + c)*(b + d)) / (n^2 * (n - 1)))
}
CMH <- (num^2) / denom
return(CMH)
}
# Hitung nilai chi-square CMH manual
cmh_stat <- cmh_manual(list(L, P))
cmh_stat
## [1] 11.97993
Perhitungan R
# Gabungkan data menjadi array 2x2x2 (baris x kolom x strata)
gorengan_data <- array(c(35, 65, 20, 80,
30, 70, 15, 85),
dim = c(2, 2, 2),
dimnames = list(
Penyakit = c("Ya", "Tidak"),
Gorengan = c("Sering", "Tidak"),
Kelamin = c("L", "P")
))
# Uji CMH
mantelhaen.test(gorengan_data)
##
## Mantel-Haenszel chi-squared test with continuity correction
##
## data: gorengan_data
## Mantel-Haenszel X-squared = 11.195, df = 1, p-value = 0.0008204
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 1.421940 3.644941
## sample estimates:
## common odds ratio
## 2.276596
Interpretasi Jika nilai p-value < 0.05, maka ada asosiasi antara konsumsi gorengan dan penyakit paru-paru, bahkan setelah mengontrol jenis kelamin (independensi bersyarat ditolak).
Jika p-value > 0.05, maka tidak ada bukti kuat bahwa gorengan memengaruhi penyakit setelah dikontrol jenis kelamin (independensi bersyarat diterima).
Dalam tabel kontingensi 3 arah (2x2xK), kita ingin mengetahui
seberapa kuat hubungan antara dua variabel (misalnya paparan dan
penyakit) setelah mengontrol efek variabel ketiga (strata),
misalnya jenis kelamin atau usia.
Odds Ratio Bersama (Common Odds Ratio) adalah estimasi
keseluruhan odds ratio dari seluruh strata jika
diasumsikan homogen.
Penaksiran ini dilakukan dengan statistik Mantel-Haenszel.
Rumus Mantel-Haenszel
Untuk \(K\) tabel 2x2:
\[ \hat{\theta}_{MH} = \frac{ \sum_{k=1}^{K} \frac{a_k d_k}{n_k} }{ \sum_{k=1}^{K} \frac{b_k c_k}{n_k} } \]
dengan: - \(a_k, b_k, c_k, d_k\): sel-sel tabel 2x2 ke-k - \(n_k = a_k + b_k + c_k + d_k\)
Contoh Soal
Ingin menaksir odds ratio bersama antara konsumsi gorengan dan penyakit paru-paru, setelah dikontrol oleh jenis kelamin.
| Jenis Kelamin | Gorengan | Penyakit | Jumlah |
|---|---|---|---|
| L | Sering | Ya | 35 |
| L | Sering | Tidak | 65 |
| L | Tidak | Ya | 20 |
| L | Tidak | Tidak | 80 |
| P | Sering | Ya | 30 |
| P | Sering | Tidak | 70 |
| P | Tidak | Ya | 15 |
| P | Tidak | Tidak | 85 |
Perhitungan Manual (Mantel-Haenszel Estimator)
# Tabel per strata
L <- matrix(c(35, 65, 20, 80), nrow = 2, byrow = TRUE) # [a, b; c, d]
P <- matrix(c(30, 70, 15, 85), nrow = 2, byrow = TRUE)
# Fungsi OR_MH manual
or_mh <- function(tables) {
num <- 0
denom <- 0
for (tab in tables) {
a <- tab[1,1]; b <- tab[1,2]
c <- tab[2,1]; d <- tab[2,2]
n <- a + b + c + d
num <- num + (a * d) / n
denom <- denom + (b * c) / n
}
return(num / denom)
}
# Hitung OR bersama
or_mh(list(L, P))
## [1] 2.276596
Perhitungan R
# Gabungkan ke array 3D
gorengan_data <- array(c(35, 65, 20, 80,
30, 70, 15, 85),
dim = c(2, 2, 2),
dimnames = list(
Penyakit = c("Ya", "Tidak"),
Gorengan = c("Sering", "Tidak"),
Kelamin = c("L", "P")
))
# Hitung OR bersama dengan epitools
library(epitools)
mantel_result <- mantelhaen.test(gorengan_data)
mantel_result
##
## Mantel-Haenszel chi-squared test with continuity correction
##
## data: gorengan_data
## Mantel-Haenszel X-squared = 11.195, df = 1, p-value = 0.0008204
## alternative hypothesis: true common odds ratio is not equal to 1
## 95 percent confidence interval:
## 1.421940 3.644941
## sample estimates:
## common odds ratio
## 2.276596
Interpretasi - Nilai odds ratio bersama (common OR) menggambarkan kekuatan asosiasi antara gorengan dan penyakit setelah mengontrol jenis kelamin. - Jika OR > 1, artinya konsumsi gorengan meningkatkan risiko penyakit. - Jika p-value < 0.05, maka hubungan tersebut signifikan secara statistik. - Penaksiran ini mengasumsikan homogenitas odds ratio antar strata
Pengertian: Uji Homogenitas Odds Ratio dengan Statistik Breslow-Day digunakan untuk menguji apakah OR (Odds Ratio) dari beberapa strata (lapisan) dalam tabel kontingensi 3 arah (misalnya: Treatment x Outcome x Strata seperti Jenis Kelamin atau Usia) adalah sama.
Dengan kata lain, uji ini memeriksa apakah terdapat interaksi antara strata dengan dua variabel utama (treatment dan outcome).
Hipotesis: H0: OR adalah homogen di seluruh strata (tidak ada interaksi). H1: OR tidak homogen di seluruh strata (ada interaksi).
Rumus Statistik Breslow-Day: BD = ∑ [ (O_11k - E_11k)^2 / V_11k ] untuk setiap strata k di mana: O_11k = frekuensi observasi sel (1,1) pada strata k E_11k = ekspektasi frekuensi sel (1,1) berdasarkan OR gabungan V_11k = variansi dari E_11k Statistik ini mengikuti distribusi chi-square dengan (K - 1) derajat bebas (K = jumlah strata)
Contoh Soal
Misalkan kita punya data efek dari dua jenis terapi terhadap kesembuhan, terstratifikasi berdasarkan jenis kelamin.
Data dalam format array 2x2x2 (Treatment x Outcome x Strata) Dimensi: [Treatment, Outcome, Gender] Treatment: 1 = A, 2 = B Outcome: 1 = Sembuh, 2 = Tidak Sembuh Gender: 1 = Pria, 2 = Wanita
data_array <- array(c(
30, 20, # Pria, Terapi A
20, 30, # Pria, Terapi B
25, 25, # Wanita, Terapi A
25, 25 # Wanita, Terapi B
), dim = c(2, 2, 2), dimnames = list(
Treatment = c("A", "B"),
Outcome = c("Sembuh", "Tidak_Sembuh"),
Gender = c("Pria", "Wanita")
))
Perhitungan Odds Ratio per strata (manual): OR_Pria = (3030)/(2020) = 900/400 = 2.25 OR_Wanita = (2525)/(2525) = 625/625 = 1
Kita ingin menguji apakah OR_Pria dan OR_Wanita berbeda secara signifikan.
Perhitungan R:
library(vcdExtra)
## Warning: package 'vcdExtra' was built under R version 4.3.3
## Loading required package: vcd
## Warning: package 'vcd' was built under R version 4.3.3
## Loading required package: grid
##
## Attaching package: 'vcd'
## The following object is masked from 'package:epitools':
##
## oddsratio
## Loading required package: gnm
## Warning: package 'gnm' was built under R version 4.3.3
##
## Attaching package: 'vcdExtra'
## The following object is masked from 'package:epitools':
##
## expand.table
## The following object is masked from 'package:dplyr':
##
## summarise
bd_result <- BreslowDayTest(data_array)
bd_result
##
## Breslow-Day test on Homogeneity of Odds Ratios
##
## data: data_array
## X-squared = 2.02, df = 1, p-value = 0.1552
Interpretasi: - Jika nilai p-value < 0.05, maka kita tolak H0 → OR tidak homogen → Ada interaksi antara strata dengan efek treatment terhadap outcome. - Jika p-value ≥ 0.05, maka kita gagal tolak H0 → OR dianggap homogen → Efek treatment seragam di semua strata.
Generalized Linear Model (GLM) adalah perluasan dari model regresi linear klasik yang memungkinkan variabel respon memiliki distribusi non-normal, seperti binomial, Poisson, atau gamma.
GLM terdiri dari tiga komponen utama: 1. Distribusi dari family eksponensial (exponential family) 2. Fungsi link: menghubungkan ekspektasi respon ke kombinasi linear prediktor 3. Fungsi linear prediktor: \(\eta = \beta_0 + \beta_1 X_1 + \cdots + \beta_p X_p\)
Rumus Umum GLM
Model GLM dapat ditulis sebagai: \[ g(\mu_i) = \eta_i = \beta_0 + \beta_1 x_{i1} + \cdots + \beta_p x_{ip} \] dengan: - \(\mu_i = E(Y_i)\): ekspektasi dari respon - \(g(\cdot)\): fungsi link - \(\eta_i\): linear predictor
Exponential Family
Distribusi termasuk dalam keluarga eksponensial jika dapat ditulis dalam bentuk: \[ f(y; \theta, \phi) = \exp \left\{ \frac{y\theta - b(\theta)}{\phi} + c(y, \phi) \right\} \]
Contoh distribusi dalam exponential family: - Binomial → regresi logistik - Poisson → regresi poisson - Normal → regresi linear klasik
Model regresi logistik digunakan saat respon bersifat biner (0/1), seperti sukses/gagal atau sakit/sehat.
Model logistik: \[ \text{logit}(\pi) = \log\left(\frac{\pi}{1 - \pi}\right) = \beta_0 + \beta_1 X \]
Dengan \(\pi\) adalah probabilitas respon sukses.
Contoh Soal
Misalkan sebuah studi ingin melihat apakah konsumsi gorengan (Sering/Tidak) memengaruhi kejadian sakit tenggorokan (Ya/Tidak).
| Gorengan | Penyakit | Jumlah |
|---|---|---|
| Sering | Ya | 60 |
| Sering | Tidak | 90 |
| Tidak | Ya | 35 |
| Tidak | Tidak | 115 |
Perhitungan Manual (Odds dan logit)
Odds untuk Sering: \[ \text{Odds}_{Sering} = \frac{60}{90} = 0.667 \]
Odds untuk Tidak: \[ \text{Odds}_{Tidak} = \frac{35}{115} = 0.304 \]
Odds Ratio: \[ OR = \frac{60/90}{35/115} = \frac{0.667}{0.304} \approx 2.2 \]
Logit model: \[ \log\left(\frac{\pi}{1 - \pi}\right) = \beta_0 + \beta_1 \cdot X \]
Perhitungan di R
# Buat data biner
data <- data.frame(
Gorengan = rep(c("Sering", "Tidak"), each = 2),
Penyakit = c(1, 0, 1, 0),
Jumlah = c(60, 90, 35, 115)
)
# Ubah ke format biner
expanded <- data[rep(1:nrow(data), data$Jumlah), ]
expanded$Gorengan <- factor(expanded$Gorengan)
expanded$Y <- ifelse(expanded$Penyakit == 1, 1, 0)
# Model regresi logistik
fit <- glm(Y ~ Gorengan, data = expanded, family = binomial)
summary(fit)
##
## Call:
## glm(formula = Y ~ Gorengan, family = binomial, data = expanded)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.4055 0.1667 -2.433 0.01498 *
## GorenganTidak -0.7841 0.2550 -3.075 0.00211 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 374.60 on 299 degrees of freedom
## Residual deviance: 364.89 on 298 degrees of freedom
## AIC: 368.89
##
## Number of Fisher Scoring iterations: 4
# Odds Ratio
exp(coef(fit))
## (Intercept) GorenganTidak
## 0.6666667 0.4565217
Interpretasi - Koefisien logistik menunjukkan log-odds dari kejadian sakit tenggorokan. - Nilai OR = exp(β1) ≈ 2.2 artinya: Konsumsi gorengan secara signifikan meningkatkan kemungkinan sakit tenggorokan sekitar 2.2 kali lipat dibanding yang tidak makan gorengan. - Jika p-value < 0.05 untuk koefisien, maka hubungan signifikan secara statistik.
Catatan Tambahan GLM sangat fleksibel untuk berbagai jenis data. Jika data berdistribusi binomial → gunakan family = binomial.
Pengertian
Regresi Poisson adalah salah satu bentuk Generalized Linear Model (GLM) yang digunakan untuk memodelkan data cacahan (count data), yaitu data berupa jumlah kejadian dalam interval waktu atau ruang tertentu.
Model ini digunakan jika: - Respon (Y) berupa bilangan bulat ≥ 0 - Nilai ekspektasi E(Y) ≈ varians (fitur distribusi Poisson)
Struktur Model
GLM untuk distribusi Poisson terdiri dari: 1. Distribusi: \(Y_i \sim \text{Poisson}(\lambda_i)\) 2. Link function: Fungsi log 3. Linear predictor: \[ \log(\lambda_i) = \beta_0 + \beta_1 X_{i1} + \cdots + \beta_p X_{ip} \]
Contoh Soal
Misalkan kita ingin memodelkan jumlah pasien yang datang ke klinik berdasarkan jumlah hari promosi dilakukan:
| Hari Promosi | Jumlah Pasien |
|---|---|
| 0 | 5 |
| 1 | 9 |
| 2 | 12 |
| 3 | 18 |
| 4 | 25 |
Apakah hari promosi memengaruhi jumlah pasien yang datang?
Perhitungan Manual
Misalnya kita ingin menyesuaikan model:
\[ \log(\lambda) = \beta_0 + \beta_1 X \]
Dari data, kita bisa log-transform jumlah pasien untuk mendekati model linear:
hari <- 0:4
pasien <- c(5, 9, 12, 18, 25)
log_pasien <- log(pasien)
# Perkiraan regresi linear biasa untuk log(y)
fit_lm <- lm(log_pasien ~ hari)
summary(fit_lm)
##
## Call:
## lm(formula = log_pasien ~ hari)
##
## Residuals:
## 1 2 3 4 5
## -0.088321 0.108264 0.004743 0.019006 -0.043692
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.69776 0.06605 25.70 0.000129 ***
## hari 0.39120 0.02697 14.51 0.000710 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.08527 on 3 degrees of freedom
## Multiple R-squared: 0.9859, Adjusted R-squared: 0.9813
## F-statistic: 210.5 on 1 and 3 DF, p-value: 0.0007101
Ini memberikan perkiraan awal: 𝛽^0 = intercept 𝛽^1 = slope dari hari promosi
# Buat data frame
data <- data.frame(
Hari = 0:4,
Pasien = c(5, 9, 12, 18, 25)
)
# Model regresi Poisson
fit <- glm(Pasien ~ Hari, data = data, family = poisson())
summary(fit)
##
## Call:
## glm(formula = Pasien ~ Hari, family = poisson(), data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.73435 0.27918 6.212 5.22e-10 ***
## Hari 0.37639 0.09294 4.050 5.13e-05 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 18.07509 on 4 degrees of freedom
## Residual deviance: 0.17085 on 3 degrees of freedom
## AIC: 25.843
##
## Number of Fisher Scoring iterations: 3
# Prediksi nilai lambda
data$Prediksi <- predict(fit, type = "response")
data
## Hari Pasien Prediksi
## 1 0 5 5.665246
## 2 1 9 8.254313
## 3 2 12 12.026605
## 4 3 18 17.522867
## 5 4 25 25.530969
Interpretasi - Koefisien Intercept (β₀) merepresentasikan log-rata-rata pasien saat Hari = 0 - Koefisien Hari (β₁) mengindikasikan seberapa besar log-pasien meningkat tiap tambahan 1 hari promosi - Jika p-value < 0.05, maka variabel hari berpengaruh signifikan - Nilai exp(β1) menunjukkan faktor pengali terhadap jumlah pasien tiap hari promosi bertambah satu
Visualisasi
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
ggplot(data, aes(x = Hari, y = Pasien)) +
geom_point(size = 3) +
geom_line(aes(y = Prediksi), color = "blue", size = 1) +
labs(title = "Regresi Poisson: Hari Promosi vs Jumlah Pasien",
y = "Pasien", x = "Hari Promosi") +
theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
Catatan Tambahan Jika varians data jauh lebih besar dari mean, pertimbangkan model quasi-Poisson atau negatif binomial.
Bisa menambahkan offset untuk memodelkan rate (laju) dalam GLM Poisson.
Generalized Linear Model (GLM) adalah model statistik yang memperluas regresi linear klasik agar bisa digunakan untuk data dari keluarga distribusi eksponensial (contoh: binomial, Poisson, normal).
Dalam GLM, kita tertarik untuk: - Menentukan ekspektasi (E[Y]) - Menentukan varians (Var[Y]) - Menaksir parameter \(\beta\) dengan metode Maximum Likelihood Estimation (MLE)
Struktur Umum GLM
Komponen GLM: 1. Random component: Distribusi respon \(Y \in \text{Exponential Family}\) 2. Systematic component: Fungsi linear \(\eta = X \beta\) 3. Link function: Menghubungkan \(\mu = E[Y]\) ke \(\eta\)
Ekspektasi dan Varians
Dalam exponential family, fungsi distribusi: \[ f(y;\theta,\phi) = \exp \left\{ \frac{y\theta - b(\theta)}{\phi} + c(y, \phi) \right\} \]
Maka: - Ekspektasi:
\[
\mathbb{E}[Y] = b'(\theta)
\] - Varians: \[
\mathbb{V}[Y] = \phi b''(\theta)
\]
Contoh Soal
Sebuah studi mengamati jumlah kecelakaan per hari di sebuah simpang jalan selama 5 hari:
| Hari | Kecelakaan |
|---|---|
| 1 | 3 |
| 2 | 2 |
| 3 | 4 |
| 4 | 5 |
| 5 | 6 |
Anggap bahwa data berdistribusi Poisson.
Perhitungan Manual
Karena \(Y \sim \text{Poisson}(\lambda)\), maka:
Link function: \[ \log(\lambda) = \beta_0 + \beta_1 \cdot \text{Hari} \]
Transformasi log jumlah kecelakaan:
hari <- 1:5
kecelakaan <- c(3, 2, 4, 5, 6)
log_kec <- log(kecelakaan)
# Regresi linear awal
lm(log_kec ~ hari)
##
## Call:
## lm(formula = log_kec ~ hari)
##
## Coefficients:
## (Intercept) hari
## 0.6251 0.2303
Perhitungan R
# Data frame
data <- data.frame(Hari = 1:5, Kecelakaan = c(3, 2, 4, 5, 6))
# Model GLM dengan distribusi Poisson
model <- glm(Kecelakaan ~ Hari, family = poisson(link = "log"), data = data)
summary(model)
##
## Call:
## glm(formula = Kecelakaan ~ Hari, family = poisson(link = "log"),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.6436 0.6069 1.060 0.289
## Hari 0.2301 0.1636 1.407 0.159
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 2.59834 on 4 degrees of freedom
## Residual deviance: 0.55058 on 3 degrees of freedom
## AIC: 20.56
##
## Number of Fisher Scoring iterations: 4
# Ekspektasi prediksi
data$Ekspektasi <- predict(model, type = "response")
# Varians (untuk Poisson = ekspektasi)
data$Varians <- data$Ekspektasi
data
## Hari Kecelakaan Ekspektasi Varians
## 1 1 3 2.395750 2.395750
## 2 2 2 3.015650 3.015650
## 3 3 4 3.795950 3.795950
## 4 4 5 4.778152 4.778152
## 5 5 6 6.014499 6.014499
Interpretasi - Koefisien model diperoleh dengan Maximum Likelihood Estimation (MLE) - Nilai ekspektasi sesuai dengan hasil prediksi μ^i - Varians untuk distribusi Poisson sama dengan ekspektasi - Jika model sesuai (p-value signifikan, deviance rendah), maka model bisa digunakan untuk prediksi jumlah kejadian
Catatan Tambahan - Untuk distribusi lain (misalnya binomial), ekspektasi dan varians akan berbeda. - Link function sangat memengaruhi bentuk hubungan antara prediktor dan ekspektasi.
Regresi logistik merupakan bagian dari Generalized Linear Model (GLM) untuk memodelkan data dengan respon biner (0/1). Inferensi dan estimasi dalam regresi logistik melibatkan:
Struktur Model Regresi Logistik
Model logistik untuk data biner:
\[ \text{logit}(\pi_i) = \log\left( \frac{\pi_i}{1 - \pi_i} \right) = \eta_i = \beta_0 + \beta_1 x_i \]
di mana: - \(\pi_i = P(Y_i = 1 \mid x_i)\) - \(\eta_i\): linear predictor
Estimasi Parameter: Maximum Likelihood
Likelihood Function: \[ L(\beta) = \prod_{i=1}^n \pi_i^{y_i}(1 - \pi_i)^{1 - y_i} \]
Log-likelihood: \[ \ell(\beta) = \sum_{i=1}^n \left[ y_i \log(\pi_i) + (1 - y_i) \log(1 - \pi_i) \right] \]
Estimasi parameter \(\beta\) dicari
dengan maksimalisasi log-likelihood, diselesaikan via
Iteratively Reweighted Least Squares (IRLS) oleh fungsi
glm().
Diagnostik Model
Contoh Soal
Sebuah studi mengamati apakah konsumsi gorengan memengaruhi kemungkinan terkena sakit tenggorokan:
| Gorengan | Penyakit | Jumlah |
|---|---|---|
| Sering | Ya | 45 |
| Sering | Tidak | 55 |
| Tidak | Ya | 20 |
| Tidak | Tidak | 80 |
Perhitungan Manual Odds dan Logit
# Odds untuk Sering
odds_sering <- 45 / 55
# Odds untuk Tidak
odds_tidak <- 20 / 80
# Odds Ratio
OR <- odds_sering / odds_tidak
log_OR <- log(OR)
cat("Odds Ratio:", round(OR, 2), "\nLog Odds Ratio:", round(log_OR, 2), "\n")
## Odds Ratio: 3.27
## Log Odds Ratio: 1.19
Perhitungan R
# Membuat data biner
data <- data.frame(
Gorengan = rep(c("Sering", "Tidak"), each = 2),
Penyakit = c(1, 0, 1, 0),
Jumlah = c(45, 55, 20, 80)
)
# Ekspansi ke data biner
long_data <- data[rep(1:nrow(data), data$Jumlah), ]
long_data$Y <- long_data$Penyakit
long_data$Gorengan <- factor(long_data$Gorengan)
# Model regresi logistik
fit <- glm(Y ~ Gorengan, data = long_data, family = binomial)
summary(fit)
##
## Call:
## glm(formula = Y ~ Gorengan, family = binomial, data = long_data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.2007 0.2010 -0.998 0.318122
## GorenganTidak -1.1856 0.3208 -3.696 0.000219 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 252.23 on 199 degrees of freedom
## Residual deviance: 237.71 on 198 degrees of freedom
## AIC: 241.71
##
## Number of Fisher Scoring iterations: 4
# Odds ratio
exp(coef(fit))
## (Intercept) GorenganTidak
## 0.8181818 0.3055556
Diagnostik Model di R
# Residual deviance dan null deviance
cat("Null Deviance:", fit$null.deviance, "\n")
## Null Deviance: 252.2324
cat("Residual Deviance:", fit$deviance, "\n")
## Residual Deviance: 237.7082
# AIC
cat("AIC:", AIC(fit), "\n")
## AIC: 241.7082
# Pseudo R-squared (McFadden)
library(pscl)
## Warning: package 'pscl' was built under R version 4.3.3
## Classes and Methods for R originally developed in the
## Political Science Computational Laboratory
## Department of Political Science
## Stanford University (2002-2015),
## by and under the direction of Simon Jackman.
## hurdle and zeroinfl functions by Achim Zeileis.
pR2(fit)
## fitting null model for pseudo-r2
## llh llhNull G2 McFadden r2ML
## -118.85412373 -126.11620568 14.52416390 0.05758246 0.07004662
## r2CU
## 0.09773827
Interpretasi - Koefisien signifikan (p-value < 0.05) → konsumsi gorengan berpengaruh terhadap risiko sakit - Odds Ratio > 1 → konsumsi gorengan meningkatkan peluang sakit - Residual deviance < null deviance secara signifikan → model cocok - AIC lebih kecil → model lebih baik Pseudo-R² mendekati 1 → model menjelaskan variabilitas data dengan baik
Catatan Tambahan - Model logistik mengasumsikan hubungan linier antara logit dan prediktor - Diagnostik penting dilakukan untuk mencegah misinterpretasi model
Regresi Poisson merupakan salah satu bentuk dari Generalized Linear Model (GLM) yang digunakan ketika data berupa cacahan (count data), seperti jumlah kejadian, pelanggan, atau penyakit dalam satuan waktu/ruang tertentu.
Model ini cocok jika: - Nilai respon \(Y \in \{0, 1, 2, \dots\}\) - Varian ≈ rata-rata (fitur distribusi Poisson)
Rumus Model Regresi Poisson
Komponen GLM: - Distribusi: \(Y_i \sim \text{Poisson}(\lambda_i)\) - Link function: log-link → \(\log(\lambda_i) = \eta_i = X_i \beta\) - Ekspektasi: \(\mathbb{E}[Y_i] = \lambda_i\) - Varians: \(\mathbb{V}[Y_i] = \lambda_i\)
Metode Estimasi: Maximum Likelihood
Fungsi likelihood untuk data Poisson:
\[ L(\beta) = \prod_{i=1}^n \frac{e^{-\lambda_i} \lambda_i^{y_i}}{y_i!}, \quad \lambda_i = e^{\eta_i} = e^{X_i \beta} \]
Log-likelihood:
\[ \ell(\beta) = \sum_{i=1}^n \left[ y_i \log(\lambda_i) - \lambda_i - \log(y_i!) \right] \]
Parameter \(\beta\) ditaksir dengan maksimalisasi log-likelihood, menggunakan iteratively reweighted least squares (IRLS).
Contoh Soal
Seorang peneliti mencatat jumlah pelanggan per hari selama seminggu, beserta total pengeluaran iklan di media sosial:
| Hari | Iklan (juta rupiah) | Pelanggan |
|---|---|---|
| 1 | 1.0 | 3 |
| 2 | 1.5 | 4 |
| 3 | 2.0 | 6 |
| 4 | 2.5 | 8 |
| 5 | 3.0 | 9 |
| 6 | 3.5 | 11 |
| 7 | 4.0 | 13 |
Perhitungan Manual
Asumsi model: \[ \log(\lambda_i) = \beta_0 + \beta_1 \cdot \text{Iklan}_i \Rightarrow \lambda_i = e^{\beta_0 + \beta_1 \cdot \text{Iklan}_i} \]
Transformasi log:
iklan <- c(1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0)
pelanggan <- c(3, 4, 6, 8, 9, 11, 13)
log_pelanggan <- log(pelanggan)
lm(log_pelanggan ~ iklan)
##
## Call:
## lm(formula = log_pelanggan ~ iklan)
##
## Coefficients:
## (Intercept) iklan
## 0.7117 0.4877
Perhitungan R
# Data frame
data <- data.frame(
Hari = 1:7,
Iklan = c(1.0, 1.5, 2.0, 2.5, 3.0, 3.5, 4.0),
Pelanggan = c(3, 4, 6, 8, 9, 11, 13)
)
# Model Poisson GLM
fit <- glm(Pelanggan ~ Iklan, data = data, family = poisson(link = "log"))
summary(fit)
##
## Call:
## glm(formula = Pelanggan ~ Iklan, family = poisson(link = "log"),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.8085 0.4463 1.812 0.07001 .
## Iklan 0.4535 0.1448 3.132 0.00174 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 10.79465 on 6 degrees of freedom
## Residual deviance: 0.35708 on 5 degrees of freedom
## AIC: 30.93
##
## Number of Fisher Scoring iterations: 4
# Prediksi ekspektasi pelanggan
data$Prediksi <- predict(fit, type = "response")
data
## Hari Iklan Pelanggan Prediksi
## 1 1 1.0 3 3.532726
## 2 2 1.5 4 4.431910
## 3 3 2.0 6 5.559963
## 4 4 2.5 8 6.975139
## 5 5 3.0 9 8.750519
## 6 6 3.5 11 10.977785
## 7 7 4.0 13 13.771958
Interpretasi - Koefisien intercept (β₀) menunjukkan log-rata-rata pelanggan saat iklan = 0 - Koefisien iklan (β₁) menunjukkan efek log-linier dari iklan terhadap pelanggan - exp(β1) menyatakan faktor pengali pelanggan untuk setiap kenaikan 1 juta pada iklan - p-value < 0.05 → iklan berpengaruh signifikan
library(tidyverse)
## Warning: package 'tidyverse' was built under R version 4.3.3
## Warning: package 'tidyr' was built under R version 4.3.3
## Warning: package 'readr' was built under R version 4.3.3
## Warning: package 'stringr' was built under R version 4.3.3
## Warning: package 'forcats' was built under R version 4.3.3
## Warning: package 'lubridate' was built under R version 4.3.3
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ stringr 1.5.1
## ✔ lubridate 1.9.4 ✔ tibble 3.2.1
## ✔ purrr 1.0.2 ✔ tidyr 1.3.1
## ✔ readr 2.1.5
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ✖ vcdExtra::summarise() masks dplyr::summarise()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(broom)
## Warning: package 'broom' was built under R version 4.3.3
library(knitr)
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.3.3
##
## Attaching package: 'kableExtra'
##
## The following object is masked from 'package:dplyr':
##
## group_rows
set.seed(123)
Regresi logistik adalah salah satu metode statistik yang digunakan untuk memodelkan hubungan antara satu variabel respons biner (dengan dua kategori, seperti sukses/gagal atau ya/tidak) dan satu atau lebih variabel prediktor. Metode ini sangat berguna ketika variabel respons tidak memenuhi asumsi normalitas seperti pada regresi linier klasik.
Dalam regresi logistik, hasil yang diprediksi adalah probabilitas terjadinya suatu kejadian. Model ini menggunakan fungsi logit (log odds) untuk menghubungkan prediktor dengan probabilitas kejadian:
prediktor dengan probabilitas kejadian:
\[ \text{logit}(p) = \log\left(\frac{p}{1-p}\right) = \beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k \]
Prediktor yang digunakan dalam regresi logistik dapat berupa:
n <- 500
gender <- sample(c("Male", "Female"), n, replace = TRUE)
education <- sample(c("HighSchool", "Bachelor", "Master", "PhD"), n, replace = TRUE, prob = c(0.4, 0.3, 0.2, 0.1))
income <- rnorm(n, mean = 50, sd = 15)
logit_p <- -1 + 0.6 * (gender == "Female") + 0.9 * as.numeric(factor(education, ordered=TRUE)) + 0.04 * income
p <- 1 / (1 + exp(-logit_p))
success <- rbinom(n, 1, p)
sim_data <- tibble(success, gender, education, income)
kable(head(sim_data))
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
| success | gender | education | income |
|---|---|---|---|
| 1 | Male | HighSchool | 40.97161 |
| 1 | Male | HighSchool | 35.09452 |
| 1 | Male | HighSchool | 65.40178 |
| 1 | Female | HighSchool | 61.26592 |
| 1 | Male | HighSchool | 27.36250 |
| 1 | Female | HighSchool | 48.57279 |
sim_data %>%
count(gender, education, success) %>%
pivot_wider(names_from = success, values_from = n, values_fill = 0)
## # A tibble: 8 × 4
## gender education `0` `1`
## <chr> <chr> <int> <int>
## 1 Female Bachelor 8 67
## 2 Female HighSchool 2 94
## 3 Female Master 1 52
## 4 Female PhD 0 15
## 5 Male Bachelor 9 69
## 6 Male HighSchool 7 92
## 7 Male Master 1 54
## 8 Male PhD 1 28
sim_data_nominal <- sim_data %>%
mutate(education = factor(education, levels = c("HighSchool", "Bachelor", "Master", "PhD")))
model_nominal <- glm(success ~ gender + education + income, data = sim_data_nominal, family = binomial)
# Output tabel aman untuk semua format
tbl_nominal <- tidy(model_nominal)
if (knitr::is_latex_output()) {
kable(tbl_nominal, format = "latex", digits = 4, booktabs = TRUE)
} else {
kable(tbl_nominal, digits = 4) %>% kable_styling(full_width = FALSE)
}
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
| term | estimate | std.error | statistic | p.value |
|---|---|---|---|---|
| (Intercept) | 2.1034 | 0.7089 | 2.9672 | 0.0030 |
| genderMale | -0.5115 | 0.4021 | -1.2721 | 0.2033 |
| educationBachelor | -0.9551 | 0.4304 | -2.2194 | 0.0265 |
| educationMaster | 0.9654 | 0.7930 | 1.2173 | 0.2235 |
| educationPhD | 0.8058 | 1.0727 | 0.7512 | 0.4525 |
| income | 0.0255 | 0.0129 | 1.9708 | 0.0488 |
Interpretasi: Dengan perlakuan dummy, setiap kategori dari education dibandingkan dengan referensi dasar (HighSchool). Koefisien menggambarkan log odds relatif terhadap referensi. Misalnya, koefisien positif untuk Bachelor berarti bahwa peluang sukses lebih besar dibanding lulusan HighSchool, dengan asumsi variabel lain konstan.
sim_data_numeric <- sim_data %>%
mutate(education_numeric = as.numeric(factor(education, levels = c("HighSchool", "Bachelor", "Master", "PhD"))))
model_numeric <- glm(success ~ gender + education_numeric + income, data = sim_data_numeric, family = binomial)
tbl_numeric <- tidy(model_numeric)
if (knitr::is_latex_output()) {
kable(tbl_numeric, format = "latex", digits = 4, booktabs = TRUE)
} else {
kable(tbl_numeric, digits = 4) %>% kable_styling(full_width = FALSE)
}
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
| term | estimate | std.error | statistic | p.value |
|---|---|---|---|---|
| (Intercept) | 1.4389 | 0.7494 | 1.9201 | 0.0548 |
| genderMale | -0.4865 | 0.3970 | -1.2253 | 0.2205 |
| education_numeric | 0.2210 | 0.2084 | 1.0604 | 0.2890 |
| income | 0.0253 | 0.0129 | 1.9562 | 0.0504 |
Interpretasi: Dengan menganggap education sebagai numeric, model mengasumsikan bahwa jarak antar tingkat pendidikan sama. Koefisien pendidikan kini mewakili perubahan log odds untuk setiap kenaikan satu tingkat pendidikan.
sim_data_nominal <- sim_data_nominal %>%
mutate(predicted = predict(model_nominal, type = "response"))
ggplot(sim_data_nominal, aes(x = income, y = predicted, color = education)) +
geom_point(alpha = 0.5) +
labs(title = "Prediksi Probabilitas (Ordinal sebagai Dummy)", x = "Income", y = "Probabilitas") +
theme_minimal()
sim_data_numeric <- sim_data_numeric %>%
mutate(predicted = predict(model_numeric, type = "response"))
ggplot(sim_data_numeric, aes(x = income, y = predicted, color = as.factor(education_numeric))) +
geom_point(alpha = 0.5) +
labs(title = "Prediksi Probabilitas (Ordinal sebagai Numeric)", x = "Income", y = "Probabilitas") +
theme_minimal()
nullmod <- glm(success ~ 1, data = sim_data, family = binomial)
r2_nominal <- 1 - (logLik(model_nominal)/logLik(nullmod))
r2_numeric <- 1 - (logLik(model_numeric)/logLik(nullmod))
rbind(
Nominal = r2_nominal,
Numeric = r2_numeric
) %>% round(4)
## [,1]
## Nominal 0.0801
## Numeric 0.0283
Interpretasi: McFadden’s R² merupakan ukuran kebaikan model regresi logistik. Nilai mendekati 1 menunjukkan model yang lebih baik dalam menjelaskan variabilitas data dibanding model null.
Regresi logistik merupakan alat penting dalam analisis data kategori dengan variabel respons biner. Dalam bab ini, kita telah melihat bahwa: - Variabel prediktor dapat bersifat nominal, ordinal, maupun rasio. - Variabel ordinal dapat diperlakukan sebagai dummy (tanpa asumsi urutan) atau numeric (dengan asumsi urutan berjarak sama). - Pemilihan perlakuan terhadap prediktor ordinal akan memengaruhi interpretasi model dan kesimpulan yang diambil. - Visualisasi dan evaluasi model (seperti McFadden R²) penting untuk menilai kecocokan model terhadap data.
knitr::opts_chunk$set(echo = TRUE)
library(tidyverse)
library(broom)
library(pROC)
## Warning: package 'pROC' was built under R version 4.3.3
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following object is masked from 'package:gmodels':
##
## ci
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
library(ResourceSelection)
## Warning: package 'ResourceSelection' was built under R version 4.3.3
## ResourceSelection 0.3-6 2023-06-27
Model regresi logistik digunakan untuk memodelkan hubungan antara satu atau lebih variabel prediktor (bebas) dengan variabel respon biner (bernilai 0 atau 1). Regresi logistik sangat penting ketika: - Data respons bersifat kategorik dua nilai (contoh: sakit/tidak, lulus/gagal, beli/tidak beli). - Tujuan penelitian adalah untuk memprediksi probabilitas dari satu kejadian.
Ciri khas regresi logistik: - Menggunakan fungsi logit:\[ \text{logit}(p) = \log\left(\frac{p}{1 - p}\right) = \beta_0 + \beta_1 X_1 + \cdots + \beta_k X_k \] - Probabilitas kejadian dibatasi antara 0 dan 1. - Koefisien diinterpretasi sebagai log odds dan dapat dikonversi ke odds ratio.
Misalkan seorang peneliti ingin memprediksi apakah pasien berisiko mengalami penyakit jantung berdasarkan: - Usia (variabel numerik) - Jenis_Kelamin (faktor: L/P) - Perokok (faktor: Ya/Tidak)
set.seed(123)
n <- 200
data <- tibble(
Penyakit = rbinom(n, 1, 0.4),
Usia = rnorm(n, 50, 10),
Jenis_Kelamin = sample(c("L", "P"), n, replace = TRUE),
Perokok = sample(c("Ya", "Tidak"), n, replace = TRUE)
) %>%
mutate(Jenis_Kelamin = factor(Jenis_Kelamin),
Perokok = factor(Perokok))
model_full <- glm(Penyakit ~ Usia + Jenis_Kelamin + Perokok,
data = data, family = binomial)
summary(model_full)
##
## Call:
## glm(formula = Penyakit ~ Usia + Jenis_Kelamin + Perokok, family = binomial,
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.69718 0.82647 0.844 0.399
## Usia -0.01891 0.01547 -1.222 0.222
## Jenis_KelaminP 0.02476 0.29277 0.085 0.933
## PerokokYa -0.41950 0.29402 -1.427 0.154
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 267.50 on 199 degrees of freedom
## Residual deviance: 264.22 on 196 degrees of freedom
## AIC: 272.22
##
## Number of Fisher Scoring iterations: 4
exp(coef(model_full))
## (Intercept) Usia Jenis_KelaminP PerokokYa
## 2.0080742 0.9812694 1.0250684 0.6573780
roc_obj <- roc(data$Penyakit, fitted(model_full))
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_obj, main = "ROC Curve")
auc(roc_obj)
## Area under the curve: 0.58
null_model <- glm(Penyakit ~ 1, data = data, family = binomial)
1 - logLik(model_full)/logLik(null_model)
## 'log Lik.' 0.01227384 (df=4)
pred_class <- ifelse(fitted(model_full) > 0.5, 1, 0)
table(Prediksi = pred_class, Realita = data$Penyakit)
## Realita
## Prediksi 0 1
## 0 117 73
## 1 5 5
Hitung: -Akurasi = (TP + TN) / total - Sensitivitas = TP / (TP + FN) - Spesifisitas = TN / (TN + FP)
anova(null_model, model_full, test = "Chisq")
## Analysis of Deviance Table
##
## Model 1: Penyakit ~ 1
## Model 2: Penyakit ~ Usia + Jenis_Kelamin + Perokok
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 199 267.50
## 2 196 264.22 3 3.2832 0.35
model_step <- step(null_model, scope = list(lower = null_model, upper = model_full),
direction = "both", trace = FALSE)
summary(model_step)
##
## Call:
## glm(formula = Penyakit ~ 1, family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.4473 0.1450 -3.085 0.00203 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 267.5 on 199 degrees of freedom
## Residual deviance: 267.5 on 199 degrees of freedom
## AIC: 269.5
##
## Number of Fisher Scoring iterations: 4
Sensitivitas mengukur seberapa baik model mengenali kelas positif: \(\text{Sensitivitas} = \frac{\text{True Positives}}{\text{True Positives} + \text{False Negatives}}\)
Spesifisitas mengukur seberapa baik model mengenali kelas negatif: \(\text{Spesifisitas} = \frac{\text{True Negatives}}{\text{True Negatives} + \text{False Positives}}\)
ROC (Receiver Operating Characteristic) adalah grafik yang menunjukkan kinerja model klasifikasi biner dengan memplot True Positive Rate (Sensitivitas) terhadap False Positive Rate (1 - Spesifisitas). - Semakin mendekati sudut kiri atas, semakin baik model. - Luas di bawah kurva (AUC) digunakan sebagai indikator kualitas prediksi.
Precision (Presisi): \(\text{Precision} = \frac{\text{True Positives}}{\text{True Positives} + \text{False Positives}}\)
Recall (Sensitivitas) seperti sebelumnya: \(\text{Recall} = \frac{\text{True Positives}}{\text{True Positives} + \text{False Negatives}}\)
PR Curve memplot precision vs recall. Cocok digunakan pada data tidak seimbang (class imbalance).
library(PRROC)
## Warning: package 'PRROC' was built under R version 4.3.3
## Loading required package: rlang
##
## Attaching package: 'rlang'
## The following objects are masked from 'package:purrr':
##
## %@%, flatten, flatten_chr, flatten_dbl, flatten_int, flatten_lgl,
## flatten_raw, invoke, splice
## The following object is masked from 'package:tinytex':
##
## check_installed
pr <- pr.curve(scores.class0 = fitted(model_full)[data$Penyakit == 1],
scores.class1 = fitted(model_full)[data$Penyakit == 0],
curve = TRUE)
plot(pr)
Beberapa jenis pseudo R² yang umum: - McFadden: \(R^2 = 1 - \frac{\log L_1}{\log L_0}\)
Pseudo R² tidak sebanding langsung dengan R² pada regresi linear, namun tetap berguna untuk membandingkan model satu dengan yang lain.
Model terbaik bukan yang memiliki semua variabel, tetapi yang: - Secara teoritis masuk akal - Secara statistik signifikan - Memiliki performa yang baik dalam klasifikasi - Tidak kompleks berlebihan
library(nnet)
## Warning: package 'nnet' was built under R version 4.3.3
library(tidyverse)
library(kableExtra)
library(broom)
Distribusi multinomial adalah perpanjangan dari distribusi binomial, yang digunakan ketika hasil dari sebuah eksperimen terdiri dari lebih dari dua kategori. Dalam banyak kasus, kita tertarik tidak hanya mengetahui proporsi masing-masing kategori, tetapi juga bagaimana faktor-faktor tertentu memengaruhi probabilitas hasil tersebut.
Regresi logistik multinomial memungkinkan kita menganalisis pengaruh variabel prediktor terhadap kategori hasil nominal dengan lebih dari dua kelas. Ini sangat berguna dalam ilmu sosial, pemasaran, epidemiologi, dan bidang lainnya.
library(nnet)
library(tidyverse)
library(kableExtra)
library(broom)
Distribusi ini mengukur probabilitas hasil \((x_1, x_2, ..., x_k)\) dari \(n\) percobaan independen, di mana: - Terdapat \(k\) kategori hasil. - \(p_1, p_2, ..., p_k\) adalah probabilitas dari masing-masing kategori. - \(\sum x_i = n\), dan \(\sum p_i = 1\).
set.seed(123)
multi_data <- rmultinom(n = 1, size = 100, prob = c(0.4, 0.35, 0.25))
rownames(multi_data) <- c("Kategori A", "Kategori B", "Kategori C")
multi_data
## [,1]
## Kategori A 39
## Kategori B 36
## Kategori C 25
Interpretasi Output menunjukkan berapa banyak observasi yang masuk ke masing-masing kategori dari total 100 percobaan. Nilai ini bisa digunakan untuk menilai apakah suatu distribusi aktual mendekati distribusi teoritis.
Regresi logistik multinomial memodelkan log odds dari setiap kategori dibandingkan dengan baseline:
\[ \log\left(\frac{P(Y = j)}{P(Y = \text{baseline})}\right) = \beta_{0j} + \beta_{1j}X_1 + ... + \beta_{pj}X_p \]
Model ini digunakan ketika: - Variabel respon berupa kategori > 2. - Tidak ada urutan alami antar kategori (bukan ordinal).
Interpretasi Setiap koefisien menjelaskan pengaruh variabel prediktor terhadap log odds memilih suatu kategori dibandingkan kategori referensi (baseline).
Langkah ini menciptakan dataset buatan yang merepresentasikan hubungan antara variabel prediktor (pendidikan dan pekerjaan) dengan pilihan produk.
set.seed(42)
n <- 300
data_sim <- tibble(
pendidikan = sample(c("SD", "SMP", "SMA"), size = n, replace = TRUE),
pekerjaan = sample(c("PNS", "Swasta", "Wirausaha"), size = n, replace = TRUE),
pilihan = sample(c("Produk A", "Produk B", "Produk C"), size = n, replace = TRUE)
)
data_sim <- data_sim %>% mutate_all(as.factor)
glimpse(data_sim)
## Rows: 300
## Columns: 3
## $ pendidikan <fct> SD, SD, SD, SD, SMP, SMP, SMP, SD, SMA, SMA, SD, SD, SMP, S…
## $ pekerjaan <fct> PNS, Wirausaha, Swasta, PNS, PNS, PNS, Swasta, Wirausaha, S…
## $ pilihan <fct> Produk A, Produk B, Produk A, Produk B, Produk C, Produk B,…
Interpretasi Kita membuat data acak untuk menguji model regresi logistik multinomial. Ini penting untuk validasi model ketika tidak tersedia data asli.
Model dibangun menggunakan fungsi multinom() dari paket
nnet untuk memodelkan hubungan antara
pendidikan dan pekerjaan terhadap
pilihan.
model <- multinom(pilihan ~ pendidikan + pekerjaan, data = data_sim)
## # weights: 18 (10 variable)
## initial value 329.583687
## iter 10 value 326.321638
## final value 326.317009
## converged
summary(model)
## Call:
## multinom(formula = pilihan ~ pendidikan + pekerjaan, data = data_sim)
##
## Coefficients:
## (Intercept) pendidikanSMA pendidikanSMP pekerjaanSwasta
## Produk B -0.3397519 0.004365892 0.5928949 0.07331038
## Produk C -0.2868043 0.236203220 0.4501356 -0.03328531
## pekerjaanWirausaha
## Produk B 0.4636806
## Produk C 0.3292755
##
## Std. Errors:
## (Intercept) pendidikanSMA pendidikanSMP pekerjaanSwasta
## Produk B 0.3115648 0.3676008 0.3333752 0.3493966
## Produk C 0.3091808 0.3584827 0.3403224 0.3490471
## pekerjaanWirausaha
## Produk B 0.3598830
## Produk C 0.3591147
##
## Residual Deviance: 652.634
## AIC: 672.634
Interpretasi Hasil menampilkan koefisien estimasi log-odds masing-masing kategori terhadap baseline. Koefisien positif menunjukkan peningkatan log-odds terhadap baseline.
##Interpretasi Koefisien
tidy(model) %>%
kable(digits = 3, caption = "Koefisien Regresi Multinomial") %>%
kable_styling()
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
| y.level | term | estimate | std.error | statistic | p.value |
|---|---|---|---|---|---|
| Produk B | (Intercept) | -0.340 | 0.312 | -1.090 | 0.276 |
| Produk B | pendidikanSMA | 0.004 | 0.368 | 0.012 | 0.991 |
| Produk B | pendidikanSMP | 0.593 | 0.333 | 1.778 | 0.075 |
| Produk B | pekerjaanSwasta | 0.073 | 0.349 | 0.210 | 0.834 |
| Produk B | pekerjaanWirausaha | 0.464 | 0.360 | 1.288 | 0.198 |
| Produk C | (Intercept) | -0.287 | 0.309 | -0.928 | 0.354 |
| Produk C | pendidikanSMA | 0.236 | 0.358 | 0.659 | 0.510 |
| Produk C | pendidikanSMP | 0.450 | 0.340 | 1.323 | 0.186 |
| Produk C | pekerjaanSwasta | -0.033 | 0.349 | -0.095 | 0.924 |
| Produk C | pekerjaanWirausaha | 0.329 | 0.359 | 0.917 | 0.359 |
Interpretasi Setiap baris menunjukkan efek variabel prediktor terhadap log-odds memilih produk B atau C dibandingkan produk A (baseline). Koefisien signifikan menunjukkan pengaruh penting.
Kita menghitung nilai z dan p untuk menguji apakah koefisien berbeda secara signifikan dari nol.
z_val <- summary(model)$coefficients / summary(model)$standard.errors
p_val <- 2 * (1 - pnorm(abs(z_val)))
tibble(
Coef = as.vector(summary(model)$coefficients),
SE = as.vector(summary(model)$standard.errors),
Z = as.vector(z_val),
P = as.vector(p_val)
) %>%
mutate(Signif = ifelse(P < 0.05, "*", "")) %>%
kable(digits = 4, caption = "Uji Z dan P-Value") %>%
kable_styling()
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
| Coef | SE | Z | P | Signif |
|---|---|---|---|---|
| -0.3398 | 0.3116 | -1.0905 | 0.2755 | |
| -0.2868 | 0.3092 | -0.9276 | 0.3536 | |
| 0.0044 | 0.3676 | 0.0119 | 0.9905 | |
| 0.2362 | 0.3585 | 0.6589 | 0.5100 | |
| 0.5929 | 0.3334 | 1.7785 | 0.0753 | |
| 0.4501 | 0.3403 | 1.3227 | 0.1859 | |
| 0.0733 | 0.3494 | 0.2098 | 0.8338 | |
| -0.0333 | 0.3490 | -0.0954 | 0.9240 | |
| 0.4637 | 0.3599 | 1.2884 | 0.1976 | |
| 0.3293 | 0.3591 | 0.9169 | 0.3592 |
Interpretasi P-value < 0.05 menunjukkan bahwa koefisien signifikan secara statistik. Artinya, variabel tersebut memberikan kontribusi signifikan terhadap pemilihan kategori produk.
Kita mengevaluasi akurasi prediksi model dengan membandingkan hasil prediksi dan aktual.
prediksi <- predict(model, type = "class")
conf_mtx <- table(Prediksi = prediksi, Aktual = data_sim$pilihan)
conf_mtx
## Aktual
## Prediksi Produk A Produk B Produk C
## Produk A 44 34 39
## Produk B 39 61 49
## Produk C 14 8 12
akurasi <- sum(diag(conf_mtx)) / sum(conf_mtx)
akurasi
## [1] 0.39
Interpretasi Tabel konfusi menunjukkan jumlah prediksi yang benar dan salah. Akurasi memberikan ukuran kinerja model secara umum.
Visualisasi ini menunjukkan bagaimana probabilitas prediksi berubah berdasarkan kategori prediktor.
probs <- predict(model, type = "probs")
data_sim <- bind_cols(data_sim, as_tibble(probs))
data_long <- data_sim %>%
pivot_longer(cols = starts_with("Produk"), names_to = "Kategori", values_to = "Prob")
ggplot(data_long, aes(x = pekerjaan, y = Prob, fill = Kategori)) +
geom_boxplot() +
theme_minimal() +
labs(title = "Distribusi Probabilitas Tiap Produk berdasarkan Pekerjaan")
Interpretasi Plot menunjukkan penyebaran probabilitas pilihan produk
berdasarkan kategori pekerjaan. Kita dapat melihat pola prediksi dominan
berdasarkan prediktor tertentu.
library(MASS)
##
## Attaching package: 'MASS'
## The following object is masked from 'package:dplyr':
##
## select
library(tidyverse)
library(kableExtra)
library(broom)
Regresi logistik ordinal merupakan salah satu jenis regresi logistik yang digunakan ketika variabel dependen (respon) memiliki lebih dari dua kategori yang berurutan (ordinal). Ini berbeda dari regresi logistik multinomial yang digunakan untuk kategori tanpa urutan (nominal).
Model ini sangat cocok untuk data seperti: - Tingkat kepuasan pelanggan (Tidak Puas, Netral, Puas) - Tingkat pendidikan (SD, SMP, SMA) - Tingkat keparahan penyakit (Ringan, Sedang, Berat)
Model yang paling umum digunakan dalam regresi logistik ordinal adalah Model Logit Kumulatif (Cumulative Logit Model) atau Proportional Odds Model.
Model logit kumulatif memperkirakan peluang kumulatif suatu respon jatuh pada atau di bawah suatu kategori tertentu.
Persamaan matematis: \[ \log\left(\frac{P(Y \leq j)}{P(Y > j)}\right) = \theta_j - (\beta_1X_1 + \beta_2X_2 + ... + \beta_pX_p) \]
Keterangan: - \(Y\): variabel respon ordinal. - \(j\): urutan kategori. - \(\theta_j\): ambang batas antara kategori. - \(\beta\): koefisien regresi. - \(X_p\): prediktor.
Model ini mengasumsikan bahwa efek dari prediktor adalah konsisten di seluruh ambang batas kategori (proportional odds).
Kita akan membuat data simulasi untuk melihat bagaimana pendidikan dan pendapatan memengaruhi kepuasan pelanggan terhadap suatu layanan.
set.seed(123)
n <- 300
data_ord <- tibble(
pendidikan = sample(c("SD", "SMP", "SMA"), n, replace = TRUE),
pendapatan = sample(c("Rendah", "Sedang", "Tinggi"), n, replace = TRUE),
kepuasan = sample(c("Tidak Puas", "Netral", "Puas"), n, replace = TRUE, prob = c(0.3, 0.4, 0.3))
) %>%
mutate(
pendidikan = factor(pendidikan, ordered = TRUE, levels = c("SD", "SMP", "SMA")),
pendapatan = factor(pendapatan, ordered = TRUE, levels = c("Rendah", "Sedang", "Tinggi")),
kepuasan = factor(kepuasan, ordered = TRUE, levels = c("Tidak Puas", "Netral", "Puas"))
)
head(data_ord)
## # A tibble: 6 × 3
## pendidikan pendapatan kepuasan
## <ord> <ord> <ord>
## 1 SMA Sedang Netral
## 2 SMA Rendah Netral
## 3 SMA Sedang Netral
## 4 SMP Sedang Tidak Puas
## 5 SMA Sedang Tidak Puas
## 6 SMP Sedang Puas
Interpretasi Kita telah membuat data ordinal dengan tiga tingkat pendidikan dan pendapatan, serta tiga tingkat kepuasan pelanggan. Karena data ini bersifat ordinal, maka urutan kategori sangat penting dalam pemodelan.
Kita akan menggunakan fungsi polr() dari paket
MASS untuk melakukan regresi logistik ordinal terhadap
variabel kepuasan.
model_ord <- polr(kepuasan ~ pendidikan + pendapatan, data = data_ord, Hess = TRUE)
summary(model_ord)
## Call:
## polr(formula = kepuasan ~ pendidikan + pendapatan, data = data_ord,
## Hess = TRUE)
##
## Coefficients:
## Value Std. Error t value
## pendidikan.L -0.25288 0.1894 -1.3353
## pendidikan.Q -0.02220 0.1847 -0.1202
## pendapatan.L -0.04288 0.1881 -0.2279
## pendapatan.Q -0.17936 0.1860 -0.9645
##
## Intercepts:
## Value Std. Error t value
## Tidak Puas|Netral -0.9741 0.1302 -7.4814
## Netral|Puas 0.6786 0.1230 5.5166
##
## Residual Deviance: 650.6215
## AIC: 662.6215
Interpretasi - Koefisien positif artinya peningkatan variabel prediktor akan meningkatkan peluang masuk ke kategori yang lebih rendah. - Sebaliknya, koefisien negatif artinya peningkatan prediktor cenderung mendorong respon ke kategori yang lebih tinggi (misalnya dari “Netral” ke “Puas”). - Intercept (cutpoints) menunjukkan titik ambang antar kategori.
z <- coef(summary(model_ord))[, "Value"] / coef(summary(model_ord))[, "Std. Error"]
p <- 2 * (1 - pnorm(abs(z)))
coef_df <- cbind(coef(summary(model_ord)), "p value" = p)
kable(coef_df, digits = 4, caption = "Uji Signifikansi Koefisien Regresi Logistik Ordinal") %>%
kable_styling()
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
## Warning: 'xfun::attr()' is deprecated.
## Use 'xfun::attr2()' instead.
## See help("Deprecated")
| Value | Std. Error | t value | p value | |
|---|---|---|---|---|
| pendidikan.L | -0.2529 | 0.1894 | -1.3353 | 0.1818 |
| pendidikan.Q | -0.0222 | 0.1847 | -0.1202 | 0.9043 |
| pendapatan.L | -0.0429 | 0.1881 | -0.2279 | 0.8197 |
| pendapatan.Q | -0.1794 | 0.1860 | -0.9645 | 0.3348 |
| Tidak Puas|Netral | -0.9741 | 0.1302 | -7.4814 | 0.0000 |
| Netral|Puas | 0.6786 | 0.1230 | 5.5166 | 0.0000 |
Interpretasi - Nilai p < 0.05 menunjukkan bahwa variabel tersebut berpengaruh signifikan terhadap tingkat kepuasan. - Z-value yang besar (positif atau negatif) menunjukkan kekuatan hubungan yang lebih besar.
Kita akan membandingkan hasil prediksi dari model dengan data aktual untuk melihat performa model klasifikasi.
prediksi <- predict(model_ord, data_ord)
tab <- table(Prediksi = prediksi, Aktual = data_ord$kepuasan)
tab
## Aktual
## Prediksi Tidak Puas Netral Puas
## Tidak Puas 0 0 0
## Netral 70 109 87
## Puas 12 7 15
Interpretasi Tabel konfusi menunjukkan jumlah kasus yang diprediksi benar atau salah untuk setiap tingkat kepuasan. Semakin banyak nilai diagonal (prediksi benar), semakin baik model.
accuracy <- sum(diag(tab)) / sum(tab)
accuracy
## [1] 0.4133333
Interpretasi Akurasi menunjukkan proporsi prediksi yang benar. Ini adalah ukuran sederhana untuk menilai performa model secara keseluruhan.
Model ini sangat berguna dalam survei sosial, analisis pelanggan, penelitian pendidikan, dan bidang lain yang melibatkan data kategorik berurutan.
library(MASS)
library(tidyverse)
library(kableExtra)
library(broom)
Model log-linear adalah model statistik yang digunakan untuk menganalisis hubungan antara variabel-variabel kategorik dalam bentuk tabel kontingensi, khususnya frekuensi dalam setiap kombinasi kategori. Model ini tidak menetapkan satu variabel sebagai respon; semua variabel dianggap setara.
Log-linear model sangat relevan untuk data dengan dua arah atau lebih, dan cocok digunakan dalam eksplorasi hubungan tanpa asumsi sebab-akibat langsung. Ini berbeda dengan regresi logistik yang membutuhkan satu variabel dependen.
Misal kita punya dua variabel kategorik: Gender (Male, Female) dan Preference (Yes, No).
data <- matrix(c(40, 60, 30, 70), nrow = 2, byrow = TRUE)
dimnames(data) <- list(Gender = c("Male", "Female"),
Preference = c("Yes", "No"))
ftable(data)
## Preference Yes No
## Gender
## Male 40 60
## Female 30 70
Model loglinier: \[ \log(\mu_{ij}) = \lambda + \lambda_i^{(A)} + \lambda_j^{(B)} + \lambda_{ij}^{(AB)} \]
Model saturated adalah model yang memuat semua interaksi antar variabel dan sepenuhnya menyesuaikan data.
model_sat <- loglm(~ Gender * Preference, data = data)
summary(model_sat)
## Formula:
## ~Gender * Preference
## attr(,"variables")
## list(Gender, Preference)
## attr(,"factors")
## Gender Preference Gender:Preference
## Gender 1 0 1
## Preference 0 1 1
## attr(,"term.labels")
## [1] "Gender" "Preference" "Gender:Preference"
## attr(,"order")
## [1] 1 1 2
## attr(,"intercept")
## [1] 1
## attr(,"response")
## [1] 0
## attr(,".Environment")
## <environment: R_GlobalEnv>
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 0 0 1
## Pearson 0 0 1
Model ini tidak menyisakan residual → perfect fit.
Model independen hanya mempertimbangkan efek utama tanpa interaksi.
model_indep <- loglm(~ Gender + Preference, data = data)
summary(model_indep)
## Formula:
## ~Gender + Preference
## attr(,"variables")
## list(Gender, Preference)
## attr(,"factors")
## Gender Preference
## Gender 1 0
## Preference 0 1
## attr(,"term.labels")
## [1] "Gender" "Preference"
## attr(,"order")
## [1] 1 1
## attr(,"intercept")
## [1] 1
## attr(,"response")
## [1] 0
## attr(,".Environment")
## <environment: R_GlobalEnv>
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 2.203462 1 0.1377012
## Pearson 2.197802 1 0.1382077
Jika p-value < 0.05, berarti model independen tidak sesuai.
\[ OR = \frac{n_{11} \cdot n_{22}}{n_{12} \cdot n_{21}} = \frac{40 \cdot 70}{60 \cdot 30} \]
OR <- (40 * 70) / (60 * 30)
logOR <- log(OR)
OR
## [1] 1.555556
logOR
## [1] 0.4418328
Interpretasi: - OR > 1 → asosiasi positif antara Gender dan Preference. - logOR menunjukkan kekuatan hubungan dalam skala log.
Estimasi parameter log-linear dilakukan menggunakan metode iterative proportional fitting (IPF).
coef(model_sat)
## $`(Intercept)`
## [1] 3.858229
##
## $Gender
## Male Female
## 0.03338285 -0.03338285
##
## $Preference
## Yes No
## -0.3131907 0.3131907
##
## $Gender.Preference
## Preference
## Gender Yes No
## Male 0.1104582 -0.1104582
## Female -0.1104582 0.1104582
Setiap parameter menunjukkan efek log dari masing-masing kombinasi variabel.
Gunakan likelihood ratio test (LRT) untuk membandingkan model.
anova(model_indep, model_sat)
## LR tests for hierarchical log-linear models
##
## Model 1:
## ~Gender + Preference
## Model 2:
## ~Gender * Preference
##
## Deviance df Delta(Dev) Delta(df) P(> Delta(Dev)
## Model 1 2.203462 1
## Model 2 0.000000 0 2.203462 1 0.1377
## Saturated 0.000000 0 0.000000 0 1.0000
Jika p-value < 0.05 → model independen tidak memadai → interaksi signifikan.
Latar Belakang Sebuah survei dilakukan untuk mengetahui preferensi makanan (Vegetarian, Non-Vegetarian) berdasarkan kelompok umur (Remaja, Dewasa, Lansia) dan jenis kelamin (Pria, Wanita). Tujuan analisis adalah untuk mengetahui apakah terdapat hubungan tiga arah antara preferensi, umur, dan jenis kelamin.
# Data dalam format data.frame
umur <- rep(c("Remaja", "Dewasa", "Lansia"), each = 4)
gender <- rep(c("Pria", "Wanita"), times = 6)
preferensi <- rep(c("Vegetarian", "Non-Vegetarian"), each = 2, times = 3)
count <- c(30, 50, 40, 60, 20, 25, 40, 20, 50, 30, 30, 15)
df_makanan <- data.frame(Umur = umur, Gender = gender, Preferensi = preferensi, Count = count)
# Melatih model saturated
library(MASS)
model_saturated <- loglm(Count ~ Umur * Gender * Preferensi, data = df_makanan)
summary(model_saturated)
## Formula:
## Count ~ Umur * Gender * Preferensi
## attr(,"variables")
## list(Count, Umur, Gender, Preferensi)
## attr(,"factors")
## Umur Gender Preferensi Umur:Gender Umur:Preferensi Gender:Preferensi
## Count 0 0 0 0 0 0
## Umur 1 0 0 1 1 0
## Gender 0 1 0 1 0 1
## Preferensi 0 0 1 0 1 1
## Umur:Gender:Preferensi
## Count 0
## Umur 1
## Gender 1
## Preferensi 1
## attr(,"term.labels")
## [1] "Umur" "Gender" "Preferensi"
## [4] "Umur:Gender" "Umur:Preferensi" "Gender:Preferensi"
## [7] "Umur:Gender:Preferensi"
## attr(,"order")
## [1] 1 1 1 2 2 2 3
## attr(,"intercept")
## [1] 1
## attr(,"response")
## [1] 1
## attr(,".Environment")
## <environment: R_GlobalEnv>
## attr(,"predvars")
## list(Count, Umur, Gender, Preferensi)
## attr(,"dataClasses")
## Count Umur Gender Preferensi
## "numeric" "character" "character" "character"
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 0 0 1
## Pearson 0 0 1
# Bandingkan dengan model tanpa interaksi tiga arah
model_tanpa_3arah <- loglm(Count ~ (Umur + Gender + Preferensi)^2, data = df_makanan)
anova(model_tanpa_3arah, model_saturated)
## LR tests for hierarchical log-linear models
##
## Model 1:
## Count ~ (Umur + Gender + Preferensi)^2
## Model 2:
## Count ~ Umur * Gender * Preferensi
##
## Deviance df Delta(Dev) Delta(df) P(> Delta(Dev)
## Model 1 2.783468 2
## Model 2 0.000000 0 2.783468 2 0.24864
## Saturated 0.000000 0 0.000000 0 1.00000
Interpretasi Hasil Model Saturated: Menyediakan fit sempurna terhadap data → semua interaksi dipertimbangkan.
Perbandingan Model: - Jika p-value dari anova kecil → interaksi tiga arah signifikan → ada hubungan kompleks antara semua variabel. - Jika tidak signifikan → model dua arah cukup.
Agresti, A. (2019). Statistical Methods for the Social Sciences (5th ed.). Pearson.
Christensen, R. (1997). Log-Linear Models and Logistic Regression. Springer.
Dobson, A. J., & Barnett, A. G. (2018). An Introduction to Generalized Linear Models (4th ed.).
Fox, J., & Weisberg, S. (2019). An R Companion to Applied Regression (3rd ed.). SAGE Publications.
Menard, S. (2002). Applied Logistic Regression Analysis (2nd ed.). Sage Publications.
Moore, D. S., Notz, W. I., & Fligner, M. A. (2013). The Basic Practice of Statistics (6th ed.). W.H. Freeman.
James, G., Witten, D., Hastie, T., & Tibshirani, R. (2021). An Introduction to Statistical Learning (2nd ed.). Springer.
Kleinbaum, D. G., & Klein, M. (2010). Logistic Regression: A Self-Learning Text (3rd ed.). Springer.
R Core Team (2023). R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing, Vienna, Austria. https://www.r-project.org
Szklo, M., & Nieto, F. J. (2014). Epidemiology: Beyond the Basics (3rd ed.). Jones & Bartlett Learning.
Wickham, H., & Grolemund, G. (2017). R for Data Science: Import, Tidy, Transform, Visualize, and Model Data. O’Reilly Media.