[PYTHON] [Einführung in das logarithmische Diagramm] Prognostizieren Sie die Endzeit jedes Landes anhand des logarithmischen Diagramms der Infektionszahldaten ♬

Dieses Mal werden wir den Zeitpunkt der Spitzeninfektion in jedem Land durch logarithmische Darstellung vorhersagen.

Was ich getan habe

・ Eine kleine Theorie ・ Prognose jedes Landes ・ Codeerklärung ・ Zusätzliche Theorie ・ Prognose jedes Landes II

・ Eine kleine Theorie

Letztes Mal wurde die folgende Gleichung abgeleitet.

I =  I_0\exp(\gamma (\frac{\beta}{\gamma} \frac{S}{N} - 1)t)\\

Wenn Sie den Logarithmus beider Seiten nehmen,

\ln I =  \ln I_0+\gamma (\frac{\beta}{\gamma} \frac{S}{N} - 1)t\\

Wird erhalten. Das heißt, wenn Sie ein Diagramm mit $ \ ln I $ auf der vertikalen Achse und der Zeit $ t $ auf der horizontalen Achse zeichnen, ist die Steigung

\gamma (\frac{\beta}{\gamma} \frac{S}{N} - 1)\\

Kann eine gerade Linie zeichnen. Hier hängt dieser Gradient von $ S $ ab und ist die Anzahl der nicht infizierten Personen, die mit der Zeit abnimmt. Und dieser Gradient kann wie folgt umgeschrieben werden, indem die zuletzt eingeführte effektive Reproduktionsnummer $ R $ verwendet wird.

\gamma (R - 1)\\
R = R_0 \frac{S}{N}\\
R_0 = \frac{\beta}{\gamma}\\

Daher wird dieser Gradient bei R = 1 zu 0, dh die Anzahl der Reproduktionen = 0, und da die Anzahl der infizierten Personen nicht mehr zunimmt, erreicht die Infektion einen Spitzenwert. Dieses Mal möchte ich basierend auf dieser Theorie die Daten jedes Landes in $ \ log I \ vs \ t $ darstellen und den Zeitpunkt der Spitzeninfektion in jedem Land anzeigen.

Außerdem können aus der ansteigenden Steigung $ S \ fallenddotseq N $ und $ \ gamma (R_0 -1) $ erhalten werden. Wenn man den mit diesem als Anfangswert erhaltenen Graphen anpasst, scheint es, dass $ \ gamma $, $ \ beta $, $ R_0 $ erhalten werden kann.

・ Prognose jedes Landes

・ Situation von Korea, Süd, Diamond Princess, Italien

Es mag misstrauisch erscheinen, dass Italien einbezogen wird, aber die Ergebnisse sind wie folgt: logmulti_Italy_.png Wenn Sie diese drei Länder nebeneinander betrachten, können Sie feststellen, dass sie sehr unterschiedlich sind. Das heißt, wenn die x- und y-Achse parallel bewegt werden, überlappen sie sich wahrscheinlich. Mit anderen Worten, Sie können sehen, dass es Bereiche mit derselben Neigung gibt. In jedem Diagramm sehen Sie ** einen Abschnitt, der sich in fast 10 Tagen 10-mal vergrößert **. Ja, DP wird wahrscheinlich zuerst die Infektionszählungskurve sättigen, dann Südkorea und dann Italien. Die Grafik unten zeigt die Steigung. Das heißt, wenn es 0 erreicht, bedeutet dies, dass es gesättigt ist. Sie können das Obige also aus dieser Grafik ersehen. Wenn ich über Italien spreche, wurde mir viel erzählt, aber ich denke, es wird in ungefähr 10 Tagen seinen Höhepunkt erreichen.

・ Situation der europäischen Länder

Das gleiche Diagramm wird für Spanien, Deutschland, die Schweiz, das Vereinigte Königreich und die Niederlande außer Italien angezeigt. logmulti_United Kingdom_.png Überlappend liegt England etwas zurück, aber die anderen haben ähnliche Kurven. Die vertikale Achse unterscheidet sich je nach Situation (Bevölkerung usw.), aber die Neigung ändert sich fast auf die gleiche Weise. Und wenn man sich das Diagramm der Steigung ansieht, scheint es, dass es innerhalb von ungefähr 2 Wochen insgesamt gesättigt sein wird **.

・ Ein etwas enttäuschendes Land

