COVID-19 Disease Spread Time Series in German Regions and Selected Countries

In early 2020 the SARS-CoV-2 virus (colloquially known as the coronavirus) spread across the globe and caused a pandemic of COVID-19 disease. This page displays a collection of daily updated charts of disease spread in German regions and in selected countries. The focus lies on displaying the data of the past and deriving trends for the near future. In order to compare data of different regions, the data is scaled by the regions' population. Charts are updated daily in the morning (UTC). Raw data and plot scripts are available in my GitHub repository.

Data sources

Feel free to drop me a message if you find a typo, bug or bigger issue. I am happy for inspirations for further analyses as well.

Stay safe, Torben

Table of Contents / Inhaltsverzeichnis

Further good information sources

Germany / Deutschland

Landkreise

Animation der Ausbreitung in den Landkreisen

Infizierte Verstorbene
de-districts-Cases_Last_Week_Per_Million.gif de-districts-Deaths_Last_Week_Per_Million.gif

Einheit: Neu-Infizierte bzw. Neu-Verstorbene pro Million Einwohner und pro Woche

Back to top

Landkreistabelle

06.05.2020: In Deutschland wurde als Richtwert für die Verschärfung von Maßnahmen der Grenzwert von 500 Neuinfektionen pro 1.000.000 Einwohnern in sieben Tagen in einem Stadt-/Landkreis festgelegt. Daher habe ich die Landkreistabelle nun nach diesem Wert in der Spalte "Infizierte pro Millionen Einwohner pro Woche" sortiert.

generated via Tabulator, raw data can be found here

Back to top

Interaktiver Landkreis Vergleich

Landkreise und Städte in obiger Tabelle auswählen.

y_Achse:
generated via eCharts, raw data can be found here

Back to top

Bundesländer

Darstellungen des Zeitverlaufs an COVID-19 Erkrankungen in den deutschen Bundesländern. Die Zahlen habe ich skaliert auf die Bevölkerung der Bundesländer, damit man diese miteinander vergleichen kann. Da die täglichen Zahlen stark schwanken und Wochenenden einen deutlichen Effekt auf diese Schwankungen haben, habe ich in den Darstellungen der Veränderung zum Vortrag 7-Tagesdifferenzen verwendet.

Bundesländer - Infektionen

cases-de-last_week-per-million.png cases-de-last_week-per-million-log.png
generated via Gnuplot plot-de-states-timeseries-joined, raw data can be found in de-state-XX.tsv

Bundesländer - Opfer

In den Darstellungen der Opferzahlen habe ich auf der rechten Seite Referenzwerte zu anderen Todesursachen angegeben, Quellen dazu siehe diese Tabelle unten. Hinweis: die Todeszahlen laufen den Infektionszahlen um ca. 3 Wochen hinterher. Im Median sterben Patienten 14 Tage nach den ersten Symptomen, die wiederrum etwa 3-5 Tage nach der Infektion auftreten.

Neu-Verstorbene pro 7 Tage
deaths-de-last_week-per-million.png deaths-de-last_week-per-million-log.png

Fazit vom 24.04.2020:

Gesamtzahl der Opfer
deaths-de-per-million.png deaths-de-per-million-log.png

generated via Gnuplot plot-de-states-timeseries-joined, raw data can be found in de-state-XX.tsv

Back to top

Weitere Auswertungen

Um wieviele Tage läuft die Opferzahl der Zahl der Infizierten hinterher?

In der folgenden Abbildung habe ich für Deutschland die Neu-Infizierten und die Neu-Verstorbenen aufgetragen. Die Kurve der Neu-Verstorbenen habe ich dann zeitlich verschoben um heraus zu finden, um wie viele Tage die Verstorbenen "nachlaufen". Anstatt von Tagessummen wurde die 7-Tage-Differenz verwendet um Wochenendeffekte auszuschließen.

shift-deaths-to-match-cases_DE_last-week.png

