Dalam ilmu statistika, tidak semua data dapat dianalisis dengan regresi linear biasa. Ketika variabel respon berbentuk kategori (misalnya βlulus/tidak lulusβ), lebih dari dua kelompok tanpa urutan (misalnya pilihan moda transportasi), kategori berjenjang (misalnya tingkat kepuasan), atau berupa data cacah/hitungan (misalnya jumlah kecelakaan), maka dibutuhkan pendekatan model yang berbeda. Di sinilah Generalized Linear Model (GLM) berperan penting sebagai kerangka umum yang menaungi keempat model yang dibahas dalam ebook ini.
Secara garis besar, ebook ini membahas empat model utama:
1. Regresi Logistik Biner (Binary Logistic Regression)
Digunakan ketika variabel respon hanya memiliki dua kategori, misalnya βberhasil/gagalβ atau βya/tidakβ. Model ini menghubungkan peluang kejadian dengan variabel prediktor melalui fungsi link logit, dan hasilnya dapat diinterpretasikan melalui Odds Ratio (OR).
2. Regresi Logistik Multinomial (Multinomial Logistic Regression)
Merupakan perluasan dari regresi logistik biner untuk kasus respon dengan lebih dari dua kategori yang bersifat nominal (tidak memiliki urutan), misalnya pemilihan moda transportasi (mobil, motor, kereta). Model ini membandingkan setiap kategori terhadap satu kategori acuan (reference category).
3. Regresi Logistik Ordinal (Ordinal Logistic Regression)
Digunakan ketika kategori pada variabel respon memiliki urutan atau tingkatan, misalnya tingkat kepuasan pelanggan (tidak puas, cukup, puas, sangat puas). Model yang umum digunakan adalah Proportional Odds Model.
4. Regresi Poisson (Poisson Regression)
Digunakan untuk memodelkan data cacah (count data), yaitu jumlah kejadian dalam suatu interval waktu atau ruang tertentu, misalnya jumlah kecelakaan lalu lintas. Model ini mengasumsikan bahwa variabel respon mengikuti distribusi Poisson.
Tujuan Ebook: Membantu mahasiswa dan pembaca umum memahami konsep dasar, asumsi, interpretasi, hingga implementasi keempat model analisis data kategori tersebut menggunakan bahasa pemrograman R, sebelum diterapkan pada studi kasus nyata.
Semoga ebook ini bermanfaat dan memudahkan proses belajar mengenai analisis data kategori.
Analisis data kategori adalah cabang statistika yang berfokus pada pemodelan data ketika variabel respon (variabel dependen) berskala kategorik (nominal atau ordinal) atau berupa data cacah (count), bukan data kontinu. Karena asumsi normalitas dan homogenitas ragam pada regresi linear klasik tidak terpenuhi untuk jenis data ini, digunakanlah pendekatan Generalized Linear Model (GLM).
GLM memperluas regresi linear biasa dengan tiga komponen utama:
Jika variabel respon berupa kategori (misalnya 0 dan 1) dipaksakan menggunakan regresi linear biasa (Linear Probability Model), akan muncul beberapa masalah:
| Jenis Respon | Skala Data | Contoh | Model yang Digunakan |
|---|---|---|---|
| Biner (2 kategori) | Nominal | Lulus / Tidak Lulus | Binary Logistic Regression |
| Nominal (>2 kategori, tanpa urutan) | Nominal | Mobil / Motor / Kereta | Multinomial Logistic Regression |
| Ordinal (>2 kategori, berurutan) | Ordinal | Tidak Puas / Cukup / Puas / Sangat Puas | Ordinal Logistic Regression |
| Cacah (jumlah kejadian) | Rasio (diskret) | Jumlah kecelakaan per bulan | Poisson Regression |
Regresi logistik biner digunakan ketika variabel respon \(Y\) terdiri dari dua kategori, biasanya dikodekan sebagai 0 (gagal/tidak) dan 1 (berhasil/ya). Model ini menduga peluang \(p = P(Y=1|X)\) menggunakan fungsi link logit:
\[ \log\left(\frac{p}{1-p}\right)=\beta_0+\beta_1X_1+\beta_2X_2+\dots+\beta_kX_k \]
Bentuk peluangnya dapat dituliskan kembali sebagai:
\[ p=\frac{e^{\beta_0+\beta_1X}}{1+e^{\beta_0+\beta_1X}} \]
Karena koefisien \(\beta\) berada dalam skala logit, interpretasinya dilakukan melalui Odds Ratio (OR):
\[ OR=e^{\beta} \]
Studi Kasus: Prediksi Nasabah Berlangganan Deposito Berjangka
Data yang digunakan adalah Bank Marketing Dataset
(bank.csv), berisi 4.521 data hasil kampanye pemasaran
telepon sebuah bank di Portugal. Variabel respon \(Y\) adalah y, yaitu apakah
nasabah berlangganan deposito berjangka (βyesβ) atau
tidak (βnoβ). Beberapa variabel prediktor yang
digunakan:
| Variabel | Keterangan |
|---|---|
age |
Usia nasabah (tahun) |
job |
Jenis pekerjaan nasabah |
marital |
Status pernikahan |
education |
Tingkat pendidikan |
balance |
Rata-rata saldo tahunan (euro) |
housing |
Memiliki pinjaman perumahan (yes/no) |
loan |
Memiliki pinjaman pribadi (yes/no) |
duration |
Lama kontak terakhir (detik) |
campaign |
Jumlah kontak selama kampanye ini |
y |
Variabel respon: berlangganan deposito (yes/no) |
Perhatikan bahwa file bank.csv menggunakan
pemisah titik-koma (;), sehingga dibaca dengan
read.csv2() atau read.csv(..., sep=";").
# Membaca data (pemisah kolom adalah titik koma)
bank <- read.csv2("bank.csv", sep = ";", stringsAsFactors = TRUE)
# Struktur data
str(bank)
# Distribusi variabel respon
table(bank$y)
prop.table(table(bank$y))
Kategori βyesβ ditetapkan sebagai kejadian sukses (\(Y=1\)) dengan menjadikan βnoβ sebagai level referensi.
# Menetapkan "no" sebagai kategori referensi
bank$y <- relevel(bank$y, ref = "no")
# Membangun model regresi logistik biner
model_biner <- glm(y ~ age + job + marital + education + balance +
housing + loan + duration + campaign,
family = binomial(link = "logit"),
data = bank)
# Ringkasan model
summary(model_biner)
# Model tanpa prediktor (null model) vs model penuh
model_null <- glm(y ~ 1, family = binomial(link = "logit"), data = bank)
anova(model_null, model_biner, test = "Chisq")
# Menghitung Odds Ratio beserta interval kepercayaan 95%
exp(cbind(OR = coef(model_biner), confint(model_biner)))
Cara Membaca Output:
housing atau
loan, OR dibandingkan terhadap kategori referensinya
(misalnya housingyes dibandingkan terhadap
housingno).library(ResourceSelection)
# Uji Hosmer-Lemeshow (goodness of fit)
hoslem.test(model_biner$y, fitted(model_biner))
# Prediksi peluang dan klasifikasi (cut-off 0.5)
prob_pred <- predict(model_biner, type = "response")
pred_kelas <- ifelse(prob_pred > 0.5, "yes", "no")
# Matriks konfusi
tabel_konfusi <- table(Prediksi = pred_kelas, Aktual = bank$y)
tabel_konfusi
# Akurasi model
akurasi <- sum(diag(tabel_konfusi)) / sum(tabel_konfusi)
akurasi
Catatan Penting:
Karena proporsi nasabah yang berlangganan (βyesβ) jauh lebih kecil dibandingkan yang tidak (βnoβ) β kondisi data tidak seimbang (imbalanced) β akurasi saja tidak cukup untuk menilai performa model. Sebaiknya evaluasi juga dilakukan menggunakan sensitivitas, spesifisitas, dan kurva ROC/AUC agar kemampuan model dalam mengenali kelas minoritas (βyesβ) dapat terlihat dengan lebih adil.
Regresi logistik multinomial digunakan untuk memodelkan respon nominal dengan lebih dari dua kategori (\(J>2\)) yang tidak memiliki urutan. Salah satu kategori dipilih sebagai kategori acuan (baseline), lalu model membandingkan setiap kategori lain terhadapnya:
\[ \log\frac{P(Y=j)}{P(Y=0)}=\beta_{0j}+\beta_{1j}X_1+\dots+\beta_{kj}X_k,\quad j=1,\dots,J-1 \]
Studi Kasus: Klasifikasi Jenis Hewan Berdasarkan Ciri-Ciri Fisik
Data yang digunakan adalah Zoo Dataset
(zoo.data) dari UCI Machine Learning Repository, berisi 101
spesies hewan dengan 16 atribut biner/numerik dan satu variabel kelas
(tipe) yang terdiri dari 7 kategori nominal tanpa
urutan:
| Kode | Kelas Hewan | Jumlah |
|---|---|---|
| 1 | Mamalia | 41 |
| 2 | Burung | 20 |
| 3 | Reptil | 5 |
| 4 | Ikan | 13 |
| 5 | Amfibi | 4 |
| 6 | Serangga | 8 |
| 7 | Invertebrata | 10 |
Data tidak memiliki baris header, sehingga nama kolom perlu didefinisikan secara manual.
# Nama-nama kolom sesuai dokumentasi zoo.names (UCI)
nama_kolom <- c("nama_hewan", "rambut", "bulu", "telur", "susu", "terbang",
"akuatik", "predator", "bergigi", "tulang_belakang", "bernapas",
"berbisa", "sirip", "jumlah_kaki", "ekor", "domestik",
"ukuran_besar", "tipe")
# Membaca data (tanpa header, dipisahkan koma)
zoo <- read.csv("zoo.data", header = FALSE, col.names = nama_kolom)
# Mengubah variabel tipe menjadi faktor dengan label kategori
zoo$tipe <- factor(zoo$tipe,
levels = 1:7,
labels = c("Mamalia", "Burung", "Reptil", "Ikan",
"Amfibi", "Serangga", "Invertebrata"))
# Struktur data
str(zoo)
# Distribusi variabel respon
table(zoo$tipe)
Kategori βMamaliaβ (kelas dengan frekuensi terbanyak) ditetapkan sebagai kategori acuan (baseline).
library(nnet)
# Menetapkan "Mamalia" sebagai kategori acuan
zoo$tipe <- relevel(zoo$tipe, ref = "Mamalia")
# Membangun model multinomial
model_multinom <- multinom(tipe ~ rambut + bulu + telur + susu + akuatik +
predator + bergigi + sirip + jumlah_kaki + ekor,
data = zoo,
trace = FALSE)
# Ringkasan model
summary(model_multinom)
Catatan: Karena beberapa atribut pada data Zoo
bersifat sangat menentukan (misalnya semua hewan bertulang belakang
dengan susu = 1 pasti Mamalia), model dapat mengalami
complete/quasi-separation yang ditandai dengan nilai
standard error yang sangat besar pada koefisien tertentu. Dalam
praktiknya, hal ini wajar terjadi pada data dengan atribut yang sangat
diskriminatif, namun tetap perlu dicermati saat interpretasi.
# Menghitung nilai z dan p-value untuk setiap koefisien
z <- summary(model_multinom)$coefficients / summary(model_multinom)$standard.errors
p_value <- (1 - pnorm(abs(z), 0, 1)) * 2
round(p_value, 4)
# Menghitung Relative Risk Ratio (RRR)
exp(coef(model_multinom))
Cara Membaca Output:
sirip = 1 diperkirakan
sangat meningkatkan kecenderungan relatif digolongkan sebagai
Ikan dibandingkan Mamalia, sejalan
dengan karakteristik biologisnya.# Prediksi kelas oleh model
prediksi_tipe <- predict(model_multinom, newdata = zoo)
# Matriks konfusi
tabel_konfusi <- table(Prediksi = prediksi_tipe, Aktual = zoo$tipe)
tabel_konfusi
# Akurasi klasifikasi model
akurasi <- sum(diag(tabel_konfusi)) / sum(tabel_konfusi)
akurasi
Catatan Penting:
Karena jumlah kelas Reptil dan Amfibi pada data ini sangat sedikit (masing-masing 5 dan 4 pengamatan), model cenderung sulit membedakan kelas tersebut secara akurat. Untuk data dengan kelas yang sangat tidak seimbang seperti ini, evaluasi model sebaiknya juga mempertimbangkan akurasi per kelas, bukan hanya akurasi keseluruhan (overall accuracy).
Regresi logistik ordinal digunakan ketika kategori variabel respon memiliki tingkatan atau urutan. Model yang paling umum digunakan adalah Proportional Odds Model (Cumulative Logit Model):
\[ \log\frac{P(Y\le j)}{P(Y>j)}=\alpha_j-\beta_1X_1-\dots-\beta_kX_k,\quad j=1,\dots,J-1 \]
di mana \(\alpha_j\) adalah cut-point (titik potong) antar kategori berurutan.
Studi Kasus: Evaluasi Prioritas Penerimaan Taman Kanak-Kanak (Nursery School)
Data yang digunakan adalah Nursery Dataset
(nursery.data) dari UCI Machine Learning Repository, berisi
12.960 data hasil evaluasi aplikasi pendaftaran taman kanak-kanak di
Ljubljana, Slovenia pada era 1980-an, ketika terjadi kelebihan
permintaan sehingga dibutuhkan metode penilaian yang eksplisit. Variabel
respon class merupakan rekomendasi
penerimaan yang bersifat ordinal (berjenjang
dari yang paling tidak direkomendasikan hingga paling prioritas):
| Urutan | Kategori | Keterangan |
|---|---|---|
| 1 | not_recom |
Tidak direkomendasikan |
| 2 | recommend |
Direkomendasikan |
| 3 | very_recom |
Sangat direkomendasikan |
| 4 | priority |
Prioritas |
| 5 | spec_prior |
Prioritas khusus |
Variabel prediktor yang tersedia:
| Variabel | Keterangan |
|---|---|
parents |
Status pekerjaan orang tua (usual, pretentious, great_pret) |
has_nurs |
Kualitas tempat penitipan sebelumnya |
form |
Struktur keluarga (complete, incomplete, foster, dll.) |
children |
Jumlah anak (1, 2, 3, more) |
housing |
Kondisi perumahan |
finance |
Kondisi keuangan keluarga |
social |
Kondisi sosial keluarga |
health |
Kondisi kesehatan anak |
Data tidak memiliki baris header, sehingga nama kolom didefinisikan
secara manual, dan variabel respon class diubah menjadi
ordered factor sesuai urutan rekomendasinya.
library(MASS)
# Nama-nama kolom sesuai dokumentasi nursery.names (UCI)
nama_kolom <- c("parents", "has_nurs", "form", "children",
"housing", "finance", "social", "health", "class")
# Membaca data
nursery <- read.csv("nursery.data", header = FALSE, col.names = nama_kolom)
# Mengubah variabel respon menjadi ordered factor sesuai tingkat rekomendasi
nursery$class <- factor(nursery$class,
levels = c("not_recom", "recommend", "very_recom",
"priority", "spec_prior"),
ordered = TRUE)
# Struktur data
str(nursery)
# Distribusi variabel respon
table(nursery$class)
Catatan: Kategori recommend hanya
memiliki 2 pengamatan dari total 12.960 data (sangat jarang). Dalam
praktik nyata, kategori dengan frekuensi sangat kecil sebaiknya digabung
dengan kategori terdekat (misalnya digabung ke very_recom)
agar pendugaan parameter model lebih stabil. Pada contoh ini, kategori
tetap dipertahankan apa adanya untuk tujuan ilustrasi.
# Membangun model ordinal (Proportional Odds Model)
model_ordinal <- polr(class ~ parents + has_nurs + form + children +
housing + finance + social + health,
data = nursery,
Hess = TRUE)
# Ringkasan model
summary(model_ordinal)
Fungsi polr() tidak menampilkan p-value secara langsung,
sehingga perlu dihitung manual berdasarkan sebaran normal baku.
# Menghitung p-value dari nilai t
ctable <- coef(summary(model_ordinal))
p_value <- pnorm(abs(ctable[, "t value"]), lower.tail = FALSE) * 2
hasil_uji <- cbind(ctable, "p value" = p_value)
round(hasil_uji, 4)
# Menghitung Odds Ratio beserta interval kepercayaan 95%
exp(cbind(OR = coef(model_ordinal), confint(model_ordinal)))
Cara Membaca Output:
priority menuju spec_prior).health = recommended
diperkirakan memiliki odds yang jauh lebih tinggi untuk memperoleh
rekomendasi penerimaan yang lebih baik dibandingkan
health = not_recom, sejalan dengan logika sistem
penilaiannya.Asumsi parallel lines (proportional odds) perlu diuji agar model layak digunakan. Salah satu cara sederhana adalah membandingkan model ordinal dengan pendekatan generalized ordinal logit menggunakan uji Brant.
library(brant)
# Uji Brant untuk asumsi proportional odds
brant(model_ordinal)
Catatan Penting:
Jika hasil uji Brant menunjukkan p-value < 0.05 pada salah satu
variabel (omnibus atau per-variabel), berarti asumsi proportional
odds tidak terpenuhi untuk variabel tersebut.
Dalam kondisi ini, dapat dipertimbangkan penggunaan Generalized
Ordinal Logistic Regression (misalnya melalui package
VGAM dengan fungsi vglm()) sebagai alternatif
yang lebih fleksibel.
# Prediksi kelas oleh model
prediksi_class <- predict(model_ordinal, newdata = nursery)
# Matriks konfusi
tabel_konfusi <- table(Prediksi = prediksi_class, Aktual = nursery$class)
tabel_konfusi
# Akurasi klasifikasi model
akurasi <- sum(diag(tabel_konfusi)) / sum(tabel_konfusi)
akurasi
Catatan Penting:
Karena kategori recommend hanya memiliki 2 pengamatan,
model hampir dapat dipastikan tidak pernah memprediksi kategori
tersebut dengan benar. Hal ini menunjukkan pentingnya
mempertimbangkan penggabungan kategori langka sebelum pemodelan, atau
menggunakan ukuran evaluasi yang memperhitungkan ketidakseimbangan
kelas.
Regresi Poisson digunakan untuk memodelkan data cacah (count data), yaitu jumlah kejadian dalam suatu interval waktu, ruang, atau area tertentu. Model ini mengasumsikan variabel respon mengikuti distribusi Poisson, dengan fungsi link logaritmik:
\[ \log(\mu)=\beta_0+\beta_1X_1+\dots+\beta_kX_k \]
di mana \(\mu = E(Y|X)\) adalah rata-rata jumlah kejadian.
\[ IRR=e^{\beta} \]
Contoh Kasus
Seorang peneliti ingin mengetahui pengaruh volume kendaraan terhadap jumlah kecelakaan lalu lintas per bulan pada suatu ruas jalan.
# Membangun model Poisson
model_poisson <- glm(jumlah ~ volume,
family = poisson(link = "log"),
data = data)
# Ringkasan model
summary(model_poisson)
# Menghitung Incidence Rate Ratio (IRR)
exp(cbind(IRR = coef(model_poisson), confint(model_poisson)))
# Mengecek overdispersion
dispersi <- sum(residuals(model_poisson, type = "pearson")^2) / model_poisson$df.residual
dispersi
Catatan Penting:
Jika nilai rasio dispersi jauh lebih besar dari 1, model mengalami
overdispersion, dan sebaiknya digunakan
glm.nb() dari package MASS (Regresi Binomial
Negatif) sebagai alternatif yang lebih sesuai.
| Model | Skala Respon | Jumlah Kategori | Fungsi Link | Ukuran Efek |
|---|---|---|---|---|
| Binary Logistic | Nominal | 2 | Logit | Odds Ratio (OR) |
| Multinomial Logistic | Nominal | >2 (tanpa urutan) | Logit (generalized) | Relative Risk Ratio (RRR) |
| Ordinal Logistic | Ordinal | >2 (berurutan) | Cumulative Logit | Odds Ratio (OR) |
| Poisson Regression | Cacah (count) | - | Log | Incidence Rate Ratio (IRR) |
Apakah variabel respon berupa data cacah (count)?
βββ Ya β Poisson Regression (periksa overdispersion β Binomial Negatif)
βββ Tidak
βββ Apakah kategori respon memiliki urutan?
βββ Ya β Ordinal Logistic Regression
βββ Tidak
βββ Berapa jumlah kategori respon?
βββ 2 kategori β Binary Logistic Regression
βββ >2 kategori β Multinomial Logistic Regression
| Model | Digunakan Untuk | Contoh Kasus |
|---|---|---|
| Binary Logistic | Respon dua kategori | Kelulusan mahasiswa |
| Multinomial Logistic | Nominal lebih dari dua kategori | Pemilihan moda transportasi |
| Ordinal Logistic | Data berurutan/berjenjang | Tingkat kepuasan pelanggan |
| Poisson Regression | Data jumlah kejadian | Jumlah kecelakaan lalu lintas |
Pemilihan model analisis data kategori harus disesuaikan dengan jenis dan skala variabel respon: apakah biner, nominal dengan banyak kategori, ordinal, atau berupa data cacah. Memahami karakteristik data merupakan langkah awal yang krusial untuk memperoleh model yang tepat, interpretasi yang akurat, serta kesimpulan yang dapat dipertanggungjawabkan secara statistik.
Selain memilih model yang sesuai, seorang analis juga perlu memperhatikan pemeriksaan asumsi, uji kesesuaian model (goodness of fit), serta validasi hasil sebelum menarik kesimpulan akhir. Dengan pemahaman yang baik terhadap keempat model dalam ebook ini, pembaca diharapkan mampu menerapkan analisis data kategori secara tepat pada berbagai studi kasus di bidang masing-masing.