Ich habe auch mal etwas geplottet. Das wirklich clever und richtig zu machen, ist eine Wissenschaft für sich (und aus so Gründen gibt es ja auch Institutionen wie das RKI), aber ich schaue mir regelmäßig die Zahlen der
Berliner Morgenpost an, mag die Plots aber nicht so und habe mir deshalb ein paar eigene geschrieben.
Alle Plots sind Stand 3.4.2020, die Tage sind einfach durchnummeriert.
Heute hieß es vom RKI, dass die Maßnahmen Wirkung zeigen. Aber was bedeutet das, und wie sieht man das in den Daten? Zunächst die Infektionszahlen:
Die Balken sind die Tageswerte, orange steht für Wochenenden weil da mehrmals signifikant weniger Fälle gemeldet wurden als unter der Woche (sieht man später noch besser). Die rote Linie ist eine geglättete Darstellung der Tageswerte.
Hier sieht man am Anfang das exponentielle Wachstum. Es scheint irgendwie langsamer zu werden, aber so wirklich gut sieht es nicht aus.
Also schauen wir uns an, wie die Neuinfektionen pro Tag, also die erste Ableitung, aussieht:
Hier sieht man sehr schön die signifikant niedrigeren Zahlen der letzten beiden Wochenenden (orange). Der Anfang sieht nach wie vor exponentiell aus (zur Erinnerung: Alle Ableitungen einer Exponentialfunktion sind wieder eine Exponentialfunktion!) aber danach scheint der Trend eher linear zu sein. Der Plot sieht aber immer noch nicht wirklich Hoffnungsvoll aus. Also schauen wir uns auch noch die zweite Ableitung an:
(Hier zeige ich nur die geglätteten Daten, die ungeglätteten Werte haben einfach zu viel Rauschen um nützlich zu sein. Außerdem fiel mir kein besserer Name als 'Trend' ein.). Der Anfang ist wieder exponentiell (wie zu erwarten, wenn man von einem anfänglich wirklich exponentiellem Wachstum ausgeht), aber endlich sieht man eine Kurve, die sich tatsächlich irgendwann nach unten bewegt. Das sieht doch mal gut aus :)
Zur Interpretation: Optimal wäre es, wenn f auf 0 wäre (=> es gibt kein Corona). Aber da f die kumulativen Infektionen zeigt, kann f nur wachsen (Leute die gesund werden, werden nicht wieder abgezogen). Wenn f' auf 0 fallen würde bedeutet das, wir haben keine Neuinfektionen mehr. Menschen sind krank, aber werden wieder gesund und auch dann ist alles gut. Wenn f'' auf 0 fällt, bedeutet das, dass das wir jeden Tag die selbe Menge an Neuinfektionen hätten. Klingt erstmal nicht so toll, aber wenn wir diesen Punkt erreichen bevor die Krankenhäuser überlastet sind, hätten sie eine konstant hohe (aber erträgliche Auslastung) und wir würden halbwegs gut durch die Krise kommen. Die Eskalation wäre gestoppt. Insofern kann man also schon hoffnungsvoll sein, sobald der letzte Plot auf oder unter 0 fällt. Alles darüber ist in jedem Fall inakzeptabel.
Wie erwähnt ist das alles arg vereinfacht, aber ich fand es ein sehr schönes Beispiel für die Interpretation höherer Ableitungen und warum diese wirklich wichtig sind. Wenn man sich nur den ersten Plot anschaut, versteht man einfach nicht, was passiert.
Hier noch der Python-Code für alle die mit den Plots rumspielen wollen:
Code: Alles auswählen
import matplotlib.pyplot as plt
import numpy as np
from scipy.ndimage import gaussian_filter
f = np.array([1, 4, 4, 5, 7, 8, 8, 10, 10, 10, 11, 12, 12, 12, 12, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 16, 19, 24, 53, 66, 117, 150, 188, 262, 400, 639, 795, 903, 1139, 1565, 1966, 2745, 3675, 4585, 5813, 7272, 9360, 12327, 15320, 19848, 22364, 24873, 29056, 32991, 37323, 43211, 49039, 54268, 58655, 66125, 70985, 77779, 84788])
h = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 7, 9, 10, 10, 11, 11, 11, 14, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 20, 27, 27, 48, 48, 48, 69, 73, 107, 117, 182, 241, 268, 453, 3290, 3547, 5678, 6932, 8481, 9291, 13500, 15826, 19175, 22440])
# just something to color weekends differently
c = (["C0"]*5 + ["C1"]*2)*100
#c = c[0:] # skip some elements to sync with beginning of data
#plt.figure()
#plt.plot(d)
#plt.plot(g)
plt.figure("total (f)")
plt.title("total (f)")
plt.bar(range(len(f)), f, color=c[:len(f)], alpha=0.7)
plt.plot(range(len(f)), gaussian_filter(f, sigma=2), color="r")
plt.figure("growth (f')")
plt.title("growth (f')")
diff = np.diff(f)
plt.bar(range(len(diff)), diff, color=c[1:len(f)], alpha=0.7)
plt.plot(range(len(diff)), gaussian_filter(diff, sigma=2), color="r")
plt.figure("trend (f'')")
plt.title("trend (f'')")
t = gaussian_filter(np.diff(gaussian_filter(diff, sigma=2)), sigma=2)
plt.plot(t, color="r")
plt.show()