Se rendre au contenu

Prédiction d'une série temporelle

Etude des données

Essayons de prédire les pics de consommations d'électricité quotidiens.

Importations des librairies

library(forecast)
library(dplyr)
library(ggplot2)

theme_set(theme_minimal())
COLOR = "#00a67d"

Lecture des données

data = read.csv('data/pic-journalier-consommation-brute.csv', sep = ';', dec = '.') %>%
  mutate(date = as.Date(date)) %>%
  arrange(date)

data %>%
  ggplot(aes(x = date, y = consommation)) +
  geom_line(color = COLOR)
Graphique

Utilisation de l'objet time series

ts_data = data %>%
  select(2) %>%
  ts(start = c(2012, 1, 1), frequency = 365)

head(ts_data)
## Time Series:
## Start = c(2012, 1) 
## End = c(2012, 6) 
## Frequency = 365 
##      consommation
## [1,]        59610
## [2,]        73263
## [3,]        76698
## [4,]        78337
## [5,]        78351
## [6,]        77587
    
summary(ts_data)
##   consommation   
##  Min.   : 41463  
##  1st Qu.: 52217  
##  Median : 56666  
##  Mean   : 60466  
##  3rd Qu.: 68987  
##  Max.   :101867
      

Décomposition de la série temporelle

La décomposition de la série temporelle est une étape cruciale pour comprendre ses composantes. Cela nous permet d'identifier les tendances, les saisons et les résidus. Voici la visualisation de la décomposition de notre série temporelle.

decomposition = decompose(ts_data)
plot(decomposition, col = COLOR)
Graphique

On remarque une saisonnalité principale annuelle.

Model

Entrainement du model prédictif

Une fois que nous avons compris les composantes de notre série temporelle, nous pouvons procéder à l'entraînement d'un modèle prédictif. Ici, j'utilise la méthode de la moyenne mobile auto-régressive intégrée (ARIMA) pour ajuster notre modèle aux données historiques.

t = system.time({
  fit = auto.arima(ts_data, method = "CSS")  # Autres choix : "ML", "CSS-ML"
})[3]

L’entraînement a durée 102 secondes.

summary(fit)
## Series: ts_data 
## ARIMA(5,0,1)(0,1,0)[365] with drift 
## 
## Coefficients:
##          ar1      ar2     ar3     ar4      ar5     ma1    drift
##       0.4376  -0.0088  0.2378  0.1088  -0.1071  0.2492  -1.4874
## s.e.  0.0409   0.0308  0.0184  0.0203   0.0157  0.0381   0.8373
## 
## sigma^2 = 26268463:  log likelihood = -39713.02
## 
## Training set error measures:
##                    ME     RMSE      MAE        MPE     MAPE      MASE
## Training set 2.107142 4901.335 3715.293 -0.1600935 6.207658 0.6850167
##                    ACF1
## Training set 0.01749187
    
  

Prédiction

Avec notre modèle ajusté, nous pouvons maintenant générer des prédictions pour l'avenir. Nous utilisons la fonction de prévision forecast pour générer une prévision de 365 jours.

forecast = forecast(fit, h = 365)

Export

Enregistrons les données prédites.

forecast %>%
  as.data.frame() %>%
  write.csv(file = "prediction-365.csv")

Utilisation

Enfin, nous pouvons visualiser nos prédictions par rapport aux données réelles pour évaluer les performances de notre modèle.

library(ggplot2)

p_data <- read.csv('prediction-365.csv') %>%
  mutate(date = as.Date('2023-11-30') + 1:365) %>%
  rename(consommation = Point.Forecast)

data %>%
  filter(date > '2023-01-01') %>%
  ggplot(aes(x = date, y = consommation)) +
  geom_line(size = 1) +

  geom_ribbon(data = p_data, aes(ymin = Lo.95, ymax = Hi.95), alpha = 0.1) +
  geom_ribbon(data = p_data, aes(ymin = Lo.80, ymax = Hi.80), alpha = 0.3) +
  geom_line(data = p_data, size = 1) +

  scale_fill_manual(values = c("Historique" = "blue", "Prédiction" = "red")) +
  labs(fill = "")


# Equivalent
# autoplot(forecast)
Graphique