[CovsirPhy] Package Python COVID-19 pour l'analyse de données: analyse de scénario (comparaison de paramètres)

Introduction Ceci est un article d'introduction sur le package Python CovsirPhy qui vous permet de télécharger et d'analyser facilement les données COVID-19 (telles que le nombre de PCR positifs).

  1. SIR model
  2. SIR-F model
  3. Data loading
  4. S-R trend analysis
  5. Parameter estimation
  6. Optimisation des paramètres de phase

** Cette fois, j'expliquerai l'analyse du scénario (comparaison des paramètres). ** **

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.3'
Environnement d'exécution
OS Windows Subsystem for Linux / Ubuntu
Python version 3.8.5

2. Préparation

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

Dans le tableau et le graphique de cet article, les données du Japon au 3 octobre 2020 (valeur totale nationale annoncée par le ministère de la Santé, du Travail et du Bien-être social) sont utilisées par le code suivant [^ 3]. COVID-19 Data Hub [^ 1] contient également des données japonaises, mais elles semblent être différentes de la valeur totale nationale annoncée par le ministère de la Santé, du Travail et du Bien-être social.

[^ 3]: [CovsirPhy] COVID-19 Python Package for Data Analysis: S-R trend analysis

# (Optional)Acquisition de données auprès du ministère de la Santé, du Travail et des Affaires sociales
#Si vous obtenez une erreur"pip install requests aiohttp"
japan_data = data_loader.japan()
jhu_data.replace(japan_data)
print(japan_data.citation)

Confirmation des données réelles:

#Génération d'instance de classe pour l'analyse
snl = cs.Scenario(jhu_data, population_data, country="Japan")
#Affichage graphique des données réelles
snl.records(filename=None)

Division en phase par analyse des tendances S-R [^ 3] et ajustement de période [^ 4]:

[^ 4]: [CovsirPhy] COVID-19 Python Package for Data Analysis: Optimizing Phase Settings

# S-R trend analysis
snl.trend(filename=None)
# Separate 0th phase
snl.separate("01Apr2020")
#Affichage de la liste
snl.summary()
Type Start End Population
0th Past 06Feb2020 31Mar2020 126529100
1st Past 01Apr2020 21Apr2020 126529100
2nd Past 22Apr2020 06Jul2020 126529100
3rd Past 07Jul2020 23Jul2020 126529100
4th Past 24Jul2020 01Aug2020 126529100
5th Past 02Aug2020 14Aug2020 126529100
6th Past 15Aug2020 28Aug2020 126529100
7th Past 29Aug2020 08Sep2020 126529100
8th Past 09Sep2020 19Sep2020 126529100
9th Past 20Sep2020 03Oct2020 126529100

Parameter estimation with SIR-F model[^5]:

[^ 5]: [CovsirPhy] COVID-19 Python Package for Data Analysis: Parameter Estimation

# Parameter estimation
snl.estimate(cs.SIRF)
#Affichage de liste (partie)
est_cols = ["Start", "End", "Rt", *cs.SIRF.PARAMETERS, "RMSLE"]
snl.summary(columns=est_cols)
Start End Rt theta kappa rho sigma RMSLE
0th 06Feb2020 31Mar2020 3.6 0.0197967 0.000781433 0.110404 0.0292893 0.693445
1st 01Apr2020 21Apr2020 13.53 0.00119307 0.000954275 0.119908 0.00789786 0.17892
2nd 22Apr2020 06Jul2020 0.37 0.090172 0.000858737 0.0264027 0.0636349 0.883253
3rd 07Jul2020 23Jul2020 1.93 0.000466376 8.04707e-05 0.133382 0.0689537 0.0318977
4th 24Jul2020 01Aug2020 1.78 7.63782e-05 0.000231109 0.135991 0.0760643 0.0193947
5th 02Aug2020 14Aug2020 1.4 0.00100709 0.000215838 0.100929 0.0716643 0.0797834
6th 15Aug2020 28Aug2020 0.82 0.000562179 0.000899694 0.0783473 0.0943161 0.021244
7th 29Aug2020 08Sep2020 0.7 0.00168729 0.00119958 0.0616905 0.0863032 0.0182731
8th 09Sep2020 19Sep2020 0.78 0.00293238 0.00132534 0.0793277 0.099966 0.0282502
9th 20Sep2020 03Oct2020 0.87 0.000463924 0.000984493 0.0793406 0.090479 0.0274187

