Θέμα 1

data <- read_csv("DailyDelhiClimateTrain.csv")

#we convert the csv into a timeseries object here.
series <- ts(data$meantemp, frequency = 365, start = c(2013, 1))
  1. Υπάρχει εμφανής τάση και εποχικότητα στη θερμοκρασία· πώς τα αναδεικνύετε (decomposition);

Εδω πέρα κάναμε αποσύνθεση τις χρονοσειράς. Υπάρχει εποχικότητα, ωστόσο η τάση μας δεν αυξάνεται γραμμικά, έχουμε multiplicative χρονοσειρά καθώς η τάση μεγαλώνει εκθετικά (Trend diagram). Δεν έχουμε σταθερή διακύμανση.

Ωστόσο έχουμε εποχικότητα.

# Επειδή είδαμε ότι το πλάτος μεγαλώνει → multiplicative
dec_mult <- decompose(series, type = "multiplicative")
autoplot(dec_mult) +
  ggtitle("Multiplicative Decomposition — Temperatures")

Θέμα 2. Είναι η σειρά στάσιμη (stationary); Πώς το ελέγχετε και τι μετασχηματισμοί χρειάζονται;

adf.test(series)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  series
## Dickey-Fuller = -1.8526, Lag order = 11, p-value = 0.6407
## alternative hypothesis: stationary

αρχικά το p-value μας είναι 0.64, η σειρά δεν είναι στάσιμη, δεν έχουμε σταθερή μέση τιμή και διακύμανση όσο διασχίζουμε την χρονοσειρά, για την μετατροπή θα χρησιμοποιήσουμε λογάριθμο (log) για να γίνει additive.

#εδω πέρα αφαιρέσαμε την τάση και την εποχικότητα (εφόσον έχουμε ετήσια εποχικότητα.
temp_diff <- diff(diff(log(series)), lag = 365)

autoplot(temp_diff) +
  ggtitle("Μετά από log + 1η διαφόριση + εποχιακή διαφόριση")

# Ξανά ελέγχουμε
adf.test(temp_diff)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  temp_diff
## Dickey-Fuller = -14.046, Lag order = 10, p-value = 0.01
## alternative hypothesis: stationary

εδω πέρα παρατηρούμε πως το p-value είναι 0.01 και η σειρά μας έγινε στάσιμη!

Θέμα 3) Τι δείχνουν τα ACF/PACF για την εξάρτηση από προηγούμενες τιμές;

Στο pacf εδώ διακρίνουμε οτι ένα χρόνο πριν στην ημέρα 365 έχουμε στατιστική σημαντικότητα, με την φετινή ίδια μέρα, οτι ώς ενα βαθμό παίζει μεγάλο ρόλο η περσινή ίδια μέρα!

p1 <- ggAcf(temp_diff)  + ggtitle("ACF")

p2 <- ggPacf(temp_diff) + ggtitle("PACF")
grid.arrange(p1, p2, ncol = 2)

Παρακάτω δείχνουμε το PACF για τις προηγούμενες 30 ημέρες (30 lags) για να γίνει πιο φανερό.

ggPacf(temp_diff,lag.max=30) + ggtitle("pacf")

auto.arima(temp_diff)
## Series: temp_diff 
## ARIMA(5,0,0) with zero mean 
## 
## Coefficients:
##           ar1      ar2      ar3      ar4      ar5
##       -0.1768  -0.1139  -0.1909  -0.1149  -0.0983
## s.e.   0.0303   0.0306   0.0302   0.0307   0.0305
## 
## sigma^2 = 0.009783:  log likelihood = 982.89
## AIC=-1953.77   AICc=-1953.7   BIC=-1923.78

Μπορούμε να δούμε καλύτερα στο PACF διάγραμμα οτι οι 5 προηγούμενες μέρες (5 lags) έχουν σημαντική επίδραση στην αμέσως επόμενη ημερομηνία. Και μάλιστα η αμέσως προηγούμενη μέρα είναι στατιστικά σημαντική, φθίνει σταδιακά

για παράδειγμα το pacf μας λεει οτι η θερμοκρασία του σαββάτου μπορεί να εξηγηθεί σε μεγάλο βαθμο απο τις θερμοκρασίες απο Δευτέρα εώς Παρασκευή με την Παρασκευή να επιδρά σημαντικά (η αμέσως προηγούμενη μέρα του Σαββάτου)

Το auto_arima επέλεξε το μοντέλο ARIMA(5,0,0) και σημαίνει πως χρησιμοποεί 5 παρελθοντικά lags (5 προηγούμενες ημέρες) και το q = 0 (Moving Average = 0)

  • ACF Εξήγηση *

Το ACF μας δείχνει την συσχέτιση ολων των προηγούμενων lags στο τωρινό lag, ενώ το PACF μας δείχνει την επίδραση του κάθε lag μεμονωμένα.. μειώνει τα ενδιάμεσα lags. Ενώ το ACF μας λέει οτι η επίδραση του καθενός προστίθεται στο επόμενο.. και στο επόμενο..

ggAcf(temp_diff,lag.max=30) + ggtitle("ACF")

auto.arima(temp_diff)
## Series: temp_diff 
## ARIMA(5,0,0) with zero mean 
## 
## Coefficients:
##           ar1      ar2      ar3      ar4      ar5
##       -0.1768  -0.1139  -0.1909  -0.1149  -0.0983
## s.e.   0.0303   0.0306   0.0302   0.0307   0.0305
## 
## sigma^2 = 0.009783:  log likelihood = 982.89
## AIC=-1953.77   AICc=-1953.7   BIC=-1923.78

επιλέχθηκε το μοντέλο ARIMA(5,0,0).

Θέμα 4) Προβλέψτε τη θερμοκρασία των επόμενων 30 ημερών και αξιολογήστε την (π.χ. RMSE/MAE σε hold-out).

test <- read_csv("DailyDelhiClimateTest.csv")
seriesTest <- ts(test$meantemp, frequency = 365, start = c(2017, 1), end=c(2017,31))

fit_arima <- auto.arima(seriesTest, lambda = 0)  # lambda=0 → log transformation

summary(fit_arima)
## Series: seriesTest 
## ARIMA(1,0,0) with non-zero mean 
## Box Cox transformation: lambda= 0 
## 
## Coefficients:
##          ar1    mean
##       0.6826  2.7460
## s.e.  0.1230  0.0596
## 
## sigma^2 = 0.01348:  log likelihood = 23.48
## AIC=-40.96   AICc=-40.07   BIC=-36.66
## 
## Training set error measures:
##                      ME     RMSE      MAE        MPE     MAPE MASE        ACF1
## Training set 0.09142271 1.764448 1.380199 -0.7078768 8.936664  NaN -0.06191349

παρατηρούμε πως το Mean absolute error είναι 1.38 ενώ το RMSE 1.76, είμαστε πολύ κοντά στην πραγματική πρόβλεψη θερμοκρασίας και η απόκλιση είναι πολύ μικρή.

στο test dataset όλα πέφτουν εντός των μπλέ γραμμών (θόρυβος) και έχουμε σχεδόν κανονική κατανομή.

checkresiduals(fit_arima)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(1,0,0) with non-zero mean
## Q* = 2.2054, df = 5, p-value = 0.8201
## 
## Model df: 1.   Total lags used: 6