1. Εισαγωγή και Διερεύνηση του Dataset

Για την παρούσα εργασία συνεχίζουμε με το dataset Life Expectancy Data (του Παγκόσμιου Οργανισμού Υγείας).Ο στόχος μας είναι να δημιουργήσουμε ένα μοντέλο Δέντρων Απόφασης (CART) για να προβλέψουμε αν μια χώρα έχει υψηλό ή χαμηλό προσδόκιμο ζωής, και στη συνέχεια να το συγκρίνουμε με το μοντέλο της Λογιστικής Παλινδρόμησης.

Όπως και πριν, μετατρέπουμε το Life.expectancy σε μια δίτιμη εξαρτημένη μεταβλητή High_Life (1 για \(\ge 70\) έτη, 0 διαφορετικά) και χρησιμοποιούμε τις εξής ανεξάρτητες μεταβλητές: Schooling, Adult.Mortality, Income.composition.of.resources, HIV.AIDS.

# Φόρτωση βιβλιοθηκών
library(readr)
library(ggplot2)
library(dplyr)
library(caTools)
library(ROCR)
library(rpart)
library(rpart.plot)

# Εισαγωγή δεδομένων
Life_Data <- read.csv("Life_Expectancy_Data.csv")

# Επιλογή μεταβλητών & Δημιουργία δίτιμης μεταβλητής
df_subset <- Life_Data[, c("Life.expectancy", "Schooling", "Adult.Mortality", 
                           "Income.composition.of.resources", "HIV.AIDS")]
df_subset$High_Life <- ifelse(df_subset$Life.expectancy >= 70, 1, 0)
df_subset$Life.expectancy <- NULL

# Αφαίρεση κενών τιμών (NAs) για να τρέξουν απροβλημάτιστα όλα τα μοντέλα
df_clean <- na.omit(df_subset)

# Διαχωρισμός σε Train (65%) και Test (35%)
set.seed(940)
split <- sample.split(df_clean$High_Life, SplitRatio = 0.65)
train <- subset(df_clean, split == TRUE)
test <- subset(df_clean, split == FALSE)

cat("Καταχωρήσεις στο train set:", nrow(train), "\n")
## Καταχωρήσεις στο train set: 1799
cat("Καταχωρήσεις στο test set:", nrow(test), "\n")
## Καταχωρήσεις στο test set: 969

Διάγραμμα Διασποράς (Scatterplot)

ggplot(Life_Data, aes(x = Schooling, y = Life.expectancy)) +
  geom_point(color = "purple", alpha = 0.4) +
  geom_smooth(method = "lm", color = "orange") +
  labs(title = "Σχέση Εκπαίδευσης και Μακροζωίας",
       x = "Έτη Εκπαίδευσης",
       y = "Προσδόκιμο Ζωής")

Σχολιασμός γραφήματος

Το γράφημα αποκαλύπτει μια ισχυρή γραμμική σχέση μεταξύ της εκπαίδευσης και του προσδόκιμου ζωής, υποδεικνύοντας ότι η πρόσβαση στη γνώση αποτελεί έναν από τους σημαντικότερους δείκτες κοινωνικής ευημερίας. Η ανοδική πορεία της γραμμής τάσης δείχνει ότι όσο αυξάνονται τα έτη φοίτησης, τόσο βελτιώνεται το επίπεδο υγείας και η ποιότητα ζωής του πληθυσμού.

Διάγραμμα Boxplot

ggplot(Life_Data, aes(x = Status, y = Life.expectancy, fill = Status)) +
  geom_boxplot(outlier.color = "red", outlier.shape = 16, outlier.size = 2) +
  scale_fill_manual(values = c("Developed" = "#69b3a2", "Developing" = "#404080")) +
  labs(title = "Κατανομή Προσδόκιμου Ζωής ανά Κατάσταση Χώρας",
       subtitle = "Σύγκριση Αναπτυγμένων και Αναπτυσσόμενων Χωρών",
       x = "Κατάσταση Χώρας (Status)",
       y = "Προσδόκιμο Ζωής (Έτη)"
       ) +
  theme_minimal() 

Σχολιασμός γραφήματος

