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