Terminale · F2
terminale
Aller plus loin · Recit

Le pic est passé

Pourquoi l'inflexion tombe à mi-hauteur et nulle part ailleurs, et ce qui arrive au détecteur de l'Atelier quand on le lâche sur les vraies données hospitalières de mars 2020.

Le paragraphe 5 du cours a traduit une phrase de journal télévisé en énoncé de mathématiques : l’inflexion du cumul est le pic du quotidien. L’exercice 22 de l’Atelier l’a démontré sur la courbe épidémique du cours, et l’exercice 31 a programmé un détecteur. Il reste deux choses à faire, et elles sont ici. D’abord comprendre pourquoi l’inflexion tombe à mi-hauteur, et pas à un endroit quelconque. Ensuite lâcher le détecteur sur de vraies données, et regarder ce qui se passe.

Pourquoi la mi-hauteur, et pas ailleurs

Le cours travaillait avec des nombres concrets. Prenons le cas général, avec un palier K>0K > 0, un taux r>0r > 0 et une constante A>1A > 1 :

t0,N(t)=K1+Aert.\forall t \geqslant 0, \quad N(t) = \frac{K}{1 + A\,\mathrm{e}^{-rt}}.

Le calcul suit exactement le chemin de l’exercice 22, et il ne demande aucun logarithme. Posons u(t)=Aertu(t) = A\,\mathrm{e}^{-rt}. La fonction uu est dérivable et strictement positive sur [0;+[[0\,;+\infty[, avec u=ruu' = -r\,u, et N=K1+uN = \frac{K}{1+u}. En dérivant ce quotient dont le dénominateur ne s’annule pas :

t0,N(t)=rKu(t)(1+u(t))2  >0,\forall t \geqslant 0, \quad N'(t) = \frac{r\,K\,u(t)}{\bigl(1 + u(t)\bigr)^{2}} \; > 0,

puis, en dérivant à nouveau ce produit dont le second facteur est une composée :

t0,N(t)=r2Ku(t)(u(t)1)(1+u(t))3.\forall t \geqslant 0, \quad N''(t) = \frac{r^{2}\,K\,u(t)\,\bigl(u(t) - 1\bigr)}{\bigl(1 + u(t)\bigr)^{3}}.

Tout est là. Comme K>0K > 0, u>0u > 0 et (1+u)3>0(1+u)^{3} > 0, le signe de NN'' est exactement celui de u(t)1u(t) - 1. Or u(0)=A>1u(0) = A > 1, et uu est strictement décroissante de AA vers 00 : elle franchit donc la valeur 11 une fois et une seule, et NN'' s’y annule en changeant de signe. Il y a un point d’inflexion, et un seul.

C’est ici que la condition A>1A > 1 gagne son salaire, et il vaut la peine de s’y arrêter. Si l’on avait A1A \leqslant 1, alors u(t)u(0)=A1u(t) \leqslant u(0) = A \leqslant 1 pour tout t0t \geqslant 0, la dérivée seconde resterait négative ou nulle sur tout l’intervalle, et la courbe serait concave de bout en bout, sans aucune inflexion. Concrètement, A>1A > 1 signifie qu’on démarre en dessous de la mi-hauteur : une épidémie observée depuis son début. Si l’on branche les capteurs après le pic, il n’y a plus de basculement à trouver, et c’est mathématiquement visible dès l’énoncé.

Reste à voir où il tombe. Au moment du basculement, u(t)=1u(t^{*}) = 1, donc

N(t)=K1+1= K2 N(t^{*}) = \frac{K}{1 + 1} = \boxed{\ \frac{K}{2}\ }

La mi-hauteur n’est pas une coïncidence de l’exemple du cours : c’est une propriété de toutes les courbes logistiques observées depuis leur début, quels que soient K>0K > 0, r>0r > 0 et A>1A > 1. Et la valeur du pic quotidien se lit dans la foulée, en reportant u(t)=1u(t^{*}) = 1 dans NN' :

N(t)=rK×1(1+1)2=rK4.N'(t^{*}) = \frac{r\,K \times 1}{(1+1)^{2}} = \frac{r\,K}{4}.

Sur les données du cours (K=1000K = 1000, r=0,6r = 0{,}6), cela donne 150150 cas par jour au sommet, exactement la valeur portée sur la figure. Notez ce qui n’a jamais été nécessaire : résoudre en tt. La date tt^{*}, elle, exigerait un logarithme, et attendra le chapitre F3. Le se démontre sans lui ; seul le quand le réclame.

Le détecteur, lâché sur mars 2020

Voici le détecteur de l’exercice 31, à la virgule près. Pour une liste de valeurs cumulées, les différences premières approchent la dérivée, et les différences des différences approchent la dérivée seconde.

def detecte_bascule(N):
    d1 = [N[j+1] - N[j] for j in range(len(N) - 1)]
    d2 = [d1[j+1] - d1[j] for j in range(len(d1) - 1)]
    for j in range(len(d2) - 1):
        if d2[j] > 0 and d2[j+1] < 0:
            return j + 2
    return None

Les données : les admissions hospitalières quotidiennes pour COVID-19 en France, publiées par Santé publique France sur data.gouv.fr. On agrège les départements, on somme jour après jour pour obtenir le cumul national, et l’on commence le 19 mars 2020, premier jour de la série.

import csv, collections

quotidien = collections.Counter()
with open("covid-hospit-incid.csv", encoding="utf-8") as fh:
    for ligne in csv.DictReader(fh, delimiter=";"):
        jour = ligne["jour"]
        if "2020-03-01" <= jour <= "2020-05-31":
            quotidien[jour] += int(ligne["incid_hosp"] or 0)

jours = sorted(quotidien)
cumul, total = [], 0
for j in jours:
    total += quotidien[j]
    cumul.append(total)

bascule = detecte_bascule(cumul)
print(jours[bascule] if bascule is not None else "aucune bascule detectee")

Le programme répond : 21 mars 2020.

C’est absurde. Le 21 mars, la vague monte encore, et elle montera pendant onze jours. Le détecteur s’est trompé, et il vaut la peine de comprendre comment.

Trois nombres suffisent à tout expliquer

Voici les premières admissions quotidiennes, telles que publiées.

JourAdmissions
19 mars2229
20 mars1256
21 mars1540
22 mars1534
23 mars2053
24 mars2618
25 mars3166

Les différences secondes qui en découlent commencent ainsi : +284+284, puis 6-6, puis +519+519, +565+565, +548+548. Le test d2[j] > 0 and d2[j+1] < 0 se déclenche sur le tout premier couple : un +284+284 suivi d’un 6-6. Le détecteur a fait exactement ce qu’on lui demandait ; il a trouvé le premier changement de signe. Seulement, ce changement de signe ne vaut six admissions sur mille cinq cents, sur un pays de soixante-sept millions d’habitants, entre un samedi et un dimanche.

Voilà toute la différence entre une fonction et des données. La fonction logistique du cours est lisse : sa dérivée seconde change de signe une fois, proprement. Une série réelle est bruitée : week-ends, remontées administratives, jours fériés, corrections rétroactives. La dérivée seconde discrète y change de signe des dizaines de fois, et la première fois n’a aucune raison d’être la bonne.

Réparer, et retrouver le théorème

Le remède tient en une ligne : lisser la série quotidienne par une moyenne mobile centrée sur sept jours, ce qui neutralise le cycle hebdomadaire par construction, puis recumuler et relancer le même détecteur.

d = [cumul[j+1] - cumul[j] for j in range(len(cumul) - 1)]
lisse = [sum(d[i-3:i+4]) / 7 for i in range(3, len(d) - 3)]

recumul, total = [0.0], 0.0
for v in lisse:
    total += v
    recumul.append(total)

bascule = detecte_bascule(recumul)
print(jours[bascule + 3] if bascule is not None else "aucune bascule detectee")

Le programme répond cette fois : 31 mars 2020.

Et le maximum des admissions quotidiennes réellement observées ? Il tombe le 1er avril 2020, avec 42814281 admissions.

Un jour d’écart. C’est très exactement la question 4 de l’exercice 31, et c’est le théorème du chapitre qui se vérifie sur le terrain : l’inflexion du cumul et le pic du quotidien sont le même instant, et l’écart d’une journée n’est pas une contradiction, c’est la résolution de l’échantillonnage. On ne mesure pas un instant réel avec des données comptées une fois par jour ; on l’encadre à la journée près.

Ce que dit le détecteur
Données brutes21 mars 2020 · fausse alerte, six admissions de bruit
Données lissées sur 7 jours31 mars 2020
Maximum réel du quotidien1er avril 2020, 42814281 admissions

Pour l’échelle : le cumul atteignait 3812538\,125 hospitalisations au 1er avril, et 108240108\,240 au 31 mai 2020.

Ce qu’il faut retenir

Trois choses, et la troisième est la plus utile.

  • Le théorème est juste, et il est vérifiable. L’inflexion du cumul est le pic du quotidien, sur une épidémie réelle comme sur la fonction du cours.
  • La logistique est un modèle, pas une loi. La première vague de 2020 n’est pas une logistique : elle a été interrompue par un confinement, ce qui est précisément l’inverse d’une croissance libre. L’inflexion existe bel et bien, mais c’est une décision politique qui l’a provoquée, pas la saturation d’une population.
  • Un algorithme correct sur une fonction peut être faux sur des données. Le détecteur de l’Atelier est mathématiquement irréprochable ; il échoue en trois lignes sur du réel. Entre l’énoncé d’un théorème et sa mise en œuvre, il y a toujours une étape que les mathématiques seules ne fournissent pas, et c’est le métier de ceux qui traitent les données.

Sources

  • Santé publique France, Données hospitalières relatives à l’épidémie de COVID-19, fichier des admissions quotidiennes par département (covid-hospit-incid), publié sur data.gouv.fr. Tous les chiffres de cette page ont été recalculés depuis ce fichier.
  • Cours F2, paragraphe 5 ; Atelier F2, exercices 22 et 31 ; activité La rumeur.
← Retour au chapitre F2