L’épidémie de Covid-19 a touché l’ile Maurice en ce début d’année.
Je vais essayer de prédire le jour où le peak de l’épidémie sera atteint à l’aide de mes connaissances en Python et Machine Learning.
Je vais utiliser le modèle Logistique. Je ne veux pas utiliser le modèle Exponentiel pour des raisons …évidentes.
Je vais utiliser les librairies numpy et pandas.
numpy est une librairie utilisé pour le calcul scientifique.
pandas est une librairie qui est construit sur numpy, et elle fournit du calcul haute performance, des structures de données faciles à utiliser et des outils d’aide à l’analyse de de données.
Pour commencer, importons les librairies.
import pandas as pd
import numpy as np
from datetime import datetime,timedelta
from sklearn.metrics import mean_squared_error
from scipy.optimize import curve_fit
from scipy.optimize import fsolve
import matplotlib.pyplot as plt
Préparation des données
J’ai récupéré un google sheet qui recense les cas de covid-19 tous les jours. Je partage le fichier au format csv avec google sheets. Je vais ensuite le mettre dans un dataframe.
url = "https://docs.google.com/spreadsheets/d/e/2PACX-1vRG9SHNzCmx72RXRoz4BisAwawIdRWSzq43b09dBQYagYlW0FZjqSuwjDbJ0z0b129xLi_E0t_pqA1J/pub?gid=717908023&single=true&output=csv"
df = pd.read_csv(url)
Visualisation des données
df

Les colonnes qui m’intéressent sont le Timestamp et le cum_new ( nombre de cas positifs cumulés )
df = df.loc[:,['Timestamp','cum_new']]
Je formate la date correctement, pour pouvoir calculer le nombre de jours depuis le 1er janvier 2020.
FMT = '%m-%d-%Y %H:%M:%S'
date = df['Timestamp']
df['Timestamp'] = date.map(lambda x : (datetime.strptime(x, FMT) - datetime.strptime("01-01-2020 00:00:00", FMT)).days)

Le modèle logistique.
Le modèle logistique a été largement utilisé pour décrire la croissance d’une population. Une infection peut être décrite comme la croissance de la population d’un agent pathogène, donc un modèle logistique semble raisonnable. Cette formule est très connue des spécialistes des données car elle est utilisée dans le classificateur de régression logistique et comme fonction d’activation des réseaux de neurones. L’expression la plus générique d’une fonction logistique est:

Dans cette formule, nous avons la variable x qui correspond au temps et trois paramètres a,b,c
a est la vitesse de l’infection
b est le jour où est survenu le nombre maximal d’infections.
c est le nombre total des personnes infectés à la date de fin de l’épidémie.
Aux valeurs maximales, le nombre de personnes infectés se rapproche de plus en plus de c, et c’est le point où on peut dire que l’infection est terminé. La fonction a aussi un point d’inflexion à b, qui est le point où la dérivée première commence à décroitre, c’est à dire, le pic après que l’infection commence à devenir moins aggressive et le nombre de nouveaux cas commence à diminuer.
On le définit donc
def logistic_model(x,a,b,c):
return c/(1+np.exp(-(x-b)/a))
On peut utiliser le curve_fit, une fonction qui est contenue dans la librairie scipy, pour estimer les paramètres et les erreurs à partir des données sources.
x = list(df.iloc[:,0])
y = list(df.iloc[:,1])
fit = curve_fit(logistic_model,x,y,p0=[2,120,1000])
Voici le résultat

Voici les valeurs
a : 1.46
b : 81.06
c : 53.83
La fonction retourne aussi la matrice de covariance, donc les diagonaux correspondent aux variances des paramètres. En prenant les racines carrés, on peut calculer les erreurs standards.
errors = [np.sqrt(fit[1][i][i]) for i in [0,1,2]]
errors
[0.2881514331099414, 0.6209485659619303, 9.227239886449258]
Erreur standard de a : 0.29
Erreur standard de b : 0.62
Erreur standard de c: 9.23
a = fit[0][0]
b = fit[0][1]
c = fit[0][2]
Ces chiffres nous donnent des informations intéressantes.
Le nombre estimé de cas positifs à la date de fin de l’infection est de 54 +- 9.
Le nombre maximal de nouvelles infections par jour est déjà passée, et c’était il y a 2 jours, 23 mars, où on est passé de 14 cas à 28 cas ! ( tout ceci est bien sur à prendre avec beaucoup de précautions !. Les conditions sur le terrain risquent de changer.)
sol = int(fsolve(lambda x : logistic_model(x,a,b,c) - int(c),b))
Le pic de l’épidémie, c’est dans 4 jours, soit le 28 Mars 2020.
pred_x = list(range(max(x),sol))
plt.rcParams['figure.figsize'] = [7, 7]
plt.rc('font', size=14)
Données réels
plt.scatter(x,y,label="Données réels",color="red")
La courbe logistique prédite
plt.plot(x+pred_x, [logistic_model(i,fit[0][0],fit[0][1],fit[0][2]) for i in x+pred_x], label="Modèle logistique" )
plt.legend()
plt.xlabel("Données depuis le premier Janvier 2020")
plt.ylabel("Nombre total de personnes infectés")
plt.ylim((min(y)0.9,c1.1))
plt.show()

Conclusion : En utilisant cette modélisation, si le confinement maximal est appliqué 1 semaine et que toute le monde le respecte ( cas idéale ), si le gouvernement continue à fournir un effort considérable dans le dépistage à travers le ’Contact Tracing’ (plus le nombre de dépistages augmente, le mieux), que les personnels soignants et des services essentielles sont équipés d’équipements de protection adéquat et que les personnes positives sont isolés, l’épidémie pourra être maitrisé d’ici FIN MARS.