Linear Regression for Predicting Walmart Weekly Sales

Athanasios Tratselas - iis23079

Εισαγωγή

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

1. Διερεύνηση του συνόλου δεδομένων (dataset)

1.1Περιγραφή του dataset

Το συγκεκριμένο σύνολο δεδομένων περιλαμβάνει ιστορικά στοιχεία λιανικών πωλήσεων της εταιρείας Walmart και αφορά 45 διαφορετικά καταστήματα που βρίσκονται σε διάφορες περιοχές των ΗΠΑ.

Τα δεδομένα είναι οργανωμένα σε εβδομαδιαία βάση και καλύπτουν μια χρονική περίοδο περίπου τριών ετών (2010–2012), επιτρέποντας τη μελέτη της εξέλιξης των πωλήσεων στον χρόνο.

Πηγή: Το dataset προέρχεται από το Kaggle, μια δημοφιλή πλατφόρμα που παρέχει σύνολα δεδομένων για ανάλυση και ερευνητική χρήση.

Κάθε εγγραφή αντιστοιχεί σε έναν συνδυασμό καταστήματος (Store), τμήματος (Dept) και χρονικής στιγμής (Date) και περιλαμβάνει βασικές μεταβλητές όπως οι εβδομαδιαίες πωλήσεις (Weekly_Sales), ενδείξεις περιόδων αργιών (IsHoliday), δεδομένα προωθητικών ενεργειών (MarkDown1MarkDown5), εξωτερικούς παράγοντες (Temperature, Fuel_Price, Unemployment) και χαρακτηριστικά καταστημάτων (Type, Size).

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

if ("...1" %in% names(walmart)) {
  walmart <- walmart %>% select(-`...1`)
}

walmart$Type <- as.factor(walmart$Type)
walmart$IsHoliday <- as.factor(walmart$IsHoliday)

Σχολιασμός

Η στήλη ...1, όταν υπάρχει, αφαιρείται καθώς λειτουργεί ως δείκτης γραμμών και δεν αποτελεί ουσιαστική μεταβλητή της ανάλυσης. Επιπλέον, οι μεταβλητές Type και IsHoliday μετατρέπονται σε κατηγορικές (factor), ώστε να χρησιμοποιηθούν σωστά στα μοντέλα παλινδρόμησης.

1.3 Δομή και σύνοψη του dataset