Auch die drei Länder Japan, Iran und Bahrain weisen in gewissem Sinne sehr ähnliche Kurven auf. logmulti_Bahrain_.png Da die Situation des Aufstehens anders ist, ist die y-Achse völlig anders, daher denke ich, dass die Situation des medizinischen Systems anders ist. Die Neigung nach dem Aufstehen ist jedoch ziemlich ähnlich, und obwohl der Iran und Japan in den letzten Tagen fast gesättigt waren, haben sie wieder zugenommen. Bahrain hat ebenfalls eine negative Neigung, ist aber wieder positiv geworden. Die Gradienten dieser drei Länder betragen ** 10-mal / 30 Tage. Dies ist ein sanfter Gradient, der nach seiner Stabilisierung jederzeit gesättigt zu sein scheint. Diese Länder sind immer noch infiziert und müssen in der gesamten Gesellschaft unter Spannungen stehen.

・ Gerüchtende amerikanische Situation

Ich habe versucht, Schweden und die USA auf die gleiche Weise zu planen. logmulti_Sweden_.png

Wie Sie auf einen Blick sehen können, ist der Anstieg ähnlich. Schweden hat jedoch eine kleinere Neigung von der Mitte. Betrachtet man jedoch das Diagramm der unteren Steigung, so ist es heutzutage fast parallel zur x-Achse und es sieht nicht so aus, als würde es in Richtung Null gehen. Mit anderen Worten, es scheint in naher Zukunft nicht zu sättigen. In den Vereinigten Staaten sind jedoch die Daten vom 58. bis zum 65. verfügbar, und es scheint, dass sich die Steigung schnell 0 nähert. Wenn Sie dies verlängern, können Sie sehen, dass ** die Möglichkeit besteht, dass die Infektion in etwa 10 Tagen ihren Höhepunkt erreicht **. Es ist ersichtlich, dass der maximale Gradient beider Länder etwa 25 Mal / 20 Tage beträgt, was größer ist als der vorherige Gradient.

・ Codeerklärung

Die zu verwendende Bibliothek und das Lesen der Daten sind dieselben wie beim letzten Mal. Die Anzahl der Todesdaten wird ebenfalls verarbeitet, jedoch gelöscht, da sie unten nicht verwendet werden.

import numpy as np
from scipy.integrate import odeint
from scipy.optimize import minimize
import matplotlib.pyplot as plt
import pandas as pd

#Lesen Sie CSV-Daten mit Pandas.
data = pd.read_csv('COVID-19/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv')
data_r = pd.read_csv('COVID-19/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_recovered_global.csv')

Unten gibt die Datenverarbeitungsfunktion die verarbeiteten Infektionsnummerndaten und Gradientendaten zurück.

def data_city(city):
    #Prozessdaten
    t_cases = 0
    t_recover = 0
    t_deaths = 0
    for i in range(0, len(data_r), 1):
        if (data_r.iloc[i][1] == city): #for country/region
        #if (data_r.iloc[i][0] == city):  #for province:/state  
            print(str(data_r.iloc[i][0]) + " of " + data_r.iloc[i][1])
            for day in range(4, len(data.columns), 1):            
                confirmed_r[day - 4] += data_r.iloc[i][day]
            t_recover += data_r.iloc[i][day]      
    for i in range(0, len(data), 1):
        if (data.iloc[i][1] == city): #for country/region
        #if (data.iloc[i][0] == city):  #for province:/state  
            print(str(data.iloc[i][0]) + " of " + data.iloc[i][1])
            for day in range(4, len(data.columns), 1):
                confirmed[day - 4] += data.iloc[i][day] -  confirmed_r[day - 4]
                diff_confirmed[day - 4] += confirmed[day-4] /  confirmed_r[day - 4]

    tl_confirmed = 0
    dlog_confirmed = [0] * (len(data.columns) - 4)
    dlog_confirmed[0]=np.log(confirmed[0])
    dlog_confirmed[1]=np.log(confirmed[1])-np.log(confirmed[0])
    for i in range(2, len(confirmed)-2, 1):
        if confirmed[i] > 0:
            dlog_confirmed[i]=(np.log(confirmed[i+1])-np.log(confirmed[i-1]))/2
        else:
            continue
    tl_confirmed = confirmed[len(confirmed)-1] + confirmed_r[len(confirmed)-1] + confirmed_d[len(confirmed)-1]
    t_cases = tl_confirmed
            
    return confirmed, dlog_confirmed       

Im Folgenden werden mehrere Länder in demselben Diagramm dargestellt. Geben Sie das Land, das Sie zeichnen möchten, in city_list ein. Verwenden Sie die obige Datenverarbeitungsfunktion, um die Infektionsnummer-Daten und ihren Eins-zu-Eins-Gradienten abzurufen. Zeichne das. Daher ist fig, (ax1, ax2) =. .. .. Die Definition von wird außerhalb der for-Anweisung definiert. Zum Schluss werde ich sie alle zusammen anzeigen. Ich wage es nicht, Farbe zu definieren, aber sie wird automatisch ausgewählt.

