[CovsirPhy] Package Python COVID-19 pour l'analyse des données: analyse des tendances S-R

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

1. Environnement d'exécution

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)

2. Vérifiez les données

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)

records.jpg

3. Objectif de l'analyse des tendances S-R

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.

rt.jpg

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.

4. Comment ça marche

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)

__results___208_0.png

5. Exemple de code

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)

trend.jpg

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.

6. Mise en œuvre

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.

  1. Obtenez les valeurs S et R pour chaque date
  2. Calculez log10 (S)
  3. Définissez la valeur de log10 (S) pour R = 1, 2, 3..: Si ce n'est pas dans les données, remplissez les valeurs avant et après.
  4. Échantillonnage pour réduire la quantité de calcul: nombre d'échantillons = nombre de données originales
  5. Utilisez le package Ruptures pour trouver un ensemble (R, log10 (S)) de points où log10 (S) change de manière significative par rapport à la quantité de changement du nombre de récupérateurs.
  6. Rassemblez le log10 (S) de l'ensemble des points de changement avec les données d'origine et trouvez la date de chaque point de changement (valeur approximative si elle ne figure pas dans les données d'origine. Log10 (S) car le nombre de cas confirmés a une variation plus grande que R. Ça a été utilisé)
  7. Calculez les dates de début et de fin de chaque phase à partir de la date du changement

Épilogue

La prochaine fois, j'expliquerai comment estimer les paramètres de chaque phase.

Je vous remercie pour votre travail acharné!

Recommended Posts

[CovsirPhy] Package Python COVID-19 pour l'analyse des données: analyse des tendances S-R
[CovsirPhy] Package Python COVID-19 pour l'analyse de données: modèle SIR-F
[CovsirPhy] Package Python COVID-19 pour l'analyse des données: modèle SIR
[CovsirPhy] Package Python COVID-19 pour l'analyse des données: estimation des paramètres
[CovsirPhy] Package Python COVID-19 pour l'analyse de données: analyse de scénario (comparaison de paramètres)
Python pour l'analyse des données Chapitre 4
Python pour l'analyse des données Chapitre 2
Python pour l'analyse des données Chapitre 3
Modèle de prétraitement pour l'analyse des données (Python)
Outil de visualisation Python pour le travail d'analyse de données
Analyse de données avec python 2
Présentation de l'analyse de données python
Modèle d'analyse de données Python
Analyse de données avec Python
Analysons les données Covid-19 (Corona) en utilisant Python [Pour les débutants]
Analyse de données pour améliorer POG 1 ~ Web scraping avec Python ~
Mon conteneur d'analyse de données python
[Python] Notes sur l'analyse des données
Analyse de données à l'aide de pandas python
Conseils et précautions lors de l'analyse des données
Analyse des données Twitter | Analyse des tendances
[Comprendre au plus court] Principes de base de Python pour l'analyse des données
Lequel dois-je étudier, R ou Python, pour l'analyse des données?
<Python> Construisez un serveur dédié pour l'analyse des données Jupyter Notebook
Python: analyse des séries chronologiques: prétraitement des données des séries chronologiques
Cours Python pour la science des données - techniques utiles
Pratique de l'analyse de données par Python et pandas (Tokyo COVID-19 data edition)
Analyse de données pour améliorer POG 3 ~ Analyse de régression ~
Formatage des données pour les graphiques Python / couleur
Analyse de données à partir de python (visualisation de données 1)
Analyse de données à partir de python (visualisation de données 2)
Créer un Ubuntu de démarrage USB avec un environnement Python pour l'analyse des données
Résumé du livre électronique Python utile pour l'analyse de données gratuite
Programme d'analyse des tendances Twitter (mémo personnel)
Techniques Python détaillées requises pour la mise en forme des données (1)
[Python] Première analyse de données / apprentissage automatique (Kaggle)
Analyse de données à partir de python (pré-traitement des données-apprentissage automatique)
Comment utiliser "deque" pour les données Python
Techniques Python détaillées requises pour la mise en forme des données (2)
J'ai suivi une formation à l'analyse de données Python à distance
Préparation à l'examen d'analyse de données certifié Python 3 Engineer
JupyterLab Basic Setting 2 pour l'analyse des données (pip)
Configuration de base de JupyterLab pour l'analyse des données (pip)
Analyse des données en Python Résumé des sources que les débutants devraient d'abord consulter
Analyse des données pour améliorer POG 2 ~ Analyse avec le notebook jupyter ~
Modèle Python qui effectue une analyse des journaux à une vitesse explosive
Test d'analyse des données de certification d'ingénieur Python3
Formation préalable à l'examen d'analyse des données de certification d'ingénieur Python 3
Introduction à la modélisation statistique pour l'analyse des données
[Python] Analyse de données, pratique du machine learning (Kaggle) -Prétraitement des données-
Comment utiliser les outils d'analyse de données pour les débutants
Afficher la bougie de données FX (forex) en Python
Analyse de données en Python: une note sur line_profiler
[Python] Flux du scraping Web à l'analyse des données
Environnement enregistré pour l'analyse des données avec Python
Astro: modules / fonctions python fréquemment utilisés pour l'analyse
[Mis à jour de temps en temps] Mémos Python souvent utilisés pour l'analyse des données [Division N, etc.]