Το παρόν Case Study εξετάζει την κερδοφορία αεροπορικών δρομολογίων από το Ντουμπάι (DXB). Με βάση τη θεωρία του μαθήματος για τον Δικαστή Stevens, θα εφαρμόσουμε τη μέθοδο CART για να προβλέψουμε αν μια πτήση θα είναι κερδοφόρα ή όχι.
Πλήθος εγγραφών: > 7.500 πτήσεις.
Ανεξάρτητες Μεταβλητές: Load_Factor (πληρότητα), Flight_Hours (διάρκεια), Route_Category (τύπος δρομολογίου), Aircraft_Type (μοντέλο αεροσκάφους).
Εξαρτημένη Μεταβλητή: Δημιουργούμε τη μεταβλητή IsProfitable (1 αν το Profit_Margin > 0, 0 αλλιώς).
# Φόρτωση δεδομένων
train_raw <- read.csv("airline_route_train.csv")
test_raw <- read.csv("airline_route_test.csv")
# Δημιουργία Binary μεταβλητής (όπως η Reverse στη θεωρία Stevens)
train_raw$IsProfitable <- as.factor(ifelse(train_raw$Profit_Margin > 0, 1, 0))
test_raw$IsProfitable <- as.factor(ifelse(test_raw$Profit_Margin > 0, 1, 0))
# Επιλογή βασικών μεταβλητών για το μοντέλο
train <- train_raw %>% select(IsProfitable, Load_Factor, Flight_Hours, Route_Category, Aircraft_Type)
test <- test_raw %>% select(IsProfitable, Load_Factor, Flight_Hours, Route_Category, Aircraft_Type)Πριν το χτίσιμο του μοντέλου, εξετάζουμε τη δομή των δεδομένων μας. Στόχος είναι να δούμε πώς κατανέμεται η κερδοφορία στις πτήσεις μας.
## 0 1
## 2162 4217
# Baseline Accuracy: Πρόβλεψη πάντα της πλειοψηφικής κλάσης
baseline_acc <- max(table(train$IsProfitable)) / nrow(train)
cat("Baseline Accuracy (Πρόβλεψη Κέρδους):", round(baseline_acc, 3))## Baseline Accuracy (Πρόβλεψη Κέρδους): 0.661
Όπως αναφέρεται στη θεωρία, η Λογιστική Παλινδρόμηση είναι ισχυρή αλλά υστερεί σε ερμηνευσιμότητα. Παρόλο που η λογιστική παλινδρόμηση στην προηγούμενη εργασία μας έδωσε υψηλή ακρίβεια, το μοντέλο CART μας επιτρέπει να δούμε ακριβώς ποια κατώφλια (thresholds) χρησιμοποιεί ο αλγόριθμος (π.χ. Load Factor > 0.72) για να πάρει μια απόφαση, κάτι που η παλινδρόμηση αδυνατεί να δείξει με τόση σαφήνεια.
LogModel <- glm(IsProfitable ~ ., data = train, family = "binomial")
# Πρόβλεψη στο test set
predictLog <- predict(LogModel, newdata = test, type = "response")
table(test$IsProfitable, predictLog > 0.5)##
## FALSE TRUE
## 0 670 283
## 1 199 1719
Σχολιασμός: Οι συντελεστές της παλινδρόμησης μας δείχνουν συσχέτιση (π.χ. όσο αυξάνεται το Load_Factor, αυξάνεται η πιθανότητα κέρδους), αλλά δεν μας δίνουν έναν σαφή “οδικό χάρτη” αποφάσεων όπως ένα δέντρο.
Χρησιμοποιούμε τη βιβλιοθήκη rpart με τη μέθοδο class και ορίζουμε ένα αρχικό minbucket. Επιλέξαμε αρχικά minbucket = 50 για να αποφύγουμε το overfitting, διασφαλίζοντας ότι κάθε “φύλλο” του δέντρου έχει τουλάχιστον 50 παρατηρήσεις.
# Κατασκευή δέντρου
AirlineTree <- rpart(IsProfitable ~ ., data = train, method = "class", minbucket = 50)
# Οπτικοποίηση δέντρου
prp(AirlineTree, main = "Δέντρο Απόφασης Κερδοφορίας Πτήσεων")Route_Ca (Route Category): Η κατηγορία του δρομολογίου.
Το ShH σημαίνει Short Haul (πτήσεις μικρών αποστάσεων).
Flight_H (Flight Hours): Η διάρκεια της πτήσης σε ώρες.
Load_Fac (Load Factor): Το ποσοστό πληρότητας του αεροσκάφους (π.χ. 0.83 σημαίνει 83% πληρότητα).0 (Στο κάτω μέρος - φύλλα):
(Στο κάτω μέρος - φύλλα): Πρόβλεψη για Ζημία (Όταν το Profit Margin \(\leq\) 0) => 0
(Στο κάτω μέρος - φύλλα): Πρόβλεψη για Κέρδος (Όταν το Profit Margin \(>\) 0) => 1
Στο παραπάνω διάγραμμα παρατηρούμε πως η εφαρμογή του μοντέλου CART ανέδειξε μια ιεραρχική δομή αποφάσεων όπου η κατηγορία του δρομολογίου και η διάρκεια πτήσης λειτουργούν ως καθοριστικά φίλτρα βιωσιμότητας πριν καν εξεταστεί η πληρότητα (Load Factor).
Για να αποφύγουμε το overfitting, θα χρησιμοποιήσουμε k-fold Cross-Validation για να βρούμε την ιδανική παράμετρο πολυπλοκότητας (cp).
set.seed(160)
# Ορισμός 10-fold CV
numFolds <- trainControl(method = "cv", number = 10)
cpGrid <- expand.grid(.cp = seq(0.001, 0.1, 0.005))
# Εκπαίδευση με Cross-Validation
trainCV <- train(IsProfitable ~ ., data = train, method = "rpart",
trControl = numFolds, tuneGrid = cpGrid)
best_cp <- trainCV$bestTune$cp
cat("Βέλτιστο CP βάσει Cross-Validation:", best_cp)## Βέλτιστο CP βάσει Cross-Validation: 0.001
# Προβλέψεις στο test set
PredictCV <- predict(AirlineTreeCV, newdata = test, type = "class")
# Confusion Matrix
conf_matrix <- table(test$IsProfitable, PredictCV)
print(conf_matrix)## PredictCV
## 0 1
## 0 643 310
## 1 159 1759
# Υπολογισμός Ακρίβειας (Accuracy)
accuracy <- sum(diag(conf_matrix)) / sum(conf_matrix)
cat("Ακρίβεια Μοντέλου CART μετά το CV:", round(accuracy, 3))## Ακρίβεια Μοντέλου CART μετά το CV: 0.837
PredictROC <- predict(AirlineTreeCV, newdata = test)
pred <- prediction(PredictROC[,2], test$IsProfitable)
perf <- performance(pred, "tpr", "fpr")
plot(perf, colorize = TRUE, main = "ROC Curve - Airline Profitability")
abline(a=0, b=1, lty=2)## AUC Value: 0.883
| Μοντέλο | Ακρίβεια (Accuracy) | Δείκτης AUC |
| Baseline Model | 0.661 | - |
| Λογιστική Παλινδρόμηση | 0.832 | 0.908 |
| Simple CART (minbucket=50) | 0.819 | 0.837 |
| CART (με Cross-Validation) | 0.819 | 0.883 |
Απόδοση Μοντέλων: Όλα τα μοντέλα που αναπτύχθηκαν υπερέχουν σημαντικά του Baseline μοντέλου (0.668), γεγονός που αποδεικνύει ότι τα δεδομένα μας (Load Factor, Flight Hours κ.α.) έχουν ισχυρή προγνωστική αξία.
Λογιστική Παλινδρόμηση vs CART: Η Λογιστική Παλινδρόμηση πέτυχε ελαφρώς υψηλότερη ακρίβεια (0.832) και AUC (0.908). Ωστόσο, στην Επιχειρηματική Αναλυτική, η επιλογή του μοντέλου δεν βασίζεται μόνο στα νούμερα. Το μοντέλο CART, παρά τη μικρή διαφορά στην ακρίβεια, προσφέρει ερμηνευσιμότητα. Οι κανόνες που προκύπτουν από το δέντρο απόφασης είναι άμεσα κατανοητοί από τα στελέχη της αεροπορικής εταιρείας, επιτρέποντάς τους να γνωρίζουν ακριβώς ποια χαρακτηριστικά οδηγούν μια πτήση στη ζημία ή στο κέρδος.
Cross-Validation: Η διαδικασία του Cross-Validation επιβεβαίωσε ότι το μοντέλο μας είναι σταθερό. Το γεγονός ότι η ακρίβεια βελτιώθηκε στο 0.837 υποδεικνύει ότι η αρχική επιλογή παραμέτρων ήταν σωστή και το μοντέλο δεν παρουσιάζει συμπτώμα
Η ανάλυση των αεροπορικών δρομολογίων μέσω της μεθόδου CART οδήγησε στα εξής ευρήματα:
Ερμηνευσιμότητα: Το δέντρο απόφασης αποκάλυψε ότι ο πρώτος παράγοντας για την κερδοφορία είναι το (Αν Route_Category = Short), ακολουθεί η διάρκεια της πτήσης (Flight_Hours) και μετά η Πληρότητα.
Απόδοση: Το μοντέλο CART πέτυχε ακρίβεια 0.837, η οποία είναι σημαντικά ανώτερη από το baseline μοντέλο.
Σύγκριση: Σε αντίθεση με τη Λογιστική Παλινδρόμηση, το CART μας επέτρεψε να δούμε τις μη-γραμμικές σχέσεις μεταξύ των μεταβλητών (π.χ. οι Long Haul πτήσεις απαιτούν υψηλότερο Load Factor για να είναι κερδοφόρες σε σχέση με τις Short Haul).