Mathématiques et épidémie

La modélisation mathématique des épidémies est un sujet largement d’actualité ! Pierre Carriquiry nous propose cette fois-ci une modélisation aléatoire reposant sur des lois binomiales et pouvant donner lieu à des simulations Python.

Pierre Carriquiry

© APMEP Juin 2022

⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅♦⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅

Introduction

L’épidémie de Covid 19 a produit un nombre considérable de résultats statistiques et montré la difficulté de prévoir ces résultats. La plupart des prévisions sont établies à partir de modèles mathématiques permettant d’écrire des programmes informatiques qui décrivent une évolution de la maladie correspondant aux hypothèses du modèle. Cet article présente un modèle mathématique et un programme Python qui simulent une épidémie. Le modèle et le programme peuvent être compris, critiqués et perfectionnés par un élève de Terminale qui a choisi la spécialité Mathématiques.

Modèle mathématique

Population :

on étudie la propagation d’une maladie dans une population de \(N\) individus qui est la réunion de trois sous-ensembles disjoints : les malades, les immunisés qui ne peuvent pas (ou plus) attraper la maladie et les individus non malades et non immunisés que l’on désignera improprement par individus sains.

Pour chaque jour \(j\), on note : \(M(j)\) le nombre de malades le jour \(j\), \(I(j)\) le nombre d’immunisés le jour \(j\), \(S(j)\) le nombre d’individus sains le jour \(j\). On suppose que la maladie n’est pas mortelle, que sa durée, notée \(dm\), est fixe et que tous les malades guérissent et deviennent immunisés au bout de \(dm\) jours. On suppose aussi que la population totale ne varie pas. On a donc : \[M(j)+I(j)+S(j)=N.\]

Évolution de l’épidémie :

chaque jour, chaque malade rencontre un certain nombre d’individus. On suppose que la rencontre d’un malade avec un autre malade ou avec un individu immunisé n’a aucune influence sur la propagation de l’épidémie et qu’un malade peut transmettre la maladie à un individu sain qu’il rencontre. On note \(p\) la probabilité qu’un malade transmette la maladie à un individu sain qu’il rencontre. On dira qu’une rencontre entre un malade et un individu sain est contaminante si elle provoque l’apparition de la maladie chez l’individu sain rencontré et qu’il suffit d’une seule rencontre contaminante pour provoquer la maladie.

Variables :

à chaque malade, on associe trois variables aléatoires.

  1. Nombre de rencontres : on note \(R\) la variable aléatoire représentant le nombre de rencontres d’un malade dans une journée. Un malade pouvant rencontrer plusieurs fois le même individu dans une journée, \(R\) peut être supérieur au nombre d’individus rencontrés. On suppose que la loi de probabilité de \(R\) est la même pour tous les malades pendant toute la durée de l’épidémie et que si un malade effectue \(r\) rencontres, ces rencontres se font au hasard et avec remise parmi \(N-1\) individus. Ces hypothèses sont assez éloignées de la réalité sauf peut-être pour des individus solitaires comme les ours.

  2. Nombre de rencontres parmi les individus sains : on note \(RS\) la variable aléatoire représentant le nombre de rencontres d’un malade parmi les individus sains dans une journée (qui peut être supérieur au nombre d’individus sains rencontrés). Il y a \(S(j)\) individus sains parmi \(N-1\) rencontres possibles donc pour chaque valeur \(r\) de la variable \(R\), la variable \(RS\) suit la loi binomiale de paramètres \(r\) et \(\dfrac{S(j)}{N-1}\cdotp\)

  3. Nombre de rencontres contaminantes : on note \(RC\) la variable aléatoire représentant le nombre de rencontres contaminantes d’un malade dans une journée (qui peut être supérieur au nombre d’individus contaminés). La probabilité de contamination étant \(p\), pour chaque valeur \(rs\) de la variable \(RS\), la variable \(RC\) suit la loi binomiale de paramètres \(rs\) et \(p\).

Formules :

on veut exprimer \(M(j)\), \(I(j)\) et \(S(j)\) en fonction de \(M(j-1)\), \(I(j-1)\) et \(S(j-1)\). Pour cela, on doit évaluer le nombre d’individus contaminés le jour \(j\) qui est une variable aléatoire notée \(C(j)\) dont on va déterminer la loi de probabilité. Chaque jour, chaque individu sain peut être victime ou non d’au moins une rencontre contaminante. On note \(pc\) la probabilité qu’un individu sain particulier attrape la maladie, c’est-à-dire qu’il soit victime d’au moins une rencontre contaminante. On note \(nbc\) le nombre total de rencontres contaminantes effectuées par tous les malades le jour \(j\). La probabilité qu’un individu sain particulier soit victime d’une contamination particulière est \(\dfrac{1}{S(j)}\), la probabilité qu’il ne soit pas victime de cette contamination est \(1-\dfrac{1}{S(j)}\), la probabilité qu’aucune de ces \(nbc\) contaminations ne l’ait touché est \(\left(1-\dfrac{1}{S(j)}\right)^{nbc}\) et la probabilité qu’il soit contaminé le jour \(j\) est donc : \[pc = 1-\left(1-\frac{1}{S(j)}\right)^{nbc}\cdotp\] La variable aléatoire \(C(j)\) suit donc la loi binomiale de paramètres \(S(j)\) et \(pc\) car, par hypothèse, toutes les contaminations sont indépendantes. Alors le nombre de malades qui guérissent le jour \(j\), noté \(G(j)\), est égal au nombre d’individus qui ont été contaminés \(dm\) jours auparavant. On a donc : \(G(j)=C(j-dm)\) si \(j\geqslant dm\), \(0\) sinon.

