Εργασία 6

2025-04-06

Μιχαήλ Παπανικολάου

Περιγραφή Dataset

Το dataset “Wine Quality” είναι διαθέσιμο από το UCI Machine Learning Repository και περιέχει χημικά και αισθητικά χαρακτηριστικά κρασιών, με στόχο την πρόβλεψη της ποιότητας τους. Το αρχείο που εξετάζουμε είναι το winequality-red.csv, το οποίο περιλαμβάνει δεδομένα για κόκκινα κρασιά από την Πορτογαλία.


Γενικά Στατιστικά

Σύνολο εγγραφών: 1.599 δείγματα κρασιών

Αριθμός χαρακτηριστικών (features): 11 χημικά χαρακτηριστικά + 1 στόχος (ποιότητα)

Περιγραφή μεταβλητών


Σκοπός του 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 είναι μικρές.

Μοντέλο λογιστικής παλινδρόμησης


Διαχωρισμός σε 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) στην πιθανότητα ένα κρασί να είναι καλής ποιότητας είναι:

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

Προβλέψεις με βάση το Μοντέλο Λογιστικής Παλινδρόμησης

Αφού εκπαιδεύσαμε το μοντέλο λογιστικής παλινδρόμησης στο 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).