Εργασία 6
2025-04-06
Διερεύνηση του συνόλου δεδομένων (dataset)
Περιγραφή Dataset
Το dataset “Wine Quality” είναι διαθέσιμο από το UCI Machine Learning Repository και περιέχει χημικά και αισθητικά χαρακτηριστικά κρασιών, με στόχο την πρόβλεψη της ποιότητας τους. Το αρχείο που εξετάζουμε είναι το winequality-red.csv, το οποίο περιλαμβάνει δεδομένα για κόκκινα κρασιά από την Πορτογαλία.
Γενικά Στατιστικά
Σύνολο εγγραφών: 1.599 δείγματα κρασιών
Αριθμός χαρακτηριστικών (features): 11 χημικά χαρακτηριστικά + 1 στόχος (ποιότητα)
Περιγραφή μεταβλητών- fixed acidity: Σταθερή οξύτητα
- volatile acidity: Πτητική οξύτητα
- citric acid: Κιτρικό οξύ
- residual sugar: Υπολειπόμενα σάκχαρα
- chlorides: Χλωριούχα
- free sulfur dioxide: Ελεύθερο διοξείδιο του θείου
- total sulfur dioxide: Συνολικό διοξείδιο του θείου
- density: Πυκνότητα
- pH: Επίπεδο pH
- sulphates: Θειικά
- alcohol: Περιεκτικότητα σε αλκοόλ
- quality: Βαθμολογία ποιότητας (0–10, integer - στόχος)
Σκοπός του Dataset Ο βασικός στόχος είναι η πρόβλεψη της ποιότητας του κρασιού βάσει των φυσικοχημικών χαρακτηριστικών του.
Boxplot
ggplot(wine, aes(x = factor(quality), y = volatile.acidity)) +
geom_boxplot(fill = "#90D5FF") + # Steel Blue χρώμα
labs(title = "Volatile Acidity vs Quality",
x = "Quality",
y = "Volatile Acidity") +
theme_minimal()Το παραπάνω διάγραμμα απεικονίζει τη σχέση μεταξύ της πτητικής οξύτητας (volatile acidity) και της ποιότητας του κόκκινου κρασιού. Παρατηρείται μια φθίνουσα τάση, σύμφωνα με την οποία η αύξηση της ποιότητας σχετίζεται με μείωση της πτητικής οξύτητας. Τα κρασιά χαμηλής ποιότητας (τιμές 3 και 4) εμφανίζουν γενικά υψηλότερες συγκεντρώσεις πτητικής οξύτητας και μεγαλύτερη διακύμανση, ενώ αντίθετα, τα κρασιά υψηλής ποιότητας (7 και 8) παρουσιάζουν χαμηλότερες τιμές με μικρότερη διασπορά και λιγότερες εξαιρέσεις.
Scatterplot
ggplot(wine, aes(x = density, y = alcohol)) +
geom_point(alpha = 0.5, color = "#D55E00") +
labs(title = "Alcohol vs Density",
x = "Density",
y = "Alcohol") +
theme_minimal()
Το διάγραμμα διασποράς που απεικονίζει τη σχέση μεταξύ της
περιεκτικότητας σε αλκοόλ και της πυκνότητας του κρασιού, αποκαλύπτει
μια ξεκάθαρη αρνητική συσχέτιση. Συγκεκριμένα, παρατηρείται ότι όσο
αυξάνεται η περιεκτικότητα σε αλκοόλ, η πυκνότητα του κρασιού τείνει να
μειώνεται. Το φαινόμενο αυτό είναι αναμενόμενο, καθώς το αλκοόλ έχει
μικρότερη πυκνότητα από το νερό, επομένως κρασιά με υψηλότερη
περιεκτικότητα σε αλκοόλ είναι γενικά λιγότερο πυκνά. Το σχήμα
υποδηλώνει μια σχετικά συνεπή τάση, χωρίς όμως να είναι απόλυτα
γραμμική, γεγονός που μπορεί να οφείλεται σε παρεμβολές άλλων χημικών
παραμέτρων.
Histogram
# Ιστογράφημα για την "fixed acidity"
ggplot(wine, aes(x = fixed.acidity)) +
geom_histogram(binwidth = 1, fill = "blue", color = "black", alpha = 0.7) +
labs(title = "Ιστογράφημα της Σταθερής Οξύτητας", x = "Σταθερή Οξύτητα", y = "Συχνότητα") +
theme_minimal()
Το ιστόγραμμα παρουσιάζει την κατανομή της σταθερής οξύτητας στα
κρασιά του δείγματος. Η πλειονότητα των παρατηρήσεων εντοπίζεται μεταξύ
των τιμών 6 και 9, γεγονός που δείχνει ότι τα περισσότερα κρασιά
διαθέτουν μέτρια επίπεδα σταθερής οξύτητας. Η κατανομή εμφανίζει δεξιά
ασυμμετρία, καθώς παρατηρούνται λιγότερες αλλά υπαρκτές περιπτώσεις με
υψηλότερες τιμές οξύτητας.
Bar Chart
# Ραβδόγραμμα για την "quality"
ggplot(wine, aes(x = factor(quality))) + # factor για να το θεωρήσουμε κατηγορικό
geom_bar(fill = "steelblue", color = "black") +
labs(title = "Κατανομή Βαθμολογίας Ποιότητας Κρασιού",
x = "Βαθμολογία Ποιότητας", y = "Συχνότητα") +
theme_minimal()
Το διάγραμμα απεικονίζει την κατανομή της βαθμολογίας ποιότητας των
κρασιών. Παρατηρείται ότι οι περισσότερες ετικέτες συγκεντρώνονται γύρω
από τις τιμές 5 και 6, οι οποίες εμφανίζουν τη μεγαλύτερη συχνότητα.
Αντίθετα, οι ακραίες τιμές της κλίμακας, όπως οι βαθμολογίες 3, 4, 7 και
8, είναι πολύ λιγότερο συχνές. Η κατανομή υποδηλώνει ότι τα κρασιά του
δείγματος χαρακτηρίζονται κυρίως από μέτρια ποιότητα.
Μοντέλα Γραμμικής Παλινδρόμησης
Πρόβλεψη ποιότητας μέσω του ποσοστού αλκοόλης
##
## Call:
## lm(formula = quality ~ alcohol, data = wine)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.8442 -0.4112 -0.1690 0.5166 2.5888
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 1.87497 0.17471 10.73 <2e-16 ***
## alcohol 0.36084 0.01668 21.64 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.7104 on 1597 degrees of freedom
## Multiple R-squared: 0.2267, Adjusted R-squared: 0.2263
## F-statistic: 468.3 on 1 and 1597 DF, p-value: < 2.2e-16
## [1] 0.503984
## [1] 0.2267344
Το μοντέλο παρουσίασε R-squared error ίσο με 0.2267, το οποίο υποδηλώνει ότι το αλκοόλ εξηγεί περίπου το 22.67% της μεταβλητότητας στην ποιότητα του κρασιού. Αυτός ο συντελεστής R-squared είναι σχετικά χαμηλός, που σημαίνει ότι άλλα χαρακτηριστικά του κρασιού πιθανότατα παίζουν σημαντικότερο ρόλο στην πρόβλεψη της ποιότητας του κρασιού και το SSE είναι ίσο με 0.7104, που υποδεικνύει το μέσο σφάλμα απόκλισης των παρατηρήσεων από την προγνωστική γραμμή.
Προσθήκη πτητικής οξύτητας
##
## Call:
## lm(formula = quality ~ alcohol + volatile.acidity, data = wine)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.59342 -0.40416 -0.07426 0.46539 2.25809
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 3.09547 0.18450 16.78 <2e-16 ***
## alcohol 0.31381 0.01601 19.60 <2e-16 ***
## volatile.acidity -1.38364 0.09527 -14.52 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.6678 on 1596 degrees of freedom
## Multiple R-squared: 0.317, Adjusted R-squared: 0.3161
## F-statistic: 370.4 on 2 and 1596 DF, p-value: < 2.2e-16
## [1] 0.4451509
## [1] 0.3170024
Με την προσθήκη της μεταβλητής “πτητική οξύτητα”, το R-squared αυξήθηκε από 0.2267 σε 0.3170. Αυτό δείχνει ότι η “πτητική οξύτητα” προσφέρει σημαντική επιπλέον εξήγηση για την ποιότητα του κρασιού, καθώς το μοντέλο πλέον εξηγεί το 31.7% της μεταβλητότητας στην ποιότητα. Αυτό καταδεικνύει ότι η “πτητική οξύτητα” έχει μια ισχυρή επίδραση στην ποιότητα του κρασιού και βοηθάει να βελτιωθεί το μοντέλο, μειώνοντας το SSE σε 0.6678 από 0.7104.
Προσθήκη σταθερής οξύτητας
##
## Call:
## lm(formula = quality ~ alcohol + volatile.acidity + fixed.acidity,
## data = wine)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.65565 -0.39856 -0.08143 0.46879 2.28524
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.674469 0.218033 12.27 < 2e-16 ***
## alcohol 0.320726 0.016064 19.96 < 2e-16 ***
## volatile.acidity -1.286244 0.098716 -13.03 < 2e-16 ***
## fixed.acidity 0.035763 0.009961 3.59 0.00034 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.6653 on 1595 degrees of freedom
## Multiple R-squared: 0.3225, Adjusted R-squared: 0.3212
## F-statistic: 253.1 on 3 and 1595 DF, p-value: < 2.2e-16
## [1] 0.4415823
## [1] 0.3224777
Με την προσθήκη της μεταβλητής “σταθερή οξύτητα”, το R-squared αυξήθηκε ελαφρώς, φτάνοντας στην τιμή 0.3225 από 0.3170. Επίσης, η τιμή του SSE μειώθηκε ελαφρώς από 0.6678 σε 0.6653, κάνοντάς το μοντέλο λίγο πιο ακριβές.
Προσθήκη κιτρικού οξέος
##
## Call:
## lm(formula = quality ~ alcohol + volatile.acidity + fixed.acidity +
## citric.acid, data = wine)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.66067 -0.39574 -0.08317 0.45552 2.30153
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 2.62245 0.21892 11.979 < 2e-16 ***
## alcohol 0.32452 0.01613 20.122 < 2e-16 ***
## volatile.acidity -1.41997 0.11450 -12.401 < 2e-16 ***
## fixed.acidity 0.05597 0.01328 4.214 2.65e-05 ***
## citric.acid -0.31378 0.13667 -2.296 0.0218 *
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.6645 on 1594 degrees of freedom
## Multiple R-squared: 0.3247, Adjusted R-squared: 0.323
## F-statistic: 191.6 on 4 and 1594 DF, p-value: < 2.2e-16
## [1] 0.4401269
## [1] 0.3247107
Η προσθήκη του “κιτρικού οξέος” δεν είχε μεγάλη επίδραση στο R-squared, το οποίο αυξήθηκε ελαφρώς στο 0.3247. Αυτή η αλλαγή είναι μικρή, και το μοντέλο παρέμεινε ουσιαστικά στα ίδια επίπεδα απόδοσης. Η βελτίωση του SSE ήταν επίσης μικρή, υποδεικνύοντας ότι το “κιτρικό οξύ” δεν προσέφερε σημαντική νέα πληροφορία για την πρόβλεψη της ποιότητας του κρασιού σε σχέση με τις προηγούμενες μεταβλητές.
Συμπεράσματα μοντέλου γραμμικής παλινδρόμησης
Η βελτίωση του μοντέλου φαίνεται να φτάνει ένα σημείο κορεσμού μετά την προσθήκη των βασικών μεταβλητών, “αλκοόλ” και “πτητική οξύτητα”. Η περαιτέρω προσθήκη άλλων παραμέτρων, όπως η “σταθερή οξύτητα” και το “κιτρικό οξύ”, δεν φαίνεται να συνεισφέρουν σημαντικά στην εξήγηση της ποιότητας του κρασιού, καθώς η βελτίωση του R-squared και η μείωση του SSE είναι μικρές.
Η παραπάνω τιμή του RMSE δηλώνει ότι η μέση απόκλιση των προβλέψεων του μοντέλου από τις πραγματικές τιμές της ποιότητας του κρασιού είναι περίπου 0.65 μονάδες. Αυτό σημαίνει ότι όταν το μοντέλο προβλέπει π.χ. ποιότητα ίση με 6.5, η πραγματική ποιότητα είναι κατά μέσο όρο μεταξύ 5.85 και 7.15. Δεδομένου ότι η μεταβλητή quality παίρνει ακέραιες τιμές από το 0 έως το 10, το σφάλμα αυτό είναι σχετικά μικρό και δείχνει ότι το μοντέλο έχει καλή προσαρμογή, χωρίς όμως να είναι τέλειο.
Μοντέλο λογιστικής παλινδρόμησης
Διαχωρισμός σε train και test set
# Διαχωρισμός σε training (65%) και testing (35%) sets με seed = 902
set.seed(902)
# Δημιουργία training set με το 65% των παρατηρήσεων
train_indices <- sample(1:nrow(wine), size = 0.65 * nrow(wine))
train <- wine[train_indices, ]
# Το υπόλοιπο είναι test set
test <- wine[-train_indices, ]
# Εμφάνιση πλήθους καταχωρήσεων
cat("Train set:", nrow(train), "καταχωρήσεις\n")## Train set: 1039 καταχωρήσεις
cat("Test set:", nrow(test), "καταχωρήσεις\n")## Test set: 560 καταχωρήσεις
# Δημιουργία δυαδικής μεταβλητής στο training set
train$good_quality <- ifelse(train$quality >= 6, 1, 0)
test$good_quality <- ifelse(test$quality >= 6, 1, 0)
# Δημιουργία λογιστικού μοντέλου
logit_model <- glm(good_quality ~ . - quality - good_quality,
data = train,
family = "binomial")
# Περίληψη μοντέλου
summary(logit_model)##
## Call:
## glm(formula = good_quality ~ . - quality - good_quality, family = "binomial",
## data = train)
##
## Coefficients:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) -84.809862 100.754725 -0.842 0.39993
## fixed.acidity 0.056570 0.122706 0.461 0.64478
## volatile.acidity -3.198298 0.613487 -5.213 1.85e-07 ***
## citric.acid -1.961883 0.703529 -2.789 0.00529 **
## residual.sugar -0.031928 0.067169 -0.475 0.63455
## chlorides -4.927979 1.935998 -2.545 0.01091 *
## free.sulfur.dioxide 0.027569 0.010291 2.679 0.00738 **
## total.sulfur.dioxide -0.016053 0.003619 -4.436 9.18e-06 ***
## density 80.383535 102.911262 0.781 0.43475
## pH -1.361105 0.909415 -1.497 0.13448
## sulphates 3.208052 0.607358 5.282 1.28e-07 ***
## alcohol 0.952584 0.132150 7.208 5.66e-13 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## (Dispersion parameter for binomial family taken to be 1)
##
## Null deviance: 1430.9 on 1038 degrees of freedom
## Residual deviance: 1089.8 on 1027 degrees of freedom
## AIC: 1113.8
##
## Number of Fisher Scoring iterations: 4
Ανάλυση του Μοντέλου Λογιστικής Παλινδρόμησης
Για την πρόβλεψη της πιθανότητας ένα κρασί να ανήκει στην κατηγορία «καλής ποιότητας», δημιουργήθηκε ένα μοντέλο λογιστικής παλινδρόμησης στο training set, χρησιμοποιώντας όλες τις ανεξάρτητες μεταβλητές του dataset και εξαιρώντας τις quality και good_quality από τις εξηγηματικές μεταβλητές (η good_quality χρησιμοποιείται ως εξαρτημένη).
Από την ανάλυση των αποτελεσμάτων του μοντέλου, προκύπτουν τα εξής συμπεράσματα:
Οι μεταβλητές με στατιστικά σημαντική επίδραση (p-value < 0.05) στην πιθανότητα ένα κρασί να είναι καλής ποιότητας είναι:
- volatile.acidity (πτητική οξύτητα): αρνητικός συντελεστής, δείχνει ότι όσο αυξάνεται η πτητική οξύτητα, μειώνεται η πιθανότητα καλής ποιότητας.
- citric.acid (κιτρικό οξύ): αρνητική επίδραση στην ποιότητα.
- chlorides (χλωρίδια): επίσης αρνητική συσχέτιση.
- free.sulfur.dioxide και total.sulfur.dioxide: η ελεύθερη μορφή έχει θετική επίδραση, ενώ η συνολική ποσότητα σχετίζεται αρνητικά με την ποιότητα.
- sulphates: μία από τις πιο ισχυρά θετικά συσχετισμένες μεταβλητές με την καλή ποιότητα.
- alcohol: η σημαντικότερη θετική μεταβλητή· όσο μεγαλύτερη η περιεκτικότητα σε αλκοόλ, τόσο μεγαλύτερη η πιθανότητα το κρασί να θεωρείται καλής ποιότητας.
- Οι μεταβλητές residual sugar, pH, density, και fixed acidity δεν παρουσίασαν στατιστικά σημαντική συσχέτιση με την εξαρτημένη μεταβλητή και ενδέχεται να μην προσφέρουν σημαντική πληροφορία στο παρόν μοντέλο.
- Το μοντέλο παρουσίασε Residual Deviance = 1089.8 και AIC = 1113.8, τιμές που υποδεικνύουν ικανοποιητική, αν και όχι άριστη, προσαρμογή. Ο αριθμός των Fisher Scoring επαναλήψεων ήταν 4, δείχνοντας ότι το μοντέλο συγκλίνει γρήγορα.
Συνολικά, το μοντέλο εντοπίζει μεταβλητές με ουσιαστική επίδραση στην πιθανότητα υψηλής ποιότητας, και ιδιαίτερα υποδεικνύει ότι κρασιά με μεγαλύτερη περιεκτικότητα σε αλκοόλ και θειικά παρουσιάζουν αυξημένες πιθανότητες θετικής αξιολόγησης. Αντίθετα, υψηλές τιμές πτητικής οξύτητας και χλωριδίων λειτουργούν αποτρεπτικά ως προς την καλή ποιότητα.
Προβλέψεις με βάση το Μοντέλο Λογιστικής Παλινδρόμησης
Αφού εκπαιδεύσαμε το μοντέλο λογιστικής παλινδρόμησης στο train set, προχωρήσαμε στη φάση των προβλέψεων για το test set. Για τον σκοπό αυτό, χρησιμοποιήθηκε η συνάρτηση predict().
## 1 6 8 10 12 13
## 0.2445727 0.2625227 0.4039432 0.4529341 0.4529341 0.2134330
Παρατηρούμε ότι οι τιμές βρίσκονται όλες κάτω από το 0.5, το οποίο αποτελεί τη συνήθη τιμή κατωφλίου (threshold) για να χαρακτηριστεί ένα κρασί ως καλής ποιότητας. Συνεπώς, το μοντέλο προβλέπει για όλες αυτές τις παρατηρήσεις ότι δεν ανήκουν στην κατηγορία καλής ποιότητας.
Η πιο υψηλή προβλεπόμενη πιθανότητα από αυτές είναι περίπου 0.4529, δηλαδή 45.29%. Αυτό δείχνει πως, για τις συγκεκριμένες περιπτώσεις, το μοντέλο δεν είναι ιδιαίτερα “σίγουρο” για κάποια καλή ποιότητα, καθώς καμία πιθανότητα δεν πλησιάζει το 0.8 ή παραπάνω, που θα υποδήλωνε ισχυρή πρόβλεψη.
Γενικότερα, αυτό υποδηλώνει ότι:
Το μοντέλο πιθανόν είναι συντηρητικό στις προβλέψεις του για καλή ποιότητα.
Η απόσταση των πιθανοτήτων από το 0.5 είναι μικρή, γεγονός που μπορεί να οδηγήσει σε χαμηλή διαχωριστική ικανότητα (discriminative power).
Confusion Matrix & Δείκτες Απόδοσης (threshold = 0.5)
## Actual
## Predicted 0 1
## 0 200 54
## 1 74 232
## Accuracy: 0.7714
## Sensitivity (True Positive Rate): 0.8112
## Specificity (True Negative Rate): 0.7299
## Baseline Model Accuracy: 0.5107
Η αξιολόγηση του μοντέλου με κατώφλι πρόβλεψης 0.5 ανέδειξε ικανοποιητικά αποτελέσματα. Συγκεκριμένα, η ακρίβεια (accuracy) ανήλθε στο 77.14%, ενώ ο δείκτης ευαισθησίας (sensitivity) έφτασε το 81.12%, υποδεικνύοντας ότι το μοντέλο καταφέρνει να αναγνωρίζει με μεγάλη επιτυχία τα δείγματα καλής ποιότητας. Ο δείκτης ειδικότητας (specificity) ανήλθε στο 72.99%, γεγονός που δείχνει ότι το μοντέλο μπορεί επίσης να αναγνωρίζει ικανοποιητικά τα δείγματα χαμηλότερης ποιότητας, αν και με ελαφρώς μικρότερη ακρίβεια.
Σε σύγκριση με το baseline μοντέλο, το οποίο πετυχαίνει ακρίβεια μόλις 51.07% ακολουθώντας την απλή στρατηγική πρόβλεψης της συχνότερης κατηγορίας, το προτεινόμενο μοντέλο παρουσιάζει σαφώς ανώτερη απόδοση. Αυτό υποδηλώνει ότι η επιλογή των μεταβλητών και η μαθηματική προσαρμογή συνέβαλαν ουσιαστικά στην επιτυχή πρόβλεψη της ποιότητας του κρασιού.
Δημιουργία ROCRpred με την predict
## A prediction instance
## with 1599 data points
Δημιουργία train2 / test2 με χρήση na.omit()
## Train2 set: 1039 παρατηρήσεις
## Test2 set: 560 παρατηρήσεις
Καμπύλη ROC
## Type 'citation("pROC")' for a citation.
##
## Attaching package: 'pROC'
## The following objects are masked from 'package:stats':
##
## cov, smooth, var
## Setting levels: control = 0, case = 1
## Setting direction: controls < cases
## AUC: 0.8288627
Το διάγραμμα παρουσιάζει μία κυρτή ROC καμπύλη, η οποία απέχει σημαντικά από τη διαγώνια γραμμή του τυχαίου μοντέλου. Αυτό υποδηλώνει ότι το μοντέλο έχει καλή διαχωριστική ικανότητα.
Τιμή AUC = 0.829
Ανιχνεύει σωστά ένα σημαντικό ποσοστό των περιπτώσεων καλής ποιότητας (υψηλή ευαισθησία),
Χωρίς να κάνει πολλές λανθασμένες θετικές προβλέψεις (αποδεκτή ειδικότητα).