Overblog
Suivre ce blog Administration + Créer mon blog

Articles récents

Suivi des prédictions sur les chiffres du COVID-19

8 Avril 2020 , Rédigé par Hugues MEUNIER

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

https://geodes.santepubliquefrance.fr/#c=indicator&f=0&i=covid_hospit.dc&s=2020-03-31&t=a01&view=map2

Lire l'article d'origine

 

Lire la suite

Simulation des épidémies en Python

6 Avril 2020 , Rédigé par Hugues MEUNIER

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

β = 0,6

α= 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()

 

 

Lire la suite

Comparatif de l'évolution du nombre de décès COVID-19 en France et en Allemagne et calculs prédictifs sur 30 jours

3 Avril 2020 , Rédigé par Hugues MEUNIER

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 :

Comparatif de l'évolution du nombre de décès COVID-19 en France et en Allemagne et calculs prédictifs sur 30 jours

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

Lire la suite

MAJ avec les chiffres du 03/04/2020

3 Avril 2020 , Rédigé par Hugues MEUNIER

R2 = 0,9992 donc un très bon résultat du modèle.

 

Lire la suite

MAJ : avec les chiffres du 01/04/2020

2 Avril 2020 , Rédigé par Hugues MEUNIER

On est toujours dans une tendance 10 000 décès le 10/04/2020. 

 

Lire la suite

Évaluation de l'évolution du nombre de décès COVID-19 en python par une régression polynomiale

1 Avril 2020 , Rédigé par Hugues MEUNIER

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

Lire la suite

Créer un swap sur linux

17 Août 2019 , Rédigé par Hugues MEUNIER

Quelquefois sous docker, on récupère une erreur out of memory (137) su le build ou le run de conteneurs. Dans le cloud, les VMs avec beaucoup de mémoire coûtent cher...

Il est possible de créer un espace disque swap qui permettra d'augmenter l'espace mémoire utilisatble par docker ou d'autres programmes:

# Vérifier au préalable que vous n'avez pas de swap

sudo swapon -s

# Allouer 4GB  à /swapfile

sudo fallocate -l 4G /swapfile

# Restreindre les droits

sudo chmod 600 /swapfile

ls -lh /swapfile

# Activer le swap

sudo mkswap /swapfile

sudo swapon /swapfile

# Vérifier que la mémoire a augmenté!

free -m

sudo swapon -s

 # Configurer fstab pour utiliser le swap après chaque démarrage

sudo nano /etc/fstab

 # ajouter cette ligne dans /etc/fstab, sauvegarder and sorter (Ctrl X)

/swapfile   none    swap    sw    0   0

 # Changer le seuil mémoire d'utilisation du swap, ainsi le swap est utilisé uniquement quand  10% de la RAM n'est pas utilisé

echo 10 | sudo tee /proc/sys/vm/swappiness

echo vm.swappiness = 10 | sudo tee -a /etc/sysctl.conf

Lire la suite
Lire la suite

Sigfox et la biodiversité

30 Décembre 2018 , Rédigé par Hugues MEUNIER

Je suis fan des solutions IOT basées sur SIGFOX qui est une société française basée à Toulouse et qui est devenue la référence mondiale dans le monde des IOT (cocorico!!).

Ci-dessous un article de l'usinenouvelle sur une application des objets connectés SIGFOX :

https://www.usinenouvelle.com/editorial/quand-les-technologies-de-sigfox-volent-au-secours-de-la-biodiversite.N787194

 

Lire la suite

On l'attendait depuis longtemps : 25 $ en vente dès aujourd'hui !

16 Novembre 2018 , Rédigé par Hugues MEUNIER

Le pi 3A+ est ici :

https://www.raspberrypi.org/products/raspberry-pi-3-model-a-plus/

 

Lire la suite
<< < 1 2 3 4 5 6 7 8 9 10 20 > >>