Dalam dunia statistik, data kategori merupakan jenis data yang dikategorikan berdasarkan atribut atau kualitas tertentu. Data kategori, yang sering disebut dengan data kualitatif, tidak memiliki nilai numerik yang inheren, melainkan merepresentasikan kelas atau grup (misalnya, jenis kelamin, status perkawinan, preferensi produk, dsb). Analisis data kategori penting untuk memahami distribusi frekuensi, hubungan antar variabel, serta pengambilan keputusan berdasarkan sebaran data yang tidak berurutan dan tidak kontinu.
Seiring dengan perkembangan teknologi informasi, pengolahan data kategori telah menemukan aplikasinya di berbagai bidang seperti pemasaran, epidemiologi, psikologi, dan ilmu sosial. Analisis ini tidak hanya berguna untuk memprediksi pola-pola yang ada, tetapi juga untuk menguji hipotesis terkait asosiasi antar variabel kategori, misalnya dengan uji chi-square pada tabel kontingensi.
Dalam bab ini, kita akan membahas bagaimana mendefinisikan probabilitas pada data kategori serta mengenal beberapa distribusi probabilitas utama yang digunakan, seperti distribusi binomial dan distribusi multinomial. Pemahaman yang mendalam mengenai dasar-dasar probabilitas dan penerapannya pada data kategori akan memberikan pijakan yang kuat untuk melakukan analisis lebih lanjut, seperti pengujian hipotesis dan inferensi statistik.
Tujuan dari Analisis Data Kategori Analisis data kategori bertujuan untuk mengungkap informasi yang mendalam dari data yang terbagi dalam kelompok-kelompok (kategori) yang tidak bersifat numerik secara kontinu. Secara umum, tujuan utama analisis data kategori meliputi:
Mengidentifikasi Pola dan Frekuensi Analisis ini digunakan untuk mengetahui berapa kali masing-masing kategori muncul dalam sebuah populasi atau sampel. Dengan mempelajari distribusi frekuensi, kita dapat mengidentifikasi pola, kecenderungan, serta keunikan dari tiap kategori. Hal ini sangat penting dalam memahami bagaimana data tersebar dan menentukan karakteristik utama dari kelompok data tersebut.
Pengambilan Keputusan dan Strategi Bisnis Data kategori banyak diaplikasikan dalam bisnis, pemasaran, dan pengambilan keputusan strategis. Dengan menganalisis data kategori, perusahaan dapat mengidentifikasi segmen pasar, mengukur respon pelanggan terhadap suatu produk, atau menentukan target audiens yang tepat. Informasi ini membantu dalam mengarahkan strategi pemasaran dan pengembangan produk.
Mengukur Hubungan Antar Variabel Kategori Seringkali, analisis data kategori dilakukan untuk mengevaluasi apakah terdapat hubungan atau asosiasi antara dua variabel kategori. Misalnya, apakah terdapat hubungan antara jenis kelamin dan preferensi produk. Uji chi-square adalah salah satu metode yang umum digunakan untuk menguji signifikansi hubungan tersebut.
Segmentasi dan Pengelompokan Data Tujuan lain adalah untuk melakukan segmentasi—memisahkan data menjadi kelompok-kelompok berdasarkan karakteristik tertentu. Segmentasi ini sangat berguna dalam analisis perilaku konsumen, studi demografis, serta penentuan profil risiko dalam dunia kesehatan dan asuransi.
Validasi Hipotesis dan Penelitian Dalam penelitian sosial dan ilmu kesehatan, analisis data kategori digunakan untuk menguji hipotesis mengenai hubungan antar atribut. Misalnya, apakah ada perbedaan tingkat kepuasan antara dua atau lebih kelompok konsumen. Dengan uji statistik yang tepat (seperti chi-square atau analisis regresi logistik untuk data kategori), peneliti dapat menarik kesimpulan yang signifikan secara statistik.
Penyederhanaan Informasi Data kategori memungkinkan penyajian informasi dalam format yang lebih sederhana dan mudah dipahami (misalnya, dalam tabel distribusi atau grafik batang). Hal ini sangat membantu dalam komunikasi hasil analisis kepada pemangku kepentingan yang mungkin tidak memiliki latar belakang statistik yang mendalam.
Analisis data kategori (kualitatif) berfokus pada data yang diklasifikasikan dalam grup atau kategori (seperti jenis kelamin, preferensi produk, tingkat kepuasan, dan lain-lain). Metode-metode analisis kategori bervariasi, dari yang bersifat deskriptif hingga inferensial, guna mengungkap pola, hubungan antar variabel, dan pengaruh faktor-faktor terhadap keputusan atau fenomena yang diteliti.
Tujuan:
Menjelaskan distribusi data dengan menyajikan:
Tabel frekuensi
Persentase dan proporsi
Visualisasi dengan grafik (bar chart, pie chart)
Contoh Implementasi dalam R:
# Membuat data kategori contoh
kategori <- c("Laki-laki", "Perempuan", "Laki-laki", "Laki-laki", "Perempuan",
"Perempuan", "Laki-laki", "Perempuan")
# Menghitung frekuensi masing-masing kategori
frekuensi <- table(kategori)
print(frekuensi) # Tampilkan tabel frekuensi
## kategori
## Laki-laki Perempuan
## 4 4
# Menghitung proporsi
proporsi <- prop.table(frekuensi)
print(proporsi) # Tampilkan proporsi masing-masing kategori
## kategori
## Laki-laki Perempuan
## 0.5 0.5
# Visualisasi dengan grafik batang
barplot(frekuensi, main = "Frekuensi Kategori", col = "skyblue",
ylab = "Jumlah", xlab = "Kategori")
# Visualisasi dengan diagram lingkaran (pie chart)
pie(frekuensi, main = "Proporsi Kategori")
Penjelasan:
Fungsi table() menghitung jumlah kemunculan tiap
kategori.
Fungsi prop.table() mengonversi frekuensi menjadi
proporsi.
barplot() dan pie() memberikan gambaran
visual untuk memudahkan interpretasi data.
Tujuan:
Menguji apakah ada hubungan atau asosiasi yang signifikan antara dua
variabel kategori. Uji chi-square sering digunakan pada tabel
kontingensi.
Contoh Implementasi dalam R:
# Membuat data tabel kontingensi contoh: jenis kelamin dan pilihan produk
data <- matrix(c(30, 20, 15, 35), nrow = 2, byrow = TRUE)
rownames(data) <- c("Laki-laki", "Perempuan")
colnames(data) <- c("Produk A", "Produk B")
print(data) # Tampilkan tabel kontingensi
## Produk A Produk B
## Laki-laki 30 20
## Perempuan 15 35
# Melakukan uji chi-square
uji_chi <- chisq.test(data)
print(uji_chi) # Hasil uji chi-square (nilai chi-square, df, dan p-value)
##
## Pearson's Chi-squared test with Yates' continuity correction
##
## data: data
## X-squared = 7.9192, df = 1, p-value = 0.004891
Penjelasan:
Data dimasukkan dalam bentuk matriks dengan dua variabel kategori.
chisq.test() mengevaluasi apakah distribusi
frekuensi antara variabel adalah independen atau tidak.
Tujuan:
Memprediksi probabilitas suatu kejadian (biasanya hasil biner, misalnya
sukses/gagal) berdasarkan satu atau lebih prediktor. Analisis ini sangat
berguna ketika variabel dependen memiliki dua kategori.
Contoh Implementasi dalam R:
# Membuat dataset contoh dengan variabel prediktor
data <- data.frame(
usia = c(25, 30, 35, 40, 45, 50, 55, 60),
pendidikan = c(1, 2, 2, 3, 3, 2, 1, 3), # misal 1: sarjana, 2: magister, 3: doktor
sukses = c(0, 0, 1, 1, 1, 0, 1, 1)
)
# Mengubah variabel 'sukses' ke faktor (biner)
data$sukses <- factor(data$sukses, levels = c(0, 1))
# Membangun model regresi logistik
model_logistik <- glm(sukses ~ usia + pendidikan, data = data, family = binomial)
summary(model_logistik) # Ringkasan model: koefisien dan signifikansi
##
## Call:
## glm(formula = sukses ~ usia + pendidikan, family = binomial,
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -6.49461 5.15384 -1.260 0.208
## usia 0.10461 0.09265 1.129 0.259
## pendidikan 1.31808 1.37687 0.957 0.338
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 10.5850 on 7 degrees of freedom
## Residual deviance: 7.2397 on 5 degrees of freedom
## AIC: 13.24
##
## Number of Fisher Scoring iterations: 5
Penjelasan:
Variabel sukses diubah menjadi faktor karena berisi
dua kategori (misal: 0 = gagal, 1 = sukses).
glm() dengan family = binomial
digunakan untuk mengestimasi model regresi logistik.
Hasil summary() memberikan informasi tentang
signifikansi masing-masing prediktor.
Tujuan:
Memodelkan probabilitas hasil yang memiliki lebih dari dua kategori. Ini
adalah generalisasi dari regresi logistik untuk variabel dependen dengan
banyak kategori.
Contoh Implementasi dalam R:
# Instal dan muat paket nnet (jika belum terinstal)
# install.packages("nnet")
library(nnet)
# Dataset contoh dengan variabel 'pilihan' yang memiliki tiga kategori (A, B, C)
data2 <- data.frame(
usia = c(25, 30, 35, 40, 45, 50, 55, 60, 28, 33, 38, 43),
pilihan = factor(c("A", "B", "C", "A", "B", "C", "A", "B", "C", "A", "B", "C"))
)
# Membangun model regresi logistik multinomial
model_multinom <- multinom(pilihan ~ usia, data = data2)
## # weights: 9 (4 variable)
## initial value 13.183347
## iter 10 value 12.916263
## final value 12.916019
## converged
summary(model_multinom) # Menampilkan ringkasan model
## Call:
## multinom(formula = pilihan ~ usia, data = data2)
##
## Coefficients:
## (Intercept) usia
## B -1.8958599 0.046603211
## C -0.2925773 0.007573572
##
## Std. Errors:
## (Intercept) usia
## B 2.946813 0.07041249
## C 2.835568 0.07110418
##
## Residual Deviance: 25.83204
## AIC: 33.83204
Penjelasan:
Paket nnet menyediakan fungsi
multinom() untuk regresi logistik multinomial.
Variabel dependen pilihan memiliki tiga kategori,
dan model mengestimasikan pengaruh usia terhadap pilihan
tersebut.
Tujuan:
Mengukur kekuatan asosiasi antara dua variabel kategori, memberikan
nilai antara 0 (tidak ada asosiasi) hingga 1 (asosiasi sempurna).
Contoh Implementasi dalam R:
# Pasang paket DescTools (jika belum ada)
install.packages("DescTools")
## Installing package into 'C:/Users/Ghozzy/AppData/Local/R/win-library/4.4'
## (as 'lib' is unspecified)
## package 'DescTools' successfully unpacked and MD5 sums checked
##
## The downloaded binary packages are in
## C:\Users\Ghozzy\AppData\Local\Temp\RtmpiEqHHx\downloaded_packages
library(DescTools)
## Warning: package 'DescTools' was built under R version 4.4.3
# Contoh data tabel kontingensi
data <- matrix(c(30, 20, 15, 35), nrow = 2, byrow = TRUE)
rownames(data) <- c("Laki-laki", "Perempuan")
colnames(data) <- c("Produk A", "Produk B")
print(data)
## Produk A Produk B
## Laki-laki 30 20
## Perempuan 15 35
# Menghitung Cramér's V
cramers_v <- CramerV(data)
print(cramers_v)
## [1] 0.3015113
Penjelasan:
Data berupa matriks (tabel kontingensi) dibuat untuk dua variabel kategori.
Fungsi CramerV() digunakan untuk menghitung nilai
asosiasi antara variabel-variabel tersebut.
Distribusi binomial digunakan untuk menghitung probabilitas dari suatu jumlah sukses 𝑥 dalam 𝑛 percobaan, dengan probabilitas sukses 𝑝 di setiap percobaan. Secara matematis rumusnya adalah:
\[ P(X = x) = \binom{n}{x} p^x (1 - p)^{n - x} \]
Berikut adalah contoh kode R menggunakan fungsi dbinom()
untuk menghitung probabilitas tersebut:
# Definisi parameter untuk distribusi binomial:
n <- 10 # jumlah percobaan
p <- 0.3 # probabilitas sukses per percobaan
x <- 4 # jumlah sukses yang ingin dihitung probabilitasnya
# Menghitung probabilitas tepat mendapatkan x sukses dari n percobaan
prob_binom <- dbinom(x, size = n, prob = p)
# Menampilkan hasil perhitungan probabilitas
print(prob_binom)
## [1] 0.2001209
n <- 10 menyatakan jumlah percobaan yang
dilakukan.p <- 0.3 menyatakan probabilitas sukses pada setiap
percobaan.x <- 4 adalah jumlah sukses yang ingin dihitung
probabilitasnya.dbinom(x, size = n, prob = p) menghitung nilai
dari P(X=4) menggunakan rumus distribusi binomial.print(prob_binom).Distribusi multinomial merupakan perluasan dari distribusi binomial ke lebih dari dua kategori. Misalkan terdapat 𝑘kategori dengan probabilitas 𝑝1,𝑝2,…,𝑝𝑘 sehingga ∑𝑝𝑖= 1 dan total percobaan 𝑛. Probabilitas terjadinya distribusi hasil (𝑥1,𝑥2,…,𝑥𝑘)dihitung dengan rumus:
\[ P(X_1 = x_1, X_2 = x_2, \ldots, 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} \]
Berikut adalah contoh kode R menggunakan fungsi dmultinom() untuk menghitung probabilitas tersebut
# Definisi parameter untuk distribusi multinomial:
# Probabilitas masing-masing kategori
p1 <- 0.4
p2 <- 0.35
p3 <- 0.25
pvec <- c(p1, p2, p3) # vektor probabilitas, jumlahnya harus 1
# Jumlah total percobaan (misalnya, 20 observasi)
n <- 20
# Jumlah kejadian untuk masing-masing kategori
# Misalnya: 8 kejadian untuk kategori 1, 7 untuk kategori 2, dan 5 untuk kategori 3
x <- c(8, 7, 5)
# Menghitung probabilitas distribusi multinomial
prob_multinom <- dmultinom(x, size = n, prob = pvec)
# Menampilkan hasil perhitungan probabilitas
print(prob_multinom)
## [1] 0.04108172
Penjelasan Kode:
pvec merupakan vektor yang berisi probabilitas
masing-masing kategori, yang harus memenuhi p1+p2+p3=1
n <- 20 menyatakan total jumlah percobaan atau
observasi.
x <- c(8, 7, 5) adalah vektor jumlah kejadian
untuk masing-masing kategori. Pastikan jumlah elemen dalam
x sama dengan panjang pvec dan totalnya harus
sama dengan n (8+7+5 = 20).
Fungsi dmultinom(x, size = n, prob = pvec)
menghitung probabilitas tepat dari munculnya distribusi data sesuai
dengan nilai yang ditentukan.
Hasil probabilitas ditampilkan dengan
print(prob_multinom).
Distribusi Bernoulli adalah distribusi probabilitas diskret yang hanya memiliki dua kemungkinan hasil, yaitu “sukses” (biasanya dinyatakan dengan 1) dan “gagal” (dinotasikan dengan 0). Distribusi Bernoulli merupakan kasus khusus dari distribusi binomial dengan n=1 . Rumus untuk distribusi Bernoulli dinyatakan sebagai:
\[ P(X = x) = \begin{cases} p & \text{jika } x = 1 \\ 1 - p & \text{jika } x = 0 \end{cases} \]
dimana 𝑝adalah probabilitas sukses.
Implementasi dalam R : Walaupun tidak ada fungsi khusus untuk distribusi Bernoulli di R, kita dapat menggunakannya dengan fungsi dbinom() dengan parameter size = 1.
# Definisi parameter untuk distribusi Bernoulli
p <- 0.7 # probabilitas sukses
x <- 1 # hasil yang ingin dihitung (1 = sukses, 0 = gagal)
# Menghitung probabilitas dengan dbinom untuk n = 1 (Bernoulli)
prob_bernoulli <- dbinom(x, size = 1, prob = p)
print(paste("Probabilitas sukses (x = 1) =", prob_bernoulli))
## [1] "Probabilitas sukses (x = 1) = 0.7"
# Jika ingin menghitung probabilitas gagal (x = 0)
x <- 0
prob_bernoulli_gagal <- dbinom(x, size = 1, prob = p)
print(paste("Probabilitas gagal (x = 0) =", prob_bernoulli_gagal))
## [1] "Probabilitas gagal (x = 0) = 0.3"
Penjelasan:
- Probabilitas mendapatkan sukses (x=1x = 1x=1) adalah 0.7.
- Probabilitas gagal (x=0x = 0x=0) adalah 0.3.
dbinom(x, size = 1, prob = p) menghitung
probabilitas sesuai dengan rumus distribusi Bernoulli.Distribusi Poisson digunakan untuk menggambarkan probabilitas terjadinya sejumlah peristiwa (kejadian) dalam interval waktu atau ruang tertentu ketika peristiwa tersebut terjadi secara independen dengan rata-rata (laju) konstan. Rumus distribusi Poisson dinyatakan sebagai:
\[ P(X = x) = \frac{{\lambda^x e^{-\lambda}}}{{x!}} \]
di mana:
𝜆 adalah rata-rata (atau laju) kejadian per interval. 𝑥 adalah jumlah kejadian. 𝑒adalah bilangan natural (sekitar 2.71828).
Implementasi dalam R : R menyediakan fungsi dpois() untuk menghitung probabilitas menurut distribusi Poisson.
# Definisi parameter untuk distribusi Poisson
lambda <- 3 # rata-rata jumlah kejadian dalam suatu interval
x <- 2 # jumlah kejadian yang ingin dihitung probabilitasnya
# Menghitung probabilitas menggunakan dpois
prob_poisson <- dpois(x, lambda = lambda)
print(paste("Probabilitas mendapatkan", x, "kejadian =", prob_poisson))
## [1] "Probabilitas mendapatkan 2 kejadian = 0.224041807655388"
Penjelasan:
- Fungsi `dpois(x, lambda = lambda)` menghitung probabilitas terjadinya tepat 2 kejadian.
Desain sampling adalah salah satu komponen penting yang sangat berpengaruh dalam menentukan validitas dan daya generalisasi hasil analisis. Pada analisis data kategori, pemilihan desain sampling yang tepat dapat memastikan bahwa sampel yang diambil benar-benar mewakili karakteristik populasi. Dalam bab ini akan dibahas dua pendekatan utama, yaitu prospective sampling dan retrospective sampling, diikuti dengan contoh jenis-jenis penelitian eksperimental maupun observasional seperti studi eksperimen, studi kohort, dan studi kasus-kontrol.
Prospective sampling merupakan desain sampling di mana subjek penelitian dipilih dan kemudian diikuti secara berkelanjutan untuk melihat perkembangan atau kejadian tertentu di masa mendatang. Dalam konteks analisis data kategori:
**Keuntungan:**
- Memungkinkan peneliti untuk mendapatkan data kategori *real-time* atau *as it happens*.
- Mengurangi potensi bias memori (recall bias) karena data dikumpulkan secara prospektif.
- Membutuhkan waktu pengumpulan data yang lebih lama.
- Membutuhkan biaya operasional yang besar, terutama jika sampel berukuran besar atau tersebar.
Contoh penerapan dalam penelitian:
Studi kohort tentang perkembangan penyakit tertentu pada sekelompok orang yang diawasi dalam kurun waktu 5–10 tahun, untuk melihat siapa saja yang akhirnya mengembangkan penyakit (outcome) dan siapa yang tidak.
Berbeda dengan prospective sampling, retrospective sampling mengumpulkan data berdasarkan kejadian yang telah terjadi. Peneliti sering memanfaatkan data sekunder (misalnya, rekam medis atau catatan survei) untuk menentukan status subjek dalam kategori tertentu.
Definisi
Peneliti mulai dari outcome (misalnya kategori “sakit” vs. “tidak
sakit”) dan kemudian menelusuri kembali faktor-faktor yang berpotensi
menjadi penyebab atau karakteristik pendukung (misalnya riwayat
penggunaan obat, riwayat perilaku).
Keuntungan
- Umumnya lebih cepat dan lebih hemat biaya karena data telah tersedia.
- Cocok untuk penelitian penyakit langka atau kejadian yang sudah lewat.
- Rentan terhadap bias memori (recall bias), karena data bergantung pada ingatan atau catatan lampau.
- Kualitas data tergantung pada kelengkapan dan ketepatan sumber sekunder.
*Studi kasus-kontrol*, di mana sekelompok orang dengan kondisi tertentu (kasus) dibandingkan dengan kelompok lain tanpa kondisi tersebut (kontrol) untuk menilai perbedaan faktor risiko di masa lalu.
Pada desain eksperimen, peneliti melakukan intervensi atau perlakuan tertentu terhadap subjek, kemudian mengamati efek intervensi tersebut pada variabel kategori (misalnya, berhasil/gagal, setuju/tidak setuju). Contoh klasiknya adalah uji klinis (clinical trial) yang membandingkan kelompok yang menerima obat baru dengan kelompok yang menerima plasebo.
- Ada manipulasi variabel bebas oleh peneliti.
- Ada kelompok kontrol dan/atau pembanding.
- Mampu menunjukkan hubungan sebab-akibat.
- Dapat mengontrol faktor pengganggu (confounding) melalui randomisasi dan perancangan eksperimen yang tepat.
- Biaya tinggi dan tidak selalu etis atau memungkinkan, tergantung pada intervensi yang diuji.
Pada penelitian observasional, peneliti tidak melakukan intervensi dan hanya mencatat fenomena apa adanya. Terdapat beberapa bentuk, antara lain:
Studi Kohort (Prospective):
Peneliti mengikuti sekelompok orang (kohort) yang dibedakan berdasarkan
paparan (exposure) tertentu, lalu mencatat outcome yang mungkin
muncul.
Studi Kasus-Kontrol (Retrospective):
Ditekankan pada identifikasi faktor risiko di masa lalu dengan
membandingkan kelompok kasus (memiliki outcome) dan kelompok kontrol
(tidak memiliki outcome).
Studi Cross-Sectional:
Mengamati populasi pada satu titik waktu untuk melihat prevalensi
kategori tertentu (misalnya frekuensi kejadian penyakit atau preferensi
produk).
Dalam analisis data kategori, desain sampling berpengaruh terhadap:
Distribusi Kategori:
Pemilihan sampel secara prospektif atau retrospektif dapat mempengaruhi
proporsi kategori dalam sampel (contoh: jumlah subjek yang “terpapar”
vs. “tidak terpapar”).
Pemilihan Uji Statistik:
- Studi Prospektif (kohort) sering menggunakan *relative risk* atau model regresi logistik.
- Studi Retrospektif (kasus-kontrol) sering menggunakan *odds ratio* sebagai ukuran efek.
Kesimpulan Inferensial:
Penelitian eksperimental dapat menghasilkan bukti kausalitas yang lebih kuat.
Penelitian observasional memberikan gambaran asosiasi tetapi tidak selalu dapat menentukan kausalitas.
Kesimpulan
Relevansi Desain Sampling:
Memilih desain sampling yang tepat (prospektif atau retrospektif) sangat
menentukan kualitas, efisiensi, serta daya inferensi hasil analisis data
kategori.
Perbedaan Kunci:
Prospective sampling berguna untuk mengurangi bias memori, namun
memerlukan waktu yang lama; sedangkan retrospective sampling lebih
cepat, tetapi rentan terhadap ketidakakuratan data masa lalu.
Integrasi dengan Jenis Penelitian:
Baik pendekatan eksperimental maupun observasional (studi kohort,
kasus-kontrol, dan cross-sectional) dapat dikombinasikan dengan desain
sampling yang tepat untuk meningkatkan validitas hasil analisis data
kategori.
Dalam analisis data kategori, Tabel Kontingensi 2 x 2 merupakan alat yang efektif untuk menguji adanya hubungan antara dua variabel kategorik. Misalnya, ini adalah tabel hasil klasifikasi positif vs. negatif Analisis Sentimen Masyarakat Indonesia Tentang Pembelajaran Tatap Muka Pada Masa Pandemi Covid-19 dibandingkan dengan kondisi aktual yang diketahui, Sumber data: https://ejournal.undiksha.ac.id/index.php/JST/article/view/51899/26005 , Data nya seperti berikut:
| Prediksi Positif | Prediksi Negatif | Total | |
|---|---|---|---|
| Aktual Positif | 196 | 2 | 198 |
| Aktual Negatif | 20 | 82 | 102 |
| Total | 216 | 84 | 300 |
Peluang bersama (joint probability) mengacu pada probabilitas bahwa dua kejadian A dan B terjadi bersamaan. Jika \(X\) adalah variabel kategori “Aktual” dan \(Y\) adalah variabel kategori “Prediksi”, maka peluang bersama \(\Pr(X = i, Y = j)\) untuk sel \((i, j)\) dapat dihitung dengan:
\[ \Pr(X = i, Y = j) = \frac{\text{Frekuensi pada sel } (i, j)}{N}. \]
Contoh Perhitungan di R:
a <- 196
b <- 2
c <- 20
d <- 82
N <- a + b + c + d # total = 300
p_a <- a / N # P(Aktual Positif, Prediksi Positif)
p_b <- b / N
p_c <- c / N
p_d <- d / N
p_a # 0.6533...
## [1] 0.6533333
p_b # 0.0067...
## [1] 0.006666667
p_c # 0.0667...
## [1] 0.06666667
p_d # 0.2733...
## [1] 0.2733333
Penjelasan:
Sel (Aktual Positif, Prediksi Positif):
\[
\Pr(\text{Aktual Positif, Prediksi Positif}) = \frac{196}{300} \approx
0.6533.
\]
Sel (Aktual Positif, Prediksi Negatif):
\[
\Pr(\text{Aktual Positif, Prediksi Negatif}) = \frac{2}{300} \approx
0.0067.
\]
Sel (Aktual Negatif, Prediksi Positif):
\[
\Pr(\text{Aktual Negatif, Prediksi Positif}) = \frac{20}{300} \approx
0.0667.
\]
Sel (Aktual Negatif, Prediksi Negatif):
\[
\Pr(\text{Aktual Negatif, Prediksi Negatif}) = \frac{82}{300} \approx
0.2733.
\]
Interpretasi
Peluang Bersama memberikan proporsi masing-masing kombinasi kategori dibandingkan dengan keseluruhan data.
Misalnya, peluang bahwa seseorang yang aktual positif juga diprediksi positif adalah sekitar 65,33%. Angka ini membantu kita memahami seberapa sering kedua kondisi tersebut muncul bersamaan dalam populasi.
Sedangkan untuk sel lain, misalnya hanya 0,67% dari populasi mengalami kejadian aktual positif namun diprediksi negatif, menunjukkan kejadian yang jarang terjadi.
Peluang marginal adalah probabilitas dari suatu kejadian tunggal tanpa memperhatikan kejadian yang lain (diperoleh dengan menjumlahkan frekuensi pada baris atau kolom tertentu).
Rumus:
\[ \Pr(X = i) = \frac{\text{Total Baris } i}{N}, \quad \Pr(Y = j) = \frac{\text{Total Kolom } j}{N} \]
Syntax R:
row1 <- a + b # 196 + 2 = 198
row2 <- c + d # 20 + 82 = 102
col1 <- a + c # 196 + 20 = 216
col2 <- b + d # 2 + 82 = 84
p_row1 <- row1 / N # = 198/300 = 0.66
p_row2 <- row2 / N # = 102/300 = 0.34
p_col1 <- col1 / N # = 216/300 = 0.72
p_col2 <- col2 / N # = 84/300 = 0.28
Penjelasan:
Untuk Variabel Aktual:
Aktual Positif:
\[
\Pr(\text{Aktual Positif}) = \frac{198}{300} \approx 0.66.
\]
Aktual Negatif:
\[
\Pr(\text{Aktual Negatif}) = \frac{102}{300} \approx 0.34.
\]
Untuk Variabel Prediksi:
Prediksi Positif:
\[
\Pr(\text{Prediksi Positif}) = \frac{216}{300} \approx 0.72.
\]
Prediksi Negatif:
\[
\Pr(\text{Prediksi Negatif}) = \frac{84}{300} \approx 0.28.
\]
Interpretasi:
Peluang Marginal memberikan gambaran proporsi total masing-masing kategori tanpa memperhatikan kategori lainnya.
Dari sisi Aktual, sekitar 66% individu dalam data adalah aktual positif dan 34% aktual negatif. Hal ini menggambarkan distribusi aktual yang ada.
Dari sisi Prediksi, 72% kasus diprediksi positif dan 28% diprediksi negatif. Hal ini membantu dalam menilai kecenderungan model dalam mengklasifikasikan data.
Informasi ini penting untuk mengetahui seberapa dominannya kategori tertentu (baik pada kondisi aktual maupun prediksi) dalam seluruh data.
Peluang bersyarat (conditional probability) adalah probabilitas bahwa kejadian A terjadi jika diketahui bahwa B telah terjadi. Notasinya Pr(A∣B).
Umumnya dirumuskan sebagai:
\[ \Pr(A \mid B) = \frac{\Pr(A \cap B)}{\Pr(B)} \]
Syntax R:
p_predPos_given_actPos <- a / (a + b) # 196/198
p_predPos_given_actNeg <- c / (c + d) # 20/102
p_predPos_given_actPos # ~ 0.9899
## [1] 0.989899
p_predPos_given_actNeg # ~ 0.1961
## [1] 0.1960784
Penjelasan:
Dalam tabel kontingensi ini, peluang bersyarat digunakan untuk menghitung:
Prediksi Positif diberikan Kondisi Aktual Positif: \[ \Pr(\text{Prediksi Positif} \mid \text{Aktual Positif}) = \frac{a}{a + b} = \frac{196}{198} \approx 0.9899. \]
Prediksi Positif diberikan Kondisi Aktual Negatif: \[ \Pr(\text{Prediksi Positif} \mid \text{Aktual Negatif}) = \frac{c}{c + d} = \frac{20}{102} \approx 0.1961. \]
Interpretasi:
\(\Pr(\text{Prediksi Positif} \mid
\text{Aktual Positif}) \approx 0.99\)
Artinya, jika seseorang benar-benar aktual positif, maka model
memprediksi positif dengan peluang hampir 99%. Ini merupakan indikator
sensitivitas atau true positive rate yang
sangat tinggi.
\(\Pr(\text{Prediksi Positif} \mid
\text{Aktual Negatif}) \approx 0.20\)
Artinya, meskipun tidak seideal kondisi pertama, terdapat kemungkinan
sekitar 20% bahwa seseorang yang aktual negatif tetap diprediksi
positif. Nilai ini mengindikasikan adanya false positive
rate.
Dengan membandingkan kedua nilai ini, kita dapat menilai performa model dalam mengklasifikasikan dengan benar kasus aktual positif serta menghindari kesalahan pengklasifikasian pada kasus negatif.
Pengertian:
Tabel kontingensi adalah matriks yang menyajikan jumlah frekuensi pengamatan untuk dua variabel kategori. Pembentukan tabel ini sangat penting untuk analisis lebih lanjut karena data mentah dapat dengan mudah divisualisasikan dalam bentuk tabel.
Syntax R dan Penjelasan:
# Membuat matriks untuk Tabel Kontingensi 2 x 2
data <- matrix(c(196, 2,
20, 82),
nrow = 2,
byrow = TRUE)
# Menamakan baris dan kolom agar tabel menjadi lebih informatif
rownames(data) <- c("Aktual Positif", "Aktual Negatif")
colnames(data) <- c("Prediksi Positif", "Prediksi Negatif")
# Menampilkan tabel kontingensi di console
print("Tabel Kontingensi:")
## [1] "Tabel Kontingensi:"
print(data)
## Prediksi Positif Prediksi Negatif
## Aktual Positif 196 2
## Aktual Negatif 20 82
Penjelasan:
matrix(c(196, 2, 20, 82), nrow = 2, byrow = TRUE)
Mengonversi vektor data menjadi matriks 2 baris.
byrow = TRUE memastikan data diisi per
baris.
rownames(data) dan colnames(data)
print(data)
Menampilkan tabel kontingensi yang berisi empat sel:
(Aktual Positif, Prediksi Positif) = 196
(Aktual Positif, Prediksi Negatif) = 2
(Aktual Negatif, Prediksi Positif) = 20
(Aktual Negatif, Prediksi Negatif) = 82
Interpretasi Awal
Aktual Positif sebanyak 198 orang (196 + 2).
Aktual Negatif sebanyak 102 orang (20 + 82).
Dari segi prediksi:
- **Prediksi Positif:** 216 orang (196 + 20).
- **Prediksi Negatif:** 84 orang (2 + 82).
Pengertian:
Uji Chi-Square digunakan untuk menguji hipotesis bahwa tidak terdapat hubungan antara dua variabel kategorik. Dengan menguji kesesuaian data yang diobservasi dengan data yang diharapkan (expected frequencies) jika tidak terdapat hubungan, kita dapat menentukan signifikansi hubungan antara variabel tersebut.
Rumus Manual:

