1. Περιγραφή Dataset

Το σύνολο δεδομένων Heart Disease UCI περιλαμβάνει ιατρικές και δημογραφικές πληροφορίες από 303 ασθενείς, με στόχο την πρόβλεψη της ύπαρξης καρδιοπάθειας. Περιλαμβάνει μεταβλητές όπως ηλικία, φύλο, πίεση, χοληστερίνη και αποτελέσματα ηλεκτροκαρδιογραφήματος. Η εξαρτημένη μεταβλητή είναι δυαδική (1 = υπάρχει καρδιοπάθεια, 0 = δεν υπάρχει), κάτι που το καθιστά ιδανικό για λογιστική παλινδρόμηση. Μέσα από την ανάλυση του, μπορούμε να εντοπίσουμε τους πιο σημαντικούς παράγοντες κινδύνου και να δημιουργήσουμε προγνωστικά μοντέλα, προσφέροντας υποστήριξη σε ιατρικές αποφάσεις και πρόληψη ασθενειών.

Link(Kaggle.com)

df<-read.csv("heart_cleveland_upload.csv") #Ανάγνωση του αρχείου

2. Περιγραφή Μεταβλητών

Όνομα Μεταβλητής Τύπος Περιγραφή
age Αριθμητική Ηλικία ασθενούς σε έτη
sex Κατηγορική

Φύλο

(0=Γυναίκα, 1=Άνδρας)

cp Κατηγορική

Τύπος θωρακικού πόνου:

1 = Τυπικός στηθαγχικός πόνος
2 = Άτυπος στηθαγχικός
3 = Μη στηθαγχικός πόνος
4 = Ασυμπτωματικός

trestbps Αριθμητική Αρτηριακή πίεση (σε mm Hg
chol Αριθμητική Ολική χοληστερίνη στο αίμα (mg/dl)
fbs Δυαδική

Σάκχαρο νηστείας > 120 mg/dl

(0=Όχι, 1=Ναι)

restecg Κατηγορική

Αποτελέσματα ηρεμίας ηλεκτροκαρδιογραφήματος:

0 = Κανονικό

1 = Ανωμαλία ST-T κυμάτων

2 = Υπερτροφία κοιλιών

thalach Αριθμητική Μέγιστος καρδιακός ρυθμός (σε παλμούς ανά λεπτό)
exang Δυαδική

Πόνος στο στήθος λόγω άσκησης

(0=Όχι, 1=Ναι)

oldpeak Αριθμητική Κατάθλιψη ST κατά την άσκηση σε σύγκριση με την ηρεμία
slope Κατηγορική

Κλίση ST τμήματος κατά την άσκηση:

1 = ανερχόμενη

2 = επίπεδη

3 = κατερχόμενη

ca Κατηγορική Αριθμός κύριων αιμοφόρων αγγείων με χρώση φλουοροσκόπησης
thal Κατηγορική

Αποτελέσματα σπινθηρογραφήματος με θάλλιο:

3 = Κανονικό

6 = Σταθερό ελάττωμα

7 = Αντιστρέψιμο ελάττωμα

condition Κατηγορική

Ένδειξη ύπαρξης καρδιοπάθειας

(0=Όχι, 1=Ναι)

3. Έλεγχος για ελλιπείς και διπλότυπες τιμές

cat("Σύνολο ελλιπών τιμών:", sum(is.na(df)), "\n") #Έλεγχος για ελλιπείς τιμές (NA). Αν αποτέλεσμα > 0 τότε έχουμε ελλιπείς τιμές
## Σύνολο ελλιπών τιμών: 0
cat("Διπλότυπες γραμμές:", sum(duplicated(df)), "\n") #Έλεγχος για διπλότυπες εγγραφές. Αν το αποτέλεσμα είναι > 0, τότε υπάρχουν διπλές εγγραφές.
## Διπλότυπες γραμμές: 0

4. Δημιουργία Train και Test Set

Διαχωρίζουμε τα δεδομένα σε training και testing set με τυχαίο τρόπο. Το 65% των δεδομένων θα χρησιμοποιηθεί για το training set και το υπόλοιπο 35% για το testing set.

set.seed(960)

split <- sample.split(df$condition, SplitRatio = 0.65)
train <- subset(df, split == TRUE)
test <- subset(df, split == FALSE)

cat("Καταχωρήσεις στο training set:", nrow(train), "\n")
## Καταχωρήσεις στο training set: 193
cat("Καταχωρήσεις στο test set:", nrow(test), "\n")
## Καταχωρήσεις στο test set: 104
# Μετατροπή κατηγορικών μεταβλητών σε factors
factor_vars <- c("sex", "cp", "fbs", "restecg", "exang", "slope", "ca", "thal", "condition")
df[factor_vars] <- lapply(df[factor_vars], factor)

5. Δημιουργία Μοντέλου Λογιστικής Παλινδρόμησης

Δημιουργούμε το μοντέλο Λογιστικής Παλινδρόμησης χρησιμοποιώντας το training set και συμπεριλαμβάνοντας όλες τις ανεξάρτητες μεταβλητές. Προηγήθηκε, βέβαια, μετατροπή των κατηγορικών μεταβλητών σε factors ώστε να μην οδηγηθούμε σε λανθασμένα συμπεράσματα.

model <- glm(condition ~ ., data = train, family = "binomial")
summary(model)
## 
## Call:
## glm(formula = condition ~ ., family = "binomial", data = train)
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)    
## (Intercept) -3.528060   3.415666  -1.033 0.301648    
## age         -0.020176   0.030444  -0.663 0.507506    
## sex          1.137447   0.615851   1.847 0.064754 .  
## cp           0.518006   0.229315   2.259 0.023888 *  
## trestbps     0.032896   0.013705   2.400 0.016380 *  
## chol         0.004750   0.005356   0.887 0.375181    
## fbs         -1.384655   0.663692  -2.086 0.036952 *  
## restecg      0.309008   0.236391   1.307 0.191149    
## thalach     -0.033620   0.012915  -2.603 0.009236 ** 
## exang        0.760678   0.548848   1.386 0.165761    
## oldpeak      0.219196   0.248920   0.881 0.378541    
## slope        0.444541   0.436597   1.018 0.308586    
## ca           1.083007   0.310856   3.484 0.000494 ***
## thal         0.752168   0.259760   2.896 0.003784 ** 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 266.39  on 192  degrees of freedom
## Residual deviance: 133.03  on 179  degrees of freedom
## AIC: 161.03
## 
## Number of Fisher Scoring iterations: 6

