Για την παρούσα εργασία συνεχίζουμε με το 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
## Καταχωρήσεις στο test set: 969
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 = "Προσδόκιμο Ζωής")Το γράφημα αποκαλύπτει μια ισχυρή γραμμική σχέση μεταξύ της εκπαίδευσης και του προσδόκιμου ζωής, υποδεικνύοντας ότι η πρόσβαση στη γνώση αποτελεί έναν από τους σημαντικότερους δείκτες κοινωνικής ευημερίας. Η ανοδική πορεία της γραμμής τάσης δείχνει ότι όσο αυξάνονται τα έτη φοίτησης, τόσο βελτιώνεται το επίπεδο υγείας και η ποιότητα ζωής του πληθυσμού.
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 χώρες έχουν πολύ μεγαλύτερο εύρος τιμών και αρκετές ακραίες χαμηλές τιμές, που υποδεικνύουν την ύπαρξη χωρών που υστερούν σημαντικά ίσως λόγω κρίσεων ή έλλειψης υποδομών.
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.
Δημιουργούμε ξανά εν τάχει το μοντέλο Λογιστικής Παλινδρόμησης για να έχουμε ένα μέτρο σύγκρισης για την απόδοση του δέντρου.
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
Σύμφωνα με την οδηγία, δημιουργούμε νέα σύνολα χωρίς κενές τιμές για την ανάλυση ROCR.
## Καταχωρήσεις στο train2: 1799
## Καταχωρήσεις στο test2: 969
Για το set train2 έχουμε 1793 καταχωρήσεις και για το set test2 έχουμε 975 καταχωρήσεις.
Τέλος, χρησιμοποιούμε τη βιβλιοθήκη 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
Χρησιμοποιούμε τη μέθοδο 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) για το προσδόκιμο ζωής.
Αξιολογούμε το μοντέλο 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
Σύμφωνα με τη μεθοδολογία, χρησιμοποιούμε τη βιβλιοθήκη
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