final report average 7h; TODO: others
[talweg.git] / reports / report_2017-03-01.7h_average.ipynb
CommitLineData
fa8078f9
BA
1{
2 "cells": [
3 {
4 "cell_type": "code",
1e20780e 5 "execution_count": null,
fa8078f9
BA
6 "metadata": {
7 "collapsed": false
8 },
9 "outputs": [],
10 "source": [
11 "library(talweg)"
12 ]
13 },
14 {
15 "cell_type": "code",
1e20780e 16 "execution_count": null,
fa8078f9
BA
17 "metadata": {
18 "collapsed": false
19 },
20 "outputs": [],
21 "source": [
22 "data = getData(ts_data=\"../pkg/data/pm10_mesures_H_loc.csv\", exo_data=\"../pkg/data/meteo_extra_noNAs.csv\",\n",
23 " input_tz = \"Europe/Paris\", working_tz=\"Europe/Paris\", predict_at=7)"
24 ]
25 },
26 {
27 "cell_type": "markdown",
28 "metadata": {},
29 "source": [
30 "## Introduction\n",
31 "\n",
32 "J'ai fait quelques essais dans différentes configurations pour la méthode \"Neighbors\" (la seule dont on a parlé).<br>Il semble que le mieux soit\n",
33 "\n",
34 " * simtype=\"mix\" : on utilise les similarités endogènes et exogènes (fenêtre optimisée par VC)\n",
35 " * same_season=FALSE : les indices pour la validation croisée ne tiennent pas compte des saisons\n",
36 " * mix_strategy=\"mult\" : on multiplie les poids (au lieu d'en éteindre)\n",
37 "\n",
38 "J'ai systématiquement comparé à deux autres approches : la persistence et la moyennes des lendemains des jours \"similaires\" dans tout le passé ; à chaque fois sans prédiction du saut (sauf pour Neighbors : prédiction basée sur les poids calculés).\n",
39 "\n",
40 "Ensuite j'affiche les erreurs, quelques courbes prévues/mesurées, quelques filaments puis les histogrammes de quelques poids. Concernant les graphes de filaments, la moitié gauche du graphe correspond aux jours similaires au jour courant, tandis que la moitié droite affiche les lendemains : ce sont donc les voisinages tels qu'utilisés dans l'algorithme.\n",
41 "\n",
42 "<h2 style=\"color:blue;font-size:2em\">Pollution par chauffage</h2>"
43 ]
44 },
45 {
46 "cell_type": "code",
1e20780e 47 "execution_count": null,
fa8078f9
BA
48 "metadata": {
49 "collapsed": false
50 },
51 "outputs": [],
52 "source": [
69bcd8bc
BA
53 "indices_ch = seq(as.Date(\"2015-01-18\"),as.Date(\"2015-01-24\"),\"days\")\n",
54 "p_ch_nn = getForecast(data,indices_ch,\"Neighbors\",\"Neighbors\",simtype=\"mix\",same_season=FALSE,mix_strategy=\"mult\")\n",
55 "p_ch_pz = getForecast(data, indices_ch, \"Persistence\", \"Zero\", same_day=TRUE)\n",
56 "p_ch_az = getForecast(data, indices_ch, \"Average\", \"Zero\") #, memory=183)\n",
57 "#p_ch_zz = getForecast(data, indices_ch, \"Zero\", \"Zero\")"
fa8078f9
BA
58 ]
59 },
60 {
61 "cell_type": "code",
1e20780e 62 "execution_count": null,
fa8078f9
BA
63 "metadata": {
64 "collapsed": false
65 },
1e20780e 66 "outputs": [],
fa8078f9
BA
67 "source": [
68 "e_ch_nn = getError(data, p_ch_nn)\n",
69 "e_ch_pz = getError(data, p_ch_pz)\n",
70 "e_ch_az = getError(data, p_ch_az)\n",
71 "#e_ch_zz = getError(data, p_ch_zz)\n",
841b7f5a 72 "options(repr.plot.width=9, repr.plot.height=7)\n",
fa8078f9
BA
73 "plotError(list(e_ch_nn, e_ch_pz, e_ch_az), cols=c(1,2,colors()[258]))\n",
74 "\n",
75 "#Noir: neighbors, rouge: persistence, vert: moyenne"
76 ]
77 },
78 {
79 "cell_type": "markdown",
80 "metadata": {},
81 "source": [
82 "La méthode Neighbors fait assez nettement mieux que les autres dans ce cas."
83 ]
84 },
85 {
86 "cell_type": "code",
1e20780e 87 "execution_count": null,
fa8078f9
BA
88 "metadata": {
89 "collapsed": false
90 },
1e20780e 91 "outputs": [],
fa8078f9
BA
92 "source": [
93 "par(mfrow=c(1,2))\n",
94 "options(repr.plot.width=9, repr.plot.height=4)\n",
95 "plotPredReal(data, p_ch_nn, 3)\n",
96 "plotPredReal(data, p_ch_nn, 4)\n",
97 "\n",
98 "#Bleu: prévue, noir: réalisée"
99 ]
100 },
101 {
102 "cell_type": "markdown",
103 "metadata": {},
104 "source": [
105 "Prédictions d'autant plus lisses que le jour à prévoir est atypique (pollué)."
106 ]
107 },
108 {
109 "cell_type": "code",
1e20780e 110 "execution_count": null,
fa8078f9
BA
111 "metadata": {
112 "collapsed": false
113 },
1e20780e 114 "outputs": [],
fa8078f9
BA
115 "source": [
116 "par(mfrow=c(1,2))\n",
117 "plotPredReal(data, p_ch_az, 3)\n",
118 "plotPredReal(data, p_ch_az, 4)"
119 ]
120 },
121 {
122 "cell_type": "markdown",
123 "metadata": {},
124 "source": [
125 "Les erreurs sont proches, mais les courbes prédites très différentes : avantage à \"Neighbors\""
126 ]
127 },
128 {
129 "cell_type": "code",
1e20780e 130 "execution_count": null,
fa8078f9
BA
131 "metadata": {
132 "collapsed": false
133 },
1e20780e 134 "outputs": [],
fa8078f9
BA
135 "source": [
136 "par(mfrow=c(1,2))\n",
69bcd8bc
BA
137 "f3_ch = computeFilaments(data, p_ch_nn$getIndexInData(3), plot=TRUE)\n",
138 "f4_ch = computeFilaments(data, p_ch_nn$getIndexInData(4), plot=TRUE)"
fa8078f9
BA
139 ]
140 },
141 {
142 "cell_type": "code",
1e20780e 143 "execution_count": null,
fa8078f9
BA
144 "metadata": {
145 "collapsed": false
146 },
1e20780e 147 "outputs": [],
fa8078f9
BA
148 "source": [
149 "par(mfrow=c(2,2))\n",
841b7f5a 150 "options(repr.plot.width=9, repr.plot.height=7)\n",
69bcd8bc
BA
151 "plotFilamentsBox(data, f3_ch$indices)\n",
152 "plotFilamentsBox(data, f3_ch$indices+1)\n",
153 "plotFilamentsBox(data, f4_ch$indices)\n",
154 "plotFilamentsBox(data, f4_ch$indices+1)\n",
841b7f5a
BA
155 "\n",
156 "#En haut : jour 3 + lendemain (4) ; en bas : jour 4 + lendemain (5)\n",
157 "#À gauche : premières 24h ; à droite : 24h suivantes"
fa8078f9
BA
158 ]
159 },
160 {
161 "cell_type": "markdown",
162 "metadata": {},
163 "source": [
841b7f5a 164 "Dans les deux cas, un voisinage \"raisonnable\" est trouvé ; mais grande variabilité le lendemain \"pollué\"."
fa8078f9
BA
165 ]
166 },
167 {
168 "cell_type": "code",
169 "execution_count": null,
170 "metadata": {
171 "collapsed": false
172 },
173 "outputs": [],
174 "source": [
175 "par(mfrow=c(1,2))\n",
176 "options(repr.plot.width=9, repr.plot.height=4)\n",
69bcd8bc
BA
177 "plotRelativeVariability(data, f3_ch$indices)\n",
178 "plotRelativeVariability(data, f4_ch$indices)\n",
841b7f5a
BA
179 "\n",
180 "#Variabilité sur 60 courbes au hasard en rouge ; sur nos 60 voisins (+ lendemains) en noir"
181 ]
182 },
183 {
184 "cell_type": "markdown",
185 "metadata": {},
186 "source": [
187 "Dans la situation idéale, il faudrait que la courbe noire soit nettement plus basse que la courbe rouge. Ce n'est pas très clair à J+1, surtout en soirée (de 21h à 0h)."
188 ]
189 },
190 {
191 "cell_type": "code",
192 "execution_count": null,
193 "metadata": {
194 "collapsed": false
195 },
196 "outputs": [],
197 "source": [
198 "par(mfrow=c(1,3))\n",
fa8078f9
BA
199 "plotSimils(p_ch_nn, 3)\n",
200 "plotSimils(p_ch_nn, 4)\n",
841b7f5a 201 "plotSimils(p_ch_nn, 5)\n",
fa8078f9
BA
202 "\n",
203 "#Non pollué à gauche, pollué au milieu, autre pollué à droite"
204 ]
205 },
206 {
207 "cell_type": "markdown",
208 "metadata": {},
209 "source": [
210 "La plupart des poids très proches de zéro ; pas pour le jour 5 : autre type de jour, cf. ci-dessous."
211 ]
212 },
213 {
214 "cell_type": "code",
215 "execution_count": null,
216 "metadata": {
217 "collapsed": false
218 },
219 "outputs": [],
220 "source": [
221 "par(mfrow=c(1,2))\n",
222 "plotPredReal(data, p_ch_nn, 5)\n",
841b7f5a 223 "ignored <- computeFilaments(data, p_ch_nn$getIndexInData(5), plot=TRUE)"
fa8078f9
BA
224 ]
225 },
226 {
227 "cell_type": "markdown",
228 "metadata": {},
229 "source": [
230 "<h2 style=\"color:blue;font-size:2em\">Pollution par épandage</h2>"
231 ]
232 },
233 {
234 "cell_type": "code",
235 "execution_count": null,
236 "metadata": {
237 "collapsed": false
238 },
239 "outputs": [],
240 "source": [
69bcd8bc
BA
241 "indices_ep = seq(as.Date(\"2015-03-15\"),as.Date(\"2015-03-21\"),\"days\")\n",
242 "p_ep_nn = getForecast(data,indices_ep,\"Neighbors\",\"Neighbors\",simtype=\"mix\",same_season=FALSE,mix_strategy=\"mult\")\n",
243 "p_ep_pz = getForecast(data, indices_ep, \"Persistence\", \"Zero\", same_day=TRUE)\n",
244 "p_ep_az = getForecast(data, indices_ep, \"Average\", \"Zero\") #, memory=183)\n",
245 "#p_ep_zz = getForecast(data, indices_ep, \"Zero\", \"Zero\")"
fa8078f9
BA
246 ]
247 },
248 {
249 "cell_type": "code",
250 "execution_count": null,
251 "metadata": {
252 "collapsed": false
253 },
254 "outputs": [],
255 "source": [
256 "e_ep_nn = getError(data, p_ep_nn)\n",
257 "e_ep_pz = getError(data, p_ep_pz)\n",
258 "e_ep_az = getError(data, p_ep_az)\n",
259 "#e_ep_zz = getError(data, p_ep_zz)\n",
841b7f5a 260 "options(repr.plot.width=9, repr.plot.height=7)\n",
fa8078f9
BA
261 "plotError(list(e_ep_nn, e_ep_pz, e_ep_az), cols=c(1,2,colors()[258]))\n",
262 "\n",
263 "#Noir: neighbors, rouge: persistence, vert: moyenne"
264 ]
265 },
266 {
267 "cell_type": "markdown",
268 "metadata": {},
269 "source": [
270 "Cette fois les deux méthodes naïves font en moyenne moins d'erreurs que Neighbors. Prédiction trop difficile ?"
271 ]
272 },
273 {
274 "cell_type": "code",
275 "execution_count": null,
276 "metadata": {
277 "collapsed": false
278 },
279 "outputs": [],
280 "source": [
281 "par(mfrow=c(1,2))\n",
282 "options(repr.plot.width=9, repr.plot.height=4)\n",
69bcd8bc
BA
283 "plotPredReal(data, p_ep_nn, 4)\n",
284 "plotPredReal(data, p_ep_nn, 6)\n",
fa8078f9
BA
285 "\n",
286 "#Bleu: prévue, noir: réalisée"
287 ]
288 },
289 {
290 "cell_type": "markdown",
291 "metadata": {},
292 "source": [
293 "À gauche un jour \"bien\" prévu, à droite le pic d'erreur (jour 6)."
294 ]
295 },
296 {
297 "cell_type": "code",
298 "execution_count": null,
299 "metadata": {
300 "collapsed": false
301 },
302 "outputs": [],
303 "source": [
304 "par(mfrow=c(1,2))\n",
305 "plotPredReal(data, p_ep_pz, 4)\n",
306 "plotPredReal(data, p_ep_pz, 6)"
307 ]
308 },
309 {
310 "cell_type": "markdown",
311 "metadata": {},
312 "source": [
69bcd8bc 313 "Assez bonnes performances de la persistence (par chance...)"
fa8078f9
BA
314 ]
315 },
316 {
317 "cell_type": "code",
318 "execution_count": null,
319 "metadata": {
320 "collapsed": false
321 },
322 "outputs": [],
323 "source": [
324 "par(mfrow=c(1,2))\n",
69bcd8bc
BA
325 "f4_ep = computeFilaments(data, p_ep_nn$getIndexInData(4), plot=TRUE)\n",
326 "f6_ep = computeFilaments(data, p_ep_nn$getIndexInData(6), plot=TRUE)"
327 ]
328 },
329 {
330 "cell_type": "code",
331 "execution_count": null,
332 "metadata": {
333 "collapsed": false
334 },
335 "outputs": [],
336 "source": [
337 "par(mfrow=c(2,2))\n",
338 "options(repr.plot.width=9, repr.plot.height=7)\n",
339 "plotFilamentsBox(data, f4_ep$indices)\n",
340 "plotFilamentsBox(data, f4_ep$indices+1)\n",
341 "plotFilamentsBox(data, f6_ep$indices)\n",
342 "plotFilamentsBox(data, f6_ep$indices+1)\n",
343 "\n",
344 "#En haut : jour 4 + lendemain (5) ; en bas : jour 6 + lendemain (7)\n",
345 "#À gauche : premières 24h ; à droite : 24h suivantes"
346 ]
347 },
348 {
349 "cell_type": "markdown",
350 "metadata": {},
351 "source": [
352 "\"Voisinages\" catastrophiques : les jours 4 et 6 sont trop atypiques ; de façon étonnante les lendemains sont en revanche assez \"centraux\" parmi les lendemains des (mauvais) voisins."
fa8078f9
BA
353 ]
354 },
355 {
356 "cell_type": "code",
357 "execution_count": null,
358 "metadata": {
359 "collapsed": false
360 },
361 "outputs": [],
362 "source": [
363 "par(mfrow=c(1,2))\n",
69bcd8bc
BA
364 "options(repr.plot.width=9, repr.plot.height=4)\n",
365 "plotRelativeVariability(data, f4_ep$indices)\n",
366 "plotRelativeVariability(data, f6_ep$indices)\n",
367 "\n",
368 "#Variabilité sur 60 courbes au hasard en rouge ; sur nos 60 voisins (+ lendemains) en noir"
fa8078f9
BA
369 ]
370 },
371 {
372 "cell_type": "markdown",
373 "metadata": {},
374 "source": [
69bcd8bc
BA
375 "Dans la situation idéale, il faudrait que la courbe noire soit nettement plus basse que la courbe rouge. Ce n'est pas vérifié à J+1, sauf pour le jour 6 en début et fin de journée."
376 ]
377 },
378 {
379 "cell_type": "code",
380 "execution_count": null,
381 "metadata": {
382 "collapsed": false
383 },
384 "outputs": [],
385 "source": [
386 "par(mfrow=c(1,2))\n",
387 "plotSimils(p_ep_nn, 4)\n",
388 "plotSimils(p_ep_nn, 6)"
fa8078f9
BA
389 ]
390 },
391 {
392 "cell_type": "markdown",
393 "metadata": {},
394 "source": [
69bcd8bc
BA
395 "Poids très concentrés près de zéro pour les prédictions avec peu de voisins."
396 ]
397 },
398 {
399 "cell_type": "markdown",
400 "metadata": {},
401 "source": [
402 "<h2 style=\"color:blue;font-size:2em\">Semaine non polluée</h2>"
fa8078f9
BA
403 ]
404 },
405 {
406 "cell_type": "code",
407 "execution_count": null,
408 "metadata": {
409 "collapsed": false
410 },
411 "outputs": [],
412 "source": [
69bcd8bc
BA
413 "indices_np = seq(as.Date(\"2015-04-26\"),as.Date(\"2015-05-02\"),\"days\")\n",
414 "p_np_nn = getForecast(data,indices_np,\"Neighbors\",\"Neighbors\",simtype=\"mix\",same_season=FALSE,mix_strategy=\"mult\")\n",
415 "p_np_pz = getForecast(data, indices_np, \"Persistence\", \"Zero\", same_day=FALSE)\n",
416 "p_np_az = getForecast(data, indices_np, \"Average\", \"Zero\") #, memory=183)\n",
417 "#p_np_zz = getForecast(data, indices_np, \"Zero\", \"Zero\")"
fa8078f9
BA
418 ]
419 },
420 {
421 "cell_type": "code",
422 "execution_count": null,
423 "metadata": {
424 "collapsed": false
425 },
426 "outputs": [],
427 "source": [
428 "e_np_nn = getError(data, p_np_nn)\n",
429 "e_np_pz = getError(data, p_np_pz)\n",
430 "e_np_az = getError(data, p_np_az)\n",
431 "#e_np_zz = getError(data, p_np_zz)\n",
69bcd8bc 432 "options(repr.plot.width=9, repr.plot.height=7)\n",
fa8078f9
BA
433 "plotError(list(e_np_nn, e_np_pz, e_np_az), cols=c(1,2,colors()[258]))\n",
434 "\n",
435 "#Noir: neighbors, rouge: persistence, vert: moyenne"
436 ]
437 },
438 {
439 "cell_type": "markdown",
440 "metadata": {},
441 "source": [
442 "Performances des méthodes \"Average\" et \"Neighbors\" comparables ; mauvais résultats pour la persistence."
443 ]
444 },
445 {
446 "cell_type": "code",
447 "execution_count": null,
448 "metadata": {
449 "collapsed": false
450 },
451 "outputs": [],
452 "source": [
453 "par(mfrow=c(1,2))\n",
454 "options(repr.plot.width=9, repr.plot.height=4)\n",
455 "plotPredReal(data, p_np_nn, 3)\n",
456 "plotPredReal(data, p_np_nn, 6)\n",
457 "\n",
458 "#Bleu: prévue, noir: réalisée"
459 ]
460 },
461 {
462 "cell_type": "markdown",
463 "metadata": {},
464 "source": [
465 "Les \"bonnes\" prédictions (à gauche) sont tout de même trop lissées."
466 ]
467 },
468 {
469 "cell_type": "code",
470 "execution_count": null,
471 "metadata": {
472 "collapsed": false
473 },
474 "outputs": [],
475 "source": [
476 "par(mfrow=c(1,2))\n",
477 "plotPredReal(data, p_np_az, 3)\n",
478 "plotPredReal(data, p_np_az, 6)"
479 ]
480 },
481 {
482 "cell_type": "markdown",
483 "metadata": {},
484 "source": [
69bcd8bc 485 "Légèrement meilleur ajustement par la méthode \"Average\" ; plutôt net à droite."
fa8078f9
BA
486 ]
487 },
488 {
489 "cell_type": "code",
490 "execution_count": null,
491 "metadata": {
492 "collapsed": false
493 },
494 "outputs": [],
495 "source": [
496 "par(mfrow=c(1,2))\n",
69bcd8bc
BA
497 "f3_np = computeFilaments(data, p_np_nn$getIndexInData(3), plot=TRUE)\n",
498 "f6_np = computeFilaments(data, p_np_nn$getIndexInData(6), plot=TRUE)"
499 ]
500 },
501 {
502 "cell_type": "code",
503 "execution_count": null,
504 "metadata": {
505 "collapsed": false
506 },
507 "outputs": [],
508 "source": [
509 "par(mfrow=c(2,2))\n",
510 "options(repr.plot.width=9, repr.plot.height=7)\n",
511 "plotFilamentsBox(data, f3_np$indices)\n",
512 "plotFilamentsBox(data, f3_np$indices+1)\n",
513 "plotFilamentsBox(data, f6_np$indices)\n",
514 "plotFilamentsBox(data, f6_np$indices+1)\n",
515 "\n",
516 "#En haut : jour 3 + lendemain (4) ; en bas : jour 6 + lendemain (7)\n",
517 "#À gauche : premières 24h ; à droite : 24h suivantes"
518 ]
519 },
520 {
521 "cell_type": "markdown",
522 "metadata": {},
523 "source": [
524 "Jours \"typiques\", donc beaucoup de voisins. En revanche les lendemains des jours similaires sont très variables."
525 ]
526 },
527 {
528 "cell_type": "code",
529 "execution_count": null,
530 "metadata": {
531 "collapsed": false
532 },
533 "outputs": [],
534 "source": [
535 "par(mfrow=c(1,2))\n",
536 "options(repr.plot.width=9, repr.plot.height=4)\n",
537 "plotRelativeVariability(data, f3_np$indices)\n",
538 "plotRelativeVariability(data, f6_np$indices)\n",
539 "\n",
540 "#Variabilité sur 60 courbes au hasard en rouge ; sur nos 60 voisins (+ lendemains) en noir"
fa8078f9
BA
541 ]
542 },
543 {
544 "cell_type": "markdown",
545 "metadata": {},
546 "source": [
69bcd8bc 547 "Situation quasi-idéale : la courbe noire est toujours assez nettement en dessous."
fa8078f9
BA
548 ]
549 },
550 {
551 "cell_type": "code",
552 "execution_count": null,
553 "metadata": {
554 "collapsed": false
555 },
556 "outputs": [],
557 "source": [
558 "par(mfrow=c(1,3))\n",
559 "plotSimils(p_np_nn, 3)\n",
560 "plotSimils(p_np_nn, 4)\n",
561 "plotSimils(p_np_nn, 6)"
562 ]
563 },
564 {
565 "cell_type": "markdown",
566 "metadata": {},
567 "source": [
568 "Répartition idéale des poids : quelques uns au-delà de 0.3-0.4, le reste très proche de zéro."
569 ]
570 },
571 {
572 "cell_type": "markdown",
573 "metadata": {},
574 "source": [
575 "## Bilan\n",
576 "\n",
577 "Problème difficile : on ne fait guère mieux qu'une naïve moyenne des lendemains des jours similaires dans le passé, ce qui n'est pas loin de prédire une série constante égale à la dernière valeur observée (méthode \"zéro\"). La persistence donne parfois de bons résultats mais est trop instable (sensibilité à l'argument <code>same_day</code>).\n",
578 "\n",
579 "Comment améliorer la méthode ?"
580 ]
581 }
582 ],
583 "metadata": {
584 "kernelspec": {
585 "display_name": "R",
586 "language": "R",
587 "name": "ir"
588 },
589 "language_info": {
590 "codemirror_mode": "r",
591 "file_extension": ".r",
592 "mimetype": "text/x-r-source",
593 "name": "R",
594 "pygments_lexer": "r",
595 "version": "3.3.2"
596 }
597 },
598 "nbformat": 4,
599 "nbformat_minor": 2
600}