Pendahuluan

Analisis ini bertujuan untuk memodelkan hubungan antara karakteristik mobil dengan tingkat kelayakan mobil menggunakan metode Ordinal Logistic Regression.

Dataset yang digunakan adalah Car Evaluation Dataset yang memiliki variabel dependen berskala ordinal.

Data dan Variabel

Variabel dependen: - class (unacc < acc < good < vgood)

Variabel independen: - buying - maint - doors - persons - lug_boot - safety

Import Library

#install.packages("MASS")
#install.packages("ordinal")
#install.packages("broom")
library(MASS)
library(ordinal)
library(broom)

Load Dataset

data <- read.csv("car_evaluation.csv", header = FALSE)
head(data)
##      V1    V2 V3 V4    V5   V6    V7
## 1 vhigh vhigh  2  2 small  low unacc
## 2 vhigh vhigh  2  2 small  med unacc
## 3 vhigh vhigh  2  2 small high unacc
## 4 vhigh vhigh  2  2   med  low unacc
## 5 vhigh vhigh  2  2   med  med unacc
## 6 vhigh vhigh  2  2   med high unacc

###Rename Kolom

colnames(data) <- c("buying", "maint", "doors", "persons", "lug_boot", "safety", "class")
head(data)
##   buying maint doors persons lug_boot safety class
## 1  vhigh vhigh     2       2    small    low unacc
## 2  vhigh vhigh     2       2    small    med unacc
## 3  vhigh vhigh     2       2    small   high unacc
## 4  vhigh vhigh     2       2      med    low unacc
## 5  vhigh vhigh     2       2      med    med unacc
## 6  vhigh vhigh     2       2      med   high unacc

Pre Processing Data

#Mengubah ke faktor
data[] <- lapply(data, as.factor)
# Gabung kategori
data$buying2 <- ifelse(data$buying %in% c("vhigh","high"), "High", "Low")
data$maint2  <- ifelse(data$maint %in% c("vhigh","high"), "High", "Low")
data$safety2 <- ifelse(data$safety == "low", "Low", "High")
data$lug_boot2 <- ifelse(data$lug_boot == "small", "Small", "Big")

data$buying2 <- factor(data$buying2, levels = c("High","Low"))
data$maint2  <- factor(data$maint2,  levels = c("High","Low"))
data$safety2 <- factor(data$safety2, levels = c("High","Low"))
data$lug_boot2 <- factor(data$lug_boot2, levels = c("Big","Small"))

#Label doors and persons
levels(data$doors) <- c("2 Doors", "3 Doors", "4 Doors", "More Doors")
levels(data$persons) <- c("2 Persons", "4 Persons", "More Persons")
#Mengubah Target menjadi Ordinal
data$class <- factor(data$class,
                     levels = c("unacc","acc","good","vgood"),
                     ordered = TRUE)
barplot(table(data$class),
        main = "Distribusi Kelayakan Mobil",
        col = "lightblue")

Cek Struktur Data

str(data)
## 'data.frame':    1728 obs. of  11 variables:
##  $ buying   : Factor w/ 4 levels "high","low","med",..: 4 4 4 4 4 4 4 4 4 4 ...
##  $ maint    : Factor w/ 4 levels "high","low","med",..: 4 4 4 4 4 4 4 4 4 4 ...
##  $ doors    : Factor w/ 4 levels "2 Doors","3 Doors",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ persons  : Factor w/ 3 levels "2 Persons","4 Persons",..: 1 1 1 1 1 1 1 1 1 2 ...
##  $ lug_boot : Factor w/ 3 levels "big","med","small": 3 3 3 2 2 2 1 1 1 3 ...
##  $ safety   : Factor w/ 3 levels "high","low","med": 2 3 1 2 3 1 2 3 1 2 ...
##  $ class    : Ord.factor w/ 4 levels "unacc"<"acc"<..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ buying2  : Factor w/ 2 levels "High","Low": 1 1 1 1 1 1 1 1 1 1 ...
##  $ maint2   : Factor w/ 2 levels "High","Low": 1 1 1 1 1 1 1 1 1 1 ...
##  $ safety2  : Factor w/ 2 levels "High","Low": 2 1 1 2 1 1 2 1 1 2 ...
##  $ lug_boot2: Factor w/ 2 levels "Big","Small": 2 2 2 1 1 1 1 1 1 2 ...

Statistik Deskriptif

summary(data)
##    buying      maint            doors             persons     lug_boot  
##  high :432   high :432   2 Doors   :432   2 Persons   :576   big  :576  
##  low  :432   low  :432   3 Doors   :432   4 Persons   :576   med  :576  
##  med  :432   med  :432   4 Doors   :432   More Persons:576   small:576  
##  vhigh:432   vhigh:432   More Doors:432                                 
##   safety      class      buying2     maint2    safety2     lug_boot2   
##  high:576   unacc:1210   High:864   High:864   High:1152   Big  :1152  
##  low :576   acc  : 384   Low :864   Low :864   Low : 576   Small: 576  
##  med :576   good :  69                                                 
##             vgood:  65

