-----
# Résultats numériques
+% if P == 8:
Cette partie montre les résultats obtenus avec des variantes de l'algorithme décrit à la
section 4, en utilisant le package présenté au chapitre précédent. Cet algorithme est
systématiquement comparé à deux approches naïves :
de filaments, la moitié droite du graphe correspond aux jours similaires au jour courant,
tandis que la moitié gauche affiche les jours précédents : ce sont donc les voisinages
tels qu'utilisés dans l'algorithme.
+% endif
<%
list_titles = ['Pollution par chauffage','Pollution par épandage','Semaine non polluée']
list_indices = ['indices_ch', 'indices_ep', 'indices_np']
package="talweg"))
exo_data = read.csv(system.file("extdata","meteo_extra_noNAs.csv",
package="talweg"))
-# NOTE: 'GMT' because DST gaps are filled and multiple values merged in
-# above dataset. Prediction from P+1 to P+H included.
data = getData(ts_data, exo_data)
indices_ch = seq(as.Date("2015-01-19"),as.Date("2015-01-25"),"days")
##<h2 style="color:blue;font-size:2em">${list_titles[i]}</h2>
${"##"} ${list_titles[i]}
-----r
-p1 = computeForecast(data, ${list_indices[i]}, "Neighbors", "Neighbors", predict_from=P,
- horizon=H, simtype="mix", local=FALSE)
-p2 = computeForecast(data, ${list_indices[i]}, "Neighbors", NULL, predict_from=P,
- horizon=H, simtype="none", local=TRUE)
-p3 = computeForecast(data, ${list_indices[i]}, "Average", "Zero", predict_from=P,
- horizon=H)
-p4 = computeForecast(data, ${list_indices[i]}, "Persistence", "Zero", predict_from=P,
- horizon=H, same_day=${'TRUE' if loop.index < 2 else 'FALSE'})
+p1 = computeForecast(data, ${list_indices[i]}, "Neighbors", "Neighbors",
+ predict_from=P, horizon=H, simtype="mix", local=FALSE)
+p2 = computeForecast(data, ${list_indices[i]}, "Neighbors", NULL,
+ predict_from=P, horizon=H, simtype="none", local=TRUE)
+p3 = computeForecast(data, ${list_indices[i]}, "Average", "Zero",
+ predict_from=P, horizon=H)
+p4 = computeForecast(data, ${list_indices[i]}, "Persistence", "Zero",
+ predict_from=P, horizon=H, same_day=${'TRUE' if loop.index < 2 else 'FALSE'})
-----r
e1 = computeError(data, p1, P, H)
e2 = computeError(data, p2, P, H)
sum_p23 = e2$abs$indices + e3$abs$indices
i_np = which.min(sum_p23) #indice de jour "facile"
i_p = which.max(sum_p23) #indice de jour "difficile"
+% if P == 8:
-----
% if i == 0:
-L'erreur absolue -- en haut à gauche -- reste modérée pour les meilleurs modèles
+L'erreur absolue $-$ en haut à droite $-$ reste modérée pour les meilleurs modèles
(variantes à voisins), ne dépassant 10 que deux jours. Les deux modèles naïfs ont des
erreurs similaires sauf sur la période "difficile" (jours 4 à 6), sur laquelle on gagne
-donc à chercher des jours similaires pour effectuer la prévision.
+donc à chercher des jours semblables pour effectuer la prévision.
Le MAPE reste en général inférieur à 35% pour les meilleurs méthodes.
% elif i == 1:
Le modèle à voisins avec contrainte de localité obtient ici les meilleurs résultats, son
Dans ce cas plus favorable les intensité des erreurs absolues ont clairement diminué :
elles sont souvent en dessous de 5. En revanche le MAPE moyen reste en général au-delà de
20%. Comme dans le cas de l'épandage on constate une croissance globale de la courbe
-journalière d'erreur absolue moyenne (en haut à gauche) -- sauf pour la méthode à voisins
-"locale" ; ceci peut être dû au fait que l'on ajuste le niveau du jour à prédire en le
-recollant sur la dernière valeur observée (sauf pour "Neighbors local").
+journalière d'erreur absolue moyenne (en haut à gauche) $-$ sauf pour la méthode à
+voisins "locale" ; ceci peut être dû au fait que l'on ajuste le niveau du jour à prédire
+en le recollant sur la dernière valeur observée (sauf pour "Neighbors local").
+% endif
% endif
-----r
options(repr.plot.width=9, repr.plot.height=4)
plotPredReal(data, p2, i_p); title(paste("PredReal p2 day",i_p))
# Bleu : prévue ; noir : réalisée (confondues jusqu'à predict_from-1)
+% if P == 8:
-----
% if i == 0:
-Le jour "facile à prévoir", à gauche, se décompose en deux modes : un léger vers 10h
-(7+3), puis un beaucoup plus marqué vers 19h (7+12). Ces deux modes sont retrouvés par
-les deux variantes de l'algorithme à voisins, bien que l'amplitude soit mal prédite.
-Concernant le jour "difficile à prévoir" (à droite) il y a deux pics en tout début et
-toute fin de journée (à 9h et 23h), qui ne sont pas du tout anticipés par les méthodes ;
-la grande amplitude de ces pics explique alors l'intensité de l'erreur observée.
+La courbe du jour "facile à prévoir", à gauche, se décompose en deux modes : un léger
+vers 10h (7+3), puis un beaucoup plus marqué vers 19h (7+12). Ces deux modes sont
+retrouvés par les trois variantes de l'algorithme à voisins, bien que l'amplitude soit
+mal prédite. Concernant le jour "difficile à prévoir" (à droite) il y a deux pics en tout
+début et toute fin de journée (à 9h et 23h), qui ne sont pas du tout anticipés par les
+méthodes ; la grande amplitude de ces pics explique alors l'intensité de l'erreur
+observée.
% elif i == 1:
Dans le cas d'un jour "facile" à prédire $-$ à gauche $-$ la forme est plutôt bien
retrouvée, ainsi que le niveau moyen pour la méthode sans contrainte de localité
(dans l'autre, l'algorithme a probablement écarté trop de voisins potentiels).
Concernant le jour "difficile" à droite, non seulement la forme n'est pas anticipée mais
-surtout le niveau prédit est largement supérieur au niveau de pollution observé -- dans
+surtout le niveau prédit est largement supérieur au niveau de pollution observé $-$ dans
une moindre mesure toutefois pour la variante "locale".
% else:
L'impression visuelle est plutôt mauvaise dans ce cas, mais les écart étant minimes les
erreurs au final ne sont pas très importantes. De plus deux des quatres graphes sont
satisfaisants (en haut à droite et en bas à gauche : forme + niveau acceptables.
% endif
+% endif
-----r
par(mfrow=c(1,2))
f_p2 = computeFilaments(data, p2, i_p, plot=TRUE)
title(paste("Filaments p2 day",i_p))
+% if P == 8:
-----
% if i == 0:
Les voisins du jour courant (période de 24h allant de 8h à 7h le lendemain) sont affichés
observée. Cette observation est cependant trompeuse, comme l'indique plus bas le graphe
de variabilité relative.
% endif
+% endif
-----r
par(mfrow=c(1,2))
title(paste("FilBox p1 day",i_p))
# En pointillés la courbe du jour courant (à prédire) + précédent
+% if P == 8:
-----
% if i == 0:
Sur cette boxplot fonctionnelle (voir la fonction fboxplot() du package R "rainbow") on
On peut réappliquer les mêmes remarques qu'auparavant sur les boxplots fonctionnels :
voisins atypiques, courbe à prévoir elle-même légèrement "hors norme".
% endif
+% endif
-----r
par(mfrow=c(1,2))
title(paste("StdDev p2 day",i_p))
# Variabilité globale en rouge ; sur les voisins en noir
+% if P == 8:
-----
% if i == 0:
Ces graphes viennent confirmer l'impression visuelle après observation des filaments. En
au-dessus de la variabilité locale. Bien que cela ne suffise pas à obtenir de bonnes
prédictions de forme, on constate au moins l'amélioration dans la prédiction du niveau.
% endif
+% endif
-----r
plotSimils(p1, i_np)
title(paste("Weights p1 day",i_np))
title(paste("Weights p1 day",i_p))
# Poids < 1/N à gauche, >= 1/N à droite ; jour facile en haut, difficile en bas
+% if P == 8:
-----
% if i == 0:
Les poids se concentrent près de 0 : c'est ce que l'on souhaite observer pour éviter
d'effectuer une simple moyenne.
% elif i == 1:
-En comparaison avec le paragraphe précédent on retrouve le même (bon) comportement des
-poids pour la version "non locale".
+On retrouve le même (bon) comportement des poids : concentration vers 0, quelques poids
+non négligeables (presque trop peu pour le jour "difficile").
% else:
-Concernant les poids en revanche, deux cas a priori mauvais se cumulent : ...
+Les poids sont répartis comme souhaité : concentrés vers 0 avec quelques valeurs non
+négligeables.
+% endif
% endif
-----r
options(digits=2)
-p1$getParams(i_np)$window
-p1$getParams(i_p)$window
+print(p1$getParams(i_np)$window)
+print(p1$getParams(i_p)$window)
# Fenêtres sélectionnées dans ]0,7]
% endfor
+% if P == 8:
-----
${"##"} Bilan
élevées, notamment en terme de MAPE. Une possible poste d'amélioration consisterait à
aggréger les courbes spatialement (sur plusieurs stations situées dans la même
agglomération ou dans une même zone).
+% endif