[PYTHON] Berechnen wir den Übergang der Grundreproduktionszahl des neuen Koronavirus nach Präfektur

Einführung

Das Infektionszentrum für die neue Coronavirus-Infektion (COVID-19) verlagert sich bereits vom chinesischen Festland nach Europa und in die USA, und es gibt dringende Probleme wie die Einschränkung des freien Grenzverkehrs innerhalb der EU und das Verbot des Ausreisens. Es ist eine Situation. In Japan wurde die Bedrohung durch das neue Koronavirus am 3. Februar 2020 erkannt, als die Diamantprinzessin am 25. Februar im Hafen von Yokohama eintraf. Die Regierung kündigte ihre Grundpolitik an und am 28. Februar in Hokkaido. Obwohl dies durch eine Notstandserklärung als konkrete Maßnahme ausgelöst wurde, wurde ab dem 26. Februar ein Antrag auf Unterlassung von Großveranstaltungen gestellt, und ab dem 2. März wurden landesweit vorübergehend Grund-, Mittel- und Oberschulen geschlossen. Seitdem ist ungefähr ein halber Monat vergangen, und während dieser Zeit ist der durchschnittliche Aktienkurs von Nikkei von 22.000 Yen auf 17.000 Yen gefallen, und in Zukunft gibt es eine dunkle Wolke. Die Auswirkungen der neuen Coronavirus-Infektion haben nicht nur die Gesundheit, sondern auch die Sozioökonomie ernsthaft beeinträchtigt, und wann sie konvergieren wird, ist von großer Bedeutung. Daher möchte ich in diesem Artikel eine Methode zur Berechnung vorstellen, wie sich die Anzahl der Grundreproduktionen, die ein Index für die Infektiosität des neuen Koronavirus in Japan ist, von Ende Januar bis Anfang März verändert hat. Ich werde. Die Formeln und Codes sind etwas lang, daher ist es möglicherweise besser, zuerst die Berechnungsergebnisse zu betrachten.

Was ist die Grundanzahl der Reproduktionen?

Die Anzahl der grundlegenden Reproduktionen scheint sehr hoch zu sein, und Vorlesungsprotokoll des Forschungsinstituts für mathematische Analyse der Universität Kyoto Wenn Sie sich 1 / 653-04.pdf) und Brief der Japan Mathematical Biology Society ansehen, können Sie den Übergang zwischen den Generationen erkennen. Es scheint nicht einfach, aber auf den Punkt gebracht,

Scheint definiert zu sein als. Wenn diese Zahl R0 ist, ist ** die Bedingung für die Ausbreitung der Infektion $ R_0> 1 $ und die Bedingung für die Konvergenz der Infektion ist $ R_0 <1 $ **.

Der britische Premierminister Boris Johnson erklärte auf einem Treffen am 16. März, dass etwa 60% der Briten den Höhepunkt kontrollieren würden, bis sie eine Massenimmunität erlangt hätten (Newsweek-Artikel. //www.newsweekjapan.jp/kimura/2020/03/post-74.php)) unter der Annahme, dass $ R_0 = 2,6 $ ist, beträgt die Immunitätsrate der Bevölkerung $ H $ bei Impfstoffen und Autoimmunität ,

(1-H)R_0 < 1

Es scheint, dass $ H> 1-1 / R_0 = 0,615 $ von der Bedingung angenommen wurde, die erfüllt. Mit anderen Worten, die Massenimmunität entspannt den Zustand von $ R_0 $. Die Entwicklung von Impfstoffen wird jedoch voraussichtlich mehr als ein Jahr dauern, einschließlich klinischer Studien, und es ist eine mutige Strategie, eine Massenimmunität zu erlangen, indem eine übermäßige Infektion nicht kontrolliert wird.

Berechnungsmodell der Grundreproduktionsnummer

Um nun die Grundreproduktionszahl zu berechnen, möchte ich ein einfaches Modell betrachten, das auf der obigen Definition und [SEIR-Modell] basiert (https://qiita.com/oki_mebarun/items/60592c703dd4e8d1ff72). Siehe folgende Abbildung. R0_calculation.jpg

Die obere Reihe zeigt das Datum und der untere Balken zeigt die infizierte Bevölkerung eines Tages. Die Bedeutung jedes Symbols ist

Repräsentiert. Das heißt, die Produktion von I bis E an einem Tag t ist eine Infektion von einer Population von I, die vor t infiziert und entwickelt wurde, und die Anzahl der Reproduktionen von t an diesem Tag beträgt $ R_0 (t) / ip $. Es ist ein Modell namens. Dies als Ausdruck ausdrücken,

\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)}

