Decision Tree
2026-05-03
- Δέντρα απόφασης & η μέθοδος CART
- Δημιουργία μοντέλου λογιστικής παλινδρόμησης
- Δημιουργία μοντέλου CART
- Εφαρμογή πρόβλεψης
# Φόρτωση βιβλιοθηκών
library(readr)## Warning: package 'readr' was built under R version 4.5.3
library(caTools)## Warning: package 'caTools' was built under R version 4.5.3
library(ROCR)## Warning: package 'ROCR' was built under R version 4.5.3
# Εισαγωγή dataset
data <- read_csv("titanic.csv")Δέντρα απόφασης & η μέθοδος CART
Για την ανάλυση των δεδομένων με τα Δέντρα απόφασης και την μέθοδο CART, θα ακολουθήσουμε τα εξής 4 βήματα:
- Διερεύνηση του συνόλου δεδομένων (dataset)
- Δημιουργία μοντέλου λογιστικής παλινδρόμησης
- Δημιουργία μοντέλου CART
- Εφαρμογή πρόβλεψης
Διερεύνηση του συνόλου δεδομένων (dataset)
Το συγκεκριμένο σύνολο δεδομένων αφορά την επιβίωση των επιβατών του θρυλικού ναυαγίου του Τιτανικού το 1912. Το dataset περιέχει 891 εγγραφές, με στήλες που αφορούν δημογραφικά στοιχεία των επιβατών καθώς και πληροφορίες για το ταξίδι τους. Παρακάτω, υπάρχει μια μικρή περιγραφή για την κάθε στήλη ξεχωριστά, καθώς και σε παρένθεση ο τύπος μεταβλητής κάθε μίας:
- PassengerId: Αύξων αριθμός παρατήρησης, μοναδικός για κάθε επιβάτη (int)
- Survived: Η μεταβλητή στόχος. Εκφράζει αν ο επιβάτης επέζησε (1) ή όχι (0) (int/factor)
- Pclass: Η κοινωνικο-οικονομική τάξη του επιβάτη. 1 = 1η θέση, 2 = 2η θέση, 3 = 3η θέση (int/factor)
- Name: Το ονοματεπώνυμο του επιβάτη (chr)
- Sex: Το φύλο του επιβάτη, male ή female (chr/factor)
- Age: Η ηλικία του επιβάτη σε έτη (num)
- SibSp: Πλήθος αδερφών ή συζύγων που επέβαιναν μαζί στον Τιτανικό (int)
- Parch: Πλήθος γονέων ή παιδιών που επέβαιναν μαζί στον Τιτανικό (int)
- Ticket: Ο αριθμός του εισιτηρίου (chr)
- Fare: Το αντίτιμο του εισιτηρίου (ναύλος) (num)
- Cabin: Ο αριθμός της καμπίνας (chr)
- Embarked: Το λιμάνι επιβίβασης. C = Cherbourg, Q = Queenstown, S = Southampton (chr/factor)
Περιγραφή των μεταβλητών (τύπος, εύρος τιμών, μονάδες μέτρησης)
# Εμφάνιση της δομής και των τύπων των μεταβλητών
str(data)## spc_tbl_ [891 × 12] (S3: spec_tbl_df/tbl_df/tbl/data.frame)
## $ PassengerId: num [1:891] 1 2 3 4 5 6 7 8 9 10 ...
## $ Survived : num [1:891] 0 1 1 1 0 0 0 0 1 1 ...
## $ Pclass : num [1:891] 3 1 3 1 3 3 1 3 3 2 ...
## $ Name : chr [1:891] "Braund, Mr. Owen Harris" "Cumings, Mrs. John Bradley (Florence Briggs Thayer)" "Heikkinen, Miss. Laina" "Futrelle, Mrs. Jacques Heath (Lily May Peel)" ...
## $ Sex : chr [1:891] "male" "female" "female" "female" ...
## $ Age : num [1:891] 22 38 26 35 35 NA 54 2 27 14 ...
## $ SibSp : num [1:891] 1 1 0 1 0 0 0 3 0 1 ...
## $ Parch : num [1:891] 0 0 0 0 0 0 0 1 2 0 ...
## $ Ticket : chr [1:891] "A/5 21171" "PC 17599" "STON/O2. 3101282" "113803" ...
## $ Fare : num [1:891] 7.25 71.28 7.92 53.1 8.05 ...
## $ Cabin : chr [1:891] NA "C85" NA "C123" ...
## $ Embarked : chr [1:891] "S" "C" "S" "S" ...
## - attr(*, "spec")=
## .. cols(
## .. PassengerId = col_double(),
## .. Survived = col_double(),
## .. Pclass = col_double(),
## .. Name = col_character(),
## .. Sex = col_character(),
## .. Age = col_double(),
## .. SibSp = col_double(),
## .. Parch = col_double(),
## .. Ticket = col_character(),
## .. Fare = col_double(),
## .. Cabin = col_character(),
## .. Embarked = col_character()
## .. )
## - attr(*, "problems")=<externalptr>
# Εμφάνιση στατιστικών στοιχείων και εύρους τιμών
summary(data)## PassengerId Survived Pclass Name
## Min. : 1.0 Min. :0.0000 Min. :1.000 Length:891
## 1st Qu.:223.5 1st Qu.:0.0000 1st Qu.:2.000 Class :character
## Median :446.0 Median :0.0000 Median :3.000 Mode :character
## Mean :446.0 Mean :0.3838 Mean :2.309
## 3rd Qu.:668.5 3rd Qu.:1.0000 3rd Qu.:3.000
## Max. :891.0 Max. :1.0000 Max. :3.000
##
## Sex Age SibSp Parch
## Length:891 Min. : 0.42 Min. :0.000 Min. :0.0000
## Class :character 1st Qu.:20.12 1st Qu.:0.000 1st Qu.:0.0000
## Mode :character Median :28.00 Median :0.000 Median :0.0000
## Mean :29.70 Mean :0.523 Mean :0.3816
## 3rd Qu.:38.00 3rd Qu.:1.000 3rd Qu.:0.0000
## Max. :80.00 Max. :8.000 Max. :6.0000
## NA's :177
## Ticket Fare Cabin Embarked
## Length:891 Min. : 0.00 Length:891 Length:891
## Class :character 1st Qu.: 7.91 Class :character Class :character
## Mode :character Median : 14.45 Mode :character Mode :character
## Mean : 32.20
## 3rd Qu.: 31.00
## Max. :512.33
##
Δημιουργία μοντέλου λογιστικής παλινδρόμησης
Επεξεργσία πριν τη δημιουργία του ΜοντέλουΣυμπεράσματα Ανάλυσης CART
Η εφαρμογή του αλγορίθμου CART στο σύνολο δεδομένων του Τιτανικού αναδεικνύει μια ιεραρχική δομή λήψης αποφάσεων που βασίζεται κυρίως στην κοινωνική δομή και τους κώδικες δεοντολογίας της εποχής («γυναίκες και παιδιά πρώτοι»).
Κυριαρχία του Φύλου: Το φύλο αποτελεί τον σημαντικότερο προγνωστικό παράγοντα. Το δέντρο διαχωρίζει άμεσα τους άνδρες από τις γυναίκες ως το πρώτο επίπεδο ταξινόμησης, με τις γυναίκες να έχουν εξαρχής δραματικά υψηλότερες πιθανότητες επιβίωσης.
Κοινωνική Τάξη και Επιβίωση: Για τον γυναικείο πληθυσμό, η κοινωνική τάξη (Pclass) λειτούργησε ως καταλύτης. Οι γυναίκες της 1ης και 2ης θέσης επιβίωσαν σχεδόν καθολικά (95%), ενώ στην 3η θέση η επιβίωση εξαρτήθηκε από δευτερεύοντες παράγοντες όπως το ναύλο και η ηλικία.
Ηλικιακά Κατώφλια: Το δέντρο εντόπισε αυτόματα το κρίσιμο ηλικιακό όριο των 9.5 ετών για τους άνδρες. Τα αγόρια κάτω των 10 ετών αντιμετωπίστηκαν με προτεραιότητα παρόμοια με των γυναικών, εκτός αν ανήκαν σε πολυμελείς οικογένειες (SibSp >= 3), όπου η πιθανότητα επιβίωσης μειωνόταν δραματικά, πιθανώς λόγω της δυσκολίας συντονισμού της οικογένειας κατά την εκκένωση.
Αξιολόγηση Μεθόδου: Σε σύγκριση με τη Λογιστική Παλινδρόμηση, η μέθοδος CART προσφέρει μια πιο οπτική και ερμηνεύσιμη προσέγγιση. Ενώ η παλινδρόμηση μας δίνει συντελεστές, το δέντρο απόφασης μας δίνει κανόνες. Η ικανότητα του CART να εντοπίζει μη-γραμμικές σχέσεις (όπως το πώς η ηλικία επηρεάζει διαφορετικά τους άνδρες από τις γυναίκες) το καθιστά ένα εξαιρετικά ισχυρό εργαλείο για τέτοιου είδους κοινωνικο-δημογραφικές αναλύσεις.
Για αρχή, πριν το διαχωρισμό του dataset και τη δημιουργία του μοντέλου, θα μετατρέψουμε τις απαραίτητες μεταβλητές σε κατηγορικές (factors), για τη σωστή λειτουργία του μοντέλου.
# Μετατροπή σε factor για την παλινδρόμηση
data$Survived <- as.factor(data$Survived)
data$Pclass <- as.factor(data$Pclass)
data$Sex <- as.factor(data$Sex)
data$Embarked <- as.factor(data$Embarked)Αφού έγινε η μετατροπή των μεταβλητών όπου ήταν αναγκαίο, θα διαχωρίσουμε το dataset σε training και testing sets. Το training set είναι το 65% της βάσης.
# Διαχωρισμός σε 65% Training και 35% Test
set.seed(999)
split <- sample.split(data$Survived, SplitRatio = 0.65)
train <- subset(data, split == TRUE)
test <- subset(data, split == FALSE)Οι καταχωρήσεις σε κάθε set είναι:
cat("Εγγραφές στο train set:", nrow(train), "\n")## Εγγραφές στο train set: 579
cat("Εγγραφές στο test set:", nrow(test), "\n")## Εγγραφές στο test set: 312
Δημιουργία Μοντέλου
Για τη δημιουργία του μοντέλου, θα χρησιμοποιήσουμε όλες τις ανεξάρτητες μεταβλητές που έχουν λογικό νόημα (εξαιρούμε Name, Ticket, Cabin, PassengerId).
model_logistic <- glm(Survived ~ Pclass + Sex + Age + SibSp + Parch + Fare + Embarked,
data = train, family = "binomial")
summary(model_logistic)##
## Call:
## glm(formula = Survived ~ Pclass + Sex + Age + SibSp + Parch +
## Fare + Embarked, family = "binomial", data = train)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 4.593445 0.674369 6.811 9.66e-12 ***
## Pclass2 -1.436146 0.433058 -3.316 0.000912 ***
## Pclass3 -2.510168 0.451028 -5.565 2.61e-08 ***
## Sexmale -2.384522 0.265857 -8.969 < 2e-16 ***
## Age -0.052514 0.010436 -5.032 4.85e-07 ***
## SibSp -0.369952 0.158425 -2.335 0.019534 *
## Parch -0.105585 0.150286 -0.703 0.482332
## Fare 0.002276 0.003825 0.595 0.551868
## EmbarkedQ -0.648465 0.712219 -0.910 0.362567
## EmbarkedS -0.284087 0.334277 -0.850 0.395406
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 622.82 on 461 degrees of freedom
## Residual deviance: 424.02 on 452 degrees of freedom
## (117 observations deleted due to missingness)
## AIC: 444.02
##
## Number of Fisher Scoring iterations: 5
Πρωτού περιγραφούν τα ευρήματα, είναι σημαντικό να αναφέρουμε ότι 117 επιβάτες εξαιρέθηκαν από το μοντέλο επειδή δε γνωρίζαμε την ηλικία τους, όπως φαίνεται στην αντίστοιχη γραμμή.
Κοιτώντας το Pr(>|z|) (p-value < 0.001) και τους αστερίσκους που δείχνουν το μέγεθος επιρροής, συμπαιράνουμε τα εξής:
Οι μεταβλητές με την ισχυρότερη συσχέτιση (Στατιστική Σημαντικότητα) είναι:
Sexmale (p-value < 2e-16): Η πιο ισχυρή μεταβλητή.Φαίνεται να έχει εξαιρετικά υψηλή στατιστική σημαντικότητα.
Pclass2 & Pclass3 (p-value < 0.001): Επίσης πολύ ισχυρή συσχέτιση. Η θέση του επιβάτη έπαιξε καθοριστικό ρόλο.
Age (p-value 4.85e-07): Πολύ ισχυρή συσχέτιση. Η ηλικία επηρέασε σημαντικά την επιβίωση.
SibSp (p-value 0.0195): Μέτρια συσχέτιση (ένα αστεράκι *). Ο αριθμός αδερφών/συζύγων είχε κάποια επίδραση, αλλά όχι τόσο καθοριστική όσο τα προηγούμενα.
Μεταβλητές χωρίς σημαντικότητα: Οι Parch, Fare και Embarked (λιμάνια Q και S) στο συγκεκριμένο μοντέλο, δεν φαίνεται να επηρεάζουν στατιστικά την επιβίωση όταν λαμβάνονται υπόψη οι υπόλοιποι παράγοντες.
Προβλέψεις
Με βάση το test set, θα κάνουμε κάποιες προβλέψεις, χρησιμοποιώντας την εντολή predict.
predictTest <- predict(model_logistic, newdata = test, type = "response")
predictTest## 1 2 3 4 5 6 7
## 0.61108470 0.31155353 0.13495519 0.75980389 0.50534501 NA 0.63070618
## 8 9 10 11 12 13 14
## 0.26448868 0.55096888 0.54276240 NA 0.63543278 0.53867410 0.61182424
## 15 16 17 18 19 20 21
## NA NA NA 0.07958491 NA 0.11375789 NA
## 22 23 24 25 26 27 28
## NA 0.17299867 0.39011634 0.11881979 0.57442605 0.13855588 0.11008197
## 29 30 31 32 33 34 35
## 0.32705896 0.19144135 0.73879548 0.73778949 0.58583664 NA 0.70937642
## 36 37 38 39 40 41 42
## 0.09124037 0.03731965 0.67124375 0.39533076 0.72805432 0.80318484 0.23384464
## 43 44 45 46 47 48 49
## 0.73876085 0.43357679 0.55106739 0.28885151 0.15613221 0.05263517 0.39289361
## 50 51 52 53 54 55 56
## NA NA 0.69179292 0.12642007 NA 0.23107514 0.34029556
## 57 58 59 60 61 62 63
## 0.12044341 0.25785821 NA NA NA 0.40664538 0.02958338
## 64 65 66 67 68 69 70
## 0.07886641 0.77247939 0.38237452 0.61048590 0.47870865 0.91261069 0.86773873
## 71 72 73 74 75 76 77
## 0.18060479 0.54461385 0.15133995 0.95633812 0.19667159 0.28913478 0.03749970
## 78 79 80 81 82 83 84
## NA 0.39485053 0.90816259 0.07050979 0.47928066 0.32131420 NA
## 85 86 87 88 89 90 91
## 0.38103177 0.22858454 0.15130342 0.62340972 0.98057212 NA 0.94158861
## 92 93 94 95 96 97 98
## 0.65902469 0.55673678 0.36672763 NA 0.38503397 0.01279970 0.17296341
## 99 100 101 102 103 104 105
## NA 0.25191800 0.17962936 0.98144170 NA NA 0.10108844
## 106 107 108 109 110 111 112
## 0.61104640 0.72342897 0.95309683 0.02243458 0.97767767 0.40139171 0.10673931
## 113 114 115 116 117 118 119
## NA 0.05068453 0.41156915 0.49182487 0.91105139 0.27846201 0.20226277
## 120 121 122 123 124 125 126
## NA NA 0.95983032 NA NA 0.08262068 NA
## 127 128 129 130 131 132 133
## 0.61637026 0.17287390 0.09554552 NA 0.73347206 NA 0.43200450
## 134 135 136 137 138 139 140
## 0.05854781 0.96350744 0.59042004 0.12648920 0.03747506 0.88563428 NA
## 141 142 143 144 145 146 147
## 0.05325735 0.85149623 0.75358896 0.74876784 NA 0.62594957 0.58828065
## 148 149 150 151 152 153 154
## 0.96324884 0.64540464 0.52355906 0.16603643 0.09531253 0.80727788 0.84421166
## 155 156 157 158 159 160 161
## 0.89372134 0.54978401 0.12788777 0.37018818 0.19339160 0.56744433 0.36926034
## 162 163 164 165 166 167 168
## 0.08686951 0.38801067 0.07143837 NA 0.07168219 0.65074090 NA
## 169 170 171 172 173 174 175
## 0.15141912 0.04687998 NA 0.90939361 NA 0.29028577 0.15845139
## 176 177 178 179 180 181 182
## 0.94049212 0.13848684 0.18872014 0.58653652 0.13918078 0.82097161 0.13840541
## 183 184 185 186 187 188 189
## 0.38559286 NA 0.66193817 0.95010912 0.04483607 NA 0.91326652
## 190 191 192 193 194 195 196
## NA 0.96576360 0.42721208 0.18204930 0.36714033 0.06025038 0.79533211
## 197 198 199 200 201 202 203
## 0.21915788 0.87729499 NA 0.17291322 0.71164607 NA 0.17507327
## 204 205 206 207 208 209 210
## 0.91070128 NA 0.12506579 0.22492674 0.08263362 0.04075787 NA
## 211 212 213 214 215 216 217
## 0.69611055 NA 0.05327170 0.92811350 NA 0.05659595 0.11343065
## 218 219 220 221 222 223 224
## 0.37026449 NA 0.64517607 0.51725231 0.17436145 0.16551845 0.97042580
## 225 226 227 228 229 230 231
## 0.37588320 0.17291322 0.34275431 NA 0.15856774 NA 0.08429719
## 232 233 234 235 236 237 238
## 0.07880030 0.31118978 NA 0.05598314 NA 0.04056804 NA
## 239 240 241 242 243 244 245
## 0.79879932 0.16594979 0.03644878 0.05648725 0.98010187 0.51416724 0.85792627
## 246 247 248 249 250 251 252
## NA 0.16831165 0.74371044 0.09578776 0.63200469 0.97065806 0.96910508
## 253 254 255 256 257 258 259
## 0.81445816 0.09107460 0.92605742 0.21973959 0.55866375 0.33413635 0.11452539
## 260 261 262 263 264 265 266
## NA NA 0.46103979 0.10165507 0.10018095 0.66328565 0.07175811
## 267 268 269 270 271 272 273
## 0.09140010 0.14490008 0.94121403 NA 0.06167768 0.19657273 0.09563160
## 274 275 276 277 278 279 280
## 0.47597775 0.18050378 0.80487606 0.05270354 NA NA NA
## 281 282 283 284 285 286 287
## 0.13236580 0.17802995 0.54761332 0.69624822 0.10015018 0.46924091 0.70508700
## 288 289 290 291 292 293 294
## NA 0.05579102 0.78849945 0.12094802 NA 0.14488835 0.90543529
## 295 296 297 298 299 300 301
## 0.18872014 NA 0.08202174 0.56262815 0.63414181 0.03088287 0.80234572
## 302 303 304 305 306 307 308
## 0.60152763 0.12645044 0.55064280 0.04595775 0.79763644 NA 0.85022335
## 309 310 311 312
## 0.09109736 0.27732031 0.96706960 0.06833794
Παραπάνω, φαίνονται οι πιθανότητες επιβίωσης για κάθε επιβάτη.
Confusion matrix
# Confusion Matrix
table(test$Survived, predictTest > 0.5)##
## FALSE TRUE
## 0 126 22
## 1 22 80
Ο παραπάνω πίνακας, δείχνει τα εξής:
- True Negatives (TN) = 126: Προβλέψαμε ότι δεν θα επιβιώσουν και όντως δεν επέζησαν.
- True Positives (TP) = 80: Προβλέψαμε ότι θα επιβιώσουν και όντως επέζησαν.
- False Positives (FP) = 22: Προβλέψαμε ότι θα επιβιώσουν, αλλά δυστυχώς χάθηκαν.
- False Negatives (FN) = 22: Προβλέψαμε ότι θα χαθούν, αλλά τελικά επέζησαν.
Σύνολο παρατηρήσεων στο test set: 126 + 22 + 22 + 80 = 250.
Υπολογισμοί με βάση τον πίνακα:
- Accuracy = (TN + TP) / Total
- (126+80)/250 * 100 = 82.4%
- Sensitivity = TP / (TP + FN) -> Πόσους από αυτούς που επέζησαν βρήκαμε;
- 80/(80+22) * 100 = 78.4%
- Specificity = TN / (TN + FP) -> Πόσους από αυτούς που χάθηκαν βρήκαμε;
- 126/(126+22) * 100 = 85.1%
# Baseline Accuracy: Πρόβλεψη πάντα του πιο συχνού αποτελέσματος (δεν επέζησαν)
baseline_acc <- table(test$Survived)[1] / nrow(test)
cat("Baseline Accuracy:", baseline_acc)## Baseline Accuracy: 0.6153846
Όσον αφορά το basiline model, αν το μοντέλο μας έλεγε για όλους <<0>> (δεν επέζησε) θα είχε ακρίβεια 61.5%. Δηλαδή, αν προβλέπαμε για όλους το πιο συχνό αποτέλεσμα. Και πράγματι, στον Τιτανικό οπι περισσότεροι επιβάτες δυστυχώς δεν επέζησαν.
Παρατηρήσεις
Το μοντέλο μας (82.4%) είναι πολύ καλύτερο από το Baseline (61.5%). Αυτό σημαίνει ότι οι μεταβλητές που επιλέξαμε (φύλο, τάξη, ηλικία) προσφέρουν πραγματική πληροφορία, η οποία δίνει αυτή τη σημαντική βελτίωση στο μοντέλο.
Επιπλέον, το μοντέλο φαίνεται πολύ ισορροπημένο, καθώς έχουμε τον ίδιο αριθμό σφαλμάτων (22) και στις δύο πλευρές (FP και FN). Αυτό δείχνει ότι το κατώφλι του 0.5 που επιλέξαμε λειτουργεί αρκετά δίκαια και για τις δύο κλάσεις.
Τέλος, μπορούμε να πούμε ότι το μοντέλο είναι ελαφρώς καλύτερο στο να εντοπίζει αυτούς που επέζησαν (Specificity: 85.1%) παρά αυτούς που επέζησαν (Sensitivity: 78.4%).
Δημιουργία μοντέλου ROCRpred
train2 <- na.omit(train)
test2 <- na.omit(test)
cat("Εγγραφές στο Train2 set:", nrow(train2), "\n")## Εγγραφές στο Train2 set: 108
cat("Εγγραφές στο Test2 set:", nrow(test2), "\n")## Εγγραφές στο Test2 set: 75
Τελικώς, από το αρχικό δείγμα, μόνο οι 183 επιβάτες είχαν πλήρη στοιχεία (δηλαδή γνωρίζαμε την ηλικία τους, την καμπίνα, το λιμάνι κτλ).
# Επανεκπαίδευση για την ROCR
model2 <- glm(Survived ~ Pclass + Sex + Age + SibSp + Parch + Fare + Embarked,
data = train2, family = "binomial")
predictTest2 <- predict(model2, newdata = test2, type = "response")
summary(model2)##
## Call:
## glm(formula = Survived ~ Pclass + Sex + Age + SibSp + Parch +
## Fare + Embarked, family = "binomial", data = train2)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.963e+00 1.301e+00 3.046 0.00232 **
## Pclass2 9.875e-01 1.515e+00 0.652 0.51457
## Pclass3 -2.269e+00 1.176e+00 -1.929 0.05370 .
## Sexmale -3.296e+00 7.540e-01 -4.370 1.24e-05 ***
## Age -4.398e-02 2.137e-02 -2.058 0.03958 *
## SibSp 2.990e-01 5.757e-01 0.519 0.60357
## Parch -9.662e-01 5.018e-01 -1.926 0.05415 .
## Fare 6.429e-03 6.020e-03 1.068 0.28556
## EmbarkedQ -1.548e+01 1.455e+03 -0.011 0.99152
## EmbarkedS 1.079e+00 6.953e-01 1.552 0.12064
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 132.948 on 107 degrees of freedom
## Residual deviance: 79.137 on 98 degrees of freedom
## AIC: 99.137
##
## Number of Fisher Scoring iterations: 14
Λόγω της σμίκρυνσης του δείγματος, το μοντέλο δυσκολεύεται να βρει στατιστικά σημαντικές σχέσεις, καθώς πλέον χρειάζονται πολύ ισχυρότερες ενδείξεις για να θεωρήσουμε κάτι σημαντικό. Πλέον, το φύλλο δαιτηρεί τη σημασία του, η σημασία της ηλικίας μειώθηκε, η Pclass2 δεν θεωρείται σημαντική και η Pclass3 οριακά σημαντική.
Δημιουργία ROCpred
Με τον τρόπο αυτό, συνδυάζουμε τις πιθανότητες που υπολόγισε η predict (predictTest2) με τα πραγματικά δεδομένα (test2$Survived). Έτσι, θα σχηματιστεί η καμπύλη ROC.
# Δημιουργία του αντικειμένου πρόβλεψης
ROCRpred <- prediction(predictTest2, test2$Survived)
ROCRpred## A prediction instance
## with 75 data points
Καμπύλη ROC και Υπολογισμός AUC
# Υπολογισμός των μετρικών για την καμπύλη (True Positive Rate & False Positive Rate)
ROCRperf <- performance(ROCRpred, "tpr", "fpr")
# Σχεδίαση της καμπύλης ROC
# Το colorize = TRUE προσθέτει χρωματική κλίμακα για τις τιμές του κατωφλιού (threshold)
plot(ROCRperf, colorize = TRUE,
print.cutoffs.at = seq(0, 1, 0.1),
text.adj = c(-0.2, 1.7),
main = "ROC Curve - Titanic Survival Prediction")
# Προσθήκη διαγώνιας γραμμής (τυχαία πρόβλεψη - baseline)
abline(a = 0, b = 1, lty = 2, col = "gray")Στο σχήμα βλέπουμε ότι η καμπύλη γίνεται πιο έντονη στο πάνω αριστερά κομμάτι. Αυτό δείχνει ότι το μοντέλο πετυχαίνει υψηλό True Positive Rate (βρίσκει τους επιζώντες) διατηρώντας χαμηλό το False Positive Rate (δεν κάνει πολλά λάθη χαρακτηρίζοντας κάποιον ως επιζώντα ενώ δεν είναι).
# Υπολογισμός της τιμής AUC (Area Under the Curve)
auc_val <- as.numeric(performance(ROCRpred, "auc")@y.values)
cat("Η τιμή AUC για το μοντέλο είναι:", round(auc_val, 4))## Η τιμή AUC για το μοντέλο είναι: 0.7099
Μια πιθανή εξήγηση για την τιμή που παρατηρούμε στο AUC, είναι ο περιορισμένος αριθμός δείγματος (λόγω της εντολής na.omit). Έτσι, το μοντέλο δυσκολεύεται να συσχετίσει τις σχέσεις μεταξύ τους (πχ φύλο και κοινωνική τάξη) και η προγνωστική ικανότητα μειώνεται. Τελικώς, το μοντέλο θα κατέτασσε σωστά έναν επιβάτη (επιζών ή θανόντα), στο 71% των περιπτώσεων, ξεπερνώντας το baseline (0.615 ή 61.5%).
Τελικά Συμπεράσματα
Όσον αφορά την απόδοση του μοντέλου, πέτυχε ικανοποιητική ακρίβεια, ξεπερνώντας το Baseline μοντέλο. Η τελική τιμή AUC 0.7099 υποδηλώνει μια καλή διακριτική ικανότητα, αν και επηρεάστηκε από τον περιορισμένο αριθμό δεδομένων.
Παρά τη μείωση του δείγματος λόγω των ελλειπουσών τιμών (NAs), το Φύλο και η Ηλικία παρέμειναν στατιστικά σημαντικοί παράγοντες. Το μοντέλο επιβεβαίωσε ότι οι γυναίκες και οι νεότεροι επιβάτες είχαν σαφές προβάδισμα επιβίωσης.
Η χρήση της na.omit ήταν απαραίτητη για την παραγωγή της καμπύλης ROC, ωστόσο η μείωση του training set σε μόλις 108 παρατηρήσεις εξηγεί τη μείωση της τιμής AUC σε σχέση με ευρύτερα μοντέλα. Η διαγραφή των εγγραφών με NAs στερεί από το μοντέλο πολύτιμη πληροφορία.
Δημιουργία μοντέλου CART
# Φόρτωση απαραίτητων βιβλιοθηκών
library(rpart)## Warning: package 'rpart' was built under R version 4.5.3
library(rpart.plot)## Warning: package 'rpart.plot' was built under R version 4.5.3
# Χτίζουμε το δέντρο απόφασης χρησιμοποιώντας τις ίδιες μεταβλητές με τη Λογιστική Παλινδρόμηση
#Η rpart(), είναι η συνάρτηση που χτίζει το δέντρο απόφασης. Εφόσον θέλουμε ταξινόμηση (επιβίωσε/δεν επιβίωσε), και όχι πρόβλεψη αριθμού, θα χρησιμοποιήσουμε το method = "class".
model_cart <- rpart(Survived ~ Pclass + Sex + Age + SibSp + Parch + Fare,
data = train,
method = "class")
# Οπτικοποίηση του δέντρου
prp(model_cart, extra = 106, main="Decision Tree (CART) - Titanic Survival")Τα αποτελέσματα του δέντρου απόφασης φαίνονται ξεκάθαρα. Για αρχή, στα φύλλα παρατηρούνται 3 αριθμοί, που παρέχουν 3 πληροφορίες που καλό είναι να λαμβάνονται υπόψιν.
- Ο πρώτος αριθμός, είναι η πρόβλεψη. Για τις τιμές 0, σημαίνει ότι η πρόβλεψει για την ομάδα εκείνη είναι ότι δεν επέζησαν. Αντιθέτως, για τις τιμές 1 σημαίνει ότι τα άτομα εκείνης της ομάδας επέζησαν.
- Ο μεσαίος αριθμός, σηματοδοτεί την πιθανότητα επιβίωσης. Είναι λογικό ότι άτομα διαφορετικών ομάδων, δεν επέζησαν ή σκοτώθηκαν σε απόλυτο βαθμό.
- Ο τελευταίος αριθμός, είναι το ποσοστό των επιβατών που ανήκουν σε αυτή την κατηγορία βάση του training set.
Όσον αφορά τη δημιουργία του δέντρου, μέσω των υπολογισμών του αλγορίθμου CART, προέκυψε το φύλο ως η βέλτιστη επιλογή για τον ξεκάθαρο διαχωρισμό (μετρώντας το Purity-Καθαρότητα και την ακαθαρσία-Impurity/Gini Index). Αφού έγινε αυτός ο διαχωρισμός σε πρώτο επίπεδο, σε δεύτερο επίπεδο διέκρινε ως βέλτιστο παράγοντα διαχωρισμού την ηλικία, κτλ.
Για τις διαδρομές του δέντρου, είναι σημαντικό να διευκρινίσουμε ότι η αριστερά διακλάδωση σημαίνει <<Ναι-Yes>>, ενώ η δεξιά <<Όχι-No>>. Συνεπώς, αν ο επιβάτης είναι άνδρας και είναι άνω των 9,5 ετών, τότε η πρόβλεψη είναι θάνατος (0), όντας το 60% του πλοίου με πιθανότητα επιβίωσης 17%. Αν είναι μικρότερος των 9,5 ετών και έχει λιγότερα από 3 αδέρφια, το μοντέλο προβλέπει επιβίωση. Σε αντίθετη περίπτωση προβλέπεται και πάλι θάνατος.
Στη διαδρομή των γυναικών, βλέπουμε ότι καθοριστικό ρόλο σε δεύτερο επίπεδο διαδραματίζει η κοινωνική τάξη (PClass). Αν η γυναίκα δεν ανήκει στην 3η θέση (θέσεις 1 και 2), το μοντέλο δίνει πρόβλεψη επιβίωσης 95%, με την ομάδα να αποτελεί το 18% του συνόλου. Αν η γυναίκα ανήκει στην 3η θέση, η τύχη της εξαρτάται από το εισιτήριο (Fare) και την ηλικία. Οι γυναίκες της 3ης θέσης που πλήρωσαν ακριβό εισιτήριο (>=25) παραδόξως δεν επιβίωσαν (πιθανότητα 0%), ενώ για τις υπόλοιπες έπαιξε ρόλο αν ήταν παιδιά/έφηβοι (κάτω των 19) ή ενήλικες.
Τελικά Συμπεράσματα Ανάλυσης CART
Η εφαρμογή του αλγορίθμου CART στο σύνολο δεδομένων του Τιτανικού αναδεικνύει μια ιεραρχική δομή λήψης αποφάσεων που βασίζεται κυρίως στην κοινωνική δομή και τους κώδικες δεοντολογίας της εποχής («γυναίκες και παιδιά πρώτοι»).
Κυριαρχία του Φύλου: Το φύλο αποτελεί τον σημαντικότερο προγνωστικό παράγοντα. Το δέντρο διαχωρίζει άμεσα τους άνδρες από τις γυναίκες ως το πρώτο επίπεδο ταξινόμησης, με τις γυναίκες να έχουν εξαρχής δραματικά υψηλότερες πιθανότητες επιβίωσης.
Κοινωνική Τάξη και Επιβίωση: Για τον γυναικείο πληθυσμό, η κοινωνική τάξη (Pclass) λειτούργησε ως καταλύτης. Οι γυναίκες της 1ης και 2ης θέσης επιβίωσαν σχεδόν καθολικά (95%), ενώ στην 3η θέση η επιβίωση εξαρτήθηκε από δευτερεύοντες παράγοντες όπως το ναύλο και η ηλικία.
Ηλικιακά Κατώφλια: Το δέντρο εντόπισε αυτόματα το κρίσιμο ηλικιακό όριο των 9.5 ετών για τους άνδρες. Τα αγόρια κάτω των 10 ετών αντιμετωπίστηκαν με προτεραιότητα παρόμοια με των γυναικών, εκτός αν ανήκαν σε πολυμελείς οικογένειες (SibSp >= 3), όπου η πιθανότητα επιβίωσης μειωνόταν δραματικά, πιθανώς λόγω της δυσκολίας συντονισμού της οικογένειας κατά την εκκένωση.
Αξιολόγηση Μεθόδου: Σε σύγκριση με τη Λογιστική Παλινδρόμηση, η μέθοδος CART προσφέρει μια πιο οπτική και ερμηνεύσιμη προσέγγιση. Ενώ η παλινδρόμηση μας δίνει συντελεστές, το δέντρο απόφασης μας δίνει κανόνες. Η ικανότητα του CART να εντοπίζει μη-γραμμικές σχέσεις (όπως το πώς η ηλικία επηρεάζει διαφορετικά τους άνδρες από τις γυναίκες) το καθιστά ένα εξαιρετικά ισχυρό εργαλείο για τέτοιου είδους κοινωνικο-δημογραφικές αναλύσεις.
Εφαρμογή πρόβλεψης
# 1. Προβλέψεις με το μοντέλο Λογιστικής Παλινδρόμησης
# Παράγει πιθανότητες (type="response")
pred_log_prob <- predict(model_logistic, newdata = test, type = "response")
# Μετατρέπουμε τις πιθανότητες σε κλάσεις (0 ή 1) με όριο το 0.5
pred_log_class <- ifelse(pred_log_prob > 0.5, 1, 0)
# 2. Προβλέψεις με το μοντέλο CART (Δέντρο Απόφασης)
# Παράγει απευθείας την κλάση (type="class")
pred_cart_class <- predict(model_cart, newdata = test, type = "class")
# 3. Υπολογισμός Ακρίβειας (Accuracy)
# Συγκρίνουμε τις προβλέψεις με τις πραγματικές τιμές (test$Survived)
acc_log <- mean(pred_log_class == test$Survived, na.rm = TRUE)
acc_cart <- mean(pred_cart_class == test$Survived, na.rm = TRUE)
# 4. Εμφάνιση αποτελεσμάτων σε έναν πίνακα σύγκρισης
results <- data.frame(
Model = c("Logistic Regression", "Decision Tree (CART)"),
Accuracy = c(acc_log, acc_cart)
)
print(results)## Model Accuracy
## 1 Logistic Regression 0.8240000
## 2 Decision Tree (CART) 0.8044872
# Πίνακας Συγχύσεως (Confusion Matrix) για το CART
table(Predicted = pred_cart_class, Actual = test$Survived)## Actual
## Predicted 0 1
## 0 177 46
## 1 15 74
Σύγκριση Ακρίβειας (Accuracy)
Οι διαφορές στην ακρίβεια είναι μικρές, γεγονός που δείχνει ότι τα δεδομένα μας είναι ποιοτικά και τα συμπεράσματα σταθερά ανεξαρτήτως αλγορίθμου.
Logistic Regression (82.4%): Το μοντέλο αυτό αναδείχθηκε καλύτερο σε όρους απόλυτης ακρίβειας. Η λογιστική παλινδρόμηση καταφέρνει να διαχειριστεί καλύτερα τις συνεχείς μεταβλητές (όπως το ναύλο και την ηλικία) και τις γραμμικές σχέσεις, πετυχαίνοντας ελαφρώς καλύτερη γενίκευση στα νέα δεδομένα.
Decision Tree - CART (80.4%): Παρόλο που υπολείπεται κατά περίπου 2%, το αποτέλεσμα είναι εξαιρετικά υψηλό. Παρόλα αυτά, έχουμε ένα μοντέλο που είναι πολύ πιο εύκολο να εξηγηθεί οπτικά.
Πίνακας Συγχύσεως (Confusion Matrix) για το CART
Ο πίνακας αυτός μας δείχνει πού ακριβώς «μαντεύει» σωστά το δέντρο και πού κάνει λάθη:
True Negatives (177): Το μοντέλο προέβλεψε σωστά ότι 177 επιβάτες δεν θα επιβίωναν. Είναι το πιο δυνατό του σημείο.
True Positives (74): Προέβλεψε σωστά ότι 74 επιβάτες θα επιβίωναν.
False Negatives (46): Εδώ είναι το κύριο λάθος του. Προέβλεψε ότι 46 άνθρωποι θα πέθαιναν, ενώ εκείνοι επιβίωσαν.
False Positives (15): Προέβλεψε ότι 15 άνθρωποι θα ζούσαν, ενώ δυστυχώς χάθηκαν.
Τελική Αξιολόγηση και Συμπεράσματα
Σύνοψη Μοντέλων Στο πλαίσιο της παρούσας μελέτης, εφαρμόστηκαν δύο διαφορετικές προσεγγίσεις μηχανικής μάθησης για την πρόβλεψη της επιβίωσης στον Τιτανικό: η Λογιστική Παλινδρόμηση και τα Δέντρα Απόφασης (CART). Και τα δύο μοντέλα εκπαιδεύτηκαν και δοκιμάστηκαν στα ίδια σύνολα δεδομένων (Training και Test set) για τη διασφάλιση της εγκυρότητας της σύγκρισης.
Συγκριτική Ανάλυση Επιδόσεων Η Λογιστική Παλινδρόμηση πέτυχε το υψηλότερο ποσοστό ακρίβειας (82.4%), αποδεικνύοντας ότι οι στατιστικές σχέσεις μεταξύ των δημογραφικών χαρακτηριστικών και της επιβίωσης μπορούν να μοντελοποιηθούν με μεγάλη επιτυχία μέσω πιθανονοτικών μεθόδων.
Το μοντέλο CART, με ακρίβεια 80.4%, παρείχε μια πιο διαισθητική κατανόηση της τραγωδίας. Μέσω του Πίνακα Συγχύσεως, παρατηρούμε ότι το δέντρο είναι ιδιαίτερα αποτελεσματικό στον εντοπισμό των επιβατών που δεν επιβίωσαν (177 σωστές προβλέψεις), εμφανίζοντας ωστόσο μια τάση για «συντηρητικές» προβλέψεις, καθώς κατέταξε εσφαλμένα 46 επιζώντες στην κατηγορία των θυμάτων.
Κύριοι Παράγοντες Επιβίωσης Από την ανάλυση και των δύο μοντέλων, προκύπτει ότι η τύχη των επιβατών δεν ήταν τυχαία, αλλά καθορίστηκε από τρεις κύριους πυλώνες:
Το Φύλο: Αποτελεί τον ισχυρότερο προγνωστικό παράγοντα, με τις γυναίκες να έχουν τη σαφή προτεραιότητα.
Η Κοινωνικοοικονομική Κατάσταση (Pclass): Οι επιβάτες της 1ης και 2ης θέσης ενδεχομένως είχαν προνομιακή πρόσβαση στις σωσίβιες λέμβους.
Η Ηλικία: Τα παιδιά (ιδίως τα αγόρια κάτω των 10 ετών) είχαν αυξημένες πιθανότητες επιβίωσης σε σχέση με τον ενήλικο ανδρικό πληθυσμό.
Τελικό Συμπέρασμα Εν κατακλείδι, η Λογιστική Παλινδρόμηση προσφέρει την υψηλότερη ακρίβεια για αυτοματοποιημένες προβλέψεις, ενώ το Δέντρο Απόφασης CART αποτελεί το καλύτερο εργαλείο για την οπτικοποίηση και κατανόηση των κανόνων που διήπαν την εκκένωση του πλοίου.