Βήμα 1: Κατανόηση Προβλήματος & Διερεύνηση Δεδομένων

1. Εισαγωγή

Η παρούσα εργασία εξετάζει τη δυνατότητα πρόβλεψης υψηλών ιατρικών δαπανών ενός ασφαλισμένου με βάση προσωπικά και ιατρικά χαρακτηριστικά όπως η ηλικία, το φύλο, το κάπνισμα και ο Δείκτης Μάζας Σώματος. Το dataset που χρησιμοποιείται προέρχεται από ασφαλιστικό φορέα των ΗΠΑ και περιλαμβάνει 1338 παρατηρήσεις.

1.2 Περιγραφή του συνόλου δεδομένων

# Φόρτωση δεδομένων
data <- read.csv("insurance.csv")
str(data)
## 'data.frame':    1338 obs. of  7 variables:
##  $ age     : int  19 18 28 33 32 31 46 37 37 60 ...
##  $ sex     : chr  "female" "male" "male" "male" ...
##  $ bmi     : num  27.9 33.8 33 22.7 28.9 ...
##  $ children: int  0 1 3 0 0 0 1 3 2 0 ...
##  $ smoker  : chr  "yes" "no" "no" "no" ...
##  $ region  : chr  "southwest" "southeast" "southeast" "northwest" ...
##  $ charges : num  16885 1726 4449 21984 3867 ...
summary(data)
##       age            sex                 bmi           children    
##  Min.   :18.00   Length:1338        Min.   :15.96   Min.   :0.000  
##  1st Qu.:27.00   Class :character   1st Qu.:26.30   1st Qu.:0.000  
##  Median :39.00   Mode  :character   Median :30.40   Median :1.000  
##  Mean   :39.21                      Mean   :30.66   Mean   :1.095  
##  3rd Qu.:51.00                      3rd Qu.:34.69   3rd Qu.:2.000  
##  Max.   :64.00                      Max.   :53.13   Max.   :5.000  
##     smoker             region             charges     
##  Length:1338        Length:1338        Min.   : 1122  
##  Class :character   Class :character   1st Qu.: 4740  
##  Mode  :character   Mode  :character   Median : 9382  
##                                        Mean   :13270  
##                                        3rd Qu.:16640  
##                                        Max.   :63770
head(data)
##   age    sex    bmi children smoker    region   charges
## 1  19 female 27.900        0    yes southwest 16884.924
## 2  18   male 33.770        1     no southeast  1725.552
## 3  28   male 33.000        3     no southeast  4449.462
## 4  33   male 22.705        0     no northwest 21984.471
## 5  32   male 28.880        0     no northwest  3866.855
## 6  31 female 25.740        0     no southeast  3756.622
library(ROCR)

Το dataset περιλαμβάνει τις εξής μεταβλητές:

age: Ηλικία του ασφαλισμένου

sex: Φύλο (male/female)

bmi: Δείκτης Μάζας Σώματος

children: Αριθμός παιδιών

smoker: Αν είναι καπνιστής (yes/no)

region: Περιοχή διαμονής

charges: Ιατρικές δαπάνες σε δολάρια

Προετοιμασία του συνόλου δεδομένων

1.3 Δημιουργία εξαρτημένης μεταβλητής

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

Ως εκ τούτου, δημιουργήθηκε μια νέα δυαδική μεταβλητή (highCharges), η οποία λαμβάνει τιμή: - 1 όταν οι ιατρικές δαπάνες υπερβαίνουν τα 15.000$ - 0 σε κάθε άλλη περίπτωση

Η επιλογή του ορίου των 15.000$ βασίστηκε στην κατανομή των τιμών της charges, όπως φαίνεται από την περιγραφική στατιστική ανάλυση:

summary(data$charges)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1122    4740    9382   13270   16640   63770

Η μέση τιμή (mean) των δαπανών ανέρχεται σε περίπου 13.270, ενώ η διάμεσος (median) ειναι γύρω στις 9.380.Το ποσό των 15.000 αντιπροσωπεύει ένα ανώτερο ποσοστιαίο σημείο (άνω του 70ου percentile), συνεπώς μπορεί να θεωρηθεί ως λογικό και συντηρητικό όριο για την κατηγοριοποίηση μιας δαπάνης ως “υψηλής”.

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

