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.
Variabel dependen: - class (unacc < acc < good
< vgood)
Variabel independen: - buying - maint - doors - persons - lug_boot - safety
#install.packages("MASS")
#install.packages("ordinal")
#install.packages("broom")
library(MASS)
library(ordinal)
library(broom)
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
#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")
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 ...
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.
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.
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.
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
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")
barplot(table(data$class),
main = "Distribusi Kelayakan Mobil",
col = "lightblue")
barplot(table(data$safety, data$class),
beside = TRUE,
col = c("red","yellow","green"),
legend = TRUE,
main = "Safety vs Kelayakan Mobil")
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.
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 <- 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))
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.