Εισαγωγή

Η παρούσα εργασία εκπονήθηκε στο πλαίσιο του μαθήματος Επιχειρηματικής Αναλυτικής, το οποίο διδάσκεται στο 8ο εξάμηνο του Τμήματος Εφαρμοσμένης Πληροφορικής του Πανεπιστημίου Μακεδονίας. Στόχος της εργασίας είναι η εφαρμογή στατιστικής ανάλυσης και η αξιοποίηση της μεθόδου της λογιστικής παλινδρόμησης σε ένα επιλεγμένο σύνολο δεδομένων.

Το σύνολο δεδομένων είναι δημόσια διαθέσιμο στον ιστότοπο του Kaggle και προέρχεται από μια συνεχιζόμενη καρδιαγγειακή μελέτη σε κατοίκους της πόλης Framingham της Μασαχουσέτης. Ο στόχος της ταξινόμησης είναι να προβλεφθεί εάν ο ασθενής έχει 10ετή κίνδυνο μελλοντικής στεφανιαίας νόσου (CHD). Το σύνολο δεδομένων παρέχει τις πληροφορίες των ασθενών. Περιλαμβάνει πάνω από 4.000 αρχεία και 15 χαρακτηριστικά.

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

Τα δεδομένα

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

Οπτικοποίηση δεδομένων
Χαρακτηριστικό Περιγραφή
Demographic:
Sex male or female(Nominal)
Age Age of the patient;(Continuous - Although the recorded ages have been truncated to whole numbers, the concept of age is continuous).
Behavioral:
Current Smoker whether or not the patient is a current smoker (Nominal).
Cigs Per Day the number of cigarettes that the person smoked on average in one day.(can be considered continuous as one can have any number of cigarettes, even half a cigarette.).
Medical (History):
BP Meds whether or not the patient was on blood pressure medication (Nominal)
Prevalent Stroke whether or not the patient had previously had a stroke (Nominal)
Prevalent Hyp whether or not the patient was hypertensive (Nominal).
Diabetes whether or not the patient had diabetes (Nominal)
Medical (Current):
Tot Chol total cholesterol level (Continuous)
Sys BP systolic blood pressure (Continuous)
Dia BP diastolic blood pressure (Continuous)
BMI Body Mass Index (Continuous)
Heart Rate heart rate (Continuous - In medical research, variables such as heart rate though in fact discrete, yet are considered continuous because of large number of possible values.)
Glucose glucose level (Continuous)
Predict Variable:
10 year risk of coronary heart disease CHD (binary: “1”, means “Yes”, “0” means “No”)
male age education currentSmoker cigsPerDay BPMeds prevalentStroke prevalentHyp diabetes totChol sysBP diaBP BMI heartRate glucose TenYearCHD
1 39 4 0 0 0 0 0 0 195 106.0 70 26.97 80 77 0
0 46 2 0 0 0 0 0 0 250 121.0 81 28.73 95 76 0
1 48 1 1 20 0 0 0 0 245 127.5 80 25.34 75 70 0
0 61 3 1 30 0 0 1 0 225 150.0 95 28.58 65 103 1
0 46 3 1 23 0 0 0 0 285 130.0 84 23.10 85 85 0

Προετοιμασία Δεδομένων

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

Ελεγχος τύπου δεδομένων

summary(framingham)
##       male             age          education     currentSmoker   
##  Min.   :0.0000   Min.   :32.00   Min.   :1.000   Min.   :0.0000  
##  1st Qu.:0.0000   1st Qu.:42.00   1st Qu.:1.000   1st Qu.:0.0000  
##  Median :0.0000   Median :49.00   Median :2.000   Median :0.0000  
##  Mean   :0.4292   Mean   :49.58   Mean   :1.979   Mean   :0.4941  
##  3rd Qu.:1.0000   3rd Qu.:56.00   3rd Qu.:3.000   3rd Qu.:1.0000  
##  Max.   :1.0000   Max.   :70.00   Max.   :4.000   Max.   :1.0000  
##                                   NA's   :105                     
##    cigsPerDay         BPMeds        prevalentStroke     prevalentHyp   
##  Min.   : 0.000   Min.   :0.00000   Min.   :0.000000   Min.   :0.0000  
##  1st Qu.: 0.000   1st Qu.:0.00000   1st Qu.:0.000000   1st Qu.:0.0000  
##  Median : 0.000   Median :0.00000   Median :0.000000   Median :0.0000  
##  Mean   : 9.003   Mean   :0.02963   Mean   :0.005899   Mean   :0.3105  
##  3rd Qu.:20.000   3rd Qu.:0.00000   3rd Qu.:0.000000   3rd Qu.:1.0000  
##  Max.   :70.000   Max.   :1.00000   Max.   :1.000000   Max.   :1.0000  
##  NA's   :29       NA's   :53                                           
##     diabetes          totChol          sysBP           diaBP       
##  Min.   :0.00000   Min.   :107.0   Min.   : 83.5   Min.   : 48.00  
##  1st Qu.:0.00000   1st Qu.:206.0   1st Qu.:117.0   1st Qu.: 75.00  
##  Median :0.00000   Median :234.0   Median :128.0   Median : 82.00  
##  Mean   :0.02572   Mean   :236.7   Mean   :132.4   Mean   : 82.89  
##  3rd Qu.:0.00000   3rd Qu.:263.0   3rd Qu.:144.0   3rd Qu.: 89.88  
##  Max.   :1.00000   Max.   :696.0   Max.   :295.0   Max.   :142.50  
##                    NA's   :50                                      
##       BMI          heartRate         glucose         TenYearCHD   
##  Min.   :15.54   Min.   : 44.00   Min.   : 40.00   Min.   :0.000  
##  1st Qu.:23.07   1st Qu.: 68.00   1st Qu.: 71.00   1st Qu.:0.000  
##  Median :25.40   Median : 75.00   Median : 78.00   Median :0.000  
##  Mean   :25.80   Mean   : 75.88   Mean   : 81.97   Mean   :0.152  
##  3rd Qu.:28.04   3rd Qu.: 83.00   3rd Qu.: 87.00   3rd Qu.:0.000  
##  Max.   :56.80   Max.   :143.00   Max.   :394.00   Max.   :1.000  
##  NA's   :19      NA's   :1        NA's   :388

