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).
** 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).
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 |
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 |
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.
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.
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 |
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 |
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.
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.
Vous pouvez ajouter une nouvelle phase en spécifiant une valeur de paramètre, telle que Scenario.add (sigma = 0.18)
.
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
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.
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")
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.
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)
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)
Vous pouvez également obtenir le résultat de la simulation du nombre de patients dans Scenario.history (nom de la variable)
.
snl.history("Infected", filename=None)
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.
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 |
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.
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