Berdasarkan hasil statistik deskriptif, sebagian besar data berada pada kategori tidak layak (unacc). Variabel safety menunjukkan pola yang cukup dominan terhadap kelayakan mobil, di mana kategori keamanan rendah cenderung berkorelasi dengan kelas unacc. Selain itu, kapasitas penumpang dan harga juga menunjukkan distribusi yang berpengaruh terhadap klasifikasi kelayakan.

Frekuensi tiap Variabel

lapply(data, table)
## $buying
## 
##  high   low   med vhigh 
##   432   432   432   432 
## 
## $maint
## 
##  high   low   med vhigh 
##   432   432   432   432 
## 
## $doors
## 
##    2 Doors    3 Doors    4 Doors More Doors 
##        432        432        432        432 
## 
## $persons
## 
##    2 Persons    4 Persons More Persons 
##          576          576          576 
## 
## $lug_boot
## 
##   big   med small 
##   576   576   576 
## 
## $safety
## 
## high  low  med 
##  576  576  576 
## 
## $class
## 
## unacc   acc  good vgood 
##  1210   384    69    65 
## 
## $buying2
## 
## High  Low 
##  864  864 
## 
## $maint2
## 
## High  Low 
##  864  864 
## 
## $safety2
## 
## High  Low 
## 1152  576 
## 
## $lug_boot2
## 
##   Big Small 
##  1152   576

Analisis frekuensi dilakukan untuk mengetahui jumlah kemunculan masing-masing kategori pada setiap variabel. Hasil menunjukkan bahwa setiap variabel memiliki distribusi kategori yang relatif seimbang, namun beberapa kategori seperti safety rendah memiliki pengaruh yang lebih dominan terhadap variabel target.

Crosstab

table(data$safety, data$class)
##       
##        unacc acc good vgood
##   high   277 204   30    65
##   low    576   0    0     0
##   med    357 180   39     0
table(data$buying, data$class)
##        
##         unacc acc good vgood
##   high    324 108    0     0
##   low     258  89   46    39
##   med     268 115   23    26
##   vhigh   360  72    0     0
table(data$persons, data$class)
##               
##                unacc acc good vgood
##   2 Persons      576   0    0     0
##   4 Persons      312 198   36    30
##   More Persons   322 186   33    35

Crosstab digunakan untuk melihat hubungan awal antara variabel independen dengan variabel dependen. Berdasarkan hasil crosstab, terlihat bahwa variabel safety memiliki hubungan yang kuat dengan tingkat kelayakan mobil, di mana kategori keamanan rendah didominasi oleh kelas unacc. Hal ini menunjukkan bahwa keamanan merupakan faktor penting dalam menentukan kelayakan mobil.

Distribusi tabel

table(data$class)
## 
## unacc   acc  good vgood 
##  1210   384    69    65
prop.table(table(data$class))
## 
##      unacc        acc       good      vgood 
## 0.70023148 0.22222222 0.03993056 0.03761574

Distribusi semua variabel

lapply(data[, c("buying","maint","doors","persons","lug_boot","safety")], table)
## $buying
## 
##  high   low   med vhigh 
##   432   432   432   432 
## 
## $maint
## 
##  high   low   med vhigh 
##   432   432   432   432 
## 
## $doors
## 
##    2 Doors    3 Doors    4 Doors More Doors 
##        432        432        432        432 
## 
## $persons
## 
##    2 Persons    4 Persons More Persons 
##          576          576          576 
## 
## $lug_boot
## 
##   big   med small 
##   576   576   576 
## 
## $safety
## 
## high  low  med 
##  576  576  576

Distribusi variabel menunjukkan proporsi masing-masing kategori dalam dataset. Hasil menunjukkan bahwa kategori unacc memiliki proporsi terbesar dibandingkan kategori lainnya, yang mengindikasikan bahwa sebagian besar mobil dalam dataset tidak memenuhi kriteria kelayakan. ## Visualisasi Distribusi Indpenden

par(mfrow = c(2,3))

barplot(table(data$buying), main="Buying", col="skyblue")
barplot(table(data$maint), main="Maint", col="salmon")
barplot(table(data$doors), main="Doors", col="lightgreen")
barplot(table(data$persons), main="Persons", col="orange")
barplot(table(data$lug_boot), main="Lug Boot", col="purple")
barplot(table(data$safety), main="Safety", col="pink")

Visualisasi Distribusi Variabel Dependen

barplot(table(data$class),
        main = "Distribusi Kelayakan Mobil",
        col = "lightblue")

