refactor reports.gj, prepare also 13h report
[talweg.git] / reports / OLD / report_OLD.gj
CommitLineData
8eafefbc 1-----
4d376294 2# Résultats numériques
b6233fa6 3
4d376294
BA
4Cette partie montre les résultats obtenus avec des variantes de l'algorithme décrit au
5chapitre 5, en utilisant le package présenté au chapitre 6.
6Les ........... options ...........
7Cet algorithme est
b6233fa6 8systématiquement comparé à deux approches naïves :
63ff1ecb 9
4d376294
BA
10 * la moyenne des lendemains des jours de même type dans tout le passé, c'est-à-dire
11prédiction = moyenne de tous les mardis passés si le jour courant est un lundi.
b6233fa6 12 * la persistence, reproduisant le jour courant ou allant chercher le lendemain de la
4d376294 13dernière journée de même type (même principe que ci-dessus ; argument "same\_day").
b6233fa6
BA
14
15Concernant l'algorithme principal à voisins, trois variantes sont étudiées dans cette
16partie :
17
18 * avec simtype="mix" et raccordement "Neighbors" dans le cas "non local", i.e. on va
19chercher des voisins n'importe où du moment qu'ils correspondent au premier élément d'un
20couple de deux jours consécutifs sans valeurs manquantes.
21 * avec simtype="endo" + raccordement "Neighbors" puis simtype="none" + raccordement
22"Zero" (sans ajustement) dans le cas "local" : voisins de même niveau de pollution et
23même saison.
24
25Pour chaque période retenue $-$ chauffage, épandage, semaine non polluée $-$ les erreurs
26de prédiction sont d'abord affichées, puis quelques graphes de courbes réalisées/prévues
27(sur le jour "en moyenne le plus facile" à gauche, et "en moyenne le plus difficile" à
28droite). Ensuite plusieurs types de graphes apportant des précisions sur la nature et la
29difficulté du problème viennent compléter ces premières courbes. Concernant les graphes
30de filaments, la moitié gauche du graphe correspond aux jours similaires au jour courant,
31tandis que la moitié droite affiche les lendemains : ce sont donc les voisinages tels
32qu'utilisés dans l'algorithme.
63ff1ecb 33<%
b6233fa6 34list_titles = ['Pollution par chauffage','Pollution par épandage','Semaine non polluée']
63ff1ecb
BA
35list_indices = ['indices_ch', 'indices_ep', 'indices_np']
36%>
63ff1ecb 37-----r
63ff1ecb
BA
38library(talweg)
39
d09b09b0
BA
40P = ${P} #instant de prévision
41H = ${H} #horizon (en heures)
42
b6233fa6
BA
43ts_data = read.csv(system.file("extdata","pm10_mesures_H_loc_report.csv",
44 package="talweg"))
45exo_data = read.csv(system.file("extdata","meteo_extra_noNAs.csv",
46 package="talweg"))
47# NOTE: 'GMT' because DST gaps are filled and multiple values merged in
48# above dataset. Prediction from P+1 to P+H included.
49data = getData(ts_data, exo_data, input_tz = "GMT", working_tz="GMT",
50 predict_at=P)
63ff1ecb
BA
51
52indices_ch = seq(as.Date("2015-01-18"),as.Date("2015-01-24"),"days")
53indices_ep = seq(as.Date("2015-03-15"),as.Date("2015-03-21"),"days")
54indices_np = seq(as.Date("2015-04-26"),as.Date("2015-05-02"),"days")
ff5df8e3 55% for i in range(3):
63ff1ecb 56-----
8eafefbc
BA
57##<h2 style="color:blue;font-size:2em">${list_titles[i]}</h2>
58${"##"} ${list_titles[i]}
63ff1ecb 59-----r
445e7bbc 60p1 = computeForecast(data, ${list_indices[i]}, "Neighbors", "Neighbors", horizon=H,
aa059de7 61 simtype="mix", local=FALSE)
445e7bbc 62p2 = computeForecast(data, ${list_indices[i]}, "Neighbors", "Neighbors", horizon=H,
aa059de7 63 simtype="endo", local=TRUE)
445e7bbc
BA
64p3 = computeForecast(data, ${list_indices[i]}, "Neighbors", "Zero", horizon=H,
65 simtype="none", local=TRUE)
66p4 = computeForecast(data, ${list_indices[i]}, "Average", "Zero", horizon=H)
67p5 = computeForecast(data, ${list_indices[i]}, "Persistence", "Zero", horizon=H,
aa059de7 68 same_day=${'TRUE' if loop.index < 2 else 'FALSE'})
63ff1ecb 69-----r
1f811218
BA
70e1 = computeError(data, p1, H)
71e2 = computeError(data, p2, H)
a3f39d31
BA
72e3 = computeError(data, p3, H)
73e4 = computeError(data, p4, H)
74e5 = computeError(data, p5, H)
63ff1ecb 75options(repr.plot.width=9, repr.plot.height=7)
1f811218 76plotError(list(e1, e5, e4, e2, e3), cols=c(1,2,colors()[258],4,6))
63ff1ecb 77
b6233fa6
BA
78# noir: Neighbors non-local (p1), bleu: Neighbors local endo (p2),
79# mauve: Neighbors local none (p3), vert: moyenne (p4),
80# rouge: persistence (p5)
63ff1ecb 81
4d376294
BA
82##############TODO: expliquer "endo" "none"......etc
83## ajouter fenêtres essais dans rapport. --> dans chapitre actuel.
84## re-ajouter annexe sur ancienne méthode exo/endo/mix
85## ---------> fenetres comment elles sont optimisées
86#--------> ajouter à la fin quelques graphes montrant/comparant autres méthodes
87#chapitre résumé avec différents essais conclusions. ---> synthèse des essais réalisés,
88#avec sous-paragraphes avec conclusions H3/H17 sans surprises on améliore les choses,
89#mais il y a des situations où c'est pas mieux.
90#---------> fichier tex réinsérer synthèse de l'ensemble des essais réalisés.
91#++++++++ ajouter à 13h
92
63afc6d9 93sum_p123 = e1$abs$indices + e2$abs$indices + e3$abs$indices
b6233fa6
BA
94i_np = which.min(sum_p123) #indice de (veille de) jour "facile"
95i_p = which.max(sum_p123) #indice de (veille de) jour "difficile"
96-----
12119d21 97% if i == 0:
b6233fa6 98L'erreur absolue dépasse 20 sur 1 à 2 jours suivant les modèles (graphe en haut à
4d376294
BA
99droite). ##C'est au-delà de ce que l'on aimerait voir (disons +/- 5 environ).
100Sur cet
b6233fa6
BA
101exemple le modèle à voisins "contraint" (local=TRUE) utilisant des pondérations basées
102sur les similarités de forme (simtype="endo") obtient en moyenne les meilleurs résultats,
103avec un MAPE restant en général inférieur à 30% de 8h à 19h (7+1 à 7+12 : graphe en bas à
104gauche).
12119d21 105% elif i == 1:
b6233fa6
BA
106Il est difficile dans ce cas de déterminer une méthode meilleure que les autres : elles
107donnent toutes de plutôt mauvais résultats, avec une erreur absolue moyennée sur la
108journée dépassant presque toujours 15 (graphe en haut à droite).
8eafefbc 109% else:
b6233fa6
BA
110Dans ce cas plus favorable les intensité des erreurs absolues ont clairement diminué :
111elles restent souvent en dessous de 5. En revanche le MAPE moyen reste au-delà de 20%, et
112même souvent plus de 30%. Comme dans le cas de l'épandage on constate une croissance
113globale de la courbe journalière d'erreur absolue moyenne (en haut à gauche) ; ceci peut
114être dû au fait que l'on ajuste le niveau du jour à prédire en le recollant sur la
115dernière valeur observée.
116% endif
63ff1ecb
BA
117-----r
118options(repr.plot.width=9, repr.plot.height=4)
119par(mfrow=c(1,2))
120
445e7bbc
BA
121plotPredReal(data, p1, i_np); title(paste("PredReal p1 day",i_np))
122plotPredReal(data, p1, i_p); title(paste("PredReal p1 day",i_p))
63ff1ecb 123
445e7bbc
BA
124plotPredReal(data, p2, i_np); title(paste("PredReal p2 day",i_np))
125plotPredReal(data, p2, i_p); title(paste("PredReal p2 day",i_p))
63ff1ecb 126
445e7bbc
BA
127plotPredReal(data, p3, i_np); title(paste("PredReal p3 day",i_np))
128plotPredReal(data, p3, i_p); title(paste("PredReal p3 day",i_p))
63ff1ecb 129
b6233fa6
BA
130# Bleu : prévue ; noir : réalisée
131-----
12119d21 132% if i == 0:
4d376294
BA
133La courbe non centrée du jour facile à prévoir (en noir),
134##Le jour "facile à prévoir",
135à gauche, se décompose en deux modes : un léger vers 10h
b6233fa6
BA
136(7+3), puis un beaucoup plus marqué vers 19h (7+12). Ces deux modes sont retrouvés par
137les trois variantes de l'algorithme à voisins, bien que l'amplitude soit mal prédite.
4d376294
BA
138Concernant le jour "difficile à prévoir" (à droite) il y a deux pics en tout début et toute fin de
139journée (à 9h et 23h), qui ne sont pas du tout anticipés par les méthodes ; la grande
b6233fa6 140amplitude de ces pics explique alors l'intensité de l'erreur observée.
12119d21 141% elif i == 1:
b6233fa6
BA
142Dans le cas d'un jour "facile" à prédire $-$ à gauche $-$ la forme est plus ou moins
143retrouvée, mais le niveau moyen est trop bas (courbe en bleu). Concernant le jour
144"difficile" à droite, non seulement la forme n'est pas anticipée mais surtout le niveau
145prédit est très inférieur au niveau de pollution observé. Comme on le voit ci-dessous
146cela découle d'un manque de voisins au comportement similaire.
8eafefbc 147% else:
b6233fa6
BA
148La forme est raisonnablement retrouvée pour les méthodes "locales", l'autre version
149lissant trop les prédictions. Le biais reste cependant important, surtout en fin de
150journée sur le jour "difficile".
151% endif
63ff1ecb
BA
152-----r
153par(mfrow=c(1,2))
b6233fa6
BA
154f_np1 = computeFilaments(data, p1, i_np, plot=TRUE)
155 title(paste("Filaments p1 day",i_np))
156f_p1 = computeFilaments(data, p1, i_p, plot=TRUE)
157 title(paste("Filaments p1 day",i_p))
63ff1ecb 158
b6233fa6
BA
159f_np2 = computeFilaments(data, p2, i_np, plot=TRUE)
160 title(paste("Filaments p2 day",i_np))
161f_p2 = computeFilaments(data, p2, i_p, plot=TRUE)
162 title(paste("Filaments p2 day",i_p))
163-----
12119d21 164% if i == 0:
b6233fa6
BA
165Les voisins du jour courant (période de 24h allant de 8h à 7h le lendemain) sont affichés
166avec un trait d'autant plus sombre qu'ils sont proches. On constate dans le cas non
167contraint (en haut) une grande variabilité des lendemains, très nette sur le graphe en
168haut à droite. Ceci indique une faible corrélation entre la forme d'une courbe sur une
169période de 24h et la forme sur les 24h suivantes ; **cette observation est la source des
170difficultés rencontrées par l'algorithme sur ce jeu de données.**
12119d21 171% elif i == 1:
b6233fa6
BA
172Les observations sont les mêmes qu'au paragraphe précédent : trop de variabilité des
173lendemains (et même des voisins du jour courant).
8eafefbc 174% else:
b6233fa6
BA
175Les graphes de filaments ont encore la même allure, avec une assez grande variabilité
176observée. Cette observation est cependant trompeuse, comme l'indique plus bas le graphe
177de variabilité relative.
178% endif
63ff1ecb
BA
179-----r
180par(mfrow=c(1,2))
445e7bbc
BA
181plotFilamentsBox(data, f_np1); title(paste("FilBox p1 day",i_np))
182plotFilamentsBox(data, f_p1); title(paste("FilBox p1 day",i_p))
63ff1ecb 183
4d376294
BA
184## Questions :
185#7h VS 13h
186#est-ce que prévoir 24h ou 13 ou 3 facilite.
187#amplitude erreur raisonnable ? probleme facile difficile ?
188#place des exogènes ?
189#H = ?
190#épandage > chauffage > np
191
b6233fa6
BA
192# En pointillés la courbe du jour courant + lendemain (à prédire)
193-----
12119d21 194% if i == 0:
4d376294 195Sur cette boxplot fonctionnelle (voir la fonction fboxplot() du package R "rainbow") on
b6233fa6
BA
196constate essentiellement deux choses : le lendemain d'un voisin "normal" peut se révéler
197être une courbe atypique, fort éloignée de ce que l'on souhaite prédire (courbes bleue et
198rouge à gauche) ; et, dans le cas d'une courbe à prédire atypique (à droite) la plupart
199des voisins sont trop éloignés de la forme à prédire et forcent ainsi un aplatissement de
200la prédiction.
12119d21 201% elif i == 1:
b6233fa6
BA
202On constate la présence d'un voisin au lendemain complètement atypique avec un pic en
203début de journée (courbe en vert à gauche), et d'un autre phénomène semblable avec la
204courbe rouge sur le graphe de droite. Ajouté au fait que le lendemain à prévoir est
205lui-même un jour "hors norme", cela montre l'impossibilité de bien prévoir une courbe en
206utilisant l'algorithme à voisins.
8eafefbc 207% else:
b6233fa6
BA
208On peut réappliquer les mêmes remarques qu'auparavant sur les boxplots fonctionnels :
209lendemains de voisins atypiques, courbe à prévoir elle-même légèrement "hors norme".
210% endif
63ff1ecb
BA
211-----r
212par(mfrow=c(1,2))
445e7bbc
BA
213plotRelVar(data, f_np1); title(paste("StdDev p1 day",i_np))
214plotRelVar(data, f_p1); title(paste("StdDev p1 day",i_p))
63ff1ecb 215
445e7bbc
BA
216plotRelVar(data, f_np2); title(paste("StdDev p2 day",i_np))
217plotRelVar(data, f_p2); title(paste("StdDev p2 day",i_p))
63ff1ecb 218
b6233fa6
BA
219# Variabilité globale en rouge ; sur les voisins (+ lendemains) en noir
220-----
12119d21 221% if i == 0:
b6233fa6
BA
222Ces graphes viennent confirmer l'impression visuelle après observation des filaments. En
223effet, la variabilité globale en rouge (écart-type heure par heure sur l'ensemble des
224couples "aujourd'hui/lendemain"du passé) devrait rester nettement au-dessus de la
225variabilité locale, calculée respectivement sur un voisinage d'une soixantaine de jours
226(pour p1) et d'une dizaine de jours (pour p2). Or on constate que ce n'est pas du tout le
227cas sur la période "lendemain", sauf en partie pour p2 le jour 4 $-$ mais ce n'est pas
228suffisant.
12119d21 229% elif i == 1:
b6233fa6
BA
230Comme précédemment les variabilités locales et globales sont confondues dans les parties
231droites des graphes $-$ sauf pour la version "locale" sur le jour "facile"; mais cette
232bonne propriété n'est pas suffisante si l'on ne trouve pas les bons poids à appliquer.
8eafefbc 233% else:
b6233fa6
BA
234Cette fois la situation idéale est observée : la variabilité globale est nettement
235au-dessus de la variabilité locale. Bien que cela ne suffise pas à obtenir de bonnes
236prédictions de forme, on constate au moins l'amélioration dans la prédiction du niveau.
237% endif
63ff1ecb
BA
238-----r
239par(mfrow=c(1,2))
445e7bbc
BA
240plotSimils(p1, i_np); title(paste("Weights p1 day",i_np))
241plotSimils(p1, i_p); title(paste("Weights p1 day",i_p))
63ff1ecb 242
445e7bbc
BA
243plotSimils(p2, i_np); title(paste("Weights p2 day",i_np))
244plotSimils(p2, i_p); title(paste("Weights p2 day",i_p))
b6233fa6 245-----
12119d21 246% if i == 0:
b6233fa6
BA
247Les poids se concentrent près de 0 dans le cas "non local" (p1), et se répartissent assez
248uniformément dans [ 0, 0.2 ] dans le cas "local" (p2). C'est ce que l'on souhaite
249observer pour éviter d'effectuer une simple moyenne.
12119d21 250% elif i == 1:
b6233fa6
BA
251En comparaison avec le pragraphe précédent on retrouve le même (bon) comportement des
252poids pour la version "non locale". En revanche la fenêtre optimisée est trop grande sur
253le jour "facile" pour la méthode "locale" (voir affichage ci-dessous) : il en résulte des
254poids tous semblables autour de 0.084, l'algorithme effectue donc une moyenne simple $-$
255expliquant pourquoi les courbes mauve et bleue sont très proches sur le graphe d'erreurs.
8eafefbc 256% else:
b6233fa6 257Concernant les poids en revanche, deux cas a priori mauvais se cumulent :
63ff1ecb 258
b6233fa6
BA
259 * les poids dans le cas "non local" ne sont pas assez concentrés autour de 0, menant à
260un lissage trop fort $-$ comme observé sur les graphes des courbes réalisées/prévues ;
261 * les poids dans le cas "local" sont trop semblables (à cause de la trop grande fenêtre
262optimisée par validation croisée, cf. ci-dessous), résultant encore en une moyenne simple
263$-$ mais sur moins de jours, plus proches du jour courant.
264% endif
63ff1ecb 265-----r
b6233fa6
BA
266# Fenêtres sélectionnées dans ]0,7] :
267# "non-local" 2 premières lignes, "local" ensuite
445e7bbc
BA
268p1$getParams(i_np)$window
269p1$getParams(i_p)$window
63ff1ecb 270
445e7bbc
BA
271p2$getParams(i_np)$window
272p2$getParams(i_p)$window
63ff1ecb 273% endfor
b6233fa6 274-----
8eafefbc 275${"##"} Bilan
b6233fa6
BA
276
277Nos algorithmes à voisins ne sont pas adaptés à ce jeu de données où la forme varie
4d376294
BA
278considérablement d'un jour à l'autre.
279Toutefois, un espoir reste permis par exemple en aggrégeant les courbes spatialement (sur
b6233fa6 280plusieurs stations situées dans la même agglomération ou dans une même zone).
4d376294
BA
281##Plus généralement cette décorrélation de forme rend
282##ardue la tâche de prévision pour toute autre méthode $-$ du moins, nous ne savons pas
283##comment procéder pour parvenir à une bonne précision.