Το boxplot απεικονίζει ξεκάθαρα το χάσμα στο προσδόκιμο ζωής μεταξύ των δύο κατηγοριών χωρών. Οι Developed χώρες παρουσιάζουν πολύ υψηλότερη διάμεσο και μικρότερη μεταβλητότητα, γεγονός που υποδηλώνει σταθερά υψηλό επίπεδο υγείας. Αντίθετα, οι Developing χώρες έχουν πολύ μεγαλύτερο εύρος τιμών και αρκετές ακραίες χαμηλές τιμές, που υποδεικνύουν την ύπαρξη χωρών που υστερούν σημαντικά ίσως λόγω κρίσεων ή έλλειψης υποδομών.

Διάγραμμα Bar Chart

ggplot(Life_Data, aes(x = Status, y = percentage.expenditure, fill = Status)) +
  geom_bar(stat = "identity", width = 0.6) +
  scale_fill_manual(values = c("Developed" = "#f39c12", "Developing" = "#3498db")) +
  labs(title = "Μέση Δημόσια Δαπάνη για την Υγεία",
       x = "Κατάσταση Χώρας",
       y = "Μέση Δαπάνη (% του ΑΕΠ)") +
  theme_minimal()

Σχολιασμός γραφήματος

Το ραβδόγραμμα (bar chart) απεικονίζει τη διαφορά στις επενδύσεις για την υγεία ως ποσοστό του ΑΕΠ. Παρατηρούμε ότι οι Developed χώρες διαθέτουν σταθερά μεγαλύτερο ποσοστό του προϋπολογισμού τους για τη δημόσια υγεία σε σύγκριση με τις Developing.

2. Μοντέλο Λογιστικής Παλινδρόμησης (Baseline Σύγκρισης)

Δημιουργούμε ξανά εν τάχει το μοντέλο Λογιστικής Παλινδρόμησης για να έχουμε ένα μέτρο σύγκρισης για την απόδοση του δέντρου.

LifeLog <- glm(High_Life ~ ., data = train, family = binomial)

# Προβλέψεις Λογιστικής στο test
predictLog <- predict(LifeLog, type = "response", newdata = test)
conf_matrix_log <- table(test$High_Life, predictLog > 0.5)
print(conf_matrix_log)
##    
##     FALSE TRUE
##   0   366   58
##   1    52  493
accuracy_log <- sum(diag(conf_matrix_log)) / sum(conf_matrix_log)
cat("Ακρίβεια Λογιστικής Παλινδρόμησης:", round(accuracy_log, 4), "\n")
## Ακρίβεια Λογιστικής Παλινδρόμησης: 0.8865

Δημιουργία train2 και test2 με na.omit

Σύμφωνα με την οδηγία, δημιουργούμε νέα σύνολα χωρίς κενές τιμές για την ανάλυση ROCR.

train2 <- na.omit(train)
test2 <- na.omit(test)

cat("Καταχωρήσεις στο train2:", nrow(train2), "\n")
## Καταχωρήσεις στο train2: 1799
cat("Καταχωρήσεις στο test2:", nrow(test2), "\n")
## Καταχωρήσεις στο test2: 969

Σχολιασμός Set

Για το set train2 έχουμε 1793 καταχωρήσεις και για το set test2 έχουμε 975 καταχωρήσεις.

Καμπύλη ROC και AUC για Λογιστική Παλινδρόμηση

Τέλος, χρησιμοποιούμε τη βιβλιοθήκη ROCR για να οπτικοποιήσουμε την απόδοση του μοντέλου. Χρησιμοποιούμε το test2 για να παράξουμε την καμπύλη ROC, καθώς η βιβλιοθήκη ROCR απαιτεί δεδομένα χωρίς NAs για να λειτουργήσει σωστά.

# Προβλέψεις στο καθαρό test2
predictTest2 <- predict(LifeLog, type = "response", newdata = test2)

# Δημιουργία αντικειμένου ROCRpred
ROCRpred <- prediction(predictTest2, test2$High_Life)

# Καμπύλη ROC
ROCRperf <- performance(ROCRpred, "tpr", "fpr")
plot(ROCRperf, colorize=TRUE, print.cutoffs.at=seq(0,1,by=0.1))

# Υπολογισμός AUC
auc_val <- performance(ROCRpred, measure = "auc")@y.values[[1]]
cat("Τιμή AUC:", auc_val, "\n")
## Τιμή AUC: 0.9463043

3. Μοντέλο Δέντρων Απόφασης (CART)