Es wird sein. Verwenden Sie diese Formel unten, um den Zeitübergang der Grundreproduktionsnummer $ R_0 (t) $ aus den veröffentlichten Daten der Testpositive zu berechnen.

Quelldaten

In diesem Artikel verwenden wir die CSV-Daten, die in Karte der Anzahl der von der Präfektur infizierten neuen Koronaviren (bereitgestellt von Jag Japan Co., Ltd.) veröffentlicht wurden. Ich durfte es tun. Präfekturdaten werden zu einer zusammengefasst, was die Verwendung sehr einfach macht.

Versuchen Sie mit Python zu rechnen

Verwenden wir nun Python, um die Grundreproduktionsnummer R0 (t) für jede Präfektur zu berechnen.

Voraussetzungen

Verwenden Sie als Voraussetzung Folgendes.

Es gibt verschiedene Theorien über LP und IP, aber sie dienen als Leitfaden. Aufgrund der Bequemlichkeit der Berechnungsformel kann ab dem letzten Datum der Daten nur $ R_0 (t) $ vor lp + ip = 13 [Tag] berechnet werden. Bitte beachten Sie, dass in der Grafik, selbst wenn der Wert für den Zeitraum von vor 13 Tagen bis zum letzten Tag 0 ist, er bedeutungslos ist.

Code

Importieren Sie zunächst die Bibliothek.

# coding: utf-8

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

Daten nach Präfektur von CSV bereitgestellt in Karte der Anzahl der neuen Koronaviren, die von Präfektur infiziert wurden (bereitgestellt von Jag Japan Co., Ltd.) Eine Funktion, die liest und in einen Datenrahmen konvertiert.

def readCsvOfJapanPref(pref : None):
    #Download von der unten stehenden URL
    # https://jag-japan.com/covid19map-readme/
    fcsv = u'COVID-19.csv'
    df = pd.read_csv(fcsv, header=0, encoding='utf8', parse_dates=[u'Bestätigtes Datum JJJJMMTT'])
    #Festes Datum,Extrahieren Sie nur die Präfektur Beratung
    df1 = df.loc[:,[u'Bestätigtes Datum JJJJMMTT',u'Beratungspräfektur']]
    df1.columns = ['date','pref']
    #Extrahiert durch Konsultationspräfektur
    if pref is not None: #Wenn keine, ganz Japan
        df1 = df1[df1.pref == pref]
    df1 = df1.loc[:,'date']
    #Auf festes Datum zählen
    df2 = pd.DataFrame( df1.value_counts() ).reset_index()
    df2.columns = ['date','P']
    df2 = df2.sort_values('date')
    return df2

Eine Funktion, die einen Datenrahmen für die Berechnung definiert. Die Spalte Ppre steht für den Nenner der Formel und Pat für den Zähler der Formel. Ab dem 24. Januar 2020 erstellen wir einen Berechnungsrahmen für Tage.

def makeCalcFrame(days):
    t_1 = pd.Timestamp(2020,1,24) #Startdatum der Berechnung
    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

Eine Funktion, die Präfekturdaten und Berechnungsrahmen kombiniert.

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

Eine Funktion, die $ R_0 $ gemäß der Formel berechnet. Um die Berechnung zu vereinfachen, habe ich einen Lambda-Ausdruck erstellt, der beim Zugriff außerhalb des Indexbereichs NaN zurückgibt.

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

Eine Funktion, die die Ergebnisse als Grafik anzeigt.

def showResult(df, title):
    # R0=1 :Konvergenzziel
    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()

Dies ist der Teil, der für jede Präfektur berechnet wird.

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'Tokio', 'Tokyo'],\
            [u'Präfektur Osaka', 'Osaka'],  [u'Präfektur Aichi', 'Aichi'],\
            [u'Hokkaido', 'Hokkaido']]
dflist = [[R0inJapanPref(pref, label), label] for pref, label in preflist]

Dies ist der Teil, der die obigen Berechnungsergebnisse zusammen anzeigt.

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

Berechnungsergebnis

Schauen wir uns nun die Berechnungsergebnisse an.