Ergebnis vom 27.04.2020: 14 Tage passen ziemlich gut. Somit ist anzunehmen, dass die Opferzahlen noch mindestens 14 Tage lang abnehmen werden. Für die Zeit von Infektion bis positiv getestet vergehen vermutlich nochmal 7 Tage, so dass wohl 3 Wochen zwischen Beginn einer Maßnahme und Sichtbarkeit dieser in den Opferzahlen liegen wird. Für die beste Übereinstimmung der Kurven habe ich die rechte Achse der Verstorbenen auf 4.2% der linken Achse skaliert. Beides habe ich "nach Auge" gemacht und keine Optimierungsroutine verwendet.

Analog lässt sich aus dem Zeitverlauf der Infektionen eine Prognose für die Opferzahl für die nächsten 14 Tage erstellen, die direkt mit der Auslastung der Krankenhäuser korrelieren sollte. Hier exemplarisch für Deutschland, Bundesland Bayern und Stadt Erlangen. Skaliert jeweils pro Millionen Einwohner.

forecasting-deaths-DE.png forecasting-deaths-BY.png forecasting-deaths-Erlangen.png
generated via Gnuplot plot-de-shift-deaths-to-match-cases.gp, raw data can be found in de-state-DE-total.tsv

Back to top

Wie hoch ist die Dunkelziffer der Infizierten im Vergleich zu den offiziellen Fallzahlen?

04.04.2020: In der letzten Woche habe ich immer mehr Stimmen gehört und gelesen, die den offiziellen Zahlen nicht trauen. Höhepunkt war, dass ein Dresdner Freund, der positiv auf COVID-19 getestet wurde, berichtete, dass von seinen Kontakten der letzten 2 Wochen (vor der Ausgangssperre) keiner einen Test bewilligt bekam. Dies ist vermutlich in der ausgereizten Testkapazität der Labore begründet. Daher habe ich mal versucht eine Abschätzung der Dunkelziffer (=Differenz zwischen der Gesamtzahl der Infizierten und den positiv getesteten Personen) zu treffen.

Folgende sehr vereinfachte grobe Annahmen (Inspiriert von diesem Artikel, Abschnitt "Washington State") habe ich getroffen:

Damit lässt sich die Gesamtzahl der Infizierten vor 2 Wochen rückwärts berechnen aus 100x (Kehrwert von 1%) die Zahl der heute Verstorbenen. Diese Rechnung lässt such nun für jeden Tag X durchführen: Zahl der Toten am Tag X mal 100 zugeordnet zum Tag X-14. Daraus lässt sich auf die Gesamtzahl der heute infizierten Personen über eine Regressionsanalyse/Fit der Daten (mehr dazu unten) extrapolieren. Graphisch sieht dies wie folgt aus:

calc-cases-from-deaths-DE-total.png
generated via Gnuplot plot-de-calc-deaths.gp, raw data can be found in de-state-DE-total.tsv

Anmerkung zu den Annahmen: Die Sterblichkeit ist vermutlich geringer als die angenommenen 1%. Es dauert wohl üblicherweise eher 3-4 Wochen von Infektion bis zum Tode, nicht wie von mir gerechnet nur 2 Wochen. Beide Effekte wirken sich vergrößernd auf die Dunkelziffer aus.

