3. feladat

Klasszikuis adatbeolvasás - I.

A data/ebola.txt file tartalmazza a 2014-es Ebola járvány fertőzöttségi és kumulatív (adott napig hányan haltak meg összesen) halálozási adatait.

  • Ábrázoljuk a file-ban szereplő összes országra külön-külön az elhalálozottak számát az idő függvényében!
  • A járványterjedések jó közelítéssel exponenciális függvényalakkal jellemezhatőek, azaz az alábbi függvény $$f(t)=A e^{\alpha t} $$ jól szokott illeni ezen adatokra. Átlagképzés és numerikus deriválás segítségével határozzuk meg az $A$ és $\alpha$ együtthatókat az összes elhalálozások számából! Mivel $$\frac{\mathrm{d}f}{\mathrm{d}t}=\alpha f(t)$$ ezért $\alpha$ a halálozási idősor és annak idő-deriváltjának hányadosának az átlagával közelíthető. Az $\alpha$ ráta ismeretében az $A$ eggyütható értékét becsüljük meg az adatsor utólsó napjához tartozó adatokból!
  • Ábrázoljuk a meghatározott paraméter értékek segítségével az $f(t)$ függvényt és az adatokat egyszerre!

Megoldás

Először betöltjük a szükséges csomagot

In [1]:
%pylab inline
Populating the interactive namespace from numpy and matplotlib

Eztután feldolgozzuk a fájlt:

In [2]:
with open("../data/ebola.txt") as f:
    adatok = list()                                # létrehozunk egy adatok táblázatot, amiben a forrásfájlhoz hasonló struktúrával elmentjük az adatokat
    for i in range(16):
        adatok += [list()]
    for sor in f:
        if sor[0] != "#":
            for i in range(len(adatok)):           # Mivel a forrásfájl oszlopaiban voltak az összetartozó adatok, ezeket rendezzük listába
                adatok[i] += [int(sor.split()[i])] # Az adatokat pedig int tipusként tároljuk

Majd ábrázoljuk az elhalálozásokat országonként

In [3]:
plot(adatok[0], adatok[2], label="Guinea")
plot(adatok[0], adatok[5], label="Libéria")
plot(adatok[0], adatok[8], label="Nigéria")
plot(adatok[0], adatok[11], label="Sierra Leone")
plot(adatok[0], adatok[14], label="Senegal")
xlabel("Napok", size=12)
ylabel("Elhalálozások", size=12)
title("Az ebolában elhalálozottak száma\naz idö függvényében", size = 18, y = 1.05)
legend(loc=0)
Out[3]:
<matplotlib.legend.Legend at 0x7fea8c154e10>

Ezek után az összes halálozást berakjuk egy tömbbe, majd lederiváljuk az idő függvényében. Ezt a numpy csomag diff() függvényének a segítségével tudjuk megtenni. Ezzel már ki tudjuk számolni a kért $\alpha$ és $A$ értékeket

In [4]:
halálozások = zeros(len(adatok[0]))
for i in range(len(adatok[0])):
    halálozások[i] = adatok[2][i] + adatok[5][i] + adatok[8][i] + adatok[11][i] + adatok[14][i]
dhal_dt = diff(halálozások)/diff(adatok[0])
alpha = mean(dhal_dt/halálozások[1:])
A = halálozások[-1] / exp(alpha * adatok[0][-1])

Végül pedig ábrázoljuk az adatokat, és a kapott függvényt.

In [5]:
plot(adatok[0], halálozások, "rx", label="adatok")
plot(adatok[0], A * exp(alpha * array(adatok[0])), label="illesztett görbe")
title("A halálozások számának\nilleszkedése az exponenciális görbéhez", size=18, y=1.05)
legend(loc=0)
xlabel("napok", size=12)
ylabel("elhalálozások száma", size=12)
Out[5]:
<matplotlib.text.Text at 0x7fea85a0c7f0>