Änderungen in der Anzahl der Grundreproduktionen in Japan insgesamt

R0_COVID-19 R0 (Japan).png

Änderungen in der Anzahl der Grundreproduktionen in Tokio

R0_COVID-19 R0 (Tokyo).png

Änderungen in der Anzahl der Grundreproduktionen in der Präfektur Osaka

R0_COVID-19 R0 (Osaka).png

Änderungen in der Anzahl der Grundreproduktionen in der Präfektur Aichi

R0_COVID-19 R0 (Aichi).png

Änderungen in der Anzahl der Grundreproduktionen in Hokkaido

R0_COVID-19 R0 (Hokkaido).png

Vergleiche das Ganze

R0_all.png

Erwägung

Aus dem Obigen können die folgenden Trends aus der Simulation hinsichtlich der Schätzung der Grundreproduktionszahl R0 basierend auf den Daten der infizierten Person jeder Präfektur in Japan abgeleitet werden.

Außerdem ...

Referenzlink

Ich habe auf die folgende Seite verwiesen. Karte der Anzahl der von der Präfektur infizierten neuen Koronaviren (bereitgestellt von Jag Japan Co., Ltd.) Vorlesungsprotokoll des Forschungsinstituts für mathematische Analyse der Universität Kyoto Brief der Japan Mathematical Biology Society Artikel der Nachrichtenwoche SEIR-Modell Takatsuki City Page

Ich habe es nicht direkt zitiert, aber ich werde einen sehr nützlichen Link hinzufügen. COVID-19 reports Nationale Clusterkarte

Recommended Posts

Berechnen wir den Übergang der Grundreproduktionszahl des neuen Koronavirus nach Präfektur
Lassen Sie uns eine Rangfolge der Anzahl der wirksamen Reproduktionen des neuen Koronavirus nach Präfektur erstellen
Lassen Sie uns die medizinische Kollapshypothese des neuen Koronavirus testen
Stellen wir uns die Anzahl der mit Matplotlib mit dem Coronavirus infizierten Personen vor
Zeichnen Sie die Ausbreitung des neuen Koronavirus
Ich habe versucht, die Anzahl der Todesfälle pro Kopf von COVID-19 (neues Koronavirus) nach Ländern zu tabellieren
Hat die Anzahl der Ladenschließungen aufgrund des Einflusses des neuen Koronavirus zugenommen?
Berechnen Sie die Gesamtzahl der Kombinationen mit Python
Lassen Sie uns den Bevölkerungsübergang von Matsue City, Präfektur Shimane, mit offenen Daten überprüfen
Minimieren Sie die Anzahl der Polierungen, indem Sie die Kombination optimieren
GUI-Simulation des neuen Koronavirus (SEIR-Modell)
Lassen Sie uns die von der Präfektur Shimane veröffentlichten Niederschlagsdaten visualisieren
Scraping von IDWR-Bulletin-Daten nach Anzahl der Berichte pro Influenza-Fixpunkt und nach Präfektur
Simulieren wir den Effekt der Einführung einer Kontaktverfolgungs-App als Gegenmaßnahme gegen den neuen Koronavirus
Bedeutung der Eingrenzung des Testziels des PCR-Tests auf neues Koronavirus nach dem Bayes-Theorem
Lassen Sie uns die Vorlesung der PyCon JP 2016 durch Kombinationsoptimierung entscheiden
Lassen Sie uns die Position der Feuerwehr durch Kombinationsoptimierung bestimmen
Quantifizieren Sie den Grad der Selbstbeherrschung, der erforderlich ist, um das neue Koronavirus einzudämmen
Fassen wir die Grundfunktionen von TensorFlow zusammen, indem wir ein neuronales Netzwerk erstellen, das XOR-Gatter lernt.
10. Zählen der Anzahl der Zeilen
Holen Sie sich die Anzahl der Ziffern
Lassen Sie uns die von der Präfektur Shimane veröffentlichten Daten zum Flusswasserstand visualisieren
[Python] Lassen Sie uns die Anzahl der Elemente im Ergebnis bei der Operation des Sets reduzieren
In Anbetracht der Situation in Japan durch den Statistiker Nate Silver: "Die Anzahl der mit Coronavirus infizierten Personen ist bedeutungslos."
Erstellen Sie einen Bot, der die Anzahl der Personen, die für das neue Corona-Virus in Tokio positiv sind, an Slack sendet