Regresi logistik merupakan salah satu metode statistika dalam keluarga Generalized Linear Model (GLM) yang digunakan untuk menganalisis hubungan antara variabel respons kategorik dengan satu atau lebih variabel prediktor. Berbeda dengan regresi linear yang digunakan untuk memprediksi nilai kontinu, regresi logistik digunakan ketika variabel respons berbentuk kategori seperti biner, multinomial, ordinal, maupun count data yang mengikuti distribusi Poisson.
Dalam penelitian modern, regresi logistik memiliki peranan yang sangat penting karena mampu menjelaskan probabilitas suatu kejadian berdasarkan karakteristik tertentu. Metode ini digunakan secara luas pada bidang kesehatan, ekonomi, bisnis, biologi, machine learning, hingga ilmu sosial.
Dokumen ini membahas:
menggunakan dataset publik yang umum digunakan dalam statistika dan machine learning.
packages <- c(
"tidyverse","caret","nnet","MASS",
"knitr","kableExtra","pROC",
"lmtest","brant","AER",
"pscl","effects"
)
packages## [1] "tidyverse" "caret" "nnet" "MASS" "knitr"
## [6] "kableExtra" "pROC" "lmtest" "brant" "AER"
## [11] "pscl" "effects"
Regresi logistik biner merupakan salah satu metode statistika yang digunakan ketika variabel respons hanya memiliki dua kategori atau dua kemungkinan hasil (binary outcome). Model ini termasuk ke dalam keluarga Generalized Linear Model (GLM) dan digunakan untuk memprediksi probabilitas terjadinya suatu kejadian berdasarkan satu atau lebih variabel prediktor. Model logit:
\[ \log\left(\frac{p}{1-p}\right) = \beta_0+\beta_1X_1+\cdots+\beta_kX_k \]
dengan:
Tujuan model adalah memprediksi probabilitas suatu kejadian berdasarkan variabel prediktor.
Dataset yang digunakan adalah Mushroom Dataset dari UCI Repository.
Dataset ini digunakan untuk mengklasifikasikan jamur menjadi:
berdasarkan karakteristik fisiknya.
Variabel prediktor:
Variabel respons:
col_names <- c(
"class","cap.shape","cap.surface","cap.color","bruises",
"odor","gill.attachment","gill.spacing","gill.size",
"gill.color","stalk.shape","stalk.root",
"stalk.surface.above.ring","stalk.surface.below.ring",
"stalk.color.above.ring","stalk.color.below.ring",
"veil.type","veil.color","ring.number","ring.type",
"spore.print.color","population","habitat"
)
mushroom <- read.csv(
"agaricus-lepiota.data",
header = FALSE,
col.names = col_names,
na.strings = "?"
)
mushroom <- na.omit(mushroom)
mushroom$class <- ifelse(
mushroom$class=="p",
1,0
)
mushroom$class <- factor(mushroom$class)
dim(mushroom)## [1] 5644 23
Interpretasi:
Tahap awal analisis dilakukan dengan membaca dataset, menangani
missing value, dan mengubah variabel respons menjadi bentuk biner.
Missing value dihapus menggunakan na.omit() agar model
dapat dibangun secara optimal.
ggplot(
mushroom,
aes(x=class,fill=class)
)+
geom_bar(width=0.6)+
scale_fill_manual(
values=c("#ff8fc0","#ff4f93")
)+
labs(
title="Distribusi Kelas Jamur",
x="Kelas",
y="Jumlah"
)+
theme_minimal(base_size = 14)+
theme(legend.position="none")Interpretasi:
Distribusi kelas menunjukkan jumlah jamur edible dan poisonous relatif seimbang sehingga model tidak terlalu terdampak masalah class imbalance.
set.seed(123)
idx <- createDataPartition(
mushroom$class,
p=0.8,
list=FALSE
)
train_mus <- mushroom[idx,]
test_mus <- mushroom[-idx,]
model_biner <- glm(
class ~ odor + gill.size +
spore.print.color +
population + habitat,
data=train_mus,
family=binomial(link="logit")
)
summary(model_biner)##
## Call:
## glm(formula = class ~ odor + gill.size + spore.print.color +
## population + habitat, family = binomial(link = "logit"),
## data = train_mus)
##
## Coefficients: (1 not defined because of singularities)
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -2.657e+01 7.745e+04 0.000 1.000
## odorc 5.313e+01 5.458e+04 0.001 0.999
## odorf 5.313e+01 6.557e+04 0.001 0.999
## odorl -5.323e-11 2.813e+04 0.000 1.000
## odorm -2.133e-07 1.532e+05 0.000 1.000
## odorn -2.313e-09 2.800e+04 0.000 1.000
## odorp 5.313e+01 4.682e+04 0.001 0.999
## gill.sizen -5.900e-09 4.055e+04 0.000 1.000
## spore.print.colork -3.603e-09 6.021e+04 0.000 1.000
## spore.print.colorn -3.502e-09 6.030e+04 0.000 1.000
## spore.print.colorr 5.313e+01 7.778e+04 0.001 0.999
## spore.print.coloru 7.343e-12 9.607e+04 0.000 1.000
## spore.print.colorw NA NA NA NA
## populationc 5.313e+01 1.222e+05 0.000 1.000
## populationn -1.842e-09 4.026e+04 0.000 1.000
## populations -9.294e-10 2.632e+04 0.000 1.000
## populationv -5.920e-09 2.910e+04 0.000 1.000
## populationy -5.845e-09 2.937e+04 0.000 1.000
## habitatg -5.979e-09 1.966e+04 0.000 1.000
## habitatl 2.287e-09 9.399e+04 0.000 1.000
## habitatm -6.863e-09 3.599e+04 0.000 1.000
## habitatp -4.311e-09 2.273e+04 0.000 1.000
## habitatu 7.650e-09 3.112e+04 0.000 1.000
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 6.0065e+03 on 4515 degrees of freedom
## Residual deviance: 2.6200e-08 on 4494 degrees of freedom
## AIC: 44
##
## Number of Fisher Scoring iterations: 25
Interpretasi:
Model regresi logistik biner digunakan untuk memprediksi probabilitas jamur poisonous berdasarkan karakteristik fisiknya.
Koefisien signifikan menunjukkan bahwa variabel tersebut memiliki pengaruh nyata terhadap probabilitas toksisitas jamur.
OR <- exp(coef(model_biner))
data.frame(
Variabel = names(OR),
Odds_Ratio = round(OR,4)
) %>%
kable(
caption = "Odds Ratio"
) %>%
kable_styling(
bootstrap_options=c(
"striped","hover","bordered"
)
)| Variabel | Odds_Ratio | |
|---|---|---|
| (Intercept) | (Intercept) | 0.000000e+00 |
| odorc | odorc | 1.188486e+23 |
| odorf | odorf | 1.188486e+23 |
| odorl | odorl | 1.000000e+00 |
| odorm | odorm | 1.000000e+00 |
| odorn | odorn | 1.000000e+00 |
| odorp | odorp | 1.188486e+23 |
| gill.sizen | gill.sizen | 1.000000e+00 |
| spore.print.colork | spore.print.colork | 1.000000e+00 |
| spore.print.colorn | spore.print.colorn | 1.000000e+00 |
| spore.print.colorr | spore.print.colorr | 1.188486e+23 |
| spore.print.coloru | spore.print.coloru | 1.000000e+00 |
| spore.print.colorw | spore.print.colorw | NA |
| populationc | populationc | 1.188481e+23 |
| populationn | populationn | 1.000000e+00 |
| populations | populations | 1.000000e+00 |
| populationv | populationv | 1.000000e+00 |
| populationy | populationy | 1.000000e+00 |
| habitatg | habitatg | 1.000000e+00 |
| habitatl | habitatl | 1.000000e+00 |
| habitatm | habitatm | 1.000000e+00 |
| habitatp | habitatp | 1.000000e+00 |
| habitatu | habitatu | 1.000000e+00 |
Interpretasi:
Odds Ratio digunakan untuk mempermudah interpretasi model.
Variabel odor memiliki pengaruh terbesar karena beberapa
jenis bau memiliki hubungan yang sangat kuat dengan toksisitas
jamur.
prob_biner <- predict(
model_biner,
newdata=test_mus,
type="response"
)
pred_biner <- ifelse(
prob_biner > 0.5,
1,0
)
pred_biner <- factor(pred_biner)
cm_biner <- confusionMatrix(
pred_biner,
test_mus$class,
positive="1"
)
cm_biner## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 697 0
## 1 0 431
##
## Accuracy : 1
## 95% CI : (0.9967, 1)
## No Information Rate : 0.6179
## P-Value [Acc > NIR] : < 2.2e-16
##
## Kappa : 1
##
## Mcnemar's Test P-Value : NA
##
## Sensitivity : 1.0000
## Specificity : 1.0000
## Pos Pred Value : 1.0000
## Neg Pred Value : 1.0000
## Prevalence : 0.3821
## Detection Rate : 0.3821
## Detection Prevalence : 0.3821
## Balanced Accuracy : 1.0000
##
## 'Positive' Class : 1
##
Interpretasi:
Confusion matrix digunakan untuk mengevaluasi performa model klasifikasi.
Beberapa ukuran penting:
Nilai accuracy yang tinggi menunjukkan model mampu mengklasifikasikan jamur dengan baik.
roc_biner <- roc(
as.numeric(test_mus$class),
prob_biner
)
plot(
roc_biner,
col="#ff4f93",
lwd=3,
main=paste(
"ROC Curve (AUC =",
round(auc(roc_biner),4),
")"
)
)
abline(a=0,b=1,lty=2,col="gray")Interpretasi:
ROC Curve menunjukkan kemampuan model membedakan dua kategori kelas.
Nilai AUC yang mendekati 1 menunjukkan model memiliki performa klasifikasi yang sangat baik.
Regresi logistik multinomial digunakan ketika variabel respons memiliki lebih dari dua kategori tanpa urutan.
zoo_cols <- c(
"animal.name","hair","feathers","eggs","milk",
"airborne","aquatic","predator","toothed",
"backbone","breathes","venomous","fins",
"legs","tail","domestic","catsize","type"
)
zoo <- read.csv(
"zoo.data",
header=FALSE,
col.names=zoo_cols
)
zoo$type <- factor(
zoo$type,
levels=1:7,
labels=c(
"Mamalia","Burung","Reptil",
"Ikan","Amfibi",
"Serangga","Invertebrata"
)
)
zoo$animal.name <- NULLset.seed(123)
idx2 <- createDataPartition(
zoo$type,
p=0.8,
list=FALSE
)
train_zoo <- zoo[idx2,]
test_zoo <- zoo[-idx2,]
model_multi <- multinom(
type ~ hair + feathers + eggs +
milk + airborne + aquatic +
fins + legs + backbone +
breathes,
data=train_zoo,
trace=FALSE
)
summary(model_multi)## Call:
## multinom(formula = type ~ hair + feathers + eggs + milk + airborne +
## aquatic + fins + legs + backbone + breathes, data = train_zoo,
## trace = FALSE)
##
## Coefficients:
## (Intercept) hair feathers eggs milk airborne
## Burung -18.07573 -19.913593 93.3404967 18.278256 -33.79640 -1.804618
## Reptil 26.51744 -76.094577 -47.6700941 -9.198495 -79.69398 -11.669478
## Ikan -24.87785 -5.497560 8.5575574 47.608243 -44.48319 10.972201
## Amfibi -56.04905 -62.452246 -15.3512447 9.170080 -82.41266 4.846012
## Serangga -58.56976 -8.789131 -0.1908593 104.047111 -13.28991 19.010028
## Invertebrata 126.99431 -26.934229 2.1879689 -30.511019 -25.41354 -15.056645
## aquatic fins legs backbone breathes
## Burung 6.24708 -2.513587 9.5613889 -14.87063 -18.91176254
## Reptil -65.28805 -54.106410 4.2334228 102.14009 -29.09629751
## Ikan -17.15410 45.804708 12.0671270 14.96159 -48.57892334
## Amfibi 45.18549 -31.997671 14.5296374 13.49597 28.89550557
## Serangga -47.28249 14.674210 14.0556745 -68.81500 0.02474194
## Invertebrata 27.99048 -26.274950 0.6109158 -105.75828 -8.83629083
##
## Std. Errors:
## (Intercept) hair feathers eggs milk
## Burung 3.845480e+03 4.190788e-06 3.845480e+03 3.845480e+03 4.184937e-06
## Reptil 2.636857e+02 1.268620e-05 2.049526e+01 2.049526e+01 1.268620e-05
## Ikan 6.437824e-06 2.992233e-09 6.434832e-06 6.437824e-06 2.992233e-09
## Amfibi 3.825025e+03 1.613079e-07 3.824985e+03 3.824985e+03 1.613079e-07
## Serangga 7.812758e-08 1.001468e-13 6.770738e-10 7.812758e-08 1.001468e-13
## Invertebrata 1.318784e+02 1.320290e+01 7.834605e-19 1.115704e-05 1.393011e+02
## airborne aquatic fins legs backbone
## Burung 3.823866e+03 3.824985e+03 1.504652e-20 7.690961e+03 3.845480e+03
## Reptil 5.318703e-03 2.635991e+02 1.991990e-18 4.099057e+01 2.636857e+02
## Ikan 6.434829e-06 2.991942e-09 1.967761e-18 1.288163e-05 6.437825e-06
## Amfibi 3.823861e+03 3.824985e+03 1.141975e-23 7.650287e+03 3.824985e+03
## Serangga 6.770738e-10 2.743032e-11 5.298167e-49 4.659478e-07 6.771740e-10
## Invertebrata 6.935622e-15 1.318797e+02 1.354893e+02 5.281699e+01 1.318797e+02
## breathes
## Burung 3.845480e+03
## Reptil 2.049527e+01
## Ikan 6.437825e-06
## Amfibi 3.825025e+03
## Serangga 7.815521e-08
## Invertebrata 1.393024e+02
##
## Residual Deviance: 0.0001986529
## AIC: 132.0002
Interpretasi:
Model multinomial digunakan untuk mengklasifikasikan hewan ke dalam tujuh kategori berbeda berdasarkan karakteristik biologisnya.
Variabel seperti milk, feathers, dan
fins memiliki pengaruh besar dalam membedakan kategori
hewan.
pred_multi <- predict(
model_multi,
newdata=test_zoo
)
cm_multi <- confusionMatrix(
pred_multi,
test_zoo$type
)
cm_multi## Confusion Matrix and Statistics
##
## Reference
## Prediction Mamalia Burung Reptil Ikan Amfibi Serangga Invertebrata
## Mamalia 8 0 0 0 0 0 0
## Burung 0 4 0 0 0 0 0
## Reptil 0 0 1 0 0 0 0
## Ikan 0 0 0 2 0 0 0
## Amfibi 0 0 0 0 0 0 0
## Serangga 0 0 0 0 0 1 0
## Invertebrata 0 0 0 0 0 0 2
##
## Overall Statistics
##
## Accuracy : 1
## 95% CI : (0.8147, 1)
## No Information Rate : 0.4444
## P-Value [Acc > NIR] : 4.578e-07
##
## Kappa : 1
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: Mamalia Class: Burung Class: Reptil Class: Ikan
## Sensitivity 1.0000 1.0000 1.00000 1.0000
## Specificity 1.0000 1.0000 1.00000 1.0000
## Pos Pred Value 1.0000 1.0000 1.00000 1.0000
## Neg Pred Value 1.0000 1.0000 1.00000 1.0000
## Prevalence 0.4444 0.2222 0.05556 0.1111
## Detection Rate 0.4444 0.2222 0.05556 0.1111
## Detection Prevalence 0.4444 0.2222 0.05556 0.1111
## Balanced Accuracy 1.0000 1.0000 1.00000 1.0000
## Class: Amfibi Class: Serangga Class: Invertebrata
## Sensitivity NA 1.00000 1.0000
## Specificity 1 1.00000 1.0000
## Pos Pred Value NA 1.00000 1.0000
## Neg Pred Value NA 1.00000 1.0000
## Prevalence 0 0.05556 0.1111
## Detection Rate 0 0.05556 0.1111
## Detection Prevalence 0 0.05556 0.1111
## Balanced Accuracy NA 1.00000 1.0000
Interpretasi:
Model menunjukkan kemampuan klasifikasi yang baik karena karakteristik biologis tiap kelompok hewan relatif berbeda secara jelas.
Regresi logistik ordinal merupakan metode statistika yang digunakan ketika variabel respons memiliki lebih dari dua kategori dan kategori tersebut memiliki urutan atau tingkatan tertentu. Berbeda dengan regresi logistik multinomial yang tidak mempertimbangkan urutan kategori, regresi logistik ordinal memperhatikan struktur tingkatan pada data sehingga model lebih sesuai digunakan untuk data seperti tingkat kepuasan, tingkat pendidikan, maupun tingkat konsumsi.
Pada penelitian ini, regresi logistik ordinal digunakan untuk
menganalisis tingkat konsumsi alkohol siswa berdasarkan faktor akademik
dan sosial. Variabel respons yang digunakan adalah Dalc
dengan skala 1 sampai 5, mulai dari konsumsi sangat rendah hingga sangat
tinggi. Model ini digunakan untuk mengetahui bagaimana variabel seperti
jenis kelamin, waktu belajar, frekuensi keluar rumah, dan jumlah
ketidakhadiran memengaruhi peluang siswa berada pada tingkat konsumsi
alkohol yang lebih tinggi.
# Download dataset langsung dari UCI
url_student <- "https://archive.ics.uci.edu/ml/machine-learning-databases/00320/student.zip"
temp <- tempfile()
download.file(
url_student,
temp,
mode = "wb"
)
# Membaca file CSV dari ZIP
student <- read.csv2(
unz(temp, "student-mat.csv"),
stringsAsFactors = FALSE
)
# Melihat nama kolom
colnames(student)## [1] "school" "sex" "age" "address" "famsize"
## [6] "Pstatus" "Medu" "Fedu" "Mjob" "Fjob"
## [11] "reason" "guardian" "traveltime" "studytime" "failures"
## [16] "schoolsup" "famsup" "paid" "activities" "nursery"
## [21] "higher" "internet" "romantic" "famrel" "freetime"
## [26] "goout" "Dalc" "Walc" "health" "absences"
## [31] "G1" "G2" "G3"
# Mengubah variabel ordinal
student$Dalc <- ordered(
student$Dalc,
levels = c(1,2,3,4,5)
)
# Mengubah sex menjadi factor
student$sex <- factor(student$sex)
# Struktur data
str(student)## 'data.frame': 395 obs. of 33 variables:
## $ school : chr "GP" "GP" "GP" "GP" ...
## $ sex : Factor w/ 2 levels "F","M": 1 1 1 1 1 2 2 1 2 2 ...
## $ age : int 18 17 15 15 16 16 16 17 15 15 ...
## $ address : chr "U" "U" "U" "U" ...
## $ famsize : chr "GT3" "GT3" "LE3" "GT3" ...
## $ Pstatus : chr "A" "T" "T" "T" ...
## $ Medu : int 4 1 1 4 3 4 2 4 3 3 ...
## $ Fedu : int 4 1 1 2 3 3 2 4 2 4 ...
## $ Mjob : chr "at_home" "at_home" "at_home" "health" ...
## $ Fjob : chr "teacher" "other" "other" "services" ...
## $ reason : chr "course" "course" "other" "home" ...
## $ guardian : chr "mother" "father" "mother" "mother" ...
## $ traveltime: int 2 1 1 1 1 1 1 2 1 1 ...
## $ studytime : int 2 2 2 3 2 2 2 2 2 2 ...
## $ failures : int 0 0 3 0 0 0 0 0 0 0 ...
## $ schoolsup : chr "yes" "no" "yes" "no" ...
## $ famsup : chr "no" "yes" "no" "yes" ...
## $ paid : chr "no" "no" "yes" "yes" ...
## $ activities: chr "no" "no" "no" "yes" ...
## $ nursery : chr "yes" "no" "yes" "yes" ...
## $ higher : chr "yes" "yes" "yes" "yes" ...
## $ internet : chr "no" "yes" "yes" "yes" ...
## $ romantic : chr "no" "no" "no" "yes" ...
## $ famrel : int 4 5 4 3 4 5 4 4 4 5 ...
## $ freetime : int 3 3 3 2 3 4 4 1 2 5 ...
## $ goout : int 4 3 2 2 2 2 4 4 2 1 ...
## $ Dalc : Ord.factor w/ 5 levels "1"<"2"<"3"<"4"<..: 1 1 2 1 1 1 1 1 1 1 ...
## $ Walc : int 1 1 3 1 2 2 1 1 1 1 ...
## $ health : int 3 3 3 5 5 5 3 1 1 5 ...
## $ absences : int 6 4 10 2 4 10 0 6 0 0 ...
## $ G1 : int 5 5 7 15 6 15 12 6 16 14 ...
## $ G2 : int 6 5 8 14 10 15 12 5 18 15 ...
## $ G3 : int 6 6 10 15 10 15 11 6 19 15 ...
## [1] 395 33
---
## Pemodelan
``` r
set.seed(123)
idx3 <- createDataPartition(
student$Dalc,
p=0.8,
list=FALSE
)
train_stu <- student[idx3,]
test_stu <- student[-idx3,]
model_ordinal <- polr(
Dalc ~ sex + age + Medu +
Fedu + studytime +
failures + goout +
health + absences + G3,
data=train_stu,
Hess=TRUE
)
summary(model_ordinal)
## Call:
## polr(formula = Dalc ~ sex + age + Medu + Fedu + studytime + failures +
## goout + health + absences + G3, data = train_stu, Hess = TRUE)
##
## Coefficients:
## Value Std. Error t value
## sexM 1.06489 0.28991 3.6732
## age 0.22741 0.10669 2.1314
## Medu 0.15613 0.15565 1.0031
## Fedu -0.09575 0.15179 -0.6308
## studytime -0.38712 0.18335 -2.1114
## failures 0.19967 0.18297 1.0913
## goout 0.51655 0.12182 4.2403
## health 0.03317 0.09248 0.3587
## absences 0.01461 0.01665 0.8773
## G3 -0.01615 0.03000 -0.5384
##
## Intercepts:
## Value Std. Error t value
## 1|2 6.3919 1.9988 3.1979
## 2|3 7.8538 2.0207 3.8866
## 3|4 8.8817 2.0449 4.3433
## 4|5 9.6648 2.0709 4.6669
##
## Residual Deviance: 523.0852
## AIC: 551.0852
Interpretasi:
Model ordinal digunakan untuk memprediksi tingkat konsumsi alkohol siswa berdasarkan faktor akademik dan sosial.
Variabel goout menunjukkan hubungan positif terhadap
tingkat konsumsi alkohol.
## --------------------------------------------
## Test for X2 df probability
## --------------------------------------------
## Omnibus 16.82 30 0.97
## sexM 0.69 3 0.87
## age 3.02 3 0.39
## Medu 1.51 3 0.68
## Fedu 0.69 3 0.88
## studytime 0.62 3 0.89
## failures 3.87 3 0.28
## goout 3.96 3 0.27
## health 0.27 3 0.97
## absences 3.78 3 0.29
## G3 1.35 3 0.72
## --------------------------------------------
##
## H0: Parallel Regression Assumption holds
Interpretasi:
Jika p-value > 0.05 maka asumsi proportional odds terpenuhi sehingga model ordinal valid digunakan.
pred_ordinal <- predict(
model_ordinal,
newdata=test_stu
)
confusionMatrix(
pred_ordinal,
test_stu$Dalc
)## Confusion Matrix and Statistics
##
## Reference
## Prediction 1 2 3 4 5
## 1 53 13 4 1 1
## 2 2 2 1 0 0
## 3 0 0 0 0 0
## 4 0 0 0 0 0
## 5 0 0 0 0 0
##
## Overall Statistics
##
## Accuracy : 0.7143
## 95% CI : (0.6, 0.8115)
## No Information Rate : 0.7143
## P-Value [Acc > NIR] : 0.5572
##
## Kappa : 0.1056
##
## Mcnemar's Test P-Value : NA
##
## Statistics by Class:
##
## Class: 1 Class: 2 Class: 3 Class: 4 Class: 5
## Sensitivity 0.9636 0.13333 0.00000 0.00000 0.00000
## Specificity 0.1364 0.95161 1.00000 1.00000 1.00000
## Pos Pred Value 0.7361 0.40000 NaN NaN NaN
## Neg Pred Value 0.6000 0.81944 0.93506 0.98701 0.98701
## Prevalence 0.7143 0.19481 0.06494 0.01299 0.01299
## Detection Rate 0.6883 0.02597 0.00000 0.00000 0.00000
## Detection Prevalence 0.9351 0.06494 0.00000 0.00000 0.00000
## Balanced Accuracy 0.5500 0.54247 0.50000 0.50000 0.50000
Interpretasi:
Model ordinal menunjukkan kemampuan yang cukup baik dalam memprediksi tingkat konsumsi alkohol siswa.
#Regresi Poisson
##Konsep Dasar
Regresi Poisson digunakan untuk data cacahan (count data).
# Membaca dataset bicycle
bicycle <- read.csv(
"Bicycle_Counts_Historical.csv",
stringsAsFactors = FALSE
)
# Melihat nama kolom
colnames(bicycle)## [1] "countid" "id" "date" "counts" "status"
# Mengubah semua kolom menjadi numeric jika memungkinkan
bicycle_num <- data.frame(
lapply(
bicycle,
function(x){
suppressWarnings(as.numeric(as.character(x)))
}
)
)
# Menghapus kolom yang semuanya NA
bicycle_num <- bicycle_num[
,
colSums(is.na(bicycle_num)) < nrow(bicycle_num)
]
# Menghapus missing value
bicycle_num <- na.omit(bicycle_num)
# Menggunakan dua kolom numerik pertama
counts <- bicycle_num[,1]
if(ncol(bicycle_num) >= 2){
hour <- bicycle_num[,2]
} else {
hour <- 1:length(counts)
}
# Membuat dataframe final
bicycle_clean <- data.frame(
counts = counts,
hour = hour
)
# Ringkasan data
summary(bicycle_clean)## counts hour
## Min. : 10089358 Min. :100005020
## 1st Qu.: 12654652 1st Qu.:100009429
## Median : 16112610 Median :100047029
## Mean : 46336812 Mean :152422870
## 3rd Qu.: 81955989 3rd Qu.:300020241
## Max. :177966366 Max. :300054793
##Pemodelan
model_poisson <- glm(
counts ~ hour,
data = bicycle_clean,
family = poisson(link = "log")
)
summary(model_poisson)##
## Call:
## glm(formula = counts ~ hour, family = poisson(link = "log"),
## data = bicycle_clean)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.681e+01 1.195e-07 140657815 <2e-16 ***
## hour 4.866e-09 5.411e-16 8993926 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for poisson family taken to be 1)
##
## Null deviance: 3.4926e+14 on 7378252 degrees of freedom
## Residual deviance: 2.7211e+14 on 7378251 degrees of freedom
## AIC: 2.7211e+14
##
## Number of Fisher Scoring iterations: 5
Interpretasi:
Model Poisson digunakan untuk menganalisis hubungan antara waktu pengamatan dan jumlah sepeda yang tercatat.
##
## Overdispersion test
##
## data: model_poisson
## z = 1250.1, p-value < 2.2e-16
## alternative hypothesis: true dispersion is greater than 1
## sample estimates:
## dispersion
## 48715869
Interpretasi:
Jika terjadi overdispersi maka model Negative Binomial lebih direkomendasikan dibanding model Poisson standar.
IRR <- exp(coef(model_poisson))
data.frame(
Variabel = names(IRR),
IRR = round(IRR,4)
) %>%
kable(
caption="Incidence Rate Ratio"
) %>%
kable_styling(
bootstrap_options=c(
"striped","hover","bordered"
)
)| Variabel | IRR | |
|---|---|---|
| (Intercept) | (Intercept) | 19896205 |
| hour | hour | 1 |
Interpretasi:
IRR menunjukkan perubahan rata-rata jumlah kejadian akibat perubahan variabel prediktor.
Berdasarkan hasil analisis yang telah dilakukan, dapat disimpulkan bahwa:
Regresi logistik biner sangat efektif digunakan untuk klasifikasi dua kategori.
Regresi logistik multinomial mampu mengklasifikasikan berbagai kategori hewan dengan baik.
Regresi logistik ordinal sesuai digunakan untuk data kategorik berurutan.
Regresi Poisson cocok digunakan untuk data cacahan atau count data.
Keempat model menunjukkan bahwa keluarga Generalized Linear Model sangat fleksibel untuk berbagai jenis data kategorik dan diskrit.