Analisis Regresi Logistik

Gania Zarakova Vijkonavo

01 June 2026

1 Pendahuluan

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:

  1. Regresi Logistik Biner
  2. Regresi Logistik Multinomial
  3. Regresi Logistik Ordinal
  4. Regresi Poisson

menggunakan dataset publik yang umum digunakan dalam statistika dan machine learning.

2 Package yang Digunakan

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"

3 Regresi Logistik Biner

3.1 Konsep Dasar

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.


3.2 Deskripsi Dataset

Dataset yang digunakan adalah Mushroom Dataset dari UCI Repository.

Dataset ini digunakan untuk mengklasifikasikan jamur menjadi:

berdasarkan karakteristik fisiknya.

Variabel prediktor:

Variabel respons:


3.3 Import dan Persiapan Data

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.


3.4 Exploratory Data Analysis

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.


3.5 Pemodelan

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.


3.6 Odds Ratio

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"
    )
  )
Odds Ratio
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.


3.7 Evaluasi Model

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.


3.8 ROC Curve

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.

4 Regresi Logistik Multinomial

4.1 Konsep Dasar

Regresi logistik multinomial digunakan ketika variabel respons memiliki lebih dari dua kategori tanpa urutan.


4.2 Import Dataset

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 <- NULL

4.3 Pemodelan

set.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.


4.4 Evaluasi Model

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.

5 Regresi Logistik Ordinal

5.1 Konsep Dasar

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.


5.2 Import Dataset

## 3.2 Import Dataset
# 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 ...
# Dimensi data
dim(student)
## [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.


5.3 Uji Brant

brant(model_ordinal)
## -------------------------------------------- 
## 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.


5.4 Evaluasi Model

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).


5.5 Import Dataset

# 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.


5.6 Uji Overdispersi

dispersiontest(model_poisson)
## 
##  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.


5.7 IRR

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"
    )
  )
Incidence Rate Ratio
Variabel IRR
(Intercept) (Intercept) 19896205
hour hour 1

Interpretasi:

IRR menunjukkan perubahan rata-rata jumlah kejadian akibat perubahan variabel prediktor.


5.8 Visualisasi Prediksi

pred_poisson <- predict(
  model_poisson,
  type="response"
)

plot(
  pred_poisson,
  type="l",
  col="#ff4f93",
  lwd=2,
  main="Prediksi Jumlah Sepeda",
  ylab="Prediksi",
  xlab="Observasi"
)

6 Kesimpulan

Berdasarkan hasil analisis yang telah dilakukan, dapat disimpulkan bahwa:

  1. Regresi logistik biner sangat efektif digunakan untuk klasifikasi dua kategori.

  2. Regresi logistik multinomial mampu mengklasifikasikan berbagai kategori hewan dengan baik.

  3. Regresi logistik ordinal sesuai digunakan untuk data kategorik berurutan.

  4. 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.

7 Referensi