#+TITLE:  Quelques chiffres autour de l'épidémie de Covid-19
#+AUTHOR: François Févotte
# #+DATE:   La date du jour
#+LANGUAGE: fr

#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="http://www.pirilampo.org/styles/readtheorg/css/htmlize.css"/>
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="http://www.pirilampo.org/styles/readtheorg/css/readtheorg.css"/>
#+HTML_HEAD: <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
#+HTML_HEAD: <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.4/js/bootstrap.min.js"></script>
#+HTML_HEAD: <script type="text/javascript" src="http://www.pirilampo.org/styles/lib/js/jquery.stickytableheaders.js"></script>
#+HTML_HEAD: <script type="text/javascript" src="http://www.pirilampo.org/styles/readtheorg/js/readtheorg.js"></script>


* Identification du système

#+BEGIN_SRC shell :exports both
  uname -a
#+END_SRC

#+RESULTS:
: Linux aluminium 4.14.0-3-amd64 #1 SMP Debian 4.14.17-1 (2018-02-14) x86_64 GNU/Linux

#+BEGIN_SRC python :results value :session :exports both
  import sys
  sys.version
#+END_SRC

#+RESULTS:
: 3.7.3rc1 (default, Mar 13 2019, 11:01:15) 
: [GCC 8.3.0]


* Récupération des données

