[PYTHON] Calculons la transition du nombre de reproduction de base du nouveau virus corona par préfecture

introduction

Le centre d'infection pour la nouvelle infection à coronavirus (COVID-19) se déplace déjà de la Chine continentale vers l'Europe et les États-Unis, et il y a des problèmes urgents tels que la restriction de la libre circulation aux frontières au sein de l'UE et l'interdiction de sortir. C'est une situation. Au Japon, la menace du nouveau virus corona a commencé à être reconnue le 3 février 2020, lorsque le Diamond Princess est arrivé au port de Yokohama, le 25 février, le gouvernement a annoncé sa politique de base, et le 28 février, à Hokkaido. Bien qu'elle ait été déclenchée par la déclaration d'urgence, en tant que mesures concrètes, une demande de s'abstenir d'événements de grande ampleur a été faite à partir du 26 février et des fermetures temporaires d'écoles primaires, secondaires et secondaires du pays à partir du 2 mars ont été faites. Environ un demi-mois s'est écoulé depuis lors, et pendant cette période, le cours moyen de l'action Nikkei a chuté du niveau de 22 000 yens au niveau de 17 000 yens, et il y a un nuage sombre à l'avenir. Les effets de la nouvelle infection à coronavirus ont gravement affecté non seulement la santé mais aussi la socio-économie, et le moment où elle convergera est très préoccupant. Par conséquent, dans cet article, je voudrais présenter une méthode pour calculer comment le nombre de reproductions de base, qui est un indice de l'infectivité du nouveau virus corona au Japon, a changé de fin janvier à début mars. Je vais. Les formules et les codes sont un peu longs, vous voudrez peut-être commencer par regarder les résultats.

Quel est le nombre de base de reproductions?