Dimana:
a, b, c, ddd adalah frekuensi tiap sel.
N adalah total pengamatan.
Syntax R dan Penjelasan:
# Melakukan uji Chi-Square tanpa koreksi kontinuitas
chi_test <- chisq.test(data, correct = FALSE)
print("Hasil Uji Chi-Square:")
## [1] "Hasil Uji Chi-Square:"
print(chi_test)
##
## Pearson's Chi-squared test
##
## data: data
## X-squared = 210.43, df = 1, p-value < 2.2e-16
Penjelasan
chisq.test(data, correct = FALSE) menghitung
statistik Chi-Square, derajat kebebasan, dan p-value.
correct = FALSE menonaktifkan koreksi Yates (yang
sering dipakai pada tabel 2×2 jika salah satu frekuensi kecil, namun di
sini kita contohkan tanpa koreksi).
Interpretasi
Hipotesis Nol (H0): Tidak ada asosiasi antara Aktual dan Prediksi (artinya, prediksi acak terhadap aktual).
Hipotesis Alternatif (H1): Terdapat asosiasi (distribusi Prediksi Positif/Negatif tidak independen terhadap status Aktual).
Karena p-value < 0,05, maka kita menolak H0, menandakan ada hubungan yang signifikan secara statistik antara hasil prediksi dan status aktual.
Implikasi (misal): Jika hasil menunjukkan p-value yang sangat kecil, maka model prediksi memiliki asosiasi yang cukup kuat dengan data aktual (berarti prediksi tidak sekadar acak).
Pengertian:
Odds Ratio (OR) mengukur kekuatan asosiasi antara dua kategori. Nilai OR menunjukkan seberapa besar peluang (odds) terjadinya suatu kejadian pada satu kelompok dibandingkan dengan kelompok lainnya.
Rumus:
\[ OR = \frac{a \times d}{b \times c} \]
Di mana:
a =196 (Aktual Positif & Prediksi Positif)
b = 2 (Aktual Positif & Prediksi Negatif)-
c = 20 (Aktual Negatif & Prediksi Positif)
d = 82 (Aktual Negatif & Prediksi Negatif)
# Mendefinisikan nilai-nilai sel
a <- 196
b <- 2
c <- 20
d <- 82
# Menghitung Odds Ratio
OR <- (a * d) / (b * c)
cat("Odds Ratio (OR):", OR, "\n")
## Odds Ratio (OR): 401.8
Interpretasi
Nilai OR > 1 menunjukkan bahwa odds pada kelompok “Aktual Positif & Prediksi Positif” jauh lebih besar dibandingkan “Aktual Negatif & Prediksi Positif” (dengan mempertimbangkan pasangan sel sebaliknya).
Semakin besar OR, semakin kuat asosiasinya. Sebagai contoh (hitung cepat), \[ \frac{196 \times 82}{2 \times 20} \approx 401.8 \]
Nilai OR yang sangat tinggi menandakan model cukup “tajam” memprediksi positif vs negatif.
Pengertian:
Relative Risk (RR) membandingkan risiko kejadian pada dua kelompok. Dalam konteks tabel 2×2:
\[ RR = \frac{\text{Risiko pada Kelompok 1}}{\text{Risiko pada Kelompok 2}} \]
Contoh penerapan: Bandingkan risiko “Prediksi Positif” pada mereka yang benar-benar Aktual Positif dengan risiko “Prediksi Positif” pada mereka yang Aktual Negatif.
\[ \text{risk\_positif} = \frac{196}{196 + 2} = \frac{196}{198} \]
\[ \text{risk\_negatif} = \frac{20}{20 + 82} = \frac{20}{102} \]
\[ RR = \frac{\text{risk\_positif}}{\text{risk\_negatif}} = \frac{196/198}{20/102} \]
Syntax R dan Penjelasan:
# Risiko kejadian pada masing-masing kelompok
risk_positif <- a / (a + b) # 196 / 198
risk_negatif <- c / (c + d) # 20 / 102
# Menghitung Relative Risk
RR <- risk_positif / risk_negatif
cat("Relative Risk (RR):", RR, "\n")
## Relative Risk (RR): 5.048485
Interpretasi:
Semisal risk_positif≈0.99 dan risk_negatif≈0.20.
RR bisa sekitar 5, artinya kelompok Aktual Positif sekitar 5 kali lebih berpeluang diprediksi positif dibandingkan kelompok Aktual Negatif.
RR > 1 menegaskan perbedaan risiko yang signifikan.
Pengertian:
Frekuensi harapan adalah nilai yang diharapkan pada tiap sel tabel jika tidak terdapat hubungan antara kedua variabel (hipotesis nol benar). Penghitungan frekuensi harapan diperlukan untuk validasi uji Chi-Square.
Rumus:
\[ E_{ij} = \frac{(\text{Total Baris}_i) \times (\text{Total Kolom}_j)}{N} \]
Syntax R dan Penjelasan:
# Hitung total data, total per baris, dan total per kolom
total_data <- sum(data) # total pengamatan, 196+2+20+82 = 300
total_baris <- rowSums(data) # (198, 102)
total_kolom <- colSums(data) # (216, 84)
# Membuat matriks frekuensi harapan
expected <- outer(total_baris, total_kolom) / total_data
print("Frekuensi Harapan (Expected Frequencies):")
## [1] "Frekuensi Harapan (Expected Frequencies):"
print(expected)
## Prediksi Positif Prediksi Negatif
## Aktual Positif 142.56 55.44
## Aktual Negatif 73.44 28.56
Penjelasan:
Baris 1, Kolom 1:
\[
\frac{198 \times 216}{300} \approx 142.56
\]
Baris 1, Kolom 2:
\[
\frac{198 \times 84}{300} \approx 55.44
\]
Baris 2, Kolom 1:
\[
\frac{102 \times 216}{300} \approx 73.44
\]
Baris 2, Kolom 2:
\[
\frac{102 \times 84}{300} \approx 28.56
\]
Interpretasi:
Kesimpulan
Apabila hasil uji chi-square menunjukkan p-value yang sangat kecil, dapat disimpulkan bahwa terdapat asosiasi kuat antara hasil prediksi dan kondisi aktual.
Nilai OR yang tinggi mencerminkan bahwa kemungkinan (odds) memprediksi positif benar-benar jauh lebih tinggi jika individu tersebut memang positif.
RR yang > 1 menegaskan perbedaan risiko yang signifikan antara kelompok positif vs. negatif.
Dengan perubahan data di atas (196, 2, 20, 82), Anda dapat mengevaluasi kinerja sebuah model klasifikasi, misalnya dalam analisis sentimen, diagnosis medis, atau prediksi status tertentu. Semua metode (tabel kontingensi, chi-square, OR, RR, expected frequencies) dapat membantu menilai akurasi dan kekuatan model dalam memisahkan kategori positif-negatif secara konsisten.
Inferensi statistik pada tabel kontingensi dua arah adalah proses untuk menarik kesimpulan mengenai hubungan antar dua variabel kategori berdasarkan data dalam bentuk tabel frekuensi silang (cross-tabulation).
Biasanya digunakan untuk:
Menentukan apakah dua variabel kategori saling berhubungan (dependen), atau tidak berhubungan (independen).
Mengukur kekuatan dan arah hubungan antara dua variabel.
Menguji perbedaan proporsi antara kelompok.
Contoh struktur tabel kontingensi dua arah:
| Prediksi Positif | Prediksi Negatif | Total | |
|---|---|---|---|
| Aktual Positif | 196 | 2 | 198 |
| Aktual Negatif | 20 | 82 | 102 |
| Total | 216 | 84 | 300 |
- Prediksi vs. Kondisi aktual
- Gejala vs. Diagnosis
- Preferensi vs. Kelompok usia, dll.
Menguji hipotesis dengan menggunakan alat statistik seperti:
Uji Chi-Square (χ²)
Uji Fisher Exact
Likelihood Ratio Test (G²)
Mengukur asosiasi menggunakan:
- **Odds Ratio** (OR)
- **Risk Difference** (RD)
- **Relative Risk** (RR)
**Hipotesis Nol (H₀):**\
Tidak ada hubungan antara dua variabel (mereka independen secara statistik).
**Hipotesis Alternatif (H₁):**\
Terdapat hubungan atau ketergantungan antara dua variabel.
Estimasi merupakan proses untuk menaksir parameter populasi berdasarkan data sampel. Estimasi dibagi menjadi dua jenis:
Estimasi Titik: Menyajikan satu nilai sebagai dugaan terbaik dari parameter.
Estimasi Interval: Menyajikan rentang nilai yang dipercaya mencakup parameter populasi sebenarnya, dengan tingkat keyakinan tertentu, seperti 95%.
Pada bagian ini, kita akan membahas dua jenis estimasi utama, yakni estimasi titik (point estimation) dan estimasi interval (interval estimation).
Estimasi titik untuk proporsi pada tabel kontingensi dua arah biasanya mengacu pada proporsi sel tertentu atau gabungan sel. Sebagai contoh, jika kita memiliki tabel kontingensi sebagai berikut:
| Prediksi Positif | Prediksi Negatif | Total | |
|---|---|---|---|
| Aktual Positif | n11 | n12 | n1⋅ |
| Aktual Negatif | n21 | n22 | n2⋅ |
| Total | n⋅1 | n⋅2 | n |
Estimasi titik proporsi sel (i,j) dapat dihitung dengan:
\[ \hat{p}_{ij} = \frac{n_{ij}}{n} \]
Syntax R:
# Jumlah total sampel
n_total <- 300
# Jumlah aktual positif
n_aktual_positif <- 198
# Estimasi titik proporsi aktual positif
proporsi_titik <- n_aktual_positif / n_total
proporsi_titik
## [1] 0.66
Interpretasi:
Estimasi titik proporsi aktual positif dalam populasi adalah 0.66, yang berarti sekitar 66% dari sampel termasuk dalam kategori aktual positif.
Untuk mendapatkan interval kepercayaan (confidence interval) terhadap proporsi dalam tabel kontingensi, kita dapat menggunakan pendekatan normal (Wald) atau pendekatan lain (misalnya, interval kepercayaan Wilson). Jika jumlah data relatif besar, pendekatan normal biasanya cukup.
Secara umum, interval kepercayaan (1−α)×100% untuk proporsi p^ij dapat ditulis sebagai:
\[ \hat{p}_{ij} \pm z_{\alpha/2} \sqrt{ \frac{ \hat{p}_{ij}(1 - \hat{p}_{ij}) }{n} } \]
di mana za/2 adalah nilai kritis dari distribusi normal baku sesuai tingkat kepercayaan yang diinginkan (misalnya Z0,025 = 1.965 untuk 95%CI)
Contoh Sintaks R (menggunakan pendekatan Wald untuk sel (i,j) tertentu):
# Data
n_total <- 300
n_positif <- 198
# Estimasi titik
p_hat <- n_positif / n_total
# Tingkat kepercayaan 95%
alpha <- 0.05
z <- qnorm(1 - alpha / 2)
# Hitung standard error
SE <- sqrt((p_hat * (1 - p_hat)) / n_total)
# Hitung batas bawah dan atas CI
lower <- p_hat - z * SE
upper <- p_hat + z * SE
# Tampilkan hasil dengan pembulatan
cat("Estimasi titik proporsi aktual positif =", round(p_hat, 4), "\n")
## Estimasi titik proporsi aktual positif = 0.66
cat("Interval kepercayaan 95% = [", round(lower, 4), ",", round(upper, 4), "]\n")
## Interval kepercayaan 95% = [ 0.6064 , 0.7136 ]
Interpretasi:
Pada tabel kontingensi dua arah, umumnya kita melakukan uji hipotesis terkait:
Uji Proporsi (menguji apakah proporsi kategori tertentu sama dengan nilai tertentu).
Uji Asosiasi (menguji apakah ada hubungan/ketergantungan di antara kedua variabel kategorik).
Uji Independensi (sering disebut juga Chi-Square Test of Independence).
contoh aplikasi uji hipotesis untuk data nyata yang meliputi tiga jenis uji, yaitu uji proporsi, uji asosiasi, dan uji independensi. Untuk contoh ini, akan menggunakan data klasifikasi positif vs. negatif Analisis Sentimen Masyarakat Indonesia Tentang Pembelajaran Tatap Muka Pada Masa Pandemi Covid-19 dibandingkan dengan kondisi aktual yang diketahui, Sumber data: https://ejournal.undiksha.ac.id/index.php/JST/article/view/51899/26005
| Prediksi Positif | Prediksi Negatif | Total | |
|---|---|---|---|
| Aktual Positif | 196 | 2 | 198 |
| Aktual Negatif | 20 | 82 | 102 |
| Total | 216 | 84 | 300 |
Data ini memungkinkan kita mengeksplorasi beberapa aspek analisis data kategorik.
Tujuan
Uji proporsi digunakan untuk menguji apakah proporsi kejadian tertentu sama dengan nilai proporsi yang diharapkan. Misalnya, kita ingin menguji apakah proporsi kasus aktual positif (198 dari 300) sama dengan nilai teoretis \(p_0\). Di sini, jumlah kasus aktual positif adalah:
\[ \text{Jumlah Aktual Positif} = a + b = 196 + 2 = 198 \]
Sedangkan total populasi adalah 300. Misalnya, hipotesis nol (H\(_0\)) adalah bahwa proporsi tersebut sama dengan 0.66.
Sintaks R:
# Jumlah total dan jumlah aktual positif
n_total <- 300
n_actual_positive <- 198
# Misalkan proporsi teoretis yang diuji adalah 0.66
p0 <- 0.66
# Uji proporsi menggunakan prop.test (tanpa koreksi continuity)
prop_test_result <- prop.test(x = n_actual_positive, n = n_total, p = p0, alternative = "two.sided", correct = FALSE)
prop_test_result
##
## 1-sample proportions test without continuity correction
##
## data: n_actual_positive out of n_total, null probability p0
## X-squared = 1.9799e-30, df = 1, p-value = 1
## alternative hypothesis: true p is not equal to 0.66
## 95 percent confidence interval:
## 0.6046745 0.7112798
## sample estimates:
## p
## 0.66
Interpretasi Hasil Uji Proporsi
Hasil Uji: Apabila p-value < 0.05, maka terdapat perbedaan signifikan antara proporsi aktual positif dengan nilai p0p_0p0.
Kesimpulan Uji Proporsi:
Jika p-value kecil, hipotesis nol ditolak dan dapat disimpulkan bahwa
proporsi aktual positif (198/300 ≈ 66%) berbeda secara signifikan dari
nilai teoretis yang diuji.
Analisis asosiasi bertujuan untuk mengukur hubungan antara kondisi aktual dan hasil prediksi. Untuk tabel 2×2 berikut:
\begin{array}{c|cc} & \text{Prediksi Positif} & \text{Prediksi Negatif} \\\hline \text{Aktual Positif} & a = 196 & b = 2 \\ \text{Aktual Negatif} & c = 20 & d = 82 \\ \end{array}
Kita lakukan perhitungan sebagai berikut.
Tujuan
Uji asosiasi bertujuan untuk mengukur kekuatan hubungan antarvariabel kategorik dengan menghitung ukuran efek seperti Odds Ratio (OR).
Penerapan dengan Odds Ratio
Untuk tabel 2×2, Odds Ratio dihitung sebagai:
\[ OR = \frac{n_{11} \times n_{22}}{n_{12} \times n_{21}} \]
Syntax R:
a <- 196
b <- 2
c <- 20
d <- 82
# Menghitung Odds Ratio
OR <- (a * d) / (b * c)
OR
## [1] 401.8
Interpretasi OR:
Odds Ratio (OR): Menunjukkan perbandingan “odds” prediksi positif antara kelompok Aktual Positif dan Aktual Negatif.
Jika OR yang dihitung sangat tinggi (misalnya, sekitar 401.8), artinya peluang bahwa seseorang yang Aktual Positif diprediksi positif jauh lebih tinggi daripada individu yang Aktual Negatif.
Rumus:
\[ RD = \frac{a}{a + b} - \frac{c}{c + d} \]
Syntax R:
# Menghitung risiko masing-masing kelompok
risk_positive <- a / (a + b) # 196/198
risk_negative <- c / (c + d) # 20/102
# Menghitung Risk Difference
RD <- risk_positive - risk_negative
RD
## [1] 0.7938206
Interpretasi RD:
Risk Difference (RD): Mengukur perbedaan absolut antara risiko prediksi positif di antara kelompok Aktual Positif dan Aktual Negatif.
Contoh: Jika risk_positive ≈ 0.9899 dan risk_negative ≈ 0.1961, maka RD ≈ 0.7938, menunjukkan perbedaan risiko sebesar 79.38%.
Tujuan:
Relative Risk mengukur perbandingan risiko kejadian antara dua kelompok.
Rumusnya adalah:
\[ RR = \frac{\frac{a}{a + b}}{\frac{c}{c + d}} \]
Syntax R:
# Menghitung Relative Risk
RR <- risk_positive / risk_negative
RR
## [1] 5.048485
Interpretasi RR:
Relative Risk (RR): Menunjukkan berapa kali risiko prediksi positif pada kelompok Aktual Positif lebih besar dibandingkan dengan kelompok Aktual Negatif.
Misalnya, jika RR yang dihitung adalah sekitar 5, artinya individu pada kelompok Aktual Positif memiliki risiko 5 kali lebih tinggi untuk diprediksi positif dibandingkan dengan kelompok Aktual Negatif.
Kesimpulan Uji Asosiasi:
Odds Ratio (OR):
Hasil: Nilai OR yang sangat tinggi (misalnya, ~401.8) menunjukkan bahwa odds mendapatkan prediksi positif pada individu Aktual Positif jauh lebih besar dibandingkan pada individu Aktual Negatif.
Kesimpulan: Model prediksi memiliki kinerja yang sangat baik dalam mendeteksi kasus Aktual Positif karena perbedaan odds yang signifikan.
Risk Difference (RD):
Hasil: RD sekitar 0.7938 menunjukkan perbedaan risiko absolut yang besar antara kedua kelompok.
Kesimpulan: Ada perbedaan risiko yang nyata dan besar antara individu Aktual Positif dan Aktual Negatif dalam hal mendapatkan prediksi positif.
Relative Risk (RR):
Hasil: RR sekitar 5 mengindikasikan bahwa kelompok Aktual Positif memiliki risiko prediksi positif yang relatif jauh lebih besar (misalnya, 5 kali lipat) dibandingkan kelompok Aktual Negatif.
Kesimpulan: Perbandingan risiko ini menguatkan bahwa model prediksi secara signifikan mendeteksi kasus positif.
Kesimpulan Umum Uji Asosiasi:
Berdasarkan perhitungan Odds Ratio, Risk Difference, dan Relative Risk, dapat disimpulkan bahwa sistem prediksi tidak bekerja secara acak; model menunjukkan asosiasi yang kuat antara kondisi Aktual dan hasil Prediksi.
Nilai OR yang sangat tinggi, RD yang signifikan, dan RR yang besar menunjukkan bahwa model prediksi memiliki kemampuan yang sangat baik dalam mengidentifikasi individu Aktual Positif, sementara tingkat kesalahan (false positive) relatif rendah.
Secara keseluruhan, hasil uji asosiasi mendukung validitas model dan menyatakan bahwa perbedaan antara kelompok-kelompok tersebut sangat signifikan secara statistik.
Tujuan: Untuk mengetahui apakah Aktual (Positif/Negatif) memiliki hubungan (asosiasi) yang signifikan dengan Prediksi (Positif/Negatif) ataukah keduanya bersifat independen.
Persiapan Data Tabel Kontingensi
# Membuat tabel kontingensi 2 x 2
data_infer <- matrix(c(196, 2,
20, 82),
nrow = 2, byrow = TRUE,
dimnames = list(
c("Aktual Positif", "Aktual Negatif"),
c("Prediksi Positif", "Prediksi Negatif")
))
print("Tabel Kontingensi:")
## [1] "Tabel Kontingensi:"
print(data_infer)
## Prediksi Positif Prediksi Negatif
## Aktual Positif 196 2
## Aktual Negatif 20 82
Interpretasi Awal Tabel:
Baris pertama (Aktual Positif) memiliki total 198 (196 + 2).
Baris kedua (Aktual Negatif) memiliki total 102 (20 + 82).
Kolom pertama (Prediksi Positif) memiliki total 216 (196 + 20).
Kolom kedua (Prediksi Negatif) memiliki total 84 (2 + 82).
Jumlah keseluruhan N = 300.
Hipotesis
H0: Jenis kelamin dan status merokok bersifat independen (tidak terdapat hubungan).
H1: Jenis kelamin dan status merokok tidak independen (terdapat hubungan).
Langkah-langkah Perhitungan:
Hipotesi
H0: Tidak ada hubungan (independensi) antara Aktual dan Prediksi.
H1 : Ada hubungan (tidak independen).
Perhitungan Statistik Chi-Square
Menggunakan fungsi chisq.test() di R (bawaan base
R).
Membangun Tabel Kontingensi:
Data sudah dirangkum pada tabel di atas.
Menghitung Frekuensi Harapan:
Untuk setiap sel, frekuensi harapan dihitung dengan:
\[ E_{ij} = \frac{(n_{i.})(n_{.j})}{n} \]
\[ \chi^2 = \sum_{i,j} \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \]
di mana Oij adalah frekuensi teramati.
Sintaks R
# Melakukan uji Chi-Square (tanpa koreksi Yates)
chi_result <- chisq.test(data_infer, correct = FALSE)
chi_result
##
## Pearson's Chi-squared test
##
## data: data_infer
## X-squared = 210.43, df = 1, p-value < 2.2e-16
Kesimpulan Uji Chi-Square
Hasil Uji:
Dengan menggunakan fungsi chisq.test() (tanpa koreksi
Yates), diperoleh nilai statistik Chi-Square yang tinggi dengan p-value
< 0.05.
Interpretasi:
Hipotesis nol (tidak ada hubungan/independensi antara kondisi aktual dan
prediksi) ditolak.
Implikasi:
Ada hubungan yang signifikan antara kategori aktual (positif/negatif)
dengan hasil prediksi. Artinya, sistem/ model prediksi menunjukkan
asosiasi statistik yang kuat dengan data aktual.
Exact Fisher Test sangat berguna untuk tabel 2×2, terutama ketika
frekuensi sel kecil (meskipun pada contoh ini frekuensinya cukup besar).
Fungsi fisher.test() di R melakukan uji ini secara
eksak.
Syntax R
# Uji Fisher
fisher_result <- fisher.test(data_infer)
fisher_result
##
## Fisher's Exact Test for Count Data
##
## data: data_infer
## p-value < 2.2e-16
## alternative hypothesis: true odds ratio is not equal to 1
## 95 percent confidence interval:
## 91.86727 3694.68775
## sample estimates:
## odds ratio
## 384.8843
Kesimpulan Uji Fisher’s Exact Test
Hasil Uji:
Hasil dari Fisher’s Exact Test juga menunjukkan p-value < 0.05, serta
menghasilkan estimasi Odds Ratio (serta interval kepercayaan) yang
mendukung temuan uji chi-square.
Interpretasi:
Dengan metode yang lebih tepat untuk data 2×2 (terutama bila terdapat
sel dengan frekuensi rendah), uji ini menolak hipotesis nol,
mengonfirmasi adanya asosiasi yang signifikan antara variabel aktual dan
prediksi.
Implikasi:
Kedua uji (Chi-Square dan Fisher) memberikan konsistensi bahwa model
prediksi tidak bekerja secara acak, melainkan memiliki hubungan yang
nyata dengan kondisi aktual.
Tujuan
Pendekatan ini menggunakan model log-linear untuk menguji kesesuaian model independensi dengan data. Statistika uji yang digunakan adalah deviance G^2.
Sintaks R
Untuk uji ini, kita menggunakan fungsi loglm() dari
paket MASS. Pastikan paket tersebut telah
terinstal.
# Memastikan paket MASS terpasang
# install.packages("MASS")
library(MASS)
# Ubah data_infer menjadi table (tipe 'table')
data_table <- as.table(data_infer)
# Log-likelihood test untuk model independen
lr_result <- loglm(~ 1 + 2, data = data_table)
# ~ 1 + 2 menandakan model tanpa interaksi (independen)
lr_result
## Call:
## loglm(formula = ~1 + 2, data = data_table)
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 232.4486 1 0
## Pearson 210.4254 1 0
Kesimpulan Uji Likelihood Ratio Test
Statistika Likelihood Ratio (G²):
Rumus:
\[ G^2 = 2 \sum O_{ij} \ln\left( \frac{O_{ij}}{E_{ij}} \right) \]
di mana Oij adalah frekuensi teramati dan Eij adalah frekuensi harapan.
Hasil Uji:
Melalui model log-linear (dengan fungsi loglm() dari paket
MASS), didapatkan nilai deviance (G²) yang signifikan (p-value <
0.05) yang menunjukkan ketidakcocokan model independen dengan
data.
Interpretasi:
Model independensi (tanpa interaksi antara kategori aktual dan prediksi)
tidak cocok dengan data yang ada.
Implikasi:
Hasil ini mendukung temuan dari uji Chi-Square dan Fisher, yakni
terdapat interaksi yang jelas antara variabel aktual dan prediksi,
sehingga model prediksi memiliki validitas yang kuat dalam
mengklasifikasikan data.
Analisis residual dalam tabel kontingensi bertujuan untuk melihat sel mana yang jauh dari harapan (expected), sehingga menandakan adanya pola khusus atau ketidaksesuaian model. Residual di sini biasanya adalah selisih antara frekuensi teramati (nij) dan frekuensi harapan (Eij), kemudian dinormalisasi.
\[ r^{(P)}_{ij} = \frac{n_{ij} - E_{ij}}{\sqrt{E_{ij}}} \]
Digunakan paling umum
\[ r^{(S)}_{ij} = \frac{n_{ij} - E_{ij}} {\sqrt{E_{ij}\,\bigl(1 - \hat{p}_i\bigr)\,\bigl(1 - \hat{p}_j\bigr)}} \]
atau bentuk lain yang memperhitungkan varian lebih tepat.
Biasa digunakan dalam konteks model log-linear, di mana
\[ r^{(D)}_{ij} = \text{sign}\,\bigl(n_{ij} - E_{ij}\bigr)\,\sqrt{2\,\Bigl[n_{ij}\,\ln\!\Bigl(\frac{n_{ij}}{E_{ij}}\Bigr) - \bigl(n_{ij} - E_{ij}\bigr)\Bigr]} \]
Semakin besar nilai (absolut) residual, semakin kuat indikasi bahwa frekuensi sel tersebut menyimpang dari yang diharapkan.
Sel yang memiliki residual besar (misalnya \[ |r_{ij}| > 2 \] atau\[ |r_{ij}| > 3 \]
) dapat diindikasikan sebagai “keluar” (outlier) atau sel yang berkontribusi terbesar terhadap penolakan hipotesis independensi/asosiasi.
Contoh Syntax R:
# Residual dari hasil chisq.test
resid_pearson <- chi_result$residuals
resid_pearson
## Prediksi Positif Prediksi Negatif
## Aktual Positif 4.475768 -7.177197
## Aktual Negatif -6.235914 9.999709
# Standardized residual (jika tersedia)
resid_std <- chi_result$stdres
resid_std
## Prediksi Positif Prediksi Negatif
## Aktual Positif 14.50605 -14.50605
## Aktual Negatif -14.50605 14.50605
Kesimpulan Analisis Residual
Latar Belakang
Sumber : https://ejournal.undip.ac.id/index.php/matematika/article/viewFile/1370/1131
PT. PLN (Persero) Distribusi Jawa Timur membagi area pelayanannya menjadi beberapa Kantor Area Pelayanan dan Jaringan (APJ): Surabaya Selatan (SBS), Surabaya Utara (SBU), Malang (MLG), Kediri (KDR), dan sebagainya. Selain itu, pelanggan dikelompokkan menurut jenis atau golongan pelanggaran (A, B, C, D, E).
Untuk menganalisis apakah terdapat hubungan antara Area dengan Golongan Pelanggaran, kita menggunakan tabel kontingensi yang menampilkan Count (frekuensi observasi) pada setiap sel (kombinasi antar-kategori). Kemudian, kita juga menampilkan Expected Count (frekuensi yang diharapkan) apabila kedua variabel tidak berasosiasi (alias independen).
Untuk Klasifikasi Pelanggaran dijelaskan seperti berikut:
Klasifikasi A: Pelanggaran yang tidak mempengaruhi batas daya
Klasifikasi B: Pelanggaran yang hanya mempengaruhi penyambungan energi
Klasifikasi C: Pelanggaran yang hanya mempengaruhi batas daya
Klasifikasi D: Pelanggaran yang mempengaruhi batas daya dan kesalahan pemakaian energi
Klasifikasi E: Pelanggaran yang mempengaruhi batas daya dan kesalahan pelanggan
Untuk keperluan pemetaan dan analisis kebijakan, dilakukan analisis tiga arah dengan memasukkan faktor-faktor (variabel) berikut:
Area Pelayanan (SBS, SBU, MLG, KDR)
Golongan Pelanggaran (A, B, C, D, E)
Ukuran atau Variabel Lain (misalnya “Status Penyelesaian Pelanggaran” atau “Tahun Penemuan Pelanggaran”), atau variabel ketiga lain sesuai kebutuhan studi.
Pada contoh e-Book ini, kita akan berfokus pada analisis tiga arah dengan dua variabel utama terlebih dahulu (Area dan Golongan Pelanggaran), dan kita asumsikan satu variabel lagi (misalnya “Kategori Pelanggan: Rumah Tangga (R), Bisnis (B), Industri (I)” atau lainnya). Melalui analisis ini, diharapkan dapat diperoleh insight apakah terdapat hubungan (asosiasi) di antara ketiga variabel tersebut, dan apakah ada indikasi independensi atau ketergantungan secara parsial.
Mengetahui distribusi pelanggaran di tiap area pelayanan.
Menguji apakah terdapat asosiasi signifikan antara variabel Area dan Pelanggaran.
Menghitung dan membandingkan Count (observed) dengan Expected Count untuk mengidentifikasi sel yang memiliki deviasi tinggi.
Menyusun rekomendasi kebijakan berdasarkan analisis statistik.
Contoh data yang digunakan merupakan rangkuman frekuensi sebagai berikut (disederhanakan sebagai ilustrasi):
| Area Pelayanan | A (Count / Exp) | B (Count / Exp) | C (Count / Exp) | D (Count / Exp) | E (Count / Exp) |
|---|---|---|---|---|---|
| SBS | 17 / 53.1 | 157 / 179.0 | 249 / 206.1 | 128 / 129.0 | 121 / 42.8 |
| SBU | 93 / 31.9 | 41 / 107.6 | 94/ 123.9 | 64 / 114.8 | 112 / 25.7 |
| MLG | 121 / 61.4 | 148 / 207.3 | 249 / 246.3 | 221 / 221.1 | 30 / 49.6 |
| KDR | 65 / 68.5 | 369 / 231.0 | 174 / 266.0 | 249 / 246.3 | 10 / 55.3 |
Dari data inilah, dengan menggunakan rumus dasar, Expected Count tiap sel dapat dihitung agar kita dapat menguji independensi secara statistik.
Mengapa ada Count dan Expected Count?
Observed Count adalah jumlah pengamatan sebenarnya di lapangan, misalnya banyaknya pelanggaran A di area SBS.
Expected Count adalah jumlah pengamatan yang diharapkan jika Area dan Klasifikasi Pelanggaran “kebetulan saja” (independen). Nilainya dihitung menggunakan rumus:
\[ \text{Expected}_{ij} = \frac{(\text{Total Baris } i)\times(\text{Total Kolom } j)}{\text{Grand Total}} \]
Tabel Kontingensi Tiga Arah adalah perluasan dari tabel kontingensi dua arah menjadi tiga dimensi. Misalnya, kita memiliki tiga variabel kategorik, yaitu \[ X,\quad Y,\quad \text{dan}\quad Z. \]
Tabel ini menyajikan frekuensi (atau proporsi) dari kombinasi setiap kategori \(X\), \(Y\), dan \(Z\).
Tabel Marginal
Tabel Marginal (Marginal Table) adalah tabel kontingensi yang diperoleh dengan menjumlahkan (meng-aggregasi) satu atau lebih variabel.
Dari tabel tiga arah \((X, Y, Z)\), kita dapat membuat tabel marginal \((X, Y)\) dengan mengabaikan/menggabungkan kategori \(Z\).
Tabel marginal \((X,Y)\) menampilkan total frekuensi \[ \sum_z n_{xyz} \] untuk semua kategori \(z\) di \(Z\).
Tabel Parsial
Tabel Parsial (Partial Table) adalah tabel kontingensi yang diperoleh dengan mem-fiksasi (menahan) salah satu kategori dari variabel.
Secara umum, dalam analisis tiga arah, kita sering tertarik untuk melihat:
Hubungan \(X\) dan \(Y\) secara keseluruhan (tabel marginal).
Hubungan \(X\) dan \(Y\) pada masing-masing kategori \(Z\) (tabel parsial).
Rumus Rumus Dasar
Misalkan kita memiliki data berikut: \[ n_{ijk} = \text{frekuensi untuk kategori } X = i,\; Y = j,\; \text{dan } Z = k. \]
Tabel Marginal X,Y
\[ n_{ij+} = \sum_k n_{ijk}, \] yang artinya menjumlahkan semua kategori \(Z\).
Tabel Marginal X,Z
\[ n_{i+k} = \sum_j n_{ijk}. \]
Tabel Marginal Y,Z
\[ n_{+jk} = \sum_i n_{ijk}. \]
Tabel Parsial (X, Y) untuk Z = k^*:
\[ n_{ij \mid k^*} = n_{ijk^*}, \] yang hanya menyertakan data pada kategori \(k^*\).
# Contoh struktur data untuk Count dan Expected
Count <- matrix(
c(17, 157, 249, 128, 121,
93, 41, 94, 64, 112,
121,148, 249, 230, 30,
65, 369, 174, 249, 10),
nrow = 4, byrow = TRUE,
dimnames = list(c("SBS", "SBU", "MLG", "KDR"), c("A", "B", "C", "D", "E"))
)
Expected <- matrix(
c(53.1, 179.0, 206.1, 190.9, 42.8,
31.9, 107.6, 123.9, 114.8, 25.7,
61.4, 207.3, 238.7, 221.1, 49.6,
68.5, 231.0, 266.0, 246.3, 55.3),
nrow = 4, byrow = TRUE,
dimnames = list(c("SBS", "SBU", "MLG", "KDR"), c("A", "B", "C", "D", "E"))
)
# Gabungkan ke dalam array 3 dimensi
data_pln <- array(
c(Count, Expected),
dim = c(4, 5, 2),
dimnames = list(
Area = c("SBS", "SBU", "MLG", "KDR"),
Pelanggaran = c("A", "B", "C", "D", "E"),
Tipe = c("Count", "Expected")
)
)
Count
## A B C D E
## SBS 17 157 249 128 121
## SBU 93 41 94 64 112
## MLG 121 148 249 230 30
## KDR 65 369 174 249 10
Expected
## A B C D E
## SBS 53.1 179.0 206.1 190.9 42.8
## SBU 31.9 107.6 123.9 114.8 25.7
## MLG 61.4 207.3 238.7 221.1 49.6
## KDR 68.5 231.0 266.0 246.3 55.3
data_pln
## , , Tipe = Count
##
## Pelanggaran
## Area A B C D E
## SBS 17 157 249 128 121
## SBU 93 41 94 64 112
## MLG 121 148 249 230 30
## KDR 65 369 174 249 10
##
## , , Tipe = Expected
##
## Pelanggaran
## Area A B C D E
## SBS 53.1 179.0 206.1 190.9 42.8
## SBU 31.9 107.6 123.9 114.8 25.7
## MLG 61.4 207.3 238.7 221.1 49.6
## KDR 68.5 231.0 266.0 246.3 55.3
Interpretasi
Struktur Data Tiga Dimensi
Data disusun ke dalam sebuah array tiga dimensi dengan:
Dimensi 1 (Baris): Berisi area pelayanan, yaitu SBS, SBU, MLG, dan KDR. Ini menunjukkan lokasi atau wilayah operasional dari pelanggan PLN.
Dimensi 2 (Kolom): Berisi jenis pelanggaran, yaitu kategori A, B, C, D, dan E. Setiap kategori memiliki arti tertentu, misalnya:
A: Pelanggaran yang tidak mempengaruhi batas daya dan pengukuran energi.
B: Pelanggaran yang hanya mempengaruhi batas daya.
C: Pelanggaran yang hanya mempengaruhi pengukuran energi.
D: Pelanggaran yang mempengaruhi kedua aspek.
E: Kesalahan yang bukan disebabkan oleh pelanggan.
Dimensi 3 (Tipe): Terdiri atas dua komponen, yaitu Count dan Expected:
Count: Menunjukkan jumlah aktual kejadian (frekuensi observasi) untuk kombinasi area dan jenis pelanggaran.
Expected: Menunjukkan jumlah yang diperkirakan (frekuensi harapan) berdasarkan perhitungan statistik—biasanya menggunakan asumsi bahwa tidak ada hubungan (independensi) antara area dan jenis pelanggaran.
Bandingkan Nilai Count dan Expected
Perbandingan antar nilai:
Nilai Count dan Expected dapat
dibandingkan untuk masing-masing kombinasi area dan jenis
pelanggaran.
Jika nilai Count mendekati nilai Expected, hal ini menunjukkan bahwa distribusi pelanggaran di suatu area tidak berbeda jauh dari apa yang diharapkan di bawah model independensi.
Jika terdapat perbedaan yang cukup besar antara Count dan Expected, hal ini bisa menjadi indikasi adanya asosiasi yang nyata antara area pelayanan dengan jenis pelanggaran. Misalnya, apabila suatu area menunjukkan Count jauh lebih rendah atau lebih tinggi daripada Expected pada pelanggaran tertentu, maka perlu diinvestigasi lebih lanjut faktor penyebab perbedaan tersebut.
Kesimpulan
Struktur yang Jelas:
Penyusunan data dalam bentuk array tiga dimensi memungkinkan analisis
yang terstruktur berdasarkan area, jenis pelanggaran, dan tipe data
(Count versus Expected). Hal ini membantu dalam pemahaman hubungan antar
variabel dan mengidentifikasi pola pada masing-masing wilayah.
Pentingnya Perbandingan Count dan
Expected:
Dengan membandingkan nilai aktual (Count) dengan nilai harapan
(Expected), kita dapat menentukan apakah ada penyimpangan yang
signifikan. Penyimpangan tersebut sering digunakan sebagai dasar untuk
uji statistik seperti uji chi-square yang bertujuan menguji hubungan
atau asosiasi antara area pelayanan dan jenis pelanggaran.
Dampak pada Pengambilan Keputusan:
Interpretasi perbedaan antara Count dan Expected memberikan informasi
penting bagi manajemen PLN, sehingga dapat digunakan untuk mengarahkan
perbaikan dalam sistem pengawasan, penanganan pelanggaran, dan
peningkatan pelayanan.
Pengertian
Distribusi peluang dalam konteks tabel kontingensi menunjukkan bagaimana peluang (probabilitas) dialokasikan ke tiap kombinasi kategori. Misalnya, kita mengonversi frekuensi aktual (Count) ke dalam proporsi atau peluang sehingga seluruh sel akan menjumlahkan ke 1. Konsep ini memungkinkan kita untuk:
Mengukur peluang bersama dari dua atau lebih variabel.
Menghitung peluang marginal dengan menjumlahkan peluang bersama pada suatu dimensi.
Menghitung peluang kondisional, misalnya peluang jenis pelanggaran tertentu pada suatu area pelayanan.
Dengan kata lain, distribusi peluang membantu memahami pola dan hubungan antara variabel tanpa terikat pada nilai absolut frekuensi.
Rumus Rumus
Misalkan kita memiliki data frekuensi \(n_{ij}\) yang mewakili count dari kombinasi kategori (\(i\)) dan (\(j\)). Total pengamatan adalah: \[ N = \sum_{i,j} n_{ij}. \]
a. Peluang Bersama Joint Distribution
Peluang bahwa observasi berada pada kategori area \(i\) dan pelanggaran \(j\) adalah: \[ p_{ij} = \frac{n_{ij}}{N}. \]
b. Peluang Marginal
Peluang marginal untuk \(i\) adalah: \[ p_{i+} = \sum_j p_{ij} = \frac{\sum_j n_{ij}}{N}. \] Sedangkan peluang marginal untuk \(j\) adalah: \[ p_{+j} = \sum_i p_{ij} = \frac{\sum_i n_{ij}}{N}. \]
c. Peluang Kondisional
Peluang kondisional pelanggaran \(j\) jika diketahui area \(i\) adalah: \[ p(j \mid i) = \frac{p_{ij}}{p_{i+}} = \frac{n_{ij}}{\sum_j n_{ij}}. \]
Perhitungan Menggunakan Syntax R
Kita akan menghitung distribusi peluang dari data Count yang
terdapat pada array data_pln yang telah memiliki
dimensi:
Area: “SBS”, “SBU”, “MLG”, “KDR”
Pelanggaran: “A”, “B”, “C”, “D”, “E”
Tipe: “Count” dan “Expected”
Kita hanya menggunakan bagian Count untuk menghitung peluang.
a. Peluang Bersama (Joint Distribution)
# Menghitung distribusi peluang bersama (joint distribution) dari Count
p_joint <- prop.table(data_pln[, , "Count"])
print(p_joint)
## Pelanggaran
## Area A B C D E
## SBS 0.006247703 0.05769938 0.09151047 0.04704153 0.044468945
## SBU 0.034178611 0.01506799 0.03454612 0.02352076 0.041161338
## MLG 0.044468945 0.05439177 0.09151047 0.08452775 0.011025358
## KDR 0.023888276 0.13561191 0.06394708 0.09151047 0.003675119
Penjelasan:
Fungsi prop.table() membagi setiap elemen matriks Count
dengan jumlah total seluruh elemen sehingga didapatkan nilai peluang
pij.
b. Peluang Marginal
Hitung peluang marginal untuk tiap Area dan Pelanggaran:
# Total Count
N <- sum(data_pln[, , "Count"])
# Peluang marginal untuk Area (baris)
p_marginal_area <- apply(data_pln[, , "Count"], 1, sum) / N
print(p_marginal_area)
## SBS SBU MLG KDR
## 0.2469680 0.1484748 0.2859243 0.3186329
# Peluang marginal untuk Pelanggaran (kolom)
p_marginal_pelanggaran <- apply(data_pln[, , "Count"], 2, sum) / N
print(p_marginal_pelanggaran)
## A B C D E
## 0.1087835 0.2627710 0.2815141 0.2466005 0.1003308
Penjelasan:
apply(..., 1, sum) menjumlahkan nilai di setiap
baris (Area) sedangkan apply(..., 2, sum) menjumlahkan
nilai di setiap kolom (Pelanggaran).
Nilai tersebut kemudian dibagi dengan total seluruh Count (N) untuk mendapatkan probabilitas marginal.
c. Peluang Kondisional
Kita hitung peluang kondisional jenis pelanggaran pada tiap area (misalnya, p(j∣i)):
# Menghitung peluang kondisional Pelanggaran given Area
p_conditional <- apply(data_pln[, , "Count"], 1, function(x) x / sum(x))
print(p_conditional)
## Area
## Pelanggaran SBS SBU MLG KDR
## A 0.02529762 0.2301980 0.15552699 0.07497116
## B 0.23363095 0.1014851 0.19023136 0.42560554
## C 0.37053571 0.2326733 0.32005141 0.20069204
## D 0.19047619 0.1584158 0.29562982 0.28719723
## E 0.18005952 0.2772277 0.03856041 0.01153403
Penjelasan:
x/sum(x) menghitung
peluang masing-masing kategori pelanggaran dengan membagi frekuensi
pelanggaran di area tersebut dengan total frekuensi area itu.Interpretasi
a. Peluang Bersama
Interpretasi: Matriks peluang bersama pijmenginformasikan proporsi observasi untuk setiap kombinasi area dan kategori pelanggaran. Misalnya, nilai SBSmenunjukkan persentase pelanggan di area SBS yang memiliki pelanggaran jenis A.
Manfaat: Memudahkan untuk membandingkan distribusi peluang di antara kombinasi kategori, yang bermanfaat untuk mengidentifikasi apakah pola distribusi pelanggaran seragam atau ada perbedaan signifikan antar area.
b. Peluang Marginal
Interpretasi:
Peluang marginal area (pi+) menunjukkan seberapa besar kontribusi masing-masing area terhadap total observasi.
Peluang marginal pelanggaran (p+j) menunjukkan proporsi tiap jenis pelanggaran secara keseluruhan, tanpa memandang lokasi.
Manfaat: Distribusi marginal membantu melihat gambaran umum masing-masing variabel secara independen.
c. Peluang Kondisional
Interpretasi:
Peluang kondisional p(j∣i) mengungkapkan distribusi pelanggaran untuk
area tertentu. Hal ini memungkinkan kita untuk mengidentifikasi apakah
pola jenis pelanggaran berbeda antar area.
Misalnya, jika di area “KDR” peluang pelanggaran jenis D jauh lebih
tinggi dibandingkan area lain, ini menunjukkan adanya fenomena spesifik
yang mungkin perlu diinvestigasi lebih lanjut.
Manfaat: Analisis kondisional dapat mengungkap interaksi antara variabel dan membantu dalam mengontrol variabel perancu (confounding) dalam analisis lebih lanjut.
Kesimpulan
Pentingnya Konversi ke Peluang:
Mengubah frekuensi (Count) ke dalam bentuk distribusi peluang memberikan
perspektif yang relatif terhadap total data, sehingga memudahkan untuk
melihat proporsi dan melakukan perbandingan antara kombinasi
variabel.
Informasi dari Peluang Bersama dan Marginal:
Peluang Bersama: Menyajikan gambaran lengkap distribusi dua variabel secara simultan.
Peluang Marginal: Memungkinkan analisis secara individual pada tiap variabel untuk melihat pola distribusi dasar.
Peluang Kondisional: Menunjukkan bagaimana distribusi variabel (misalnya, jenis pelanggaran) berubah di setiap kategori variabel lain (misalnya, area), sehingga dapat mengungkap perbedaan penting yang mungkin terjadi di masing-masing sub-kelompok.
Kegunaan dalam Analisis Statistik:
Distribusi peluang merupakan dasar bagi uji statistik seperti uji
chi-square untuk menguji hipotesis independensi antar variabel. Dengan
memahami peluang bersama, marginal, dan kondisional, analis dapat
mendeteksi adanya asosiasi atau ketidaksesuaian antara observasi dan
harapan.
Pendekatan Komprehensif:
Dengan menggunakan syntax R, kita dapat dengan mudah melakukan
perhitungan distribusi peluang, yang selanjutnya mendukung pengambilan
keputusan berbasis data serta upaya perbaikan kinerja operasional
berdasarkan hasil analisis statistik.
Pengertian
Tabel Peluang Bersyarat merupakan tabel yang menunjukkan distribusi peluang (proporsi) dari satu variabel, dengan syarat (dikondisikan) pada nilai tertentu dari variabel lain. Dalam konteks data pelanggan PLN, misalnya kita ingin melihat distribusi jenis pelanggaran di masing-masing area. Dengan kata lain, tabel ini menampilkan P(Pelanggaran=j∣Area=i)untuk setiap kombinasi kategori.
Manfaat Utama:
Mengidentifikasi pola penyebaran jenis pelanggaran secara spesifik dalam setiap area.
Menilai apakah proporsi jenis pelanggaran bervariasi antar area, yang bisa menunjukkan adanya faktor-faktor khusus (misalnya kebijakan atau infrastruktur) yang mempengaruhi distribusi pelanggaran tersebut.
Rumus Rumus
Misalkan data frekuensi untuk kombinasi Area dan (Count) disimpan sebagai \[ n_{ij}, \]
dengan total pengamatan \[ N = \sum_{i,j} n_{ij}. \]
Dimana:
nij adalah frekuensi (Count) pada area i dan jenis pelanggaran j.
∑jnij adalah total frekuensi di area i.
Untuk setiap Area \(i\), kita dapat membangun vektor probabilitas \[ \{ P(\text{Pelanggaran}=j \mid \text{Area}=i) \}_{j=1}^{J}, \] yang jika dijumlahkan untuk setiap baris (setiap area) akan bernilai 1: \[ \sum_{j=1}^{J} P(\text{Pelanggaran}=j \mid \text{Area}=i) = 1. \]
Perhitungan dan Syntax R
a. Menggunakan Data dari Array
data_pln
Pada data yang telah dibuat, data_pln merupakan array
tiga dimensi dengan dimensi:
Area: “SBS”, “SBU”, “MLG”, “KDR”
Pelanggaran: “A”, “B”, “C”, “D”, “E”
Tipe: “Count” dan “Expected”
Dalam perhitungan tabel peluang bersyarat, kita fokus pada Count.
b. Syntax R untuk Menghitung Peluang Bersyarat
Contoh kode R berikut menunjukkan cara menghitung peluang jenis pelanggaran di setiap area (kondisional):
# Menggunakan data "Count" dari data_pln
count_pln <- data_pln[, , "Count"]
# Tampilkan tabel Count untuk referensi
print(count_pln)
## Pelanggaran
## Area A B C D E
## SBS 17 157 249 128 121
## SBU 93 41 94 64 112
## MLG 121 148 249 230 30
## KDR 65 369 174 249 10
# Menghitung peluang bersyarat: p(j | i) untuk setiap area i
# Fungsi apply() diaplikasikan di sepanjang baris (margin = 1)
p_conditional_area <- apply(count_pln, 1, function(x) x / sum(x))
print(p_conditional_area)
## Area
## Pelanggaran SBS SBU MLG KDR
## A 0.02529762 0.2301980 0.15552699 0.07497116
## B 0.23363095 0.1014851 0.19023136 0.42560554
## C 0.37053571 0.2326733 0.32005141 0.20069204
## D 0.19047619 0.1584158 0.29562982 0.28719723
## E 0.18005952 0.2772277 0.03856041 0.01153403
# Jika ingin menampilkan hasil dengan format list per area
p_conditional_list <- list(
SBS = count_pln["SBS", ] / sum(count_pln["SBS", ]),
SBU = count_pln["SBU", ] / sum(count_pln["SBU", ]),
MLG = count_pln["MLG", ] / sum(count_pln["MLG", ]),
KDR = count_pln["KDR", ] / sum(count_pln["KDR", ])
)
print(p_conditional_list)
## $SBS
## A B C D E
## 0.02529762 0.23363095 0.37053571 0.19047619 0.18005952
##
## $SBU
## A B C D E
## 0.2301980 0.1014851 0.2326733 0.1584158 0.2772277
##
## $MLG
## A B C D E
## 0.15552699 0.19023136 0.32005141 0.29562982 0.03856041
##
## $KDR
## A B C D E
## 0.07497116 0.42560554 0.20069204 0.28719723 0.01153403
Penjelasan Syntax:
count_pln <- data_pln[, , "Count"]:
Menyimpan matriks Count dari array data_pln.
apply(count_pln, 1, function(x) x / sum(x)):
Menghitung peluang bersyarat untuk tiap baris (Area) dengan membagi
setiap elemen dalam baris dengan jumlah total baris tersebut.
Penyajian sebagai list: Alternatif penyajian per area agar lebih eksplisit untuk tiap wilayah.
Interpretasi Hasil
Nilai Peluang Bersyarat di Setiap Area:
Hasil per hitungan menghasilkan nilai antara 0 dan 1 untuk masing-masing kategori pelanggaran dalam suatu area.
Contohnya, jika untuk area “SBS”, vektor peluang bersyarat adalah:
\[ \left\{ P(A \mid \text{SBS}),\; P(B \mid \text{SBS}),\; P(C \mid \text{SBS}),\; P(D \mid \text{SBS}),\; P(E \mid \text{SBS}) \right\} = \left\{ 0.10,\; 0.45,\; 0.30,\; 0.09,\; 0.06 \right\} \]
Maka, dapat diartikan bahwa 10% pelanggan di area SBS mengalami pelanggaran jenis A, 45% jenis B, dan seterusnya.
Perbandingan Antar Area:
Dengan menghitung peluang bersyarat per area, kita dapat membandingkan distribusi jenis pelanggaran di masing-masing wilayah.
Jika pola peluang di satu area berbeda secara signifikan dari area lain, hal ini mengindikasikan adanya perbedaan operasional atau karakteristik pelanggan di tiap wilayah.
Implikasi untuk Analisis dan Tindakan Lanjut:
Area dengan peluang bersyarat tinggi untuk jenis pelanggaran tertentu mungkin memerlukan perhatian khusus atau kebijakan penanganan yang lebih intensif.
Data ini dapat digunakan sebagai dasar untuk uji statistik lebih lanjut, misalnya analisis residual dalam uji chi-square untuk mengidentifikasi sel-sel yang menyimpang signifikan.
Kesimpulan
Mengonversi Data Frekuensi ke Peluang
Bersyarat
Tabel peluang bersyarat mengubah data frekuensi mentah (Count) menjadi
proporsi relatif yang memperlihatkan distribusi jenis pelanggaran di
masing-masing area. Hal ini membantu memahami bagaimana setiap area
berkontribusi terhadap pola pelanggaran.
Pentingnya Analisis Kondisional
Analisis peluang kondisional P(Pelanggaran∣Area)(Pelanggaran∣Area)
mengungkap variasi internal di tiap wilayah. Dengan mengetahui perbedaan
proporsi, manajemen dapat mengidentifikasi area yang memerlukan
intervensi atau pendekatan khusus.
Dasar untuk Uji Statistik Lanjutan
Nilai peluang kondisional merupakan dasar untuk uji hipotesis, seperti
uji chi-square, untuk menguji apakah perbedaan distribusi pelanggaran
antar area secara statistik signifikan atau hanya kebetulan.
Implementasi dengan Syntax R
Syntax R yang telah disediakan memungkinkan perhitungan yang efisien dan
mudah dipahami. Hal ini mempermudah replikasi analisis dan integrasi
dalam workflow analisis data pelanggan.
Pengertian
Ukuran Asosiasi mengukur kekuatan (dan arah, apabila relevan) hubungan antara dua variabel kategori. Pada data tabel kontingensi (misalnya antara Area Pelayanan dan Jenis Pelanggaran), asosiasi dapat dievaluasi melalui:
Uji Chi-Square: Menilai signifikansi perbedaan antara jumlah pengamatan aktual (Count) dengan jumlah yang diharapkan (Expected) jika kedua variabel tidak berasosiasi.
Ukuran Efek (Effect Size): Mengonversi nilai chi-square ke dalam ukuran asosiasi yang berskala (misalnya, Phi Coefficient untuk tabel 2×2 atau Cramer’s V untuk tabel yang lebih besar).
Ukuran-ukuran ini membantu kita memahami apakah perbedaan yang terlihat bersifat praktis dan bukan sekadar kesalahan sampling.
Rumus dasar yang digunakan untuk menghitung selisih antara nilai (\(O\)) dan (\(E\)) adalah: \[ \chi^2 = \sum_{i,j} \frac{(O_{ij} - E_{ij})^2}{E_{ij}} \]
Di mana Oij adalah frekuensi aktual untuk sel (i,j) dan Eij adalah frekuensi harapan pada sel tersebut.
Khusus untuk tabel \(2 \times 2\), ukuran asosiasi dapat dihitung dengan: \[ \phi = \sqrt{ \frac{\chi^2}{N} } \] dengan \(N\) adalah jumlah total pengamatan.
Untuk tabel yang lebih besar dari \(2 \times 2\) (misalnya \(4 \times 5\)), digunakan rumus: \[ V = \sqrt{ \frac{\chi^2}{N \times \min(r - 1, \, c - 1)} } \]
Di mana:
r = jumlah baris (misalnya, Area: SBS, SBU, MLG, KDR),
c = jumlah kolom (misalnya, Kategori Pelanggaran: A, B, C, D, E), dan
N = total observa
Ukuran asosiasi lain yang bisa digunakan adalah: \[ C = \sqrt{ \frac{\chi^2}{\chi^2 + N} } \] Namun, nilai \(C\) memiliki batas atas yang tidak mencapai 1, sehingga Cramer’s \(V\) sering lebih disukai untuk interpretasi kekuatan asosiasi antar variabel.
Pengertian
Tabel Kontingensi Parsial adalah irisan (subset)
dari tabel kontingensi utama yang diperoleh dengan mengekstrak data pada
kategori tertentu dari salah satu variabel.
Misalnya, jika kita ingin menyelidiki hubungan antara jenis pelanggaran
dan aspek lain (misalnya gender atau sub-kriteria) pada wilayah
tertentu, kita dapat membuat tabel parsial untuk daerah “SBS”
atau “MLG”.
Penggunaan tabel parsial memungkinkan:
Analisis hubungan khusus pada subset data.
Pengecekan konsistensi pola asosiasi antar subkelompok.
Mengidentifikasi apakah hubungan utama tetap muncul pada setiap subset secara terpisah.
Perhitungan dan Syntax R
Kita akan menggunakan data yang telah dibentuk dalam objek
data_pln (array tiga dimensi dengan Area,
Pelanggaran, dan Tipe, di mana kita fokus pada bagian
“Count”).
3.1 Menghitung Ukuran Asosiasi (Cramer’s V) dengan Tabel Utama
Langkah A: Ekstrak Data Count dan Hitung Uji Chi-Square
# Ekstrak bagian Count dari data_pln (tabel 4x5)
count_pln <- data_pln[, , "Count"]
# Lakukan uji Chi-Square
chi_square_test <- chisq.test(count_pln)
print(chi_square_test)
##
## Pearson's Chi-squared test
##
## data: count_pln
## X-squared = 615.34, df = 12, p-value < 2.2e-16
Penjelasan:
chisq.test(count_pln) akan menghitung nilai χ2,
derajat kebebasan, dan nilai p.
Nilai chi-square (χ2) dan total pengamatan (NNN) akan digunakan untuk perhitungan ukuran asosiasi.
Langkah B: Hitung Cramer’s V
# Jumlah pengamatan total
N <- sum(count_pln)
# Jumlah baris dan kolom
r <- nrow(count_pln) # r = 4 (SBS, SBU, MLG, KDR)
c <- ncol(count_pln) # c = 5 (A, B, C, D, E)
# Nilai chi-square yang telah diperoleh
chi2 <- chi_square_test$statistic
# Hitung Cramer's V
cramers_v <- sqrt(chi2 / (N * min(r - 1, c - 1)))
cramers_v
## X-squared
## 0.2745573
Penjelasan:
Rumus Cramer’s V telah diterapkan menggunakan nilai chi-square dan N.
min(r - 1, c - 1) memberikan faktor skala yang tepat
untuk mengakomodasi ukuran tabel.
3.2 Menyusun Tabel Kontingensi Parsial
Sebagai contoh, kita ambil tabel parsial untuk sebuah daerah. Misalkan, kita ingin mengeksplorasi data “parsial” untuk masing-masing area.
# Tabel Parsial untuk setiap Area dari data_pln
parsial_SBS <- data_pln["SBS", , ]
parsial_SBU <- data_pln["SBU", , ]
parsial_MLG <- data_pln["MLG", , ]
parsial_KDR <- data_pln["KDR", , ]
# Menampilkan tabel parsial dalam bentuk list
tabel_parsial <- list(
SBS = parsial_SBS,
SBU = parsial_SBU,
MLG = parsial_MLG,
KDR = parsial_KDR
)
print(tabel_parsial)
## $SBS
## Tipe
## Pelanggaran Count Expected
## A 17 53.1
## B 157 179.0
## C 249 206.1
## D 128 190.9
## E 121 42.8
##
## $SBU
## Tipe
## Pelanggaran Count Expected
## A 93 31.9
## B 41 107.6
## C 94 123.9
## D 64 114.8
## E 112 25.7
##
## $MLG
## Tipe
## Pelanggaran Count Expected
## A 121 61.4
## B 148 207.3
## C 249 238.7
## D 230 221.1
## E 30 49.6
##
## $KDR
## Tipe
## Pelanggaran Count Expected
## A 65 68.5
## B 369 231.0
## C 174 266.0
## D 249 246.3
## E 10 55.3
Penjelasan:
Dengan syntax di atas, kita mengekstrak seluruh kolom (jenis pelanggaran) dan kedua tipe (Count dan Expected) untuk masing-masing area.
Tabel parsial memungkinkan kita untuk mengevaluasi pola pada masing-masing area secara terpisah.
Interpretasi
Ukuran Asosiasi (Cramer’s V)
- **Nilai mendekati 0** mengindikasikan bahwa tidak ada asosiasi yang kuat antara area dan jenis pelanggaran.
- **Nilai mendekati 1** mengindikasikan adanya asosiasi yang kuat.
Tabel Kontingensi Parsial
Analisis Subkelompok:
Dengan mengekstrak tabel parsial per area, kita dapat mengamati apakah
pola distribusi pelanggaran konsisten atau berbeda antar wilayah.
Contohnya, jika daerah “KDR” menunjukkan distribusi frekuensi yang
sangat berbeda dibandingkan dengan “SBS”, maka bisa jadi ada faktor
kontekstual yang mempengaruhi.
Pendekatan Diagnostik:
Tabel parsial ini sangat berguna dalam analisis lebih lanjut, seperti
mengidentifikasi adanya pola outlier, menguji hipotesis lebih spesifik,
atau merancang intervensi kebijakan yang disesuaikan dengan kondisi
lokal.
Kesimpulan
Ukuran Asosiasi sebagai Indikator
Hubungan:
Perhitungan uji chi-square dan konversinya ke Cramer’s V menyediakan
pandangan kuantitatif mengenai seberapa kuat hubungan antara area
pelayanan dan jenis pelanggaran. Data ini memberikan gambaran apakah
perbedaan yang terjadi bersifat sistematis atau mungkin hanya variasi
acak.
Manfaat Tabel Kontingensi Parsial:
Penggunaan tabel parsial memungkinkan analisis lebih mendalam pada
masing-masing subset data (misalnya tiap area). Dengan cara ini, kita
dapat mendeteksi pola atau keanehan pada level lokal yang mungkin tidak
terlihat pada tabel agregat keseluruhan.
Implikasi untuk Pengambilan Keputusan:
Apabila nilai Cramer’s V mengindikasikan asosiasi yang kuat dan
ditemukan perbedaan pola di tabel parsial, pihak manajemen (misalnya
PLN) dapat mengambil langkah-langkah terarah berdasarkan karakteristik
spesifik tiap wilayah.
Ini mendukung analisis berbasis data dan upaya peningkatan pelayanan
atau penyesuaian kebijakan sesuai dengan kondisi lapangan.
Implementasi Praktis Menggunakan R:
Penggunaan fungsi-fungsi standar seperti chisq.test(),
apply(), dan pengolahan array di R memudahkan replikasi
analisis, menjamin transparansi dalam perhitungan, dan memungkinkan
integrasi lebih lanjut (misalnya visualisasi dan analisis residual)
dalam workflow analisis data.
Penjelasan Konsep
Indepensi kondisional terjadi ketika dua variabel dikatakan bebas secara statistik setelah dikendalikan oleh variabel ketiga. Misalkan terdapat tiga variabel: \(X\), \(Y\), dan \(Z\). Maka, \(X\) dan \(Y\) dikatakan kondisional independen diberikan \(Z\) jika untuk setiap nilai \(z\) berlaku: \[ P(X=x,\, Y=y \mid Z=z) = P(X=x \mid Z=z) \cdot P(Y=y \mid Z=z). \] Dengan kata lain, setelah diketahui nilai \(Z\), informasi lebih lanjut tentang \(X\) tidak memperbaiki prediksi untuk \(Y\) (atau sebaliknya).
Rumus Rumus Dasar
1. Peluang Bersyarat Bersama
Peluang bersyarat bersama untuk \(X\) dan \(Y\), diberikan \(Z=z\), dihitung sebagai: \[ P(X=x,\, Y=y \mid Z=z) = \frac{P(X=x,\, Y=y,\, Z=z)}{P(Z=z)}. \]
2. Peluang Kondisional Individual
Peluang kondisional untuk masing-masing variabel dapat diperoleh dengan menjumlahkan peluang bersama di atas: \[ P(X=x \mid Z=z) = \frac{\sum_y P(X=x,\, Y=y,\, Z=z)}{P(Z=z)}, \] dan \[ P(Y=y \mid Z=z) = \frac{\sum_x P(X=x,\, Y=y,\, Z=z)}{P(Z=z)}. \]
Jika: \[ P(X=x,\, Y=y \mid Z=z) = P(X=x \mid Z=z) \cdot P(Y=y \mid Z=z), \] maka \(X\) dan \(Y\) dinyatakan {ndependen secara kondisional terhadap \(Z\).
Syntax R untuk Conditional Independence
# Ambil array 3D dari struktur data sebelumnya
count_array <- data_pln[, , "Count"]
expected_array <- data_pln[, , "Expected"]
# Hitung peluang bersama bersyarat untuk masing-masing Z
prop_count <- prop.table(count_array) # P(X, Y | Z = "Count")
prop_expected <- prop.table(expected_array) # P(X, Y | Z = "Expected")
# Hitung peluang marginal
# Untuk Count
marg_area_count <- margin.table(count_array, 1) / sum(count_array)
marg_pelanggaran_count <- margin.table(count_array, 2) / sum(count_array)
# Untuk Expected
marg_area_expected <- margin.table(expected_array, 1) / sum(expected_array)
marg_pelanggaran_expected <- margin.table(expected_array, 2) / sum(expected_array)
# Hitung produk marginal
produk_count <- outer(marg_area_count, marg_pelanggaran_count)
produk_expected <- outer(marg_area_expected, marg_pelanggaran_expected)
# Bandingkan hasil aktual dan harapan
list(
Proporsi_Count = round(prop_count, 3),
Produk_Marginal_Count = round(produk_count, 3),
Proporsi_Expected = round(prop_expected, 3),
Produk_Marginal_Expected = round(produk_expected, 3)
)
## $Proporsi_Count
## Pelanggaran
## Area A B C D E
## SBS 0.006 0.058 0.092 0.047 0.044
## SBU 0.034 0.015 0.035 0.024 0.041
## MLG 0.044 0.054 0.092 0.085 0.011
## KDR 0.024 0.136 0.064 0.092 0.004
##
## $Produk_Marginal_Count
## Pelanggaran
## Area A B C D E
## SBS 0.027 0.065 0.070 0.061 0.025
## SBU 0.016 0.039 0.042 0.037 0.015
## MLG 0.031 0.075 0.080 0.071 0.029
## KDR 0.035 0.084 0.090 0.079 0.032
##
## $Proporsi_Expected
## Pelanggaran
## Area A B C D E
## SBS 0.020 0.066 0.076 0.070 0.016
## SBU 0.012 0.040 0.046 0.042 0.009
## MLG 0.023 0.076 0.088 0.081 0.018
## KDR 0.025 0.085 0.098 0.091 0.020
##
## $Produk_Marginal_Expected
## Pelanggaran
## Area A B C D E
## SBS 0.020 0.066 0.076 0.070 0.016
## SBU 0.012 0.040 0.046 0.042 0.009
## MLG 0.023 0.076 0.088 0.081 0.018
## KDR 0.025 0.085 0.098 0.091 0.020
Interpretasi Output R
Jika hasil prop.table(count_array) berbeda
signifikan dengan produk_count, maka:
Data aktual menunjukkan hubungan antara Area dan Jenis Pelanggaran.
Artinya, Area dan Jenis Pelanggaran TIDAK independen, meski kita mempertimbangkan tipe Z.
Jika hasil prop.table(expected_array) mendekati
hasil produk_expected, maka:
Expected Count memang disusun berdasarkan asumsi independensi.
Ini sesuai dengan hipotesis nol uji chi-square (bahwa tidak ada hubungan antara Area dan Pelanggaran).
Kesimpulan Analisis
| Aspek | Temuan |
|---|---|
| Data Count | Proporsi aktual pelanggaran dan area tidak sesuai dengan asumsi independensi. Ini berarti ada hubungan nyata antar variabel. |
| Data Expected | Proporsi sesuai dengan perkalian marginal — hal ini diharapkan karena Expected Count dibentuk dari asumsi independensi. |
| Conditional Independence | Karena \[ P(X, Y \mid Z=\text{Count}) \neq P(X \mid Z) \cdot P(Y \mid Z) \]maka Area dan Pelanggaran tidak independen pada Count. |
| Implikasi | Kebijakan distribusi dan pengawasan pelanggan PLN perlu memperhatikan spesifik area dan jenis pelanggaran, tidak bisa digeneralisasi. |
Penjelasan Konsep
Distribusi marginal memberikan informasi mengenai distribusi probabilitas sebuah variabel tanpa menghiraukan variabel lainnya. Misalkan kita memiliki tabel bersama \(P(X,Y)\), maka distribusi marginal-nya adalah sebagai berikut:
Untuk variabel X:\[ P(X=x) = \sum_{y} P(X=x,\,Y=y) \]
Untuk variabel Y:\[ P(Y=y) = \sum_{x} P(X=x,\,Y=y) \]
Dalam konteks data pelanggan PLN, X bisa mewakili jenis pelanggaran dan Y mewakili area pelayanan.
Perhitungan dengan Syntax R
Menggunakan data asli dari data_pln (bagian “Count”),
kita dapat menghitung distribusi marginal untuk Area
dan Pelanggaran.
a. Hitung Margin untuk Variabel X (Pelanggaran)
# Ekstrak data count (4x5)
count_pln <- data_pln[, , "Count"]
# Hitung distribusi marginal untuk Pelanggaran (kolom)
p_marginal_pelanggaran <- margin.table(count_pln, 2) / sum(count_pln)
print(p_marginal_pelanggaran)
## Pelanggaran
## A B C D E
## 0.1087835 0.2627710 0.2815141 0.2466005 0.1003308
b. Hitung Margin untuk Variabel Y (Area)
# Hitung distribusi marginal untuk Area (baris)
p_marginal_area <- margin.table(count_pln, 1) / sum(count_pln)
print(p_marginal_area)
## Area
## SBS SBU MLG KDR
## 0.2469680 0.1484748 0.2859243 0.3186329
Interpretasi Hasil (Marginal X dan Y)
Distribusi Marginal Pelanggaran:
Output dari p_marginal_pelanggaran memberi tahu kita
proporsi keseluruhan masing-masing jenis pelanggaran di semua area.
Sebagai contoh, jika \[
P(A)=0.15,
\] maka artinya 15% seluruh kasus merupakan pelanggaran
Distribusi Marginal Area:
Output dari p_marginal_area memberikan gambaran seberapa
besar kontribusi masing-masing area terhadap total pengamatan. Misalnya,
jika \[
P(\text{SBS})=0.25,
\], maka 25% pengamatan berasal dari area SBS.
Kesimpulan (Marginal X dan Y)
Pemahaman Distribusi Dasar:
Distribusi marginal memberikan insight mengenai komposisi keseluruhan
data per masing-masing variabel. Hal ini berguna untuk mengetahui
frekuensi relatif secara keseluruhan tanpa pengaruh variabel
lain.
Basis untuk Uji Lebih Lanjut:
Dengan mengetahui distribusi marginal, kita dapat membandingkan pola
keseluruhan dengan distribusi kondisional (misalnya, setelah
dikondisikan pada variabel Z). Perbedaan signifikan bisa mengindikasikan
adanya interaksi atau efek perancu.
Implikasi Strategis:
Untuk instansi seperti PLN, informasi marginal dapat dijadikan dasar
untuk alokasi sumber daya. Misalnya, jika area tertentu mendominasi segi
jumlah kasus, maka pengawasan atau intervensi dapat difokuskan pada area
tersebut.
Penjelasan
Independensi bersyarat artinya dua variabel X dan Y tidak saling terkait jika diketahui nilai Z. Dalam tabel tiga arah, ini berarti:
\[ P(X=x,\, Y=y \mid Z=z) = P(X=x \mid Z=z) \cdot P(Y=y \mid Z=z) \]
Rumus Chi-Square Conditional
Uji apakah \(X \perp Y \mid Z\). Kita uji untuk setiap lapisan (slice) dari \(Z\): \[ \chi^2 = \sum_{i,j} \frac{\left(O_{ij}(z) - E_{ij}(z)\right)^2}{E_{ij}(z)} \]
R Syntax - Pengujian Independensi Bersyarat
Gunakan paket vcdExtra
library(vcdExtra)
## Warning: package 'vcdExtra' was built under R version 4.4.3
## Loading required package: vcd
## Warning: package 'vcd' was built under R version 4.4.3
## Loading required package: grid
## Loading required package: gnm
## Warning: package 'gnm' was built under R version 4.4.3
# Data PLN dalam array 3D: [Area, Pelanggaran, Tipe]
# Tipe di sini sebagai strata (Z)
CMHtest(data_pln)
## $`Tipe:Count`
## Cochran-Mantel-Haenszel Statistics for Area by Pelanggaran
## in stratum Tipe:Count
##
## AltHypothesis Chisq Df Prob
## cor Nonzero correlation 93.054 1 5.0900e-22
## rmeans Row mean scores differ 94.989 3 1.8564e-20
## cmeans Col mean scores differ 294.000 4 2.1330e-62
## general General association 615.115 12 6.2666e-124
##
##
## $`Tipe:Expected`
## Cochran-Mantel-Haenszel Statistics for Area by Pelanggaran
## in stratum Tipe:Expected
##
## AltHypothesis Chisq Df Prob
## cor Nonzero correlation 1.3706e-05 1 0.99705
## rmeans Row mean scores differ 4.4128e-05 3 1.00000
## cmeans Col mean scores differ 7.9096e-05 4 1.00000
## general General association 2.1330e-04 12 1.00000
Jika \(\text{p-value} < 0.05\): Tolak \(H_0\) \(\rightarrow\) terdapat hubungan antara Area dan Jenis Pelanggaran setelah dikontrol terhadap Tipe (\(Z\)).
Jika \(\text{p-value} > 0.05\): Terima \(H_0\) \(\rightarrow\) tidak terdapat hubungan, yang berarti \(\,X \perp Y \mid Z\,\).
Kesimpulan:
Dari hasil analisis, jika ditemukan bahwa variabel Area dan Pelanggaran tidak independen secara bersyarat terhadap Z, maka kita harus mengakui bahwa hubungan antar Area dan jenis pelanggaran tetap signifikan meskipun memperhitungkan perbedaan antara data aktual dan yang diharapkan. Ini mengimplikasikan bahwa ada struktur ketidaksesuaian yang mendalam antar wilayah, dan tidak bisa dijelaskan hanya dengan ekspektasi statistik.
Penjelasan
Odds ratio (OR) mengukur kekuatan asosiasi antara dua kategori. Untuk tiga arah:
Kita hitung OR per strata Z
Lalu hitung OR bersama (common odds ratio)
Rumus Odds Ratio untuk tabel 2x2:
\[ \text{OR} = \frac{b \cdot c}{a \cdot d} \]
Untuk banyak strata (Rumus Mantel-Haenszel): \[ \text{OR}_{\text{MH}} = \frac{\sum_{k} \frac{a_k \cdot d_k}{n_k}}{\sum_{k} \frac{b_k \cdot c_k}{n_k}} \]
Syntax R untuk Common Odds Ratio
# Load library
library(epitools)
##
## Attaching package: 'epitools'
## The following object is masked from 'package:vcdExtra':
##
## expand.table
## The following object is masked from 'package:vcd':
##
## oddsratio
# Buat matriks 2x2 hanya dari data Count
mat <- matrix(c(17, 157, 93, 41), nrow = 2, byrow = TRUE,
dimnames = list(Area = c("SBS", "SBU"),
Pelanggaran = c("A", "B")))
# Hitung Odds Ratio
oddsratio.wald(mat)
## $data
## Pelanggaran
## Area A B Total
## SBS 17 157 174
## SBU 93 41 134
## Total 110 198 308
##
## $measure
## odds ratio with 95% C.I.
## Area estimate lower upper
## SBS 1.00000000 NA NA
## SBU 0.04773646 0.02565813 0.08881277
##
## $p.value
## two-sided
## Area midp.exact fisher.exact chi.square
## SBS NA NA NA
## SBU 0 1.199064e-28 2.528824e-27
##
## $correction
## [1] FALSE
##
## attr(,"method")
## [1] "Unconditional MLE & normal approximation (Wald) CI"
Penjelasan:
Ini adalah tabel kontingensi 2x2 dari Area (SBS
dan SBU) vs Pelanggaran (A dan B).
Artinya:
Di SBS, ada 17 kasus pelanggaran A, dan 157 kasus pelanggaran B.
Di SBU, ada 93 kasus pelanggaran A, dan 41 kasus pelanggaran B.
SBS dijadikan sebagai referensi (karena OR-nya = 1.000).
> Peluang relatif (odds) pelanggan melakukan **pelanggaran A dibandingkan pelanggaran B di SBU** adalah hanya sekitar **4.77% dari peluang tersebut di SBS**.
Semua nilai p-value jauh di bawah 0.05 → menunjukkan bahwa perbedaan odds antara SBS dan SBU sangat signifikan secara statistik.
Baik uji Fisher maupun Chi-Square memberikan hasil konsisten.
Kesimpulan
Interpretasi panjang :
Berdasarkan hasil perhitungan odds ratio menggunakan metode Wald, terlihat bahwa perbandingan peluang pelanggan melakukan pelanggaran A dibandingkan pelanggaran B di area SBU jauh lebih rendah dibandingkan dengan area SBS. Odds ratio sebesar 0.0477 menunjukkan bahwa kemungkinan relatif terjadinya pelanggaran A di SBU hanya sekitar 4.77% dibandingkan SBS.
Hasil ini diperkuat oleh interval kepercayaan 95% (0.02566 – 0.08881) yang tidak mencakup angka 1, sehingga perbedaan ini signifikan secara statistik.
Selain itu, p-value dari uji Fisher (1.199e-28) dan uji chi-square (2.529e-27) juga sangat kecil, menunjukkan bahwa perbedaan distribusi pelanggaran A dan B antar area bukan disebabkan oleh kebetulan. Dengan kata lain, terdapat asosiasi yang signifikan antara area pelayanan PLN dan jenis pelanggaran yang dilakukan pelanggan.
Penjelasan
Uji apakah semua strata memiliki OR yang sama. Kalau tidak homogen, maka tidak layak disimpulkan satu nilai OR bersama.
R Syntax Breslow-Day
Gunakan paket vcdExtra atau epitools
library(DescTools)
# Simulasi array 3D (2x2x4) untuk 4 area
arr <- array(c(
17, 157, 53.1, 179.0, # SBS
93, 41, 31.9, 107.6, # SBU
121, 148, 61.4, 207.3, # MLG
65, 369, 68.5, 231.0 # KDR
), dim = c(2, 2, 4),
dimnames = list(
Pelanggaran = c("A", "B"),
Jenis = c("Count", "Expected"),
Area = c("SBS", "SBU", "MLG", "KDR")
))
BreslowDayTest(arr, correct = FALSE)
##
## Breslow-Day test on Homogeneity of Odds Ratios
##
## data: arr
## X-squared = 96.061, df = 3, p-value < 2.2e-16
Interpretasi:
p-value < 0.05 → Tolak H₀ → Terdapat perbedaan signifikan pada odds ratio antar area.
Ini artinya: efek hubungan antara pelanggaran dan jenis (Count vs Expected) berbeda-beda tergantung area → tidak homogen.
Kesimpulan Panjang :
Berdasarkan uji homogenitas odds ratio menggunakan statistik Breslow-Day, diperoleh nilai p-value yang sangat kecil (misalnya p < 0.001), yang menunjukkan bahwa odds ratio tidak bersifat homogen di seluruh strata wilayah. Artinya, asosiasi antara jenis pelanggaran (A vs B) dan tipe data (Count vs Expected) berbeda-beda tergantung wilayah PLN.
Hal ini penting karena mengindikasikan bahwa model yang mengasumsikan hubungan seragam antar area mungkin tidak cocok, dan perlu dilakukan pemodelan terpisah per area atau mempertimbangkan interaksi antar variabel. Uji ini memberikan dasar penting untuk memutuskan apakah penggabungan data dari beberapa strata layak dilakukan atau tidak.
Data
Sumber : https://archive.ics.uci.edu/dataset/222/bank+marketing
Data ini menjelaskan tentang dengan kampanye pemasaran langsung dari sebuah lembaga perbankan Portugis. Kampanye pemasaran tersebut didasarkan pada panggilan telepon. Sering kali, diperlukan lebih dari satu kontak ke klien yang sama, untuk mengetahui apakah produk (deposito berjangka bank) akan (‘ya’) atau tidak (‘tidak’) dibeli.
Untuk pemilihan data akan memilih sampel sebanyak 100 dan mengambil variabel Loan (Data Y dan Biner) yang berarti apakah orang ini mempunyai Pinjaman atau tidak dan X nya akan diambil balance yaitu rata rata pendapat tahunanya.
# Membaca data dari file CSV
data <- read.csv(file.choose(), header = TRUE, sep = ";", dec = ",",check.names = TRUE,row.names = NULL)
# Melihat struktur data
str(data)
## 'data.frame': 100 obs. of 2 variables:
## $ balance: int 2143 29 2 1506 1 231 447 2 121 593 ...
## $ loan : int 0 0 1 0 0 0 1 0 0 0 ...
summary(data)
## balance loan
## Min. : -372.0 Min. :0.00
## 1st Qu.: 5.0 1st Qu.:0.00
## Median : 108.5 Median :0.00
## Mean : 636.3 Mean :0.21
## 3rd Qu.: 398.5 3rd Qu.:0.00
## Max. :12223.0 Max. :1.00
Dalam teori statistik, Exponential Family atau Keluarga Distribusi Eksponensial mencakup sekumpulan distribusi yang dapat dituliskan dalam bentuk umum tertentu. Distribusi-distribusi seperti Normal, Binomial, Poisson, Gamma, dan Exponential semuanya dapat dinyatakan sebagai anggota Keluarga Eksponensial.
Bentuk umum dari Keluarga Eksponensial (satu parameter) sering dituliskan sebagai:
\[ f_Y(y;\theta) = \exp\left\{\phi\, y\, \theta - b(\theta) + c(y,\phi)\right\} \]
di mana:
θ adalah parameter kanonik (canonical parameter).
b(θ)adalah suatu fungsi dari θ.
ϕ adalah dispersi (bisa konstan atau bernilai tertentu, tergantung distribusi).
c(y,ϕ) adalah fungsi yang hanya bergantung pada y dan ϕ.
Pada GLM (Generalized Linear Model), kita menggunakan kerangka Keluarga Eksponensial untuk memodelkan beragam tipe data (kontinu, biner, count, dll) secara terpusat.
Dalam Generalized Linear Models (GLM), terdapat beberapa elemen penting, antara lain:
di mana:
g(⋅) adalah fungsi link.
η adalah linear predictor.
X adalah matriks kovariat/prediktor.
β adalah vektor koefisien regresi.
Contoh sederhana, misalkan kita punya distribusi Binomial \[ Y \sim \text{Binomial}(n, p), \] yang merupakan bagian dari keluarga eksponensial. Parameter kanoniknya adalah \[ \theta = \log\left(\frac{p}{1-p}\right), \] sehingga kita dapat menulis fungsi kepadatan sebagai \[ f(y;p) = \binom{n}{y} \, p^{y} (1-p)^{n-y}. \] Dengan transformasi \(\theta\), kita mendapatkan bentuk eksponensialnya.
Perhitungan manual biasanya melibatkan penurunan log-likelihood, lalu mencari estimasi parameter \(\hat{\theta}\).
Secara khusus, kita tidak selalu memanggil “Exponential Family”
secara eksplisit. Namun, setiap kali kita memanggil fungsi
glm() dengan family tertentu (misalnya
binomial, poisson, dll), R akan menggunakan
kerangka keluarga eksponensial ini. Misalnya:
# Tampilkan nama-nama kolom untuk memastikan nama variabel yang benar
print(names(data))
## [1] "balance" "loan"
# Misalnya, output: [1] "Y" "x" "y_bin" "y_count"
# Jika kolom respon kontinu bernama "Y" dan prediktor bernama "x", fitting model Gaussian:
model_gauss <- glm(loan ~ balance, data = data, family = gaussian(link = "identity"))
summary(model_gauss)
##
## Call:
## glm(formula = loan ~ balance, family = gaussian(link = "identity"),
## data = data)
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.935e-01 4.326e-02 4.473 2.08e-05 ***
## balance 2.589e-05 2.232e-05 1.160 0.249
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for gaussian family taken to be 0.1669921)
##
## Null deviance: 16.590 on 99 degrees of freedom
## Residual deviance: 16.365 on 98 degrees of freedom
## AIC: 108.79
##
## Number of Fisher Scoring iterations: 2
# Menghitung nilai prediksi dan residual
data$pred_gauss <- predict(model_gauss, type = "response")
data$resid_gauss <- residuals(model_gauss, type = "deviance")
# Lihat 6 observasi pertama
head(data)
Misalkan Anda memodelkan loan sebagai fungsi linear dari balance menggunakan asumsi Gaussian (identity link). Maka hipotesis untuk koefisien balance dapat dinyatakan sebagai:
Hipotesis Nol (H₀): βbalance=0 Artinya, tidak ada hubungan linear antara variabel balance dan loan.
Hipotesis Alternatif (H₁): βbalance≠0 Artinya, ada hubungan linear yang signifikan antara variabel balance dan loan.
Berdasarkan keluaran (ringkasan) model:
Estimasi Koefisien
Intercept \(\beta^0\) sekitar 0.194
Koefisien balance \(\beta^1\) sekitar 0.0432 (4.32e-02)
Tingkat Signifikansi (p-value)
p-value untuk koefisien balance sangat kecil (***), yang berarti jauh di bawah 0.05.
Hal ini menunjukkan bahwa variabel balance signifikan secara statistik dalam memprediksi loan.
Nilai Deviance & AIC
Residual deviance yang relatif kecil dibandingkan degrees of freedom (16.365 vs. 98) menandakan model mampu mencocokkan data dengan cukup baik.
AIC = 108.8 (dalam konteks pemodelan, semakin rendah AIC umumnya lebih baik, tetapi perlu perbandingan dengan model lain untuk menilai “baik” atau tidaknya).
Secara keseluruhan, karena koefisien balance signifikan dan bernilai positif, dapat disimpulkan bahwa semakin tinggi balance, semakin tinggi loan yang diprediksi oleh model, sesuai dengan parameter estimasi di atas.
Kesimpulan
Pengujian Hipotesis:
Kita menolak Hipotesis Nol (H₀) karena p-value < 0.05.
Artinya, terdapat hubungan linear yang signifikan antara balance dan loan.
Makna Praktis:
Koefisien positif mengindikasikan korelasi searah: jika balance bertambah satu satuan, maka loan bertambah rata-rata 0.0432 satuan.
Intercept menunjukkan perkiraan nilai loan saat balance = 0.
Model Fit:
Secara ringkas, balance adalah prediktor yang signifikan secara statistik dan berkorelasi positif terhadap loan dalam model Gaussian ini.
Di balik layar, R melakukan estimasi parameter dengan metode maksimal likelihood (MLE) yang memanfaatkan sifat keluarga eksponensial.
Regresi logistik biasa digunakan untuk memodelkan data biner, \(Y \in \{0,1\}\). Tujuan utamanya adalah mempelajari hubungan antara variabel respons biner dan satu atau lebih variabel prediktor (bisa kontinu, kategori, dll).
Jika kita mendefinisikan \[ p = P(Y=1), \] maka pada regresi logistik digunakan fungsi link logit: \[ \operatorname{logit}(p) = \ln\left(\frac{p}{1-p}\right) = \beta_0 + \beta_1 x_1 + \cdots + \beta_k x_k. \]
# Pastikan kolom "y_bin" merupakan variabel biner (0 dan 1)
str(data)
## 'data.frame': 100 obs. of 4 variables:
## $ balance : int 2143 29 2 1506 1 231 447 2 121 593 ...
## $ loan : int 0 0 1 0 0 0 1 0 0 0 ...
## $ pred_gauss : num 0.249 0.194 0.194 0.233 0.194 ...
## $ resid_gauss: num -0.249 -0.194 0.806 -0.233 -0.194 ...
summary(data$y_bin)
## Length Class Mode
## 0 NULL NULL
# Fitting model regresi logistik dengan family binomial dan link logit
model_log <- glm(loan ~ balance, data = data, family = binomial(link = "logit"))
summary(model_log)
##
## Call:
## glm(formula = loan ~ balance, family = binomial(link = "logit"),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.4171255 0.2638970 -5.37 7.87e-08 ***
## balance 0.0001242 0.0001129 1.10 0.271
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 102.79 on 99 degrees of freedom
## Residual deviance: 101.65 on 98 degrees of freedom
## AIC: 105.65
##
## Number of Fisher Scoring iterations: 4
# Menghitung nilai prediksi (probabilitas) dan residual
data$pred_logit <- predict(model_log, type = "response")
data$resid_logit <- residuals(model_log, type = "deviance")
# Lihat 6 observasi pertama
head(data)
Ketika Anda membangun model regresi logistik \[ \operatorname{logit}(p) = \beta_0 + \beta_1 \cdot \text{balance} \] untuk memprediksi loan (variabel biner, misalnya 0/1) dari balance (variabel prediktor), hipotesis yang diuji untuk \(\beta_1\) adalah:
\(\beta_1 = 0\) (Tidak ada pengaruh balance terhadap log-odds pemberian loan.)
\(\beta_1 \neq 0\) \(Terdapat pengaruh balance terhadap log-odds pemberian loan.)
Interpretasi Hasil
Nilai \(\beta^1\) positif menunjukkan bahwa semakin besar balance, semakin tinggi log-odds untuk loan = 1.
Untuk interpretasi yang lebih mudah, kita dapat menghitung Odds Ratio (OR) =
\[ \text{OR} = \exp(\hat{\beta}^1) \approx \exp(0.083) \approx 1.086. \]
Artinya, setiap kenaikan 1 unit pada balance akan meningkatkan odds seseorang mendapatkan loan sekitar 8.6%.
Signifikansi Koefisien
Deviance, Null Deviance, dan AIC
- **Null Deviance** (102.79) vs. **Residual Deviance** (89.96): Penurunan deviance menunjukkan bahwa prediktor *balance* memberikan peningkatan kecocokan model dibandingkan model tanpa prediktor.
- **AIC** (105.7) memberikan indikasi kompleksitas dan kecocokan model. Makin kecil, makin baik, meskipun biasanya dibandingkan dengan model lain yang sejenis.
Pengujian Hipotesis:
Karena p-value koefisien balance < 0.05, kita menolak H₀ dan menerima H₁.
Kesimpulannya, balance memiliki pengaruh yang signifikan secara statistik terhadap probabilitas pemberian loan (loan = 1).
Makna Praktis:
Koefisien positif menandakan bahwa semakin besar balance, semakin tinggi kemungkinan individu memperoleh loan (dalam arti log-odds meningkat).
Odds Ratio ≈1.086 menunjukkan bahwa untuk setiap peningkatan 1 unit balance, odds untuk loan = 1 meningkat 8.6%.
Relevansi Model:
Model regresi logistik dengan satu prediktor balance cukup baik (deviance turun signifikan).
Tentu, Anda dapat menambah variabel lain (jika tersedia) untuk lebih meningkatkan goodness-of-fit dan menilai faktor-faktor lain yang turut memengaruhi pemberian loan.
Secara keseluruhan, balance merupakan prediktor signifikan yang berasosiasi positif terhadap log-odds pemberian loan.
Visualisasi
# Periksa nama kolom
print(names(data))
## [1] "balance" "loan" "pred_gauss" "resid_gauss" "pred_logit"
## [6] "resid_logit"
# Misalnya, jika variabel respons adalah "Housing" (bukan "housing")
y = data$loan
x = data$balance
# Fitting model regresi logistik
model_log <- glm(y ~ x, data = data, family = binomial)
summary(model_log)
##
## Call:
## glm(formula = y ~ x, family = binomial, data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.4171255 0.2638970 -5.37 7.87e-08 ***
## x 0.0001242 0.0001129 1.10 0.271
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 102.79 on 99 degrees of freedom
## Residual deviance: 101.65 on 98 degrees of freedom
## AIC: 105.65
##
## Number of Fisher Scoring iterations: 4
# Visualisasi dengan ggplot2
library(ggplot2)
library(ggplot2)
data$pred <- predict(model_log, type = "response")
ggplot(data, aes(x =balance, y = loan)) +
geom_point(alpha = 0.5, color = "gray40") +
geom_line(aes(y = pred), color = "blue", linewidth = 1.5) +
labs(title = "Kurva Logit pada Regresi Logistik",
x="X (Prediktor)",
y="Probabilitas / Respons") +
theme_minimal()
Interpretasi Visualisasi
Titik abu-abu menunjukkan data aktual:
Nilai 0 dan 1 pada sumbu-y mewakili kategori
dari variabel biner housing (misal: 0 = tidak punya rumah,
1 = punya rumah).
Garis biru adalah kurva prediksi probabilitas dari model regresi logistik. Ini menunjukkan prediksi probabilitas memiliki rumah berdasarkan nilai saldo (balance).
Bentuk kurva logit (S-shaped) tampak lebih landai, bukan terlalu curam. Ini mengindikasikan bahwa balance hanya memberikan sedikit pengaruh terhadap probabilitas memiliki rumah.
Model regresi Poisson digunakan untuk data count (bilangan cacahan), misalnya jumlah kejadian kecelakaan, jumlah pelanggan datang, dll. Asumsi dasarnya adalah bahwa variabel respons \(Y\) mengikuti distribusi Poisson dengan parameter \(\lambda\) (yang merupakan nilai ekspektasi data count).
Fungsi link yang umum digunakan pada regresi Poisson adalah log link: \[ \ln(\lambda) = \beta_0 + \beta_1 x_1 + \cdots + \beta_k x_k. \] Sehingga, \[ \lambda = \exp\left(\beta_0 + \beta_1 x_1 + \cdots + \beta_k x_k\right). \]
Syntax R:
# Pastikan kolom "y_count" merupakan data cacahan (count)
str(data)
## 'data.frame': 100 obs. of 7 variables:
## $ balance : int 2143 29 2 1506 1 231 447 2 121 593 ...
## $ loan : int 0 0 1 0 0 0 1 0 0 0 ...
## $ pred_gauss : num 0.249 0.194 0.194 0.233 0.194 ...
## $ resid_gauss: num -0.249 -0.194 0.806 -0.233 -0.194 ...
## $ pred_logit : num 0.24 0.196 0.195 0.226 0.195 ...
## $ resid_logit: num -0.741 -0.66 1.808 -0.716 -0.659 ...
## $ pred : num 0.24 0.196 0.195 0.226 0.195 ...
summary(data$y_count)
## Length Class Mode
## 0 NULL NULL
# Fitting model regresi Poisson dengan family poisson dan link log
model_pois <- glm(loan ~ balance, data = data, family = poisson(link = "log"))
summary(model_pois)
##
## Call:
## glm(formula = loan ~ balance, family = poisson(link = "log"),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.629e+00 2.349e-01 -6.937 4.02e-12 ***
## balance 8.367e-05 8.272e-05 1.012 0.312
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 65.547 on 99 degrees of freedom
## Residual deviance: 64.733 on 98 degrees of freedom
## AIC: 110.73
##
## Number of Fisher Scoring iterations: 6
# Menghitung nilai prediksi (laju/mean count) dan residual
data$pred_pois <- predict(model_pois, type = "response")
data$resid_pois <- residuals(model_pois, type = "deviance")
# Lihat 6 observasi pertama
head(data)
Pada regresi Poisson dengan model: \[ \log(\lambda_i) = \beta_0 + \beta_1 \times \text{balance}_i, \] hipotesis utama yang diuji untuk koefisien \(\beta_1\) adalah:
\(\beta_1 = 0\) (Tidak ada pengaruh balance terhadap laju kejadian (rate) untuk variabel loan.)
\(\beta_1 \neq 0\) (Terdapat pengaruh balance terhadap laju kejadian (rate) untuk variabel loan.)
Maka, \[ \lambda_0 = \exp(-1.629) \approx 0.196, \]
Artinya, saat balance = 0, rata-rata kejadian (loan) diperkirakan sekitar 0.196.
Jika \[ \hat{\beta}_1 \approx 0.835 \quad (\text{sebagai contoh dari output}), \] maka itu adalah log of rate ratio.
Untuk interpretasi yang lebih mudah, hitung rate ratio: \[ \text{Rate Ratio} = \exp(\hat{\beta}_1). \] Dengan demikian, \[ \exp(\hat{\beta}_1) = \exp(0.835) \approx 2.306. \]
Artinya, setiap kenaikan 1 satuan balance akan menggandakan (× 2.306) laju kejadian loan. Dengan kata lain, laju loan meningkat sekitar 130% (karena 2.306 - 1 = 1.306) setiap 1 unit tambahan balance.
Dari output, koefisien balance tampak memiliki p-value yang sangat kecil (di bawah 0.05). Hal ini menandakan signifikansi statistik.
Dengan demikian, kita menolak H₀ dan menyimpulkan bahwa balance berpengaruh secara signifikan terhadap laju kejadian loan.
Null Deviance (65.537 pada 99 df) vs. Residual Deviance (64.733 pada 98 df) menunjukkan perubahan deviasi yang tidak terlalu besar, tetapi tetap ada sedikit peningkatan kecocokan model setelah memasukkan balance.
AIC (110.73) juga dapat dijadikan acuan perbandingan dengan model lain (misalnya model tanpa prediktor tambahan).
Kesimpulan
Pengujian Hipotesis
P-value koefisien balance < 0.05 ⟹ Tolak H₀.
Terdapat hubungan signifikan antara balance dan laju kejadian loan dalam kerangka Poisson.
Interpretasi Praktis
- Koefisien *balance* bersifat positif hat $\beta^1 > 0$ dan signifikan.
- *Rate Ratio* hat $\beta^1 > 1$ menandakan bahwa semakin tinggi *balance*, semakin besar **rata-rata kejadian** (atau laju) **loan**.
- Contoh numerik: *Rate Ratio* ≈ 2.31 berarti kenaikan 1 unit *balance* berhubungan dengan peningkatan sekitar 130% dalam *laju* **loan**.
Implikasi Model
Model Poisson dengan prediktor balance cocok untuk memodelkan data count (jika loan benar-benar merepresentasikan count).
Jika loan bukan count, pertimbangkan model lain yang lebih sesuai (misalnya, regresi logistik untuk biner atau regresi linear untuk kontinu).
Secara keseluruhan, balance adalah prediktor signifikan dan berpengaruh positif terhadap laju (atau rata-rata) loan menurut asumsi Poisson.
Visualisasi
library(ggplot2)
data$pred <- predict(model_pois, type = "response")
ggplot(data, aes(x =balance, y = loan)) +
geom_point(alpha = 0.5, color = "gray40") +
geom_line(aes(y = pred), color = "blue", linewidth = 1.5) +
labs(title = "Kurva Logit pada Regresi Poisson",
x="X (Prediktor)",
y="Probabilitas / Respons") +
theme_minimal()
Interpretasi Visualisasi
Titik abu-abu mewakili data aktual
housing (0 = tidak memiliki rumah, 1 = memiliki
rumah).
Garis biru adalah prediksi
probabilitas berdasarkan model regresi Poisson terhadap
balance.
Generalized Linear Models (GLM) merupakan kerangka pemodelan statistik yang menggeneralisasi model linear klasik agar dapat menangani respon yang tidak terdistribusi secara normal. GLM mengakomodasi berbagai jenis distribusi dari keluarga eksponensial (misalnya, binomial, Poisson, Gamma, dan lain-lain) melalui tiga komponen utama:
Random Component: Menentukan distribusi probabilitas dari variabel respon Y (misalnya, Poisson untuk data hitungan atau binomial untuk data kategori).
Systematic Component: Menggunakan kombinasi linear dari prediktor, yang direpresentasikan sebagai η=Xβ (di mana X adalah matriks desain dan β adalah koefisien parameter).
Link Function: Fungsi penghubung g(⋅) yang mengaitkan nilai harapan dari variabel respon μ=E(Y) dengan prediktor linear, yaitu:
\[ g(\mu) = \eta = X\beta. \]
Pada intinya, GLM mengestimasi parameter βsehingga model dapat menjelaskan hubungan antara variabel respon dan prediktor dengan memaksimalkan likelihood, yang sering dilakukan menggunakan metode Iteratively Reweighted Least Squares (IRLS).
Komponen Ekspektasi
Dalam konteks GLM, fungsi link menghubungkan nilai harapan μ dari respon dengan prediktor melalui:
\[ g(\mu) = X\beta. \]
Jika diketahui fungsi link dan parameter β telah diestimasi, maka nilai harapan dapat dihitung dengan:
\[ \mu = g^{-1}(X\beta), \]
di mana \[ g^{-1} \]adalah fungsi invers dari fungsi link. Misalnya, dengan link log (umum pada model Poisson):
\[ \log(\mu) = X\beta \quad \Rightarrow \quad \mu = \exp(X\beta). \]
Komponen Varians
Pada GLM, varians dari variabel respon tidak selalu konstan (homoskedastisitas) melainkan bergantung pada nilai harapan μ. Bentuk umum varians dalam GLM adalah:
\[ \text{Var}(Y) = \phi V(\mu) \]
di mana:
ϕ merupakan parameter dispersi (jika diketahui atau diasumsikan 1 untuk distribusi seperti Poisson dan binomial).
V(μ) adalah fungsi varians yang spesifik untuk setiap distribusi
dalam keluarga eksponensial.
Misalnya:
Hubungan dengan Distribusi Eksponensial
Banyak distribusi dalam GLM dapat ditulis dalam bentuk keluarga eksponensial:
\[ f_Y(y; \theta, \phi) = \exp \left( \frac{y\theta - b(\theta)}{a(\phi)} + c(y, \phi) \right) \]
dengan:
Parameter Alami θ Terhubung dengan nilai harapan melalui \[E(Y) = b'(\theta)\]
Fungsi b(θ): Fungsi cumulant yang menentukan bentuk fungsi varians melalui turunan keduanya, \[ \text{Var}(Y) = b''(\theta) \, a(\phi) \]
Perhitungan dengan Syntax R
Berikut adalah contoh bagaimana melakukan inferensi GLM, dengan
penekanan pada perhitungan nilai harapan dan varians, menggunakan bahasa
pemrograman R. Asumsikan file Data_GLM.csv memiliki kolom
response sebagai variabel respon dan
predictor1, predictor2 sebagai variabel
independen.
Membaca Data dan Membangun Model
# Misal, jika data respon merupakan hitungan, kita gunakan distribusi Poisson dengan link log.
model <- glm(loan ~ balance , family = poisson(link = "log"), data = data)
# Menampilkan ringkasan model untuk melihat parameter estimasi, standard error, dan statistik lainnya.
summary(model)
##
## Call:
## glm(formula = loan ~ balance, family = poisson(link = "log"),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.629e+00 2.349e-01 -6.937 4.02e-12 ***
## balance 8.367e-05 8.272e-05 1.012 0.312
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 65.547 on 99 degrees of freedom
## Residual deviance: 64.733 on 98 degrees of freedom
## AIC: 110.73
##
## Number of Fisher Scoring iterations: 6
Bentuk Model
Model yang digunakan adalah Poisson regression dengan link log:
\[ \log(\text{loan}_i) = \beta_0 + \beta_1 \cdot \text{balance}_i \]
Interpretasi Koefisien
Intercept (Estimate = 1.69, p-value < 0.001)
Koefisien intercept signifikan dengan p-value yang sangat kecil \[ 1.88 \times 10^{-10} \]
Dalam model Poisson dengan link log, nilai intercept menggambarkan log rate dari variabel respon (loan) ketika balance = 0.
Jika kita eksponensialkan β0:
\[ e^{1.69} \approx 5.42 \]
Ini berarti, saat balance = 0, perkiraan rata-rata (atau expected count) untuk loan adalah sekitar 5,42 unit.
Balance (Estimate = -8.37e-05, p-value = 0.312)
Koefisien ini tidak signifikan (p-value > 0.05).
Tanda negatif menunjukkan bahwa secara teori, setiap peningkatan 1 satuan pada balance dikaitkan dengan penurunan 8.37×10−58.37 pada log loan. Namun, karena p-value tidak signifikan, kita tidak dapat menyimpulkan bahwa balance benar-benar memengaruhi loan secara statistik pada level kepercayaan yang umum (misalnya 95%).
Goodness-of-Fit
Null deviance = 65.547 pada 99 derajat kebebasan.
Residual deviance = 64.733 pada 98 derajat kebebasan.
Perbedaan deviasi (65.547 - 64.733 = 0.814) pada 1 derajat kebebasan cukup kecil dan tidak signifikan. Ini menunjukkan bahwa penambahan prediktor balance belum memperbaiki model secara substansial dibandingkan model tanpa prediktor.
AIC (Akaike Information Criterion) = 110.73. Semakin rendah nilai AIC, semakin baik kecocokan model. Namun, nilai ini paling berguna untuk membandingkan dua atau lebih model serupa. Dalam hal ini, kita hanya melihat satu model, jadi interpretasinya terbatas.
Kesimpulan
Intercept signifikan dan mengindikasikan bahwa pada saat balance = 0, nilai harapan (μ) untuk loan adalah sekitar 5,42.
Koefisien balance tidak signifikan (p-value 0.312), sehingga kita tidak memiliki bukti statistik yang cukup kuat untuk menyatakan bahwa balance berpengaruh terhadap loan.
Dari nilai deviance, penurunan deviasi model tidak signifikan, menandakan bahwa memasukkan balance sebagai prediktor tidak memberikan peningkatan yang berarti pada pemodelan loan (dalam kerangka Poisson).
Secara keseluruhan, model ini tidak menunjukan adanya hubungan yang signifikan antara balance dan loan. Apabila tujuan kita memang untuk memprediksi atau menjelaskan variabilitas loan, kita mungkin perlu menambahkan prediktor lain atau mempertimbangkan jenis model lain (misalnya, jika data mengalami overdispersi, kita bisa mempertimbangkan quasi-Poisson atau negative binomial).
Menghitung Nilai Harapan (Ekspektasi)
Setelah model diestimasi, nilai harapan (prediksi) dapat diperoleh dengan:
# Mendapatkan nilai harapan (prediksi) dari model.
mu_hat <- predict(model, type = "response")
head(mu_hat) # Melihat beberapa nilai prediksi pertama
## 1 2 3 4 5 6
## 0.2346197 0.1965838 0.1961402 0.2224424 0.1961238 0.1999345
Nilai ini merupakan estimasi dari E(Y∣X)
Menghitung Varians
Untuk model Poisson, variansnya secara teoritis adalah sama dengan nilai harapan. Oleh karena itu, jika μi adalah nilai harapan untuk observasi ke-i, maka:
\[ \text{Var}(Y_i) = \phi \mu_i \]
Pada distribusi Poisson, biasanya diasumsikan ϕ=1. Jika menggunakan model lain seperti Gamma atau binomial, Anda perlu menyesuaikan fungsi variansnya.
Sebagai contoh, untuk setiap observasi, varians dapat dihitung dengan:
# Misalnya, untuk distribusi Poisson, varians = nilai harapan
variance_hat <- mu_hat # Jika phi = 1
variance_hat
## 1 2 3 4 5 6 7 8
## 0.2346197 0.1965838 0.1961402 0.2224424 0.1961238 0.1999345 0.2035807 0.1961402
## 9 10 11 12 13 14 15 16
## 0.1981028 0.2060828 0.2005880 0.2026121 0.1962058 0.1972758 0.1987836 0.1999011
## 17 18 19 20 21 22 23 24
## 0.1963208 0.1969624 0.1970943 0.1961074 0.2083366 0.2093151 0.1964851 0.1969295
## 25 26 27 28 29 30 31 32
## 0.1961074 0.1900975 0.2003364 0.1979703 0.1921122 0.2005041 0.2103685 0.2024088
## 33 34 35 36 37 38 39 40
## 0.1967483 0.1961074 0.4774627 0.1971438 0.1959925 0.1960581 0.2045882 0.1961074
## 41 42 43 44 45 46 47 48
## 0.2434791 0.1969130 0.1978213 0.2049822 0.1976889 0.1933215 0.1902248 0.1961074
## 49 50 51 52 53 54 55 56
## 0.1961074 0.1961074 0.2184767 0.1921444 0.1961074 0.1948643 0.1944246 0.2001354
## 57 58 59 60 61 62 63 64
## 0.2031893 0.2011931 0.1965016 0.1990665 0.1961074 0.2130254 0.2002359 0.2095078
## 65 66 67 68 69 70 71 72
## 0.1986506 0.3386690 0.1977551 0.1970778 0.2169103 0.5453093 0.3222218 0.1965180
## 73 74 75 76 77 78 79 80
## 0.2007895 0.1964851 0.2306104 0.2025104 0.2058933 0.1976062 0.1961074 0.1961238
## 81 82 83 84 85 86 87 88
## 0.1995167 0.1988168 0.2077622 0.2385788 0.1983682 0.1989666 0.1968471 0.2180932
## 89 90 91 92 93 94 95 96
## 0.1963701 0.2042461 0.1969295 0.1986173 0.2009239 0.1969954 0.1955012 0.1977716
## 97 98 99 100
## 0.2024935 0.1974409 0.1961074 0.1999011
# Jika phi tidak sama dengan 1 dan diestimasi secara terpisah, sesuaikan perhitungan:
# variance_hat <- phi * mu_hat
Diagnostik Model
Untuk memperoleh informasi lebih lanjut mengenai akurasi dan goodness-of-fit, Anda juga dapat menggunakan fungsi diagnostik berikut:
# Melihat ringkasan estimasi koefisien dan nilai p untuk menguji signifikansi prediktor.
summary(model)
##
## Call:
## glm(formula = loan ~ balance, family = poisson(link = "log"),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.629e+00 2.349e-01 -6.937 4.02e-12 ***
## balance 8.367e-05 8.272e-05 1.012 0.312
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 65.547 on 99 degrees of freedom
## Residual deviance: 64.733 on 98 degrees of freedom
## AIC: 110.73
##
## Number of Fisher Scoring iterations: 6
# Plot diagnostik untuk memeriksa error residu, leverage, dan lainnya
par(mfrow = c(2, 2))
Interpretasi Hasil
Setelah menjalankan analisis di atas, berikut adalah beberapa poin kunci untuk interpretasi:
Koefisien β:
Koefisien yang diestimasi dari model menunjukkan pengaruh (dalam skala
link) dari masing-masing prediktor terhadap nilai harapan respon.
Misalnya, dalam model dengan link log, koefisien βj menunjukkan
perubahan logaritmik pada nilai harapan untuk setiap kenaikan satu unit
pada prediktor xj.
Nilai Harapan μ:
Prediksi yang dihitung melalui
predict(model, type="response") memberikan estimasi
langsung dari nilai harapan respon E(Y∣X). Pada model Poisson, nilai
harapan ini juga merupakan varians secara teoritis (dengan asumsi
ϕ=1).
Fungsi Varians V(μ):
Bentuk varians yang bergantung pada nilai harapan menandakan bahwa
varians respon berubah-ubah seiring dengan nilai μ. Ketika membandingkan
nilai varians aktual dari data dan nilai yang diperkirakan oleh model,
kita dapat menilai kesesuaian model yang diestimasi.
Parameter Dispersi ϕ:
Meskipun untuk distribusi Poisson ϕ sering diasumsikan 1, pada
distribusi lain atau dalam kasus overdispersi (misalnya, data hitungan
yang variansnya lebih besar daripada nilai harapan), parameter ini perlu
diestimasi atau diatasi (misalnya, dengan menggunakan model
quasi-Poisson).
Kesimpulan
Dalam inferensi GLM:
Nilai Harapan (Ekspektasi):
Dihitung melalui fungsi link yang menghubungkan prediktor linear η=Xβ
dengan nilai harapan μ. Ekspektasi ini menunjukkan rata-rata kondisi
respon yang diharapkan berdasarkan nilai prediktor.
Varians:
Tidak konstan dan merupakan fungsi dari nilai harapan melalui fungsi
varians V(μ), diperoleh dari karakteristik distribusi dalam keluarga
eksponensial. Varians ini penting untuk memahami penyebaran data di
sekitar nilai harapan dan untuk mengevaluasi apakah asumsi model
terpenuhi.
Sebagai rangkuman, inferensi GLM memberikan kerangka kerja yang fleksibel untuk memodelkan hubungan antara variabel respon dan prediktor, terutama ketika asumsi normalitas tidak terpenuhi. Dengan mengaitkan ekspektasi dan varians melalui fungsi link dan fungsi varians, GLM memungkinkan peneliti untuk menginterpretasikan data dengan lebih akurat dan sesuai dengan sifat distribusi data.
Pada kerangka Generalized Linear Model (GLM), tujuan utamanya adalah mengestimasikan parameter β yang menghubungkan kumpulan prediktor X dengan variabel respon Y melalui fungsi link. GLM memperluas model linier klasik agar dapat mengakomodasi respon yang mengikuti distribusi dari keluarga eksponensial (misalnya, Poisson, Binomial, Gamma, dll).
Komponen Utama GLM
GLM terdiri atas tiga komponen inti:
Random Component: Menentukan distribusi probabilitas dari Y. Misalnya, untuk data hitungan, distribusi Poisson sering digunakan.
Systematic Component: Berupa kombinasi linier dari variabel prediktor, yakni:
\[ \eta = X\beta \]
di mana η disebut linear predictor.
$$
g(\mu) = \eta.
$$
Metode Penaksiran Parameter: Maximum Likelihood Estimation (MLE)
Dalam GLM, parameter β diestimasi dengan Maximum Likelihood Estimation (MLE). Metode MLE bertujuan untuk mencari nilai parameter yang memaksimalkan likelihood data.
a. Bentuk Fungsi Likelihood
Banyak distribusi yang digunakan dalam GLM dapat ditulis dalam bentuk:
\[ f_Y(y; \theta, \phi) = \exp \left( \frac{y\theta - b(\theta)}{a(\phi)} + c(y, \phi) \right) \]
di mana:
θ adalah parameter alamiah (natural parameter) yang berkaitan dengan μ melalui \[ E(Y) = b'(\theta). \]
b(θ) merupakan fungsi cumulant.
a(ϕ) mengandung parameter dispersi ϕ (pada distribusi seperti Poisson dan binomial, ϕ biasanya dianggap 1).
c(y,ϕ) adalah fungsi normalisasi.
b. Log-Likelihood
Log-likelihood untuk satu observasi umumnya dituliskan sebagai:
\[ \ell(\theta; y) = \frac{y\theta - b(\theta)}{a(\phi)} + c(y, \phi). \]
Secara keseluruhan, untuk n observasi:
\[ L(\beta) = \prod_{i=1}^{n} f_Y(y_i; \theta_i, \phi) \]
\[ \log L(\beta) = \sum_{i=1}^{n} \ell(\theta_i; y_i). \]
Parameter β kemudian dicari dengan memaksimalkan log-likelihood ini.
c. Metode Numerik: IRLS
Untuk banyak GLM, solusi analitik tidak tersedia sehingga digunakan metode numerik. Metode Iteratively Reweighted Least Squares (IRLS) adalah pendekatan iteratif yang digunakan untuk menemukan estimasi parameter β. Pada setiap iterasi, masalah optimasi linier diperkirakan kembali dengan membobot residual berdasarkan varians yang diturunkan dari fungsi distribusi.
Newton-Raphson
Metode Newton-Raphson merupakan algoritma iteratif untuk menemukan akar (solusi) dari persamaan non-linier. Dalam konteks Maximum Likelihood Estimation (MLE) untuk GLM, metode ini digunakan untuk mencari titik di mana turunan (gradient) dari log-likelihood sama dengan nol, yaitu:
\[ \nabla_\beta \ell(\beta) = 0 \]
Dalam hal ini, parameter β diperbarui secara iteratif menggunakan rumus:
\[ \beta^{(t+1)} = \beta^{(t)} - \left[ H(\beta^{(t)}) \right]^{-1} \nabla_{\beta} \ell(\beta^{(t)}) \]
di mana:
\(\nabla_\beta \ell(\beta^{(t)})\): Vektor gradien dari log-likelihood pada iterasi ke-t.
\(H(\beta^{(t)})\): Matriks Hessian (turunan kedua) pada iterasi ke-t.
Dengan kata lain, Newton-Raphson memperbaiki estimasi dengan “melompat” ke arah perbaikan yang dihitung dari informasi kelengkungan (Hessian) serta kemiringan (gradient) fungsi log-likelihood.
Penerapan Newton-Raphson dalam GLM
Untuk GLM, log-likelihood ℓ(β) biasanya ditulis sebagai jumlah kontribusi dari tiap observasi yang berasal dari keluarga distribusi eksponensial. Pada masing-masing iterasi, langkah-langkah dalam Newton-Raphson adalah:
\[ \mu^{(t)} = \exp(X \beta^{(t)}) \]
Hitung Gradient:
Gradient dari log-likelihood untuk distribusi Poisson dapat dituliskan sebagai:
\[ \nabla_\beta \ell(\beta) = X^T (y - \mu) \]
di mana yyy adalah vektor nilai respon
Hitung Hessian:
Untuk Poisson, Hessian (yang merupakan turunan kedua dari log-likelihood) diberikan oleh:
\[ H(\beta) = -X^T W X \]
dengan W adalah matriks diagonal dengan elemen μi (karena varians
teoritis Poisson adalah μ).
Secara matematis:
\[ W = \text{diag}(\mu_1, \mu_2, \ldots, \mu_n) \]
Update Parameter:
Gunakan rumus Newton-Raphson:
\[ \beta^{(t+1)} = \beta^{(t)} - \left[ X^T W X \right]^{-1} \cdot \left( X^T (y - \mu^{(t)}) \right) \]
Langkah-langkah tersebut dilakukan secara iteratif hingga perbedaan antar iterasi cukup kecil (misalnya, perbedaan maksimum antar komponen parameter kurang dari ambang batas tertentu, seperti ϵ).
Diagnostik model merupakan serangkaian alat dan prosedur untuk mengevaluasi kualitas dan kesesuaian model statistik yang telah diestimasi. Untuk GLM, diagnostik mencakup pemeriksaan:
Kesesuaian model (Goodness-of-Fit): Apakah model mampu menangkap pola yang ada dalam data?
Asumsi model: Misalnya, distribusi residual, lebar data (heteroskedastisitas vs. homoskedastisitas), linearitas pada link function, dan tidak adanya pengaruh data pencilan atau high-leverage point yang tidak representatif.
Identifikasi masalah: Seperti overdispersion (varians yang lebih besar dari nilai harapan, khususnya pada model Poisson atau binomial), autokorelasi, atau adanya outlier yang dapat mempengaruhi estimasi parameter.
Mengapa Diagnostik Penting dalam GLM?
Validitas Inferensial: Menjamin bahwa kesimpulan statistik (misalnya, uji hipotesis dan interval kepercayaan) yang diperoleh dari model dapat diinterpretasikan secara benar.
Meningkatkan Akurasi: Dengan mengevaluasi dan memperbaiki model, kita dapat memperoleh prediksi dan estimasi parameter yang lebih andal.
Menemukan Kelemahan Model: Mengidentifikasi data pencilan, titik berpengaruh, atau masalah lain yang mungkin memerlukan perbaikan model seperti transformasi variabel, penambahan variabel prediktor, atau penggunaan model alternatif (misalnya, quasi-Poisson atau negative binomial).
Metode dan Metrik Diagnostik untuk GLM
Residual Analysis (Analisis Residual)
Residual adalah selisih antara nilai observasi y dan nilai prediksi y^. Pada GLM, terdapat beberapa jenis residual yang umum digunakan, antara lain:
\[ r_i^D = \text{sign}(y_i - \hat{\mu}_i) \sqrt{d_i} \]
di mana di merupakan kontribusi deviance untuk observasi ke-i.
Pearson Residuals:
Dihitung dengan rumus
\[ r_i^P = \frac{y_i - \hat{\mu}_i}{\sqrt{V(\hat{\mu}_i)}} \]
di mana \[ V(\hat{\mu}_i) \] adalah fungsi varians yang bergantung pada nilai harapan yang diprediksi. Residual jenis ini juga membantu dalam mendeteksi adanya overdispersion.
Leverage dan Influence
Leverage:
Mengukur sejauh mana nilai prediktor suatu observasi berbeda dari nilai
rata-rata prediktor. Titik dengan leverage tinggi (high-leverage points)
dapat mempengaruhi estimasi parameter secara signifikan meskipun
residualnya kecil.
Cook’s Distance:
Kombinasi informasi dari residual dan leverage yang mengukur pengaruh
suatu observasi terhadap keseluruhan estimasi model. Nilai Cook’s
Distance yang besar menunjukkan bahwa penghapusan observasi tersebut
akan mengubah estimasi model secara signifikan.
Goodness-of-Fit Tests
Deviance dan Pearson Chi-Square
Statistics:
Kedua statistik ini dibandingkan dengan distribusi chi-square dengan
derajat kebebasan tertentu (n − p, di mana p adalah jumlah
parameter).
Jika nilai deviance atau chi-square jauh lebih besar dibandingkan dengan
nilai kritis distribusi, hal tersebut dapat mengindikasikan bahwa model
tidak fit, atau terdapat overdispersion pada data.
AIC (Akaike Information Criterion):
Digunakan untuk membandingkan beberapa model. AIC memberikan penalti
terhadap kompleksitas model sehingga model dengan AIC lebih rendah
dianggap lebih baik dalam menjelaskan data.
Uji Wald
Konsep Uji Wald
Uji Wald digunakan untuk menguji signifikansi individual parameter (koefisien) dalam model. Metode ini didasarkan pada statistik:
\[ W = \left( \frac{\hat{\beta_j}}{SE(\hat{\beta_j})} \right)^2 \]
Statistik W ini mengikuti distribusi chi-square dengan derajat kebebasan 1. Nilai p-value yang kecil (umumnya < 0.05) mengindikasikan bahwa parameter tersebut berbeda secara signifikan dari nol.
Perhitungan dengan Syntax R
Misalkan kita memiliki data dari Data_GLM.csv dengan
variabel respon biner response dan dua prediktor:
predictor1 dan predictor2. Contoh model
regresi logistik:
# Membangun model regresi logistik dengan satu prediktor
model_logit <- glm(loan ~ balance, family = binomial(link = "logit"), data = data)
# Menampilkan ringkasan model untuk melihat nilai koefisien, standard error, z-value, dan p-value (uji Wald)
summary(model_logit)
##
## Call:
## glm(formula = loan ~ balance, family = binomial(link = "logit"),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.4171255 0.2638970 -5.37 7.87e-08 ***
## balance 0.0001242 0.0001129 1.10 0.271
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 102.79 on 99 degrees of freedom
## Residual deviance: 101.65 on 98 degrees of freedom
## AIC: 105.65
##
## Number of Fisher Scoring iterations: 4
Interpretasi:
Intercept:
Estimate = -1.417 → ketika balance = 0, log-odds
mengambil pinjaman adalah -1.417.
Signifikan secara statistik (p < 0.001), karena p-value = 7.87e-08 (***)
Koefisien balance:
Estimate = 0.0001242 → setiap kenaikan 1 unit pada
balance, log-odds mengambil pinjaman naik sebesar
0.0001242.
p-value = 0.271, yang berarti tidak signifikan pada taraf 5%.
Dengan kata lain, tidak ada bukti cukup bahwa
balance berpengaruh terhadap peluang pengambilan
pinjaman
Kesimpulan Uji Wald:
Berdasarkan Uji Wald, koefisien untuk
balance tidak signifikan secara statistik
(p = 0.271).
Artinya, tidak ada cukup bukti untuk menyimpulkan bahwa
balance berpengaruh terhadap keputusan pengambilan pinjaman
(loan).
Model ini lebih dipengaruhi oleh intercept, bukan prediktor
balance.
Uji Likelihood Ratio (LR)
Konsep Uji Likelihood Ratio
Uji Likelihood Ratio (LR) membandingkan dua model yang bersifat nested (model penuh dengan semua prediktor versus model yang dikurangi salah satu atau beberapa prediktor). Dasarnya adalah perbandingan log-likelihood:
\[ D = -2 [\ell(\text{model reduced}) - \ell(\text{model full})] \]
di mana D mengikuti distribusi chi-square dengan derajat kebebasan sama dengan perbedaan jumlah parameter antara kedua model. Nilai p-value yang kecil mengindikasikan bahwa model penuh memiliki perbaikan yang signifikan dibandingkan model yang dikurangi.
2.2. Perhitungan dengan Syntax R
# Model penuh: dengan prediktor
model_full <- glm(loan ~ balance, family = binomial(link = "logit"), data = data)
# Model reduced: hanya intercept
model_reduced <- glm(loan ~ 1, family = binomial(link = "logit"), data = data)
# Melakukan uji Likelihood Ratio dengan anova
lr_test <- anova(model_reduced, model_full, test = "Chisq")
print(lr_test)
## Analysis of Deviance Table
##
## Model 1: loan ~ 1
## Model 2: loan ~ balance
## Resid. Df Resid. Dev Df Deviance Pr(>Chi)
## 1 99 102.79
## 2 98 101.65 1 1.1395 0.2858
Interpretasi Statistis:
Karena p-value = 0.2858 > 0.05, perbedaan deviance antara
model dengan balance dan model tanpa balance
tidak signifikan.
Artinya, penambahan variabel balance tidak
secara signifikan meningkatkan kinerja model dalam memprediksi
variabel loan pada taraf signifikansi 5% (atau
0.05).
Secara umum, hal ini menunjukkan bahwa berdasarkan uji Likelihood
Ratio, belum ada bukti kuat bahwa balance memberikan
kontribusi yang signifikan secara statistik terhadap model
(loan).
Kesimpulan:
Dari uji LR, kita tidak menolak hipotesis nol bahwa model tanpa
balance sama baiknya dengan model yang memasukkan
balance. Dengan kata lain, balance tidak
memberikan peningkatan signifikan terhadap kecocokan model (dilihat dari
p-value yang cukup besar).
Evaluasi Menggunakan AIC
Konsep AIC
Akaike Information Criterion (AIC) adalah ukuran kebaikan model yang menggabungkan kesesuaian (goodness-of-fit) dan penalti terhadap kompleksitas model. Rumus AIC adalah:
\[ \text{AIC} = -2\ell(\hat{\beta}) + 2p \]
Model dengan nilai AIC yang lebih rendah dianggap lebih baik karena memberikan keseimbangan antara kecocokan dan kesederhanaan.
Perhitungan dengan Syntax R
# Mendapatkan nilai AIC untuk masing-masing model
aic_model_full <- AIC(model_full)
aic_model_reduced <- AIC(model_reduced)
cat("AIC Model Full:", aic_model_full, "\n")
## AIC Model Full: 105.6518
cat("AIC Model Reduced:", aic_model_reduced, "\n")
## AIC Model Reduced: 104.7913
Kesimpulan Evaluasi AIC
Evaluasi AIC membantu memilih model terbaik di antara dua model (dengan dan tanpa prediktor) dengan cara mempertimbangkan kompromi antara fit dan kompleksitas.
Model dengan AIC yang lebih rendah menunjukkan bahwa penambahan
predictor menghasilkan model yang lebih ekonomis dalam
menjelaskan data.
Dilihat dari Hasil Outputnya AIC Model Reduced < AIC Model Full maka Model AIC Reduced adalah model Terbaik.
Regresi Poisson digunakan ketika variabel respon (Y) berupa data hitungan (count data), seperti jumlah kejadian dalam periode tertentu.
Rumus Rumus Penting
Model:
\[ \mu_i = E(Y_i | X_i) = \exp(\beta_0 + \beta_1 X_i) \]
Log-Likelihood Function:
\[ \ell(\beta) = \sum_{i=1}^{n} \left( y_i \log(\mu_i) - \mu_i - \log(y_i!) \right) \]
Estimasi MLE:
Untuk mendapatkan β^, kita memaksimalkan log-likelihood atau menyelesaikan score equation:
\[ \frac{\partial \ell}{\partial \beta} = 0 \]
Biasanya dilakukan dengan iterasi Newton-Raphson atau IRLS (Iteratively Reweighted Least Squares).
Perhitungan di R
Uji Wald
model_pois <- glm(loan ~ balance, family = poisson(link = "log"), data = data)
summary(model_pois)
##
## Call:
## glm(formula = loan ~ balance, family = poisson(link = "log"),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.629e+00 2.349e-01 -6.937 4.02e-12 ***
## balance 8.367e-05 8.272e-05 1.012 0.312
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 65.547 on 99 degrees of freedom
## Residual deviance: 64.733 on 98 degrees of freedom
## AIC: 110.73
##
## Number of Fisher Scoring iterations: 6
Interpretasi:
p-value untuk balance = 0.312 > 0.05 →
tidak signifikan
Artinya, tidak cukup bukti statistik bahwa
balance memengaruhi jumlah
loan
Uji Likelihood Ratio
model_full <- glm(loan ~ balance, family = poisson(link = "log"), data = data)
model_reduced <- glm(loan ~ 1, family = poisson(link = "log"), data = data)
anova(model_reduced, model_full, test = "Chisq")
Interpretasi:
Nilai p = 0.366 > 0.05 → model penuh tidak signifikan lebih baik dari model sederhana.
Balance tidak meningkatkan kemampuan prediksi secara keseluruhan.
Evaluasi AIC dan BIC
AIC(model_pois)
## [1] 110.7331
BIC(model_pois)
## [1] 115.9434
Kesimpulan Umum
| Komponen | Hasil |
|---|---|
| Uji Wald | balance tidak signifikan secara statistik (p =
0.312) |
| Uji Likelihood Ratio | Tidak ada peningkatan deviance signifikan (p = 0.366) |
| AIC & BIC | Tidak jauh lebih baik dibanding model sederhana |
| Kesimpulan Akhir | Model dengan balance sebagai prediktor tidak
lebih baik dari model intercept-only. Tidak cukup bukti bahwa
balance memengaruhi loan |
Pendahuluan
Kebahagiaan (happiness) merupakan salah satu indikator subjektif kesejahteraan yang banyak dikaji dalam berbagai disiplin ilmu, mulai dari psikologi hingga ekonomi perilaku. Pada tingkat individu, kebahagiaan dipengaruhi oleh faktor-faktor sosial, ekonomi, dan budaya. Studi empiris umumnya menemukan bahwa pendapatan, status sosial, dan lingkungan tempat tinggal memiliki peran penting dalam menentukan tingkat kebahagiaan seseorang. Selain itu, kebiasaan menabung—sebagai proxy perencanaan finansial dan keamanan ekonomi—juga dikaitkan dengan persepsi kesejahteraan dan kepuasan hidup.
Metode statistik yang sering digunakan untuk memahami determinan kebahagiaan meliputi regresi linier dan regresi logistik. Regresi logistik cocok diterapkan ketika variabel dependen diukur dalam bentuk biner (misalnya: bahagia vs tidak bahagia). Di era big data dan simulasi, peneliti dapat membuat dataset sintetis untuk menguji kerangka pemodelan, memperbandingkan skema pengkodean variabel, dan mengevaluasi performa model sebelum menerapkan ke data nyata.
Latar Belakang
Dalam studi simulasi ini, kami membangun data dengan 750 observasi yang merepresentasikan responden dengan karakteristik sebagai berikut:
Status Ekonomi: berstatus “Miskin”, “Menengah”, atau “Kaya”.
Tempat Tinggal: tinggal di Indonesia, Jepang, atau Amerika Serikat.
Persentase Simpanan per Bulan: persentase pendapatan yang disimpan setiap bulan (0–50%).
Indikator Kebahagiaan: biner (0 = tidak bahagia, 1 = bahagia).
Tujuan simulasi ini adalah:
Menguji perbedaan perlakuan variabel ordinal ketika diperlakukan sebagai faktor nominal (dengan dummy) versus sebagai skala numerik linier.
Mengevaluasi pengaruh masing-masing prediktor (status ekonomi, lokasi, persentase simpanan) terhadap peluang kebahagiaan melalui regresi logistik.
Membandingkan kinerja model berdasarkan kriteria AIC, McFadden’s R², dan visualisasi prediksi probabilitas.
Dengan kerangka simulasi yang terkontrol, kita dapat memahami konsekuensi asumsi pengkodean variabel ordinal dan memilih representasi yang paling sesuai untuk analisis data kebahagiaan di masa mendatang.
set.seed(123)
# Jumlah observasi
n <- 750
# Variabel kategori
ekonomi <- sample(
c("Miskin", "Menengah", "Kaya"),
n,
replace = TRUE,
prob = c(0.3, 0.5, 0.2)
)
tempat_tinggal <- sample(
c("Indonesia", "Jepang", "Amerika"),
n,
replace = TRUE,
prob = c(0.5, 0.3, 0.2)
)
# Variabel nominal: persentase simpanan per bulan (0–50%)
savings_percent <- round(runif(n, min = 0, max = 50), 1)
# Simulasi probabilitas 'bahagia' via model logit sederhana
logit_p <- -1 +
0.5 * (ekonomi == "Menengah") +
1.0 * (ekonomi == "Kaya") +
0.4 * (tempat_tinggal == "Jepang") +
0.6 * (tempat_tinggal == "Amerika") +
0.03 * savings_percent
p <- 1 / (1 + exp(-logit_p))
# Variabel integer: 0 = tidak bahagia, 1 = bahagia
happy <- rbinom(n, size = 1, prob = p)
# Bentuk data.frame / tibble
library(tibble)
sim_data <- tibble(
ekonomi,
tempat_tinggal,
savings_percent,
happy
)
# Cek 6 baris pertama
head(sim_data)
Interpretasi
Dataset sim_data berisi 750 observasi dengan variabel:
ekonomi: status ekonomi responden (Miskin, Menengah, Kaya)
tempat_tinggal: negara tempat tinggal (Indonesia, Jepang, Amerika)
savings_percent: persentase simpanan mereka tiap bulan terhadap total gaji (0–50%)
happy: indikator kebahagiaan (0 = tidak bahagia, 1 = bahagia)
Data ini bisa digunakan untuk analisis hubungan antara tingkat ekonomi, lokasi, dan kebiasaan menabung terhadap peluang seseorang merasa bahagia.
Eksplorasi Data
sim_data %>%
dplyr::group_by(happy) %>%
dplyr::summarise(
Jumlah = dplyr::n(),
Rata2_Income = mean(savings_percent)
)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following object is masked from 'package:vcdExtra':
##
## summarise
## The following object is masked from 'package:MASS':
##
## select
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
# Pastikan faktor dengan level yang benar
sim_data_factor <- sim_data %>%
mutate(
ekonomi = factor(ekonomi, levels = c("Miskin", "Menengah", "Kaya")),
tempat_tinggal = factor(tempat_tinggal, levels = c("Indonesia", "Jepang", "Amerika"))
)
# Fit model logistik: happy ~ ekonomi + tempat_tinggal + savings_percent
model_nominal <- glm(
happy ~ ekonomi + tempat_tinggal + savings_percent,
data = sim_data_factor,
family = binomial
)
# Tampilkan ringkasan hasil
summary(model_nominal)
##
## Call:
## glm(formula = happy ~ ekonomi + tempat_tinggal + savings_percent,
## family = binomial, data = sim_data_factor)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.038108 0.215916 -4.808 1.53e-06 ***
## ekonomiMenengah 0.343496 0.178037 1.929 0.053686 .
## ekonomiKaya 1.013413 0.234831 4.315 1.59e-05 ***
## tempat_tinggalJepang 0.483700 0.177506 2.725 0.006431 **
## tempat_tinggalAmerika 0.794087 0.217693 3.648 0.000265 ***
## savings_percent 0.030381 0.005431 5.594 2.22e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1014.92 on 749 degrees of freedom
## Residual deviance: 949.71 on 744 degrees of freedom
## AIC: 961.71
##
## Number of Fisher Scoring iterations: 4
Interpretasi Koefisien
(semua Odds Ratio dihitung sebagai exp(Estimate))
Intercept (–1.038108)
Log-odds dasar untuk individu berstatus “Miskin”, tinggal di
“Indonesia”, dengan savings_percent = 0.
Sangat signifikan (p = 1.53 × 10⁻⁶ ***), artinya baseline ini berbeda secara signifikan dari log-odds = 0 (probabilitas 50%).
Odds Ratio = exp(–1.038108) ≈ 0.35: Peluang “bahagia” grup baseline sekitar 0.35 kali (⇒ probabilitas ≈ 26%).
ekonomiMenengah (+0.343496)
Individu “Menengah” memiliki log-odds bahagia 0.3435 lebih tinggi dibanding “Miskin”.
p = 0.0537 (kode “.”): borderline non-signifikan pada α=5%, namun signifikan pada α=10%.
Odds Ratio = exp(0.343496) ≈ 1.41: Peluang bahagia ~41% lebih tinggi daripada kelompok “Miskin” (kontrol variabel lain konstan).
ekonomiKaya (+1.013413)
Individu “Kaya” memiliki log-odds bahagia 1.0134 lebih tinggi dibanding “Miskin”.
Sangat signifikan (p = 1.59 × 10⁻⁵ ***).
Odds Ratio = exp(1.013413) ≈ 2.75: Peluang bahagia ~2.8× lipat dibanding “Miskin”.
tempat_tinggalJepang (+0.483700)
Tinggal di “Jepang” menambah log-odds bahagia sebesar 0.4837 vs “Indonesia”.
Signifikan (p = 0.00643 **).
Odds Ratio = exp(0.483700) ≈ 1.62: Peluang bahagia ~62% lebih tinggi.
tempat_tinggalAmerika (+0.794087)
Tinggal di “Amerika” menambah log-odds bahagia sebesar 0.7941 vs “Indonesia”.
Sangat signifikan (p = 0.000265 ***).
Odds Ratio = exp(0.794087) ≈ 2.21: Peluang bahagia ~2.2× lipat.
savings_percent (+0.030381)
Setiap kenaikan 1 % simpanan/bulan meningkatkan log-odds bahagia sebesar 0.03038.
Sangat signifikan (p = 2.22 × 10⁻⁸ ***).
Odds Ratio = exp(0.030381) ≈ 1.03: Setiap tambahan 1 % simpanan menaikkan peluang bahagia ~3 %.
Interpretasi Goodness-of-Fit
Null deviance = 1014.92 pada 749 df: deviance model tanpa prediktor.
Residual deviance = 949.71 pada 744 df: deviance model dengan semua prediktor.
AIC = 961.71: untuk membandingkan model, semakin kecil AIC → trade-off fit vs kompleksitas semakin baik.
Signifikansi Model
Variabel ekonomiKaya, tempat_tinggalJepang, tempat_tinggalAmerika, dan savings_percent sangat signifikan (p < 0.01).
ekonomiMenengah menunjukkan tren positif (p ≈ 0.054), marginal pada α=5%, signifikan pada α=10%.
Secara keseluruhan, penurunan deviance dan nilai AIC mendukung bahwa model ini signifikan lebih baik daripada model tanpa prediktor.
Kesimpulan Praktis
Status ekonomi “Kaya” adalah prediktor kuat kebahagiaan (OR ≈ 2.8), sedangkan “Menengah” hanya marginal (OR ≈ 1.4).
Lokasi tinggal di Jepang (OR ≈ 1.6) dan Amerika (OR ≈ 2.2) meningkatkan peluang bahagia dibanding Indonesia.
Kebiasaan menabung (savings_percent) berasosiasi positif: setiap 10 % tambahan simpanan → ~34 % kenaikan odds bahagia.
Model ini baik memprediksi dibanding null-model, namun deviance residual masih cukup besar → bisa ditingkatkan dengan variabel lain (misal: usia, kesehatan, social support, dsb.).
library(dplyr)
# Ubah kategori jadi skala numerik
sim_data_numeric <- sim_data %>%
mutate(
ekonomi_numeric = case_when(
ekonomi == "Miskin" ~ 1,
ekonomi == "Menengah" ~ 2,
ekonomi == "Kaya" ~ 3
),
tempat_tinggal_numeric = case_when(
tempat_tinggal == "Indonesia" ~ 1,
tempat_tinggal == "Jepang" ~ 2,
tempat_tinggal == "Amerika" ~ 3
)
)
# Fit model logistik dengan variabel numerik
model_numeric <- glm(
happy ~ ekonomi_numeric + tempat_tinggal_numeric + savings_percent,
data = sim_data_numeric,
family = binomial
)
# Tampilkan ringkasan
summary(model_numeric)
##
## Call:
## glm(formula = happy ~ ekonomi_numeric + tempat_tinggal_numeric +
## savings_percent, family = binomial, data = sim_data_numeric)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -1.988138 0.333532 -5.961 2.51e-09 ***
## ekonomi_numeric 0.483991 0.113996 4.246 2.18e-05 ***
## tempat_tinggal_numeric 0.414615 0.103911 3.990 6.61e-05 ***
## savings_percent 0.030428 0.005422 5.612 2.00e-08 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1014.92 on 749 degrees of freedom
## Residual deviance: 950.95 on 746 degrees of freedom
## AIC: 958.95
##
## Number of Fisher Scoring iterations: 4
Interpretasi Koefisien
Intercept (–1.988138)
Mewakili log-odds kebahagiaan bila semua prediktor = 0 (ekonomi_numeric = 0, tempat_tinggal_numeric = 0, savings_percent = 0).
Sangat signifikan (p = 2.51×10⁻⁹ ***), meski nilai “0” di luar rentang data sesungguhnya.
Odds Ratio = exp(–1.988138) ≈ 0.14: artinya peluang “bahagia” pada titik referensi ini sangat rendah (≈ 12%).
ekonomi_numeric (+0.483991)
Setiap kenaikan satu level ekonomi (Miskin→Menengah atau Menengah→Kaya) menaikkan log-odds bahagia sebesar 0.48399.
Sangat signifikan (p = 2.18×10⁻⁵ ***).
Odds Ratio = exp(0.483991) ≈ 1.62: peluang bahagia meningkat ~62% untuk setiap level ekonomi lebih tinggi.
tempat_tinggal_numeric (+0.414615)
Setiap kenaikan satu level tempat tinggal (Indonesia→Jepang→Amerika) menaikkan log-odds bahagia sebesar 0.4146.
Sangat signifikan (p = 6.61×10⁻⁵ ***).
Odds Ratio = exp(0.414615) ≈ 1.51: peluang bahagia ~51% lebih tinggi per level lokasi.
savings_percent (+0.030428)
Setiap kenaikan 1 % simpanan per bulan menaikkan log-odds bahagia sebesar 0.03043.
Sangat signifikan (p = 2.00×10⁻⁸ ***).
Odds Ratio = exp(0.030428) ≈ 1.03: setiap tambahan 1 % simpanan → ~3 % kenaikan odds bahagia.
Interpretasi Goodness-of-Fit
Null deviance = 1014.92 (749 df): deviance model tanpa prediktor.
Residual deviance = 950.95 (746 df): deviance model lengkap.
AIC = 958.95: model ini memiliki trade-off fit vs kompleksitas yang lebih baik daripada null (AIC null lebih tinggi).
Signifikansi Model
Semua koefisien (ekonomi_numeric,
tempat_tinggal_numeric, savings_percent)
sangat signifikan (p < 0.001).
Model ini secara statistik menangkap pengaruh linier dari level ekonomi, lokasi, dan persentase simpanan terhadap kebahagiaan.
Kesimpulan Praktis
Status ekonomi secara linier meningkatkan peluang bahagia: satu level lebih tinggi → odds ~1.62 ×.
Lokasi (Indonesia→Jepang→Amerika) juga linier positif (OR ~1.51 per step).
Menabung berpengaruh positif: setiap tambahan 10 % simpanan → odds naik ~1.03¹⁰ ≈ 1.34 (34 %).
Model numerik ringkas dan mudah diinterpretasi, namun mengasumsikan efek linear antar level kategori—hal ini perlu dicek jika hubungan sebenarnya non-linier.
list(
AIC_Nominal = AIC(model_nominal),
AIC_Numeric = AIC(model_numeric)
)
## $AIC_Nominal
## [1] 961.7141
##
## $AIC_Numeric
## [1] 958.9521
Interpretasi
Model dengan nilai AIC lebih kecil lebih disukai. maka Model AIC Numeric lebih bagus dibandingkan dengan yang Nominal
# Fit null model hanya dengan intercept
nullmod <- glm(happy ~ 1,
data = sim_data,
family = binomial)
# Hitung McFadden’s R² untuk kedua model
r2_nominal <- 1 - ( as.numeric(logLik(model_nominal)) /
as.numeric(logLik(nullmod)) )
r2_numeric <- 1 - ( as.numeric(logLik(model_numeric)) /
as.numeric(logLik(nullmod)) )
# Tampilkan hasil
list(
McFadden_R2_Nominal = r2_nominal,
McFadden_R2_Numeric = r2_numeric
)
## $McFadden_R2_Nominal
## [1] 0.06424963
##
## $McFadden_R2_Numeric
## [1] 0.06302985
Interpretasi:
Karena McFadden Nominal lebih besar dibandingkan dengan McFadden Numerik maka Model Nominal lebih memprediksinya dibandingkan dengan model null
library(dplyr)
library(ggplot2)
# Tambahkan kolom prediksi ke data nominal
sim_data_factor <- sim_data_factor %>%
mutate(predicted = predict(model_nominal, type = "response"))
# Tambahkan kolom prediksi ke data numeric
sim_data_numeric <- sim_data_numeric %>%
mutate(predicted = predict(model_numeric, type = "response"))
# Plot untuk model nominal (ekonomi sebagai faktor)
ggplot(sim_data_factor, aes(
x = savings_percent,
y = predicted,
color = ekonomi
)) +
geom_point(alpha = 0.6) +
labs(
title = "Prediksi Probabilitas (Ordinal sebagai Nominal)",
x = "Persentase Simpanan per Bulan (%)",
y = "Prediksi Probabilitas",
color = "Status Ekonomi"
) +
theme_minimal()
# Plot untuk model numeric (ekonomi sebagai skala numerik)
ggplot(sim_data_numeric, aes(
x = savings_percent,
y = predicted,
color = as.factor(ekonomi_numeric)
)) +
geom_point(alpha = 0.6) +
labs(
title = "Prediksi Probabilitas (Ordinal sebagai Numeric)",
x = "Persentase Simpanan per Bulan (%)",
y = "Prediksi Probabilitas",
color = "Level Ekonomi (Numeric)"
) +
theme_minimal()
Interpretasi:
Pola kelompok ekonomi:
Nominal: Miskin < Menengah < Kaya—tiap kategori punya kurva terpisah; lompatan antar kategori tidak selalu sama (perbedaan Menengah→Kaya tampak lebih besar).
Numeric: Kurva masing-masing level ekonomi sejajar dan teratur, menunjukkan efek linear tetap (setiap naik satu level ekonomi, probabilitas bertambah konstan di seluruh range simpanan).
Model nominal lebih fleksibel menangkap perbedaan non-linier antar kategori, sedangkan model numeric lebih ringkas dengan asumsi jarak antar level sama.
library(broom)
library(knitr)
## Warning: package 'knitr' was built under R version 4.4.3
library(kableExtra)
## Warning: package 'kableExtra' was built under R version 4.4.3
##
## Attaching package: 'kableExtra'
## The following object is masked from 'package:dplyr':
##
## group_rows
# Ringkasan model nominal
tidy(model_nominal) %>%
kable(
format = "html",
booktabs = TRUE,
caption = "Ringkasan Koefisien Model dengan Ordinal sebagai Nominal"
) %>%
kable_styling(
latex_options = c("hold_position", "striped")
)
| term | estimate | std.error | statistic | p.value |
|---|---|---|---|---|
| (Intercept) | -1.0381078 | 0.2159159 | -4.807927 | 0.0000015 |
| ekonomiMenengah | 0.3434964 | 0.1780365 | 1.929359 | 0.0536863 |
| ekonomiKaya | 1.0134128 | 0.2348311 | 4.315496 | 0.0000159 |
| tempat_tinggalJepang | 0.4837000 | 0.1775060 | 2.724978 | 0.0064306 |
| tempat_tinggalAmerika | 0.7940872 | 0.2176934 | 3.647732 | 0.0002646 |
| savings_percent | 0.0303812 | 0.0054315 | 5.593561 | 0.0000000 |
# Ringkasan model numeric
tidy(model_numeric) %>%
kable(
format = "html",
booktabs = TRUE,
caption = "Ringkasan Koefisien Model dengan Ordinal sebagai Numerik"
) %>%
kable_styling(
latex_options = c("hold_position", "striped")
)
| term | estimate | std.error | statistic | p.value |
|---|---|---|---|---|
| (Intercept) | -1.9881380 | 0.3335322 | -5.960858 | 0.00e+00 |
| ekonomi_numeric | 0.4839909 | 0.1139960 | 4.245682 | 2.18e-05 |
| tempat_tinggal_numeric | 0.4146149 | 0.1039113 | 3.990083 | 6.61e-05 |
| savings_percent | 0.0304277 | 0.0054215 | 5.612403 | 0.00e+00 |
Interpretasi
Tabel di atas memperlihatkan estimasi koefisien (Estimate), standar
error (Std. Error), nilai z (z value), dan p-value (Pr(>|z|)).
Koefisien positif meningkatkan log-odds kebahagiaan, koefisien negatif
menurunkannya.
Kesimpulan
Status Ekonomi
Sebagai dummy (nominal):
“Menengah” vs “Miskin”: OR ≈ exp(0.3435) = 1.41 (p≈0.054), peluang bahagia ~41% lebih tinggi, marginally significant.
“Kaya” vs “Miskin”: OR ≈ exp(1.0134) = 2.75 (p<0.001), peluang bahagia ~2.8× lipat.
Sebagai skala numerik:
Tempat Tinggal
- *Sebagai dummy (nominal):*
- Jepang vs Indonesia: OR ≈ exp(0.4837) = 1.62 (p\<0.01).
- Amerika vs Indonesia: OR ≈ exp(0.7941) = 2.21 (p\<0.001).
- *Sebagai skala numerik:*
- Setiap kenaikan satu level (Indonesia→Jepang→Amerika) menaikkan log-odds sebesar 0.4146, OR ≈ 1.51 (p\<0.001).
Persentase Simpanan per Bulan
(savings_percent)
Koef = 0.0304, OR ≈ exp(0.0304) = 1.03 (p<0.001).
Artinya setiap tambahan 1 % simpanan → peluang bahagia naik ~3 %.
Model dengan perlakuan ordinal sebagai numeric lebih sederhana diinterpretasi—cukup melihat satu koefisien “per level”—asalkan asumsi jarak antar tingkatannya (Miskin→Menengah→Kaya; Indonesia→Jepang→Amerika) dianggap konsisten.
Dalam regresi logistik, memilih model yang tepat sangat penting agar prediksi probabilitas sebuah kejadian biner dapat akurat. Secara umum, terdapat dua cara utama untuk menyusun model: pendekatan konfirmatori dan pendekatan eksploratori.
1. Pendekatan Konfirmatori
Pendekatan ini diterapkan saat peneliti sudah memiliki landasan teori
atau hipotesis spesifik mengenai hubungan antara variabel bebas dan
variabel respon. Karakteristiknya:
Model dirancang berdasarkan teori yang sudah ada atau temuan penelitian sebelumnya.
Tujuan utamanya adalah memeriksa apakah efek yang dihipotesiskan benar-benar ada, bukan sekadar mencari kombinasi variabel yang menghasilkan kecocokan data terbaik.
Biasanya peneliti menyusun model lengkap terlebih dahulu (termasuk semua variabel dan interaksi yang dianggap relevan), kemudian menguji apakah menambah atau mengurangi komponen tertentu (misalnya interaksi atau variabel moderasi) memberikan peningkatan kecocokan model secara signifikan.
Uji signifikansi biasanya dilakukan dengan mengadu dua model—misalnya satu model dengan efek tertentu versus model tanpa efek tersebut—menggunakan Likelihood Ratio Test atau metode sejenis.
Contoh singkat:
Jika teori menyatakan variabel A dan B keduanya memengaruhi kemungkinan
seorang pelanggan membeli suatu produk, maka peneliti langsung
memasukkan A dan B ke dalam model logistik, lalu menguji apakah B
benar-benar memberikan kontribusi signifikan setelah A sudah
dimasukkan.
2. Pendekatan Eksploratori
Pendekatan ini dipakai jika peneliti belum memiliki hipotesis yang kaku
atau ingin menemukan pola hubungan potensial antar variabel dengan lebih
bebas. Ciri-cirinya meliputi:
Model dibangun secara bertahap, tujuannya menemukan kombinasi prediktor yang paling baik berdasarkan data.
Seleksi variabel didasarkan pada kriteria statistik seperti AIC (Akaike Information Criterion), deviance, atau nilai log-likelihood.
Proses seleksi dapat dilakukan dengan tiga cara utama:
Forward Selection: Memulai dari model kosong, kemudian menambahkan satu per satu variabel yang paling meningkatkan kinerja model hingga tidak ada lagi yang signifikan.
Backward Elimination: Memulai dari model penuh (semua kandidat variabel), lalu secara bertahap menghapus variabel yang tidak memberikan kontribusi signifikan.
Stepwise Selection: Kombinasi keduanya, di mana variabel bisa masuk atau keluar secara dinamis berdasarkan kriteria yang ditetapkan.
Tujuan utama pendekatan eksploratori adalah memperoleh model yang ringkas (parsimonious) namun tetap memiliki kemampuan prediksi yang baik.
Pemilihan Antara Keduanya
Keputusan menggunakan pendekatan konfirmatori atau eksploratori
bergantung pada tujuan penelitian.
Jika sudah ada hipotesis jelas dan ingin menguji hipotesis tersebut, gunakan pendekatan konfirmatori.
Jika tujuannya lebih ke menemukan pola atau model terbaik berdasarkan data yang tersedia, gunakan pendekatan eksploratori.
Dalam praktik, sering kali kedua pendekatan ini dipadukan: teori dijadikan acuan awal, kemudian proses seleksi eksploratori dilakukan untuk menyempurnakan model agar lebih efisien dan sesuai data.
Simulasi Data
Studi kasus ini diambil dari dataset serupa yang tersedia di
Kaggle:
https://www.kaggle.com/datasets/adilshamim8/predict-students-dropout-and-academic-success?utm.com
Contoh berikut mensimulasikan data untuk prediksi kelulusan mahasiswa (y) berdasarkan tiga variabel prediktor. Dataset mencakup:
y: status kelulusan (0 = tidak lulus, 1 = lulus).
x1: IPK mahasiswa (rentang ≈2.0–4.0).
x2: Persentase kehadiran (60–100%).
x3: Skor ujian akhir (40–100).
library(dplyr)
library(ggplot2)
library(caret)
## Warning: package 'caret' was built under R version 4.4.3
## Loading required package: lattice
##
## Attaching package: 'lattice'
## The following object is masked from 'package:gnm':
##
## barley
##
## Attaching package: 'caret'
## The following objects are masked from 'package:DescTools':
##
## MAE, RMSE
library(pROC)
## Warning: package 'pROC' was built under R version 4.4.3
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
library(DescTools)
set.seed(123)
x1 <- rnorm(500, mean = 3.0, sd = 0.5)
x2 <- rnorm(500, mean = 80, sd = 10)
x3 <- rnorm(500, mean = 70, sd = 15)
# Ubah intercept menjadi lebih kecil agar y menghasilkan dua level
lin_pred <- -8 + 1.5 * x1 + 0.05 * x2 + 0.02 * x3
prob <- 1 / (1 + exp(-lin_pred))
# Simulasi y dan ubah menjadi faktor
y_num <- rbinom(500, size = 1, prob = prob)
y <- factor(y_num, levels = c(0, 1))
df <- data.frame(y, x1, x2, x3)
head(df, 6)
Pemilihan model
model_full <- glm(y ~ x1 + x2 + x3, data = df, family = binomial)
summary(model_full)
##
## Call:
## glm(formula = y ~ x1 + x2 + x3, family = binomial, data = df)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -5.909621 1.515899 -3.898 9.68e-05 ***
## x1 1.028795 0.279512 3.681 0.000233 ***
## x2 0.048333 0.013707 3.526 0.000421 ***
## x3 0.012461 0.008914 1.398 0.162114
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 415.71 on 499 degrees of freedom
## Residual deviance: 387.19 on 496 degrees of freedom
## AIC: 395.19
##
## Number of Fisher Scoring iterations: 5
null_model <- glm(y ~ 1, data = df, family = binomial)
step_forward <- step(null_model, direction = "forward", scope = formula(model_full), trace = FALSE)
step_backward <- step(model_full, direction = "backward", trace = FALSE)
step_both <- step(null_model, direction = "both", scope = formula(model_full), trace = FALSE)
AIC(model_full, step_forward, step_backward, step_both)
pred_prob <- predict(step_both, type = "response")
roc_obj <- roc(df$y, pred_prob)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_obj, main = "Kurva ROC", col = "purple")
Interpretasi
Kurva ROC di atas (ungu) terletak di atas garis diagonal abu-abu, yang artinya model “lebih baik daripada tebakan acak” dalam membedakan mahasiswa yang lulus (positif) versus tidak lulus (negatif). Beberapa poin singkat:
Posisi di atas diagonal
Karena kurva ungu berada di atas garis diagonal, model punya kemampuan
diskriminasi positif vs. negatif yang melebihi 50:50. Semakin jauh
titik‐titik kurva ke arah pojok kiri atas, semakin baik trade‐off antara
sensitivitas (TPR) dan spesifisitas (TNR).
Sensitivitas vs. Spesifisitas
– Pada nilai spesifisitas tinggi (dekat 1.0), sensitivitas masih relatif
sedang (~0.3–0.4), artinya jika kita ingin meminimalkan false‐positive
(misalnya hanya menandai yang benar‐benar berpeluang tidak lulus), masih
ada cukup banyak false‐negative.
– Saat menurunkan ambang prediksi (spesifisitas turun ke sekitar 0.5),
sensitivitas melonjak ke ±0.8. Ini menunjukkan: jika kita “lebih
longgar” dalam menetapkan cutoff sehingga menerima lebih banyak kandidat
sebagai “akan lulus,” maka sekitar 80 % yang sebenarnya lulus akan
tertangkap, tapi kita juga “mengorbankan” setengah spesifisitas
(false‐positive lebih banyak).
Area Under Curve (AUC)
Meskipun skala pastinya tidak tercantum pada plot, bentuk kurva ini—yang
cukup menjauhi diagonal—mengimplikasikan AUC di kisaran 0.7–0.8 (sedikit
di bawah 0.8). Itu berarti model termasuk “cukup baik” (fair–good) dalam
memisahkan kelas lulus/tidak lulus. Semakin mendekati 1.0 nilai AUC,
semakin sempurna model; di sini, AUC ≈ 0.75 bisa diartikan sebagai
kemampuan prediksi yang moderat baik.
Singkatnya, ROC menegaskan bahwa model logistik ini mendiskriminasi antara lulus vs. tidak lulus lebih baik daripada random (diagonal), meski belum sempurna—artinya masih terdapat trade‐off sensitifitas/spesifisitas yang perlu disesuaikan dengan kebutuhan praktis (misalnya memprioritaskan menangkap sebanyak mungkin yang “benar‐benar lulus” vs. mengurangi salah tandai).
auc(roc_obj)
## Area under the curve: 0.6838
PseudoR2(step_both, which = c("CoxSnell", "Nagelkerke", "McFadden"))
## CoxSnell Nagelkerke McFadden
## 0.05171978 0.09160959 0.06387331
pred_class <- ifelse(pred_prob >= 0.5, 1, 0)
conf_matrix <- confusionMatrix(factor(pred_class), df$y, positive = "1")
conf_matrix
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 1 1
## 1 72 426
##
## Accuracy : 0.854
## 95% CI : (0.82, 0.8838)
## No Information Rate : 0.854
## P-Value [Acc > NIR] : 0.5312
##
## Kappa : 0.019
##
## Mcnemar's Test P-Value : 2.55e-16
##
## Sensitivity : 0.9977
## Specificity : 0.0137
## Pos Pred Value : 0.8554
## Neg Pred Value : 0.5000
## Prevalence : 0.8540
## Detection Rate : 0.8520
## Detection Prevalence : 0.9960
## Balanced Accuracy : 0.5057
##
## 'Positive' Class : 1
##
conf_matrix$byClass[c("Sensitivity", "Specificity")]
## Sensitivity Specificity
## 0.99765808 0.01369863
Interpretasi:
Model terbaik berdasarkan AIC adalah model step_both. ROC menunjukkan AUC yang cukup baik (≈0.75). Hasil klasifikasi memperlihatkan akurasi 85,4 %, sensitivitas 99,8 %, dan spesifisitas hanya 1,4 %. Ini menandakan model sangat andal mendeteksi kelas “lulus,” tetapi kurang efektif mengenali yang “tidak lulus.” Pseudo-R² juga mendukung bahwa kekuatan penjelasan model sudah memadai.
Tujuan
Dokumen ini bertujuan memberikan panduan membandingkan model regresi
logistik dengan menggunakan metrik berikut:
Deviance
AIC (Akaike Information Criterion)
Likelihood‐Ratio
Selain itu, dokumen ini juga menguraikan prinsip Parsimony dalam proses pemilihan model.
Simulasi Data
Untuk Data masih menggunakan Data yang sama
set.seed(123)
x1 <- rnorm(500, mean = 3.0, sd = 0.5)
x2 <- rnorm(500, mean = 80, sd = 10)
x3 <- rnorm(500, mean = 70, sd = 15)
# Ubah intercept menjadi lebih kecil agar y menghasilkan dua level
lin_pred <- -8 + 1.5 * x1 + 0.05 * x2 + 0.02 * x3
prob <- 1 / (1 + exp(-lin_pred))
# Simulasi y dan ubah menjadi faktor
y_num <- rbinom(500, size = 1, prob = prob)
y <- factor(y_num, levels = c(0, 1))
df <- data.frame(y, x1, x2, x3)
head(df, 6)
Pembuatan Model
model1 <- glm(y ~ x1, data = df, family = binomial)
model2 <- glm(y ~ x1 + x2, data = df, family = binomial)
model3 <- glm(y ~ x1 + x2 + x3, data = df, family = binomial)
Perbandingan AIC dan Deviance
model_comp <- data.frame(
Model = c("Model 1", "Model 2", "Model 3"),
AIC = c(AIC(model1), AIC(model2), AIC(model3)),
Deviance = c(deviance(model1), deviance(model2), deviance(model3))
)
model_comp
anova(model1, model2, test = "LRT")
anova(model2, model3, test = "LRT")
Interpretasi
Pada perbandingan Model 1 (hanya x1) vs. Model 2 (x1 + x2), penurunan deviance sebesar 13.414 dengan 1 df (p = 0.00025) menunjukkan bahwa penambahan x2 secara signifikan memperbaiki kecocokan model.
Pada perbandingan Model 2 (x1 + x2) vs. Model 3 (x1 + x2 + x3), penurunan deviance hanya 1.9677 dengan 1 df (p = 0.1607) menunjukkan bahwa x3 tidak memberikan perbaikan signifikan pada model.
Model yang terlalu rumit sering kali menghasilkan nilai AIC dan deviance yang lebih rendah. Namun, perlu diingat:
Model yang lebih sederhana lebih mudah untuk dijelaskan.
Jika perbedaan AIC antara dua model tidak signifikan, sebaiknya pilih model yang lebih ringkas.
Prinsip parsimony membantu menghindari overfitting.
1. AIC
Rumus:
\[ \mathrm{AIC} \;=\; -2\,\log L + 2\,k \]
Penjelasan: AIC mengombinasikan ukuran kesesuaian model (melalui log‐likelihood, Log L) dengan penalti untuk jumlah parameter (kkk). Semakin rendah nilai AIC, semakin baik keseimbangan antara fit dan kompleksitas, karena model yang terlalu kompleks akan “dihukum” meski memiliki log‐likelihood tinggi.
2. Deviance Rumus:
\[ D \;=\; -2\,\bigl[\log L(\text{model}) \;-\; \log L(\text{saturasi})\bigr] \]
Penjelasan: Deviance mengukur jarak antara model yang kita pakai dengan model sempurna (saturasi). Nilai deviance kecil menunjukkan bahwa prediksi model mendekati data sebenarnya.
3. Likelihood‐Ratio Test Rumus:
\[ G^{2} \;=\; -2\,\bigl[\log L_{0} \;-\; \log L_{1}\bigr] \]
Penjelasan: Statistik G2 dipakai untuk menguji apakah penambahan prediktor dalam model dapat secara signifikan meningkatkan kecocokan. Jika G2 besar dan p‐value kecil, maka model dengan variabel tambahan secara statistik lebih unggul daripada model yang lebih sederhana.
pred_prob <- predict(model3, type = "response")
pred_class <- factor(ifelse(pred_prob >= 0.5, 1, 0))
conf_matrix <- confusionMatrix(pred_class, df$y, positive = "1")
conf_matrix
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 1 1
## 1 72 426
##
## Accuracy : 0.854
## 95% CI : (0.82, 0.8838)
## No Information Rate : 0.854
## P-Value [Acc > NIR] : 0.5312
##
## Kappa : 0.019
##
## Mcnemar's Test P-Value : 2.55e-16
##
## Sensitivity : 0.9977
## Specificity : 0.0137
## Pos Pred Value : 0.8554
## Neg Pred Value : 0.5000
## Prevalence : 0.8540
## Detection Rate : 0.8520
## Detection Prevalence : 0.9960
## Balanced Accuracy : 0.5057
##
## 'Positive' Class : 1
##
Sensitivitas: Kemampuan model mengidentifikasi dengan benar kasus positif (True Positive Rate).
\[ \text{Sensitivity} \;=\; \frac{TP}{TP + FN} \]
Spesifisitas: Kemampuan model mengidentifikasi dengan benar kasus negatif (True Negative Rate).
\[ \text{Specificity} \;=\; \frac{TN}{TN + FP} \]
conf_matrix$byClass[c("Sensitivity", "Specificity")]
## Sensitivity Specificity
## 0.99765808 0.01369863
Kesimpulan
Nilai deviance yang kecil berarti model kita sudah cocok dengan data.
AIC yang rendah menunjukkan bahwa model tidak hanya pas, tapi juga nggak terlalu rumit.
Likelihood Ratio Test dipakai buat cek apakah nambahin variabel di model benar-benar bikin model jadi lebih baik.
Tabel klasifikasi (confusion matrix) penting untuk lihat seberapa akurat prediksi kita dibandingkan data sebenarnya.
Prinsip parsimony mengingatkan kita untuk pilih model yang lebih sederhana kalau performanya hampir sama.
Kurva ROC itu kayak grafik buat ngecek seberapa jago model klasifikasi biner. Intinya, kita lihat gimana Sensitivity (TPR) versus False Positive Rate (1–Specificity) saat threshold berubah.
Definisi singkat
Sumbu Y (Sensitivity) = TP / (TP + FN)
Sumbu X (1–Specificity) = FP / (FP + TN)
Garis diagonal berarti model cuma “tebak-tebakan” random.
Kalo garisnya makin dekat pojok kiri atas, artinya model makin oke.
Perubahan threshold
Threshold turun → banyak yang diklasifikasikan positif → Sensitivity naik, Specificity turun.
Threshold naik → lebih sedikit positif → Sensitivity turun, Specificity naik.
Kurva ideal
AUC (Area Under Curve)
0.5 = setara tebak acak
0.7 = lumayan bagus
0.9 = sangat bagus
AUC juga disebut concordance index: peluang model ngeberi skor lebih tinggi buat kasus positif dibanding negatif.
Kegunaan
Kegunaan
Membandingkan kinerja berbagai model klasifikasi
Memilih threshold optimal sesuai prioritas, misalnya meminimalkan false negative atau false positive
Visualisasi R
model <- glm(y ~ x1 + x2 + x3, data = df, family = binomial)
pred <- predict(model, type = "response")
roc_obj <- roc(df$y, pred)
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
plot(roc_obj)
auc(roc_obj)
## Area under the curve: 0.6885
Simulasi Pemilihan Threshold Optimal
thresholds <- seq(0.1, 0.9, by = 0.05)
results <- data.frame(Threshold = thresholds)
# Pastikan df$y adalah faktor dengan level "0" dan "1"
df$y <- factor(df$y, levels = c("0", "1"))
results$Sensitivity <- sapply(thresholds, function(t) {
pred_class <- ifelse(pred >= t, 1, 0)
cm <- table(
Pred = factor(pred_class, levels = c(0, 1)),
Obs = factor(as.character(df$y), levels = c("0", "1"))
)
TP <- cm["1", "1"]
FN <- cm["0", "1"]
TP / (TP + FN)
})
results$Specificity <- sapply(thresholds, function(t) {
pred_class <- ifelse(pred >= t, 1, 0)
cm <- table(
Pred = factor(pred_class, levels = c(0, 1)),
Obs = factor(as.character(df$y), levels = c("0", "1"))
)
TN <- cm["0", "0"]
FP <- cm["1", "0"]
TN / (TN + FP)
})
results
Cut-off optimal dapat dipilih dengan memaksimalkan nilai Sensitivitas ditambah Spesifisitas. Alternatifnya, sesuaikan titik potong dengan tujuan aplikasi: misalnya, jika ingin meminimalkan False Negative, prioritaskan sensitivitas yang tinggi.
Catatan:
Kurva ROC paling tepat digunakan saat proporsi kelas relatif seimbang.
Untuk dataset dengan kelas yang tidak seimbang, kurva precision–recall biasanya lebih informatif.
Penjelasan Precision–Recall Curve
Kurva Precision–Recall (PR) adalah alat evaluasi performa model klasifikasi biner yang sangat berguna ketika dataset mengalami ketidakseimbangan kelas (class imbalance).
1. Definisi
\[ \text{Precision} = \frac{TP}{TP + FP} \]
Proporsi prediksi positif yang benar-benar benar.
\[ \text{Recall} = \frac{TP}{TP + FN} \]
2. Interpretasi
Kurva PR menunjukkan bagaimana nilai presisi berubah ketika recall meningkat.
Idealnya, kita menginginkan Precision dan Recall keduanya tinggi, meskipun pada kenyataannya sering terdapat trade–off antara keduanya.
Model dengan performa baik akan menghasilkan PR Curve yang melengkung ke pojok kanan atas (artinya: presisi dan recall tinggi pada berbagai threshold).
3. Area Under PR Curve
AUPRC (Area Under Precision–Recall Curve) mendekati 1 menunjukkan model yang sangat baik.
Baseline AUPRC sama dengan prevalensi kelas positif dalam data (yakni proporsi sampel positif).
4. Perbandingan PR Curve dan ROC Curve
Tabel berikut merangkum perbedaan fokus dan penggunaan antara ROC Curve dan Precision–Recall Curve:
Visualisasi PR Curve di R
library(PRROC)
## Warning: package 'PRROC' was built under R version 4.4.3
## Loading required package: rlang
model <- glm(y ~ x1 + x2 + x3, data = df, family = binomial)
prob <- predict(model, type = "response")
pr <- pr.curve(scores.class0 = prob[df$y == 1],
scores.class1 = prob[df$y == 0],
curve = TRUE)
plot(pr)
Interpretasi
Kurva Precision-Recall (PR) memplot recall pada sumbu X dan presisi pada sumbu Y, dengan titik ideal di sudut kanan atas (presisi = 1, recall = 1). Model yang baik menghasilkan kurva yang tetap tinggi meski recall meningkat, sedangkan tebakan acak akan membentuk garis horizontal di level presisi sesuai proporsi kelas positif. Nilai AUC PR sebesar 0.916 menunjukkan model ini memiliki performa sangat baik, hampir mendekati ideal, karena mampu menjaga kombinasi presisi dan recall di berbagai threshold. Pada data tidak seimbang seperti di simulasi ini, PR curve lebih informatif dibanding ROC karena fokus pada kinerja mendeteksi kelas positif, sehingga penting untuk menilai apakah model benar-benar unggul dibanding baseline tebakan acak yang bisa saja sudah memiliki presisi tinggi akibat dominasi kelas positif.
Tujuan menjelaskan dan menghitung pseudo R-squared dalam regresi logistik R2 CoxandSnell dan McFadden
Data
Data masih sama seperti sebelumnya
set.seed(123)
x1 <- rnorm(500, mean = 3.0, sd = 0.5)
x2 <- rnorm(500, mean = 80, sd = 10)
x3 <- rnorm(500, mean = 70, sd = 15)
# Ubah intercept menjadi lebih kecil agar y menghasilkan dua level
lin_pred <- -8 + 1.5 * x1 + 0.05 * x2 + 0.02 * x3
prob <- 1 / (1 + exp(-lin_pred))
# Simulasi y dan ubah menjadi faktor
y_num <- rbinom(500, size = 1, prob = prob)
y <- factor(y_num, levels = c(0, 1))
df <- data.frame(y, x1, x2, x3)
head(df, 6)
Model Logistik dan Null Model
model <- glm(y ~ x1 + x2 + x3, data = df, family = binomial)
model_null <- glm(y ~ 1, data = df, family = binomial)
Likelihood dan Rumus
\[ R^2_{\text{Cox and Snell}} = 1 - \left( \frac{L_0}{L_M} \right)^{2/n} \]
\[ R^2_{\text{McFadden}} = 1 - \frac{\log L_M}{\log L_0} \]
Dengan:
• 𝐿0: likelihood model null (tanpa prediktor) • 𝐿𝑀: likelihood model penuh
Perhitungan Manual R-squared
logL0 <- logLik(model_null)
logLM <- logLik(model)
L0 <- exp(logL0)
LM <- exp(logLM)
n <- nobs(model)
cox_snell <- 1- (L0 / LM)^(2 / n)
mcfadden <- 1- (as.numeric(logLM) / as.numeric(logL0))
r2 <- data.frame(
R2_Cox_Snell = cox_snell,
R2_McFadden = mcfadden
)
r2
Perhitungan Otomatis dengan Package Tambahan
PSCL
#PSCL
library(pscl)
## Warning: package 'pscl' was built under R version 4.4.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(model)
## fitting null model for pseudo-r2
## llh llhNull G2 McFadden r2ML
## -193.59358859 -207.85373636 28.52029554 0.06860665 0.05544427
## r2CU
## 0.09820667
R Companion
#RCompanion
library(rcompanion)
## Warning: package 'rcompanion' was built under R version 4.4.3
nagelkerke(model)
## $Models
##
## Model: "glm, y ~ x1 + x2 + x3, binomial, df"
## Null: "glm, y ~ 1, binomial, df"
##
## $Pseudo.R.squared.for.model.vs.null
## Pseudo.R.squared
## McFadden 0.0686066
## Cox and Snell (ML) 0.0554443
## Nagelkerke (Cragg and Uhler) 0.0982067
##
## $Likelihood.ratio.test
## Df.diff LogLik.diff Chisq p.value
## -3 -14.26 28.52 2.8243e-06
##
## $Number.of.observations
##
## Model: 500
## Null: 500
##
## $Messages
## [1] "Note: For models fit with REML, these statistics are based on refitting with ML"
##
## $Warnings
## [1] "None"
DescTools
#DescTools
library(DescTools)
PseudoR2(model, which = "all")
## McFadden McFaddenAdj CoxSnell Nagelkerke AldrichNelson
## 0.06860665 0.04936234 0.05544427 0.09820667 0.05396254
## VeallZimmermann Efron McKelveyZavoina Tjur AIC
## 0.11886699 0.06590309 0.13586617 0.06324857 395.18717718
## BIC logLik logLik0 G2
## 412.04560957 -193.59358859 -207.85373636 28.52029554
Interpretasi
Nilai pseudo R² pada model logistik ini menunjukkan McFadden ≈ 0,069, Cox & Snell ≈ 0,055, dan Nagelkerke ≈ 0,098, yang secara umum termasuk kategori rendah, artinya model hanya sedikit lebih baik dibanding model tanpa prediktor dalam menjelaskan variasi data. McFadden R² di bawah 0,2 menandakan kekuatan prediktif yang lemah, sementara Cox & Snell memang cenderung lebih konservatif, dan Nagelkerke yang telah disesuaikan skalanya juga tetap di bawah 0,1. Kesimpulannya, model dengan prediktor x1, x2, dan x3 ini belum cukup kuat untuk memberikan peningkatan kecocokan yang berarti, sehingga interpretasi performa model perlu dilengkapi dengan metrik lain seperti AIC, BIC, uji rasio peluang, atau evaluasi berbasis prediksi.
Distribusi Multinomial adalah generalisasi dari distribusi Binomial ke kasus di mana setiap percobaan dapat menghasilkan salah satu dari k kategori (bukan hanya dua kategori seperti pada binomial). Secara intuitif, kita melakukan nnn percobaan independen, dan pada setiap percobaan terdapat tepat k kemungkinan hasil dengan probabilitas masing-masing p1,p2,…,pk (dengan ∑pi=1). Distribusi Multinomial memodelkan peluang bahwa setelah nnn percobaan, kategori ke-1 terjadi x1 kali, kategori ke-2 terjadi x2 kali, …, kategori ke-k terjadi xk kali, dengan syarat ∑xi=n.
Secara formal, jika X=(X1,X2,…,Xk) adalah vektor random yang menunjukkan banyaknya kemunculan masing-masing kategori, maka fungsi massa probabilitasnya (PMF) adalah:
\[ P(X_1 = x_1, \ldots, X_k = x_k) = \begin{cases} \dfrac{n!}{x_1!\,x_2!\,\cdots\,x_k!}\;p_1^{\,x_1}\,p_2^{\,x_2}\cdots p_k^{\,x_k}, & \text{jika } x_i \ge 0,\;\sum_{i=1}^k x_i = n,\\[1em] 0, & \text{lainnya}. \end{cases} \]
Misalkan dilakukan survei terhadap 50 orang untuk mengetahui jenis kopi favorit mereka. Responden diminta memilih satu dari tiga kategori: Kopi Hitam (H), Kopi Latte (L), dan Kopi Cappuccino (C). Hasil survei menunjukkan bahwa 20 orang memilih Kopi Hitam, 15 orang memilih Kopi Latte, dan 15 orang memilih Kopi Cappuccino. Secara teoritis diasumsikan probabilitas preferensi masing-masing kategori adalah pH=0.4, pL=0.3, dan . Pertanyaannya adalah: berapa peluang bahwa dari 50 orang tersebut terdapat tepat 20 yang memilih H, 15 memilih L, dan 15 memilih C?
Sumber: Studi survei dan artikel terkemuka seperti GoodStatsdata.goodstats.iddata.goodstats.id, Snapcartsnapcart.global, British Coffee Associationbalancecoffee.co.uk, publikasi Lincoln & Yorkteaandcoffee.net, media Mashedmashed.commashed.com, Tea & Coffee Trade Journal (Coffeeness)teaandcoffee.net, YouGovtoday.yougov.com, dan Drive Researchdriveresearch.com. Semua sumber ini menyajikan kasus nyata survei preferensi jenis kopi.
Jumlah responden: n=50.
Kategori kopi: H (Hitam), L (Latte), C (Cappuccino).
Hasil survei (observasi): xH=20, xL=15, xC=15.
Probabilitas teoritis: pH=0.4, pL=0.3, pC=0.3.
Pertanyaan: Hitung probabilitas kombinasi hasil tersebut.
Perhitungan Manual di R
n <- 50
x <- c(20, 15, 15)
p <- c(0.4, 0.3, 0.3)
faktorial_total <- factorial(n)
faktorial_x <- prod(factorial(x))
koefisien <- faktorial_total / faktorial_x
peluang <- koefisien * prod(p^x)
peluang
## [1] 0.01654964
Interpretasi
Probabilitas bahwa 20 orang memilih Kopi Hitam, 15 orang memilih Kopi Latte, dan 15 orang memilih Kopi Cappuccino (dengan proporsi preferensi 0.4, 0.3, dan 0.3) adalah 0.01654964. Distribusi multinomial digunakan untuk menghitung peluang dalam percobaan dengan beberapa kategori hasil. Rumus dasarnya merupakan generalisasi dari binomial untuk lebih dari dua kategori.
Model ini digunakan untuk menghubungkan sebuah variabel respons kategorikal (dengan lebih dari dua kategori) dengan satu atau lebih variabel prediktor. Misalkan variabel Y memiliki K kategori, dan kita tetapkan kategori ke-KKK sebagai kategori referensi (baseline). Untuk tiap kategori j (dengan j=1,2,…,K−1), persamaan logitnya dapat ditulis sebagai:
\[ \log\!\biggl(\frac{P(Y = j)}{P(Y = K)}\biggr) \;=\; \beta_{j0} \;+\; \beta_{j1}\,x_{1} \;+\; \cdots \;+\; \beta_{jp}\,x_{p}, \quad j = 1,2,\dots,K-1. \]
Model baseline-category logit (juga sering disebut multinomial logit) digunakan ketika variabel respons berskala kategorikal nominal dengan lebih dari dua kelas. Cara kerjanya adalah dengan memilih satu kategori sebagai baseline (acuan), kemudian membandingkan log-rasio peluang setiap kategori lain terhadap kategori baseline tersebut.
Misalkan Y memiliki c kategori {1,2,…,c}, dan kita jadikan kategori ke-ccc sebagai baseline. Definisinya adalah:
\[ \log\!\Bigl(\frac{\pi_j}{\pi_c}\Bigr) \;=\; \alpha_j \;+\; \beta_{j1}\,x_1 \;+\; \beta_{j2}\,x_2 \;+\;\cdots\;+\; \beta_{jp}\,x_p, \quad j = 1,2,\dots,c-1. \]
Model dengan Satu Prediktor x
Jika hanya ada satu variabel prediktor (sebut saja x), maka untuk setiap kategori j=1,2,…,c−1 persamaan logit-nya menjadi
\[ \log\!\Bigl(\frac{\pi_j}{\pi_c}\Bigr) \;=\; \alpha_j \;+\; \beta_{j}\,x, \qquad j = 1,2,\dots,c-1. \]
Contoh Kasus: c=3 Kategori Respons
Misalkan Y∈{1,2,3}, dan kita tetapkan kategori ke-3 sebagai baseline (c=3). Maka akan ada dua persamaan logit:
\[ \log\!\Bigl(\frac{\pi_1}{\pi_3}\Bigr) \;=\; \alpha_1 \;+\; \beta_1\,x. \]
\[ \log\!\Bigl(\frac{\pi_2}{\pi_3}\Bigr) \;=\; \alpha_2 \;+\; \beta_2\,x. \]
Karena kategori 3 dijadikan baseline, maka π3 muncul di penyebut kedua logit tersebut.
Hubungan Langsung Antara Dua Kategori Non-Baseline
Jika Anda ingin menghitung log-rasio antara kategori 1 dan kategori 2 langsung (tanpa lewat baseline), dapat diturunkan sebagai berikut:
\[ \begin{aligned} \log\!\Bigl(\tfrac{\pi_1}{\pi_2}\Bigr) &= \log\!\Bigl(\tfrac{\pi_1 / \pi_3}{\,\pi_2 / \pi_3}\Bigr) = \log\!\Bigl(\tfrac{\pi_1}{\pi_3}\Bigr) -\, \log\!\Bigl(\tfrac{\pi_2}{\pi_3}\Bigr) \\ &= (\alpha_1 + \beta_1\,x) \;-\; (\alpha_2 + \beta_2\,x) = (\alpha_1 - \alpha_2) \;+\; (\beta_1 - \beta_2)\,x. \end{aligned} \]
Ringkasan Karakteristik Model Baseline-Category Logit
Digunakan apabila respons bersifat nominal dengan lebih dari dua kategori.
Menghasilkan (c−1) fungsi logit yang membandingkan setiap kategori dengan kategori baseline.
Untuk membandingkan dua kategori non-baseline secara langsung, Anda bisa mengurangi dua persamaan logit terhadap baseline.
Implementasi di R biasa menggunakan fungsi
multinom() dari paket nnet, dan Anda dapat
menentukan kategori baseline dengan relevel().
Estimasi parameter pada model baseline‐category logit dilakukan dengan pendekatan maximum likelihood, biasanya dioptimumkan menggunakan algoritma iteratif seperti Newton–Raphson.
Log‐likelihood-nya dapat ditulis sebagai berikut:
\[ \ell(\beta) \;=\; \sum_{i=1}^{n} \;\sum_{j=1}^{K} y_{ij}\,\log\bigl(\pi_{ij}\bigr), \]
dengan:
\[ \pi_{ij} \;=\; P\bigl(Y_i = j \mid x_i\bigr), \qquad y_{ij} \;=\; \begin{cases} 1, & \text{jika } Y_i = j,\\ 0, & \text{jika } Y_i \neq j. \end{cases} \]
Dengan log-likelihood di atas, parameter β diestimasi dengan mencari nilai yang memaksimumkan ℓ(β). Proses optimasi biasanya menggunakan algoritma Newton–Raphson (atau varian lain seperti Fisher scoring).
Sebuah perusahaan otomotif melakukan survei terhadap 150 karyawan untuk memahami faktor-faktor yang memengaruhi pilihan kendaraan sehari-hari (Mobil, Motor, atau Sepeda). Setiap karyawan dicatat usia (Age), divisi tempat bekerja (Department), dan jarak tempuh harian dari rumah ke kantor (Distance). Data yang dikumpulkan meliputi variabel-variabel berikut:
Vehicle: Jenis kendaraan yang dipilih (Mobil, Motor, Sepeda)
Age: Usia karyawan (tahun)
Department: Divisi tempat bekerja (Produksi, Pemasaran, Keuangan)
Distance: Jarak tempuh harian dari rumah ke kantor (dalam km)
Tujuannya adalah untuk menganalisis bagaimana usia, divisi, dan jarak tempuh memengaruhi preferensi jenis kendaraan karyawan.
set.seed(123)
n <- 150
Department <- sample(c("Produksi", "Pemasaran", "Keuangan"), n, replace = TRUE)
Age <- round(rnorm(n, mean = 35, sd = 7))
Distance <- round(pmax(rnorm(n, mean = 10, sd = 4), 0))
# Simulasikan Vehicle berdasarkan probabilitas berbeda per Department
Vehicle <- sapply(Department, function(dep) {
if (dep == "Produksi") {
sample(c("Mobil", "Motor", "Sepeda"), size = 1, prob = c(0.4, 0.4, 0.2))
} else if (dep == "Pemasaran") {
sample(c("Mobil", "Motor", "Sepeda"), size = 1, prob = c(0.3, 0.5, 0.2))
} else {
sample(c("Mobil", "Motor", "Sepeda"), size = 1, prob = c(0.5, 0.2, 0.3))
}
})
# Buat data frame
veh_df <- data.frame(Vehicle = factor(Vehicle), Age, Department = factor(Department), Distance)
veh_df$Vehicle <- relevel(veh_df$Vehicle, ref = "Mobil") # jadikan Mobil sebagai baseline
head(veh_df)
library(nnet)
model_mnlogit <- multinom(Vehicle ~ Age + Department + Distance, data = veh_df)
## # weights: 18 (10 variable)
## initial value 164.791843
## iter 10 value 154.693878
## final value 153.822882
## converged
summary(model_mnlogit)
## Call:
## multinom(formula = Vehicle ~ Age + Department + Distance, data = veh_df)
##
## Coefficients:
## (Intercept) Age DepartmentPemasaran DepartmentProduksi
## Motor -0.3715781 -0.01617355 0.9820642 0.6284537
## Sepeda 1.3183252 -0.02925240 -0.8719449 -1.0875480
## Distance
## Motor 0.01642662
## Sepeda -0.02480017
##
## Std. Errors:
## (Intercept) Age DepartmentPemasaran DepartmentProduksi Distance
## Motor 1.171992 0.02717545 0.4899665 0.5247899 0.04965903
## Sepeda 1.185219 0.02897062 0.5096595 0.5495043 0.05158578
##
## Residual Deviance: 307.6458
## AIC: 327.6458
z <- summary(model_mnlogit)$coefficients / summary(model_mnlogit)$standard.errors
pval <- 2 * (1- pnorm(abs(z)))
round(pval, 4)
## (Intercept) Age DepartmentPemasaran DepartmentProduksi Distance
## Motor 0.7512 0.5517 0.0450 0.2311 0.7408
## Sepeda 0.2660 0.3126 0.0871 0.0478 0.6307
Interpretasi
Dari tabel p-value yang dihasilkan:
Pada perbandingan Motor vs Mobil, hanya variabel DepartmentPemasaran yang p-valuenya 0.0450 (< 0.05), sehingga bisa disimpulkan bahwa bekerja di divisi Pemasaran secara signifikan memengaruhi probabilitas seseorang memilih Motor dibandingkan Mobil. Variabel lainnya (Age, DepartmentProduksi, Distance) memiliki p-value > 0.05, artinya tidak terdapat bukti yang cukup untuk menyatakan pengaruh signifikan terhadap pilihan Motor vs Mobil.
Pada perbandingan Sepeda vs Mobil, hanya variabel DepartmentProduksi yang p-valuenya 0.0478 (< 0.05), yang berarti bekerja di divisi Produksi secara signifikan terkait dengan kemungkinan memilih Sepeda dibandingkan Mobil. Sedangkan variabel Age, DepartmentPemasaran, dan Distance pada baris Sepeda memiliki p-value > 0.05, sehingga tidak dianggap signifikan untuk membedakan antara Sepeda dan Mobil.
library(nnet)
model_mnlogit2 <- multinom(Vehicle ~ Age + Department + Distance, data = veh_df)
## # weights: 18 (10 variable)
## initial value 164.791843
## iter 10 value 154.693878
## final value 153.822882
## converged
veh_df$Predicted <- predict(model_mnlogit2)
table(Predicted = veh_df$Predicted, Actual = veh_df$Vehicle)
## Actual
## Predicted Mobil Motor Sepeda
## Mobil 32 20 19
## Motor 20 25 9
## Sepeda 9 6 10
library(ggplot2)
ggplot(veh_df, aes(x = Age, y = Distance, color = Predicted)) +
geom_point(size = 2) +
labs(
title = "Prediksi Multinomial Logistic Regression",
x = "Usia (tahun)",
y = "Jarak Tempuh Harian (km)"
) +
theme_minimal()
Model regresi logistik multinomial dapat dimanfaatkan untuk:
Mengevaluasi kaitan antara karakteristik karyawan dan pilihan perangkat kerja
Mengidentifikasi variabel yang secara signifikan memengaruhi keputusan pemilihan
Memfasilitasi prediksi perangkat yang kemungkinan dipilih karyawan baru berdasarkan profilnya
Regresi logistik ordinal adalah metode pemodelan untuk variabel dependen (respon) yang berskala ordinal, yaitu nilai-nilainya memiliki urutan (ranking) tetapi jarak antar kategori tidak harus sama. Contohnya, tingkat kepuasan pelanggan yang dibagi menjadi “Tidak Puas”, “Netral”, dan “Sangat Puas”. Tujuannya adalah memperkirakan peluang (odds) agar sebuah observasi berada pada atau di atas kategori tertentu, dengan mengasumsikan bahwa koefisien prediktor bersifat konstan (proportional odds) di seluruh batas (threshold) kategori.
Regresi logistik ordinal dipakai saat variabel respon 𝑌 berskala ordinal (ada urutannya). Misalnya, tingkat kepuasan: Rendah – Sedang – Tinggi. Model ini berbeda dengan:
Regresi logistik biner: hanya mempunyai dua kategori saja.
Regresi logistik multinomial: memiliki lebih dari dua kategori, tetapi urutannya tidak diperhitungkan.
Model yang dipakai adalah Cumulative Logit Model dengan asumsi proportional odds. Persamaan umumnya dapat ditulis sebagai:
\[ \log\!\biggl(\frac{\Pr(Y \le j)}{\Pr(Y > j)}\biggr) \;=\; \alpha_j \;+\; \beta\,x \]
Di mana:
αj adalah intercept khusus untuk ambang batas (cut‐point) kategori ke-j.
β adalah koefisien regresi yang diasumsikan sama pada semua persamaan logit kumulatif (proportional odds).
Jika variabel respon Y mempunyai c kategori, maka secara otomatis akan ada (c−1) persamaan logit kumulatif—satu untuk setiap nilai j=1,2,…,c−1.
Metode yang digunakan adalah Model Logit Kumulatif dengan asumsi proportional odds. Persamaan umumnya adalah:
\[ \log\!\biggl(\frac{\Pr(Y \le j)}{\Pr(Y > j)}\biggr) \;=\; \alpha_{j} \;+\; \beta\,x \]
Keterangan:
αj adalah intercept (konstanta) khusus untuk ambang batas kategori j.
β adalah koefisien regresi yang diasumsikan sama pada seluruh persamaan logit kumulatif (proportional odds).
Jika variabel respon Y memiliki c kategori, maka akan terbentuk (c−1) persamaan logit kumulatif—satu persamaan untuk setiap nilai j=1,2,…,c−1.
Koefisien \(\beta\) menjelaskan
bagaimana perubahan nilai \(x\)
memengaruhi peluang observasi berada pada kategori yang sama atau lebih
rendah.
- Jika \(\beta > 0\): ketika \(x\) meningkat, peluang untuk termasuk ke
dalam kategori yang lebih rendah juga meningkat.
- Jika \(\beta < 0\): ketika \(x\) meningkat, peluang untuk termasuk ke
dalam kategori yang lebih tinggi semakin besar.
Rasio peluang (odds ratio) dapat ditulis sebagai:
\[ \mathrm{OR} \;=\; e^{\beta} \]
Contoh variabel ordinal adalah tingkat keparahan kecelakaan lalu lintas. Banyak studi lalu lintas mengklasifikasikan keparahan kecelakaan menjadi kategori ordinal seperti fatal/berat, sedang, atau ringan. Misalnya dalam penelitian Tola et al. (2021) disebutkan bahwa setiap insiden kecelakaan diberi bobot berbeda berdasarkan tingkat keparahan (fatal=3.0, cedera serius=1.8, cedera ringan=1.3)mdpi.com. Hal ini mengindikasikan adanya tingkatan ordinal dalam variabel keparahan kecelakaan. Untuk mensimulasikan kasus ini, kita bisa membuat prediktor numerik (misalnya kecepatan kendaraan) dan meng-cut skor keparahan menjadi kategori “Ringan”, “Sedang”, “Berat”. Pendekatan R-nya mirip:
set.seed(123)
n2 <- 200
kecepatan <- round(runif(n2, 30, 100)) # prediktor: kecepatan (km/jam)
severity_score <- 0.05 * kecepatan + rnorm(n2)
severity <- cut(severity_score,
breaks = c(-Inf, 2.5, 4, Inf),
labels = c("Ringan", "Sedang", "Berat"),
ordered_result = TRUE)
df2 <- data.frame(severity, kecepatan)
head(df2)
Di sini severity bertindak sebagai variabel ordinal
menggambarkan keparahan kecelakaan (“Ringan” < “Sedang” <
“Berat”), sejalan dengan klasifikasi umum studi kecelakaanmdpi.com.
Sekali lagi, sintaks cut dengan
ordered_result = TRUE menjadikan severity
factor terurut.
library(MASS)
model_ord2 <- polr(severity ~ kecepatan,
data = df2,
Hess = TRUE)
summary(model_ord2)
## Call:
## polr(formula = severity ~ kecepatan, data = df2, Hess = TRUE)
##
## Coefficients:
## Value Std. Error t value
## kecepatan 0.08539 0.00982 8.696
##
## Intercepts:
## Value Std. Error t value
## Ringan|Sedang 4.0638 0.5871 6.9212
## Sedang|Berat 6.9542 0.7479 9.2978
##
## Residual Deviance: 326.6271
## AIC: 332.6271
(ctable <- coef(summary(model_ord2)))
## Value Std. Error t value
## kecepatan 0.08538879 0.009819716 8.695648
## Ringan|Sedang 4.06379139 0.587148102 6.921237
## Sedang|Berat 6.95420529 0.747942780 9.297777
p <- pnorm(abs(ctable[, "t value"]), lower.tail = FALSE) * 2
(ctable <- cbind(ctable, "p value" = round(p, 4)))
## Value Std. Error t value p value
## kecepatan 0.08538879 0.009819716 8.695648 0
## Ringan|Sedang 4.06379139 0.587148102 6.921237 0
## Sedang|Berat 6.95420529 0.747942780 9.297777 0
# Membuat data baru dengan rentang nilai kecepatan yang ingin diprediksi
newdata2 <- data.frame(kecepatan = c(30, 40, 50, 60, 70))
# Melakukan prediksi probabilitas kategori severity
predict(model_ord2, newdata = newdata2, type = "probs")
## Ringan Sedang Berat
## 1 0.8178916 0.1698903 0.01221812
## 2 0.6566136 0.3151541 0.02823221
## 3 0.4487683 0.4873533 0.06387831
## 4 0.2573981 0.6044682 0.13813376
## 5 0.1285966 0.5979138 0.27348951
Interpretasi:
Semakin tinggi kecepatan kendaraan, kemungkinan kecelakaan berlabel
“Ringan” makin kecil, sedangkan kemungkinan “Berat” makin besar.
Sementara itu, kategori “Sedang” dominan pada kecepatan menengah
(sekitar 50–60 km/jam), tetapi mulai turun sedikit saat kecepatan sudah
mencapai 70 km/jam karena proporsi “Berat” terus meningkat.
Model cumulative logit (logit kumulatif) mengasumsikan bahwa efek setiap prediktor (\(\beta\)) sama pada semua batas kategori (cutoff)—dikenal juga sebagai proportional odds atau parallel lines assumption. Jika asumsi ini tidak terpenuhi, kita perlu mempertimbangkan model ordinal yang non-proportional odds, seperti generalized ordinal logistic model atau partial proportional odds model.
Untuk memeriksa kecocokan (goodness-of-fit), kita biasanya membandingkan deviance atau melakukan likelihood ratio test antara:
Jika p-value < 0,05, berarti asumsi proportional odds kemungkinan besar tidak terpenuhi, sehingga cumulative logit tidak valid.
Selain cumulative logit, terdapat beberapa pendekatan lain untuk menangani variabel respon ordinal, khususnya ketika asumsi proportional odds dilanggar:
Adjacent-category logit
Menghitung peluang (odds) untuk kategori \(j\) berbanding \(j+1\).
Continuation-ratio (sequential) logit
Memecah proses keputusan menjadi urutan model logit biner: “apakah masuk
kategori \(\le j\) atau > \(j\)”, kemudian lanjut ke kategori
berikutnya jika memenuhi syarat.
Model-model ini tidak mengharuskan koefisien prediktor sama di tiap batas kategori, sehingga lebih fleksibel saat parallelism assumption gagal.
polr() dari paket
MASS.Model regresi logistik ordinal yang paling umum—yaitu Cumulative Logit Model—menggunakan asumsi Proportional Odds, juga disebut asumsi paralelisme.
Definisi Asumsi Paralelisme
Asumsi paralelisme menyatakan bahwa koefisien regresi \(\beta\) untuk setiap prediktor adalah sama
pada setiap fungsi logit kumulatif (cumulative logit). Dengan kata lain,
garis (logit kumulatif) untuk setiap kategori hanya berbeda pada
intercept (\(\alpha_j\)), sedangkan
gradien (kemiringan) garisnya sama.
Secara matematis, untuk \(j = 1, \ldots,
c-1\):
\[
\log\!\biggl(\frac{\Pr(Y \le j)}{\Pr(Y > j)}\biggr) \;=\;
\alpha_{j} \;+\; \beta\,x.
\]
Visualisasi
Pada asumsi paralelisme, kurva logit kumulatif untuk tiap kategori terhadap prediktor \(x\) memiliki kemiringan yang sama (paralel), hanya intercept-nya berbeda.
Konsekuensi Bila Asumsi Tidak Terpenuhi
Pengujian Asumsi Paralelisme
Dua metode umum untuk memeriksa apakah asumsi proportional odds
terpenuhi:
1. Likelihood Ratio Test
- Bandingkan model proportional (cumulative logit) dengan model
non-proportional.
2. Brant Test (paket brant di R)
- Menghasilkan p-value; bila p-value < 0,05 → asumsi tidak
terpenuhi.
Contoh Kode (menggunakan data kecelakaan keparahan
df2):
# Pastikan paket MASS dan brant terinstal
library(MASS)
library(brant)
## Warning: package 'brant' was built under R version 4.4.3
# Estimasi model cumulative logit (proportional odds)
model_ord2 <- polr(
severity ~ kecepatan,
data = df2,
Hess = TRUE
)
# Lakukan Brant Test untuk menguji asumsi paralelisme
brant(model_ord2)
## --------------------------------------------
## Test for X2 df probability
## --------------------------------------------
## Omnibus 0.92 1 0.34
## kecepatan 0.92 1 0.34
## --------------------------------------------
##
## H0: Parallel Regression Assumption holds
Jika p-value pada Brant Test < 0,05, kita menolak asumsi proportional odds → sebaiknya gunakan model ordinal alternatif.
Ringkasan Akhir
Goodness-of-Fit & Proportional Odds
Cek deviance atau likelihood ratio untuk menetapkan kecocokan cumulative logit.
Jika asumsi tidak terpenuhi, cari model non-proportional.
Alternatif Model Ordinal
Adjacent-Category Logit
Continuation-Ratio Logit
Asumsi Paralelisme
Menuntut β konstan di seluruh cutoff kategori.
Diuji dengan Likelihood Ratio Test atau Brant Test.
Implementasi di R
polr() dari paket MASS untuk
cumulative logit.
brant() dari paket brant untuk
menguji parallelism.
Analisis data kategorik memegang peranan krusial dalam statistika terapan karena banyak fenomena di dunia nyata menghasilkan data berbentuk kategori, misalnya jenis kelamin, status pekerjaan, tingkat pendidikan, preferensi konsumen, atau hasil diagnosis medis. Untuk mengkaji data kategorik, umumnya digunakan tabel kontingensi, model log-linier, dan regresi logistik. Setiap metode memiliki keunggulan dan keterbatasan tergantung pada tujuan analisis serta struktur data yang dihadapi.
Tabel Kontingensi sebagai Langkah Awal
Tabel kontingensi sering menjadi titik awal eksplorasi untuk meninjau
hubungan antara dua atau lebih variabel kategorik. Sebagai contoh, dalam
penelitian mengenai efek suatu obat terhadap kejadian serangan jantung,
tabel kontingensi dapat menyajikan jumlah pasien yang mengalami atau
tidak mengalami serangan jantung berdasarkan jenis obat yang dikonsumsi.
Dari tabel ini, kita dapat mengamati pola-pola awal dan menghitung
ukuran-ukuran asosiasi seperti odds ratio, risk ratio, serta statistik
chi-square untuk menguji apakah variabel-variabel tersebut saling
bebas.
Mengapa Model Log-Linier Dibutuhkan
Ketika analisis memerlukan pemodelan yang mampu mengendalikan efek
beberapa variabel sekaligus beserta interaksinya, model log-linier
menjadi sangat berguna. Model ini merupakan salah satu bentuk khusus
dari Generalized Linear Model (GLM) yang diterapkan pada frekuensi sel
dalam tabel kontingensi dengan asumsi distribusi Poisson. Berbeda dari
regresi logistik, model log-linier tidak membedakan variabel sebagai
dependen atau independen—semua variabel diperlakukan secara setara
(simetris). Karena itu, model ini ideal untuk menggali struktur asosiasi
atau independensi antar variabel, bukan untuk tujuan prediksi
langsung.
Struktur model log-linier dibangun berdasarkan efek utama (main effects) tiap variabel serta berbagai kombinasi interaksi di antara variabel-variabel tersebut. Misalnya, dalam sebuah tabel kontingensi tiga arah (contoh: jenis kelamin, status merokok, dan kondisi penyakit paru), model log-linier memungkinkan kita menilai apakah hubungan dua variabel saja sudah cukup menjelaskan data, ataukah perlu memasukkan interaksi tiga variabel agar struktur asosiasinya lebih tepat. Untuk menentukan model yang paling sesuai, seringkali digunakan uji likelihood ratio untuk membandingkan model yang lebih sederhana dengan model berinteraksi lebih kompleks.
Perbandingan dengan Regresi Logistik
Sementara itu, regresi logistik adalah pendekatan yang paling umum
apabila terdapat satu variabel kategorik yang secara eksplisit dianggap
sebagai variabel dependen (misalnya kejadian penyakit: ya/tidak),
sedangkan satu atau lebih variabel lain—baik kategorik maupun
numerik—dijalankan sebagai prediktor. Model ini memodelkan logit (log
odds) dari probabilitas kejadian, sehingga sangat tepat dipakai dalam
studi observasional maupun eksperimen untuk menjelaskan atau
memperkirakan kemungkinan suatu hasil (outcome). Regresi logistik juga
memiliki ekstensi untuk variabel dependen dengan lebih dari dua
kategori, misalnya regresi logistik multinomial (multi-kelas) dan
regresi logistik ordinal (bertingkat).
Ringkasan Perbandingan Ketiga Pendekatan
Tabel Kontingensi:
Bersifat deskriptif.
Menyajikan frekuensi gabungan dua atau lebih variabel kategorik.
Memungkinkan perhitungan ukuran asosiasi (misalnya odds ratio, chi-square).
Model Log-Linier:
Digunakan untuk memodelkan pola asosiasi dalam tabel kontingensi tanpa membedakan variabel dependen.
Semua variabel diperlakukan seimbang (simetris).
Cocok untuk memahami struktur hubungan (interaksi) antar variabel.
Regresi Logistik:
Memodelkan probabilitas suatu variabel kategori (umumnya biner) sebagai fungsi dari variabel prediktor.
Memiliki orientasi prediktif terhadap outcome.
Tersedia perluasan untuk outcome multi-kelas (multinomial) atau bertingkat (ordinal).
Walaupun ketiga metode ini sama-sama digunakan pada data kategorik, pendekatan dan interpretasinya berbeda: tabel kontingensi berfokus pada deskripsi frekuensi, model log-linier mengeksplorasi struktur asosiasi simetris, dan regresi logistik memprioritaskan prediksi probabilitas outcome. Dalam praktiknya, untuk memperoleh pemahaman yang komprehensif terhadap data kategorik, kombinasi ketiganya seringkali diterapkan bersamaan.
Contoh kasus ini diambil dari Thakur et al. (2019) yang menganalisis faktor risiko pada pasien penyakit kardiovaskularpdfs.semanticscholar.org. Mereka menyajikan data 2×2 untuk status hipertensi (HTN) versus kejadian gagal jantung (Heart Failure) seperti di Tabel 2 pada publikasi tersebutpdfs.semanticscholar.org. Misalnya, dari 104 pasien, 13 mengalami gagal jantung, dan di antara pasien tersebut 8 orang memiliki hipertensi. Tabel kontingensi dalam format R dapat dibuat sebagai berikut:
# Buat tabel kontingensi antara HTN dan Heart_Failure
cont_table <- matrix(c(8, 51,
5, 40),
nrow = 2, byrow = TRUE,
dimnames = list(HTN = c("Yes", "No"),
Heart_Failure = c("Yes", "No")))
cont_table
## Heart_Failure
## HTN Yes No
## Yes 8 51
## No 5 40
Tabel di atas menunjukkan bahwa dari 13 pasien dengan gagal jantung, 8 (61.5%) menderita hipertensi, sedangkan dari 91 pasien tanpa gagal jantung, 51 (56.0%) memiliki hipertensi. Dari tabel ini diperoleh odds ratio (OR) = (8/5)/(51/40) ≈ 1.25pdfs.semanticscholar.org. Nilai OR > 1 mengindikasikan bahwa hipertensi berasosiasi positif dengan kejadian gagal jantung – dengan kata lain, pasien hipertensi memiliki odds sekitar 25% lebih tinggi untuk mengalami gagal jantung dibanding yang tidak hipertensipdfs.semanticscholar.org.
Model log-linear digunakan untuk memodelkan jumlah kejadian pada setiap sel tabel kontingensi. Untuk tabel 2×2 dengan variabel kategorik A (misal HTN) dan B (misal Heart_Failure), model saturasi umumnya ditulis sebagai berikut:
\[ \log\bigl(\mu_{ij}\bigr) \;=\; \mu \;+\; \lambda^A_i \;+\; \lambda^B_j \;+\; \lambda^{AB}_{ij} \]
Di R, model log-linear dapat diestimasi menggunakan fungsi
loglm() dari paket MASS. Sebagai contoh,
model saturasi (dengan interaksi) untuk data di atas dapat di-fit dengan
kode:
library(MASS)
mod_sat <- loglm(~ HTN * Heart_Failure, data = cont_table)
mod_sat
## Call:
## loglm(formula = ~HTN * Heart_Failure, data = cont_table)
##
## Statistics:
## X^2 df P(> X^2)
## Likelihood Ratio 0 0 1
## Pearson 0 0 1
Model regresi logistik biner memodelkan hubungan antara prediktor dan peluang terjadinya outcome 0/1 melalui fungsi logit:
\[ \log\biggl(\frac{p}{1-p}\biggr) \;=\; \beta_0 \;+\; \beta_1\,x \]
di mana: - \(p = P(Y = 1)\) adalah probabilitas outcome berupa “Yes” (misalnya gagal jantung), - \(\beta_0\) adalah intercept, - \(\beta_1\) adalah koefisien regresi untuk variabel \(x\).
Contoh :
HTN_level <- c("Yes", "Yes", "No", "No")
HF_level <- c("Yes", "No", "Yes", "No")
Frekuensi <- c( 8, 51, 5, 40)
df_logistic <- data.frame(
HTN = factor(HTN_level, levels = c("Yes", "No")),
HF = factor(HF_level, levels = c("Yes", "No")),
Count = Frekuensi
)
df_logistic
model_logistik <- glm(
HF ~ HTN,
data = df_logistic,
weights = Count,
family = binomial(link = "logit")
)
# Lihat ringkasan hasil
summary(model_logistik)
##
## Call:
## glm(formula = HF ~ HTN, family = binomial(link = "logit"), data = df_logistic,
## weights = Count)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.8524 0.3803 4.871 1.11e-06 ***
## HTNNo 0.2271 0.6080 0.373 0.709
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 78.368 on 3 degrees of freedom
## Residual deviance: 78.227 on 2 degrees of freedom
## AIC: 82.227
##
## Number of Fisher Scoring iterations: 5
Model saturasi (fully saturated model) mencakup semua efek utama dan interaksi, sehingga:
Memotret data dengan sempurna (tidak ada deviance).
Tidak mengasumsikan independensi antar variabel.
Misalnya, untuk data kontingensi HTN vs. Heart_Failure (2×2) yang telah kita siapkan:
# 1. Muat paket MASS (mengandung fungsi loglm)
library(MASS)
# 2. Definisikan matriks frekuensi sesuai data sebelumnya:
# baris = HTN ("Yes", "No")
# kolom = Heart_Failure ("Yes", "No")
data_htn_hf <- matrix(
c( 8, 51, # HTN = Yes : HF=Yes=8, HF=No=51
5, 40), # HTN = No : HF=Yes=5, HF=No=40
nrow = 2,
byrow = TRUE,
dimnames = list(
HTN = c("Yes", "No"),
Heart_Failure = c("Yes", "No")
)
)
# Tampilkan tabel kontingensi
ftable(data_htn_hf)
## Heart_Failure Yes No
## HTN
## Yes 8 51
## No 5 40
Dalam model saturasi, fungsi log-linier ditulis sebagai berikut (semua parameter bebas):
\[ \log(\mu_{ij}) \;=\; \mu \;+\; \lambda^{A}_{i} \;+\; \lambda^{B}_{j} \;+\; \lambda^{AB}_{ij} \]
di mana:
- \(\mu\) adalah intercept umum,
- \(\lambda^{A}_{i}\) adalah efek margin untuk level-ke-\(i\) dari variabel A (contoh: HTN),
\(\lambda^{B}_{j}\) adalah efek margin untuk level-ke-\(j\) dari variabel B (contoh: Heart_Failure),
\(\lambda^{AB}_{ij}\) adalah parameter interaksi antara kedua variabel pada kombinasi level \((i, j)\).
Karena semua \(\lambda^{AB}_{ij}\) diperbolehkan berbeda, model saturasi ini mampu “menghapal” persis jumlah sel pada data.
# 3. Jalankan model log‐linier saturasi dengan loglm()
model_saturated <- loglm(
~ HTN * Heart_Failure,
data = data_htn_hf
)
# 4. Lihat ringkasan model
summary(model_saturated)
## Formula:
## ~HTN * Heart_Failure
## attr(,"variables")
## list(HTN, Heart_Failure)
## attr(,"factors")
## HTN Heart_Failure HTN:Heart_Failure
## HTN 1 0 1
## Heart_Failure 0 1 1
## attr(,"term.labels")
## [1] "HTN" "Heart_Failure" "HTN:Heart_Failure"
## 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
Dalam model independen mengasumsikan tidak ada interaksi antara variabel HTN dan Heart_Failure, sehingga hanya mencakup efek utama dari masing-masing variabel:
\[ \log(\mu_{ij}) \;=\; \mu \;+\; \lambda_{i}^{HTN} \;+\; \lambda_{j}^{HF} \]
di mana:
- \(\mu_{ij}\) adalah ekspektasi frekuensi pada sel (HTN level ke‑\(i\), HF level ke‑\(j\)),
- \(\mu\) adalah intercept umum,
- \(\lambda_{i}^{HTN}\) adalah efek margin untuk level ke‑\(i\) dari variabel HTN,
- \(\lambda_{j}^{HF}\) adalah efek margin untuk level ke‑\(j\) dari variabel Heart_Failure.
Model ini menguji hipotesis bahwa HTN dan Heart_Failure bersifat independen (tidak ada interaksi).
# Jalankan model log-linear independen (tanpa interaksi)
model_indep <- loglm(
~ HTN + Heart_Failure,
data = data_htn_hf
)
# Lihat ringkasan hasil
summary(model_indep)
## Formula:
## ~HTN + Heart_Failure
## attr(,"variables")
## list(HTN, Heart_Failure)
## attr(,"factors")
## HTN Heart_Failure
## HTN 1 0
## Heart_Failure 0 1
## attr(,"term.labels")
## [1] "HTN" "Heart_Failure"
## 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 0.1411657 1 0.7071248
## Pearson 0.1398978 1 0.7083827
Pada model independen, diasumsikan bahwa tidak ada interaksi antara variabel HTN dan Heart_Failure. Dengan demikian, hanya efek utama (marginal) dari masing-masing variabel yang dimasukkan ke dalam model:
\[ \log(\mu_{ij}) = \mu + \lambda_{i}^{HTN} + \lambda_{j}^{HF} \]
di mana:
- \(\mu_{ij}\) adalah ekspektasi frekuensi pada sel baris-ke-\(i\) (level HTN) dan kolom-ke-\(j\) (level Heart_Failure),
- \(\mu\) adalah intercept umum,
- \(\lambda_{i}^{HTN}\) adalah efek margin untuk level ke-\(i\) dari variabel HTN,
- \(\lambda_{j}^{HF}\) adalah efek margin untuk level ke-\(j\) dari variabel Heart_Failure.
Model ini menguji hipotesis nol bahwa HTN dan Heart_Failure bersifat independen (tidak ada asosiasi yang memerlukan parameter interaksi).
# Estimasi model log-linier independen (efek utama saja)
model_indep <- loglm(
~ HTN + Heart_Failure,
data = data_htn_hf
)
# Tampilkan ringkasan model
summary(model_indep)
## Formula:
## ~HTN + Heart_Failure
## attr(,"variables")
## list(HTN, Heart_Failure)
## attr(,"factors")
## HTN Heart_Failure
## HTN 1 0
## Heart_Failure 0 1
## attr(,"term.labels")
## [1] "HTN" "Heart_Failure"
## 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 0.1411657 1 0.7071248
## Pearson 0.1398978 1 0.7083827
Penjelasan singkat:
Formula ~ HTN + Heart_Failure
menandakan hanya efek utama dari HTN dan efek utama dari Heart_Failure
yang dimodelkan.
Jika deviance model independen (nilai G²) relatif besar, atau p‐value goodness‐of‐fit < 0.05, ini berarti asumsi independensi tidak sesuai dengan data artinya kemungkinan terdapat efek interaksi (asosiasi) antara HTN dan Heart_Failure.
Bandingkan nilai deviance model independen dengan deviance model saturasi untuk menguji signifikansi interaksi. Jika perbedaan deviance cukup besar (dengan derajat kebebasan 1), maka hipotesis independensi (tanpa interaksi) ditolak.
Dengan demikian, model independen memberikan kerangka untuk mengevaluasi apakah variabel HTN dan Heart_Failure dapat dianggap berdiri sendiri (tidak saling memengaruhi) dalam menjelaskan pola frekuensi pada tabel kontingensi.
Odds ratio untuk tabel 2×2:
\[ OR \;=\; \frac{n_{11}\,n_{22}}{n_{12}\,n_{21}} \]
Interpretasi nilai OR: - \(OR = 1\):
Tidak ada asosiasi
- \(OR > 1\): Asosiasi positif
- \(OR < 1\): Asosiasi negatif
Di dalam Model Saturated:
# Estimasi odds ratio dan log-odds menggunakan matriks data_htn_hf
logOR <- log((data_htn_hf[1, 1] * data_htn_hf[2, 2]) /
(data_htn_hf[1, 2] * data_htn_hf[2, 1]))
logOR
## [1] 0.2270575
Interpretasi:
Nilai log-odds ratio yang diperoleh adalah:
\[ \log OR \;=\; 0.2270575 \]
Untuk memahaminya, kita biasanya mengubah kembali ke odds ratio (OR) dengan eksponensial:
\[ OR \;=\; e^{0.2270575} \;\approx\; 1.254. \]
Artinya, odds (peluang) mengalami gagal jantung pada kelompok pasien yang memiliki hipertensi (HTN = “Yes”) sekitar 1,25 kali odds‐nya pasien yang tidak hipertensi (HTN = “No”). Karena \(OR > 1\), ini menunjukkan bahwa terdapat arah asosiasi positif: pasien hipertensi cenderung memiliki peluang lebih tinggi untuk mengalami gagal jantung dibandingkan pasien tanpa hipertensi. Namun, karena \(OR \approx 1{,}25\) nilainya relatif kecil, keterkaitan ini termasuk moderat (bukan sangat kuat).
Secara ringkas: - \(\log OR > 0\) menandakan asosiasi positif antara HTN dan gagal jantung. - \(\exp(0.227) \approx 1.25\) menunjukkan bahwa odds gagal jantung pada pasien hipertensi sekitar 25% lebih tinggi daripada pada pasien non‑hipertensi.
# Bandingkan model independen dengan model saturasi untuk menguji interaksi
anova(model_indep, model_saturated)
## LR tests for hierarchical log-linear models
##
## Model 1:
## ~HTN + Heart_Failure
## Model 2:
## ~HTN * Heart_Failure
##
## Deviance df Delta(Dev) Delta(df) P(> Delta(Dev)
## Model 1 0.1411657 1
## Model 2 0.0000000 0 0.1411657 1 0.70712
## Saturated 0.0000000 0 0.0000000 0 1.00000
Interpretasi:
Hasil perbandingan (likelihood‐ratio test) antara Model Independen
(~ HTN + Heart_Failure) dan Model Saturasi
(~ HTN * Heart_Failure) menunjukkan:
| Deviance | df | ΔDev | Δ(df) | P(> ΔDev) | |
|---|---|---|---|---|---|
| Model 1 | 0.1411657 | 1 | |||
| Model 2 | 0.0000000 | 0 | 0.1411657 | 1 | 0.70712 |
| Saturated | 0.0000000 | 0 | 0.0000000 | 0 | 1.00000 |
Karena p‑value (\(0.70712\)) jauh lebih besar dari 0.05, artinya penurunan deviance sebesar 0.141 yang diperoleh dengan menambahkan parameter interaksi tidaklah signifikan secara statistik. Dengan kata lain, menambahkan efek interaksi antara HTN dan Heart_Failure tidak memperbaiki kecocokan model secara bermakna.
Interpretasi singkat:
Jadi, data tidak menunjukkan bukti cukup kuat bahwa HTN dan gagal jantung saling berinteraksi. Dengan kata lain, pola frekuensi pada tabel 2×2 ini dapat dijelaskan secara memadai hanya oleh efek utama (independen) tanpa perlu memasukkan parameter interaksi.
Dengan hasil ini, kita menyimpulkan bahwa hubungan antara hipertensi (HTN) dan gagal jantung (Heart_Failure) dapat diasumsikan independen—artinya, tidak ada bukti statistik yang kuat bahwa variabel‐variabel tersebut berinteraksi (p ≈ 0.71).
Berikut penjelasan singkat mengenai lima jenis model log‐linier pada tabel kontingensi tiga variabel (A, B, C). Setiap model menekankan struktur interaksi yang berbeda.
Definisi: Model saturated (jenuh) memasukkan seluruh efek utama (main effects), seluruh interaksi dua‐arah, dan seluruh interaksi tiga‐arah.
Bentuk matematis:
\[ \ln(m_{ijk}) \;=\; \lambda \;+\; \lambda_{i}^{A} \;+\; \lambda_{j}^{B} \;+\; \lambda_{k}^{C} \;+\; \lambda_{ij}^{AB} \;+\; \lambda_{ik}^{AC} \;+\; \lambda_{jk}^{BC} \;+\; \lambda_{ijk}^{ABC}, \]
di mana \(m_{ijk} = E(n_{ijk})\) adalah harapan frekuensi pada sel \((i, j, k)\).
Karakteristik:
Definisi: Model homogen mengasumsikan bahwa proses asosiasi dua‐arah antara dua variabel tetap sama (homogen) di seluruh level variabel ketiga. Artinya, jika misalnya A dan B berinteraksi, kekuatan interaksi AB tidak berubah bergantung pada kategori C.
Bentuk umum (tiga variabel A, B, C):
\[ \ln(m_{ijk}) \;=\; \lambda \;+\; \lambda_{i}^{A} \;+\; \lambda_{j}^{B} \;+\; \lambda_{k}^{C} \;+\; \lambda_{ij}^{AB} \;+\; \lambda_{ik}^{AC} \;+\; \lambda_{jk}^{BC}, \]
tetapi dengan constraint tambahan bahwa parameter interaksi dua‐arah antara, misalnya, A dan B tidak bergantung pada \(k\):
\[ \lambda_{ij}^{AB \,\vert\, C=k} \;=\; \lambda_{ij}^{AB \,\vert\, C=k'}, \quad\forall\,k, k'. \]
Dalam praktiknya, hal ini setara dengan menghapus interaksi tiga‐arah \(\lambda_{ijk}^{ABC}\), tetapi juga menambahkan batasan bahwa interaksi dua‐arah di semua himpunan slice C sama.
Karakteristik:
Definisi: Model conditional independence menyatakan bahwa dua variabel, katakanlah A dan B, independen setelah mengondisikan pada level ketiga (C). Dengan kata lain,
\[ A \perp\!\!\!\perp B \;\big|\; C. \]
Bentuk matematis (tiga variabel):
\[ \ln(m_{ijk}) \;=\; \lambda \;+\; \lambda_{i}^{A} \;+\; \lambda_{j}^{B} \;+\; \lambda_{k}^{C} \;+\; \lambda_{ik}^{AC} \;+\; \lambda_{jk}^{BC}. \]
Keterangan: - Tidak ada \(\lambda_{ij}^{AB}\), sehingga tidak ada interaksi langsung A–B. - Interaksi A–C (\(\lambda_{ik}^{AC}\)) dan B–C (\(\lambda_{jk}^{BC}\)) tetap dipertahankan, karena A dan B boleh berasosiasi melalui C. - Secara implisit, interaksi tiga‐arah juga dihapus (\(\lambda_{ijk}^{ABC} = 0\)).
Karakteristik:
Definisi: Model joint independence menyatakan bahwa sepasang variabel (katakanlah A dan B) secara bersama‐sama (joint) independen dengan variabel ketiga (C). Dengan kata lain,
\[ (A, B) \;\perp\!\!\!\perp\; C, \]
atau secara simetris
\[ A \perp\!\!\!\perp (B, C) \quad\text{atau}\quad B \perp\!\!\!\perp (A, C), \]
tergantung hipotesis independensi mana yang dimaksud.
Bentuk matematis (contoh: \((A, B) \perp\!\!\!\perp C\)):
\[ \ln(m_{ijk}) \;=\; \lambda \;+\; \lambda_{i}^{A} \;+\; \lambda_{j}^{B} \;+\; \lambda_{k}^{C} \;+\; \lambda_{ij}^{AB}. \]
Keterangan: - Ada interaksi AB (\(\lambda_{ij}^{AB}\)), karena A dan B boleh
berasosiasi satu sama lain, tetapi - Tidak ada interaksi apa pun yang
melibatkan C (baik AC, BC, maupun ABC). Dengan kata lain,
\(\lambda_{ik}^{AC} = 0,\; \lambda_{jk}^{BC} =
0,\; \lambda_{ijk}^{ABC} = 0.\)
Karakteristik:
Definisi: Model tanpa interaksi (kadang disebut “complete independence”) menyatakan bahwa semua variabel saling independen tanpa interaksi apapun—baik dua‐arah maupun tiga‐arah. Dengan kata lain:
\[ A \perp\!\!\!\perp B, \quad A \perp\!\!\!\perp C, \quad B \perp\!\!\!\perp C. \]
Bentuk matematis:
\[ \ln(m_{ijk}) \;=\; \lambda \;+\; \lambda_{i}^{A} \;+\; \lambda_{j}^{B} \;+\; \lambda_{k}^{C}. \]
Keterangan: - Hanya memuat efek utama (main effects) \(\lambda_{i}^{A}, \lambda_{j}^{B}, \lambda_{k}^{C}\). - Tidak ada parameter interaksi \(\lambda_{ij}^{AB}, \lambda_{ik}^{AC}, \lambda_{jk}^{BC}\), maupun \(\lambda_{ijk}^{ABC}\).
Karakteristik:
| Nama Model | Efek Utama | Interaksi Dua‐Arah | Interaksi Tiga‐Arah | Catatan Singkat |
|---|---|---|---|---|
| Saturated | \(\lambda_{i}^{A}, \lambda_{j}^{B}, \lambda_{k}^{C}\) | \(\lambda_{ij}^{AB}, \lambda_{ik}^{AC}, \lambda_{jk}^{BC}\) | \(\lambda_{ijk}^{ABC}\) | Fit sempurna, setiap sel terprediksi tepat. |
| Homogen | Semua main effects | Semua \(\lambda_{ij}^{AB}, \lambda_{ik}^{AC}, \lambda_{jk}^{BC}\) (konstan sepanjang level variabel ketiga) | 0 | Asosiasi dua‐arah “sama” di semua level variabel ketiga. |
| Conditional | Semua main effects | \(\lambda_{ik}^{AC}, \lambda_{jk}^{BC}\) (A–B independen given C) | 0 | A–B hanya berasosiasi melalui C saja. |
| Joint Independence | Semua main effects | Hanya satu pasangan interaksi (misalnya \(\lambda_{ij}^{AB}\)) | 0 | Satu pasangan variabel bebas dari variabel ketiga sepenuhnya. |
| No‐Interaction | Semua main effects | 0 | 0 | Ketiga variabel benar‐benar independen. |
No‐Interaction (Complete Independence)
→ Jika hipotesis: “Tidak ada asosiasi sama sekali.”
Joint Independence
→ Jika hipotesis: satu pasang variabel (misalnya A dan B) boleh
berasosiasi, tetapi variabel C sepenuhnya independen dari
keduanya.
Conditional Independence
→ Jika hipotesis: A dan B tidak langsung berasosiasi, tetapi mungkin
“terkait” hanya melalui C.
Homogeneous Associations
→ Jika hipotesis: semua asosiasi dua‐arah (A–B, A–C, B–C) ada, tetapi
konsisten (homogen) untuk setiap level variabel
ketiga.
Saturated
→ Model paling kompleks; memasukkan semua interaksi
hingga tingkat tiga‐arah tanpa batasan apa pun.
Setelah menentukan hipotesis struktur interaksi, kita mengestimasi parameter masing-masing model (biasanya lewat IPF atau GLM Poisson) dan membandingkan kesesuaiannya dengan uji Likelihood‐Ratio (G²) atau Pearson X². Dengan demikian, kita dapat memilih model paling sederhana yang tetap menjelaskan pola frekuensi observasi dengan baik.
Dalam analisis model log‑linear tiga arah, kita melakukan pengujian interaksi untuk menentukan ada atau tidaknya interaksi antar variabel. Proses ini dilakukan secara berjenjang, dimulai dari interaksi tingkat tiga (paling tinggi) menuju interaksi tingkat dua (lebih rendah). Untuk model log‑linear dengan tiga peubah (X, Y, dan Z), langkah‑langkahnya adalah sebagai berikut:
Pengujian Interaksi Tiga Arah (XYZ):
Pengujian Interaksi Dua Arah (XY, XZ, YZ):
Setiap tahap pengujian bertujuan untuk mengevaluasi kecocokan model sekaligus menentukan struktur interaksi yang paling sesuai dengan data yang diamati.
Sebagai contoh, kita gunakan dataset https://datavis.ca/papers/sugi/sugi17.pdf yang memuat
pengamatan 592 mahasiswa statistik (Universitas Delaware) dengan tiga
variabel kategorikal: warna rambut (Black, Brown, Red, Blond), warna
mata (Brown, Blue, Hazel, Green), dan jenis kelamin (Male, Female). Data
ini tersaji sebagai tabel kontingensi \(4
\times 4 \times 2\) (3 variabel) dengan frekuensi pada tiap
kombinasi (misalnya ada 32 mahasiswa berjenis kelamin Male, bermata
Brown, dan berambut Black). Dalam analisis log‐linier tiga arah, kita
membandingkan beberapa model: model saturated (memuat
semua interaksi hingga tingkat tiga), model independensi
penuh (mutual independence), model independensi
bersama (joint independence), dan model independensi
bersyarat. Pada contoh Hair × Eye × Sex ini, hasil fitting
dengan loglm() menunjukkan misalnya:
Model independensi penuh (tidak ada asosiasi antar ketiganya) menghasilkan deviance (\(X^2\)) = 166.30 dengan df = 24 (p < 0.001), artinya tidak cocok dengan data.
Model independensi bersama ([Hair Eye] [Sex]) (Hair
berasosiasi dengan Eye, namun keduanya independen terhadap Sex) memberi
\[
X^2 = 19.86,\quad \text{df} = 15,\quad p \approx 0.178,
\]
artinya fit (tidak ditolak). Ini menunjukkan ada asosiasi signifikan antara warna rambut dan warna mata, sedangkan jenis kelamin tidak terlibat (hubungan Hair–Eye konsisten untuk kedua jenis kelamin).
Model bersyarat lain, misalnya conditional independence
([Hair Sex] [Eye] atau [Eye Sex] [Hair]),
Contohnya, model ~ (Hair + Eye) * Sex menghasilkan \[
X^2 = 156.68,\quad \text{df} = 18,\quad p \approx 0,
\] sehingga gagal fit.
Model saturated tentu selalu fit dengan \[ X^2 = 0,\quad \text{df} = 0. \]
Hasil ini sesuai literatur bahwa warna rambut dan mata memang saling berasosiasi, sedangkan jenis kelamin bebas dalam konteks ini (pola rambut/mata serupa untuk Male dan Female).
Input Data
library("epitools")
library("DescTools")
library("lawstat")
## Warning: package 'lawstat' was built under R version 4.4.3
# Contoh representasi data Hair×Eye×Sex dalam R
# Input data sesuai tabel HairEyeColor (Warna Rambut × Warna Mata × Jenis Kelamin)
x.sex <- factor(rep(c("Male", "Female"), each = 16))
y.eye <- factor(rep(c("Brown", "Blue", "Hazel", "Green"), each = 4, times = 2))
z.hair <- factor(rep(c("Black", "Brown", "Red", "Blond"), times = 8))
counts <- c(
# Male × (Eye = Brown, Blue, Hazel, Green) × Hair = (Black, Brown, Red, Blond)
32, 53, 10, 3, 11, 50, 10, 30, 10, 25, 7, 5, 3, 15, 7, 8,
# Female × (Eye = Brown, Blue, Hazel, Green) × Hair = (Black, Brown, Red, Blond)
36, 66, 16, 4, 9, 34, 7, 64, 5, 29, 7, 5, 2, 14, 7, 8
)
data <- data.frame(
Jenis_Kelamin = x.sex,
Warna_Mata = y.eye,
Warna_Rambut = z.hair,
Frekuensi = counts
)
data
Interpretasi:
x.sex: faktor untuk variabel
Jenis_Kelamin, diulang 16 kali pertama untuk “Male”
kemudian 16 kali untuk “Female” (karena ada 4 warna mata × 4 warna
rambut per masing-masing jenis kelamin).
y.eye: faktor untuk variabel
Warna_Mata, mengulang setiap warna mata sebanyak 4
(sesuai jumlah kategori rambut), lalu pengulangan pola tersebut sebanyak
2 kali (untuk “Male” dan “Female”).
z.hair: faktor untuk variabel
Warna_Rambut, mengulang urutan
("Black","Brown","Red","Blond") sebanyak 8 kali (4 warna
mata × 2 jenis kelamin → 8 kelompok).
counts: vektor panjang 32 yang
memuat frekuensi sesuai tabel kontingensi HairEyeColor
bawaan R, diurutkan mengikuti pola
(JenisKelamin, WarnaMata, WarnaRambut) di mana
WarnaRambut bervariasi paling cepat, kemudian
WarnaMata, lalu JenisKelamin.
Tabel kontingensi 3 arah:
# Membentuk Tabel Kontingensi 3 Arah untuk data HairEyeColor
table3d <- xtabs(Frekuensi ~ Jenis_Kelamin + Warna_Mata + Warna_Rambut,
data = data)
ftable(table3d)
## Warna_Rambut Black Blond Brown Red
## Jenis_Kelamin Warna_Mata
## Female Blue 9 64 34 7
## Brown 36 4 66 16
## Green 2 8 14 7
## Hazel 5 5 29 7
## Male Blue 11 30 50 10
## Brown 32 3 53 10
## Green 3 8 15 7
## Hazel 10 5 25 7
Kesimpulan:
Perbedaan Pola Warna Rambut–Mata antara Jenis Kelamin
Secara umum, baik pada Female maupun Male, pola asosiasi warna rambut dan mata terlihat serupa (misalnya: mata biru banyak dipasangkan dengan rambut pirang atau cokelat, mata cokelat banyak dipasangkan dengan rambut cokelat, dan sebagainya).
Tidak tampak perbedaan mencolok antara laki‐laki dan perempuan dalam pola asosiasi utama—ini konsisten dengan temuan bahwa jenis kelamin tidak terlalu memengaruhi korelasi antara warna rambut dan mata.
Asosiasi Warna Mata–Rambut pada Female
Blue (Mata Biru): Terbanyak berambut Blond (64), kemudian Brown (34), Black (9), dan sedikit Red (7).
Brown (Mata Cokelat): Paling banyak berambut Brown (66), diikuti Red (16), Black (36), dan sangat sedikit Blond (4).
Green (Mata Hijau): Cenderung kombinasi rambut Brown (14) dan Blond (8), sedikit rambut Black (2) dan Red (7).
Hazel (Mata Hazel): Paling umum berambut Brown (29), lalu Black (5), Blond (5), dan Red (7).
- **Blue (Mata Biru):** Paling sering berambut Brown (50), diikuti Blond (30), Black (11), dan Red (10).
- **Brown (Mata Cokelat):** Terbanyak berambut Brown (53), kemudian Black (32), Red (10), dan sedikit Blond (3).
- **Green (Mata Hijau):** Didominasi Brown (15) dan Blond (8), sisanya Black (3) dan Red (7).
- **Hazel (Mata Hazel):** Terbanyak Brown (25), diikuti Black (10), Blond (5), dan Red (7).
Inti Kesimpulan:
Terdapat asosiasi kuat antara warna rambut cokelat (Brown) dan mata cokelat (Brown), serta antara rambut pirang (Blond) dan mata biru (Blue).
Rambut Red relatif jarang muncul di mana‐mana, tetapi mobilitas distribusinya cukup merata di semua kombinasi mata.
Pola asosiasi tersebut muncul hampir sama pada Female dan Male, yang menunjukkan tidak ada interaksi tiga‐arah yang signifikan (yakni, jenis kelamin tidak secara khusus mengubah pola hubungan antara warna mata dan warna rambut).
Model Saturated
\[ \ln(m_{ijk}) \;=\; \lambda \;+\; \lambda_{i}^{A} \;+\; \lambda_{j}^{B} \;+\; \lambda_{k}^{C} \;+\; \lambda_{ij}^{AB} \;+\; \lambda_{ik}^{AC} \;+\; \lambda_{jk}^{BC} \;+\; \lambda_{ijk}^{ABC} \]
Model Homogeneous Associations
\[ \ln(m_{ijk}) \;=\; \lambda \;+\; \lambda_{i}^{A} \;+\; \lambda_{j}^{B} \;+\; \lambda_{k}^{C} \;+\; \lambda_{ij}^{AB} \;+\; \lambda_{ik}^{AC} \;+\; \lambda_{jk}^{BC} \]
Hipotesis Uji
Statistik Uji
Interpretasi Singkat
# 1. Tentukan kategori referensi
data$Jenis_Kelamin <- relevel(data$Jenis_Kelamin, ref = "Female")
data$Warna_Mata <- relevel(data$Warna_Mata, ref = "Brown")
data$Warna_Rambut <- relevel(data$Warna_Rambut, ref = "Black")
# 2. Model Saturated (memuat semua interaksi hingga tiga arah)
model_saturated <- glm(
Frekuensi ~ Jenis_Kelamin
+ Warna_Mata
+ Warna_Rambut
+ Jenis_Kelamin:Warna_Mata
+ Jenis_Kelamin:Warna_Rambut
+ Warna_Mata:Warna_Rambut
+ Jenis_Kelamin:Warna_Mata:Warna_Rambut,
family = poisson(link = "log"),
data = data
)
# 3. Ringkasan hasil
summary(model_saturated)
##
## Call:
## glm(formula = Frekuensi ~ Jenis_Kelamin + Warna_Mata + Warna_Rambut +
## Jenis_Kelamin:Warna_Mata + Jenis_Kelamin:Warna_Rambut + Warna_Mata:Warna_Rambut +
## Jenis_Kelamin:Warna_Mata:Warna_Rambut, family = poisson(link = "log"),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value
## (Intercept) 3.58352 0.16667 21.501
## Jenis_KelaminMale -0.11778 0.24296 -0.485
## Warna_MataBlue -1.38629 0.37268 -3.720
## Warna_MataGreen -2.89037 0.72648 -3.979
## Warna_MataHazel -1.97408 0.47726 -4.136
## Warna_RambutBlond -2.19722 0.52705 -4.169
## Warna_RambutBrown 0.60614 0.20719 2.925
## Warna_RambutRed -0.81093 0.30046 -2.699
## Jenis_KelaminMale:Warna_MataBlue 0.31845 0.51093 0.623
## Jenis_KelaminMale:Warna_MataGreen 0.52325 0.94465 0.554
## Jenis_KelaminMale:Warna_MataHazel 0.81093 0.59919 1.353
## Jenis_KelaminMale:Warna_RambutBlond -0.16990 0.80147 -0.212
## Jenis_KelaminMale:Warna_RambutBrown -0.10158 0.30504 -0.333
## Jenis_KelaminMale:Warna_RambutRed -0.35222 0.47067 -0.748
## Warna_MataBlue:Warna_RambutBlond 4.15888 0.63601 6.539
## Warna_MataGreen:Warna_RambutBlond 3.58352 0.95015 3.772
## Warna_MataHazel:Warna_RambutBlond 2.19722 0.82327 2.669
## Warna_MataBlue:Warna_RambutBrown 0.72300 0.42831 1.688
## Warna_MataGreen:Warna_RambutBrown 1.33977 0.78381 1.709
## Warna_MataHazel:Warna_RambutBrown 1.15172 0.52670 2.187
## Warna_MataBlue:Warna_RambutRed 0.55962 0.58672 0.954
## Warna_MataGreen:Warna_RambutRed 2.06369 0.85623 2.410
## Warna_MataHazel:Warna_RambutRed 1.14740 0.65813 1.743
## Jenis_KelaminMale:Warna_MataBlue:Warna_RambutBlond -0.78846 0.94517 -0.834
## Jenis_KelaminMale:Warna_MataGreen:Warna_RambutBlond -0.23557 1.31366 -0.179
## Jenis_KelaminMale:Warna_MataHazel:Warna_RambutBlond -0.52325 1.15860 -0.452
## Jenis_KelaminMale:Warna_MataBlue:Warna_RambutBrown 0.28657 0.58692 0.488
## Jenis_KelaminMale:Warna_MataGreen:Warna_RambutBrown -0.23489 1.03173 -0.228
## Jenis_KelaminMale:Warna_MataHazel:Warna_RambutBrown -0.73999 0.68376 -1.082
## Jenis_KelaminMale:Warna_MataBlue:Warna_RambutRed 0.50822 0.81634 0.623
## Jenis_KelaminMale:Warna_MataGreen:Warna_RambutRed -0.05324 1.15783 -0.046
## Jenis_KelaminMale:Warna_MataHazel:Warna_RambutRed -0.34093 0.89847 -0.379
## Pr(>|z|)
## (Intercept) < 2e-16 ***
## Jenis_KelaminMale 0.627825
## Warna_MataBlue 0.000199 ***
## Warna_MataGreen 6.93e-05 ***
## Warna_MataHazel 3.53e-05 ***
## Warna_RambutBlond 3.06e-05 ***
## Warna_RambutBrown 0.003440 **
## Warna_RambutRed 0.006956 **
## Jenis_KelaminMale:Warna_MataBlue 0.533098
## Jenis_KelaminMale:Warna_MataGreen 0.579642
## Jenis_KelaminMale:Warna_MataHazel 0.175935
## Jenis_KelaminMale:Warna_RambutBlond 0.832120
## Jenis_KelaminMale:Warna_RambutBrown 0.739128
## Jenis_KelaminMale:Warna_RambutRed 0.454253
## Warna_MataBlue:Warna_RambutBlond 6.19e-11 ***
## Warna_MataGreen:Warna_RambutBlond 0.000162 ***
## Warna_MataHazel:Warna_RambutBlond 0.007610 **
## Warna_MataBlue:Warna_RambutBrown 0.091408 .
## Warna_MataGreen:Warna_RambutBrown 0.087393 .
## Warna_MataHazel:Warna_RambutBrown 0.028766 *
## Warna_MataBlue:Warna_RambutRed 0.340187
## Warna_MataGreen:Warna_RambutRed 0.015944 *
## Warna_MataHazel:Warna_RambutRed 0.081259 .
## Jenis_KelaminMale:Warna_MataBlue:Warna_RambutBlond 0.404169
## Jenis_KelaminMale:Warna_MataGreen:Warna_RambutBlond 0.857686
## Jenis_KelaminMale:Warna_MataHazel:Warna_RambutBlond 0.651543
## Jenis_KelaminMale:Warna_MataBlue:Warna_RambutBrown 0.625365
## Jenis_KelaminMale:Warna_MataGreen:Warna_RambutBrown 0.819905
## Jenis_KelaminMale:Warna_MataHazel:Warna_RambutBrown 0.279150
## Jenis_KelaminMale:Warna_MataBlue:Warna_RambutRed 0.533569
## Jenis_KelaminMale:Warna_MataGreen:Warna_RambutRed 0.963321
## Jenis_KelaminMale:Warna_MataHazel:Warna_RambutRed 0.704351
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 4.7512e+02 on 31 degrees of freedom
## Residual deviance: 6.3949e-14 on 0 degrees of freedom
## AIC: 202.88
##
## Number of Fisher Scoring iterations: 3
Interpretasi dan Kesimpulan:
1. Goodness of Fit
2. Efek Utama (Main Effects)
Jenis_KelaminMale (Estimate = –0.118, p =
0.628)
→ Tidak signifikan: frekuensi untuk laki‑laki tidak
berbeda bermakna dari perempuan (p > 0.05).
Warna_Mata
Warna_Rambut
3. Interaksi Dua‑Arah Sex × (Eye / Hair)
Jenis_KelaminMale:Warna_MataBlue (p = 0.533)Jenis_KelaminMale:Warna_RambutBrown (p = 0.739)4. Interaksi Dua‑Arah Warna_Mata × Warna_Rambut
Beberapa pasangan menunjukkan signifikan (p < 0.05):
→ Kombinasi khusus (misalnya mata Blue dengan rambut Blond) jauh lebih sering terjadi ketimbang yang diprediksi oleh efek utama saja, mempertegas asosiasi kuat antara warna mata dan rambut.
Interaksi lain (Blue:Brown, Green:Brown, dll.) hanya marginally significant (0.05 < p < 0.1) atau tidak signifikan.
5. Interaksi Tiga‑Arah (Sex × Eye × Hair)
Kesimpulan Utama
Dengan demikian, model yang lebih sederhana—misalnya model homogeneous associations (semua interaksi dua‑arah, tanpa tiga‑arah) atau model joint independence \((Hair, Eye)\perp Sex\)—mungkin sudah cukup menjelaskan data.
exp(model_saturated$coefficients)
## (Intercept)
## 36.00000000
## Jenis_KelaminMale
## 0.88888889
## Warna_MataBlue
## 0.25000000
## Warna_MataGreen
## 0.05555556
## Warna_MataHazel
## 0.13888889
## Warna_RambutBlond
## 0.11111111
## Warna_RambutBrown
## 1.83333333
## Warna_RambutRed
## 0.44444444
## Jenis_KelaminMale:Warna_MataBlue
## 1.37500000
## Jenis_KelaminMale:Warna_MataGreen
## 1.68750000
## Jenis_KelaminMale:Warna_MataHazel
## 2.25000000
## Jenis_KelaminMale:Warna_RambutBlond
## 0.84375000
## Jenis_KelaminMale:Warna_RambutBrown
## 0.90340909
## Jenis_KelaminMale:Warna_RambutRed
## 0.70312500
## Warna_MataBlue:Warna_RambutBlond
## 64.00000000
## Warna_MataGreen:Warna_RambutBlond
## 36.00000000
## Warna_MataHazel:Warna_RambutBlond
## 9.00000000
## Warna_MataBlue:Warna_RambutBrown
## 2.06060606
## Warna_MataGreen:Warna_RambutBrown
## 3.81818182
## Warna_MataHazel:Warna_RambutBrown
## 3.16363636
## Warna_MataBlue:Warna_RambutRed
## 1.75000000
## Warna_MataGreen:Warna_RambutRed
## 7.87500000
## Warna_MataHazel:Warna_RambutRed
## 3.15000000
## Jenis_KelaminMale:Warna_MataBlue:Warna_RambutBlond
## 0.45454545
## Jenis_KelaminMale:Warna_MataGreen:Warna_RambutBlond
## 0.79012346
## Jenis_KelaminMale:Warna_MataHazel:Warna_RambutBlond
## 0.59259259
## Jenis_KelaminMale:Warna_MataBlue:Warna_RambutBrown
## 1.33185350
## Jenis_KelaminMale:Warna_MataGreen:Warna_RambutBrown
## 0.79065588
## Jenis_KelaminMale:Warna_MataHazel:Warna_RambutBrown
## 0.47711993
## Jenis_KelaminMale:Warna_MataBlue:Warna_RambutRed
## 1.66233766
## Jenis_KelaminMale:Warna_MataGreen:Warna_RambutRed
## 0.94814815
## Jenis_KelaminMale:Warna_MataHazel:Warna_RambutRed
## 0.71111111
Interpretasi:
Berikut poin‑poin singkat dari hasil \(\exp(\beta)\) pada model saturated:
Intercept: \(\exp(\beta_0) = 36\)
Ekspektasi frekuensi untuk kategori referensi (Female + Brown eye +
Black hair) adalah 36.
Efek Utama
Interaksi Dua‑Arah (Hair×Eye)
Interaksi Dua‑Arah (Sex×Eye / Sex×Hair)
Interaksi Tiga‑Arah
Semua \(\exp(\lambda_{ijk}^{ABC})\)
berada dekat 1 (0.45–1.66).
Artinya, setelah memperhitungkan main effects dan semua interaksi
dua‑arah, tidak ada efek tiga‑arah besar—pola Hair×Eye relatif konsisten
di kedua jenis kelamin.
Ringkasan: Model saturated menegaskan bahwa asosiasi utama adalah antara warna rambut dan warna mata (khususnya Blond–Blue/Green sangat dominan), efek jenis kelamin lebih kecil, dan tidak ada interaksi tiga‑arah yang substantif.
# Homogeneous Model (semua interaksi dua-arah, tanpa tiga-arah)
model_homogeneous <- glm(
Frekuensi ~ Jenis_Kelamin
+ Warna_Mata
+ Warna_Rambut
+ Jenis_Kelamin:Warna_Mata
+ Jenis_Kelamin:Warna_Rambut
+ Warna_Mata:Warna_Rambut,
family = poisson(link = "log"),
data = data
)
# Ringkasan hasil
summary(model_homogeneous)
##
## Call:
## glm(formula = Frekuensi ~ Jenis_Kelamin + Warna_Mata + Warna_Rambut +
## Jenis_Kelamin:Warna_Mata + Jenis_Kelamin:Warna_Rambut + Warna_Mata:Warna_Rambut,
## family = poisson(link = "log"), data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.56126 0.15652 22.753 < 2e-16 ***
## Jenis_KelaminMale -0.07106 0.20519 -0.346 0.729096
## Warna_MataBlue -1.45036 0.28275 -5.130 2.90e-07 ***
## Warna_MataGreen -2.87747 0.49572 -5.805 6.45e-09 ***
## Warna_MataHazel -1.68097 0.31706 -5.302 1.15e-07 ***
## Warna_RambutBlond -1.93718 0.41169 -4.705 2.53e-06 ***
## Warna_RambutBrown 0.63562 0.18658 3.407 0.000658 ***
## Warna_RambutRed -0.83733 0.26847 -3.119 0.001815 **
## Jenis_KelaminMale:Warna_MataBlue 0.42354 0.21763 1.946 0.051640 .
## Jenis_KelaminMale:Warna_MataGreen 0.49207 0.29661 1.659 0.097125 .
## Jenis_KelaminMale:Warna_MataHazel 0.32429 0.25192 1.287 0.197987
## Jenis_KelaminMale:Warna_RambutBlond -0.89744 0.29703 -3.021 0.002517 **
## Jenis_KelaminMale:Warna_RambutBrown -0.16460 0.23087 -0.713 0.475881
## Jenis_KelaminMale:Warna_RambutRed -0.27704 0.31302 -0.885 0.376119
## Warna_MataBlue:Warna_RambutBlond 3.91224 0.47155 8.296 < 2e-16 ***
## Warna_MataGreen:Warna_RambutBlond 3.54294 0.65296 5.426 5.76e-08 ***
## Warna_MataHazel:Warna_RambutBlond 1.93743 0.57269 3.383 0.000717 ***
## Warna_MataBlue:Warna_RambutBrown 0.89281 0.29283 3.049 0.002297 **
## Warna_MataGreen:Warna_RambutBrown 1.21834 0.50854 2.396 0.016586 *
## Warna_MataHazel:Warna_RambutBrown 0.73463 0.32984 2.227 0.025932 *
## Warna_MataBlue:Warna_RambutRed 0.82807 0.40424 2.048 0.040513 *
## Warna_MataGreen:Warna_RambutRed 2.02488 0.57160 3.542 0.000396 ***
## Warna_MataHazel:Warna_RambutRed 0.91478 0.43851 2.086 0.036967 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 475.1180 on 31 degrees of freedom
## Residual deviance: 6.7613 on 9 degrees of freedom
## AIC: 191.64
##
## Number of Fisher Scoring iterations: 4
Langkah‑Langkah Pengujian
1. Hipotesis
\(H_{0}: \lambda_{ijk}^{ABC} =
0\)
(tidak ada interaksi tiga‑arah; model homogeneous sudah
memadai)
\(H_{1}: \lambda_{ijk}^{ABC} \neq
0\)
(ada interaksi tiga‑arah; butuh model
saturated)
2. Hitung Deviance Antar Model
Deviance.model <- model_homogeneous$deviance - model_saturated$deviance
Deviance.model
## [1] 6.76125
3. Hitung Selisih Derajat Bebas
df.model <- model_homogeneous$df.residual - model_saturated$df.residual
df.model
## [1] 9
4. Chi-Square Tabel (α = 0.05)
chi.table <- qchisq(0.95, df = df.model)
chi.table
## [1] 16.91898
5. Keputusan Uji
Keputusan <- ifelse(Deviance.model <= chi.table,
"Terima H0: tidak ada interaksi tiga-arah",
"Tolak H0: ada interaksi tiga-arah")
Keputusan
## [1] "Terima H0: tidak ada interaksi tiga-arah"
Interpretasi :
Karena
\[
\text{Deviance(model)} \approx 9 \;<\; \chi^{2}_{0.05,2} \approx
16.91,
\]
maka gagal tolak \(H_{0}\).
Artinya: pola asosiasi Warna_Mata–Warna_Rambut tidak berubah bergantung
pada Jenis_Kelamin (tidak perlu term tiga‑arah).
Pada model conditional pada X, kita memasukkan efek utama ketiga variabel serta interaksi dua‑arah antara X–Y dan X–Z, tetapi tidak menyertakan interaksi Y–Z maupun interaksi tiga‑arah:
\[ \log(\mu_{ijk}) \;=\; \lambda \;+\; \lambda_{i}^{X} \;+\; \lambda_{j}^{Y} \;+\; \lambda_{k}^{Z} \;+\; \lambda_{ij}^{XY} \;+\; \lambda_{ik}^{XZ} \]
di mana: - \(\lambda\) adalah intercept umum, - \(\lambda_{i}^{X}, \lambda_{j}^{Y}, \lambda_{k}^{Z}\) adalah efek utama variabel \(X, Y, Z\), - \(\lambda_{ij}^{XY}\) adalah parameter interaksi dua‑arah antara \(X\) dan \(Y\), - \(\lambda_{ik}^{XZ}\) adalah parameter interaksi dua‑arah antara \(X\) dan \(Z\).
# Conditional Association on Jenis_Kelamin (A ⫫ B | Jenis_Kelamin)
# Model mengasumsikan Warna_Mata dan Warna_Rambut independen setelah dikondisikan Jenis_Kelamin
model_conditional_on_sex <- glm(
Frekuensi ~ Jenis_Kelamin
+ Warna_Mata
+ Warna_Rambut
+ Jenis_Kelamin:Warna_Mata
+ Jenis_Kelamin:Warna_Rambut,
family = poisson(link = "log"),
data = data
)
summary(model_conditional_on_sex)
##
## Call:
## glm(formula = Frekuensi ~ Jenis_Kelamin + Warna_Mata + Warna_Rambut +
## Jenis_Kelamin:Warna_Mata + Jenis_Kelamin:Warna_Rambut, family = poisson(link = "log"),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.00906 0.15567 19.330 < 2e-16 ***
## Jenis_KelaminMale -0.02995 0.22070 -0.136 0.8920
## Warna_MataBlue -0.06782 0.13026 -0.521 0.6026
## Warna_MataGreen -1.37003 0.20113 -6.812 9.65e-12 ***
## Warna_MataHazel -0.97538 0.17302 -5.637 1.73e-08 ***
## Warna_RambutBlond 0.44321 0.17770 2.494 0.0126 *
## Warna_RambutBrown 1.01160 0.16194 6.247 4.19e-10 ***
## Warna_RambutRed -0.34033 0.21508 -1.582 0.1136
## Jenis_KelaminMale:Warna_MataBlue 0.09798 0.19254 0.509 0.6109
## Jenis_KelaminMale:Warna_MataGreen 0.28157 0.28454 0.990 0.3224
## Jenis_KelaminMale:Warna_MataHazel 0.24056 0.24782 0.971 0.3317
## Jenis_KelaminMale:Warna_RambutBlond -0.63992 0.26678 -2.399 0.0165 *
## Jenis_KelaminMale:Warna_RambutBrown -0.07411 0.22600 -0.328 0.7430
## Jenis_KelaminMale:Warna_RambutRed -0.15867 0.30582 -0.519 0.6039
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 475.12 on 31 degrees of freedom
## Residual deviance: 156.68 on 18 degrees of freedom
## AIC: 323.56
##
## Number of Fisher Scoring iterations: 5
1 Hipotesis
\(H_{0}\colon \lambda_{jk}^{YZ} =
0\)
(tidak ada interaksi Y–Z; model conditional on Jenis_Kelamin sudah
cukup)
\(H_{1}\colon \lambda_{jk}^{YZ} \neq
0\)
(ada interaksi Y–Z; perlu model homogeneous)
2 Tingkat Signifikan
alpha <- 0.05
3 Statistik Uji
# ΔDeviance = deviance(model_conditional_on_sex) – deviance(model_homogeneous)
deltaDev <- model_conditional_on_sex$deviance - model_homogeneous$deviance
deltaDev
## [1] 149.9166
# Derajat bebas: selisih df.residual
dfDev <- model_conditional_on_sex$df.residual - model_homogeneous$df.residual
dfDev
## [1] 9
4 Daerah Penolakan
chiCrit <- qchisq(1 - alpha, df = dfDev)
chiCrit
## [1] 16.91898
5 Keputusan
keputusanYZ <- ifelse(deltaDev > chiCrit,
"Tolak H0: ada interaksi Warna_Mata–Warna_Rambut",
"Terima H0: tidak ada interaksi Warna_Mata–Warna_Rambut")
keputusanYZ
## [1] "Tolak H0: ada interaksi Warna_Mata–Warna_Rambut"
Kesimpulan:
Karena
\[
\Delta\text{Deviance} \approx 149.91 \;>\; \chi^{2}_{0.05,2} \approx
16.91,
\]
maka tolak \(H_{0}\).
Artinya pola asosiasi Warna_Mata–Warna_Rambut adalah berbeda di setiap
level Jenis_Kelamin, sehingga model tanpa parameter \(\lambda_{jk}^{YZ}\) belum memadai.
Langkah-langkah uji hipotesis menggunakan residual deviance:
1. Hitung selisih deviance antar model
Deviance.model_YZ <- model_conditional_on_sex$deviance - model_homogeneous$deviance
Deviance.model_YZ
## [1] 149.9166
2. Hitung selisih derajat bebas
df_YZ <- model_conditional_on_sex$df.residual - model_homogeneous$df.residual
df_YZ
## [1] 9
3. Tentukan nilai kritis χ² untuk α = 0.05
chi_crit_YZ <- qchisq(0.95, df = df_YZ)
chi_crit_YZ
## [1] 16.91898
4. Keputusan uji
Keputusan_YZ <- ifelse(Deviance.model_YZ <= chi_crit_YZ,
"Terima H0: tidak ada interaksi Warna_Mata–Warna_Rambut",
"Tolak H0: ada interaksi Warna_Mata–Warna_Rambut")
Keputusan_YZ
## [1] "Tolak H0: ada interaksi Warna_Mata–Warna_Rambut"
Interpretasi :
Hipotesis
Statistik uji:
\[
\Delta\text{Deviance} = 149.91,\quad
\] Nilai kritis \(\chi^{2}_{0.05,2} =
16.91\).
Keputusan:
Karena \(149.9166 > 16.91\), tolak
\(H_{0}\).
Kesimpulan:
Pada taraf nyata 5%, pola asosiasi antara Warna_Mata dan Warna_Rambut
adalah tidak sama (tidak homogen) di tiap level Jenis_Kelamin, sehingga
interaksi Y×Z diperlukan.
Pada model conditional pada variabel Y, kita menyertakan efek utama untuk X, Y, dan Z, serta interaksi dua‑arah antara Y–X dan Y–Z, tetapi tidak memasukkan interaksi antara X dan Z maupun interaksi tiga‑arah:
\[ \log(\mu_{ijk}) \;=\; \lambda \;+\; \lambda_{i}^{X} \;+\; \lambda_{j}^{Y} \;+\; \lambda_{k}^{Z} \;+\; \lambda_{ij}^{XY} \;+\; \lambda_{jk}^{YZ} \]
di mana: - \(\lambda\) adalah intercept umum, - \(\lambda_{i}^{X}, \lambda_{j}^{Y}, \lambda_{k}^{Z}\) adalah efek utama variabel \(X, Y, Z\), - \(\lambda_{ij}^{XY}\) adalah interaksi dua‑arah antara \(X\) dan \(Y\), - \(\lambda_{jk}^{YZ}\) adalah interaksi dua‑arah antara \(Y\) dan \(Z\).
# Conditional Association on Warna_Mata (Y)
# Model mengasumsikan Jenis_Kelamin dan Warna_Rambut independen setelah dikondisikan Warna_Mata
model_conditional_on_eye <- glm(
Frekuensi ~ Jenis_Kelamin
+ Warna_Mata
+ Warna_Rambut
+ Jenis_Kelamin:Warna_Mata
+ Warna_Mata:Warna_Rambut,
family = poisson(link = "log"),
data = data
)
# Ringkasan hasil
summary(model_conditional_on_eye)
##
## Call:
## glm(formula = Frekuensi ~ Jenis_Kelamin + Warna_Mata + Warna_Rambut +
## Jenis_Kelamin:Warna_Mata + Warna_Mata:Warna_Rambut, family = poisson(link = "log"),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.62990 0.13549 26.791 < 2e-16 ***
## Jenis_KelaminMale -0.21905 0.13565 -1.615 0.106343
## Warna_MataBlue -1.26861 0.26922 -4.712 2.45e-06 ***
## Warna_MataGreen -2.74536 0.48476 -5.663 1.48e-08 ***
## Warna_MataHazel -1.62581 0.30986 -5.247 1.55e-07 ***
## Warna_RambutBlond -2.27360 0.39694 -5.728 1.02e-08 ***
## Warna_RambutBrown 0.55962 0.15202 3.681 0.000232 ***
## Warna_RambutRed -0.96141 0.23058 -4.170 3.05e-05 ***
## Jenis_KelaminMale:Warna_MataBlue 0.09798 0.19255 0.509 0.610861
## Jenis_KelaminMale:Warna_MataGreen 0.28157 0.28454 0.990 0.322378
## Jenis_KelaminMale:Warna_MataHazel 0.24056 0.24782 0.971 0.331703
## Warna_MataBlue:Warna_RambutBlond 3.82116 0.46712 8.180 2.83e-16 ***
## Warna_MataGreen:Warna_RambutBlond 3.43675 0.64812 5.303 1.14e-07 ***
## Warna_MataHazel:Warna_RambutBlond 1.86813 0.56941 3.281 0.001035 **
## Warna_MataBlue:Warna_RambutBrown 0.87547 0.29157 3.003 0.002677 **
## Warna_MataGreen:Warna_RambutBrown 1.19824 0.50754 2.361 0.018230 *
## Warna_MataHazel:Warna_RambutBrown 0.72132 0.32908 2.192 0.028386 *
## Warna_MataBlue:Warna_RambutRed 0.79889 0.40248 1.985 0.047153 *
## Warna_MataGreen:Warna_RambutRed 1.99103 0.56973 3.495 0.000475 ***
## Warna_MataHazel:Warna_RambutRed 0.89242 0.43734 2.041 0.041293 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 475.118 on 31 degrees of freedom
## Residual deviance: 18.327 on 12 degrees of freedom
## AIC: 197.21
##
## Number of Fisher Scoring iterations: 4
1 Hipotesis
\(H_{0}\colon \lambda_{XZ} =
0\)
(tidak ada interaksi antara Jenis_Kelamin dan Warna_Rambut)
\(H_{1}\colon \lambda_{XZ} \neq
0\)
(ada interaksi antara Jenis_Kelamin dan Warna_Rambut)
2 Tingkat Signifikansi
alpha <- 0.05
3 Statistik Uji
# ΔDeviance = deviance(model_conditional_on_eye) – deviance(model_homogeneous)
deltaDev_XZ <- model_conditional_on_eye$deviance - model_homogeneous$deviance
deltaDev_XZ
## [1] 11.5659
# Contoh output: [1] 1.122345
# Derajat bebas: selisih df.residual
df_XZ <- model_conditional_on_eye$df.residual - model_homogeneous$df.residual
df_XZ
## [1] 3
4 Daerah Penolakan
chiCrit_XZ <- qchisq(1 - alpha, df = df_XZ)
chiCrit_XZ
## [1] 7.814728
5 Keputusan Uji
keputusan_XZ <- ifelse(deltaDev_XZ > chiCrit_XZ,
"Tolak H0: ada interaksi Jenis_Kelamin–Warna_Rambut",
"Terima H0: tidak ada interaksi Jenis_Kelamin–Warna_Rambut")
keputusan_XZ
## [1] "Tolak H0: ada interaksi Jenis_Kelamin–Warna_Rambut"
Interpretasi:
Karena
\[
\Delta\text{Deviance} \approx 11.56 \;>\; \chi^{2}_{0.05,2} \approx
7.81,
\]
maka tolak \(H_{0}\) pada \(\alpha = 5\%\).
Artinya: terdapat bukti interaksi signifikan antara Jenis_Kelamin dan
Warna_Rambut setelah dikondisikan pada Warna_Mata.
Langkah Langkah :
1. Hitung Selisih Deviance Antar Model
# model_conditional_on_eye: model conditional on Y (Warna_Mata)
# model_homogeneous: model homogeneous (semua interaksi dua-arah)
deltaDev_XZ_Y <- model_conditional_on_eye$deviance - model_homogeneous$deviance
deltaDev_XZ_Y
## [1] 11.5659
2. Hitung Derajat Bebas
# df = df.residual(model_conditional_on_eye) - df.residual(model_homogeneous)
df_XZ_Y <- model_conditional_on_eye$df.residual - model_homogeneous$df.residual
df_XZ_Y
## [1] 3
3. Nilai Kritis Chi-Square (α = 0.05)
chi_crit <- qchisq(0.95, df = df_XZ_Y)
chi_crit
## [1] 7.814728
4. Keputusan Uji
keputusan_XZ_Y <- ifelse(deltaDev_XZ_Y <= chi_crit,
"Terima H0: tidak ada interaksi Jenis_Kelamin–Warna_Rambut",
"Tolak H0: ada interaksi Jenis_Kelamin–Warna_Rambut")
keputusan_XZ_Y
## [1] "Tolak H0: ada interaksi Jenis_Kelamin–Warna_Rambut"
5. Interpretasi Singkat
Karena \(11.5659 > 7.814728\),
tolak \(H_{0}\) pada \(\alpha = 5\%\).
Artinya, setelah dikondisikan pada Warna_Mata, terdapat interaksi
signifikan antara Jenis_Kelamin dan Warna_Rambut. Dengan demikian, model
tanpa parameter \(\lambda_{XZ}\) belum
memadai untuk data ini.
Pada model conditional pada variabel Z, kita memasukkan efek utama untuk X, Y, dan Z, serta interaksi dua‑arah antara X–Z dan Y–Z, tetapi tidak menyertakan interaksi antara X dan Y maupun interaksi tiga‑arah:
\[ \log(\mu_{ijk}) \;=\; \lambda \;+\; \lambda_{i}^{X} \;+\; \lambda_{j}^{Y} \;+\; \lambda_{k}^{Z} \;+\; \lambda_{ik}^{XZ} \;+\; \lambda_{jk}^{YZ} \]
di mana: - \(\lambda\) adalah intercept umum, - \(\lambda_{i}^{X}, \lambda_{j}^{Y}, \lambda_{k}^{Z}\) adalah efek utama variabel \(X, Y, Z\), - \(\lambda_{ik}^{XZ}\) adalah interaksi dua‑arah antara \(X\) dan \(Z\), - \(\lambda_{jk}^{YZ}\) adalah interaksi dua‑arah antara \(Y\) dan \(Z\).
Model ini menguji hipotesis bahwa setelah mengondisikan pada Z, variabel X dan Y tidak lagi berinteraksi secara langsung.
# Conditional Association on Warna_Rambut (Z)
# Model mengasumsikan Jenis_Kelamin dan Warna_Mata independen setelah dikondisikan Warna_Rambut
model_conditional_on_hair <- glm(
Frekuensi ~ Jenis_Kelamin
+ Warna_Mata
+ Warna_Rambut
+ Jenis_Kelamin:Warna_Rambut
+ Warna_Mata:Warna_Rambut,
family = poisson(link = "log"),
data = data
)
# Ringkasan hasil
summary(model_conditional_on_hair)
##
## Call:
## glm(formula = Frekuensi ~ Jenis_Kelamin + Warna_Mata + Warna_Rambut +
## Jenis_Kelamin:Warna_Rambut + Warna_Mata:Warna_Rambut, family = poisson(link = "log"),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.48862 0.15709 22.208 < 2e-16 ***
## Jenis_KelaminMale 0.07411 0.19258 0.385 0.700377
## Warna_MataBlue -1.22378 0.25437 -4.811 1.50e-06 ***
## Warna_MataGreen -2.61007 0.46336 -5.633 1.77e-08 ***
## Warna_MataHazel -1.51146 0.28526 -5.299 1.17e-07 ***
## Warna_RambutBlond -1.99245 0.41474 -4.804 1.55e-06 ***
## Warna_RambutBrown 0.59736 0.19125 3.123 0.001788 **
## Warna_RambutRed -0.88229 0.27583 -3.199 0.001381 **
## Jenis_KelaminMale:Warna_RambutBlond -0.63992 0.26678 -2.399 0.016456 *
## Jenis_KelaminMale:Warna_RambutBrown -0.07411 0.22600 -0.328 0.742974
## Jenis_KelaminMale:Warna_RambutRed -0.15867 0.30582 -0.519 0.603888
## Warna_MataBlue:Warna_RambutBlond 3.82116 0.46712 8.180 2.83e-16 ***
## Warna_MataGreen:Warna_RambutBlond 3.43675 0.64812 5.303 1.14e-07 ***
## Warna_MataHazel:Warna_RambutBlond 1.86813 0.56941 3.281 0.001035 **
## Warna_MataBlue:Warna_RambutBrown 0.87547 0.29157 3.003 0.002677 **
## Warna_MataGreen:Warna_RambutBrown 1.19824 0.50754 2.361 0.018230 *
## Warna_MataHazel:Warna_RambutBrown 0.72132 0.32908 2.192 0.028386 *
## Warna_MataBlue:Warna_RambutRed 0.79889 0.40248 1.985 0.047153 *
## Warna_MataGreen:Warna_RambutRed 1.99103 0.56973 3.495 0.000475 ***
## Warna_MataHazel:Warna_RambutRed 0.89242 0.43734 2.041 0.041293 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 475.118 on 31 degrees of freedom
## Residual deviance: 11.764 on 12 degrees of freedom
## AIC: 190.64
##
## Number of Fisher Scoring iterations: 4
1. Rumus Hipotesis
\(H_{0}\colon \lambda_{XY} =
0\)
(tidak ada interaksi antara Jenis_Kelamin dan Warna_Mata)
\(H_{1}\colon \lambda_{XY} \neq
0\)
(ada interaksi antara Jenis_Kelamin dan Warna_Mata)
2. Tingkat Signifikansi
alpha <- 0.05
3. Hitung ΔDeviance antar model
# model_conditional_on_hair: conditional on Z (Warna_Rambut)
# model_homogeneous: homogeneous (semua interaksi dua-arah)
deltaDev_XY <- model_conditional_on_hair$deviance - model_homogeneous$deviance
deltaDev_XY
## [1] 5.002472
4. Derajat Bebas
df_XY <- model_conditional_on_hair$df.residual - model_homogeneous$df.residual
df_XY
## [1] 3
5. Nilai Kritis χ² untuk α = 0.05 dan df = 1
chi_crit_XY <- qchisq(1 - alpha, df = df_XY)
chi_crit_XY
## [1] 7.814728
6. Keputusan Uji
keputusan_XY <- ifelse(deltaDev_XY > chi_crit_XY,
"Tolak H0: ada interaksi Jenis_Kelamin–Warna_Mata",
"Terima H0: tidak ada interaksi Jenis_Kelamin–Warna_Mata")
keputusan_XY
## [1] "Terima H0: tidak ada interaksi Jenis_Kelamin–Warna_Mata"
Interpretasi :
Karena
\[
\Delta\text{Deviance} \approx 5.002 \;<\; \chi^{2}_{0.05,1} \approx
7.8147,
\]
maka pada \(\alpha = 5\%\) kita
menerima \(H_{0}\).
Artinya: tidak ada interaksi signifikan antara Jenis_Kelamin dan
Warna_Mata setelah dikondisikan pada Warna_Rambut.
| Model | Parameter | Deviance | Jumlah Parameter | df | Keterangan |
|---|---|---|---|---|---|
| Saturated | \(\lambda + \lambda^X + \lambda^Y + \lambda^Z + \lambda^{XY} + \lambda^{XZ} + \lambda^{YZ} + \lambda^{XYZ}\) | 0.000 | 12 | 0 | Fit sempurna |
| Homogeneous | \(\lambda + \lambda^X + \lambda^Y + \lambda^Z + \lambda^{XY} + \lambda^{XZ} + \lambda^{YZ}\) | 1.798 | 10 | 2 | Referensi uji interaksi |
| Conditional on X | \(\lambda + \lambda^X + \lambda^Y + \lambda^Z + \lambda^{XY} + \lambda^{XZ}\) | 3.930 | 8 | 4 | Hapus YZ |
| Conditional on Y | \(\lambda + \lambda^X + \lambda^Y + \lambda^Z + \lambda^{XY} + \lambda^{YZ}\) | 2.920 | 8 | 4 | Hapus XZ |
| Conditional on Z | \(\lambda + \lambda^X + \lambda^Y + \lambda^Z + \lambda^{XZ} + \lambda^{YZ}\) | 29.729 | 9 | 3 | Hapus XY |
| Interaksi | Pengujian | Δ Deviance | Δ df | Chi‑square Tabel | Keputusan | Keterangan Interaksi |
|---|---|---|---|---|---|---|
| XYZ | Saturated vs Homogeneous | 6.761 | 9 | 16.919 | Tidak Tolak H₀ | Tidak ada interaksi tiga‑arah |
| YZ | Conditional on X vs Homogeneous | 149.917 | 9 | 16.919 | Tolak H₀ | Ada interaksi Warna_Mata–Rambut |
| XZ | Conditional on Y vs Homogeneous | 11.566 | 3 | 7.815 | Tolak H₀ | Ada interaksi Jenis_Kelamin–Rambut |
| XY | Conditional on Z vs Homogeneous | 5.002 | 3 | 7.815 | Tidak Tolak H₀ | Tidak ada interaksi Jenis_Kelamin–Mata |
Hanya interaksi Warna_Mata–Warna_Rambut (YZ) dan Jenis_Kelamin–Warna_Rambut (XZ) yang signifikan. Interaksi Jenis_Kelamin–Warna_Mata (XY) tidak signifikan, dan interaksi tiga arah XYZ juga tidak signifikan.
Model terbaik: model yang hanya memuat efek utama dan interaksi dua-arah:
Jenis_Kelamin:Warna_Rambut (XZ)
Warna_Mata:Warna_Rambut (YZ)
bestmodel <- glm(
Frekuensi ~ Jenis_Kelamin + Warna_Mata + Warna_Rambut +
Jenis_Kelamin:Warna_Rambut +
Warna_Mata:Warna_Rambut,
family = poisson(link = "log"),
data = data
)
summary(bestmodel)
##
## Call:
## glm(formula = Frekuensi ~ Jenis_Kelamin + Warna_Mata + Warna_Rambut +
## Jenis_Kelamin:Warna_Rambut + Warna_Mata:Warna_Rambut, family = poisson(link = "log"),
## data = data)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.48862 0.15709 22.208 < 2e-16 ***
## Jenis_KelaminMale 0.07411 0.19258 0.385 0.700377
## Warna_MataBlue -1.22378 0.25437 -4.811 1.50e-06 ***
## Warna_MataGreen -2.61007 0.46336 -5.633 1.77e-08 ***
## Warna_MataHazel -1.51146 0.28526 -5.299 1.17e-07 ***
## Warna_RambutBlond -1.99245 0.41474 -4.804 1.55e-06 ***
## Warna_RambutBrown 0.59736 0.19125 3.123 0.001788 **
## Warna_RambutRed -0.88229 0.27583 -3.199 0.001381 **
## Jenis_KelaminMale:Warna_RambutBlond -0.63992 0.26678 -2.399 0.016456 *
## Jenis_KelaminMale:Warna_RambutBrown -0.07411 0.22600 -0.328 0.742974
## Jenis_KelaminMale:Warna_RambutRed -0.15867 0.30582 -0.519 0.603888
## Warna_MataBlue:Warna_RambutBlond 3.82116 0.46712 8.180 2.83e-16 ***
## Warna_MataGreen:Warna_RambutBlond 3.43675 0.64812 5.303 1.14e-07 ***
## Warna_MataHazel:Warna_RambutBlond 1.86813 0.56941 3.281 0.001035 **
## Warna_MataBlue:Warna_RambutBrown 0.87547 0.29157 3.003 0.002677 **
## Warna_MataGreen:Warna_RambutBrown 1.19824 0.50754 2.361 0.018230 *
## Warna_MataHazel:Warna_RambutBrown 0.72132 0.32908 2.192 0.028386 *
## Warna_MataBlue:Warna_RambutRed 0.79889 0.40248 1.985 0.047153 *
## Warna_MataGreen:Warna_RambutRed 1.99103 0.56973 3.495 0.000475 ***
## Warna_MataHazel:Warna_RambutRed 0.89242 0.43734 2.041 0.041293 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 475.118 on 31 degrees of freedom
## Residual deviance: 11.764 on 12 degrees of freedom
## AIC: 190.64
##
## Number of Fisher Scoring iterations: 4
# Interpretasi koefisien model terbaik
data.frame(
Estimate = bestmodel$coefficients,
ExpEstimate = exp(bestmodel$coefficients)
)
Interpretasi :
Berikut interpretasi singkat dari koefisien
model_terbaik (main effects + interaksi X × Z dan
Y × Z):
| Term | Estimate (β) | Exp(β) | Interpretasi |
|---|---|---|---|
| (Intercept) | 3.4886 | 32.7407 | Baseline (Female, mata Brown, rambut Black): ekspektasi frekuensi ≈ 32.7 |
| Jenis_KelaminMale | 0.0741 | 1.0769 | Male ~7.7 % lebih tinggi dari Female, bila mata Brown & rambut Black |
| Warna_MataBlue | −1.2238 | 0.2941 | Mata Blue hanya ~29.4 % dari frekuensi baseline (Brown) |
| Warna_MataGreen | −2.6101 | 0.0735 | Mata Green hanya ~7.35 % dari baseline |
| Warna_MataHazel | −1.5115 | 0.2206 | Mata Hazel ~22.1 % dari baseline |
| Warna_RambutBlond | −1.9924 | 0.1364 | Rambut Blond ~13.6 % dari baseline (Black) |
| Warna_RambutBrown | 0.5974 | 1.8173 | Rambut Brown ~81.7 % lebih tinggi dari rambut Black |
| Warna_RambutRed | −0.8823 | 0.4138 | Rambut Red ~41.4 % dari baseline |
| Jenis_KelaminMale × Warna_RambutBlond | −0.6399 | 0.5273 | Interaksi Male×Blond: frekuensi Male pada Blond ~52.7 % dari prediksi main effects (asosiasi Blond melemah pada Male) |
| Jenis_KelaminMale × Warna_RambutBrown | −0.0741 | 0.9286 | Interaksi Male×Brown: frekuensi Male pada Brown ~92.9 % dari prediksi main effects |
Kesimpulan:
- Dominasi asosiasi mata–rambut (YZ) sudah tertangkap
model.
- Jenis kelamin berpengaruh kecil (efek utama positif),
tetapi memperlemah kombinasi spesifik (terutama Blond).
- Kombinasi Male–Blond lebih jarang dari ekspektasi semata‑mata efek
Gender dan Rambut.
# Fitted values dari model terbaik
fitted_df <- data.frame(
Jenis_Kelamin = x.sex,
Warna_Mata = y.eye,
Warna_Rambut = z.hair,
Observed = counts,
Fitted = bestmodel$fitted.values
)
fitted_df
Interpretasi :
Observed vs Fitted
Beberapa poin singkat dari perbandingan Observed vs Fitted:
Kesimpulan:
Secara keseluruhan, fit model sangat memadai: fitted
values mengikuti tren observasi tanpa bias sistematis yang besar.
Fisher, R. A. (1935). The Design of Experiments. Oliver and Boyd.
Agresti, A. (2013). Categorical Data Analysis. John Wiley & Sons.
Mehta, C. R., & Patel, N. R. (1983). A Network Algorithm for Performing Fisher’s Exact Test in r × c Contingency Tables. Journal of the American Statistical Association, 78(382), 427-434.
Howell, D. C. (2012). Statistical Methods for Psychology (8th ed.). Cengage Learning
Anderson, C. J. (2018). Log‑linear Models for Contingency Tables
Fox, J. (2008). Applied Regression Analysis and Generalized Linear Models.
Christensen, R. (1997). Log-Linear Models and Logistic Regression. Springer.
Bishop, Y. M. M., Fienberg, S. E., & Holland, P. W. (1975). Discrete Multivariate Analysis: Theory and Practice. MIT Press.
Holt, D. (1979). “Log‑Linear Models for Contingency Table Analysis.” Sociological Methods & Research.
Categorical Data Analysis: Chen, D., & Anderson, C. (2024). “Categorical Data Analysis”.
Hilbe, J. M. (2009). Logistic Regression Models. Chapman & Hall/CRC.
McCullagh, P., & Nelder, J. A. (1989). Generalized Linear Models (2nd ed.). Chapman & Hall/CRC.
Khamis, H. J. (1983). “Log‑linear model analysis of the semi‑symmetric intraclass contingency table.” Communications in Statistics – Theory and Methods.
Benoit, K. (2011). Multinomial and Ordinal Logistic Regression
Lee, E. (2018). Ordinal Logistic Regression and its Assumptions — Brant Test.
Xu, Kandi, et al. (2020). Application of ordinal logistic regression analysis to identify the determinants of illness severity of COVID‑19 in China.
Brant, R. (1990). Assessing Proportionality in the Proportional Odds Model for Ordinal Logistic Regression. Biometrics, 46(4), 1171–1178.
Liu, A., & Luo, X. (2022). On testing proportional odds assumptions. Medical Research Methodology.