various fixes (especially in plotFbox and Neighbors shape predict
[talweg.git] / reports / report_2017-03-01.13h_average.ipynb
index b3f1336..b186668 100644 (file)
@@ -19,8 +19,9 @@
    },
    "outputs": [],
    "source": [
-    "data = getData(ts_data=\"../pkg/data/pm10_mesures_H_loc.csv\", exo_data=\"../pkg/data/meteo_extra_noNAs.csv\",\n",
-    "               input_tz = \"Europe/Paris\", working_tz=\"Europe/Paris\", predict_at=7)"
+    "ts_data = read.csv(system.file(\"extdata\",\"pm10_mesures_H_loc.csv\",package=\"talweg\"))\n",
+    "exo_data = read.csv(system.file(\"extdata\",\"meteo_extra_noNAs.csv\",package=\"talweg\"))\n",
+    "data = getData(ts_data, exo_data, input_tz = \"Europe/Paris\", working_tz=\"Europe/Paris\", predict_at=13)"
    ]
   },
   {
@@ -35,6 +36,8 @@
     " * same_season=FALSE : les indices pour la validation croisée ne tiennent pas compte des saisons\n",
     " * mix_strategy=\"mult\" : on multiplie les poids (au lieu d'en éteindre)\n",
     "\n",
+    "(valeurs par défaut).\n",
+    "\n",
     "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",
     "\n",
     "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",
    },
    "outputs": [],
    "source": [
-    "indices = seq(as.Date(\"2015-01-18\"),as.Date(\"2015-01-24\"),\"days\")\n",
-    "p_ch_nn = getForecast(data,indices,\"Neighbors\",\"Neighbors\",simtype=\"mix\",same_season=FALSE,mix_strategy=\"mult\")\n",
-    "p_ch_pz = getForecast(data, indices, \"Persistence\", \"Zero\", same_day=TRUE)\n",
-    "p_ch_az = getForecast(data, indices, \"Average\", \"Zero\") #, memory=183)\n",
-    "#p_ch_zz = getForecast(data, indices, \"Zero\", \"Zero\")\n",
-    "#p_ch_l = getForecast(data, indices, \"Level\", same_day=FALSE)"
+    "indices_ch = seq(as.Date(\"2015-01-18\"),as.Date(\"2015-01-24\"),\"days\")\n",
+    "p_ch_nn = computeForecast(data,indices_ch, \"Neighbors\", \"Neighbors\", simtype=\"mix\")\n",
+    "p_ch_pz = computeForecast(data, indices_ch, \"Persistence\", \"Zero\", same_day=TRUE)\n",
+    "p_ch_az = computeForecast(data, indices_ch, \"Average\", \"Zero\") #, memory=183)\n",
+    "#p_ch_zz = computeForecast(data, indices_ch, \"Zero\", \"Zero\")"
    ]
   },
   {
    },
    "outputs": [],
    "source": [
-    "e_ch_nn = getError(data, p_ch_nn)\n",
-    "e_ch_pz = getError(data, p_ch_pz)\n",
-    "e_ch_az = getError(data, p_ch_az)\n",
-    "#e_ch_zz = getError(data, p_ch_zz)\n",
-    "#e_ch_l = getError(data, p_ch_l)\n",
-    "options(repr.plot.width=9, repr.plot.height=6)\n",
+    "e_ch_nn = computeError(data, p_ch_nn)\n",
+    "e_ch_pz = computeError(data, p_ch_pz)\n",
+    "e_ch_az = computeError(data, p_ch_az)\n",
+    "#e_ch_zz = computeError(data, p_ch_zz)\n",
+    "options(repr.plot.width=9, repr.plot.height=7)\n",
     "plotError(list(e_ch_nn, e_ch_pz, e_ch_az), cols=c(1,2,colors()[258]))\n",
     "\n",
     "#Noir: neighbors, rouge: persistence, vert: moyenne"
    ]
   },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "La méthode Neighbors fait assez nettement mieux que les autres dans ce cas."
-   ]
-  },
   {
    "cell_type": "code",
    "execution_count": null,
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Prédictions d'autant plus lisses que le jour à prévoir est atypique (pollué)."
+    "Prédictions très lisses."
    ]
   },
   {
     "plotPredReal(data, p_ch_az, 4)"
    ]
   },