Update vom 18.04.2020: Spiegel Online zitiert in diesem Artikel Thomas Fenner mit der Schätzung, dass 1,9% der Deutschen Bevölkerung bereits von Covid-19 infiziert waren. Meine grobe Abschätzung lieferte an diesem Tag 1.5%, was überraschend dicht dran ist. (Am 04.05.2020 ist diese meine Abschätzung auf 1.1% gesunken. Ursache ist die starke Reduktion des exponentiellen Wachstums, durch die erfolgreichen Lockdown Maßnahmen in der Zwischenzeit.

Mein persönliches Fazit aus dieser sehr groben Abschätzung ist, dass die Dunkelziffer recht groß zu sein scheint und aufgrund der beschränkten Testkapazität in Zukunft wohl weiter zunehmen wird. Dies bewirkt in den Grafiken und Auswertungen eine stärkere Zunahme der berechneten Verdopplungszeit als es in der Realität der Fall sein sollte. Die wirkliche Verdopplungszeit ist daher vermutlich kürzer als von mir unten pro Bundesland ermittelt. Für meine internationalen Vergleiche habe ich mich ausschließlich auf die Opferzahlen gestützt, diese halte ich weiterhin für belastbar. Die folgenden Kapitel belasse ich trotzdem online, so kann jeder Leser selber entscheiden welche Schlüsse er aus den Daten zieht.

Nun folgen noch drei Beispiele die die Idee hinter meiner groben Abschätzung verdeutlichen sollen, da es berechtigte Kritik an der ersten Fassung dieses Abschnitts gab.

Beispiel 1: Eine Insel mit 1000 Einwohnern von denen bisher keiner infiziert war.
Wenn alle 1000 Einwohner am gleichen Tag, zB 1.1.2020 infiziert, sollten nach 14 Tagen (15.01.2020) unter den obigen Annahmen statistisch gemittelt 10 Personen verstorben sein. Werden auf dieser Insel keine Tests durchgeführt, so ist die Zahl der positiv getesteten Personen = 0 und die Dunkelziffer = Gesamtzahl = 1000. 14 Tage später (15.01.2020) sind nun 10 Menschen tot. Wendet man obiges einfaches Model auf die Zahl der 10 Verstorben an: Multiplikation der Anzahl mit dem Kehrwert von 1% und verschieben um 14 Tage in die Vergangenheit, so ergibt sich rückwärts die Gesamtzahl von 1000 Infizierten für den 01.01.2020. Die Zahl der bekannten Infizierten (Hellfeld) war die ganze Zeit = 0. Die Zahl der Verstorbenen ist bis zum 14.01. = 0, dann steigt sie auf 10 und bleibt bei diesem Wert, da die Pandemie auf der Insel vorbei ist.

Beispiel 2: Eine Insel mit 1000 Einwohnern von denen bisher keiner infiziert war, auf der aber getestet wird.
Ergebnis ist das gleiche, mit dem Unterschied, dass die Zahl der positiv getesteten Personen ungleich 0 ist, was aber nicht die Abschätzung einfließt.

Beispiel 3: Eine Insel mit 16000 Einwohnern von denen bisher keiner infiziert war.
Werden nun 1000 am 01.01.2020 infiziert, so werden am 15.01. immer noch 10 sterben. Am 15.01. lässt sich daher wie oben beschrieben auf die Gesamtzahl von 1000 am 01.01. schließen. Allerdings werden weiter Menschen infiziert. Nehmen wir z.B. exemplarisch eine Verdopplungszeit von 7 Tagen an, so ist am 8.01. eine Gesamtzahl von 2000 Personen infiziert, am 15.01. dann 4000. Somit ist die Gesamtzahl der Infizierten am 15.01. größer als 1000, was zur Folge hat, dass an den Folgetagen weitere Menschen sterben werden. Am 15.01. sind 4000 infiziert (Verstorbene mitgezählt) aber nur 10 verstorben. Würde man am 15.01. großangelegte Tests durchführen, so würde man im Idealfall alle 4000 infizierten Personen bestimmen und die Dunkelziffer wäre 0. Bestimmt man an diesem Tag die Sterblichkeit, so würde man am 15.01.2020 10 Tote auf 4000 Infizierte = 0.25% finden, was der Eingangsgröße/Annahme widerspricht. Wartet man allerdings weiteren 2 Verdopplungszeiten ab, so sind am 29.01. alle 16000 Einwohner infiziert. Wartet man nochmal 2 Wochen, bis die unglücklichen schweren Fälle verstorben sind, so findet man dann dass von den 16000 Einwohnern 160 verstorben sind, und die Sterblichkeit ist wie erwartet 1%. Dies verdeutlicht, dass die Sterblichkeit erst korrekt ermittelt werden kann, wenn das exponentielle Wachstum vorbei ist.

Zeitverlauf der Ausbreitung in den Bundesländern

Update vom 04.04.2020: Wie hier beschrieben, halte ich es mittlerweile für riskant zuviel in die Daten der positiv getesteten Fälle zu interpretieren. Für meine internationalen Vergleiche habe ich mich ausschließlich auf die Opferzahlen gestützt, diese halte ich für belastbarer. Die folgenden Kapitel belasse ich trotzdem online.

Die erste Grafik die ich erstellt habe, zeigt den Zeitverlauf der offiziell gemeldeten positiv getesteten Infektionsfälle in den Bundesländern. Dazu habe ich die Daten zunächst normal (mit einer linearen Y-Achse) aufgetragen, wie man dies überall findet. Als nächstes habe ich die y-Achse logarithmisch skaliert, was bedeutet jede Hilfslinie entspricht einem Faktor 10. Der Vorteil diese Darstellung ist, dass man große Wertebereiche darstellen kann. Ferner hat diese Darstellung die Eigenschaft, das exponentielle Zusammenhänge zu einer Geraden werden, deren Steigung die Wachstumsrate beschreibt, was hier sehr gut zu erkennen ist.

cases-de-absolute.png cases-de-absolute-log.png
generated via Gnuplot plot-de-states-timeseries-joined, raw data can be found in de-state-XX.tsv

Back to top

Zeitverlauf der Ausbreitung in den Bundesländern, skaliert auf deren Einwohnerzahlen

Ich halte es für irreführend die Absolutzahlen der Infektionen der unterschiedlich stark bevölkerten Bundesländer miteinander zu vergleichen. Stattdessen bevorzuge ich eine Skalierung pro Einwohner der Bundesländer. Die Daten im Folgenden sind auf "pro 1 Millionen Einwohner" skaliert, abermals zuerst mit linearer und anschließend mit logarithmischer Y-Achse.

cases-de-per-million.png cases-de-per-million.png
generated via Gnuplot plot-de-states-timeseries-joined, raw data can be found in de-state-XX.tsv

Back to top

Zeitverlauf der Neu-Infektionen in den Bundesländern, skaliert auf deren Einwohnerzahlen

Nun eine ähnliche Darstellung, allerdings der täglich neuen Fälle anstatt der Summe. Diese Daten habe ich (mit einer Bézierkurve) geglättet.

cases-de-new-per-million.png cases-de-new-per-million-log.png

Als alternative Darstellung nun die Neu-Infektionen als eine gleitenden Summe über 7 Tage. So werden Wochenendeffekte heraus gemittelt.

cases-de-last_week-per-million.png cases-de-last_week-per-million-log.png
generated via Gnuplot plot-de-states-timeseries-joined, raw data can be found in de-state-XX.tsv

Eine ähnliche Darstellung für die Opferzahlen ist oben zu finden.

Back to top

Ist-Stand der Infektionen in den Bundesländern, skaliert auf deren Einwohnerzahlen

cases-de-states-latest-per-million.png
generated via Gnuplot plot-de.gp, raw data can be found in de-states-latest.tsv

Erkenntnisse

Back to top

Untersuchung der exponentiellen Zunahme der Infektionen in Deutschland

Achtung: nun wird es etwas mathematisch...
Zur Untersuchung der Zunahme der Infektionen habe ich die Daten mit einer exponentiellen Wachstumsfunktion "gefittet" (angenähert über eine Regressionsanalyse). Dabei werden 2 Parameter so ermittelt, dass die Wachstumsfunktion zu einer optimalen Übereinstimmung mit den Daten kommt. Aus den so ermittelten Werten der Parameter lassen sich dann Aussagen zum Wachstum treffen. Dabei verwende ich für den Fit nur die Daten der letzten 7 Tage um die ergriffenen Maßnahmen besser zu berücksichtigen.

Exponentielle Wachstumsfunktion:
f(x) = a · exp(b · x)
mit a: Skalierungsfaktor/Wert zum Zeitpunkt (x = 0 = heute)
und b: Parameter der das Wachstum beschreibt

Daraus lässt sich nun die "Verdopplungszeit" T berechnet über:
f(T) = 2 · f(x=0)
→ a · exp (b · T) = 2 · a
→ T = ln (2) ÷ b
Anmerkung: Die Verdopplungszeit t ist unabhängig vom Skalierungsfaktor a. Daher ist es für die Bestimmung der Verdopplungszeit nicht notwendig die Daten auf die Bevölkerung zu skalieren.

Diese Prozedur habe ich für jeder Tag auf der x-Achse wiederholt um einen Zeitverlauf der Verdopplungszeit zu bestimmen.

So, genug der Theorie, nun zu den Ergebnissen. Zunächst für die Infektionsfälle in Deutschland, weiter unten pro Bundesland.

cases-de-fit-DE-total.png cases-de-fit-DE-total-log.png
generated via Gnuplot plot-de.gp, raw data can be found in de-state-DE-total.tsv

Erkenntnisse

Back to top

Vergleich der Bundesländer

Die im vorherigen Abschnitt beschriebene Methode habe ich auf die Infektionsdaten der einzelnen Bundesländer angewandt und möchte zunächst das Ergebnis der Fits/Regressionsanalyse vorwegnehmen.

cases-de-fit-increase-1-day.png cases-de-fit-doubling-time.png
generated via Gnuplot plot-de.gp, raw data can be found in cases-de-gnuplot-fit.tsv

Detailauswertung pro Bundesland

Im Folgenden habe ich aus Platzgründen auf die lineare Darstellung der Daten verzichten und zeige nur die logarithmisch skalierten Daten pro Bundesland.

Back to top

Comparing Countries

COVID-19 Outbreak World Map Total Deaths per Capita
Map Deaths per Capita, borrowed from Wikipedia.

My Data Source: the .json file provided by github.com/pomber/covid19, based on data provided by Johns Hopkins University Center for Systems Science and Engineering (JHU CSSE)

As the number of infections strongly depend upon the test coverage, this number is hardly comparable between countries. The number of deaths due to COVID-19 is more reliably, so I used this to compare the disease spread in different countries.

Back to top

Country Table

Click on a row to add it to the country comparison chart below.

generated via Tabulator, raw data can be found in countries-latest-all.tsv / countries-latest-all.json

Back to top

Country comparison custom chart

Usage hints

Nomenclature

1. Select countries

Africa Asia Europe North America South America Oceania  

2. Select data

y axis:  

3. Chart

generated via eCharts, raw data can be found in country-XX.tsv / .json
Many thanks to Attila for code review, cleanup and implementation of the first version of the select data logic!

If you like this chart, please share it on your social form of choice, using this direct link, or my announcements on Twitter, LinkedIn or Xing. All data and sources are open source and can be found at my GitHub repository.

Back to top

Deaths per Country

The first set of plots shows the current death toll of different counties. I think that the number of deaths are a more reliably measure for comparison of countries, since the number of reported infections strongly depends upon the testing and hence are not comparable.

countries-latest-selected-deaths.png countries-latest-selected-deaths-log.png
generated via Gnuplot plot-countries.gp, raw data can be found in countries-latest-selected.tsv

Let us now scale the absolute numbers by the population of the countries, to make them comparable.

countries-latest-selected-deaths-per-mill.png countries-latest-selected-deaths-per-mill-log.png
generated via Gnuplot plot-countries.gp, raw data can be found in countries-latest-selected.tsv

See table below for reference data: deaths by other causes

Back to top

How did the death toll develop in different countries?

Let us now take a look into the recent past. In the following set of plots, I moved the time (x) axis the time when a given country reported 2 death cases. This allows for comparing the spreading in the countries. First using absolute values.

countries-timeshifted-absolute.png countries-timeshifted-absolute-log.png
generated via Gnuplot plot-countries-timeshifted.gp, raw data can be found in countries-timeseries-XX.tsv

Now again re-scaled to the population of the countries, to make them comparable.

countries-timeshifted-per-million.png countries-timeshifted-per-million-log.png

Now a similar chart, but using new deaths per million population as y-axes. I decided to use the delta of the last 7 days, instead the daily values, since there are strong weekend and other effects present, leading to wrong conclusions. The 7 days delta data is much more reliable.

countries-timeshifted-last_week-per-million.png countries-timeshifted-last_week-per-million-log.png

generated via Gnuplot plot-countries-timeshifted.gp, raw data can be found in countries-timeseries-XX.tsv

Back to top

Findings

See reference table for the numbers used.

Back to top

Reference data: deaths by other causes per year.

Cause Deaths Deaths per Million
DE: HIV deaths 2018 440 5
DE: drug overdose 2019 1398 17
DE: traffic deaths 2018 3265 39
DE: suicides 2017 9235 111
DE: flu 2017/18 (estimated) 25100 302
DE: cancer 2017 227590 2741
DE: total death rate 2018 954874 11502
US: 9/11 2977 9
US: gun deaths 2017 14542 44
US: flu 2018/19 (estimated) 34200 104
US: traffic deaths 2018 36560 111
US: suicides 2018 48344 147
US: drug overdose 2018 67367 205

Back to top

Time series, Doubling time calculation and forecast for selected countries

Now comes the math part...
As we saw above, the death toll growths exponentially with time for most countries. This can be "fitted" (=performing regression analysis) by scaling a model function for exponential growth to fit the data. From this fitting/scaling we can obtain information about the growth rate. I restricted the fit to data of the last 7 days to take recent actions into account and to obtain a more reliable forecast.

Model used for fitting of data:
f(x) = a · exp(b · x)
where a is the value at x=0 (here I chose 0 to be the date of the latest reported data)
and b defines the rate of increase.

From b we can derive the time it take to reach a duplication of the value as x=0, the so called the doubling time T:
f(T) = 2 · f(x=0)
→ a · exp (b · T) = 2 · a
→ T = ln (2) ÷ b
Note: the doubling time T is independant of the scaling factor a. Therefore, it is save to use data of absolute numbers in the fitting without the need to re-scale by the population.

I repeated this procedure for each day on the x-axis to derive a trend for the doubling time.

Back to top

Duplications until hitting Italy's deaths per capita

As Italy is very badly hit, I decided to calculate how many duplications of deaths tool other countries are "away" from their situation. The result is a kind of time scale, showing if you have much or little time to prepare.

countries-duplications-until-IT-level-of-deaths.png
generated via Gnuplot plot-countries.gp, raw data can be found in countries-latest-selected.tsv

Findings

Back to top

Investigating the Calculated Case Mortality: Deaths per Reported Infections

Different countries put different effort in testing the population for COVID-19. Hence, some have rather high death toll despite a rather low reported cases. The ratio between the two will be called "calculated case mortality" in the following. The calculated case mortality is of cause highly related to the test effort: more testing results in more reported cases and hence a lower calculated mortality. If on the other hand the clinics are overrun, this will result in an increase in mortality, as the docs are unable to heal all patients. Countries that show a strongly exponentially increasing death toll (short doubling time) will have a lower calculated mortality than the true value. Here a plots of this value for different countries.

countries-deaths-per-infections.png
generated via Gnuplot plot-countries.gp, raw data can be found in countries-latest_selected.tsv

Findings

Let us now compare the calculated case mortality to the deaths per capita

countries-mortality-vs-deaths-ppm.png
generated via Gnuplot plot-countries.gp, raw data can be found in countries-latest_selected.tsv

Findings


Home - Contact - Impressum