Le nombre de reproductions de base semble être très important, et [Enregistrement de la conférence de l'Institut de recherche en analyse mathématique de l'Université de Kyoto](https://repository.kulib.kyoto-u.ac.jp/dspace/bitstream/2433/140828/ Si vous regardez 1 / 653-04.pdf) et Japan Mathematical Biology Society Letter, vous pouvez voir la transition entre les générations. Cela ne semble pas simple, mais en un mot,

Semble être défini comme. Si ce nombre est R0, alors ** la condition de propagation de l'infection est $ R_0> 1 $, et la condition de convergence de l'infection est $ R_0 <1 $ **.

Le Premier ministre britannique Boris Johnson a expliqué lors d'une réunion le 16 mars qu'environ 60% des Britanniques contrôleraient le pic jusqu'à ce qu'ils obtiennent une immunité de masse (article de Newsweek. //www.newsweekjapan.jp/kimura/2020/03/post-74.php)), en supposant que $ R_0 = 2,6 $, le taux d'immunité de masse $ H $ pour les vaccins et l'auto-immunité ,

(1-H)R_0 < 1

Il semble que $ H> 1-1 / R_0 = 0,615 $ a été supposé à partir de la condition qui satisfait. En d'autres termes, l'immunité de masse assouplit la condition de $ R_0 $. Cependant, le développement de vaccins devrait prendre plus d'un an, y compris les essais cliniques, et c'est une stratégie audacieuse pour acquérir une immunité de masse en ne contrôlant pas une infection excessive.

Modèle de calcul du nombre de reproduction de base

Maintenant, afin de calculer le nombre de reproduction de base, je voudrais considérer un modèle simple basé sur la définition ci-dessus et le modèle SEIR. Voir la figure suivante. R0_calculation.jpg

La ligne supérieure affiche la date et la barre inférieure montre la population infectée un jour. La signification de chaque symbole est

Représente. Autrement dit, la production de I à E un jour t est une infection provenant d'une population de I qui a été infectée et développée avant t, et le nombre de reproductions de t ce jour-là est $ R_0 (t) / ip $. C'est un modèle appelé. Exprimant cela comme une expression,

\frac{1}{ip} R_0(t) \times \sum_{s=t+1}^{t+ip} P(s) = P(t+lp+ip), \\
\therefore R_0(t) = \frac{ ip \times P(t+lp+ip)} {\sum_{s=t+1}^{t+ip} P(s)}

Ce sera. Ci-dessous, utilisons cette formule pour calculer la transition temporelle du nombre de reproduction de base $ R_0 (t) $ à partir des données publiées des tests positifs.

Données source

Dans cet article, nous utilisons les données csv publiées dans Carte du nombre de nouveaux virus corona infectés par préfecture (fournie par Jag Japan Co., Ltd.). J'étais autorisé à le faire. Les données préfectorales sont regroupées en une seule, ce qui les rend très faciles à utiliser.

Essayez de calculer avec Python

Maintenant, utilisons Python pour calculer le nombre de reproduction de base R0 (t) pour chaque préfecture.

Conditions préalables

Comme condition préalable, utilisez ce qui suit.

Il existe différentes théories sur lp et ip, mais elles sont définies comme un guide. De plus, en raison de la commodité de la formule de calcul, seul $ R_0 (t) $ avant lp + ip = 13 [jour] peut être calculé à partir de la dernière date des données. Veuillez noter que sur le graphique, même si la valeur pour la période d'il y a 13 jours au dernier jour est 0, cela n'a pas de sens.

code

Tout d'abord, importez la bibliothèque.

# coding: utf-8

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import datetime
import locale

Données par préfecture de csv fournies dans Carte du nombre de nouveaux virus corona infectés par préfecture (fournie par Jag Japan Co., Ltd.) Une fonction qui lit et convertit en un bloc de données.

def readCsvOfJapanPref(pref : None):
    #Téléchargez à partir de l'URL ci-dessous
    # https://jag-japan.com/covid19map-readme/
    fcsv = u'COVID-19.csv'
    df = pd.read_csv(fcsv, header=0, encoding='utf8', parse_dates=[u'Date confirmée AAAAMMJJ'])
    #Date fixe,Extraire uniquement la préfecture de consultation
    df1 = df.loc[:,[u'Date confirmée AAAAMMJJ',u'Préfecture de consultation']]
    df1.columns = ['date','pref']
    #Extrait par la préfecture de consultation
    if pref is not None: #Si aucun, tout le Japon
        df1 = df1[df1.pref == pref]
    df1 = df1.loc[:,'date']
    #Compter à date fixe
    df2 = pd.DataFrame( df1.value_counts() ).reset_index()
    df2.columns = ['date','P']
    df2 = df2.sort_values('date')
    return df2

Une fonction qui définit un bloc de données pour le calcul. La colonne Ppre est pour le dénominateur de la formule et Pat est pour le numérateur de la formule. À partir du 24 janvier 2020, nous créerons un cadre de calcul pour les jours.

def makeCalcFrame(days):
    t_1 = pd.Timestamp(2020,1,24) #Date de début du calcul
    td = pd.Timedelta('1 days')
    #
    npd = [[t_1 + td * i, 0, 0, 0 ] for i in range(0,days)]
    df1 = pd.DataFrame(npd)
    df1.columns = ['date', 'Ppre','Pat', 'R0']
    #
    return df1

Une fonction qui combine des données préfectorales et des cadres de calcul.

def mergeCalcFrame(df1, df2):
    return pd.merge(df1, df2, on='date', how='left').fillna(0)

Une fonction qui calcule $ R_0 $ selon la formule. Pour simplifier le calcul, j'ai créé une expression lambda qui renvoie NaN lors d'un accès en dehors de la plage d'index.

def calcR0(df, keys):
    lp = keys['lp']
    ip = keys['ip']
    nrow = len(df)
    getP = lambda s: df.loc[s, 'P'] if s < nrow else np.NaN
    for t in range(nrow):
        df.loc[t, 'Ppre'] = sum([ getP(s) for s in range(t+1, t + ip + 1)])
        df.loc[t, 'Pat' ] = getP(t + lp + ip)
        if df.loc[t, 'Ppre'] > 0:
            df.loc[t, 'R0'  ] = ip * df.loc[t, 'Pat'] / df.loc[t, 'Ppre']
        else:
            df.loc[t, 'R0'  ] = np.NaN
    return df

Une fonction qui affiche les résultats sous forme de graphique.

def showResult(df, title):
    # R0=1 :Objectif de convergence
    ptgt = pd.DataFrame([[df.iloc[0,0],1],[df.iloc[len(df)-1,0],1]])
    ptgt.columns = ['date','target']
    # show R0
    plt.rcParams["font.size"] = 12
    ax = df.plot(title=title,x='date',y='R0', figsize=(10,7))
    ptgt.plot(x='date',y='target',style='r--',ax=ax)
    ax.grid(True)
    ax.set_ylim(0,)
    plt.show()

C'est la partie qui calcule pour chaque préfecture.

def R0inJapanPref(pref, label):
    keys = {'lp':5, 'ip':8 }
    df1 = makeCalcFrame(60) # 60 days
    df2 = readCsvOfJapanPref(pref)
    df = mergeCalcFrame(df1, df2)
    df = calcR0(df, keys)
    showResult(df, 'COVID-19 R0 ({})'.format(label))
    return df

preflist = [[None, 'Japan'], [u'Tokyo', 'Tokyo'],\
            [u'Préfecture d'Osaka', 'Osaka'],  [u'Préfecture d'Aichi', 'Aichi'],\
            [u'Hokkaido', 'Hokkaido']]
dflist = [[R0inJapanPref(pref, label), label] for pref, label in preflist]

C'est la partie qui affiche les résultats de calcul ci-dessus ensemble.

def showResult2(ax, df, label):
    # show R0
    plt.rcParams["font.size"] = 12
    df1 = df.rename(columns={'R0':label})
    df1.plot(x='date',y=label, ax=ax)

# R0=1
dfs = dflist[0][0]
ptgt = pd.DataFrame([[dfs.iloc[0,0],1],[dfs.iloc[len(dfs)-1,0],1]])
ptgt.columns = ['date','target']
ax = ptgt.plot(title='COVID-19 R0', x='date',y='target',style='r--', figsize=(10,8))
#
for df, label in dflist:
    showResult2(ax, df, label)
#
ax.grid(True)
ax.set_ylim(0,10)
plt.show()

Résultat du calcul

Jetons maintenant un œil aux résultats du calcul.

Changements dans le nombre de reproductions de base dans l'ensemble du Japon

R0_COVID-19 R0 (Japan).png

Changements dans le nombre de reproductions de base à Tokyo

R0_COVID-19 R0 (Tokyo).png

Changements dans le nombre de reproductions de base dans la préfecture d'Osaka

R0_COVID-19 R0 (Osaka).png

Changements dans le nombre de reproductions de base dans la préfecture d'Aichi

R0_COVID-19 R0 (Aichi).png

Changements dans le nombre de reproductions de base à Hokkaido

R0_COVID-19 R0 (Hokkaido).png

Comparez le tout

R0_all.png

Considération

À partir de ce qui précède, les tendances suivantes peuvent être dérivées de la simulation concernant l'estimation du nombre de reproduction de base R0 sur la base des données sur les personnes infectées de chaque préfecture du Japon.

En outre ...

Lien de référence

Je me suis référé à la page suivante. Carte du nombre de nouveaux virus corona infectés par préfecture (fournie par Jag Japan Co., Ltd.) Dossier de conférence de l'Institut de recherche en analyse mathématique de l'Université de Kyoto Lettre de la Société japonaise de biologie mathématique Article de la Semaine de l'actualité Modèle SEIR Page de la ville de Takatsuki

Je ne l'ai pas cité directement, mais j'ajouterai un lien très utile. COVID-19 reports Carte nationale des clusters

Recommended Posts

Calculons la transition du nombre de reproduction de base du nouveau virus corona par préfecture
Établissons un classement du nombre de reproductions efficaces du nouveau virus corona par préfecture
Testons l'hypothèse d'effondrement médical du nouveau virus corona
Visualisons le nombre de personnes infectées par le virus corona avec matplotlib
Tracez la propagation du nouveau virus corona
J'ai essayé de classer le nombre de décès par habitant de COVID-19 (nouveau virus corona) par pays
Le nombre de fermetures de magasins a-t-il augmenté en raison de l'influence du nouveau virus corona?
Calculez le nombre total de combinaisons avec python
Vérifions la transition démographique de la ville de Matsue, préfecture de Shimane avec des données ouvertes
Minimisez le nombre de polissages en optimisant la combinaison
Simulation GUI du nouveau virus corona (modèle SEIR)
Visualisons les données pluviométriques publiées par la préfecture de Shimane
Grattage des données du bulletin IDWR par nombre de rapports par point fixe de grippe et par préfecture
Simulons l'effet de l'introduction d'une application de suivi des contacts comme contre-mesure contre le nouveau virus corona
Importance de la réduction de la cible de test du test PCR pour le nouveau virus corona compris par le théorème de Bayes
Décidons la conférence de PyCon JP 2016 par optimisation de combinaison
Décidons la position du service d'incendie par optimisation combinée
Quantifier le degré d'autolimitation nécessaire pour contenir le nouveau virus corona
Résumons les fonctions de base de TensorFlow en créant un réseau neuronal qui apprend les portes XOR.
10. Compter le nombre de lignes
Obtenez le nombre de chiffres
Visualisons les données de niveau d'eau de la rivière publiées par la préfecture de Shimane
[Python] Réduisons le nombre d'éléments dans le résultat dans le fonctionnement de l'ensemble
Compte tenu de la situation au Japon par le statisticien Nate Silver, "Le nombre de personnes infectées par le coronavirus n'a pas de sens"
Créez un bot qui publie sur Slack le nombre de personnes positives pour le nouveau virus corona à Tokyo