On fait les hypothèses suivantes sur l’état d’un individu le jour \(j\) (malade, sain ou immunisé) en fonction de son état le jour \(j-1\) :

  • un individu malade le jour \(j\) est malade ou immunisé le jour \(j+1\) ;

  • un individu sain le jour \(j\) reste sain ou est malade le jour \(j+1\) ;

  • un individu immunisé le jour \(j\) reste immunisé le jour \(j+1\).

On peut alors écrire les formules décrivant l’évolution de l’épidémie : \[\begin{aligned} M(j)&= M(j-1)+C(j)-G(j)\\ I(j)&= I(j-1)+G(j)\\ S(j)&= S(j-1)-C(j).\end{aligned}\] On remarque que la population totale reste constante.

Ces formules et la simulation des variables aléatoires permettent d’écrire un programme Python de simulation d’une épidémie.

Programme Python

from lycee import *
from math import *
def bino(n,p) :#donne une valeur d’une variable binomiale de paramètres n et p#
    k=0
    for i in range(n) : 
        if random()<p : 
            k=k+1
    return k
N=670000 ; p=0.15 ; nbj=90 ; minr=2 ; maxr=8 ; dm=7 ; nbm=1
M=[0 for i in range(nbj)] #nombre de malades#
I=[0 for i in range(nbj)] #nombre d’immunisés#
S=[0 for i in range(nbj)] #nombre d’individus sains#
C=[0 for i in range(nbj)] #nombre d’individus contaminés#
DM=[0 for i in range(dm+1)] #nombre de malades depuis i jours#
M[0]=nbm ; S[0]=N-nbm ; DM[0]=nbm ; C[0]=nbm
for j in range(1,nbj) : #numéro du jour#
    nbc=0 # compteur du nombre de contaminations#
    for m in range(M[j-1]) : # indice du malade#
        R=randint(minr,maxr) #nombre de rencontres du malade m le jour j#
        RS=bino(R,S[j-1]/(N-1)) #nombre de rencontres parmi les sains#
        RC=bino(RS,p) #nombre de rencontres contaminantes#
        nbc=nbc+RC #totalisation du nombre de contaminations#
    pc=1-((S[j-1]-1)/S[j-1])**nbc ; #proba de contamination#
    C[j]=bino(S[j-1],pc)  ; #nombre de contaminés le jour j#
    for i in range(dm,0,-1) : #mise à jour liste des durées maladie#
        DM[i]=DM[i-1]
    DM[0]=C[j]  ; #nombre de nouveaux malades#
    M[j]=M[j-1]+C[j]-DM[dm]
    I[j]=I[j-1]+DM[dm]
    S[j]=N-M[j]-I[j]
    if I[j]>=N or M[j]>=N or S[j]<=0 or M[j]<=0 :#test de fin de l’épidémie#
        print(’épidémie terminée :’)
        print(’jour’,j,’malades’,M[j],’immunisés’,I[j],’non contaminés’,S[j])
        break #sortie boucle j#
else :#sortie boucle j dernier jour#
    print(’épidémie non terminée’)
    print(’jour’,j,’malades’,M[j],’immunisés’,I[j],’non contaminés’,S[j])
repere.clf() #construction du graphique#
repere.axis([0,nbj,0,N])
titre=’p=’+str(p)+’ maxr=’+str(maxr)+’ dm=’+str(dm)
repere.title(titre)
repere.xlabel(’nombre de jours’)
repere.ylabel(’nombre de malades’)
repere.plot(range(nbj),M)
repere.show()
Données :

\(N\) : effectif de la population ;
\(p\) : probabilité qu’un malade contamine un individu sain qu’il rencontre ;
\(\text{minr}\), \(\text{maxr}\) : minimum et maximum du nombre de rencontres d’un malade dans une journée ;
\(dm\) : durée de la maladie en jours ;
\(nbm\) : nombre de malades initial ;
\(nbj\) : nombre de jours d’observation de l’épidémie.

Variables :

\(RS\) : nombre de rencontres d’un malade parmi les individus sains.
\(RC\) : nombre de rencontres contaminantes d’un malade.
\(M[j]\) : élément de la liste \(M\) donnant le nombre de malades le jour \(j\).
\(I[j]\) : nombre total d’individus immunisés le jour \(j\).
\(S[j]\) : nombre d’individus non malades et non immunisés le jour \(j\).