-  {
-   "cell_type": "markdown",
-   "metadata": {},
-   "source": [
-    "Les erreurs sont proches, mais les courbes prédites très différentes : avantage à \"Neighbors\""
-   ]
-  },
   {
    "cell_type": "code",
    "execution_count": null,
    "outputs": [],
    "source": [
     "par(mfrow=c(1,2))\n",
-    "f3 = computeFilaments(data, p_ch_nn$getIndexInData(3), plot=TRUE)\n",
-    "f4 = computeFilaments(data, p_ch_nn$getIndexInData(4), plot=TRUE)"
+    "f3_ch = computeFilaments(data, p_ch_nn$getIndexInData(3), plot=TRUE)\n",
+    "f4_ch = computeFilaments(data, p_ch_nn$getIndexInData(4), plot=TRUE)"
    ]
   },
   {
    "outputs": [],
    "source": [
     "par(mfrow=c(2,2))\n",
-    "plotFilamentsBox(data, f3$indices)\n",
-    "plotFilamentsBox(data, f3$indices+1)\n",
-    "plotFilamentsBox(data, f4$indices)\n",
-    "plotFilamentsBox(data, f4$indices+1)"
+    "options(repr.plot.width=9, repr.plot.height=7)\n",
+    "plotFilamentsBox(data, f3_ch$indices)\n",
+    "plotFilamentsBox(data, f3_ch$indices+1)\n",
+    "plotFilamentsBox(data, f4_ch$indices)\n",
+    "plotFilamentsBox(data, f4_ch$indices+1)\n",
+    "\n",
+    "#En haut : jour 3 + lendemain (4) ; en bas : jour 4 + lendemain (5)\n",
+    "#À gauche : premières 24h ; à droite : 24h suivantes"
    ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Beaucoup de courbes similaires dans le cas peu pollué, très peu pour un jour pollué."
+    "Peu de voisins, les courbes sont assez isolées (en particulier les lendemains)."
    ]
   },
   {
    "outputs": [],
    "source": [
     "par(mfrow=c(1,2))\n",
-    "plotSimils(p_ch_nn, 6)\n",
-    "plotSimils(p_ch_nn, 6)\n",
-    "#plotSimils(p_ch_nn, 5)\n",
+    "options(repr.plot.width=9, repr.plot.height=4)\n",
+    "plotRelativeVariability(data, f3_ch$indices)\n",
+    "plotRelativeVariability(data, f4_ch$indices)\n",
     "\n",
-    "#Non pollué à gauche, pollué au milieu, autre pollué à droite"
+    "#Variabilité sur 60 courbes au hasard en rouge ; sur nos 60 voisins (+ lendemains) en noir"
    ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "La plupart des poids très proches de zéro ; pas pour le jour 5 : autre type de jour, cf. ci-dessous."
+    "Il faudrait que la courbe noire soit nettement plus basse que la courbe rouge."
    ]
   },
   {
    "outputs": [],
    "source": [
     "par(mfrow=c(1,2))\n",
-    "plotPredReal(data, p_ch_nn, 5)\n",
-    "plotFilaments(data, p_ch_nn$getIndexInData(5))"
+    "plotSimils(p_ch_nn, 3)\n",
+    "plotSimils(p_ch_nn, 4)\n",
+    "\n",
+    "#Non pollué à gauche, pollué à droite"
    ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "<h2 style=\"color:blue;font-size:2em\">Pollution par épandage</h2>"
+    "Poids plus concentrés autour de 0 pour un jour plus pollué."
    ]
   },
   {
    },
    "outputs": [],
    "source": [
-    "indices = seq(as.Date(\"2015-03-15\"),as.Date(\"2015-03-21\"),\"days\")\n",
-    "p_ep_nn = getForecast(data,indices,\"Neighbors\",\"Neighbors\",simtype=\"mix\",same_season=FALSE,mix_strategy=\"mult\")\n",
-    "p_ep_pz = getForecast(data, indices, \"Persistence\", \"Zero\", same_day=TRUE)\n",
-    "p_ep_az = getForecast(data, indices, \"Average\", \"Zero\") #, memory=183)\n",
-    "#p_ep_zz = getForecast(data, indices, \"Zero\", \"Zero\")\n",
-    "#p_ep_l = getForecast(data, indices, \"Level\", same_day=TRUE)"
+    "#Fenêtres sélectionnées dans ]0,10] / endo à gauche, exo à droite\n",
+    "p_ch_nn$getParams(3)$window\n",
+    "p_ch_nn$getParams(4)$window"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "<h2 style=\"color:blue;font-size:2em\">Pollution par épandage</h2>"
    ]
   },
   {
    },
    "outputs": [],
    "source": [
-    "class(p_ep_nn)"
+    "indices_ep = seq(as.Date(\"2015-03-15\"),as.Date(\"2015-03-21\"),\"days\")\n",
+    "p_ep_nn = computeForecast(data,indices_ep, \"Neighbors\", \"Neighbors\", simtype=\"mix\")\n",
+    "p_ep_pz = computeForecast(data, indices_ep, \"Persistence\", \"Zero\", same_day=TRUE)\n",
+    "p_ep_az = computeForecast(data, indices_ep, \"Average\", \"Zero\") #, memory=183)\n",
+    "#p_ep_zz = computeForecast(data, indices_ep, \"Zero\", \"Zero\")"
    ]
   },
   {
    },
    "outputs": [],
    "source": [
-    "e_ep_nn = getError(data, p_ep_nn)\n",
-    "e_ep_pz = getError(data, p_ep_pz)\n",
-    "e_ep_az = getError(data, p_ep_az)\n",
-    "#e_ep_zz = getError(data, p_ep_zz)\n",
-    "#e_ep_l = getError(data, p_ep_l)\n",
-    "options(repr.plot.width=9, repr.plot.height=6)\n",
+    "e_ep_nn = computeError(data, p_ep_nn)\n",
+    "e_ep_pz = computeError(data, p_ep_pz)\n",
+    "e_ep_az = computeError(data, p_ep_az)\n",
+    "#e_ep_zz = computeError(data, p_ep_zz)\n",
+    "options(repr.plot.width=9, repr.plot.height=7)\n",
     "plotError(list(e_ep_nn, e_ep_pz, e_ep_az), cols=c(1,2,colors()[258]))\n",
     "\n",
     "#Noir: neighbors, rouge: persistence, vert: moyenne"
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Cette fois les deux méthodes naïves font en moyenne moins d'erreurs que Neighbors. Prédiction trop difficile ?"
+    "Neighbors et Average comparables, Persistence moins performante."
    ]
   },
   {
    "source": [
     "par(mfrow=c(1,2))\n",
     "options(repr.plot.width=9, repr.plot.height=4)\n",
-    "plotPredReal(data, p_ep_nn, 5)\n",
-    "plotPredReal(data, p_ep_nn, 2)\n",
+    "plotPredReal(data, p_ep_nn, 6)\n",
+    "plotPredReal(data, p_ep_nn, 3)\n",
     "\n",
     "#Bleu: prévue, noir: réalisée"
    ]
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "À gauche un jour \"bien\" prévu, à droite le pic d'erreur (jour 6)."
+    "À gauche un jour \"bien\" prévu, à droite le pic d'erreur (jour 3)."
    ]
   },
   {
    "outputs": [],
    "source": [
     "par(mfrow=c(1,2))\n",
-    "plotPredReal(data, p_ep_pz, 4)\n",
-    "plotPredReal(data, p_ep_pz, 6)"
+    "plotPredReal(data, p_ep_az, 6)\n",
+    "plotPredReal(data, p_ep_az, 3)"
    ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Bonnes performances de la persistence (par chance...)"
+    "Average : autre type de prévision."
    ]
   },
   {
    "outputs": [],
    "source": [
     "par(mfrow=c(1,2))\n",
-    "plotFilaments(data, p_ep_nn$getIndexInData(5))\n",
-    "plotFilaments(data, p_ep_nn$getIndexInData(2))"
+    "f6_ep = computeFilaments(data, p_ep_nn$getIndexInData(6), plot=TRUE)\n",
+    "f3_ep = computeFilaments(data, p_ep_nn$getIndexInData(3), plot=TRUE)"
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "par(mfrow=c(2,2))\n",
+    "options(repr.plot.width=9, repr.plot.height=7)\n",
+    "plotFilamentsBox(data, f6_ep$indices)\n",
+    "plotFilamentsBox(data, f6_ep$indices+1)\n",
+    "plotFilamentsBox(data, f3_ep$indices)\n",
+    "plotFilamentsBox(data, f3_ep$indices+1)\n",
+    "\n",
+    "#En haut : jour 4 + lendemain (5) ; en bas : jour 6 + lendemain (7)\n",
+    "#À gauche : premières 24h ; à droite : 24h suivantes"
    ]
   },
   {
    "outputs": [],
    "source": [
     "par(mfrow=c(1,2))\n",
-    "plotSimils(p_ep_nn, 5)\n",
-    "plotSimils(p_ep_nn, 2)"
+    "options(repr.plot.width=9, repr.plot.height=4)\n",
+    "plotRelativeVariability(data, f6_ep$indices)\n",
+    "plotRelativeVariability(data, f3_ep$indices)\n",
+    "\n",
+    "#Variabilité sur 60 courbes au hasard en rouge ; sur nos 60 voisins (+ lendemains) en noir"
+   ]
+  },
+  {
+   "cell_type": "markdown",
+   "metadata": {},
+   "source": [
+    "Il faudrait que la courbe noire soit nettement plus basse que la courbe rouge..."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "par(mfrow=c(1,2))\n",
+    "plotSimils(p_ep_nn, 6)\n",
+    "plotSimils(p_ep_nn, 3)"
    ]
   },
   {
     "Même observation concernant les poids : concentrés près de zéro pour les prédictions avec peu de voisins."
    ]
   },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "#Fenêtres sélectionnées dans ]0,10] / endo à gauche, exo à droite\n",