data$highCharges <- ifelse(data$charges > 15000, 1, 0)
table(data$highCharges)
## 
##   0   1 
## 980 358

1.4 Διαχωρισμός σε Train και Test Sets

Για την εκπαίδευση και αξιολόγηση του μοντέλου, τα δεδομένα διαχωρίζονται σε training και test sets σε αναλογία 65%-35%.. Το seed ορίζεται σε 904 (σύμφωνα με το iis22104).

library(caTools)
set.seed(904)

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

nrow(train)
## [1] 870
nrow(test)
## [1] 468

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

Στο στάδιο αυτό δημιουργείται μοντέλο λογιστικής παλινδρόμησης στο training set, στο οποίο περιλαμβάνονται όλες οι ανεξάρτητες μεταβλητές. Η εξαρτημένη μεταβλητή είναι η highCharges και η ανάλυση πραγματοποιείται με τη χρήση της glm() με οικογένεια binomial.

model_full <- glm(highCharges ~ . -charges, data = train, family = "binomial")
summary(model_full)
## 
## Call:
## glm(formula = highCharges ~ . - charges, family = "binomial", 
##     data = train)
## 
## Coefficients:
##                 Estimate Std. Error z value Pr(>|z|)    
## (Intercept)     -4.21659    0.89068  -4.734  2.2e-06 ***
## age              0.02442    0.01049   2.327  0.01995 *  
## sexmale         -0.21111    0.27996  -0.754  0.45082    
## bmi              0.01539    0.02390   0.644  0.51957    
## children         0.30900    0.10344   2.987  0.00281 ** 
## smokeryes        6.98255    0.63575  10.983  < 2e-16 ***
## regionnorthwest  0.19498    0.37628   0.518  0.60434    
## regionsoutheast  0.24215    0.37822   0.640  0.52201    
## regionsouthwest -0.95855    0.49433  -1.939  0.05249 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 1011.07  on 869  degrees of freedom
## Residual deviance:  393.77  on 861  degrees of freedom
## AIC: 411.77
## 
## Number of Fisher Scoring iterations: 6

2.1 Ερμηνεία Συντελεστών και Σημαντικότητας

Από το αποτέλεσμα του summary(model_full), παρατηρούμε τις p-values (Pr(>|z|)) για κάθε ανεξάρτητη μεταβλητή. Οι μεταβλητές με p-value μικρότερο του 0.05 θεωρούνται στατιστικά σημαντικές, δηλαδή έχουν ισχυρή συσχέτιση με την εξαρτημένη highCharges.

Οι μεταβλητές που παρουσιάζουν στατιστικά σημαντική συσχέτιση είναι οι εξής:

  • smokeryes: p < 2e-16 (*), πολύ ισχυρή θετική συσχέτιση.
  • children: p = 0.00281 (), δηλώνει ότι ο αριθμός παιδιών επηρεάζει την πιθανότητα υψηλών δαπανών.
  • age: **p = 0.01995 (*)**, δείχνει ότι όσο αυξάνεται η ηλικία, αυξάνεται η πιθανότητα υψηλών δαπανών.

Οι υπόλοιπες μεταβλητές (sexmale, bmi, region) έχουν p-value > 0.05 και δεν θεωρούνται στατιστικά σημαντικές στο παρόν μοντέλο. Αυτό σημαίνει ότι η συσχέτισή τους με την εξαρτημένη μεταβλητή πιθανόν να είναι τυχαία.


Συνοπτικά, οι σημαντικές ανεξάρτητες μεταβλητές είναι:

Μεταβλητή Συντελεστής p-value Σημαντικότητα
smokeryes 6.93 < 2e-16 *** (πολύ ισχυρή)
children 0.30 0.00281 ** (ισχυρή)
age 0.0244 0.01995 * (μέτρια-ισχυρή)

Βήμα 3: Πρόβλεψη στο Test Set & Αξιολόγηση Απόδοσης

Σε αυτό το βήμα, χρησιμοποιούμε το μοντέλο λογιστικής παλινδρόμησης που δημιουργήσαμε (στο train set) για να κάνουμε προβλέψεις στο test set. Στη συνέχεια, αξιολογούμε την απόδοσή του με βάση:

Confusion Matrix

Ακρίβεια (Accuracy)

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

3.1 Πρόβλεψη Πιθανοτήτων

# Πρόβλεψη πιθανοτήτων στο test set
predictTest <- predict(model_full, type = "response", newdata = test)

# Εμφάνιση πρώτων τιμών
head(predictTest)
##          1          3          4          5          6         12 
## 0.93707496 0.11236170 0.04405172 0.04712277 0.05618973 0.99280347

Η συνάρτηση predict() επιστρέφει τις εκτιμώμενες πιθανότητες να ανήκει κάθε παρατήρηση στην κατηγορία 1 (δηλαδή highCharges = 1). Οι τιμές αυτές κυμαίνονται από 0 έως 1.

Για να μετατραπούν σε κατηγορική πρόβλεψη (0 ή 1), εφαρμόζεται ένα κατώφλι (threshold), το οποίο ορίζεται εδώ ως 0.5: ## 3.2 Μετατροπή σε Κατηγορίες (0/1)

# Μετατροπή πιθανοτήτων σε κατηγορική πρόβλεψη
predictedClass <- ifelse(predictTest > 0.5, 1, 0)

3.3 Confusion Matrix

# Confusion matrix
table(Predicted = predictedClass, Actual = test$highCharges)
##          Actual
## Predicted   0   1
##         0 339  35
##         1   4  90
Από τον παραπάνω πίνακα ταξινόμησης παρατηρούμε:
- True Positives (TP): 90 → σωστές προβλέψεις για άτομα με υψηλές δαπάνες - True Negatives (TN): 339 → σωστές προβλέψεις για άτομα με χαμηλές δαπάνες - False Positives (FP): 35 → προβλέφθηκαν υψηλές δαπάνες ενώ ήταν χαμηλές - False Negatives (FN): 4 → προβλέφθηκαν χαμηλές δαπάνες ενώ ήταν υψηλές
Το μοντέλο δείχνει εξαιρετικά καλή επίδοση, με ελάχιστα σφάλματα ταξινόμησης.

3.4 Υπολογισμός Ακρίβειας (Accuracy)

Η συνολική ακρίβεια του μοντέλου, δηλαδή το ποσοστό σωστών προβλέψεων στο test set, υπολογίζεται ως εξής:

# Υπολογισμός ακρίβειας
accuracy <- mean(predictedClass == test$highCharges)
accuracy
## [1] 0.9166667

Το αποτέλεσμα είναι:

  • Ακρίβεια ≈ 91.7%, δηλαδή το μοντέλο ταξινομεί σωστά τις παρατηρήσεις στο test set με πολύ μεγάλη επιτυχία.

3.5 Συμπεράσματα

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

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

Βήμα 4: ROC Curve & Τελική Αξιολόγηση Μοντέλου

Η ROC curve (Receiver Operating Characteristic) μάς βοηθά να αξιολογήσουμε την ποιότητα της ταξινόμησης σε διαφορετικά κατώφλια. Μετράει την ισορροπία μεταξύ True Positive Rate (TPR) και False Positive Rate (FPR).

4.1 Υπολογισμός και Οπτικοποίηση ROC Curve

Δημιουργία prediction object

pred <- prediction(predictTest, test$highCharges)

Υπολογισμός απόδοσης (TPR vs FPR)

perf <- performance(pred, "tpr", "fpr")

Σχεδίαση ROC curve

plot(perf, colorize = TRUE, main = "ROC Curve", lwd = 2)
abline(a = 0, b = 1, lty = 2, col = "gray")  # Διαγώνια γραμμή τυχαιότητας

4.2 Υπολογισμός AUC (Area Under Curve)

Συμπεράσματα από ROC Curve & AUC

Το AUC (Area Under Curve) του μοντέλου είναι κοντά στο 0.95, που αποτελεί εξαιρετικό αποτέλεσμα. Ένα AUC κοντά στο 1.0 δηλώνει πολύ καλή διακριτική ικανότητα — δηλαδή, το μοντέλο μπορεί να ξεχωρίσει αποτελεσματικά τις περιπτώσεις με υψηλές από εκείνες με χαμηλές χρεώσεις.

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