str(walmart)
## tibble [421,570 × 16] (S3: tbl_df/tbl/data.frame)
##  $ Store       : num [1:421570] 1 1 1 1 1 1 1 1 1 1 ...
##  $ Date        : chr [1:421570] "05/02/2010" "05/02/2010" "05/02/2010" "05/02/2010" ...
##  $ IsHoliday   : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
##  $ Dept        : num [1:421570] 1 26 17 45 28 79 55 5 58 7 ...
##  $ Weekly_Sales: num [1:421570] 24924.5 11737.1 13223.8 37.4 1085.3 ...
##  $ Temperature : num [1:421570] 42.3 42.3 42.3 42.3 42.3 ...
##  $ Fuel_Price  : num [1:421570] 2.57 2.57 2.57 2.57 2.57 ...
##  $ MarkDown1   : num [1:421570] 0 0 0 0 0 0 0 0 0 0 ...
##  $ MarkDown2   : num [1:421570] 0 0 0 0 0 0 0 0 0 0 ...
##  $ MarkDown3   : num [1:421570] 0 0 0 0 0 0 0 0 0 0 ...
##  $ MarkDown4   : num [1:421570] 0 0 0 0 0 0 0 0 0 0 ...
##  $ MarkDown5   : num [1:421570] 0 0 0 0 0 0 0 0 0 0 ...
##  $ CPI         : chr [1:421570] "2.110.963.582" "2.110.963.582" "2.110.963.582" "2.110.963.582" ...
##  $ Unemployment: num [1:421570] 8.11 8.11 8.11 8.11 8.11 ...
##  $ Type        : Factor w/ 3 levels "1","2","3": 3 3 3 3 3 3 3 3 3 3 ...
##  $ Size        : num [1:421570] 151315 151315 151315 151315 151315 ...
summary(walmart)
##      Store          Date           IsHoliday       Dept        Weekly_Sales   
##  Min.   : 1.0   Length:421570      0:391909   Min.   : 1.00   Min.   : -4989  
##  1st Qu.:11.0   Class :character   1: 29661   1st Qu.:18.00   1st Qu.:  2080  
##  Median :22.0   Mode  :character              Median :37.00   Median :  7612  
##  Mean   :22.2                                 Mean   :44.26   Mean   : 15981  
##  3rd Qu.:33.0                                 3rd Qu.:74.00   3rd Qu.: 20206  
##  Max.   :45.0                                 Max.   :99.00   Max.   :693099  
##   Temperature       Fuel_Price      MarkDown1       MarkDown2       
##  Min.   : -2.06   Min.   :2.472   Min.   :    0   Min.   :  -265.8  
##  1st Qu.: 46.68   1st Qu.:2.933   1st Qu.:    0   1st Qu.:     0.0  
##  Median : 62.09   Median :3.452   Median :    0   Median :     0.0  
##  Mean   : 60.09   Mean   :3.361   Mean   : 2590   Mean   :   880.0  
##  3rd Qu.: 74.28   3rd Qu.:3.738   3rd Qu.: 2809   3rd Qu.:     2.2  
##  Max.   :100.14   Max.   :4.468   Max.   :88647   Max.   :104519.5  
##    MarkDown3           MarkDown4         MarkDown5          CPI           
##  Min.   :   -29.10   Min.   :    0.0   Min.   :     0   Length:421570     
##  1st Qu.:     0.00   1st Qu.:    0.0   1st Qu.:     0   Class :character  
##  Median :     0.00   Median :    0.0   Median :     0   Mode  :character  
##  Mean   :   468.09   Mean   : 1083.1   Mean   :  1663                     
##  3rd Qu.:     4.54   3rd Qu.:  425.3   3rd Qu.:  2168                     
##  Max.   :141630.61   Max.   :67474.9   Max.   :108519                     
##   Unemployment    Type            Size       
##  Min.   : 3.879   1: 42597   Min.   : 34875  
##  1st Qu.: 6.891   2:163495   1st Qu.: 93638  
##  Median : 7.866   3:215478   Median :140167  
##  Mean   : 7.960              Mean   :136728  
##  3rd Qu.: 8.572              3rd Qu.:202505  
##  Max.   :14.313              Max.   :219622

Σχολιασμός

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

1.4 Ενδεικτικά διαγράμματα βασικών παραμέτρων

Scatterplot

set.seed(123)
sample_rows <- sample(seq_len(nrow(walmart)), min(10000, nrow(walmart)))
scatter_data <- walmart[sample_rows, ]

ggplot(scatter_data, aes(x = Size, y = Weekly_Sales)) +
  geom_point(alpha = 0.25, color = "#0071ce") +
  labs(
    title = "Scatterplot: Size και Weekly_Sales",
    x = "Size",
    y = "Weekly_Sales"
  ) +
  theme_minimal()

Σχολιασμός

Το scatterplot δείχνει τη σχέση μεταξύ του μεγέθους του καταστήματος (Size) και των εβδομαδιαίων πωλήσεων (Weekly_Sales). Παρατηρείται μια ασθενής θετική τάση, γεγονός που υποδηλώνει ότι τα μεγαλύτερα καταστήματα τείνουν να εμφανίζουν υψηλότερες πωλήσεις. Ωστόσο, η διασπορά των σημείων δείχνει ότι το μέγεθος του καταστήματος δεν επαρκεί από μόνο του για να εξηγήσει πλήρως τις πωλήσεις.

Boxplot

ggplot(
  walmart,
  aes(
    x = factor(IsHoliday, labels = c("Όχι Αργία", "Αργία")),
    y = Weekly_Sales,
    fill = factor(IsHoliday, labels = c("Όχι Αργία", "Αργία"))
  )
) +
  geom_boxplot(alpha = 0.8, outlier.alpha = 0.2) +
  scale_fill_manual(values = c("#0071ce", "#ffc220")) +
  labs(
    title = "Boxplot: Εβδομαδιαίες Πωλήσεις σε Εβδομάδες Αργιών και Μη Αργιών",
    x = "Κατηγορία Εβδομάδας",
    y = "Weekly_Sales"
  ) +
  theme_minimal() +
  theme(legend.position = "none")

Σχολιασμός

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

Histogram