3. Qu'est-ce qu'un scénario?

Dans la classe Scenario de Covsirphy, vous pouvez enregistrer plusieurs types de paramètres Phase [^ 3]. "Paramètres de phase [^ 3]" est appelé "scénario".

Par exemple, comme indiqué dans le tableau suivant, «Scénario principal» et «Scénario de médecine» peuvent être définis en parallèle pour effectuer une analyse de scénario. Les dates sont énumérées dans l'hypothèse où les données réelles du 2020/2/6 au 2020/10/3 ont été obtenues.

nom du scénario 0th-9th 10th 11th
Main 2/6 - 10/3 10/4 - 12/31 2021/1/1 - 2020/4/10
Medicine 2/6 - 10/3 10/4 - 12/31 2021/1/1 - 2020/4/10

Estimez les paramètres de la 0ème à la 9ème phase pour chaque scénario et simulez le nombre de patients en supposant que les paramètres de la 10ème phase sont les mêmes et que $ \ sigma $ double entre la 10ème et la 11ème pour le scénario Médecine. .. A ce moment, en comparant la transition du nombre de patients entre 2021/1 / 1-2021 / 4/10, l'effet de doublement de $ \ sigma $ peut être estimé.

Il est peu probable qu'il doublera en même temps en raison de la création de nouveaux médicaments, mais veuillez vous y référer comme une démonstration.

4. Création et suppression de scénarios

Pour examiner l'effet des paramètres sur le nombre de patients, créez des scénarios avec différents paramètres, simulez le nombre de patients et comparez-les. Tout d'abord, comment créer / initialiser / supprimer le scénario lui-même est la suivante.

Créer un nouveau

Vous pouvez utiliser la méthode Scenario.clear (nom =" nom du nouveau scénario ", template =" nom du scénario source ") pour copier un scénario configuré et en créer un nouveau. Lors de la création d'un scénario «Nouveau» avec le scénario principal (par défaut) comme source de copie

#Créer un nouveau
snl.clear(name="New", template="Main")
#Affichage de la liste
cols = ["Start", "End", "Rt", *cs.SIRF.PARAMETERS]
snl.summary(columns=cols)

(1ère-8ème phase est omise sur papier)

Start End Rt theta kappa rho sigma
('Main', '0th') 06Feb2020 31Mar2020 3.85 0.0185683 0.000768779 0.112377 0.027892
('Main', '9th') 20Sep2020 03Oct2020 0.87 0.000463924 0.000984493 0.0793406 0.090479
('New', '0th') 06Feb2020 31Mar2020 3.85 0.0185683 0.000768779 0.112377 0.027892
('New', '9th') 20Sep2020 03Oct2020 0.87 0.000463924 0.000984493 0.0793406 0.090479

Effacer

Utilisez Scenario.delete (nom =" nom du scénario ") pour supprimer. Supprimez le scénario "Nouveau" et ne renvoyez que le scénario "Principal" à l'état enregistré.

#Supprimer le scénario
snl.delete(name="New")
#Affichage de la liste
snl.summary(columns=cols)

(1ère-8ème phase est omise sur papier)

Start End Rt theta kappa rho sigma
0th 06Feb2020 31Mar2020 3.85 0.0185683 0.000768779 0.112377 0.027892
9th 20Sep2020 03Oct2020 0.87 0.000463924 0.000984493 0.0793406 0.090479

5. [Ajouter] Spécifiez la dernière date

De là, je vais vous expliquer comment ajouter une phase. Vous pouvez ajouter une nouvelle phase en spécifiant la dernière date, telle que Scenario.add (end_date =" 31Dec2020 ").

# Main:Ajouté jusqu'au 31 décembre 2020 comme 10e phase
snl.add(end_date="31Dec2020", name="Main")
#Affichage de la liste
snl.summary(columns=cols, name="Main")

(1ère-8ème phase est omise sur papier)

Start End Rt theta kappa rho sigma
0th 06Feb2020 31Mar2020 3.61 0.0190222 0.00099167 0.110766 0.0290761
9th 20Sep2020 03Oct2020 0.87 0.000463924 0.000984493 0.0793406 0.090479
10th 04Oct2020 31Dec2020 0.87 0.000463924 0.000984493 0.0793406 0.090479

Puisqu'aucun paramètre n'a été défini, les paramètres de 10ème phase ajoutés ont les mêmes valeurs que la 9ème phase.

