# ============================================================
# ΕΡΓΑΣΙΑ 011 — Time Series Forecasting
# Dataset: Johnson & Johnson Quarterly Earnings (1960–1980)
# Στόχος: Πρόβλεψη τριμηνιαίων κερδών για τα επόμενα 3 χρόνια
# ============================================================
library(forecast)
## Warning: package 'forecast' was built under R version 4.5.3
library(tseries)
## Warning: package 'tseries' was built under R version 4.5.3
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.5.3
library(gridExtra)
## Warning: package 'gridExtra' was built under R version 4.5.3
set.seed(42)
# --- Φόρτωση δεδομένων ---
data("JohnsonJohnson")
jj <- JohnsonJohnson
class(jj) # έλεγχος: είναι ήδη ts object;
## [1] "ts"
start(jj); end(jj); frequency(jj)
## [1] 1960 1
## [1] 1980 4
## [1] 4
length(jj) # 84 παρατηρήσεις (21 χρόνια × 4 τρίμηνα)
## [1] 84
head(jj, 12)
## Qtr1 Qtr2 Qtr3 Qtr4
## 1960 0.71 0.63 0.85 0.44
## 1961 0.61 0.69 0.92 0.55
## 1962 0.72 0.77 0.92 0.60
Από τα αποτελέσματα της ανάλυσης προκύπτει ότι η χρονοσειρά ξεκινά από το πρώτο τρίμηνο του 1960 και ολοκληρώνεται στο τέταρτο τρίμηνο του 1980. Η συχνότητα της σειράς είναι ίση με 4, γεγονός που σημαίνει ότι υπάρχουν τέσσερις παρατηρήσεις ανά έτος, δηλαδή μία παρατήρηση για κάθε τρίμηνο. Συνολικά η χρονοσειρά περιλαμβάνει 84 παρατηρήσεις, αριθμός που αντιστοιχεί σε δεδομένα 21 ετών (21 × 4 = 84).
Επιπλέον, παρουσιάστηκαν οι πρώτες 12 τιμές της χρονοσειράς, οι οποίες αντιστοιχούν στα κέρδη ανά μετοχή της εταιρείας Johnson & Johnson για κάθε τρίμηνο. Για παράδειγμα, στο πρώτο τρίμηνο του 1960 τα κέρδη ήταν 0.71, ενώ στο δεύτερο τρίμηνο του ίδιου έτους ήταν 0.63. Οι τιμές αυτές μεταβάλλονται ανά τρίμηνο, γεγονός που δείχνει ότι υπάρχουν διακυμάνσεις μέσα στα έτη και πιθανή εποχικότητα στη χρονοσειρά.
# TODO 1: Οπτικοποίησε τη χρονοσειρά
autoplot(jj) +
ggtitle("Τριμηνιαία Κέρδη Johnson & Johnson (1960–1980)") +
xlab("Έτος") +
ylab("Κέρδη ανά Μετοχή") +
theme_minimal()
Το διάγραμμα δείχνει μια έντονα ανοδική τάση στα κέρδη της Johnson & Johnson κατά την περίοδο 1960–1980, γεγονός που υποδηλώνει συνεχή ανάπτυξη της εταιρείας με την πάροδο του χρόνου. Παράλληλα, παρατηρούνται επαναλαμβανόμενες αυξομειώσεις μέσα σε κάθε έτος, κάτι που δείχνει ύπαρξη εποχικότητας στα τριμηνιαία κέρδη. Το πλάτος των διακυμάνσεων μεγαλώνει όσο αυξάνονται τα κέρδη, δηλαδή οι μεταβολές είναι μικρές στην αρχή και πολύ μεγαλύτερες στα τελευταία χρόνια. Αυτό υποδηλώνει multiplicative εποχικότητα. Συνεπώς, η χρονοσειρά δεν είναι στάσιμη και πιθανόν να απαιτεί μετασχηματισμό πριν από την εφαρμογή μοντέλων πρόβλεψης.
# TODO 2: Εποχικός έλεγχος
# Seasonal plot: κάθε έτος ώς χωριστή γραμμή
ggseasonplot(jj, year.labels = TRUE) +
ggtitle("Seasonal plot — Johnson & Johnson")
Το seasonal plot δείχνει πώς μεταβάλλονται τα κέρδη της Johnson & Johnson μέσα σε κάθε έτος, συγκρίνοντας όλα τα χρόνια μεταξύ τους.
Κάθε χρωματιστή γραμμή αντιστοιχεί σε ένα διαφορετικό έτος, ενώ στον οριζόντιο άξονα εμφανίζονται τα 4 τρίμηνα (Q1–Q4). Έτσι μπορούμε να δούμε αν υπάρχει επαναλαμβανόμενο εποχικό μοτίβο στα κέρδη.
Στο διάγραμμα φαίνεται ότι:
τα κέρδη συνήθως αυξάνονται μέχρι το τρίτο τρίμηνο (Q3), ενώ στο τέταρτο τρίμηνο (Q4) παρατηρείται συχνά πτώση, και γενικά κάθε νέα χρονιά βρίσκεται ψηλότερα από την προηγούμενη, γεγονός που επιβεβαιώνει την ανοδική τάση της χρονοσειράς.
Επιπλέον, οι αποστάσεις μεταξύ των τριμήνων μεγαλώνουν στα τελευταία χρόνια, κάτι που δείχνει αυξημένη μεταβλητότητα και multiplicative εποχικότητα, δηλαδή οι εποχικές διακυμάνσεις γίνονται μεγαλύτερες όσο αυξάνεται το επίπεδο των κερδών.
# Subseries plot: ένα mini-plot ανά μήνα
ggsubseriesplot(jj) +
ggtitle("Subseries plot — μεταβολή ανά μήνα")
Το subseries plot δείχνει ξεχωριστά τη συμπεριφορά των κερδών για κάθε τρίμηνο (Q1, Q2, Q3, Q4) μέσα στα χρόνια.
Κάθε μικρό γράφημα αντιστοιχεί σε ένα τρίμηνο και παρουσιάζει πώς εξελίχθηκαν τα κέρδη αυτού του τριμήνου από το 1960 έως το 1980. Η μαύρη γραμμή δείχνει την πορεία των τιμών διαχρονικά, ενώ η μπλε οριζόντια γραμμή αντιπροσωπεύει τον μέσο όρο του συγκεκριμένου τριμήνου.
Από το διάγραμμα φαίνεται ότι:
όλα τα τρίμηνα παρουσιάζουν έντονη ανοδική τάση με την πάροδο των ετών, το τρίτο τρίμηνο (Q3) εμφανίζει κατά μέσο όρο τα υψηλότερα κέρδη, ενώ το τέταρτο τρίμηνο (Q4) παρουσιάζει χαμηλότερες τιμές σε σχέση με τα υπόλοιπα τρίμηνα.
Το 3ο τρίμηνο (Q3) φαίνεται να είναι συστηματικά το ισχυρότερο τρίμηνο της χρονιάς.
Αυτό φαίνεται και στα δύο διαγράμματα:
Στο seasonal plot, οι περισσότερες γραμμές κορυφώνονται στο Q3. Στο subseries plot, το Q3 έχει τον υψηλότερο μέσο όρο (μπλε γραμμή) σε σχέση με τα υπόλοιπα τρίμηνα.
Άρα, η εταιρεία εμφανίζει συνήθως τα μεγαλύτερα κέρδη στο τρίτο τρίμηνο κάθε έτους.
Η χρονοσειρά παρουσιάζει multiplicative εποχικότητα, καθώς το μέγεθος των διακυμάνσεων αυξάνεται με την πάροδο του χρόνου. Στα πρώτα έτη οι μεταβολές είναι μικρές, ενώ στα τελευταία έτη οι εποχικές διακυμάνσεις γίνονται σημαντικά μεγαλύτερες. Αυτό δείχνει ότι η εποχικότητα είναι ανάλογη του επιπέδου της σειράς και όχι σταθερή.
# TODO 4: Decomposition
dec_mult <- decompose(jj, type = "multiplicative")
autoplot(dec_mult) +
ggtitle("Multiplicative Decomposition — Johnson & Johnson")
Το decomposition plot δείχνει ότι η χρονοσειρά ακολουθεί multiplicative decomposition και όχι additive. Αυτό φαίνεται επειδή οι διακυμάνσεις της σειράς αυξάνονται όσο αυξάνεται και το επίπεδο των κερδών. Στα πρώτα χρόνια οι εποχικές μεταβολές είναι μικρές, ενώ στα τελευταία χρόνια οι αυξομειώσεις γίνονται πολύ μεγαλύτερες.
Αν η χρονοσειρά ήταν additive, τότε το μέγεθος των εποχικών διακυμάνσεων θα παρέμενε περίπου σταθερό σε όλη τη χρονική περίοδο. Εδώ όμως το “άνοιγμα” μεταξύ υψηλών και χαμηλών τιμών μεγαλώνει με τον χρόνο, γεγονός που δείχνει ότι η εποχικότητα λειτουργεί αναλογικά με το επίπεδο της σειράς.
Το trend component είναι καμπυλωτό (curved) και όχι ευθύγραμμο.
Από το decomposition plot φαίνεται ότι η τάση αυξάνεται με ολοένα μεγαλύτερο ρυθμό όσο περνά ο χρόνος. Δηλαδή, η χρονοσειρά δεν ακολουθεί μια σταθερή γραμμική αύξηση, αλλά παρουσιάζει επιταχυνόμενη ανοδική πορεία.
Στο panel seasonal παρατηρείται ότι η εποχική συνιστώσα εκφράζεται ως πολλαπλασιαστικός παράγοντας γύρω από το 1 (π.χ. 0.9–1.1), κάτι που είναι χαρακτηριστικό των multiplicative μοντέλων. Το ίδιο μοτίβο επαναλαμβάνεται συνεχώς κάθε χρόνο, κάποια τρίμηνα είναι συστηματικά “δυνατά”, κάποια άλλα συστηματικά “αδύναμα”.
# TODO 5: Log transformation
jj_log <- log(jj)
# Plot αρχικής σειράς
p1 <- autoplot(jj) +
ggtitle("Αρχική Χρονοσειρά") +
xlab("Έτος") +
ylab("Κέρδη ανά Μετοχή") +
theme_minimal()
# Plot log-transformed σειράς
p2 <- autoplot(jj_log) +
ggtitle("Log-Transformed Χρονοσειρά") +
xlab("Έτος") +
ylab("log(Κέρδη)") +
theme_minimal()
# Δίπλα-δίπλα σύγκριση
grid.arrange(p1, p2, ncol = 2)
Μετά την εφαρμογή του λογαρίθμου, η χρονοσειρά εμφανίζει πιο σταθερή μεταβλητότητα σε σχέση με την αρχική. Στο αρχικό διάγραμμα οι διακυμάνσεις αυξάνονται σημαντικά στα τελευταία χρόνια, ενώ μετά το log() οι αυξομειώσεις γίνονται πιο ομαλές και «συμπιεσμένες».
Επιπλέον, η ανοδική τάση παραμένει εμφανής, όμως η σειρά φαίνεται πιο γραμμική. Αυτό δείχνει ότι ο λογαριθμικός μετασχηματισμός βοηθά στη σταθεροποίηση της διακύμανσης και μετατρέπει τη multiplicative συμπεριφορά της χρονοσειράς σε πιο additive μορφή, κάτι που διευκολύνει την περαιτέρω ανάλυση και μοντελοποίηση.
# TODO 6: Train/Test split — χρονολογικά!
train <- window(jj, end = c(1978, 4))
test <- window(jj, start = c(1979, 1))
length(train)
## [1] 76
length(test)
## [1] 8
# TODO 7: Έλεγχος στασιμότητας
# Έλεγχος στασιμότητας στην αρχική σειρά
adf.test(jj)
## Warning in adf.test(jj): p-value greater than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: jj
## Dickey-Fuller = 1.9321, Lag order = 4, p-value = 0.99
## alternative hypothesis: stationary
Ο έλεγχος στασιμότητας πραγματοποιήθηκε με ADF test στην αρχική χρονοσειρά jj. Τα αποτελέσματα έδειξαν p-value ίσο με 0.99, το οποίο είναι πολύ μεγαλύτερο από το επίπεδο σημαντικότητας 0.05. Επομένως, δεν απορρίπτεται η μηδενική υπόθεση του ελέγχου και συμπεραίνεται ότι η χρονοσειρά δεν είναι στάσιμη.
Η μη στασιμότητα της σειράς επιβεβαιώνεται και από τα προηγούμενα διαγράμματα, όπου παρατηρήθηκαν έντονη ανοδική τάση, εποχικότητα και αυξανόμενη μεταβλητότητα με την πάροδο του χρόνου. Για τον λόγο αυτό απαιτείται μετασχηματισμός της σειράς με εφαρμογή λογαρίθμου και διαφοροποιήσεων, ώστε να αφαιρεθούν η τάση και η εποχικότητα και να επιτευχθεί στασιμότητα.
jj_diff <- diff(diff(log(jj)), lag = 4)
adf.test(jj_diff)
## Warning in adf.test(jj_diff): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: jj_diff
## Dickey-Fuller = -6.8701, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
Το ADF test έδωσε p-value ίσο με 0.01, το οποίο είναι μικρότερο από το επίπεδο σημαντικότητας 0.05. Επομένως, απορρίπτεται η μηδενική υπόθεση του ελέγχου και συμπεραίνεται ότι η μετασχηματισμένη σειρά είναι στάσιμη.
Αυτό σημαίνει ότι μετά την εφαρμογή λογαρίθμου, πρώτης διαφοροποίησης και εποχικής διαφοροποίησης με lag = 4, αφαιρέθηκαν επιτυχώς η τάση και η εποχικότητα της αρχικής χρονοσειράς. Έτσι, η σειρά είναι πλέον κατάλληλη για εφαρμογή μοντέλων χρονοσειρών.
# TODO 8: ACF & PACF
p1 <- ggAcf(jj_diff) + ggtitle("ACF")
p2 <- ggPacf(jj_diff) + ggtitle("PACF")
grid.arrange(p1, p2, ncol = 2)
Στο διάγραμμα ACF παρατηρούνται σημαντικές τιμές κυρίως στα lags 1, 4, 7, καθώς οι μπάρες ξεπερνούν τα μπλε όρια σημαντικότητας. Ιδιαίτερα το lag 1 εμφανίζει έντονη αρνητική αυτοσυσχέτιση, ενώ υπάρχουν και εποχικές ενδείξεις γύρω από τα πολλαπλάσια του 4, κάτι που συνδέεται με την τριμηνιαία εποχικότητα της σειράς.
Στο διάγραμμα PACF, η σημαντικότερη τιμή εμφανίζεται στο lag 1, όπου υπάρχει ισχυρή αρνητική μερική αυτοσυσχέτιση. Επίσης, παρατηρούνται μικρότερες αλλά αξιοσημείωτες τιμές γύρω από τα lags 4 και 5. Μετά τα πρώτα lags, οι περισσότερες τιμές κινούνται μέσα στα όρια σημαντικότητας, γεγονός που δείχνει ότι η βασική εξάρτηση της σειράς εξηγείται κυρίως από λίγες προηγούμενες χρονικές περιόδους.
Μοντέλο 1 — Seasonal Naïve (baseline)
fit_snaive <- snaive(train, h = 8)
summary(fit_snaive)
##
## Forecast method: Seasonal naive method
##
## Model Information:
## Call: snaive(y = train, h = 8)
##
## Residual sd: 0.8214
##
## Error measures:
## ME RMSE MAE MPE MAPE MASE ACF1
## Training set 0.5884722 0.8214427 0.5920833 14.27463 14.77554 1 0.6642405
##
## Forecasts:
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 1979 Q1 11.88 10.827279 12.932721 10.270002 13.49000
## 1979 Q2 12.06 11.007279 13.112721 10.450002 13.67000
## 1979 Q3 12.15 11.097279 13.202721 10.540002 13.76000
## 1979 Q4 8.91 7.857279 9.962721 7.300002 10.52000
## 1980 Q1 11.88 10.391227 13.368773 9.603119 14.15688
## 1980 Q2 12.06 10.571227 13.548773 9.783119 14.33688
## 1980 Q3 12.15 10.661227 13.638773 9.873119 14.42688
## 1980 Q4 8.91 7.421227 10.398773 6.633119 11.18688
autoplot(fit_snaive) +
ggtitle("Seasonal Naïve Forecast") +
autolayer(test, series = "Πραγματικά", color = "red")
Το γράφημα δείχνει το μοντέλο Seasonal Naïve Forecast πάνω στη χρονοσειρά Johnson & Johnson.
Η μαύρη γραμμή είναι τα δεδομένα εκπαίδευσης (train set). Η μπλε γραμμή είναι οι προβλέψεις του μοντέλου. Η κόκκινη γραμμή είναι οι πραγματικές τιμές του test set. Οι γαλάζιες περιοχές δείχνουν τα διαστήματα εμπιστοσύνης των προβλέψεων.
Το μοντέλο καταφέρνει να αναπαράγει την εποχικότητα της σειράς, επειδή επαναλαμβάνει τα μοτίβα των προηγούμενων τριμήνων. Ωστόσο, δεν προσαρμόζεται σωστά στη μακροχρόνια ανοδική τάση της χρονοσειράς, με αποτέλεσμα οι προβλέψεις να υποεκτιμούν τις πραγματικές τιμές στα τελευταία χρόνια. Στο διάγραμμα φαίνεται ότι η κόκκινη γραμμή (πραγματικές τιμές) βρίσκεται συχνά πάνω από τις προβλέψεις του μοντέλου. Τα διαστήματα εμπιστοσύνης μεγαλώνουν με τον χρόνο, γεγονός που δείχνει αυξανόμενη αβεβαιότητα στις προβλέψεις.
Από τα error measures:
RMSE = 0.821 MAE = 0.592 MAPE = 14.78%
Οι τιμές αυτές δείχνουν μέτρια απόδοση του μοντέλου. Το σχετικά υψηλό MAPE σημαίνει ότι το μοντέλο έχει αρκετό ποσοστιαίο σφάλμα στις προβλέψεις του.
Μοντέλο 2 — Holt-Winters
# Τρεις παράμετροι: α (επίπεδο), β (τάση), γ (εποχικότητα)
fit_hw <- hw(train, h = 8, seasonal = "multiplicative")
summary(fit_hw)
##
## Forecast method: Holt-Winters' multiplicative method
##
## Model Information:
## Holt-Winters' multiplicative method
##
## Call:
## hw(y = train, h = 8, seasonal = "multiplicative")
##
## Smoothing parameters:
## alpha = 0.197
## beta = 0.1082
## gamma = 1e-04
##
## Initial states:
## l = 0.5902
## b = 0.0072
## s = 0.8267 1.0468 1.0827 1.0439
##
## sigma: 0.1337
##
## AIC AICc BIC
## 174.6172 177.3444 195.5938
##
## Error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.0420402 0.3595992 0.2602222 0.5285725 9.289055 0.4395027
## ACF1
## Training set 0.1282904
##
## Forecasts:
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 1979 Q1 12.83495 10.636472 15.03343 9.472669 16.19723
## 1979 Q2 13.76326 11.303396 16.22312 10.001224 17.52529
## 1979 Q3 13.74580 11.122117 16.36949 9.733221 17.75839
## 1979 Q4 11.19950 8.872544 13.52645 7.640730 14.75826
## 1980 Q1 14.57307 11.235132 17.91102 9.468132 19.67802
## 1980 Q2 15.56606 11.610776 19.52135 9.516974 21.61515
## 1980 Q3 15.48923 11.116368 19.86209 8.801514 22.17695
## 1980 Q4 12.57631 8.637829 16.51479 6.552923 18.59970
autoplot(fit_hw) +
ggtitle("Holt-Winters Forecast") +
autolayer(test, series = "Πραγματικά", color = "red")
Από τα error measures:
RMSE = 0.356 MAE = 0.260 MAPE = 9.29%
Οι τιμές αυτές είναι αρκετά μικρότερες από του Seasonal Naïve:
RMSE: 0.821 MAE: 0.592 MAPE: 14.78%
άρα το Holt-Winters κάνει μικρότερα σφάλματα στις προβλέψεις.
Στο διάγραμμα φαίνεται επίσης ότι:
οι προβλέψεις ακολουθούν καλύτερα την ανοδική τάση, προσαρμόζονται σωστά στην εποχικότητα, και οι πραγματικές τιμές (κόκκινη γραμμή) βρίσκονται πολύ κοντά στις προβλέψεις.
Επιπλέον, το μοντέλο χρησιμοποιεί multiplicative εποχικότητα, κάτι που ταιριάζει στη συγκεκριμένη χρονοσειρά, επειδή οι διακυμάνσεις αυξάνονται με τον χρόνο.
Μοντέλο 3 — ARIMA
fit_arima <- auto.arima(train, lambda = 0)
summary(fit_arima)
## Series: train
## ARIMA(2,0,0)(1,1,0)[4] with drift
## Box Cox transformation: lambda= 0
##
## Coefficients:
## ar1 ar2 sar1 drift
## 0.3131 0.2432 -0.2970 0.0386
## s.e. 0.1244 0.1300 0.1285 0.0046
##
## sigma^2 = 0.008377: log likelihood = 71.78
## AIC=-133.56 AICc=-132.65 BIC=-122.18
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.001523642 0.3596867 0.2419193 -0.16328 6.770657 0.4085899
## ACF1
## Training set -0.1186641
fc_arima <- forecast(fit_arima, h = 8)
autoplot(fc_arima) +
ggtitle("ARIMA Forecast") +
autolayer(test, series = "Πραγματικά", color = "red")
Συγκρίνοντας τα metrics:
Μοντέλο RMSE MAE MAPE Seasonal Naive 0.821 0.592 14.78% Holt-Winters 0.359 0.260 9.29%
ARIMA 0.359 0.242 6.77%
Το ARIMA έχει το μικρότερο MAPE και MAE, άρα κάνει τις πιο ακριβείς προβλέψεις. Το RMSE είναι επίσης το χαμηλότερο. Το ACF1 είναι πιο κοντά στο 0, άρα τα residuals μοιάζουν περισσότερο με «λευκό θόρυβο» (καλό σημάδι).
Τι δείχνει το διάγραμμα ARIMA
Η μπλε γραμμή (forecast) ακολουθεί αρκετά καλά τις πραγματικές τιμές (κόκκινη γραμμή). Το μοντέλο καταφέρνει να αποτυπώσειτην ανοδική τάση, την εποχικότητα, τις διακυμάνσεις της σειράς.
Το μοντέλο ARIMA παρουσίασε την καλύτερη προγνωστική επίδοση, καθώς εμφάνισε τις μικρότερες τιμές σφάλματος (RMSE, MAE, MAPE) σε σύγκριση με τα Seasonal Naive και Holt-Winters. Επιπλέον, οι προβλέψεις του ακολουθούν πιο κοντά τις πραγματικές τιμές της χρονοσειράς, αποτυπώνοντας αποτελεσματικά τόσο την τάση όσο και την εποχικότητα των δεδομένων.
# TODO 10: Residual diagnostics
# Ελέγχουμε αν τα residuals είναι white noise
checkresiduals(fit_arima)
##
## Ljung-Box test
##
## data: Residuals from ARIMA(2,0,0)(1,1,0)[4] with drift
## Q* = 3.7985, df = 5, p-value = 0.5788
##
## Model df: 3. Total lags used: 8
Το διάγραμμα residuals δείχνει ότι τα σφάλματα του μοντέλου κινούνται τυχαία γύρω από το 0 χωρίς εμφανή τάση ή εποχικότητα. Αυτό σημαίνει ότι το ARIMA έχει καταφέρει να απορροφήσει τη βασική δομή της χρονοσειράς.
Στο ACF των residuals, όλες οι μπάρες βρίσκονται μέσα στα μπλε όρια σημαντικότητας, άρα δεν παρατηρείται σημαντική αυτοσυσχέτιση στα κατάλοιπα. Επομένως, τα residuals προσεγγίζουν λευκό θόρυβο (white noise).
Το histogram των residuals είναι σχετικά συμμετρικό και κοντά σε κανονική κατανομή, κάτι που θεωρείται θετικό για την ποιότητα του μοντέλου.
Τέλος, το Ljung–Box test έδωσε p-value = 0.5788 (> 0.05), επομένως δεν απορρίπτουμε τη μηδενική υπόθεση ανεξαρτησίας. Αυτό σημαίνει ότι δεν υπάρχει σημαντική υπολειπόμενη αυτοσυσχέτιση στα residuals και το μοντέλο θεωρείται επαρκές.
# TODO 11: Σύγκριση προβλέψεων — ένα plot με όλα
autoplot(train, series = "Training") +
autolayer(test, series = "Test (Πραγματικά)") +
autolayer(fit_snaive$mean, series = "Seasonal Naïve") +
autolayer(fit_hw$mean, series = "Holt-Winters") +
autolayer(fc_arima$mean, series = "ARIMA") +
ggtitle("Σύγκριση μοντέλων στο test set") +
ylab("Επιβάτες") +
theme_minimal() +
guides(colour = guide_legend(title = "Μοντέλο"))
Το συγκριτικό διάγραμμα δείχνει τις προβλέψεις των τριών μοντέλων πάνω στο test set της χρονοσειράς Johnson & Johnson. Η μπλε γραμμή αντιστοιχεί στις πραγματικές τιμές, ενώ οι υπόλοιπες γραμμές στις προβλέψεις των μοντέλων ARIMA, Holt-Winters και Seasonal Naïve.
Παρατηρείται ότι το μοντέλο ARIMA ακολουθεί πιο κοντά τις πραγματικές τιμές του test set, αποτυπώνοντας καλύτερα τόσο την τάση όσο και τις εποχικές διακυμάνσεις της σειράς. Το μοντέλο Holt-Winters επίσης παρουσιάζει καλή απόδοση, αλλά εμφανίζει ελαφρώς μεγαλύτερες αποκλίσεις σε ορισμένα σημεία. Αντίθετα, το Seasonal Naïve υποεκτιμά αρκετές κορυφές και δεν προσαρμόζεται ικανοποιητικά στην αυξανόμενη τάση της σειράς.
Συνολικά, το διάγραμμα επιβεβαιώνει τα αριθμητικά metrics (RMSE, MAE, MAPE), σύμφωνα με τα οποία το ARIMA είναι το πιο ακριβές μοντέλο πρόβλεψης για τη συγκεκριμένη χρονοσειρά.
accuracy(fit_snaive, test)
## ME RMSE MAE MPE MAPE MASE
## Training set 0.5884722 0.8214427 0.5920833 14.27463 14.77554 1.000000
## Test set 2.5425000 2.7765401 2.5425000 17.89911 17.89911 4.294159
## ACF1 Theil's U
## Training set 0.6642405 NA
## Test set -0.2050122 0.7697759
accuracy(fit_hw, test)
## ME RMSE MAE MPE MAPE MASE
## Training set 0.04204020 0.3595992 0.2602222 0.5285725 9.289055 0.4395027
## Test set 0.07397684 1.0865532 1.0427583 -0.4202121 7.763851 1.7611681
## ACF1 Theil's U
## Training set 0.1282904 NA
## Test set -0.8122651 0.290191
accuracy(fc_arima, test)
## ME RMSE MAE MPE MAPE MASE
## Training set 0.001523642 0.3596867 0.2419193 -0.163280 6.770657 0.4085899
## Test set -0.142883118 0.8136629 0.7225012 -1.524645 5.419212 1.2202695
## ACF1 Theil's U
## Training set -0.1186641 NA
## Test set -0.6150056 0.1989989
Με βάση τα metrics αξιολόγησης στο test set, το μοντέλο ARIMA παρουσίασε την καλύτερη προγνωστική επίδοση. Συγκεκριμένα, εμφάνισε τις μικρότερες τιμές RMSE, MAE και MAPE σε σύγκριση με τα Seasonal Naive και Holt-Winters, γεγονός που δείχνει ότι οι προβλέψεις του βρίσκονται πιο κοντά στις πραγματικές τιμές της χρονοσειράς. Επομένως, το ARIMA επιλέγεται ως το καταλληλότερο μοντέλο για forecasting στη σειρά Johnson & Johnson.
# Τώρα που ξέρουμε το νικητή, εκπαιδεύουμε σε όλα τα δεδομένα
final_model <- auto.arima(jj, lambda = 0)
final_forecast <- forecast(final_model, h = 12)
autoplot(final_forecast) +
ggtitle("Πρόβλεψη 1981-1982") +
ylab("Επιβάτες (χιλιάδες)") +
theme_minimal()
Το τελικό forecast δείχνει ότι το μοντέλο ARIMA προβλέπει συνέχιση της ανοδικής πορείας των κερδών της Johnson & Johnson για την περίοδο 1981–1982. Η μπλε γραμμή αντιστοιχεί στις προβλεπόμενες τιμές, ενώ οι σκιασμένες περιοχές αποτελούν τα διαστήματα εμπιστοσύνης 80% και 95%.
Παρατηρείται ότι το μοντέλο διατηρεί την εποχική συμπεριφορά της σειράς, καθώς εμφανίζονται επαναλαμβανόμενες αυξομειώσεις ανά τρίμηνο. Παράλληλα, τα διαστήματα εμπιστοσύνης γίνονται πιο πλατιά όσο προχωρά ο χρονικός ορίζοντας πρόβλεψης, γεγονός που δείχνει αυξανόμενη αβεβαιότητα για τις πιο μακροπρόθεσμες προβλέψεις.
Συνολικά, το μοντέλο εκτιμά ότι τα κέρδη ανά μετοχή θα συνεχίσουν να αυξάνονται τα επόμενα δύο χρόνια, ακολουθώντας παρόμοιο μοτίβο τάσης και εποχικότητας με το ιστορικό της χρονοσειράς.
1. Τι παρατηρείτε για την τάση της J&J; Είναι γραμμική ή εκθετική;
Η τάση της χρονοσειράς είναι εκθετική (exponential) και όχι γραμμική. Αυτό φαίνεται από το γεγονός ότι τα κέρδη αυξάνονται με ολοένα μεγαλύτερο ρυθμό όσο περνά ο χρόνος. Στα πρώτα χρόνια οι αυξήσεις είναι μικρές, ενώ στα τελευταία χρόνια η άνοδος γίνεται πολύ πιο έντονη. Επιπλέον, στο decomposition plot το trend component εμφανίζεται καμπυλωτό και όχι ευθύγραμμο, γεγονός που επιβεβαιώνει ότι η ανάπτυξη της σειράς επιταχύνεται με τον χρόνο.
2. Σε ποιο τρίμηνο εμφανίζουν οι κερδοφορίες την ισχυρότερη εποχική ώθηση; Δώστε μια πιθανή επιχειρηματική εξήγηση.
Η ισχυρότερη εποχική ώθηση εμφανίζεται στο 3ο τρίμηνο (Q3). Αυτό φάνηκε τόσο στο seasonal plot όσο και στο subseries plot, όπου το Q3 παρουσίαζε συστηματικά τις υψηλότερες τιμές και τον μεγαλύτερο μέσο όρο.
Μια πιθανή επιχειρηματική εξήγηση είναι ότι η Johnson & Johnson ενδέχεται να εμφανίζει αυξημένες πωλήσεις προϊόντων υγείας και φαρμακευτικών ειδών κατά τη διάρκεια του καλοκαιριού ή πριν την έναρξη του φθινοπώρου, οδηγώντας σε υψηλότερα κέρδη στο τρίτο τρίμηνο.
3. Multiplicative ή additive; Τεκμηριώστε την απάντηση με βάση τα plots.
Η χρονοσειρά παρουσιάζει multiplicative εποχικότητα. Αυτό φαίνεται επειδή οι εποχικές διακυμάνσεις αυξάνονται όσο αυξάνεται και το επίπεδο της σειράς. Στα πρώτα χρόνια οι διακυμάνσεις είναι μικρές, ενώ στα τελευταία χρόνια γίνονται πολύ μεγαλύτερες.
Στο decomposition plot η seasonal component εκφράζεται ως αναλογικός παράγοντας γύρω από το 1, κάτι χαρακτηριστικό των multiplicative μοντέλων. Επίσης, μετά τον λογαριθμικό μετασχηματισμό η διακύμανση σταθεροποιείται, γεγονός που αποτελεί ακόμη μία ένδειξη multiplicative συμπεριφοράς.
1. Ποιο μοντέλο νίκησε στο test set; Με πόση διαφορά από το baseline (Seasonal Naïve);
Νικητής στο test set ήταν το ARIMA μοντέλο.
Σύγκριση MAPE:
Seasonal Naïve: 17.90% Holt-Winters: 7.76% ARIMA: 5.42%
Άρα το ARIMA πέτυχε σημαντικά μικρότερο ποσοστιαίο σφάλμα από το baseline Seasonal Naïve, με βελτίωση περίπου:
17.90%−5.42%=12.48%
Επιπλέον, το ARIMA είχε και τα χαμηλότερα RMSE και MAE, άρα παρήγαγε συνολικά τις πιο ακριβείς προβλέψεις.
2. Τι μοντέλο διάλεξε η auto.arima(); Ερμηνεύστε τα (p,d,q)(P,D,Q).
Η auto.arima() επέλεξε το μοντέλο:
ARIMA(2,0,0)(1,1,0) [4]
with drift
Ερμηνεία:
p = 2 → χρησιμοποιούνται 2 μη εποχικοί autoregressive όροι (AR) d = 0 → δεν χρειάστηκε μη εποχική διαφοροποίηση q = 0 → δεν υπάρχουν moving average όροι
Εποχικό μέρος:
P = 1 → ένας εποχικός autoregressive όρος D = 1 → μία εποχική διαφοροποίηση Q = 0 → κανένας εποχικός moving average όρος [4] → τριμηνιαία εποχικότητα (4 τρίμηνα ανά έτος)
Το “with drift” σημαίνει ότι το μοντέλο περιλαμβάνει και έναν όρο τάσης/μετατόπισης.
3. Συμπεριφέρονται ως white noise τα residuals; Τι σημαίνει αυτό;
Ναι, τα residuals συμπεριφέρονται περίπου ως white noise.
Αυτό φαίνεται επειδή:
τα residuals κινούνται τυχαία γύρω από το 0, δεν εμφανίζουν εμφανή τάση ή εποχικότητα, στο ACF όλες σχεδόν οι μπάρες βρίσκονται εντός των ορίων σημαντικότητας, το Ljung–Box test έδωσε p-value = 0.5788 > 0.05.
Άρα δεν υπάρχει σημαντική υπολειπόμενη αυτοσυσχέτιση. Αυτό σημαίνει ότι το μοντέλο έχει καταφέρει να εξηγήσει τη βασική δομή της χρονοσειράς και τα υπόλοιπα σφάλματα είναι ουσιαστικά τυχαία.
4. Πόσο μεγαλώνει το 95% prediction interval για το 1ο τρίμηνο vs το 12ο; Τι σας λέει αυτό για την αβεβαιότητα;
Στο forecast plot φαίνεται ότι το 95% prediction interval είναι αρκετά στενό στις πρώτες προβλέψεις αλλά ανοίγει σημαντικά μέχρι το 12ο τρίμηνο.
Αυτό σημαίνει ότι όσο απομακρυνόμαστε χρονικά από τα διαθέσιμα δεδομένα, τόσο αυξάνεται η αβεβαιότητα των προβλέψεων. Οι βραχυπρόθεσμες προβλέψεις θεωρούνται πιο αξιόπιστες, ενώ οι μακροπρόθεσμες συνοδεύονται από μεγαλύτερο εύρος πιθανών τιμών.
5. Σύσταση προς τον portfolio manager: βάση των προβλέψεών σας, θα συστήνατε long ή short θέση στη μετοχή; Τεκμηριώστε.
Με βάση τις προβλέψεις του μοντέλου, θα προτεινόταν long θέση στη μετοχή.
Το ARIMA forecast δείχνει συνέχιση της ανοδικής πορείας των κερδών της Johnson & Johnson κατά την περίοδο 1981–1982. Η χρονοσειρά παρουσιάζει σταθερή μακροχρόνια ανάπτυξη, έντονη ανοδική τάση και επαναλαμβανόμενη εποχικότητα, ενώ το μοντέλο πέτυχε πολύ καλή προγνωστική επίδοση στο test set.
Επομένως, οι προβλέψεις υποδηλώνουν πιθανή συνέχιση της θετικής πορείας της εταιρείας, κάτι που ευνοεί στρατηγική αγοράς (long position) και όχι short selling.