Hubungan Safety dengan kelayakan mobil

barplot(table(data$safety, data$class),
        beside = TRUE,
        col = c("red","yellow","green"),
        legend = TRUE,
        main = "Safety vs Kelayakan Mobil")

Hubungan Persons dengan kelayakan

barplot(table(data$persons, data$class),
        beside = TRUE,
        col = c("pink","lightblue","lightgreen"),
        legend = TRUE,
        main = "Persons vs Kelayakan Mobil")

## Keseimbangan Kategori Variabel

prop.table(table(data$class))
## 
##      unacc        acc       good      vgood 
## 0.70023148 0.22222222 0.03993056 0.03761574
prop.table(table(data$buying))
## 
##  high   low   med vhigh 
##  0.25  0.25  0.25  0.25
prop.table(table(data$maint))
## 
##  high   low   med vhigh 
##  0.25  0.25  0.25  0.25
prop.table(table(data$safety))
## 
##      high       low       med 
## 0.3333333 0.3333333 0.3333333

Analisis keseimbangan kategori dilakukan untuk mengetahui apakah terdapat ketimpangan distribusi pada variabel. Hasil menunjukkan bahwa terdapat beberapa kategori yang lebih dominan dibandingkan kategori lainnya, sehingga perlu diperhatikan dalam interpretasi model.

Hubungan variabel dengan target

prop.table(table(data$safety, data$class), margin = 1)
##       
##             unacc        acc       good      vgood
##   high 0.48090278 0.35416667 0.05208333 0.11284722
##   low  1.00000000 0.00000000 0.00000000 0.00000000
##   med  0.61979167 0.31250000 0.06770833 0.00000000
prop.table(table(data$buying, data$class), margin = 1)
##        
##              unacc        acc       good      vgood
##   high  0.75000000 0.25000000 0.00000000 0.00000000
##   low   0.59722222 0.20601852 0.10648148 0.09027778
##   med   0.62037037 0.26620370 0.05324074 0.06018519
##   vhigh 0.83333333 0.16666667 0.00000000 0.00000000
prop.table(table(data$persons, data$class), margin = 1)
##               
##                     unacc        acc       good      vgood
##   2 Persons    1.00000000 0.00000000 0.00000000 0.00000000
##   4 Persons    0.54166667 0.34375000 0.06250000 0.05208333
##   More Persons 0.55902778 0.32291667 0.05729167 0.06076389

Analisis ini menunjukkan hubungan proporsi antara variabel independen dengan variabel dependen. Terlihat bahwa variabel safety dan persons memiliki pengaruh yang signifikan terhadap tingkat kelayakan mobil, di mana peningkatan kategori pada variabel tersebut cenderung meningkatkan peluang mobil berada pada kategori kelayakan yang lebih tinggi.

Model Ordinal Logistic Regression

model <- polr(class ~ buying2 + maint2 + doors + persons + lug_boot2 + safety2,
              data = data,
              Hess = TRUE)
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
par(mfrow = c(1,1))

Visualisasi Koefisien Model

coef_val <- coef(model)
barplot(coef_val,
        main = "Koefisien Model Ordinal Logistic Regression",
        col = "lightblue",
        las = 1)

## Output model

summary(model)
## Call:
## polr(formula = class ~ buying2 + maint2 + doors + persons + lug_boot2 + 
##     safety2, data = data, Hess = TRUE)
## 
## Coefficients:
##                       Value Std. Error    t value
## buying2Low            3.937  2.417e-01  1.629e+01
## maint2Low             3.270  2.162e-01  1.513e+01
## doors3 Doors          0.999  2.485e-01  4.020e+00
## doors4 Doors          1.371  2.490e-01  5.505e+00
## doorsMore Doors       1.371  2.490e-01  5.505e+00
## persons4 Persons     28.485  1.159e-01  2.458e+02
## personsMore Persons  28.400  1.173e-01  2.421e+02
## lug_boot2Small       -2.318  2.063e-01 -1.124e+01
## safety2Low          -21.280  6.594e-07 -3.227e+07
## 
## Intercepts:
##            Value         Std. Error    t value      
## unacc|acc   3.060480e+01  1.626000e-01  1.882530e+02
## acc|good    3.554800e+01  3.427000e-01  1.037222e+02
## good|vgood  3.700650e+01  3.878000e-01  9.543580e+01
## 
## Residual Deviance: 1035.355 
## AIC: 1059.355
AIC(model)
## [1] 1059.355

Berdasarkan hasil model, variabel safety dan persons memiliki pengaruh yang paling signifikan terhadap tingkat kelayakan mobil. Nilai koefisien menunjukkan arah hubungan antara variabel independen dengan variabel dependen. Selain itu, nilai AIC yang diperoleh menunjukkan bahwa model cukup baik dalam menjelaskan hubungan antar variabel.