Une mise à jour de la prévision du nombre de décès dans les hôpitaux en France dus au #covid-19
La pente de la courbe diminue mais nous avons encore un nombre important de décès par jour à l'hôpital; beaucoup moins qu'au pic mais en ajoutant les ehpad ce sont de 500 à 1000 décès par jour.
On peut quand même apercevoir sur la courbe la nouvelle dynamique. Cela devrait s'améliorer encore avec le nombre d'entrées à l'hôpital qui diminue (effets dans 10-15 jours).
Après le 11 mai, c'est l'inconnu car on risque de repartir à la hausse vers la fin mai si le #déconfinement n'est pas maîtrisé suffisamment.

Mise à jour de la simulation du nombre de décès du COVID-19 en France
La mise à jour avec les chiffres du 16/04 :

Nouvelle simulation sur l'évolution du nombre de décès dus au COVID-19
Dans la suite des articles précédents, une mise à jour de la modélisation en Python des chiffres des décès liés au covid-19 en France dans les hôpitaux.
La courbe s'infléchit vers un palier qui se dessine autour des 12 000 décès dans les hôpitaux. Ce palier serait atteint au jour 34 depuis le début de la simulation (34 jours) selon le calcul prédictif (par régression polynomiale). On sera autour du 23 avril 2020. Néanmoins, le déconfinement peut faire redémarrer la courbe des décès avec un déphasage de 10 à 20 jours s'il n'est pas assez bien préparé car le taux d'immunité au virus est semble-t-il assez faible en France (moins de 10%). Donc les promiscuités dans les transports en commun, dans les écoles, dans les magasins et le non-respect de la distanciation sociale peut favoriser un redémarrage des décès en France tant que la population ne sera pas vaccinée...
Rappel du code Python
# Imports des bib
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
# données du gouvernement source https://geodes.santepubliquefrance.fr/#c=indicator&f=0&i=covid_hospit.dc&s=2020-03-31&t=a01
x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27]).reshape((-1, 1))
y = np.array([218, 327, 450, 525, 632, 860, 1100, 1388, 1696, 1995, 2314, 2606, 3024, 3523, 4032, 4503, 5091, 5532, 5889, 6494, 7091, 7632, 8044, 8598, 8943, 9253, 9588, 10129])
# x_pred les valeurs à prédire une fois le modèle créé
x_pred = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38]).reshape((-1, 1))
#Définition de la fonction polynomiale de degré 3 et transformation des données
transformer = PolynomialFeatures(degree=3, include_bias=False)
transformer.fit(x)
x_ = transformer.transform(x)
#Calcul du modèle
model = LinearRegression().fit(x_, y)
#Calcul du coefficient de détermination (le R2) ou le score
r_sq = model.score(x_, y)
print('coefficient of determination pour la France:', r_sq)
#Affiche la valeur calculée pour x=0 pour la France
print('intercept France:', model.intercept_)
# Affiche les coefficients du modèle pour la France
print('coefficients France:', model.coef_)
#calcule la prédiction pour les valeurs de la France
y_pred = model.predict(x_)
print('predicted response France:', y_pred, sep='\n')
#Transforme les données x pour la prévision: 30 j à partir du 18/03
transformer.fit(x_pred)
xx_ = transformer.transform(x_pred)
#recalcule le modèle pour la France avec 30 j
model2 = LinearRegression().fit(x_, y)
#Calcule les prédictions pour la France
y_pred2 = model.predict(xx_)
#graphique
f = plt.figure()
plt.scatter(x, y, color='red', label='Morbidité réelle du covid-19 en France')
plt.plot(x_pred, y_pred2, color='blue', label='Morbidité calculée du covid-19 en France')
fig_size = plt.rcParams["figure.figsize"]
fig_size[0] = 24
fig_size[1] = 18
plt.rcParams["figure.figsize"] = fig_size
plt.title('Evolution des décès COVID-19 (Régression polynomiale de degré 3) du 03/04/2020 pour la France')
plt.xlabel('Jour à partir,du 18/03')
plt.ylabel('Nb de décès')
leg = plt.legend();
plt.grid()
plt.show()
#exporte le graphique dans un fichier pdf
f.savefig("morb-covid.png", format='png', bbox_inches='tight')
#covid-19 #coronavirus #covid19 #covid19FR
Suivi des prédictions sur les chiffres du COVID-19
J'ai publié un article le 1er avril sur l'évolution du chiffre des décès en France dus au #covid-19.
La valeur calculée par le modèle était pour le 7 avril de 7050 victimes. Malheureusement le modèle est proche de la réalité (7091). Ce chiffre ne tient pas compte des décès en ehpad et à domicile... cela en dit long sur l'ampleur de la catastrophe surtout que contrairement à ce que certains médias ont pu dire on n'arrive pas forcément encore au pic de l'épidémie. Normalement le nombre de décès devrait être de 10 000 vers le 12 avril (chiffre hors décès en ehpad).
Rappel des chiffres officiels
Simulation des épidémies en Python
Un nouvel article un peu plus approfondi sur les modèles de diffusion d'une épidémie dans une population. Le modèle étudié est le modèle SIR qui définit trois compartiments :
- le compartiment S : la population Saine
- le compartiment I : la population infectée
- le compartiment R : la population remise (celle qui a été infectée mais est immunisée ou décédée)
Avant d'étudier plus avant le modèle, voyons des chiffres réels. Lorsqu'on étudie les chiffres d'incidence de la grippe saisonnière, on obtient ce genre de courbe typique des infections virales :

