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)
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)
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)
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)
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)
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)