Με βάση τα αποτελέσματα του μοντέλου λογιστικής παλινδρόμησης, εντοπίζουμε τις ανεξάρτητες μεταβλητές που έχουν στατιστικά σημαντική συσχέτιση με την εξαρτημένη μεταβλητή condition (παρουσία καρδιοπάθειας). Η αξιολόγηση βασίζεται στις τιμές p-value και στα επίπεδα σημαντικότητας.

Στατιστικά σημαντικές μεταβλητές (p < 0.05):

Μεταβλητή Συντελεστής (Estimate) P-value Σημασία
cp 0.5180 0.0239 Σημαντική
trestbps 0.0329 0.0164 Σημαντική
fbs -1.3847 0.0370 Σημαντική
thalach -0.0336 0.0092 Πολύ Σημαντική
ca 1.0830 0.0005 Εξαιρετικά Σημαντική
thal 0.7522 0.0038 Πολύ Σημαντική

Οριακά σημαντική μεταβλητή (p < 0.1):

Μεταβλητή Συντελεστής P-value Σχόλιο
sex 1.1374 0.0648 Οριακά Σημαντική

Μη σημαντικές μεταβλητές (p > 0.1):

Αυτές οι μεταβλητές δεν εμφανίζουν στατιστικά σημαντική επίδραση στο συγκεκριμένο μοντέλο:

Μεταβλητή Συντελεστής (Estimate) P-value Σχόλιο
age -0.0202 0.5075 Χαμηλή συσχέτιση
chol 0.0048 0.3752 Δεν σχετίζεται έντονα
restecg 0.3090 0.1911 Μη σημαντικό
exang 0.7607 0.1658 Δεν είναι στατιστικά ισχυρό
oldpeak 0.2192 0.3785 Αδύναμη συσχέτιση
slope 0.4445 0.3086 Δεν επηρεάζει σημαντικά

6. Προβλέψεις στο Test Set

Στο επόμενο βήμα εφαρμόζουμε το μοντέλο λογιστικής παλινδρόμησης στο σύνολο ελέγχου (test set) με τη χρήση της συνάρτησης predict(). Η συνάρτηση αυτή επιστρέφει την πιθανότητα κάθε παρατήρησης να ανήκει στην κατηγορία “1” (δηλαδή παρουσία καρδιοπάθειας).

predictTest <- predict(model, newdata = test, type = "response")
head(predictTest)
##          4          6         15         18         23         24 
## 0.06881633 0.61680511 0.24614816 0.56714895 0.02759315 0.30146628

Οι παραπάνω αριθμοί αποτελούν ενδεικτικά αποτελέσματα της συνάρτησης predict() για έξι παρατηρήσεις από το test set. Αντιστοιχούν στις εκτιμώμενες πιθανότητες ότι κάθε άτομο έχει καρδιοπάθεια, σύμφωνα με το μοντέλο λογιστικής παλινδρόμησης.

Σχολιασμός:

  • Η τιμή 0.06881633 στη γραμμή 4 του test set μας δείχνει ότι υπάρχει 6.88% πιθανότητα ο άνθρωπος αυτός να ανήκει στην κατηγορία των καρδιοπαθών.

  • Αντίθετα, η τιμή 0.61680511 στη γραμμή 6 του test set δείχνει αυξημένη πιθανότητα, 61.68%, ο άνθρωπος να είναι καρδιοπαθής.

7. Συμπεράσματα

Από την ανάλυση της λογιστικής παλινδρόμησης προέκυψε ότι ορισμένες μεταβλητές, όπως οι thalac, ca, thal, trestbps, fbs και cp, έχουν στατιστικά σημαντική συσχέτιση με την πιθανότητα εμφάνισης καρδιοπάθειας. Αντίθετα, άλλες μεταβλητές, όπως η age, chol και oldpeak δεν φάνηκαν να επηρεάζουν σημαντικά το αποτέλεσμα στο συγκεκριμένο μοντέλο.

Οι προβλέψεις που προέκυψαν από το test set μάς δίνουν την πιθανότητα κάθε παρατήρησης να παρουσιάζει καρδιοπάθεια, και είναι χρήσιμες για την κατηγοριοποίηση μελλοντικών περιπτώσεων. Οι τιμές των πιθανοτήτων κυμαίνονται από χαμηλές (π.χ. 6%) έως μέτριες ή υψηλές (π.χ. 61%), γεγονός που δείχνει πως το μοντέλο μπορεί να διακρίνει περιπτώσεις με διαφορετικό βαθμό κινδύνου.

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