Περιγραφή Dataset

Το dataset αφορά την αγορά μεταχειρισμένων αυτοκινήτων. Περιέχει πληροφορίες σχετικά με την τιμή πώλησης, την ηλικία, τον τύπο καυσίμου, τον τύπο μετάδοσης και άλλα χαρακτηριστικά του οχήματος.

Μεταβλητές του dataset:

  • Year: Έτος κατασκευής
  • Selling_Price: Τιμή πώλησης του αυτοκινήτου
  • Present_Price: Αρχική τιμή του αυτοκινήτου
  • Kms_Driven: Αριθμός χιλιομέτρων που έχει διανύσει
  • Fuel_Type: Τύπος καυσίμου
  • Seller_Type: Τύπος πωλητή
  • Transmission: Τύπος μετάδοσης
  • Owner: Αριθμός προηγούμενων ιδιοκτητών
  • High_Price: Νέα μεταβλητή-στόχος (1 = πάνω από μέση τιμή, 0 = κάτω)

Επεξεργασία 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

Ερμηνεία σημαντικών μεταβλητών:

Από το μοντέλο προκύπτουν τα εξής:

  • Present_Price: p < 0.001 → Πολύ σημαντική μεταβλητή. Όσο αυξάνεται η αρχική τιμή, αυξάνεται και η πιθανότητα υψηλής πώλησης.
  • Year: p < 0.001 → Σημαντική. Τα νεότερα αυτοκίνητα έχουν μεγαλύτερη πιθανότητα να πωλούνται ακριβά.
  • Seller_Type (Individual): p ≈ 0.019 → Σημαντική και αρνητική συσχέτιση. Ιδιώτες πωλούν φθηνότερα σε σχέση με επαγγελματίες.
  • ❌ Οι υπόλοιπες μεταβλητές όπως Fuel_Type, Transmission, Owner και Kms_Driven δεν είναι στατιστικά σημαντικές.

Πρόβλεψη στο Test Set

# Πρόβλεψη πιθανοτήτων
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 αναδείχθηκαν ως οι πιο καθοριστικοί παράγοντες.