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