hist_data <- walmart %>%
  group_by(Store, Date) %>%
  summarise(Total_Weekly_Sales = sum(Weekly_Sales, na.rm = TRUE), .groups = "drop")

mean_sales <- mean(hist_data$Total_Weekly_Sales, na.rm = TRUE)
median_sales <- median(hist_data$Total_Weekly_Sales, na.rm = TRUE)

ggplot(hist_data, aes(x = Total_Weekly_Sales)) +
  geom_histogram(bins = 30, fill = "#0071ce", color = "white", alpha = 0.9) +
  geom_vline(xintercept = mean_sales, color = "#ffc220", linewidth = 1.2) +
  geom_vline(xintercept = median_sales, color = "#d62828", linewidth = 1.2, linetype = "dashed") +
  labs(
    title = "Histogram: Κατανομή Συνολικών Εβδομαδιαίων Πωλήσεων ανά Κατάστημα",
    x = "Συνολικές Εβδομαδιαίες Πωλήσεις",
    y = "Συχνότητα"
  ) +
  theme_minimal()

Σχολιασμός

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

Bar chart

bar_data <- walmart %>%
  group_by(Type) %>%
  summarise(Mean_Weekly_Sales = mean(Weekly_Sales, na.rm = TRUE), .groups = "drop")

ggplot(bar_data, aes(x = Type, y = Mean_Weekly_Sales, fill = Type)) +
  geom_col() +
  scale_fill_manual(values = c("#0071ce", "#ffc220", "#004c91")) +
  labs(
    title = "Bar Chart: Μέσος Όρος Εβδομαδιαίων Πωλήσεων ανά Τύπο Καταστήματος",
    x = "Τύπος Καταστήματος",
    y = "Μέσος Όρος Weekly_Sales"
  ) +
  theme_minimal() +
  theme(legend.position = "none")

Σχολιασμός

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

1.5 Διερεύνηση συσχετίσεων

corr_vars <- c("Weekly_Sales", "Size", "Temperature", "Fuel_Price",
               "MarkDown1", "MarkDown2", "MarkDown3",
               "MarkDown4", "MarkDown5", "Unemployment")

cor_matrix <- cor(walmart[corr_vars], use = "complete.obs")
cor_matrix <- round(cor_matrix, 3)

kable(
  cor_matrix,
  format = "html",
  caption = "Πίνακας συσχετίσεων μεταξύ αριθμητικών μεταβλητών",
  align = "c"
) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed"),
    full_width = FALSE,
    position = "center"
  ) %>%
  scroll_box(width = "100%", height = "450px")
Πίνακας συσχετίσεων μεταξύ αριθμητικών μεταβλητών
Weekly_Sales Size Temperature Fuel_Price MarkDown1 MarkDown2 MarkDown3 MarkDown4 MarkDown5 Unemployment
Weekly_Sales 1.000 0.244 -0.002 0.000 0.047 0.021 0.039 0.037 0.050 -0.026
Size 0.244 1.000 -0.058 0.003 0.170 0.078 0.034 0.127 0.153 -0.068
Temperature -0.002 -0.058 1.000 0.144 -0.026 -0.180 -0.056 -0.050 -0.015 0.097
Fuel_Price 0.000 0.003 0.144 1.000 0.297 0.029 0.019 0.167 0.215 -0.034
MarkDown1 0.047 0.170 -0.026 0.297 1.000 0.175 -0.014 0.839 0.415 -0.105
MarkDown2 0.021 0.078 -0.180 0.029 0.175 1.000 -0.006 0.113 0.132 -0.041
MarkDown3 0.039 0.034 -0.056 0.019 -0.014 -0.006 1.000 -0.012 0.042 -0.018
MarkDown4 0.037 0.127 -0.050 0.167 0.839 0.113 -0.012 1.000 0.303 -0.077
MarkDown5 0.050 0.153 -0.015 0.215 0.415 0.132 0.042 0.303 1.000 -0.120
Unemployment -0.026 -0.068 0.097 -0.034 -0.105 -0.041 -0.018 -0.077 -0.120 1.000

Σχολιασμός

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

2. Δημιουργία (και αξιολόγηση) μοντέλου παλινδρόμησης

2.1 Απλή γραμμική παλινδρόμηση

model1 <- lm(Weekly_Sales ~ Size, data = walmart)
summary(model1)
## 
## Call:
## lm(formula = Weekly_Sales ~ Size, data = walmart)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -27288 -12872  -6620   4283 678046 
## 
## Coefficients:
##                 Estimate   Std. Error t value            Pr(>|t|)    
## (Intercept) 3565.0510115   83.2829772   42.81 <0.0000000000000002 ***
## Size           0.0908096    0.0005563  163.24 <0.0000000000000002 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 22030 on 421568 degrees of freedom
## Multiple R-squared:  0.05945,    Adjusted R-squared:  0.05945 
## F-statistic: 2.665e+04 on 1 and 421568 DF,  p-value: < 0.00000000000000022

Σχολιασμός

Το πρώτο μοντέλο εξετάζει τη σχέση μεταξύ του μεγέθους του καταστήματος (Size) και των εβδομαδιαίων πωλήσεων (Weekly_Sales). Ο συντελεστής της μεταβλητής Size είναι θετικός και στατιστικά σημαντικός, γεγονός που υποδηλώνει ότι τα μεγαλύτερα καταστήματα τείνουν να εμφανίζουν υψηλότερες πωλήσεις. Ωστόσο, το R-squared είναι χαμηλό, κάτι που δείχνει ότι η μεταβλητή Size εξηγεί μόνο ένα μικρό μέρος της συνολικής μεταβλητότητας των πωλήσεων.

2.2 Οπτικοποίηση του απλού μοντέλου

ggplot(scatter_data, aes(x = Size, y = Weekly_Sales)) +
  geom_point(alpha = 0.25, color = "#0071ce") +
  geom_abline(
    intercept = coef(model1)[1],
    slope = coef(model1)[2],
    colour = "red",
    linewidth = 1
  ) +
  labs(
    title = "Απλή Γραμμική Παλινδρόμηση: Weekly_Sales ~ Size",
    x = "Size",
    y = "Weekly_Sales"
  ) +
  theme_minimal()

Σχολιασμός

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

2.3 Υπολογισμός SSE του πρώτου μοντέλου

SSE1 <- sum(model1$residuals^2)
SSE1
## [1] 204516863503025

Σχολιασμός

Το SSE (Sum of Squared Errors) εκφράζει το συνολικό τετραγωνικό σφάλμα του μοντέλου. Η τιμή του χρησιμοποιείται κυρίως για σύγκριση με άλλα μοντέλα.

2.4 Πολλαπλή γραμμική παλινδρόμηση

model2 <- lm(Weekly_Sales ~ Size + Temperature + Fuel_Price + Unemployment, data = walmart)
summary(model2)
## 
## Call:
## lm(formula = Weekly_Sales ~ Size + Temperature + Fuel_Price + 
##     Unemployment, data = walmart)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -26716 -12828  -6577   4301 678228 
## 
## Coefficients:
##                  Estimate   Std. Error t value             Pr(>|t|)    
## (Intercept)  4138.5822261  313.1468328  13.216 < 0.0000000000000002 ***
## Size            0.0908346    0.0005583 162.699 < 0.0000000000000002 ***
## Temperature    16.4992063    1.8704299   8.821 < 0.0000000000000002 ***
## Fuel_Price   -159.8800455   74.8435137  -2.136               0.0327 *  
## Unemployment -129.5219602   18.3467237  -7.060     0.00000000000167 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 22020 on 421565 degrees of freedom
## Multiple R-squared:  0.05971,    Adjusted R-squared:  0.0597 
## F-statistic:  6693 on 4 and 421565 DF,  p-value: < 0.00000000000000022

Σχολιασμός

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

2.5 Υπολογισμός SSE του δεύτερου μοντέλου

SSE2 <- sum(model2$residuals^2)
SSE2
## [1] 204460191290519

Σχολιασμός

Η τιμή του SSE του δεύτερου μοντέλου συγκρίνεται με την αντίστοιχη του πρώτου μοντέλου, ώστε να εξεταστεί αν το νέο μοντέλο προσαρμόζεται καλύτερα στα δεδομένα.

2.6 Σύγκριση των δύο πρώτων μοντέλων

comparison <- data.frame(
  Model = c("Model 1: Size", "Model 2: Multiple"),
  SSE = c(SSE1, SSE2),
  R_Squared = c(summary(model1)$r.squared, summary(model2)$r.squared),
  Adjusted_R_Squared = c(summary(model1)$adj.r.squared, summary(model2)$adj.r.squared)
)

kable(comparison, caption = "Σύγκριση των δύο πρώτων μοντέλων")
Σύγκριση των δύο πρώτων μοντέλων
Model SSE R_Squared Adjusted_R_Squared
Model 1: Size 204516863503025 0.0594521 0.0594499
Model 2: Multiple 204460191290519 0.0597127 0.0597038

Σχολιασμός

Από τη σύγκριση των δύο μοντέλων μπορεί να εξεταστεί αν η προσθήκη περισσότερων ανεξάρτητων μεταβλητών βελτιώνει την προσαρμογή του μοντέλου. Μικρότερο SSE και υψηλότερο R-squared δείχνουν καλύτερη απόδοση, ενώ το Adjusted R-squared βοηθά να αξιολογηθεί η βελτίωση λαμβάνοντας υπόψη και τον αριθμό των μεταβλητών.

2.7 Τροποποίηση του μοντέλου

model3 <- lm(Weekly_Sales ~ Size + Temperature + Unemployment, data = walmart)
summary(model3)
## 
## Call:
## lm(formula = Weekly_Sales ~ Size + Temperature + Unemployment, 
##     data = walmart)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -26665 -12834  -6574   4296 678255 
## 
## Coefficients:
##                  Estimate   Std. Error t value             Pr(>|t|)    
## (Intercept)  3623.3140348  199.6986895  18.144 < 0.0000000000000002 ***
## Size            0.0908241    0.0005583 162.686 < 0.0000000000000002 ***
## Temperature    15.9071891    1.8497925   8.599 < 0.0000000000000002 ***
## Unemployment -127.6467421   18.3257884  -6.965     0.00000000000328 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 22020 on 421566 degrees of freedom
## Multiple R-squared:  0.0597, Adjusted R-squared:  0.0597 
## F-statistic:  8922 on 3 and 421566 DF,  p-value: < 0.00000000000000022

Σχολιασμός

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

2.8 Υπολογισμός SSE του τρίτου μοντέλου

SSE3 <- sum(model3$residuals^2)
SSE3
## [1] 204462404509601

Σχολιασμός

Η τιμή του SSE του τρίτου μοντέλου επιτρέπει να εξεταστεί αν η αφαίρεση της μεταβλητής οδήγησε σε σημαντική αύξηση του σφάλματος ή αν το απλούστερο μοντέλο διατηρεί παρόμοια προσαρμογή.

2.9 Τελική σύγκριση μοντέλων

comparison2 <- data.frame(
  Model = c("Model 1", "Model 2", "Model 3"),
  SSE = c(SSE1, SSE2, SSE3),
  R_Squared = c(summary(model1)$r.squared,
                summary(model2)$r.squared,
                summary(model3)$r.squared),
  Adjusted_R_Squared = c(summary(model1)$adj.r.squared,
                         summary(model2)$adj.r.squared,
                         summary(model3)$adj.r.squared)
)

kable(comparison2, caption = "Τελική σύγκριση των τριών μοντέλων")
Τελική σύγκριση των τριών μοντέλων
Model SSE R_Squared Adjusted_R_Squared
Model 1 204516863503025 0.0594521 0.0594499
Model 2 204460191290519 0.0597127 0.0597038
Model 3 204462404509601 0.0597025 0.0596958

Σχολιασμός

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

3. Εφαρμογή σε νέο σύνολο δεδομένων - Πρόβλεψη

3.1 Διαχωρισμός σε training και test set

set.seed(123)

train_index <- sample(seq_len(nrow(walmart)), size = 0.8 * nrow(walmart))
train_data <- walmart[train_index, ]
test_data  <- walmart[-train_index, ]

Σχολιασμός

Το dataset χωρίστηκε σε training set και test set. Το training set χρησιμοποιείται για την εκπαίδευση του μοντέλου, ενώ το test set χρησιμοποιείται για την αξιολόγηση της προγνωστικής του ικανότητας σε νέες παρατηρήσεις.

3.2 Εκπαίδευση του τελικού μοντέλου