Έλεγχος Κενών Τιμών

Σύνολο κενών τιμών σε ποσοστά %
Missing_Values Absolute
male 0 % 0
age 0 % 0
education 0.0247758376592732 % 105
currentSmoker 0 % 0
cigsPerDay 0.00684285040113261 % 29
BPMeds 0.0125058990089665 % 53
prevalentStroke 0 % 0
prevalentHyp 0 % 0
diabetes 0 % 0
totChol 0.0117980179329873 % 50
sysBP 0 % 0
diaBP 0 % 0
BMI 0.00448324681453516 % 19
heartRate 0.000235960358659745 % 1
glucose 0.0915526191599811 % 388
TenYearCHD 0 % 0
## [1] "645 total empty values"

Παρατηρούμε πως υπάρχουν κενές τιμές na που πρέπει αφαιρεθούν.

clean_framingham <- na.omit(framingham)

print(paste(nrow(framingham) - nrow(clean_framingham) , "rows removed"))
## [1] "582 rows removed"

Data split

library(caTools)
## Warning: package 'caTools' was built under R version 4.4.3
set.seed(983);

split_fra <- sample.split(clean_framingham$TenYearCHD, SplitRatio = 0.65)

train <- subset(clean_framingham, split_fra == TRUE)
test <- subset(clean_framingham, split_fra == FALSE)

print( paste(nrow(train), "rows of train set" ) )
## [1] "2376 rows of train set"
print( paste(nrow(test),  "rows of test set"  ) )
## [1] "1280 rows of test set"

Logistic Regression

Training

# Build formula string
predictors <- paste(setdiff(names(framingham), "TenYearCHD"), collapse = " + ")
formula_str <- paste("TenYearCHD ~", predictors)

# Convert to formula and fit model
model <- glm(as.formula(formula_str), data = train, family = binomial)

summary(model)
## 
## Call:
## glm(formula = as.formula(formula_str), family = binomial, data = train)
## 
## Coefficients:
##                  Estimate Std. Error z value Pr(>|z|)    
## (Intercept)     -8.726455   0.902628  -9.668  < 2e-16 ***
## male             0.550068   0.134604   4.087 4.38e-05 ***
## age              0.062443   0.008423   7.413 1.23e-13 ***
## education       -0.021549   0.060805  -0.354   0.7230    
## currentSmoker    0.098633   0.194824   0.506   0.6127    
## cigsPerDay       0.019427   0.007826   2.482   0.0131 *  
## BPMeds           0.164761   0.298861   0.551   0.5814    
## prevalentStroke  0.460607   0.683340   0.674   0.5003    
## prevalentHyp     0.122383   0.174650   0.701   0.4835    
## diabetes         0.035800   0.428604   0.084   0.9334    
## totChol          0.003452   0.001389   2.486   0.0129 *  
## sysBP            0.019727   0.004843   4.073 4.63e-05 ***
## diaBP           -0.008906   0.008101  -1.099   0.2716    
## BMI              0.020240   0.016226   1.247   0.2123    
## heartRate       -0.005890   0.005264  -1.119   0.2631    
## glucose          0.004901   0.002998   1.635   0.1021    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 2028.0  on 2375  degrees of freedom
## Residual deviance: 1786.8  on 2360  degrees of freedom
## AIC: 1818.8
## 
## Number of Fisher Scoring iterations: 5

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

Μεταβλητή Συντελεστής (Estimate) p-τιμή (Pr(>|z|)) Ερμηνεία
male +0.550 4.38e-05 Οι άντρες έχουν αυξημένη πιθανότητα
age +0.062 1.23e-13 Η ηλικία σχετίζεται θετικά με τον κίνδυνο
cigsPerDay +0.019 0.0131 Περισσότερα τσιγάρα αυξάνουν τον κίνδυνο
totChol +0.003 0.0129 Υψηλή ολική χοληστερίνη αυξάνει τον κίνδυνο
sysBP +0.019 4.63e-05 Η συστολική πίεση σχετίζεται θετικά

Predict

predictTest <- predict(model, type = 'response', newdata = test)

kable(predictTest[1:10])
x
0.0378918
0.1610080
0.0632276
0.2094808
0.0825888
0.0475649
0.1729154
0.0547690
0.0650213
0.1209629

Η συνάρτηση predict μας δείχνει την εκτιμώμενη πιθανότητα το αποτέλεσμα της εξαρτημένης μεταβλητής μέσα στο όριο 0 έως 1.