L'épidémie se propage et disparaît en 90 jours à peu près. Un pic assez sévère intervient au plus fort de l'épidémie qui cause environ 10000 décès en France chaque année. On ne peut rester confiné 14 semaines par an donc la pente de la courbe dans la phase croissante est élevée.
Intéressons-nous maintenant au modèle SIR. Il a été formalisé en 1927 par Soper, Kermack et MCKendrick[1]
Le modèle comprend trois équations différentielles pour modéliser l'évolution temporelle des compartiments S, I et R :
le coefficient est le taux d'incidence de l'épidémie.
Le coefficient est le taux de guérison.
Si je résous ces équations, j'obtiens l'évolution de l'épidémie.
La courbe suivante monter un graphe généré par une simulation SIR avec :
- S0 = 60 000 000
- I0 = 1000
- R0 = 0
-
- = 1/7

La courbe en rouge montre la population infectée. On note un pic important de 2,5 millions de personnes infectées dans cette simulation.
Si on regarde les décès en fixant le taux de mortalité à 0,5% :

On retrouve le type de courbes des articles précédent pour le covid-19. La France est encore dans la partie où la pente est importante.
Maintenant venons-en au code pour résoudre le modèle SIR et construire ces courbes. Vous pourrez modifier les valeurs initiales et les taux pour produire vos propres courbes.
Si vous n'avez pas d'outils python, vous pouvez aller sur notebooks.azure.com et renseigner votre compte Microsoft. Vous pourrez travailler en Python sans rien installer.
#import des bib
import numpy as np
from scipy.integrate import odeint
import matplotlib.pyplot as plt
# Population totale, N.
N = 60000000
# Nombre initial de sujets infectés et sauvés (immunisés, guéris, décédés).
I0, R0 = 1000, 0
# Tous les autres sont susceptibles d'être touchés.
S0 = N - I0 - R0
# beta le taux de contact et et gamma le taux de rétablissement moyen (en 1/jours).
beta, gamma = 0.6, 1.0/7.0
# la grille de temps pour le graphique (en jours)
t = np.linspace(0, 90, 90)
# Les équations différentielles du modèle SIR.
def deriv(y, t, N, beta, gamma):
S, I, R = y
dSdt = -beta * S * I / N
dIdt = beta * S * I / N - gamma * I
dRdt = gamma * I
return dSdt, dIdt, dRdt
# vecteur initial
y0 = S0, I0, R0
# Lance l'intégration des équations différentielles
ret = odeint(deriv, y0, t, args=(N, beta, gamma))
S, I, R = ret.T
#on calcule le total des décès sur la base du taux de mortalité
D = np.cumsum(I*0.005)
# Trace les courbes
fig = plt.figure(facecolor='w')
fig_size = plt.rcParams["figure.figsize"]
fig_size[0] = 48
fig_size[1] = 32
plt.rcParams["figure.figsize"] = fig_size
plt.title('Simulation SIR ')
plt.plot(t, S, color='blue', label='Sains')
plt.plot(t, I, color='red', label='Infectés')
plt.plot(t, R, color='green', label='Remis')
plt.xlabel('Nb de jours')
plt.ylabel('personnes en dizaine de millions')
leg = plt.legend();
plt.grid()
plt.show()
Comparatif de l'évolution du nombre de décès COVID-19 en France et en Allemagne et calculs prédictifs sur 30 jours
Le but de cet article n'est pas de polémiquer mais d'avertir les dirigeants et les décideurs qu'en situation épidémique, les décisions prises en amont peuvent avoir de grandes conséquences et que ces conséquences peuvent être terribles comme le montrent les chiffres publiés par certains gouvernements. L'OMS a averti très tôt qu'il fallait agir fort et vite mais peu de pays ont entendu ce message.
Le graphique plus bas compare l'évolution du nombre total des décès liés au covid-19 depuis le 18 mars. L'axe des abscisses correspond au nombre de jours depuis le 18 mars.
Les données sont celles fournies par les deux gouvernements.
La modélisation est très simple et est basée sur une régression polynomiale. Pour les puristes, la modélisation a été faite en Python3 (voir article précédent avec le code source pour le calcul de la France). Bien entendu la courbe calculée tend vers l'infini mais tant que nous n'approchons pas du pic de l'épidémie, cette courbe des décès va continuer à croître fortement. Près du pic, la pente de la courbe devrait ralentir (la dérivée diminue) et devenir nulle. Nous n'en sommes pas là...
Vers la fin février et le début mars, la France et l'Allemagne n'ont pas réagi de la même façon vis-à-vis des données remontées par les scientifiques. L'Allemagne est dirigée par une scientifique (Angela Merkel est physicienne).
Maintenant les courbes :
Les points représentent les chiffres officiels pour les deux pays. Les courbes représentent les valeurs calculées par le modèle polynomial.
Si la tendance reste la même et si on ne s'approche pas trop du pic, les 10 000 décès seront atteints en France vers le 10 avril prochain. En Allemagne, il y aura donc à la même date autour de 2700 décès.
D'après les spécialistes, le pic pourrait être atteint en France un peu après le 15 avril car les effets du confinement vont bientôt porter leurs fruits. Les courbes sur le graphique devraient alors s’aplatir progressivement.
On voit clairement que les pentes de courbes françaises et allemandes sont bien différentes et que ce sont, en partie car il y a également des différences structurelles, les décisions de février des deux gouvernements qui ont généré les effets actuels.
L'incidence des cas dans une épidémie a été modélisée depuis des années et suis une courbe bien connue. La pente (la dérivée de la courbe au plus fort de l'épidémie) dépend en gros de deux facteurs (le r0 et le nombre de contacts que l'on a par unité de temps). Le r0 correspond au nombre de personnes infectées par une personne infectée.
Pour aller plus loin, vous pouvez consulter les articles quelquefois un peu difficiles sur la modélisation des épidémies avec le modèle SIR :
https://interstices.info/modeliser-la-propagation-dune-epidemie/
http://www.math.ens.fr/enseignement/telecharger_fichier.php?fichier=1693
http://www.cmap.polytechnique.fr/~anr-manege/Aussois2013/Bakari.pdf
MAJ avec les chiffres du 03/04/2020
R2 = 0,9992 donc un très bon résultat du modèle.

MAJ : avec les chiffres du 01/04/2020
On est toujours dans une tendance 10 000 décès le 10/04/2020.

Évaluation de l'évolution du nombre de décès COVID-19 en python par une régression polynomiale
Ce travail a été réalisé en python 3 avec Anaconda et Jupyter. Si ces termes ne vous disent rien alors c'est peut-être mieux d'aller voir quelques tutos sur python et Anaconda:
https://docs.anaconda.com/anaconda/user-guide/getting-started/
Les estimations ont été faites à partir des chiffres du gouvernement publiés ici :
https://geodes.santepubliquefrance.fr/#c=indicator&f=0&i=covid_hospit.dc&s=2020-03-31&t=a01
Voilà le graphique final:

Nous obtenons donc un modèle polynomiale de degré 3 représentant l'évolution du nombre de décès en France depuis le 18/03/2020 (modèle créé à partir de 14 points et extrapolé pour 30).
Cette courbe montre également qu'il y aura environ 10 000 morts dans une dizaine de jours (autour du 10/04) donc ce qui est conforme avec les données de l'Italie qui suivent la même tendance que celles de la France (nous sommes déphasés parfaitement de 9-10 jours avec l'Italie sur le nombre de décès dus au COVID-19).
Le programme Python pour calculer le modèle et créer le graphique est le suivant :
# Imports des bib
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import PolynomialFeatures
from sklearn.linear_model import LinearRegression
# données du gouvernement source https://geodes.santepubliquefrance.fr/#c=indicator&f=0&i=covid_hospit.dc&s=2020-03-31&t=a01
x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]).reshape((-1, 1))
y = np.array([218, 327, 450, 525, 632, 860, 1100, 1388, 1696, 1995, 2314, 2606, 3024, 3523])
# x_pred les valeurs à prédire une fois le modèle créé
x_pred = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]).reshape((-1, 1))
#Définition de la fonction polynomiale de degré 3 et transformation des données
transformer = PolynomialFeatures(degree=3, include_bias=False)
transformer.fit(x)
x_ = transformer.transform(x)
#Calcul du modèle
model = LinearRegression().fit(x_, y)
#Calcul du coefficient de détermination (le R2) ou le score
r_sq = model.score(x_, y)
print('coefficient of determination:', r_sq)
#Affiche la valeur calculée pour x=0
print('intercept:', model.intercept_)
# Afiiche les coefficients du modèle
print('coefficients:', model.coef_)
#calcule la prédiction pour les valeurs
y_pred = model.predict(x_)
print('predicted response:', y_pred, sep='\n')
#Transforme les données x pour la prévision: 30 j à partir du 18/03
transformer.fit(x_pred)
xx_ = transformer.transform(x_pred)
#recalcule le modèle
model2 = LinearRegression().fit(x_, y)
#Calcule les prédictions et les affiche
y_pred2 = model.predict(xx_)
print('predicted response:', y_pred2, sep='\n')
print('real response:', y, sep='\n')
#graphique
f = plt.figure()
plt.scatter(x, y, color='red')
plt.plot(x_pred, y_pred2, color='blue')
fig_size = plt.rcParams["figure.figsize"]
fig_size[0] = 24
fig_size[1] = 18
plt.rcParams["figure.figsize"] = fig_size
plt.title('Evolution des décès COVID-19 (Régression polynomiale de degré 3) du 01/04/2020')
plt.xlabel('Jour à partir,du 18/03')
plt.ylabel('Nb de décès')
plt.grid()
plt.show()
#exporte le graphique dans un fichier pdf
f.savefig("morb-covid.pdf", bbox_inches='tight')
Bonne lecture