+    "p_ep_nn$getParams(6)$window\n",
+    "p_ep_nn$getParams(3)$window"
+   ]
+  },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "## Semaine non polluée"
+    "<h2 style=\"color:blue;font-size:2em\">Semaine non polluée</h2>"
    ]
   },
   {
    },
    "outputs": [],
    "source": [
-    "indices = seq(as.Date(\"2015-04-26\"),as.Date(\"2015-05-02\"),\"days\")\n",
-    "p_np_nn = getForecast(data,indices,\"Neighbors\",\"Neighbors\",simtype=\"mix\",same_season=FALSE,mix_strategy=\"mult\")\n",
-    "p_np_pz = getForecast(data, indices, \"Persistence\", \"Zero\", same_day=FALSE)\n",
-    "p_np_az = getForecast(data, indices, \"Average\", \"Zero\") #, memory=183)\n",
-    "#p_np_zz = getForecast(data, indices, \"Zero\", \"Zero\")\n",
-    "#p_np_l = getForecast(data, indices, \"Level\", same_day=FALSE)"
+    "indices_np = seq(as.Date(\"2015-04-26\"),as.Date(\"2015-05-02\"),\"days\")\n",
+    "p_np_nn = computeForecast(data,indices_np, \"Neighbors\", \"Neighbors\", simtype=\"mix\")\n",
+    "p_np_pz = computeForecast(data, indices_np, \"Persistence\", \"Zero\", same_day=FALSE)\n",
+    "p_np_az = computeForecast(data, indices_np, \"Average\", \"Zero\") #, memory=183)\n",
+    "#p_np_zz = computeForecast(data, indices_np, \"Zero\", \"Zero\")"
    ]
   },
   {
    },
    "outputs": [],
    "source": [
-    "e_np_nn = getError(data, p_np_nn)\n",
-    "e_np_pz = getError(data, p_np_pz)\n",
-    "e_np_az = getError(data, p_np_az)\n",
-    "#e_np_zz = getError(data, p_np_zz)\n",
-    "#e_np_l = getError(data, p_np_l)\n",
-    "options(repr.plot.width=9, repr.plot.height=6)\n",
+    "e_np_nn = computeError(data, p_np_nn)\n",
+    "e_np_pz = computeError(data, p_np_pz)\n",
+    "e_np_az = computeError(data, p_np_az)\n",
+    "#e_np_zz = computeError(data, p_np_zz)\n",
+    "options(repr.plot.width=9, repr.plot.height=7)\n",
     "plotError(list(e_np_nn, e_np_pz, e_np_az), cols=c(1,2,colors()[258]))\n",
     "\n",
     "#Noir: neighbors, rouge: persistence, vert: moyenne"
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Performances des méthodes \"Average\" et \"Neighbors\" comparables ; mauvais résultats pour la persistence."
+    "Performances des méthodes \"Average\" et \"Neighbors\" identiques ; mauvais résultats pour la persistence."
    ]
   },
   {
    "source": [
     "par(mfrow=c(1,2))\n",
     "options(repr.plot.width=9, repr.plot.height=4)\n",
+    "plotPredReal(data, p_np_nn, 5)\n",
     "plotPredReal(data, p_np_nn, 3)\n",
-    "plotPredReal(data, p_np_nn, 6)\n",
     "\n",
     "#Bleu: prévue, noir: réalisée"
    ]
   },
   {
-   "cell_type": "markdown",
-   "metadata": {},
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
    "source": [
-    "Les \"bonnes\" prédictions (à gauche) sont tout de même trop lissées."
+    "par(mfrow=c(1,2))\n",
+    "plotPredReal(data, p_np_az, 5)\n",
+    "plotPredReal(data, p_np_az, 3)"
    ]
   },
   {
    "outputs": [],
    "source": [
     "par(mfrow=c(1,2))\n",
-    "plotPredReal(data, p_np_az, 3)\n",
-    "plotPredReal(data, p_np_az, 6)"
+    "f5_np = computeFilaments(data, p_np_nn$getIndexInData(5), plot=TRUE)\n",
+    "f3_np = computeFilaments(data, p_np_nn$getIndexInData(3), plot=TRUE)"
    ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Légèrement meilleur ajustement par la méthode \"Average\" ; très net à droite."
+    "Jours \"typiques\", donc beaucoup de voisins."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "par(mfrow=c(2,2))\n",
+    "options(repr.plot.width=9, repr.plot.height=7)\n",
+    "plotFilamentsBox(data, f5_np$indices)\n",
+    "plotFilamentsBox(data, f5_np$indices+1)\n",
+    "plotFilamentsBox(data, f3_np$indices)\n",
+    "plotFilamentsBox(data, f3_np$indices+1)\n",
+    "\n",
+    "#En haut : jour 3 + lendemain (4) ; en bas : jour 6 + lendemain (7)\n",
+    "#À gauche : premières 24h ; à droite : 24h suivantes"
    ]
   },
   {
    "outputs": [],
    "source": [
     "par(mfrow=c(1,2))\n",
-    "plotFilaments(data, p_np_nn$getIndexInData(3))\n",
-    "plotFilaments(data, p_np_nn$getIndexInData(6))"
+    "options(repr.plot.width=9, repr.plot.height=4)\n",
+    "plotRelativeVariability(data, f5_np$indices)\n",
+    "plotRelativeVariability(data, f3_np$indices)\n",
+    "\n",
+    "#Variabilité sur 60 courbes au hasard en rouge ; sur nos 60 voisins (+ lendemains) en noir"
    ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Jours \"typiques\", donc beaucoup de voisins."
+    "Situation meilleure que dans les autres cas, mais assez difficile tout de même."
    ]
   },
   {
    },
    "outputs": [],
    "source": [
-    "par(mfrow=c(1,3))\n",
-    "plotSimils(p_np_nn, 3)\n",
-    "plotSimils(p_np_nn, 4)\n",
-    "plotSimils(p_np_nn, 6)"
+    "par(mfrow=c(1,2))\n",
+    "plotSimils(p_np_nn, 5)\n",
+    "plotSimils(p_np_nn, 3)"
    ]
   },
   {
    "cell_type": "markdown",
    "metadata": {},
    "source": [
-    "Répartition idéale des poids : quelques uns au-delà de 0.3-0.4, le reste très proche de zéro."
+    "Répartition des poids difficile à interpréter."
+   ]
+  },
+  {
+   "cell_type": "code",
+   "execution_count": null,
+   "metadata": {
+    "collapsed": false
+   },
+   "outputs": [],
+   "source": [
+    "#Fenêtres sélectionnées dans ]0,10] / endo à gauche, exo à droite\n",
+    "p_np_nn$getParams(5)$window\n",
+    "p_np_nn$getParams(3)$window"
    ]
   },
   {