Χρησιμοποιούμε τη μέθοδο Classification and Regression Trees (CART) για να χτίσουμε το μοντέλο μας με τη βοήθεια της συνάρτησης rpart. Σε αντίθεση με τη λογιστική παλινδρόμηση, τα δέντρα απόφασης προσφέρουν εξαιρετική ερμηνευσιμότητα των κανόνων λήψης αποφάσεων.

# Κατασκευή δέντρου
LifeTree <- rpart(High_Life ~ ., data = train, method = "class", minbucket = 25)

# Οπτικοποίηση
prp(LifeTree, type = 4, extra = 1, box.palette = "Blues", main = "Δέντρο Απόφασης CART")

Σχολιασμός Δέντρου:

  • Το δέντρο κάνει τον πρώτο και πιο σημαντικό διαχωρισμό (split) με βάση το Income.composition.of.resources (εισόδημα).

  • Στη συνέχεια, εξετάζει τη θνησιμότητα ενηλίκων (Adult.Mortality) και τα έτη εκπαίδευσης (Schooling) για να καταλήξει στα “φύλλα” (leaves) του δέντρου, όπου και παίρνει την τελική απόφαση (0 ή 1) για το προσδόκιμο ζωής.

4. Εφαρμογή Πρόβλεψης &Αξιολόγηση CART (Confusion Matrix)

Αξιολογούμε το μοντέλο CART στο test set χρησιμοποιώντας έναν πίνακα σύγχυσης.

# Προβλέψεις με το CART
predictCART <- predict(LifeTree, newdata = test, type = "class")

# Confusion Matrix για το CART
conf_matrix_cart <- table(test$High_Life, predictCART)
print(conf_matrix_cart)
##    predictCART
##       0   1
##   0 409  15
##   1  78 467
# Υπολογισμός Ακρίβειας CART
accuracy_cart <- sum(diag(conf_matrix_cart)) / sum(conf_matrix_cart)
cat("\nΑκρίβεια μοντέλου CART:", round(accuracy_cart, 4), "\n")
## 
## Ακρίβεια μοντέλου CART: 0.904

5. Καμπύλη ROC και AUC για το μοντέλο CART

Σύμφωνα με τη μεθοδολογία, χρησιμοποιούμε τη βιβλιοθήκη ROCR για να αξιολογήσουμε την ικανότητα διάκρισης του δέντρου. Για το CART, η predict επιστρέφει έναν πίνακα με τις πιθανότητες για κάθε κλάση (0 και 1), οπότε επιλέγουμε τη δεύτερη στήλη.

# Λήψη πιθανοτήτων από το δέντρο (δεύτερη στήλη για την τιμή 1)
predictROC_CART <- predict(LifeTree, newdata = test)
ROCRpred_CART <- prediction(predictROC_CART[,2], test$High_Life)

# Καμπύλη ROC
ROCRperf_CART <- performance(ROCRpred_CART, "tpr", "fpr")
plot(ROCRperf_CART, colorize=TRUE, print.cutoffs.at=seq(0,1,by=0.1), main="ROC Curve - CART Model")

# Υπολογισμός AUC
auc_cart <- performance(ROCRpred_CART, measure = "auc")@y.values[[1]]
cat("Τιμή AUC για το CART:", round(auc_cart, 4), "\n")
## Τιμή AUC για το CART: 0.9177

6. Τελικά Συμπεράσματα

  • Σύγκριση Ακρίβειας: Η Λογιστική Παλινδρόμηση πέτυχε ακρίβεια 0.8865, ενώ το δέντρο CART πέτυχε 0.904.
  • Ερμηνευσιμότητα: Το δέντρο CART προσφέρει μια οπτική απεικόνιση των κανόνων, καθιστώντας σαφές ότι μεταβλητές όπως το εισόδημα και η εκπαίδευση αποτελούν κρίσιμα σημεία διαχωρισμού.
  • Συνολική Απόδοση: Η τιμή AUC (0.9177) επιβεβαιώνει ότι το μοντέλο CART έχει πολύ καλή ικανότητα να διακρίνει τις χώρες με υψηλό προσδόκιμο ζωής, παραμένοντας ταυτόχρονα πιο απλό στην επεξήγηση από τη λογιστική παλινδρόμηση, οπου τιμή AUC είναι 0.9463