6. [Ajouter] Spécifiez le nombre de jours

Vous pouvez ajouter une nouvelle phase en spécifiant le nombre de jours, par exemple Scenario.add (days = 100).

# main: 01Jan2021 (Le lendemain du dernier jour du 10)Ajouté 100 jours en tant que 11e
snl.add(days=100, name="Main").summary(columns=cols)
#Affichage de la liste
snl.summary(columns=cols, name="Main")

(1ère-8ème phase est omise sur papier)

Start End Rt theta kappa rho sigma
0th 06Feb2020 31Mar2020 3.61 0.0190222 0.00099167 0.110766 0.0290761
9th 20Sep2020 03Oct2020 0.87 0.000463924 0.000984493 0.0793406 0.090479
10th 04Oct2020 31Dec2020 0.87 0.000463924 0.000984493 0.0793406 0.090479
11th 01Jan2021 10Apr2021 0.87 0.000463924 0.000984493 0.0793406 0.090479

Puisqu'aucun paramètre n'a été défini, les paramètres de la 11ème phase ajoutés ont les mêmes valeurs que la 10ème phase.

7. Spécifiez le paramètre Add

Vous pouvez ajouter une nouvelle phase en spécifiant une valeur de paramètre, telle que Scenario.add (sigma = 0.18).

Obtenir des estimations de paramètres

Dans cet article, afin d'estimer l'effet de doublement de $ \ sigma $, la valeur estimée de $ \ sigma $ dans la phase du scénario principal 11 (dernière phase) est obtenue par la méthode Scenario.get ().

sigma_last = snl.get("sigma", phase="last", name="Main")
sigma_med = sigma_last * 2
print(round(sigma_last, 3), round(sigma_med, 3))
# -> 0.09 0.181

Paramètres du scénario de médecine

Créez un scénario de médecine avec le scénario principal comme source de copie. À ce stade, les phases futures (10e, 11e phases) seront supprimées. Ajoutez ensuite la 10ème phase (mêmes paramètres que Main) et la 11ème phase ($ \ sigma $ est doublé).

snl.clear(name="Medicine", template="Main")
snl.add(end_date="31Dec2020", name="Medicine")
# Medicine: 01Jan2021 (Le lendemain du dernier jour du 10)Ajouté 100 jours en tant que 11e
snl.add(sigma=sigma_med, days=100, name="Medicine")
#Affichage de la liste
snl.summary(columns=cols, name="Medicine")

(1ère-8ème phase est omise sur papier)

Start End Rt theta kappa rho sigma
0th 06Feb2020 31Mar2020 3.85 0.0185683 0.000768779 0.112377 0.027892
9th 20Sep2020 03Oct2020 0.87 0.000463924 0.000984493 0.0793406 0.090479
10th 04Oct2020 31Dec2020 0.87 0.000463924 0.000984493 0.0793406 0.090479
11th 01Jan2021 10Apr2021 0.44 0.000463924 0.000984493 0.0793406 0.180958

Depuis que $ sigma $ a doublé, le nombre effectif de reproductions $ Rt $ a été divisé par deux.

8. Supprimer la phase

En passant, vous pouvez supprimer une phase avec Scenario.delete (phase = [" Nom de la phase "]). Ici, ajoutez et supprimez la 12ème phase.

#Ajouter une phase
snl.add(days=30, name="Medicine")
#Supprimer la phase
snl.delete(phases=["last"], name="Medicine")

9. Vérifier la transition des paramètres

Vérifiez le graphique pour voir si les transitions de paramètres sont définies comme prévu. Utilisez Scenario.history (nom du paramètre). Utilisez le nom du scénario comme nom de la série.

Transition de Sigma

Si $ \ sigma $ est doublé dans la 11ème phase du scénario Médecine (2021/1/1 --2021 / 4/1):

snl.history("sigma", filename=None)

sigma.jpg

Transition de Rt

Si le nombre de reproduction effective $ Rt $ est réduit de moitié à la 11e phase (2021/1/1 --2021/4/1) du scénario Médecine:

snl.history("Rt", filename=None)

rt.jpg

10. Simulation du nombre de patients

Vous pouvez également obtenir le résultat de la simulation du nombre de patients dans Scenario.history (nom de la variable).

affichage graphique

snl.history("Infected", filename=None)

infected.jpg