On prend les données distribuées par [[https://ourworldindata.org][Our World In Data]], elles-mêmes issues de
l'[[https://www.ecdc.europa.eu/][ECDC]] :

#+BEGIN_SRC python :results output :session :exports none
  import numpy as np
  import matplotlib.pyplot as plt
  import pandas as pd
  plt.style.use('seaborn')
#+END_SRC

#+RESULTS:

#+BEGIN_SRC python :results value :session :exports both
  url = "https://covid.ourworldindata.org/data/ecdc/full_data.csv"
  data_raw = pd.read_csv(url, index_col='date')
  data_raw.tail(3)
#+END_SRC

#+RESULTS:
:             location  new_cases  new_deaths  total_cases  total_deaths
: date                                                                  
: 2020-04-06  Zimbabwe          0           0            9             1
: 2020-04-07  Zimbabwe          0           0            9             1
: 2020-04-08  Zimbabwe          1           0           10             1


* Evolution comparée de l'épidémie dans quelques pays

Je préfère fonder l'analyse sur le nombre de décès, qui me semble plus fiable et
comparable d'un pays à l'autre que, par exemple, le nombre de cas dépistés. Afin
de recaler l'axe temporel, on positionne $t=0$ au moment où le nombre total de
morts dépasse 100.

La logique est la suivante : on considère le nombre $n^c$ (de décès ou de cas)
dans un pays $c$. On suppose que l'évolution de $n^c$ en fonction du temps $t$
suit une loi de croissance exponentielle (au moins dans une phase initiale). On
s'attend ainsi à avoir une expression du type :
\[
  n^c(t) = n^c_0 \, e^{\lambda^c \left(t-t^c_0\right)}.
\]
Dans cette expression, la valeur initiale $n^c_0 = n^c(t^c_0)$ est liée à la
taille de la population considérée. La constante de temps $\lambda^c$ en revanche,
n'a pas vraiment de raison de l'être : elle reflète simplement le rythme auquel
l'épidémie se propage.

Si l'on se donne un seuil $\tau$ unique, on peut fixer pour chaque pays
l'instant initial $t^c_0$ de sorte que
\[
  n^c(t^c_0) = \tau.
\]
En effectuant un recalage de l'instant initial, c'est à dire en effectuant le
changement de variable temporelle $\tilde{t}^c=t-t^c_0$, on obtient
\[
  n^c(\tilde{t}^c) = \tau \, e^{\lambda^c\,\tilde{t}^c},
\]
ce qui signifie que tous les pays deviennent comparables, indépendamment de leur
taille : on s'est ramené à comparer les constantes de temps $\lambda^c$ entre
elles.

En pratique, on prend
\[
  t^c_0 = \min \left\{t ; n^c(t) > \tau \right\}.
\]

#+BEGIN_SRC python :results value :exports both :session
  # Parameters
  column    = "total_deaths"
  threshold = 100
  countries = ["Italy", "Spain", "France", "United Kingdom", "Germany", "Switzerland"]

  total = {}
  for country in countries:
      total[country] = data_raw.query(f"location == '{country}' & {column} > {threshold}")

  total[countries[2]]
#+END_SRC

#+RESULTS:
#+begin_example
           location  new_cases  new_deaths  total_cases  total_deaths
date                                                                 
2020-03-14    Spain       1227          37         4231           121
2020-03-15    Spain       1522          15         5753           136
2020-03-16    Spain       2000         152         7753           288
2020-03-17    Spain       1438          21         9191           309
2020-03-18    Spain       1987         182        11178           491
2020-03-19    Spain       2538         107        13716           598
2020-03-20    Spain       3431         169        17147           767
2020-03-21    Spain       2833         235        19980          1002
2020-03-22    Spain       4946         324        24926          1326
2020-03-23    Spain       3646         394        28572          1720
2020-03-24    Spain       4517         462        33089          2182
2020-03-25    Spain       6584         514        39673          2696
2020-03-26    Spain       7937         738        47610          3434
2020-03-27    Spain       8578         655        56188          4089
2020-03-28    Spain       7871         769        64059          4858
2020-03-29    Spain       8189         832        72248          5690
2020-03-30    Spain       6549         838        78797          6528
2020-03-31    Spain       6398         812        85195          7340
2020-04-01    Spain       9222         849        94417          8189
2020-04-02    Spain       7719         864       102136          9053
2020-04-03    Spain       8102         950       110238         10003
2020-04-04    Spain       7472         932       117710         10935
2020-04-05    Spain       7026         809       124736         11744
2020-04-06    Spain       6023         674       130759         12418
2020-04-07    Spain       4273         637       135032         13055
2020-04-08    Spain       5478         743       140510         13798
2020-04-09    Spain       6180         757       146690         14555
#+end_example

#+BEGIN_SRC python :session :results output file :exports results :var pltfile="total.png"
  plt.figure(figsize=(10,5))
  for country in total.keys():
      x = total[country][column]
      plt.plot(np.arange(len(x)), x, label=country, linewidth=3)
  plt.xlabel(f"Number of days since {column} > {threshold}")
  plt.ylabel(column)
  plt.yscale("log")
  plt.legend(fontsize='x-large')
  plt.tight_layout()
  plt.savefig(pltfile)
  plt.close()
  print(pltfile)
#+END_SRC

#+RESULTS:
[[file:total.png]]


* Vers un passage du pic ?

On s'intéresse ici à l'atteinte d'un pic du nombre de décès quotidiens liés à
Covid-19.  Là encore, l'axe temporel est recalé afin de permettre une
comparaison entre pays : $t=0$ est positionné au moment où le nombre quotidien
de morts dépasse 15.

#+BEGIN_SRC python :session :results value :exports both
  threshold = 15

  daily = {}
  for country in countries:
      daily[country] = data_raw.query(f"location == '{country}' & new_deaths > {threshold}")

  daily[countries[2]]
#+END_SRC

#+RESULTS:
#+begin_example
           location  new_cases  new_deaths  total_cases  total_deaths
date                                                                 
2020-03-14   France        785          18         3661            79
2020-03-16   France        924          36         5423           127
2020-03-17   France       1210          21         6633           148
2020-03-18   France       1097          27         7730           175
2020-03-19   France       1404          69         9134           244
2020-03-20   France       1861         128        10995           372
2020-03-21   France       1617          78        12612           450
2020-03-22   France       1847         112        14459           562
2020-03-23   France       1559         112        16018           674
2020-03-24   France       3838         186        19856           860
2020-03-25   France       2446         240        22302          1100
2020-03-26   France       2931         231        25233          1331
2020-03-27   France       3922         365        29155          1696
2020-03-28   France       3809         299        32964          1995
2020-03-29   France       4611         319        37575          2314
2020-03-30   France       2599         292        40174          2606
2020-03-31   France       4376         418        44550          3024
2020-04-01   France       7578         499        52128          3523
2020-04-02   France       4861         509        56989          4032
2020-04-03   France       2116         471        59105          4503
2020-04-04   France       5233        2004        64338          6507
2020-04-05   France       4267        1053        68605          7560
2020-04-06   France       1873         518        70478          8078
2020-04-07   France       3912         833        74390          8911
2020-04-08   France       3777        1417        78167         10328
#+end_example

Le pic observé pour la France au 04/04 (jour 20 sur le graphique) correspond à la prise en compte
instantanée de tous les décès en EHPAD, dont le décompte est disponible à partir
du 01/02 (/cf./ [[https://www.gouvernement.fr/info-coronavirus/carte-et-donnees][données du gouvernement]])

#+BEGIN_SRC python :session :results output file :exports results :var pltfile="daily.png"
  plt.figure(figsize=(10,5))
  for country in daily.keys():
      x = daily[country]['new_deaths']
      plt.plot(np.arange(len(x)), x, label=country, linewidth=3)
  plt.xlabel(f"Number of days since daily deaths > {threshold}")
  plt.ylabel("Dealy death rate")
  plt.yscale("log")
  plt.legend(fontsize='x-large')
  plt.tight_layout()
  plt.savefig(pltfile)
  plt.close()
  print(pltfile)
#+END_SRC

#+RESULTS:
[[file:daily.png]]

# Local Variables:
# org-babel-python-command: "python3"
# org-confirm-babel-evaluate: nil
# End:
