Ce post présente la dynamique de l'épidémie et propose des graphiques montrant différentes normalisations des données permettant de mesurer les variations de la vitesse de propagation du virus.

J'ai commencé ce projet en avril 2020, lorsque la dynamique de l'épidémie était très incertaine, durant le confinement en France. Mon objectif est de mettre à jour les données toutes les semaines pour permettre un suivi des chiffres loin du sensationnalisme et des sous-estimations que l'on peut retrouver dans les médias.

Dans ce contexte, l'accent est mis sur les données pondérées sur 7 jours, ce qui permet de lisser les fluctuations importantes que l'on observe entre les différents jours de la semaine. Vous retrouverez le code utilisé à l'adresse suivante : payoto/covid19-viz

import pandas as pd
from matplotlib import pyplot as plt
import requests
import datetime
from IPython.display import display, Markdown
import viz
display(Markdown("Article mis à jour le {}".format(datetime.date.today().strftime("%d/%m/%Y"))))

Article mis à jour le 06/01/2021

Mise à jour des commentaires

Le 06/01/2021

Nouvelle année marquée par des tendances stables: il ne semble pas il y avoir augmentation ou réduction en ce moment.

Les données de cas sont très bruitées au moment de Noël et du jour de l'an, il va falloir attendre encore une dizaine de jour avant de voir l'impact de ces évenement sur les tendances de cas et d'hospitalisations et réanimations.

Le 13/12/2020

Le relachement des restrictions fait son effet et la prévalence du COVID-19 reprend son ascention. Le nombre de cas augmente à nouveau de 3% par jour.

Le 27/11/2020

Le pic de décès, réanimation et hospitalisations ne fut atteint que le 16 Novembre les indicateurs indiquent une amélioration marquée. La deuxième vague aura eu une ampleur très similaire à la première vague.

Le 14/11/2020

Le deuxième confinement a fait son effet et le nombre de cas et de décès ont atteint leur pic dans la semaine du 2 et 9 Novembre respectivement. Le pic de réanimation et hospitalisations est attendu dans les jours à venir.

Le 25/10/2020

Les tendances sont similaires à la semaine dernière et restent inquiétantes.

Malgré on observe un ralentissement du nombre de décès (pic a +10%/jour le 18/10/2020). à cause des différentes moyennes glissantes les nombres pour cette semaine ne sont pas encore définitifs. Ce ralentissement est important car de manière contre-intuitive le pic de décès lors de la première vague intervint avant le pic de réanimation et le pic d'hospitalisations.

L'augmentation du nombre de cas reste stable à +5% par jour. Cette indicateurs n'est pas fiable vu le taux de positivité des tests. (~14%)

Le 17/10/2020

Tous les indicateurs montrent une croissance exponentielle de la maladie et une deuxième vague sérieuse se profile.

Le taux d'accroissement journalier +5% pour tous les indicateurs.

Le 11/10/2020

  • Nous observons sur les trois dernières semaines une stabilisation du nombre de réanimation : nous observons une augmentation linéaire de 25 personnes en réanimation par jour. C'est un signe encourageant qui suggère que l'épidémie a ralenti il y a quelques semaines. Malheureusement ceci ne nous donne pas d'information sur la trajectoire des deux dernières semaines.
  • Ajout du nombre de cas aux graphiques concernant la France.

Le 27/09/2020

Aujourd'hui une vue agrandie sur les dernières semaines est ajoutée.

  • Nous observons un phénomène surprenant d'une baisse de nombre de personne à l'hôpital, cela semble être un phénomène externe qui ne correspond pas à la dynamique de la maladie ;
  • un relativement grand nombre de décès le 18/09 (80) sort de la tendance en cours.

Le 20/09/2020

Deux points importants apparaissent dans les données :

  • L'augmentation du nombre de personne en réanimation et hôpital semble se stabiliser autour de +5% par jour (doublement toutes les deux semaines) ;
  • Sans surprise, les tendances en réanimations et hospitalisations commencent à apparaître dans les courbes de décès.
from viz import *

Données de DataAgainst Covid-19

Les données utilisées sont celles de DataAgainst COVID-19 (aka opencovid19-fr) [github.com/opencovid19-fr/data]. Elles sont mises à jour quotidiennement.

file_name = 'opencovid19-fr-chiffres-cles.csv'
url = 'https://raw.githubusercontent.com/opencovid19-fr/data/master/dist/chiffres-cles.csv'
myfile = requests.get(url)
open(file_name, 'wb').write(myfile.content)
data = pd.read_csv('opencovid19-fr-chiffres-cles.csv')
data.tail()
date granularite maille_code maille_nom cas_confirmes cas_ehpad cas_confirmes_ehpad cas_possibles_ehpad deces deces_ehpad reanimation hospitalises nouvelles_hospitalisations nouvelles_reanimations gueris depistes source_nom source_url source_archive source_type
38720 2021-01-05 region REG-75 Nouvelle-Aquitaine NaN NaN NaN NaN 1797.0 NaN 141.0 1140.0 94.0 17.0 8009.0 NaN OpenCOVID19-fr NaN NaN opencovid19-fr
38721 2021-01-05 region REG-76 Occitanie NaN NaN NaN NaN 2182.0 NaN 165.0 1257.0 74.0 9.0 10415.0 NaN OpenCOVID19-fr NaN NaN opencovid19-fr
38722 2021-01-05 region REG-84 Auvergne-Rhône-Alpes NaN NaN NaN NaN 6925.0 NaN 386.0 4207.0 305.0 48.0 28570.0 NaN OpenCOVID19-fr NaN NaN opencovid19-fr
38723 2021-01-05 region REG-93 Provence-Alpes-Côte d'Azur NaN NaN NaN NaN 3668.0 NaN 304.0 2504.0 193.0 28.0 19209.0 NaN OpenCOVID19-fr NaN NaN opencovid19-fr
38724 2021-01-05 region REG-94 Corse NaN NaN NaN NaN 116.0 NaN 6.0 19.0 2.0 2.0 515.0 NaN OpenCOVID19-fr NaN NaN opencovid19-fr
data = enable_time_series_plot(data, timein_field="date", timeseries_field_out="t")

Dernières données pour la France

Ici, nous tabulons les derniers jours de données pour la France. Les données brutes ainsi que les données avec une moyenne glissante sur 7 jours sont calculées. Nous n'observons que les réanimations, les hospitalisations et les décès. Les données de cas confirmés ont longtemps été insuffisantes pour permettre une analyse intelligente de l'épidémie.

Dans les graphiques ci-après nous analysons trois types de données :

  • les données brutes d'entrées en réanimation et de décès ;
  • ces même données pondérées sur 7 jours ;
  • ces données pondérées normalisée par le nombre de personnes en réanimation.

Ce troisième graphique donne donc une indication de l'accélération ou ralentissement, même lorsque les données sont d'ampleurs très différentes.

maille_active = 'FRA'
fra = oc19_data_preproc(data, maille_active)
fra.tail(10)
deces deces_ehpad reanimation hospitalises cas_confirmes reanimation_cumul hospitalises_cumul deces_jour deces_jour_jour deces_ehpad_jour ... deces_ehpad_jour_mma_jour deces_jour_prop deces_ehpad_jour_prop reanimation_jour_prop hospitalises_jour_prop cas_confirmes_jour_prop reanimation_cumul_jour_prop hospitalises_cumul_jour_prop reanimation_solde_vivant_jour_prop deces_jour_mma_jour_prop
t
2020-12-27 43551.0 19195.0 2659.0 24653.0 2559686.0 643742.0 4515756.0 173.0 27.0 0.0 ... 0.000000 0.005826 0.003133 -0.005104 -0.001970 0.004818 0.004165 0.005481 0.090313 0.023649
2020-12-28 43914.0 19195.0 2703.0 24678.0 2562646.0 646445.0 4540434.0 363.0 190.0 0.0 ... 0.000000 0.005817 0.003133 -0.002273 -0.003213 0.004655 0.004138 0.005433 0.092226 0.006711
2020-12-29 44298.0 19780.0 2675.0 24776.0 2574041.0 649120.0 4565210.0 384.0 21.0 585.0 ... 23.428571 0.005776 0.004225 -0.002830 -0.001084 0.004612 0.004110 0.005398 0.092817 0.001675
2020-12-30 44601.0 19780.0 2661.0 24593.0 2600498.0 651781.0 4589803.0 303.0 -81.0 0.0 ... 0.000000 0.005823 0.004225 -0.002631 -0.001690 0.005198 0.004082 0.005360 0.094970 0.014851
2020-12-31 44852.0 19780.0 2634.0 24440.0 2620425.0 654415.0 4614243.0 251.0 -52.0 0.0 ... 0.000000 0.005666 0.004225 -0.000976 -0.001163 0.005065 0.004062 0.005325 0.095509 -0.021922
2021-01-01 44985.0 19780.0 2618.0 24296.0 2639773.0 657033.0 4638539.0 133.0 -118.0 0.0 ... 0.000000 0.005567 0.004225 -0.000382 -0.000564 0.004979 0.004044 0.005295 0.095274 -0.014832
2021-01-02 45141.0 19780.0 2641.0 24491.0 2643239.0 659674.0 4663030.0 156.0 23.0 0.0 ... 0.000000 0.005579 0.004225 -0.000433 0.000082 0.004993 0.004026 0.005267 0.094932 0.005672
2021-01-03 45257.0 19780.0 2674.0 24813.0 2655728.0 662348.0 4687843.0 116.0 -40.0 0.0 ... 0.000000 0.005385 0.004225 0.000801 0.000921 0.005166 0.004013 0.005244 0.091944 -0.033411
2021-01-04 45635.0 19780.0 2666.0 24995.0 2659750.0 665014.0 4712838.0 378.0 262.0 0.0 ... 0.000000 0.005387 0.004225 -0.001983 0.001812 0.005216 0.003989 0.005226 0.090237 0.008716
2021-01-05 45980.0 20302.0 2625.0 24904.0 2680239.0 667639.0 4737742.0 345.0 -33.0 522.0 ... -9.000000 0.005226 0.003673 -0.002721 0.000734 0.005660 0.003963 0.005202 0.088816 -0.023187

10 rows × 50 columns

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

Dans ce graphe nous montrons les étâts les plus critiques de la maladie: les décès et les réanimations. Vu que chaque jour la donnée publiée est le nombre total de personne en réanimation, et que nous cherchons l'évolution nous calculons la différence entre chaques jours. Il faut aussi prendre en compte qu'un décès, de manière assez cynique "libère" un lit en réanimation. Pour éviter de voir une amélioration de la situation lorsque le taux de mortalité augmente, nous regardons aussi le "solde vivant" en réanimation: nombre entrant - nombre sortant vivant de réanimation.

Dynamique de l'épidémie

Dans les graphiques qui suivent nous regardons sur l'axe des abscisses le nombre de personnes dans un état donné de maladie COVID. Vous retrouvez ces valeurs sur le graphique de gauche.

Au milieu, l'axe des ordonnées représente le changement de jour en jour de l'axe des abscisses, les points indique les données brutes, et la ligne les données moyennées.

A droite, ces mêmes données de l'axe des ordonnées sont normalisées pour indiquer un changement en pourcents par jour.

Chaque couleur correspond à une semaine.

def plots_maille_code(maille_active='FRA', **kwargs):
    fra = oc19_data_preproc(data, maille_active)
    plt.close()
    # plot_field_loops(fra, "deces_ehpad", center=False, maille_active=maille_active)
    plot_field_loops(fra, "hospitalises_cumul", [7], center=True, maille_active=maille_active, **kwargs)
    plot_field_loops(fra, "reanimation_cumul", [7], center=True, maille_active=maille_active, **kwargs)
    plot_field_loops(fra, "deces", center=True, maille_active=maille_active, **kwargs)
    if maille_active == "FRA":
        plt.show()
        display(Markdown(
            "Pour la France le nombre de cas peut-être analysé. Contrairement aux autres"
            + " quantités le nombre de cas est lissé sur 14 jours avec une fenêtre triangulaire."
        ))
        plot_field_loops(
            fra, "cas_confirmes", [14], center=True, maille_active=maille_active,
            win_type='triang', **kwargs
        )
    return fra
_ = plots_maille_code(maille_active='FRA')
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

Pour la France le nombre de cas peut-être analysé. Contrairement aux autres quantités le nombre de cas est lissé sur 14 jours avec une fenêtre triangulaire.

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

Il est intéressant de zoomer sur les données depuis la fin du confinement.

_ = plots_maille_code(maille_active='FRA', start_date='2020-09-01')
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

Pour la France le nombre de cas peut-être analysé. Contrairement aux autres quantités le nombre de cas est lissé sur 14 jours avec une fenêtre triangulaire.

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

Ces courbes évoluent en boucles (ou en spirale en cas de plusieurs vagues successives) :

  • Au début de l'épidémie les courbes commencent à l’origine ;
  • puis se suit une accélération rapide dans la partie supérieure du graphique ;
  • avec le confinement l'augmentation de jour en jour ralenti, cela se voit à la pente négative dès la semaine du 23 Mars ;
  • l'épidémie atteint son pic la semaine du 06 Avril ;
  • Nous voyons ensuite une réduction stable autour de 5% par jour jusqu'à la semaine du 08 Juin ;
  • La période estivale indique bien que l'épidémie n'allait pas disparaître car ne retournant pas à l’origine ;
  • depuis le 15 Août le nombre de d'hospitalisations et de réanimation s'accroit et c'est la deuxième semaine de Septembre qui semble indiqué qu'une deuxième vague a commencé.

Une deuxième vague se manifestera comme une spirale dans les graphiques au-dessus.

Dynamique en Ile de France

Ici les mêmes graphiques sont présentés pour l'île de France.

_ = plots_maille_code(maille_active='REG-11')
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
_ = plots_maille_code(maille_active='REG-11', start_date='2020-09-01')
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">

Graphes par régions

Pour chaque région les nombres de réanimation et de décès ainsi que leur dynamique sont présentées ci-dessous.

list_reg = [r for r in data["maille_code"].unique() if "REG" in r]
for reg in list_reg:
    oc19_data_preproc(data, reg)
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">