final_model <- lm(Weekly_Sales ~ Size + Temperature + Unemployment, data = train_data)
summary(final_model)
## 
## Call:
## lm(formula = Weekly_Sales ~ Size + Temperature + Unemployment, 
##     data = train_data)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -26646 -12858  -6581   4286 678229 
## 
## Coefficients:
##                  Estimate   Std. Error t value             Pr(>|t|)    
## (Intercept)  3749.1105921  224.5572641  16.696 < 0.0000000000000002 ***
## Size            0.0911089    0.0006272 145.254 < 0.0000000000000002 ***
## Temperature    15.1054473    2.0782531   7.268    0.000000000000365 ***
## Unemployment -137.8128848   20.6063987  -6.688    0.000000000022680 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 22130 on 337252 degrees of freedom
## Multiple R-squared:  0.05956,    Adjusted R-squared:  0.05955 
## F-statistic:  7119 on 3 and 337252 DF,  p-value: < 0.00000000000000022

Σχολιασμός

Το τελικό μοντέλο εκπαιδεύτηκε στο training set χρησιμοποιώντας τις μεταβλητές Size, Temperature και Unemployment. Η επιλογή αυτού του μοντέλου βασίστηκε στο γεγονός ότι είναι πιο απλό και διατηρεί σχεδόν ίδια απόδοση με το πιο σύνθετο μοντέλο.

3.3 Πρόβλεψη στο test set

predictions <- predict(final_model, newdata = test_data)
head(predictions)
##        1        2        3        4        5        6 
## 17057.25 17057.25 17057.25 17057.25 17057.25 17057.25

Σχολιασμός

Με τη συνάρτηση predict() υπολογίζονται οι προβλεπόμενες τιμές της μεταβλητής Weekly_Sales για τις παρατηρήσεις του test set. Οι τιμές αυτές χρησιμοποιούνται στη συνέχεια για την αξιολόγηση της απόδοσης του μοντέλου σε νέα δεδομένα.

3.4 Αξιολόγηση πρόβλεψης στο test set

SSE_test <- sum((predictions - test_data$Weekly_Sales)^2)
RMSE_test <- sqrt(SSE_test / nrow(test_data))
SST_test <- sum((mean(train_data$Weekly_Sales) - test_data$Weekly_Sales)^2)
R2_test <- 1 - SSE_test / SST_test

SSE_test
## [1] 39371200821980
RMSE_test
## [1] 21609.24
R2_test
## [1] 0.06030559

Σχολιασμός

Το SSE_test εκφράζει το συνολικό τετραγωνικό σφάλμα του μοντέλου στο test set, ενώ το RMSE_test δείχνει το μέσο σφάλμα πρόβλεψης στην ίδια μονάδα με την εξαρτημένη μεταβλητή. Το R2_test δείχνει το ποσοστό της διακύμανσης των πραγματικών τιμών του test set που εξηγείται από το μοντέλο. Στην παρούσα περίπτωση, το R2_test είναι πολύ κοντά στο R-squared του training set, γεγονός που δείχνει ότι το μοντέλο δεν παρουσιάζει έντονο overfitting, αν και η συνολική εξηγητική του ικανότητα παραμένει περιορισμένη.

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

Στην παρούσα εργασία αναπτύχθηκαν μοντέλα γραμμικής παλινδρόμησης με στόχο την πρόβλεψη των εβδομαδιαίων πωλήσεων της Walmart. Αρχικά δημιουργήθηκε ένα απλό μοντέλο με μία ανεξάρτητη μεταβλητή και στη συνέχεια πιο σύνθετα πολλαπλά μοντέλα. Η σύγκριση των μοντέλων έδειξε ότι η προσθήκη περισσότερων μεταβλητών οδήγησε μόνο σε οριακή βελτίωση του R-squared και σε μικρή μείωση του SSE. Για τον λόγο αυτό επιλέχθηκε ένα απλούστερο τελικό μοντέλο με τις μεταβλητές Size, Temperature και Unemployment, το οποίο παρουσίασε σχεδόν ίδια απόδοση με το πιο σύνθετο μοντέλο. Η αξιολόγηση στο test set έδειξε ότι το μοντέλο έχει παρόμοια απόδοση και σε νέα δεδομένα, γεγονός που υποδηλώνει σταθερότητα, αν και η συνολική προγνωστική του ικανότητα παραμένει περιορισμένη.