Le nombre de personnes infectées diminue rapidement en raison du doublement de $ \ sigma $. Il est peu probable qu'il double à la fois en raison de la création de nouveaux médicaments, mais en changeant les valeurs des paramètres en valeurs réalistes et en effectuant des simulations, il est possible d'estimer le nombre de personnes infectées et l'heure de fin dans le futur.

Format de trame de données

Si vous voulez obtenir la valeur au format de trame de données, veuillez utiliser la méthode Scenario.track ().

snl.track().tail()
Scenario Date Confirmed Fatal Infected Recovered Population Rt theta kappa rho sigma 1/alpha2 [day] 1/gamma [day] alpha1 [-] 1/beta [day]
425 Medicine 2021-04-06 108463 1884 0 106579 126529100 0.44 0.000463924 0.000984493 0.0793406 0.180958 1015 5 0 12
426 Medicine 2021-04-07 108463 1884 0 106579 126529100 0.44 0.000463924 0.000984493 0.0793406 0.180958 1015 5 0 12
427 Medicine 2021-04-08 108463 1884 0 106579 126529100 0.44 0.000463924 0.000984493 0.0793406 0.180958 1015 5 0 12
428 Medicine 2021-04-09 108463 1884 0 106579 126529100 0.44 0.000463924 0.000984493 0.0793406 0.180958 1015 5 0 12
429 Medicine 2021-04-10 108463 1884 0 106579 126529100 0.44 0.000463924 0.000984493 0.0793406 0.180958 1015 5 0 12

11. Comparaison des valeurs caractéristiques

Comparez les valeurs des caractéristiques pour comprendre les caractéristiques du scénario. Cependant, il est inutile de comparer le nombre moyen de personnes infectées, de sorte que les valeurs caractéristiques sont définies comme suit.

--Nombre maximum de personnes infectées et leur date --Nombre de personnes infectées le lendemain du dernier jour --Nombre de décès le lendemain du dernier jour

Cliquez ici pour le code et les résultats de sortie:

snl.describe()
max(Infected) argmax(Infected) Infected on 11Apr2021 Fatal on 11Apr2021 11th_Rt
Main 15154 21Apr2020 512 1970 0.87
Medicine 15154 21Apr2020 0 1884 0.44

Le nombre de reproduction effectif $ Rt $ est émis uniquement pour les phases dont les valeurs diffèrent d'un scénario à l'autre.

Si les paramètres actuels se poursuivent jusqu'en 2021/4/10, le nombre prévu de personnes infectées semble être d'environ 512 même à partir du 4/11 ... Par contre, si $ \ sigma $ double, les personnes infectées Le nombre prédit est 0.

12. Post-scriptum

Merci d'avoir parcouru cette fois aussi! Nous vous serions reconnaissants si vous pouviez nous donner votre avis, par exemple en ajoutant des valeurs caractéristiques.

La prochaine fois, j'expliquerai comment évaluer l'efficacité des vaccins.

Recommended Posts

[CovsirPhy] Package Python COVID-19 pour l'analyse de données: analyse de scénario (comparaison de paramètres)
[CovsirPhy] Package Python COVID-19 pour l'analyse des données: estimation des paramètres
[CovsirPhy] Package Python COVID-19 pour l'analyse des données: chargement des données
[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: analyse des tendances S-R
[CovsirPhy] Package Python COVID-19 pour l'analyse des données: modèle SIR
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 python
Analyse de données avec python 2
Présentation de l'analyse de données python
Modèle d'analyse de données Python
Comparaison du gestionnaire de packages Python
Analyse de données avec Python
Analysons les données Covid-19 (Corona) en utilisant Python [Pour les débutants]
[Pour les débutants] Comment étudier le test d'analyse de données Python3
Mon conteneur d'analyse de données python
[Python] Notes sur l'analyse des données
[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?
Notes d'apprentissage sur l'analyse des données Python
<Python> Construisez un serveur dédié pour l'analyse des données Jupyter Notebook
Analyse de données à l'aide de pandas python
Conseils et précautions lors de l'analyse des données
Pratique de l'analyse de données par Python et pandas (Tokyo COVID-19 data edition)
Créer un Ubuntu de démarrage USB avec un environnement Python pour l'analyse des données
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
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)
Résumé du livre électronique Python utile pour l'analyse de données gratuite
Tableau de comparaison des outils d'environnement Python pour Rubyist
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