Athanasios Tratselas - iis23079
Σκοπός της παρούσας εργασίας είναι η ανάπτυξη και αξιολόγηση μοντέλων γραμμικής παλινδρόμησης για την πρόβλεψη των εβδομαδιαίων πωλήσεων της Walmart. Η ανάλυση ακολουθεί τη λογική που παρουσιάστηκε στη διάλεξη: αρχικά πραγματοποιείται διερεύνηση του dataset, στη συνέχεια δημιουργούνται και αξιολογούνται μοντέλα παλινδρόμησης, έπειτα εφαρμόζεται το τελικό μοντέλο σε νέο σύνολο δεδομένων για πρόβλεψη, και τέλος παρουσιάζονται τα κύρια συμπεράσματα. :contentReferenceoaicite:2
Το συγκεκριμένο σύνολο δεδομένων περιλαμβάνει ιστορικά στοιχεία λιανικών πωλήσεων της εταιρείας Walmart και αφορά 45 διαφορετικά καταστήματα που βρίσκονται σε διάφορες περιοχές των ΗΠΑ.
Τα δεδομένα είναι οργανωμένα σε εβδομαδιαία βάση και καλύπτουν μια χρονική περίοδο περίπου τριών ετών (2010–2012), επιτρέποντας τη μελέτη της εξέλιξης των πωλήσεων στον χρόνο.
Πηγή: Το dataset προέρχεται από το Kaggle, μια δημοφιλή πλατφόρμα που παρέχει σύνολα δεδομένων για ανάλυση και ερευνητική χρήση.
Κάθε εγγραφή αντιστοιχεί σε έναν συνδυασμό καταστήματος
(Store), τμήματος (Dept) και χρονικής στιγμής
(Date) και περιλαμβάνει βασικές μεταβλητές όπως οι
εβδομαδιαίες πωλήσεις (Weekly_Sales), ενδείξεις περιόδων
αργιών (IsHoliday), δεδομένα προωθητικών ενεργειών
(MarkDown1–MarkDown5), εξωτερικούς παράγοντες
(Temperature, Fuel_Price,
Unemployment) και χαρακτηριστικά καταστημάτων
(Type, Size).
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), ώστε να
χρησιμοποιηθούν σωστά στα μοντέλα παλινδρόμησης.
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) περιλαμβάνουν πολλές
μηδενικές τιμές.
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). Παρατηρείται μια ασθενής θετική τάση,
γεγονός που υποδηλώνει ότι τα μεγαλύτερα καταστήματα τείνουν να
εμφανίζουν υψηλότερες πωλήσεις. Ωστόσο, η διασπορά των σημείων δείχνει
ότι το μέγεθος του καταστήματος δεν επαρκεί από μόνο του για να εξηγήσει
πλήρως τις πωλήσεις.
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 συγκρίνει την κατανομή των εβδομαδιαίων πωλήσεων ανάμεσα σε εβδομάδες αργιών και μη αργιών. Με αυτόν τον τρόπο μπορεί να εξεταστεί αν οι περίοδοι αργιών συνδέονται με διαφορετικό επίπεδο πωλήσεων και αν υπάρχουν ακραίες τιμές που επηρεάζουν την κατανομή.
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_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 παρουσιάζει τον μέσο όρο των εβδομαδιαίων πωλήσεων για κάθε τύπο καταστήματος. Με αυτόν τον τρόπο μπορεί να γίνει σύγκριση της μέσης απόδοσης μεταξύ των διαφορετικών κατηγοριών καταστημάτων.
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, αν και παραμένει ασθενής. Οι περισσότερες υπόλοιπες
μεταβλητές εμφανίζουν πολύ μικρές γραμμικές συσχετίσεις με τις
πωλήσεις.
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 εξηγεί μόνο ένα μικρό
μέρος της συνολικής μεταβλητότητας των πωλήσεων.
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 δεν επαρκεί από
μόνη της για την πρόβλεψη των πωλήσεων.
SSE1 <- sum(model1$residuals^2)
SSE1
## [1] 204516863503025
Το SSE (Sum of Squared Errors) εκφράζει το συνολικό
τετραγωνικό σφάλμα του μοντέλου. Η τιμή του χρησιμοποιείται κυρίως για
σύγκριση με άλλα μοντέλα.
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 σε σχέση με
το πρώτο μοντέλο είναι περιορισμένη.
SSE2 <- sum(model2$residuals^2)
SSE2
## [1] 204460191290519
Η τιμή του SSE του δεύτερου μοντέλου συγκρίνεται με την
αντίστοιχη του πρώτου μοντέλου, ώστε να εξεταστεί αν το νέο μοντέλο
προσαρμόζεται καλύτερα στα δεδομένα.
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 βοηθά να αξιολογηθεί η βελτίωση
λαμβάνοντας υπόψη και τον αριθμό των μεταβλητών.
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, με στόχο την απλοποίηση του μοντέλου. Τα
αποτελέσματα δείχνουν ότι η αφαίρεση της μεταβλητής δεν επηρεάζει
ουσιαστικά την απόδοση του μοντέλου.
SSE3 <- sum(model3$residuals^2)
SSE3
## [1] 204462404509601
Η τιμή του SSE του τρίτου μοντέλου επιτρέπει να
εξεταστεί αν η αφαίρεση της μεταβλητής οδήγησε σε σημαντική αύξηση του
σφάλματος ή αν το απλούστερο μοντέλο διατηρεί παρόμοια προσαρμογή.
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 |
Η τελική σύγκριση δείχνει ότι το δεύτερο μοντέλο παρουσιάζει οριακά την καλύτερη αριθμητική απόδοση, όμως το τρίτο μοντέλο είναι σχεδόν ισοδύναμο και ταυτόχρονα πιο απλό. Επομένως, το τρίτο μοντέλο θεωρείται πιο εύρωστη και ερμηνεύσιμη επιλογή για τη συνέχεια της ανάλυσης.
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 χρησιμοποιείται για την αξιολόγηση της προγνωστικής του ικανότητας σε νέες παρατηρήσεις.
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. Η επιλογή αυτού του μοντέλου βασίστηκε στο
γεγονός ότι είναι πιο απλό και διατηρεί σχεδόν ίδια απόδοση με το πιο
σύνθετο μοντέλο.
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. Οι τιμές αυτές χρησιμοποιούνται στη συνέχεια για την
αξιολόγηση της απόδοσης του μοντέλου σε νέα δεδομένα.
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, αν και η συνολική εξηγητική του ικανότητα παραμένει
περιορισμένη.
Στην παρούσα εργασία αναπτύχθηκαν μοντέλα γραμμικής παλινδρόμησης με
στόχο την πρόβλεψη των εβδομαδιαίων πωλήσεων της Walmart. Αρχικά
δημιουργήθηκε ένα απλό μοντέλο με μία ανεξάρτητη μεταβλητή και στη
συνέχεια πιο σύνθετα πολλαπλά μοντέλα. Η σύγκριση των μοντέλων έδειξε
ότι η προσθήκη περισσότερων μεταβλητών οδήγησε μόνο σε οριακή βελτίωση
του R-squared και σε μικρή μείωση του SSE. Για
τον λόγο αυτό επιλέχθηκε ένα απλούστερο τελικό μοντέλο με τις μεταβλητές
Size, Temperature και
Unemployment, το οποίο παρουσίασε σχεδόν ίδια απόδοση με το
πιο σύνθετο μοντέλο. Η αξιολόγηση στο test set έδειξε ότι το μοντέλο
έχει παρόμοια απόδοση και σε νέα δεδομένα, γεγονός που υποδηλώνει
σταθερότητα, αν και η συνολική προγνωστική του ικανότητα παραμένει
περιορισμένη.