Περιγραφή του Dataset

Στα πλαίσια της έκτης εργασίας του μαθήματος χρησιμοποιήθηκε για την Λογιστική Παλινδρόμηση το dataset “Marketing Campaigns Logistic Regression” που υπάρχει στο Kaggle (https://www.kaggle.com/datasets/taseermehboob9/marketing-campaigns-logistic-regression/data)

Το παρόν dataset αφορά στην αξιολόγηση της αποτελεσματικότητας μιας ψηφιακής καμπάνιας μάρκετινγκ. Κύριος στόχος της συλλογής των δεδομένων είναι η ανάλυση της αλληλεπίδρασης των πελατών με την καμπάνια μέσω ηλεκτρονικού ταχυδρομείου (Email Marketing), καθώς και η μελέτη της επίδρασης των προσφορών (εκπτώσεων) στην τελική αγοραστική συμπεριφορά.

library(ggplot2)

data <- read.csv("Marketingcampaigns.csv")

cat("Το dataset έχει", nrow(data), "γραμμές και", ncol(data), "στήλες.")
## Το dataset έχει 20 γραμμές και 9 στήλες.
summary(data)
##   Customer.id         Age            Gender       Location        
##  Min.   : 1.00   Min.   :15.00   Min.   :0.00   Length:20         
##  1st Qu.: 5.75   1st Qu.:24.50   1st Qu.:0.00   Class :character  
##  Median :10.50   Median :38.00   Median :1.00   Mode  :character  
##  Mean   :10.50   Mean   :38.25   Mean   :0.55                     
##  3rd Qu.:15.25   3rd Qu.:53.50   3rd Qu.:1.00                     
##  Max.   :20.00   Max.   :62.00   Max.   :1.00                     
##   Email.Opened Email.Clicked Product.page.visit Discount.offered   Purchased  
##  Min.   :0.0   Min.   :0.0   Min.   :0.0        Min.   :0.0      Min.   :0.0  
##  1st Qu.:0.0   1st Qu.:0.0   1st Qu.:1.0        1st Qu.:0.0      1st Qu.:0.0  
##  Median :0.5   Median :1.0   Median :2.0        Median :0.5      Median :0.5  
##  Mean   :0.5   Mean   :0.6   Mean   :2.1        Mean   :0.5      Mean   :0.5  
##  3rd Qu.:1.0   3rd Qu.:1.0   3rd Qu.:3.0        3rd Qu.:1.0      3rd Qu.:1.0  
##  Max.   :1.0   Max.   :1.0   Max.   :5.0        Max.   :1.0      Max.   :1.0

Πιο αναλυτικά το dataset Με τις 20 μόλις εγγραφές περιλαμβάνει:

Οπτικοποίηση δεδομένων

A. Box Plot: Ηλικία VS Αγορά

# Μετατροπή σε factor
data$Purchased <- as.factor(data$Purchased)

# Ξανά το γράφημα (πλέον θα βγάλει δύο κουτιά)
print(ggplot(data, aes(x = Purchased, y = Age, fill = Purchased)) +
  geom_boxplot(alpha = 0.7) +
  scale_fill_manual(values = c("red", "blue"), 
                    labels = c("Όχι (0)", "Ναι (1)")) +
  labs(title = "Κατανομή Ηλικίας ανά Κατάσταση Αγοράς",
       x = "Πραγματοποίηση Αγοράς",
       y = "Ηλικία (Έτη)") +
  theme_minimal())

Από το παραπάνω γράφημα, αποκαλύπτεται η μέση ηλικία των ατόμων που προχωρούν σε αγορά του προϊόντος που τους έχει προωθηθεί μέσω email. Πιο συγκεκριμένα παρατηρούμε ότι τα άτομα που αγοράζουν έχουν μέση ηλικία τα 32 περίπου έτη ενώ αυτοί που δεν προχωρούν σε αγορά εμφανίζουν υψηλότερη διάμεση ηλικία, στα 40 έτη. Η διαφορά αυτή υποδεικνύει ότι το προϊόν ή η συγκεκριμένη καμπάνια έχει μεγαλύτερη απήχηση σε νεότερες ηλικίες.

Εστιάζοντας στο μέγεθος των κουτιών, παρατηρούμε ότι η ομάδα των αγοραστών παρουσιάζει μεγαλύτερη διασπορά προς τις μικρότερες ηλικίες. Το κατώτερο όριο του μπλε κουτιού φτάνει τα 22 χρόνια, κάτι που υποδεικνύει ότι ένα σημαντικό τμήμα των αγοραστών είναι νεαρά άτομα. Αντίθετα, η ομάδα που δεν αγόρασε είναι πιο “συγκεντρωμένη” σε μεγαλύτερες ηλικίες (μεταξύ 31 και 53 ετών), με το κουτί να είναι μετατοπισμένο προς τα πάνω.

Β. Stacked BarPlot: Έκπτωση VS Αγορά

data$Discount.offered <- as.factor(data$Discount.offered)

print(ggplot(data, aes(x = Discount.offered, fill = Purchased)) +
        geom_bar(position = "fill") + # Το "fill" μετατρέπει τα ύψη σε ποσοστά 0-100%
        scale_y_continuous(labels = scales::percent) +
        scale_fill_manual(values = c("red", "blue"), 
                          name = "Αγορά", 
                          labels = c("Όχι (0)", "Ναι (1)")) +
        labs(title = "Επίδραση Έκπτωσης στην Πραγματοποίηση Αγοράς",
             subtitle = "Ανάλυση ποσοστού μετατροπής (Conversion Rate)",
             x = "Προσφορά Έκπτωσης (0 = Όχι, 1 = Ναι)",
             y = "Ποσοστό (%)") +
        theme_minimal()
      )

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

Γ. Density Plot: Πυκνότητα επισκέψεων στην σελίδα

print(ggplot(data, aes(x = Product.page.visit, fill = Purchased)) +
        geom_density(alpha = 0.5) + # alpha για διαφάνεια ώστε να φαίνεται η επικάλυψη
        scale_fill_manual(values = c("red", "blue"), 
                          labels = c("Όχι (0)", "Ναι (1)")) +
        labs(title = "Πυκνότητα Επισκέψεων στη Σελίδα Προϊόντος",
             subtitle = "Σχέση ενδιαφέροντος και τελικής αγοράς",
             x = "Αριθμός Επισκέψεων στη Σελίδα",
             y = "Πυκνότητα (Density)") +
        theme_minimal()
      )

Το παραπάνω desnity plot αποκαλύπτει μια σαφή διάκριση στην αγοραστική συμπεριφορά με βάση τον αριθμό επισκέψεων στην σελίδα του προϊόντος. Η ομάδα που δεν προχώρησε στην αγορά, παρουσιάζει την μέγιστη πυκνότητα στις 0 έως 1 επισκέψεις, με την καμπύλη να φθίνει γρήγορα καθώς αυξάνονται οι επισκέψεις. Αντιθέτως, η ομάδα των αγοραστών εμφανίζει μια “δίκορφη” κατανομή με έντονη παρουσία στις 2 και 3 επισκέψεις, υποδεικνύοντας ότι η επαναλαμβανόμενη αλληλεπίδραση με το προϊόν είναι καθοριστική για την τελική απόφαση.

Είναι ιδιαίτερα ενδιαφέρον το σημείο τομής των δύο καμπυλών λίγο μετά τη 1 επίσκεψη. Παρατηρούμε ότι από τις 2 επισκέψεις και πάνω, η “γαλάζια” περιοχή κυριαρχεί ολοκληρωτικά έναντι της κόκκινης. Αυτό υποδηλώνει ότι υπάρχει ένα άτυπο “κατώφλι” ενδιαφέροντος: ένας πελάτης που επισκέπτεται τη σελίδα πάνω από μία φορά έχει εξαιρετικά υψηλές πιθανότητες να μετατραπεί σε αγοραστή. Το εύρημα αυτό αναδεικνύει τη μεταβλητή Product page visit ως έναν από τους πιο αξιόπιστους προγνωστικούς δείκτες της καμπάνιας.

Λογιστική Παλινδρόμηση - Διαχωρισμός Test και Train

Το πρώτο βήμα είναι ο διαxωρισμός της βάσης μας σε train και test με τυχαίο τρόπο.

  library(caTools)
## Warning: package 'caTools' was built under R version 4.5.3
  set.seed(939)
  split <- sample.split(data$Purchased, SplitRatio=0.65)
  
  train = subset(data,split==TRUE)
  test = subset(data,split==FALSE)

  nrow(train)
## [1] 12
  nrow(test)
## [1] 8

Λόγω του περιορισμένου όγκου δεδομένων του δείγματος, επιλέχθηκε ο χωρισμός των δεδομένων σε ποσοστό 65% για το Train set (12 δεδομένα) και 35% (8 δεδομένα) για το Test set. Παρόλο που το μέγεθος του Test Set είναι μικρό, η διαδικασία αυτή ακολουθείται για να διασφαλιστεί η μεθοδολογική ορθότητα της ανάλυσης και η αξιολόγηση του μοντέλου σε δεδομένα που δεν χρησιμοποιήθηκαν κατά την εκπαίδευσή του.

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

Ξεκινάμε με την εισαγωγή όλων των μεταβλητών στην μέθοδο εκτός από το Customer ID

  Marketing1 <- glm(Purchased ~ Age + Gender + Email.Opened + Email.Clicked + 
                      Product.page.visit + Discount.offered, 
                    data = train, family = binomial)
  
  print(summary(Marketing1))
## 
## Call:
## glm(formula = Purchased ~ Age + Gender + Email.Opened + Email.Clicked + 
##     Product.page.visit + Discount.offered, family = binomial, 
##     data = train)
## 
## Coefficients:
##                      Estimate Std. Error z value Pr(>|z|)
## (Intercept)           2.20593    4.51294   0.489    0.625
## Age                  -0.08017    0.12630  -0.635    0.526
## Gender                2.60318    5.96080   0.437    0.662
## Email.Opened         -1.13915    2.63051  -0.433    0.665
## Email.Clicked       -14.91895 3721.01614  -0.004    0.997
## Product.page.visit   -0.20086    1.76024  -0.114    0.909
## Discount.offered1    16.66153 3721.02628   0.004    0.996
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 16.6355  on 11  degrees of freedom
## Residual deviance:  9.1879  on  5  degrees of freedom
## AIC: 23.188
## 
## Number of Fisher Scoring iterations: 17

Στο παραπάνω μοντέλο έχουν προστεθεί όλες τις μεταβλητές εκτός από το Customer ID, η οποία απλά αριθμεί τα άτομα. Παρά την έλλειψη σημαντικότητας, τα πρόσημα των συντελεστών β, συμφωνούν με ότι ειπώθηκε στην παραπάνω ανάλυση.

Πιο συγκεκριμένα:

Η τιμή AIC ισούται με 23.188, η οποία θα πρέπει να μειωθεί για να υπάρχει ένα καλύτερο μοντέλο.

Στην συνέχεια, σε προσπάθεια μείωσης της AIC, αφαιρέθηκαν μια μια με την σειρά οι μεταβλητές: Email Opened + Email Clicked, Age, Product page visit και το Gender όπως φαίνεται και παρακάτω

  Marketing2 <- glm(Purchased ~ Age + Gender + 
                    Product.page.visit + Discount.offered, 
                  data = train, family = binomial)

  
  Marketing3 <- glm(Purchased ~ Gender + 
                      Product.page.visit + Discount.offered, 
                    data = train, family = binomial)
  
  
  Marketing4 <- glm(Purchased ~ Gender  + Discount.offered, 
                    data = train, family = binomial)
  
  Marketing5 <- glm(Purchased ~  Discount.offered, 
                    data = train, family = binomial)

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

Μοντέλο Μεταβλητές AIC
Marketing2 Age + Gender + Product page visit + Discount offered 19.625
Marketing3 Gender + Product page visit + Discount offered 19.163
Marketing4 Gender + Discount offered 17.574
Marketing5 Discount offered 17.38

Μετά την διαδικασία της σταδιακής αφαίρεσης μεταβλητών, το μοντέλο που προέκυψε ως το πλέον αποδοτικό περιλαμβάνει μόνο την μεταβλητή της Έκπτωσης (Discount offered). Η μείωση του AIC από 28.717 σε 23.833 υποδηλώνει ότι οι άλλες μεταβλητές πρόσθεταν περισσότερο “θόρυβο” παρά ουσιαστική πληροφορία.

Για τον σκοπό όμως της εργασίας κρατάμε μόνο το Marketing1 το οποίο περιλαμβάνει όλες τις μεταβλητές

Λογιστική Παλινδρόμηση - Εφαρμογή Πρόβλεψης

Μετά την επιλογή του βέλτιστου μοντέλου, πραγματοποιήθηκε πρόβλεψη των πιθανοτήτων αγοράς στο Test set

  predictTest <- predict(Marketing1, type="response", newdata=test)
  print(summary(predictTest))
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## 1.500e-07 1.720e-06 3.881e-01 3.905e-01 6.489e-01 9.697e-01

Η συνάρτηση predict() με την παράμετρο type=“response” αποτελεί το εργαλείο μετάβασης από τη θεωρητική ανάλυση στην πρακτική εφαρμογή, καθώς εφαρμόζει τους συντελεστές που υπολογίστηκαν στο δείγμα εκπαίδευσης πάνω στα νέα δεδομένα του δείγματος ελέγχου (test set). Αντί για μια απλή κατηγοριοποίηση, η εντολή αυτή επιστρέφει την εκτιμώμενη πιθανότητα (\(P\)) πραγματοποίησης αγοράς για κάθε πελάτη, προσφέροντας μια λεπτομερή εικόνα για την “πεποίθηση” του μοντέλου. Οι τιμές αυτές κυμαίνονται αυστηρά στο διάστημα \([0, 1]\), όπου τιμές κοντά στην μονάδας υποδηλώνουν βεβαιότητα για αγορά, ενώ τιμές κοντά στο 0 υποδηλώνουν βεβαιότητα για μη ανταπόκριση.

Στην περίπτωση του μοντέλου Marketing1, τα αποτελέσματα του summary αποκαλύπτουν μια πολύ μεγάλη διασπορά στις προβλεπόμενες πιθανότητες, οι οποίες εκτείνονται από την οριακά μηδενική τιμή 1.500e-07 έως το εξαιρετικά υψηλό 96.97%. Η ύπαρξη τόσο ακραίων τιμών (Min και Max) υποδηλώνει ότι το μοντέλο, λόγω των μεγάλων συντελεστών που απέδωσε σε μεταβλητές όπως η έκπτωση, εμφανίζεται ιδιαίτερα “αποφασιστικό”.

Η διάμεσος τιμή (Median: 0.3881) υποδεικνύει ότι για την πλειονότητα των πελάτων του δείγματος ελέγχου, το μοντέλο εκτιμά μια πιθανότητα αγοράς χαμηλότερη του 40%, γεγονός που ταυτίζεται με τη γενικότερη τάση των δεδομένων.

Η εγγύτητα του μέσου όρου (Mean: 0.3905) με τη διάμεσο επιβεβαιώνει μια σχετικά ισορροπημένη κατανομή των προβλέψεων γύρω από το 39%, καθιστώντας το μοντέλο έτοιμο για την εφαρμογή του κατωφλίου ταξινόμησης \(T=0.5\) που θα ακολουθήσει για τον έλεγχο της τελικής ακρίβειας.

Επόμενο βήμα είναι η δημιουργία του confusion matrix με \(T= 0.5\)

  print(table(test$Purchased, predictTest > 0.5))
##    
##     FALSE TRUE
##   0     2    2
##   1     3    1
  # Δημιουργία του πίνακα από την εντολή σου
  conf_matrix <- table(test$Purchased, predictTest > 0.5)
  
  TN <- conf_matrix[1,1] # Πραγματικό 0, Πρόβλεψη 0 (2)
  FP <- conf_matrix[1,2] # Πραγματικό 0, Πρόβλεψη 1 (2)
  FN <- conf_matrix[2,1] # Πραγματικό 1, Πρόβλεψη 0 (3)
  TP <- conf_matrix[2,2] # Πραγματικό 1, Πρόβλεψη 1 (1)
  
  # Υπολογισμός Δεικτών Μοντέλου
  Accuracy <- (TP + TN) / sum(conf_matrix)
  Sensitivity <- TP / (TP + FN)
  Specificity <- TN / (TN + FP)
  
  # Υπολογισμός Baseline Accuracy
  baseline_accuracy <- sum(test$Purchased == 0) / nrow(test)
  
  # Εμφάνιση αποτελεσμάτων
  data.frame(Accuracy, Sensitivity, Specificity, baseline_accuracy)
##   Accuracy Sensitivity Specificity baseline_accuracy
## 1    0.375        0.25         0.5               0.5

Για \(T=0.5\) έχουμε

                | Predict = 0   | Predict = 1  |
    |:----------|:-----------------------------|
    |Actual = 0 |        2      |     2        |
    |Actual = 1 |        3      |     1        |
    

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

Η εφαρμογή του κατωφλίου \(T=0.5\) στο πλήρες μοντέλο Marketing1 αποκάλυψε τις προκλήσεις που αντιμετωπίζει η λογιστική παλινδρόμηση όταν χρησιμοποιεί μεγάλο αριθμό μεταβλητών σε περιορισμένο δείγμα.

Η συνολική Ακρίβεια (Accuracy) του μοντέλου διαμορφώθηκε στο 37.5%, μια τιμή που κρίνεται χαμηλή. Συγκεκριμένα, το μοντέλο κατάφερε να εντοπίσει σωστά δύο περιπτώσεις μη-αγοράς (True Negatives) και μία περίπτωση αγοράς (True Positive), αποτυγχάνοντας όμως να ταξινομήσει ορθά τις υπόλοιπες πέντε παρατηρήσεις. Αναλύοντας τα σφάλματα, παρατηρούμε υψηλό αριθμό False Negatives (3), όπου το μοντέλο προέβλεψε μη-αγορά για πελάτες που τελικά αγόρασαν. Αυτό είχε ως αποτέλεσμα η Sensitivity να περιοριστεί στο 25%, δείχνοντας ότι το πλήρες μοντέλο δυσκολεύεται να αναγνωρίσει τους πραγματικούς αγοραστές. Παράλληλα, σημειώθηκαν δύο False Positives σφάλματα, γεγονός που μείωσε την Specificity στο *50% , υποδεικνύοντας ότι το μοντέλο “μπερδεύτηκε” από τον επιπλέον θόρυβο των πολλών μεταβλητών.

Το αποτέλεσμα αυτό αναδεικνύει το φαινόμενο του Overfitting, όπου το μοντέλο Marketing1, προσπαθώντας να συμπεριλάβει όλες τις πληροφορίες (ηλικία, φύλο, emails), έχασε τη γενικευτική του ικανότητα στο test set. Η σύγκριση αυτής της απόδοσης με το Baseline Model είναι καθοριστική, καθώς συχνά σε τόσο μικρά και “θορυβώδη” δείγματα, η απλή στατιστική κυριαρχία μιας κατηγορίας μπορεί να προσφέρει υψηλότερη ακρίβεια από ένα υπερβολικά πολύπλοκο μοντέλο.

Επόμενο βήμα είναι η δημιουργία της ROCpred και η δημιουργία 2 νέων σετ

  library(ROCR)
## Warning: package 'ROCR' was built under R version 4.5.3
  ROCRpred <- prediction(predictTest, test$Purchased)
  
  train2 <- na.omit(train)
  test2 <- na.omit(test)
  
  # Καταγραφή των καταχωρήσεων
  n_train2 <- nrow(train2)
  n_test2 <- nrow(test2)
  
  # Εμφάνιση των αριθμών
  cat("Καταχωρήσεις στο train2:", n_train2, "\n")
## Καταχωρήσεις στο train2: 12
  cat("Καταχωρήσεις στο test2:", n_test2, "\n")
## Καταχωρήσεις στο test2: 8

Δεδομένου ότι δεν υπάρχουν κενές τιμές στο dataset, το train και το test παραμένουν τα ίδια δηλαδή 12 εγγραφές στο train και 8 στο Test.

Στην συνέχεια δημιουργούμε πάλι το μοντέλο

  Marketing <- glm(Purchased ~ Age + Gender + Email.Opened + Email.Clicked + 
                      Product.page.visit + Discount.offered, 
                    data = train2, family = binomial)
  
  print(summary(Marketing))
## 
## Call:
## glm(formula = Purchased ~ Age + Gender + Email.Opened + Email.Clicked + 
##     Product.page.visit + Discount.offered, family = binomial, 
##     data = train2)
## 
## Coefficients:
##                      Estimate Std. Error z value Pr(>|z|)
## (Intercept)           2.20593    4.51294   0.489    0.625
## Age                  -0.08017    0.12630  -0.635    0.526
## Gender                2.60318    5.96080   0.437    0.662
## Email.Opened         -1.13915    2.63051  -0.433    0.665
## Email.Clicked       -14.91895 3721.01614  -0.004    0.997
## Product.page.visit   -0.20086    1.76024  -0.114    0.909
## Discount.offered1    16.66153 3721.02628   0.004    0.996
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 16.6355  on 11  degrees of freedom
## Residual deviance:  9.1879  on  5  degrees of freedom
## AIC: 23.188
## 
## Number of Fisher Scoring iterations: 17
  predictTest2 = predict(Marketing, type = "response", newdata = test2)

Τέλος θα δημιουργήσουμε την ROC curve και να υπολογίσουμε τον δείκτη AUC.

  ROCRpred2 <- prediction(predictTest2, test2$Purchased)
  ROCRperf2 <- performance(ROCRpred2, "tpr", "fpr")
  
  plot(ROCRperf2,colorize = TRUE, print.cutoffs.at=seq(0,1,0.1),text.adj=c(-0.2,1.7))

  auc_value <- as.numeric(performance(ROCRpred, "auc")@y.values)
  
  cat("AUC =", round(auc_value, 3))
## AUC = 0.375

Η παραπάνω καμπύλη ROC που παρήχθει για το παραπάνω πλήρες μοντέλο παρουσιάζει μια ιδιαίτερη μορφή καθώς κινείται κυρίως κάτω από τη διαγώνιο της τυχαίας πρόβλεψης. Το γεγονός αυτό οδηγεί στο συμπέρασμα ότι το μοντέλο έχει εξξαιρετικά χαμηλή διακριτική ικανότητα. Η “τετραγωνισμένη” μορφή της οφείλεται στο μικρό μέγεθος του test set (\(N=8\)), όπου κάθε λανθασμένη πρόβλεψη προκαλεί μεγάλες απότομες μεταβολές στους άξονες TPR και FPR.

Η χαμηλή τιμή του δείκτη AUC, ο οποίος ισούται με 0.375, επιβεβαιώνει στατιστικά την αδυναμία του μοντέλου. Όταν ο συγκεκριμένος δείκτης πέσει κάτω από 0.5, αυτόματα συνεπάγεται ότι το μοντέλο προβλέπει χειρότερα από μια λανθασμένη μαντεψιά. Στην πραγματικότητα , η τιμή 0.375 σημαίνει ότι αν επιλέξουμε τυχαία έναν αγοραστή και έναν μη-αγοραστή, το μοντέλο θα δόσει λανθασμένα υψηλότερη πιθανότητα αγοράς στον μη αγοραστή στις περισσότερες περιπτώσεις. Το αποτέλεσμα αυτό συνάδει απόλυτα με τη χαμηλή ακρίβεια (37.5%) που καταγράφηκε στον πίνακα συνάφειας.

Το χαμηλό αυτό AUC αποτελεί την τελική απόδειξη του φαινομένου του Overfitting. Η προσπάθεια του μοντέλου να ενσωματώσει πολλές ανεξάρτητες μεταβλητές (Age, Gender, Email interactions κ.α.) με ελάχιστα δεδομένα εκπαίδευσης, οδήγησε σε “θόρυβο” που αλλοίωσε τις προβλέψεις. Η χρωματική κωδικοποίηση (color-coding) στην καμπύλη αποκαλύπτει ότι το κατώφλι \(T=0.5\) (που εντοπίζεται στο κέντρο της κατακόρυφης γραμμής) δεν αποτελεί το “βέλτιστο” σημείο, καθώς το μοντέλο παραμένει σταθερά κάτω από τη διαγώνιο.

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

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

Η παρούσα ανάλυση ανέδειξε τις προκλήσεις της προγνωστικής μοντελοποίησης σε περιορισμένα σύνολα δεδομένων. Παρόλο που η αρχική διερεύνηση μέσω των γραφημάτων έδειξε σαφείς τάσεις —όπως την προτίμηση των νεότερων ηλικιών στο προϊόν και την καταλυτική επίδραση των επισκέψεων στη σελίδα— η εφαρμογή του πλήρους μοντέλου Λογιστικής Παλινδρόμησης (Marketing1) αποκάλυψε τα όρια της στατιστικής σημαντικότητας.

Το κύριο εύρημα της μελέτης είναι η επιβεβαίωση του φαινομένου της υπερπροσαρμογής (overfitting). Η προσπάθεια ενσωμάτωσης όλων των διαθέσιμων μεταβλητών σε ένα μικρό δείγμα εκπαίδευσης οδήγησε σε ένα μοντέλο με χαμηλή ακρίβεια (37.5%) και δείκτη AUC (0.375), ο οποίος υπολείπεται ακόμη και του Baseline μοντέλου (50%). Αυτό υποδεικνύει ότι ο «θόρυβος» που εισήγαγαν οι δευτερεύουσες μεταβλητές (όπως η αλληλεπίδραση με τα emails στο συγκεκριμένο δείγμα) λειτούργησε αρνητικά στην ικανότητα γενίκευσης του μοντέλου σε νέα δεδομένα.

Αντιθέτως, η διαδικασία σταδιακής αφαίρεσης μεταβλητών υπέδειξε ότι η Έκπτωση (Discount offered) αποτελεί τον μοναδικό σταθερό και ισχυρό προγνωστικό παράγοντα. Το απλούστερο μοντέλο (Marketing5), με το χαμηλότερο AIC, αποδεικνύει ότι στο marketing συχνά η εστίαση σε έναν καθοριστικό παράγοντα (όπως ένα ισχυρό οικονομικό κίνητρο) προσφέρει μεγαλύτερη αξιοπιστία στις προβλέψεις από ό,τι η χρήση πολλών, αβέβαιων παραμέτρων.