city_list={ "Spain","Germany","Switzerland","United Kingdom", "Netherlands" }
fig, (ax1,ax2) = plt.subplots(2,1,figsize=(1.6180 * 4, 4*2))
for city in city_list:
    confirmed = [0] * (len(data.columns) - 4)
    confirmed_r = [0] * (len(data_r.columns) - 4)
    confirmed_d = [0] * (len(data_d.columns) - 4)
    diff_confirmed = [0] * (len(data.columns) - 4)
    days_from_22_Jan_20 = np.arange(0, len(data.columns) - 4, 1)
    days_from_22_Jan_20_ = np.arange(0, len(data.columns) - 4, 1)
    recovered_rate = [0] * (len(data_r.columns) - 4)
    deaths_rate = [0] * (len(data_d.columns) - 4)
    
    confirmed, dlog_confirmed = data_city(city)
    #Matplotlib-Zeichnung
    lns1=ax1.semilogy(days_from_22_Jan_20, confirmed, ".-", label = str(city))
    lns4=ax2.plot(days_from_22_Jan_20_, dlog_confirmed, ".-",label = str(city))

ax1.set_xlabel("days from 22, Jan, 2020")
ax1.set_ylabel("casas ")
ax2.set_ylabel("slopes ")
ax1.legend(loc=0)
ax2.legend(loc=0)
ax1.grid()
ax2.grid()

plt.pause(1)
plt.savefig('./fig/logmulti_{}_.png'.format(city)) 
plt.close()

・ Zusätzliche Theorie

Tatsächlich kann man sich vorstellen, dass der Übergang der Heilungszahlkurve der Infektionszahlkurve ähnlich ist, obwohl es eine Verzögerung bei der Genesung gibt. Also habe ich versucht, unten darüber zu sprechen. Erstens ergibt das Einsetzen von $ I $ in die dritte Gleichung des SIR-Modells Folgendes.

\frac{dr}{dt} =  \gamma I_0\exp(\gamma (R - 1)t) \\

Daher, wenn Sie den Logarithmus beider Seiten nehmen

\ln (\frac{dr}{dt}) =  \ln \gamma + \ln I_0 + \gamma (R - 1)t \\
r =  \frac{I_0}{(R-1)}\exp(\gamma (R - 1)t) + r_0\\
\ln r =  \ln I_0 -\ln (R-1) + \gamma (R - 1)t +\ln r_0

Dies scheint jedoch aufgrund des großen Fehlers schwierig zu handhaben zu sein, daher werde ich es ein wenig ändern. Das heißt, wenn R ständig integriert ist (obwohl nicht analytisch korrekt), wird die folgende Gleichung erhalten. Daher kann geschrieben werden, dass der Logarithmus beider Seiten genommen wird. Daher kann erwartet werden, dass eine Kurve, die nahezu parallel ist und einen anderen y-Abschnitt von $ -ln (R-1) + \ ln r_0 $ aufweist, im Vergleich zu der obigen Formel von $ \ ln I $ erhalten werden kann. ・ Prognose II jedes Landes ・ Situation von Wuhan

Eine schöne Kurve wurde wie unten gezeigt erhalten. Wie erwartet beginnen die Infektionszahlkurve und die Heilungszahlkurve parallel und schneiden sich nach dem Infektionszahlpeak. Gleichzeitig geht die Differenz zwischen den beiden Kurven ($ \ log (A / B) = \ log A- \ log B $) direkt durch $ 10 ^ 0 $. log_Hubei_.png

・ Situation in Italien

Beide Kurven sind parallel, und ich bin oben zu dem Schluss gekommen, dass die Anzahl der Infektionen wahrscheinlich in etwa 10 Tagen ihren Höhepunkt erreicht, aber danach scheinen sie sich nicht leicht zu schneiden. Danach wird angenommen, dass sie sich nähern und überschneiden, aber die Daten der Heilungszahl können verdächtig sein. log_Italy_.png

・ Die Situation in Spanien im Namen Europas

Beide Kurven nähern sich stetig und nach der höchsten Anzahl von Infektionen kreuzen sie sich und das Ende ist sichtbar. log_Spain_.png

・ Situation in Japan

In Japan nähern sich die beiden Kurven allmählich und der Unterschied geht in Richtung 0, aber der Unterschied hat sich aufgrund des jüngsten Anstiegs der Anzahl der Infektionen vergrößert. Wie oben können wir also den Schluss ziehen, dass die Ausbreitung der Infektion anhält und dass es notwendig ist, sie zu unterdrücken. log_Japan_.png

Zusammenfassung

・ Die Anzahl der Infektionen in jedem Land wurde logarithmisch aufgezeichnet und klassifiziert, und die Spitzenzeit jeder Infektion wurde vorhergesagt. ・ Durch gleichzeitiges Auftragen der Anzahl der Infektionen und der Anzahl der Heilungen wurde die Endzeit vorhergesagt.

