Το dataset αφορά την αγορά μεταχειρισμένων αυτοκινήτων. Περιέχει πληροφορίες σχετικά με την τιμή πώλησης, την ηλικία, τον τύπο καυσίμου, τον τύπο μετάδοσης και άλλα χαρακτηριστικά του οχήματος.
library(caret)
library(tidyverse)
# Εισαγωγή δεδομένων
data <- read.csv("car data.csv")
# Αφαίρεση μεταβλητής Car_Name
data <- data %>% select(-Car_Name)
# Δημιουργία μεταβλητής-στόχου
mean_price <- mean(data$Selling_Price)
data$High_Price <- ifelse(data$Selling_Price > mean_price, 1, 0)
data$High_Price <- factor(data$High_Price)
# Διαχωρισμός σε training και testing sets (65%) με seed = 909
set.seed(909)
index <- createDataPartition(data$High_Price, p = 0.65, list = FALSE)
train <- data[index, ]
test <- data[-index, ]
# Πλήρης συμβατότητα levels στις κατηγορικές μεταβλητές
categorical_vars <- c("Fuel_Type", "Seller_Type", "Transmission")
for (var in categorical_vars) {
train[[var]] <- factor(train[[var]])
test[[var]] <- factor(test[[var]], levels = levels(train[[var]]))
}
# Μέγεθος σετ
cat("Αριθμός παρατηρήσεων στο training set:", nrow(train), "\n")
## Αριθμός παρατηρήσεων στο training set: 196
cat("Αριθμός παρατηρήσεων στο testing set:", nrow(test), "\n")
## Αριθμός παρατηρήσεων στο testing set: 105
# Ποσοστά ανά κατηγορία
prop.table(table(train$High_Price))
##
## 0 1
## 0.5969388 0.4030612
prop.table(table(test$High_Price))
##
## 0 1
## 0.6 0.4
# Εκπαίδευση μοντέλου
model <- glm(High_Price ~ . -Selling_Price, data = train, family = "binomial")
## Warning: glm.fit: fitted probabilities numerically 0 or 1 occurred
# Αποτελέσματα
summary(model)
##
## Call:
## glm(formula = High_Price ~ . - Selling_Price, family = "binomial",
## data = train)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -3.303e+03 8.576e+02 -3.852 0.000117 ***
## Year 1.638e+00 4.251e-01 3.854 0.000116 ***
## Present_Price 8.466e-01 2.042e-01 4.146 3.38e-05 ***
## Kms_Driven -2.759e-05 2.498e-05 -1.104 0.269513
## Fuel_TypePetrol -2.953e+00 9.447e-01 -3.126 0.001775 **
## Seller_TypeIndividual -9.462e+00 3.035e+01 -0.312 0.755184
## TransmissionManual 2.797e-01 1.348e+00 0.207 0.835625
## Owner 1.973e+00 4.743e+00 0.416 0.677421
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 264.299 on 195 degrees of freedom
## Residual deviance: 58.238 on 188 degrees of freedom
## AIC: 74.238
##
## Number of Fisher Scoring iterations: 13
Από το μοντέλο προκύπτουν τα εξής:
Fuel_Type,
Transmission, Owner και
Kms_Driven δεν είναι στατιστικά σημαντικές.# Πρόβλεψη πιθανοτήτων
predictTest <- predict(model, newdata = test, type = "response")
# Μετατροπή σε προβλέψεις (0/1)
predictedClass <- ifelse(predictTest > 0.5, 1, 0)
predictedClass <- factor(predictedClass, levels = c(0,1))
# Πίνακας σύγχυσης
confusionMatrix(predictedClass, test$High_Price)
## Confusion Matrix and Statistics
##
## Reference
## Prediction 0 1
## 0 56 5
## 1 5 37
##
## Accuracy : 0.9029
## 95% CI : (0.8287, 0.9525)
## No Information Rate : 0.5922
## P-Value [Acc > NIR] : 2.455e-12
##
## Kappa : 0.799
##
## Mcnemar's Test P-Value : 1
##
## Sensitivity : 0.9180
## Specificity : 0.8810
## Pos Pred Value : 0.9180
## Neg Pred Value : 0.8810
## Prevalence : 0.5922
## Detection Rate : 0.5437
## Detection Prevalence : 0.5922
## Balanced Accuracy : 0.8995
##
## 'Positive' Class : 0
##
predict(model, type = "response");Η predict() επιστρέφει την πιθανότητα η
κάθε παρατήρηση του test set να ανήκει στην κατηγορία
High_Price = 1. Αν η πιθανότητα είναι πάνω από 0.5, τότε η
πρόβλεψη είναι ότι το αυτοκίνητο θα πωληθεί σε υψηλή τιμή. Αν είναι κάτω
από 0.5, η πρόβλεψη είναι “χαμηλή τιμή”.
Το μοντέλο επιτρέπει ικανοποιητική πρόβλεψη για το αν ένα αυτοκίνητο
ανήκει στην κατηγορία “High Price”. Οι μεταβλητές
Present_Price, Year και
Seller_Type αναδείχθηκαν ως οι πιο καθοριστικοί
παράγοντες.