\(DM[i]\) : nombre d’individus malades depuis \(i\) jours. On a \(DM[0]=nbm\).

Déroulement du programme :

chaque jour \(j\), pour chaque malade, on calcule une valeur des variables \(R\), \(RS\), \(RC\) et on totalise le nombre de contaminations de chaque malade dans le compteur \(nbc\) ce qui permet de calculer la probabilité \(pc\) qu’un individu sain soit contaminé, puis le nombre d’individus qui tombent malade le jour \(j\), \(C[j]\).

On met à jour la liste \(DM\) par un décalage à droite et par l’instruction \(DM[0]=C[j]\), puis les listes \(M\), \(I\) et \(S\) en utilisant les formules du paragraphe précédent.

Arrêt du programme :

le programme s’arrête quand il n’y a plus de malades ou quand tous les individus sont immunisés ou quand tous les individus sont malades ou quand le nombre de jours d’observation est atteint.

Résultats :

on peut afficher les listes \(M\), \(I\), \(S\), \(C\) et obtenir des graphiques correspondants.

Par exemple le graphique suivant donne l’évolution du nombre de malades dans une population de 670 000 individus, à partir d’un seul malade, pour les valeurs des paramètres indiquées sur le graphique ou dans le programme.

 

On remarque (voir aussi les représentations graphiques ci-dessous) que dans la plupart des cas, si l’épidémie démarre, la courbe représentative du nombre de malades ressemble à une courbe de Gauss. Le modèle théorique nous pose alors des problèmes théoriques, par exemple :

  • pour quelles valeurs des paramètres l’épidémie démarre-t-elle ?

  • pour quelles valeurs des paramètres obtient-on une courbe de Gauss et dans ce cas, peut-on déterminer le pic de l’épidémie ?

  • peut-on obtenir une épidémie comportant deux ou plusieurs vagues ?

Le programme peut être perfectionné, par exemple pour simuler une épidémie mortelle on pourrait introduire des probabilités de décès à chaque phase de la maladie ; la population totale ne serait plus alors constante. Pour simuler l’apparition de variants, il faudrait définir des probabilités de contamination à différentes périodes de l’épidémie.

L’influence de la contagiosité d’un virus qui se traduit dans le modèle mathématique par la valeur du paramètre \(p\), peut être observée en donnant à \(p\) deux valeurs très différentes. Les graphiques suivants donnent l’évolution du nombre de malades pour les valeurs \(p={0,99}\) et \(p={0,05}\).

 

 

On voit que la durée de l’épidémie est plus longue dans le deuxième cas et dépasse le nombre de jours d’observation prévu.

Les lecteurs qui voudraient «vérifier» ces résultats ne doivent pas s’étonner de ne pas trouver exactement les mêmes valeurs ; cela prouve que les logiciels de simulation de variables aléatoires de Python sont corrects : deux exécutions successives du programme avec les mêmes paramètres ne donnent pas le même résultat.

Conclusion

Ce programme n’a pas la prétention de décrire une épidémie réelle car les rencontres d’un malade ne se font pas par tirage au sort et, même dans ce cas, il faudrait connaître la loi de probabilité du nombre de rencontres et la probabilité de contamination. Ces paramètres ne sont pas connus avant l’apparition de la maladie, et même après la détection du premier cas, ils sont difficiles à évaluer surtout s’il y a des malades asymptomatiques. Cependant, en observant les résultats du programme pour plusieurs valeurs des paramètres, on peut avoir une idée de l’évolution de la maladie lorsque l’on modifie un paramètre, par exemple quelle est l’influence sur l’épidémie d’un confinement qui se traduit dans le modèle par une diminution du nombre de rencontres. Dans le graphique suivant, on peut voir l’évolution du nombre de malades pour la valeur \(\text{maxr}=4\), les valeurs des autres paramètres étant celles du premier graphique :

On peut aussi penser intuitivement que, pour une même valeur des paramètres, le nombre de malades est plus élevé dans le modèle théorique que dans la réalité où la plupart des rencontres se font dans un groupe limité d’individus. Ce modèle théorique donnerait alors une limite supérieure du nombre de malades mais les paradoxes du calcul des probabilités nous ont montré que l’intuition peut nous tromper dans ce domaine.

⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅♦⋅⋅⋅⋅⋅⋅⋅⋅⋅⋅

Pierre Carriquiry est aujourd’hui à la retraite ; il a enseigné à l’École Nationale de Commerce. Il est membre de l’APMEP depuis 35 ans.

Pour citer cet article : Carriquiry P., « Mathématiques et épidémie », in APMEP Au fil des maths. N° 544. 30 janvier 2023, https://afdm.apmep.fr/rubriques/ouvertures/mathematiques-et-epidemie/.


Une réflexion sur « Mathématiques et épidémie »

Les commentaires sont fermés.