・ Ich möchte jeden Tag die sich ändernde Situation verfolgen ・ Da die Theorie des zusätzlichen Teils verdächtig ist, werde ich sie etwas weiter organisieren und mit der Parameterbestimmung verbinden.

Recommended Posts

[Einführung in das logarithmische Diagramm] Prognostizieren Sie die Endzeit jedes Landes anhand des logarithmischen Diagramms der Infektionszahldaten ♬
[Einführung in matplotlib] Lesen Sie die Endzeit aus den COVID-19-Daten ♬
Von der Einführung von Pyethapp bis zur Vertragsabwicklung
Eine Einführung in die Datenanalyse mit Python - Um die Anzahl der Videoansichten zu erhöhen -
Die Geschichte des Kopierens von Daten von S3 auf Googles TeamDrive
[Einführung in das Modell für Infektionskrankheiten] Betrachten des logarithmischen Diagramms. .. .. Eine Woche ab "Es ist die zweite Welle"!
Lernen Sie Buchhaltungsdaten kennen und versuchen Sie, Konten aus dem Inhalt der Beschreibung vorherzusagen, wenn Sie Journale eingeben
Seaborn-Grundlagen für Anfänger ① Aggregiertes Diagramm der Anzahl der Daten (Countplot)
Von der Einführung von JUMAN ++ bis zur morphologischen Analyse von Japanisch mit Python
Ich möchte die Bevölkerung jedes Landes der Welt kennenlernen.
Mit ReportingAPI + Cloud-Funktionen können Sie die Anzahl der Besuche auf jeder Seite ermitteln
[Einführung in Data Scientist] Grundlagen der wissenschaftlichen Berechnung, Datenverarbeitung und Verwendung der Grafikzeichnungsbibliothek ♬ Umgebungskonstruktion
Zusammenfassung von vtkThreshold (von Zeit zu Zeit aktualisiert)
Ich habe versucht, die Anzahl der mit dem Coronavirus infizierten Personen unter Berücksichtigung der Auswirkung des Verzichts auf das Ausgehen vorherzusagen
Einführung in Scapy ① (Von der Installation bis zur Ausführung von Scapy)
[Einführung in Data Scientist] Grundlagen von Python ♬
[Python] Von der morphologischen Analyse von CSV-Daten bis zur CSV-Ausgabe und Diagrammanzeige [GiNZA]
Einführung in die statistische Modellierung für die Datenanalyse Erweiterung des Anwendungsbereichs von GLM
[Überprüfung] Nimmt levelDB Zeit zum Registrieren von Daten, wenn die Datenmenge zunimmt? ??
[Einführung in das Modell für Infektionskrankheiten] Betrachten des logarithmischen Diagramms. .. .. Es ist die zweite Welle! ??
Link zu den Datenpunkten des von jupyterlab & matplotlib erstellten Diagramms
[Einführung in Python] So erhalten Sie den Datenindex mit der for-Anweisung
Einführung in Deep Learning zum ersten Mal (Chainer) Japanische Zeichenerkennung Kapitel 4 [Verbesserung der Erkennungsgenauigkeit durch Erweiterung der Daten]
Zusammenfassung der gcc-Optionen (von Zeit zu Zeit aktualisiert)
Konvertieren Sie Daten mit Form (Anzahl der Daten, 1) in (Anzahl der Daten,) mit numpy.
Ändern Sie den Dezimalpunkt der Protokollierung von, nach.
[Einführung in cx_Oracle] (5.) Umgang mit japanischen Daten
Übergang von Baseball aus Daten gesehen
Die Geschichte vom Umzug von Pipenv zur Poesie
Lassen Sie uns die Konvergenzzeit anhand des globalen Trends der effektiven Reproduktionszahl des neuen Koronavirus untersuchen
Versuchen Sie, mit matplotlib aus den Daten von "Schedule-kun" eine Kampfaufzeichnungstabelle zu erstellen.
Zusammenfassung von Anfang bis Kapitel 1 der Einführung in Entwurfsmuster, die in der Java-Sprache gelernt wurden
[Python] Darstellung der Anzahl der Beschwerden von Lebensversicherungsunternehmen in einem Balkendiagramm
Ich wollte nur die Daten des gewünschten Datums und der gewünschten Uhrzeit mit Django extrahieren
So zählen Sie die Anzahl der Vorkommen jedes Elements in der Liste in Python mit der Gewichtung
Überprüfen Sie die Verarbeitungszeit und die Anzahl der Aufrufe für jeden Prozess mit Python (cProfile).
Es ist Zeit, ernsthaft über die Definition und die Fähigkeiten von Datenwissenschaftlern nachzudenken
Einführung in die KI-Erstellung mit Python! Teil 1 Ich habe versucht, die Nummer anhand des handgeschriebenen Zahlenbildes zu klassifizieren und vorherzusagen