Introduction
Nous créons un package Python CovsirPhy qui vous permet de télécharger et d'analyser facilement les données COVID-19 (comme le nombre de PCR positifs).
Article d'introduction:
** Cette fois, nous aimerions présenter l'analyse des tendances S-R (une méthode d'analyse des tendances de la propagation de l'infection). ** **
La version anglaise du document est CovsirPhy: COVID-19 analysis with phase-depend SIRs, [Kaggle: COVID-19 data with SIR model]( Veuillez vous référer à https://www.kaggle.com/lisphilar/covid-19-data-with-sir-model).
CovsirPhy peut être installé par la méthode suivante! Veuillez utiliser Python 3.7 ou supérieur, ou Google Colaboratory.
--Version stable: pip install covsirphy --upgrade
--Version de développement: pip install" git + https://github.com/lisphilar/covid19-sir.git#egg=covsirphy "
import covsirphy as cs
cs.__version__
# '2.8.2'
Environnement d'exécution | |
---|---|
OS | Windows Subsystem for Linux |
Python | version 3.8.5 |
Les tableaux et graphiques de cet article ont été créés à partir des données du 11/09/2020. Cliquez ici pour le code [^ 2] pour télécharger les données réelles depuis COVID-19 Data Hub [^ 1]:
data_loader = cs.DataLoader("input")
jhu_data = data_loader.jhu()
population_data = data_loader.population()
Le nombre de personnes infectées au Japon est différent de la valeur [^ 3] de Ministry of Health, Labour and Welfare HP. Il semble. Si vous souhaitez utiliser la valeur du ministère de la Santé, du Travail et du Bien-être, téléchargez les données de Ensemble de données COVID-19 au Japon avec le code suivant. Veuillez remplacer. Si ʻImportError / ModuleNotFoundError: requests et aiohttp se produisent à ce moment-là, veuillez installer par
pip install requests aiohttp` (pendant l'enquête sur la cause, les demandes doivent être incluses dans le paquet dépendant ...).
[^ 3]: Lorsque le «nombre de positifs», le «nombre de personnes libérées ou annulées» et le «nombre de décès» définis par le ministère de la Santé, du Travail et des Affaires sociales sont traités comme des cas confirmés, guéris, guéris et mortels. ..
japan_data = data_loader.japan()
jhu_data.replace(japan_data)
# Citation -> str
print(japan_data.citation)
Avant d'entrer dans l'explication de l'analyse des tendances S-R, regardons les données réelles (données japonaises à titre d'exemple) en utilisant Scenario.records ()
.
snl = cs.Scenario(jhu_data, population_data, country="Japan")
#Lorsque vous n'affichez pas le graphique
snl.records(show_figure=False)
Date | Confirmed | Infected | Fatal | Recovered | |
---|---|---|---|---|---|
209 | 2020-09-07 | 71856 | 7957 | 1363 | 62536 |
210 | 2020-09-08 | 72234 | 7575 | 1377 | 63282 |
211 | 2020-09-09 | 72726 | 7233 | 1393 | 64100 |
212 | 2020-09-10 | 73221 | 6980 | 1406 | 64835 |
213 | 2020-09-11 | 73901 | 6899 | 1412 | 65590 |
#Afficher le graphique
# filename:Valeur par défaut=None (Ne pas enregistrer en tant que fichier image)
_ = snl.records(filename=None)
Lorsqu'il s'agit de données sur les maladies infectieuses en utilisant des équations différentielles normales simultanées telles que le modèle SIR, il est courant d'effectuer une analyse selon l'une des hypothèses suivantes.
Cependant, lors de l'analyse du COVID-19, j'ai pensé qu'il était nécessaire de personnaliser plutôt que d'adopter l'un ou l'autre.
Tout d'abord, dans cette épidémie, chaque pays et chaque individu a pris des mesures pour contrôler l'épidémie à partir de février et mars 2020 environ, lorsque l'infection a commencé à se propager dans le monde. Des paramètres tels que le taux d'infection fluctuent de temps en temps et ne peuvent pas être supposés constants jusqu'à la fin (à partir des données réelles susmentionnées et de la forme d'onde du modèle SIR-F [^ 4]).
[^ 4]: [CovsirPhy] Package Python COVID-19 pour l'analyse des données: modèle SIR-F
En revanche, si les paramètres fluctuent chaque jour, l'analyse dépendra de chaque valeur des données acquises. Surtout dans le cas du COVID-19, il est nécessaire de saisir le contour de l'épidémie au lieu des données quotidiennes car le système d'inspection n'a pas été établi au stade initial et il est possible qu'il soit infectieux même s'il est asymptomatique. J'ai pensé.
Par conséquent, CovsirPhy a décidé de profiter des deux en subdivisant les paramètres en périodes qui semblent constantes. La "période pendant laquelle les paramètres sont constants" est appelée "Phase". Du début à la fin de l'épidémie, il existe plusieurs phases avec des paramètres différents. J'écrirai le code dans un autre article, mais par exemple, je pense que le numéro de reproduction d'exécution $ R_ {\ mathrm {t}} $ du modèle SIR-F change pas à pas comme indiqué dans le graphique.
Alors, comment définissez-vous la phase? Comme il faut un certain temps pour calculer les paramètres [^ 5], je voudrais trouver le point de branchement de Phase (la date à laquelle la valeur du paramètre change) sans calculer les paramètres.
[^ 5]: Il faut environ 2 minutes pour le calcul parallèle de 10 phases et 8 processeurs. Vous pouvez attendre l'analyse d'un pays, mais cela prend du temps et est difficile étant donné que les données augmentent chaque jour et que les données de nombreux pays peuvent être analysées.
En utilisant l'analyse de tendance S-R, il est possible de trouver le point de retournement de la phase entre la transition du nombre de détenteurs de susceptibilité $ S $ et le nombre de récupérateurs $ R $. J'omettrai le processus jusqu'à ce que je le propose car il sera long, mais [Kaggle: données COVID-19 avec modèle SIR, analyse de tendance SR](https://www.kaggle.com/lisphilar/covid-19-data-with- sir-model # SR-trend-analysis), veuillez donc vous y référer.
Dans les équations différentielles normales simultanées du modèle SIR [^ 6] et du modèle SIR-F [^ 4], c'est comme suit pour $ S $ et $ R $.
[^ 6]: [CovsirPhy] COVID-19 Python Package for Data Analysis: SIR model
\begin{align*}
& \frac{\mathrm{d}S}{\mathrm{d}T}= - N^{-1}\beta S I \\
& \frac{\mathrm{d}R}{\mathrm{d}T}= \gamma I \\
\end{align*}
Divisons $ \ frac {\ mathrm {d} S} {\ mathrm {d} T} $ par $ \ frac {\ mathrm {d} R} {\ mathrm {d} T} $.
\begin{align*}
\cfrac{\mathrm{d}S}{\mathrm{d}R} &= - \cfrac{\beta}{N \gamma} S \\
\end{align*}
Si vous intégrez ceci et le mettez comme $ a = \ frac {\ beta} {N \ gamma} $ [^ 7],
[^ 7]: Pionnier dans l'analyse des plans SR dans le modèle SIR: Balkew, Teshome Mogessie, "Le modèle SIR quand S (t) est une fonction multi-exponentielle." (2010) .Thèses et dissertations électroniques.Papier 1747 .
S_{(R)} = N e^{-a R}
Divisez les deux côtés par logarithmique
\log S_{(R)} = - a R + \log N
** Lorsque les paramètres du modèle sont constants, dessiner un graphe logarithmique avec l'axe des x comme nombre de récupérateurs $ R $ et l'axe des y comme nombre de détenteurs de sensibilité $ S $ donnera une ligne droite! ** **
(Graphique: D'après le cahier Kaggle mentionné ci-dessus, la différence d'inclinaison de la ligne droite lorsque les paramètres sont modifiés)
Il peut être exécuté en une seule ligne par la méthode Scenario.trend ()
. Le graphique du journal unilatéral S-R s'affiche. La phase est nommée phase initiale (0ème), 1ère phase, 2ème phase, ... [^ 8].
[^ 8]: Technologie associée: [Python] Convertir les nombres naturels en nombres ordinaux
# show_figure:Afficher le graphique
# filename:Valeur par défaut=None (Ne pas enregistrer en tant que fichier image)
snl.trend(show_figure=True, filename=None)
Une liste des dates de début et de fin de chaque phase peut être obtenue au format de trame de données en utilisant la méthode Scenario.summary ()
.
snl.summary()
Type | Start | End | Population | |
---|---|---|---|---|
0th | Past | 06Feb2020 | 21Apr2020 | 126529100 |
1st | Past | 22Apr2020 | 03Jul2020 | 126529100 |
2nd | Past | 04Jul2020 | 23Jul2020 | 126529100 |
3rd | Past | 24Jul2020 | 31Jul2020 | 126529100 |
4th | Past | 01Aug2020 | 10Aug2020 | 126529100 |
5th | Past | 11Aug2020 | 21Aug2020 | 126529100 |
6th | Past | 22Aug2020 | 29Aug2020 | 126529100 |
7th | Past | 30Aug2020 | 11Sep2020 | 126529100 |
Puisque la valeur du nombre de détenteurs de sensibilité $ S $ change en fonction de la valeur de la population totale, elle est affichée ensemble comme une condition d'analyse importante. En outre, bien que non présentées dans cet article, les valeurs estimées des paramètres peuvent être répertoriées par la méthode Scenario.summary ()
. S'il y a une phase pour laquelle les données réelles ne sont pas enregistrées, la colonne «Type» de la ligne correspondante sera «Future».
Bien que cette fois omis, le paramètre Phase ci-dessus est effectué par Scenario.add ()
, Scenario.combine ()
, Scenario.delete ()
, Scenario.separate ()
, Scenario.clear ()
. Il est également possible de modifier.
J'utilise le paquet ruptures pour trouver le nombre de points de branchement dans Phase et pour calculer le nombre de récupérateurs qui seront les points de branchement. J'utilisais à l'origine fbprophet, qui est célèbre comme logiciel d'analyse de séries chronologiques, mais il y avait un problème en raison du fait que le nombre de points de branchement devait être défini manuellement. Ilyass Tabial de Colaborator m'a dit [^ 9], et j'ai rendu possible l'estimation automatique du nombre de points de branchement à l'aide de ruptures.
À partir du code d'implémentation de covsirphy.ChangeFinder, les principales étapes sont les suivantes.
La prochaine fois, j'expliquerai comment estimer les paramètres de chaque phase.
Je vous remercie pour votre travail acharné!
Recommended Posts