[CovsirPhy] COVID-19 Python-Paket für die Datenanalyse: S-R-Trendanalyse

Introduction

Wir erstellen ein Python-Paket CovsirPhy, mit dem Sie COVID-19-Daten (z. B. die Anzahl der PCR-Positiven) einfach herunterladen und analysieren können.

Einführungsartikel:

** Dieses Mal möchten wir die S-R-Trendanalyse einführen (eine Analysemethode für Trends bei der Ausbreitung von Infektionen). ** ** **

Die englische Version des Dokuments lautet CovsirPhy: COVID-19-Analyse mit phasenabhängigen SIRs, [Kaggle: COVID-19-Daten mit SIR-Modell]( Weitere Informationen finden Sie unter https://www.kaggle.com/lisphilar/covid-19-data-with-sir-model.

1. Ausführungsumgebung

CovsirPhy kann mit der folgenden Methode installiert werden! Bitte verwenden Sie Python 3.7 oder höher oder Google Colaboratory.

--Stabile Version: pip install covsirphy --upgrade

import covsirphy as cs
cs.__version__
# '2.8.2'
Ausführungsumgebung
OS Windows Subsystem for Linux
Python version 3.8.5

Die Tabellen und Grafiken in diesem Artikel wurden mit Daten vom 11.09.2020 erstellt. Klicken Sie hier für den Code [^ 2], um die tatsächlichen Daten von COVID-19 Data Hub [^ 1] herunterzuladen:

data_loader = cs.DataLoader("input")
jhu_data = data_loader.jhu()
population_data = data_loader.population()

Die Anzahl der Infizierten in Japan unterscheidet sich vom Wert [^ 3] des Ministeriums für Gesundheit, Arbeit und Soziales HP. Es scheint, dass. Wenn Sie den Wert des Ministeriums für Gesundheit, Arbeit und Soziales verwenden möchten, laden Sie die Daten aus COVID-19-Datensatz in Japan mit dem folgenden Code herunter. Bitte ersetzen. Wenn zu diesem Zeitpunkt ImportError / ModuleNotFoundError: Anfragen und aiohttp auftreten, installieren Sie bitte by pip install request aiohttp (während der Ursachenuntersuchung sollten Anfragen in das abhängige Paket aufgenommen werden ...).

[^ 3]: Wenn die vom Ministerium für Gesundheit, Arbeit und Soziales festgelegte "Anzahl der Positiven", "Anzahl der entlassenen oder annullierten Personen" und "Anzahl der Todesfälle" als bestätigte Fälle behandelt, wiederhergestellt, wiederhergestellt und tödlich sind. ..

japan_data = data_loader.japan()
jhu_data.replace(japan_data)
# Citation -> str
print(japan_data.citation)

2. Überprüfen Sie die Daten

Bevor wir uns mit der Erläuterung der S-R-Trendanalyse befassen, betrachten wir die tatsächlichen Daten (japanische Daten als Beispiel) anhand von "Scenario.records ()".

snl = cs.Scenario(jhu_data, population_data, country="Japan")
#Wenn das Diagramm nicht angezeigt wird
snl.records(show_figure=False)
Date Confirmed Infected Fatal Recovered
209 2020-09-07 71856 7957 1363 62536
210 2020-09-08 72234 7575 1377 63282
211 2020-09-09 72726 7233 1393 64100
212 2020-09-10 73221 6980 1406 64835
213 2020-09-11 73901 6899 1412 65590
#Grafik anzeigen
# filename:Standardwert=None (Nicht als Bilddatei speichern)
_ = snl.records(filename=None)

records.jpg

3. Zweck der S-R-Trendanalyse

Beim Umgang mit Daten zu Infektionskrankheiten unter Verwendung simultaner normaler Differentialgleichungen wie dem SIR-Modell ist es üblich, eine Analyse unter einer der folgenden Annahmen durchzuführen.

Bei der Analyse von COVID-19 dachte ich jedoch, dass es notwendig sei, beide anzupassen, anstatt sie zu übernehmen.

Erstens hat bei diesem Ausbruch jedes Land und jeder Einzelne einige Maßnahmen ergriffen, um den Ausbruch ab etwa Februar und März 2020 zu kontrollieren, als sich die Infektion auf die Welt ausbreitete. Parameter wie die Infektionsrate schwanken von Zeit zu Zeit und können bis zum Ende nicht als konstant angenommen werden (klar aus den oben genannten tatsächlichen Daten und der Wellenform des SIR-F-Modells [^ 4]).

[^ 4]: [CovsirPhy] COVID-19 Python-Paket für die Datenanalyse: SIR-F-Modell

Wenn andererseits die Parameter jeden Tag schwanken, hängt die Analyse von jedem Wert der erfassten Daten ab. Insbesondere im Fall von COVID-19 ist es notwendig, die Umrisse der Epidemie anstelle der täglichen Daten zu erfassen, da das Inspektionssystem im Anfangsstadium nicht eingerichtet wurde und die Möglichkeit einer Infektiosität besteht, auch wenn kein Symptom vorliegt. Ich dachte.

Daher entschied sich CovsirPhy, beide Vorteile zu nutzen, indem die Parameter in Perioden unterteilt wurden, die konstant zu sein scheinen. Der "Zeitraum, in dem die Parameter konstant sind" wird als "Phase" bezeichnet. Vom Beginn bis zum Ende der Epidemie gibt es mehrere Phasen mit unterschiedlichen Parametern. Ich werde den Code in einem anderen Artikel schreiben, aber ich denke zum Beispiel, dass sich die Ausführungsreproduktionsnummer $ R_ {\ mathrm {t}} $ des SIR-F-Modells schrittweise ändert, wie in der Grafik gezeigt.

rt.jpg

Wie stellen Sie die Phase ein? Da die Berechnung der Parameter einige Zeit in Anspruch nimmt [^ 5], möchte ich den Verzweigungspunkt der Phase (das Datum, an dem sich der Wert des Parameters ändert) ermitteln, ohne die Parameter zu berechnen.

[^ 5]: Die parallele Berechnung von 10 Phasen und 8 CPUs dauert ca. 2 Minuten. Sie können auf die Analyse eines Landes warten, dies ist jedoch zeitaufwändig und schwierig, da die Daten täglich zunehmen und die Daten vieler Länder möglicherweise analysiert werden.

4. Wie es funktioniert

Mithilfe der S-R-Trendanalyse ist es möglich, den Wendepunkt der Phase aus dem Übergang der Anzahl der Anfälligkeitsinhaber $ S $ und der Anzahl der Wiederhersteller $ R $ zu ermitteln. Ich werde den Prozess auslassen, bis ich ihn gefunden habe, weil er lang sein wird, aber [Kaggle: COVID-19-Daten mit SIR-Modell, SR-Trendanalyse](https://www.kaggle.com/lisphilar/covid-19-data-with- Sir-Modell # SR-Trend-Analyse), beziehen Sie sich also bitte darauf.

In den simultanen normalen Differentialgleichungen des SIR-Modells [^ 6] und des SIR-F-Modells [^ 4] ist dies für $ S $ und $ R $ wie folgt.

[^ 6]: [CovsirPhy] COVID-19 Python-Paket für die Datenanalyse: SIR-Modell

\begin{align*}
& \frac{\mathrm{d}S}{\mathrm{d}T}= - N^{-1}\beta S I  \\
& \frac{\mathrm{d}R}{\mathrm{d}T}= \gamma I  \\
\end{align*}

Teilen wir $ \ frac {\ mathrm {d} S} {\ mathrm {d} T} $ durch $ \ frac {\ mathrm {d} R} {\ mathrm {d} T} $.

\begin{align*}
\cfrac{\mathrm{d}S}{\mathrm{d}R} &= - \cfrac{\beta}{N \gamma} S  \\
\end{align*}

Wenn Sie dies integrieren und als $ a = \ frac {\ beta} {N \ gamma} $ [^ 7] angeben,

[^ 7]: Pionier bei der Analyse von SR-Ebenen im SIR-Modell: Balkew, Teshome Mogessie, "Das SIR-Modell, wenn S (t) eine multiexponentielle Funktion ist." (2010) .Elektronische Thesen und Dissertationen.Papier 1747 .

S_{(R)} = N e^{-a R}

Teilen Sie beide Seiten logarithmisch

\log S_{(R)} = - a R + \log N

** Wenn die Parameter des Modells konstant sind, führt das Zeichnen eines Ein-Log-Diagramms mit der x-Achse als Anzahl der Wiederhersteller $ R $ und der y-Achse als Anzahl der Empfindlichkeitsinhaber $ S $ zu einer geraden Linie! ** ** **

(Grafik: Aus dem oben erwähnten Kaggle-Notizbuch der Unterschied in der Neigung der geraden Linie, wenn die Parameter geändert werden)

__results___208_0.png

5. Codebeispiel

Es kann in einer Zeile mit der Methode Scenario.trend () ausgeführt werden. Das einseitige S-R-Protokolldiagramm wird angezeigt. Die Phase heißt Anfangsphase (0. Phase), 1. Phase, 2. Phase, ... [^ 8].

[^ 8]: Verwandte Technologie: [Python] Natürliche Zahlen in Bestellungen konvertieren

# show_figure:Grafik anzeigen
# filename:Standardwert=None (Nicht als Bilddatei speichern)
snl.trend(show_figure=True, filename=None)

trend.jpg

Eine Liste der Start- und Enddaten für jede Phase kann im Datenrahmenformat mit der Methode "Scenario.summary ()" abgerufen werden.

snl.summary()
Type Start End Population
0th Past 06Feb2020 21Apr2020 126529100
1st Past 22Apr2020 03Jul2020 126529100
2nd Past 04Jul2020 23Jul2020 126529100
3rd Past 24Jul2020 31Jul2020 126529100
4th Past 01Aug2020 10Aug2020 126529100
5th Past 11Aug2020 21Aug2020 126529100
6th Past 22Aug2020 29Aug2020 126529100
7th Past 30Aug2020 11Sep2020 126529100

Da sich der Wert der Anzahl der Anfälligkeitsinhaber $ S $ in Abhängigkeit vom Wert der Gesamtbevölkerung ändert, wird er zusammen als wichtige Analysebedingung angezeigt. Obwohl in diesem Artikel nicht gezeigt, können die geschätzten Werte von Parametern mit der Methode "Scenario.summary ()" aufgelistet werden. Wenn es eine Phase gibt, für die die tatsächlichen Daten nicht registriert sind, lautet die Spalte "Typ" der entsprechenden Zeile "Zukunft".

Obwohl diesmal weggelassen, wird die obige Phaseneinstellung von "Scenario.add ()", "Scenario.combine ()", "Scenario.delete ()", "Scenario.separate ()", "Scenario.clear ()" durchgeführt. Es ist auch möglich zu bearbeiten.

6. Implementierung

Ich verwende das Ruptures-Paket, um die Anzahl der Verzweigungspunkte in Phase zu ermitteln und die Anzahl der Wiederhersteller zu berechnen, die die Verzweigungspunkte sein werden. Ich habe ursprünglich fbprophet verwendet, das als Zeitreihenanalysepaket bekannt ist, aber es gab ein Problem, dass die Anzahl der Verzweigungspunkte manuell festgelegt werden musste. Ilyass Tabial of Colaborator sagte mir [^ 9], und ich ermöglichte es, die Anzahl der Verzweigungspunkte mithilfe von Brüchen automatisch zu schätzen.

Ab covsirphy.ChangeFinder-Implementierungscode lauten die Hauptschritte wie folgt.

  1. Holen Sie sich die S- und R-Werte für jedes Datum
  2. Berechnen Sie log10 (S)
  3. Setzen Sie den Wert von log10 (S) für R = 1, 2, 3 .: Wenn er nicht in den Daten enthalten ist, geben Sie die Werte vorher und nachher ein.
  4. Stichproben zur Reduzierung des Rechenaufwands: Anzahl der Stichproben = Anzahl der Originaldaten
  5. Verwenden Sie das Ruptures-Paket, um die Menge der Punkte (R, log10 (S)) zu ermitteln, an denen sich log10 (S) in Bezug auf das Ausmaß der Änderung der Anzahl der Wiederhersteller erheblich ändert.
  6. Sortieren Sie log10 (S) des Satzes von Änderungspunkten mit den Originaldaten und ermitteln Sie das Datum jedes Änderungspunkts (ungefährer Wert, falls nicht in den Originaldaten. Log10 (S), da die Anzahl der bestätigten Fälle eine größere Abweichung als R aufweist. Es wurde benutzt)
  7. Berechnen Sie das Start- und Enddatum jeder Phase ab dem Änderungsdatum

Nachwort

Das nächste Mal werde ich erklären, wie die Parameter für jede Phase geschätzt werden.

Danke für deine harte Arbeit!

Recommended Posts

[CovsirPhy] COVID-19 Python-Paket für die Datenanalyse: S-R-Trendanalyse
[CovsirPhy] COVID-19 Python-Paket für die Datenanalyse: SIR-F-Modell
[CovsirPhy] COVID-19 Python-Paket für die Datenanalyse: SIR-Modell
[CovsirPhy] COVID-19 Python-Paket für die Datenanalyse: Parameterschätzung
[CovsirPhy] COVID-19 Python-Paket für die Datenanalyse: Szenarioanalyse (Parametervergleich)
Python für die Datenanalyse Kapitel 4
Python für die Datenanalyse Kapitel 2
Python für die Datenanalyse Kapitel 3
Vorverarbeitungsvorlage für die Datenanalyse (Python)
Python-Visualisierungstool für die Datenanalyse
Datenanalyse mit Python 2
Datenanalyse Übersicht Python
Python-Datenanalysevorlage
Datenanalyse mit Python
Lassen Sie uns Covid-19 (Corona) -Daten mit Python analysieren [Für Anfänger]
Datenanalyse zur Verbesserung von POG 1 ~ Web Scraping mit Python ~
Mein Python-Datenanalyse-Container
[Python] Hinweise zur Datenanalyse
Datenanalyse mit Python-Pandas
Tipps und Vorsichtsmaßnahmen bei der Datenanalyse
Twitter-Daten analysieren | Trendanalyse
[In kürzester Zeit verstehen] Python-Grundlagen für die Datenanalyse
Welches sollte ich für die Datenanalyse studieren, R oder Python?
<Python> Erstellen Sie einen Server für die Datenanalyse mit Jupyter Notebook
Python: Zeitreihenanalyse: Vorverarbeitung von Zeitreihendaten
Python-Kurs für datenwissenschaftlich-nützliche Techniken
Praxis der Datenanalyse durch Python und Pandas (Tokyo COVID-19 Data Edition)
Datenanalyse zur Verbesserung von POG 3 ~ Regressionsanalyse ~
Datenformatierung für Python / Farbdiagramme
Datenanalyse beginnend mit Python (Datenvisualisierung 1)
Datenanalyse beginnend mit Python (Datenvisualisierung 2)
Erstellen Sie ein USB-Boot-Ubuntu mit einer Python-Umgebung für die Datenanalyse
Python-E-Book-Zusammenfassung nützlich für die frei lesbare Datenanalyse
Programm zur Twitter-Trendanalyse (persönliches Memo)
Detaillierte Python-Techniken für die Datenformung (1)
[Python] Erste Datenanalyse / maschinelles Lernen (Kaggle)
Datenanalyse beginnend mit Python (Datenvorverarbeitung - maschinelles Lernen)
Verwendung von "deque" für Python-Daten
Detaillierte Python-Techniken für die Datenformung (2)
Ich habe ein Python-Datenanalysetraining aus der Ferne durchgeführt
Vorbereitung auf die von Python 3 Engineer zertifizierte Datenanalyseprüfung
JupyterLab Grundeinstellung 2 für die Datenanalyse (pip)
JupyterLab Basic Setup für die Datenanalyse (pip)
Datenanalyse in Python Zusammenfassung der Quellen, die Anfänger zuerst betrachten sollten
Datenanalyse zur Verbesserung von POG 2 ~ Analyse mit Jupiter-Notebook ~
Python-Vorlage, die eine Protokollanalyse mit explosiver Geschwindigkeit durchführt
Python3 Engineer Zertifizierungsdatenanalyse Test selbst erstellte Problemerfassung
Python 3 Engineer Zertifizierungsdatenanalyse Prüfung Pre-Exam Learning
Eine Einführung in die statistische Modellierung für die Datenanalyse
[Python] Datenanalyse, maschinelles Lernen (Kaggle) -Datenvorverarbeitung-
Verwendung von Datenanalysetools für Anfänger
Zeigen Sie FX (Forex) Daten Candle Stick in Python an
Datenanalyse in Python: Ein Hinweis zu line_profiler
[Python] Fluss vom Web-Scraping zur Datenanalyse
Aufgezeichnete Umgebung für die Datenanalyse mit Python
Astro: Häufig verwendete Python-Module / -Funktionen zur Analyse
[Von Zeit zu Zeit aktualisiert] Python-Memos, die häufig für die Datenanalyse verwendet werden [N-Division usw.]