Laporan ini menyajikan empat contoh kasus penerapan model regresi untuk data kategori/count: regresi logistik biner, regresi logistik multinomial, regresi logistik ordinal, dan regresi Poisson. Setiap kasus mencakup deskripsi data, model matematis, estimasi menggunakan R, dan interpretasi hasil.
Regresi logistik biner digunakan ketika variabel respon bersifat dikotomis (dua kategori). Contoh kasus: memprediksi status infeksi (ya/tidak) berdasarkan status vaksinasi dan usia.
\[ \text{logit}(p_i) = \ln\left(\frac{p_i}{1-p_i}\right) = \beta_0 + \beta_1 \text{Vaksin}_i + \beta_2 \text{Usia}_i \]
set.seed(123)
n <- 200
vaksin <- rbinom(n, 1, 0.5)
usia <- round(rnorm(n, 40, 12))
lin_pred <- -0.5 - 1.5*vaksin + 0.03*usia
p <- 1/(1+exp(-lin_pred))
infeksi <- rbinom(n, 1, p)
data_biner <- data.frame(infeksi, vaksin, usia)
head(data_biner)
## infeksi vaksin usia
## 1 1 0 31
## 2 1 1 43
## 3 1 0 37
## 4 0 1 36
## 5 0 1 29
## 6 0 0 39
model_biner <- glm(infeksi ~ vaksin + usia, data = data_biner, family = binomial(link = "logit"))
summary(model_biner)
##
## Call:
## glm(formula = infeksi ~ vaksin + usia, family = binomial(link = "logit"),
## data = data_biner)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -0.26304 0.56542 -0.465 0.642
## vaksin -1.27782 0.30009 -4.258 2.06e-05 ***
## usia 0.02317 0.01332 1.739 0.082 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 277.18 on 199 degrees of freedom
## Residual deviance: 254.58 on 197 degrees of freedom
## AIC: 260.58
##
## Number of Fisher Scoring iterations: 4
exp(coef(model_biner))
## (Intercept) vaksin usia
## 0.7687114 0.2786433 1.0234401
exp(confint(model_biner))
## 2.5 % 97.5 %
## (Intercept) 0.2517711 2.332365
## vaksin 0.1531734 0.497798
## usia 0.9974437 1.051160
Koefisien vaksin bernilai negatif, menunjukkan bahwa
vaksinasi menurunkan log-odds infeksi. Nilai odds ratio untuk vaksin
< 1 mengindikasikan efek protektif: individu yang divaksin memiliki
odds infeksi lebih rendah dibanding yang tidak divaksin, dengan
mengontrol usia. Koefisien usia positif menunjukkan odds
infeksi meningkat seiring bertambahnya usia.
Regresi multinomial digunakan ketika variabel respon memiliki lebih dari dua kategori tanpa urutan (nominal). Contoh kasus: memprediksi pilihan moda transportasi (Motor, Mobil, Angkutan Umum) berdasarkan pendapatan dan jarak tempuh.
Dengan kategori referensi “Motor”:
\[ \ln\left(\frac{P(Y=j)}{P(Y=\text{Motor})}\right) = \beta_{0j} + \beta_{1j}\text{Pendapatan} + \beta_{2j}\text{Jarak}, \quad j = \text{Mobil, Angkutan Umum} \]
set.seed(123)
n <- 300
pendapatan <- round(rnorm(n, 5, 2), 1) # dalam juta rupiah
jarak <- round(rnorm(n, 10, 4), 1) # dalam km
skor_mobil <- -3 + 0.6*pendapatan - 0.05*jarak
skor_umum <- -1 + 0.1*pendapatan + 0.15*jarak
skor_motor <- 0
exp_m <- exp(skor_mobil); exp_u <- exp(skor_umum); exp_mo <- exp(skor_motor)
tot <- exp_m + exp_u + exp_mo
prob <- cbind(Motor = exp_mo/tot, Mobil = exp_m/tot, AngkutanUmum = exp_u/tot)
moda <- apply(prob, 1, function(x) sample(c("Motor","Mobil","AngkutanUmum"), 1, prob = x))
data_multi <- data.frame(moda = factor(moda), pendapatan, jarak)
head(data_multi)
## moda pendapatan jarak
## 1 Motor 3.9 7.1
## 2 Mobil 4.5 7.0
## 3 Mobil 8.1 6.2
## 4 Motor 5.1 5.8
## 5 AngkutanUmum 5.3 8.3
## 6 Motor 8.4 11.3
data_multi$moda <- relevel(data_multi$moda, ref = "Motor")
model_multi <- multinom(moda ~ pendapatan + jarak, data = data_multi, trace = FALSE)
summary(model_multi)
## Call:
## multinom(formula = moda ~ pendapatan + jarak, data = data_multi,
## trace = FALSE)
##
## Coefficients:
## (Intercept) pendapatan jarak
## AngkutanUmum -1.001552 0.03248343 0.1923893
## Mobil -2.338040 0.62980637 -0.1142991
##
## Std. Errors:
## (Intercept) pendapatan jarak
## AngkutanUmum 0.6102234 0.09393816 0.04511325
## Mobil 0.7589084 0.11939227 0.05390951
##
## Residual Deviance: 477.6492
## AIC: 489.6492
z <- summary(model_multi)$coefficients / summary(model_multi)$standard.errors
p_val <- (1 - pnorm(abs(z), 0, 1)) * 2
p_val
## (Intercept) pendapatan jarak
## AngkutanUmum 0.100737762 7.294961e-01 2.002738e-05
## Mobil 0.002064498 1.326826e-07 3.398886e-02
Dibanding kategori referensi Motor, kenaikan pendapatan cenderung meningkatkan peluang memilih Mobil (koefisien positif), sedangkan kenaikan jarak tempuh cenderung meningkatkan peluang memilih Angkutan Umum dibanding Motor. Nilai p-value pada uji z digunakan untuk menilai signifikansi masing-masing prediktor terhadap tiap kategori pembanding.
Regresi logistik ordinal digunakan ketika variabel respon berkategori dengan urutan (ordinal). Contoh kasus: tingkat kepuasan pelanggan (Rendah, Sedang, Tinggi) terhadap layanan, diprediksi oleh lama waktu tunggu dan skor keramahan staf.
\[ \ln\left(\frac{P(Y \le j)}{P(Y > j)}\right) = \alpha_j - (\beta_1 \text{Tunggu} + \beta_2 \text{Keramahan}), \quad j = 1,2 \]
set.seed(123)
n <- 250
tunggu <- round(rnorm(n, 15, 5), 1) # menit
keramahan <- round(rnorm(n, 7, 1.5), 1) # skor 1-10
skor <- -0.15*tunggu + 0.6*keramahan + rnorm(n, 0, 1)
kepuasan <- cut(skor, breaks = quantile(skor, probs = c(0, 1/3, 2/3, 1)),
labels = c("Rendah","Sedang","Tinggi"), include.lowest = TRUE)
data_ordinal <- data.frame(kepuasan, tunggu, keramahan)
head(data_ordinal)
## kepuasan tunggu keramahan
## 1 Sedang 12.2 6.4
## 2 Rendah 13.8 6.2
## 3 Sedang 22.8 6.5
## 4 Sedang 15.4 7.1
## 5 Sedang 15.6 9.4
## 6 Rendah 23.6 6.9
model_ordinal <- polr(kepuasan ~ tunggu + keramahan, data = data_ordinal, Hess = TRUE)
summary(model_ordinal)
## Call:
## polr(formula = kepuasan ~ tunggu + keramahan, data = data_ordinal,
## Hess = TRUE)
##
## Coefficients:
## Value Std. Error t value
## tunggu -0.2646 0.03571 -7.411
## keramahan 1.0094 0.11655 8.661
##
## Intercepts:
## Value Std. Error t value
## Rendah|Sedang 2.1704 0.7906 2.7453
## Sedang|Tinggi 4.3964 0.8311 5.2901
##
## Residual Deviance: 401.5673
## AIC: 409.5673
coef_tab <- coef(summary(model_ordinal))
p_val <- pnorm(abs(coef_tab[, "t value"]), lower.tail = FALSE) * 2
cbind(coef_tab, p_value = p_val)
## Value Std. Error t value p_value
## tunggu -0.2646265 0.03570925 -7.410588 1.257409e-13
## keramahan 1.0093821 0.11654694 8.660734 4.687347e-18
## Rendah|Sedang 2.1704122 0.79059752 2.745281 6.045914e-03
## Sedang|Tinggi 4.3964351 0.83107451 5.290061 1.222754e-07
exp(coef(model_ordinal))
## tunggu keramahan
## 0.7674925 2.7439050
Koefisien tunggu negatif menunjukkan semakin lama waktu
tunggu, semakin rendah peluang berada pada kategori kepuasan yang lebih
tinggi. Koefisien keramahan positif menunjukkan semakin
tinggi skor keramahan staf, semakin besar peluang pelanggan berada pada
kategori kepuasan yang lebih tinggi. Nilai odds ratio menggambarkan
perubahan odds kumulatif untuk berada pada kategori kepuasan yang lebih
tinggi atau sama.
Regresi Poisson digunakan ketika variabel respon berupa data hitung (count data), seperti jumlah kejadian dalam periode tertentu. Contoh kasus: jumlah keluhan pelanggan per bulan diprediksi oleh jumlah transaksi dan skor kualitas layanan.
\[ \ln(\mu_i) = \beta_0 + \beta_1 \text{Transaksi}_i + \beta_2 \text{Kualitas}_i \]
dengan \(\mu_i = E(Y_i)\) adalah rata-rata jumlah keluhan.
set.seed(123)
n <- 200
transaksi <- round(rnorm(n, 100, 20))
kualitas <- round(rnorm(n, 7, 1.5), 1)
lin_pred <- 0.5 + 0.01*transaksi - 0.25*kualitas
mu <- exp(lin_pred)
keluhan <- rpois(n, mu)
data_poisson <- data.frame(keluhan, transaksi, kualitas)
head(data_poisson)
## keluhan transaksi kualitas
## 1 0 89 10.3
## 2 0 95 9.0
## 3 0 131 6.6
## 4 0 101 7.8
## 5 0 103 6.4
## 6 4 134 6.3
model_poisson <- glm(keluhan ~ transaksi + kualitas, data = data_poisson, family = poisson(link = "log"))
summary(model_poisson)
##
## Call:
## glm(formula = keluhan ~ transaksi + kualitas, family = poisson(link = "log"),
## data = data_poisson)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 0.385873 0.563068 0.685 0.493152
## transaksi 0.006729 0.004171 1.613 0.106702
## kualitas -0.184442 0.053369 -3.456 0.000548 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 207.23 on 199 degrees of freedom
## Residual deviance: 192.33 on 197 degrees of freedom
## AIC: 458.61
##
## Number of Fisher Scoring iterations: 5
dispersi <- sum(residuals(model_poisson, type = "pearson")^2) / model_poisson$df.residual
dispersi
## [1] 0.8602821
Koefisien transaksi positif menunjukkan semakin banyak
transaksi, semakin tinggi rata-rata jumlah keluhan (risiko keluhan
meningkat seiring volume layanan). Koefisien kualitas
negatif menunjukkan semakin tinggi skor kualitas layanan, semakin rendah
rata-rata jumlah keluhan. Nilai rasio dispersi mendekati 1
mengindikasikan asumsi equidispersion model Poisson cukup terpenuhi;
jika jauh melebihi 1, model quasi-Poisson atau binomial negatif dapat
dipertimbangkan.
Empat model di atas mengilustrasikan bagaimana bentuk skala variabel respon menentukan pilihan model regresi: biner untuk dua kategori, multinomial untuk kategori nominal lebih dari dua, ordinal untuk kategori berjenjang, dan Poisson untuk data hitung. Setiap model menggunakan fungsi penghubung (link function) yang sesuai dengan distribusi variabel responnya, dan interpretasi koefisien dilakukan melalui odds ratio (logistik) atau rasio rata-rata (Poisson, melalui eksponensiasi koefisien).