Pozdrav svima.

U predzadnjem sam članku napisao i pojasnio nešto o vizualizaciji podataka korona (COVID-19) virusa.

Ovo je nastavak tog posta. Ali prvo, mala digresija.

Prepoznavanje korona virusa uz pomoć rendgena

U međuvremenu, objavio sam članak u kojem opisujem potencijalnu mogućnost korištenja rendgena u svrhu detekcija slučajeva COVID-19 virusa.

Bilo je i dobrih i loših reakcija na taj članak, iako sam bio jako oprezan s dobivenim rezultatom i pokušao pojasniti svoje vlastite sumnje u njih.

Čini mi se da ljudi baš ne pročitaju (cijeli?) članak, nego pročitaju samo odabrane dijelove i onda komentiraju te dijelove izvan konteksta. Čudno da nitko (još) nije potegao temu partizana i ustaša.

U međuvremenu su se slične ideje i izvedbe počele pojavljivati i na drugim portalima.

Istaknuo bi i pozitivne reakcije, gdje mi se jedna radiologinja javila preko Skype-a i pojasnila mi medicinsku stranu postignutih rezultata, kao i svoje sumnje da su rezultati pravilno interpretirani. Isto tako, spomenula je članak koji u mnogome dijeli njeno mišljenje u vezi sa mogućnostima AI u prepoznavanju COVID 19 pneumonije.

Moram priznati da nisam pohvatao sve što je govorila, ali moj zaključak je da je neuralna mreža naučila raspoznavati virusne i bakterijske upale pluća. To je ono što smo trebali i tražili, mišljenje osobe koja je stručna u svom području i koja je izdvojila svoje vrijeme da nam pojasni što je moguće vidjeti u snimkama i koji je realan rezultat. Ovim putem bi joj još jednom zahvalio, ali i omogućio da ostane anonimna.

Nakon takve procjene nekoga tko je stručan, zaustavili smo promociju članka. Iako, kako je više puta naglašeno, nismo promovirali niti preciznu dijagnostiku, niti lijek, već zanimljivost koju bi mogli istražiti i koja bi mogla imati korisne primjene.

Još uvijek bih volio sjesti s nekim radiologom, proći po slikama i pojasniti (sebi i drugima) zašto je neuralna mreža uspjela pronaći tako očite razlike u slikama. Poslali smo mail-ove na sve strane i tražili ljude da nam se jave, ali očito je situacija malo škakljiva i ljudi nemaju sada vremena.

Uvod

Moje ime je Kristijan Šarić i ja sam programer. Nisam stručnjak za viruse, nisam epidemiolog, ne smatram se stručnjakom ni u čemu, ali sam vjerojatno po nekim kategorijama “stručnjak za IT” (štogod to bilo).

Sve što napišem i pokažem ovdje nije mišljenje osobe koja je stručna za korona virus, nego je moj pokušaj da samome sebi objasnim što se to događa i kako se brzo taj virus širi (i to podijelim sa vama).

Isto tako, ljudi koji su uvjereni da bi trebali pustiti samo priznate stručnjake da se bave ovom situacijom, ne vide jedan ključan problem u takvom pristupu.

Mediji koji nisu savršeni, ponekada nisu objektivni, i nekada prenesu neprovjerenu informaciju.

Kao i pojedinci koji nisu dovoljno upućeni i šire priče kao da ako staviš kupus na lijevu nadlakticu ne možeš dobiti korona virus. Jedini problem je, jeli, što moraš šetati uokolo s kupusom na ruci.

Ovo je pokušaj da se situaciju objasni na temelju podataka i činjenica, i ne mogu naglasiti koliko mislim da je to bitno. Iako (uvijek!) postoji količina osobne interpretacije, fokus je na grafovima i podatcima koji stoje iza njih. 

Pozivam sve zainteresirane da se uključe, da koriste podatke i ove grafove za izvor informacija i da daju (zanimljive) ideje kako bi se ovo moglo poboljšati. Siguran sam da postoje ljudi koji mogu ovo napraviti puno bolje i koji znaju što rade, tako da ovo može nekome biti početna točka.

Svi mogu pokrenuti sve ovo što sam ja pokrenuo i dobiti će iste rezultate. Ako nađete neke greške, slobodno nam se javite.

Kao što sam obećao i zadnji put, sav sadržaj stavio sam otvoren i besplatan svima ovdje.

U ovom prvom blog postu, fokus je bio na vizualizaciji podataka, a u ovom postu pokušavam pojasniti kako ovaj rast napreduje i kakav je trend iza podataka. Napraviti jednostavnu regresija gdje možemo vidjeti kako sam virus napreduje i pretpostaviti kako će nastaviti napredovati.

Ova verzija jako je neprecizna i mislim da je ne treba uzimati za ozbiljno.

Imajte na umu da podatci koje koristimo malo kaskaju za potvrđenim podatcima ali su i isto tako možda malo točniji baš zbog toga.

Jesam zaboravio naglasiti da je ovo samo projekcija, a ne istina?

Korišteni podatci

Podatke koje smo koristili možete vidjeti ovdje.

Ovi podatci su sa “Johns Hopkins University Center for Systems Science and Engineering” ili kraće “Johns Hopkins CSSE”. Ažuriraju se na dnevnoj bazi.

U zadnjoj verziji su izmijenili format podataka i nazive datoteke, tako da zadnje podatke koje smo koristili su od 27.03.2020, dok notebook vizualizacije koristi starije podatke od 25.03.2020. Više informacija ovdje. Svaki dan kada se podatci ažuriraju, možete osvježiti podatke i dobiti nove vizualizacije.

Situacija u Hrvatskoj i okolici

Broj potvrđenih slučajeva kod nas:

Broj potvrđenih slučajeva sa zemljama s kojima graničimo:

Vidimo da Italija opet daleko dominira i da prema njoj sve ostale zemlje su ravna crta na dnu grafa. Da vidimo situaciju svih susjednih zemlja bez Italije:

Vidimo da Slovenija vodi, a Hrvatska i Srbija su tu negdje iza. 

Da vidimo situaciju kod nas kada je uvedena restrikcija:

Ovdje vidimo crvenom bojom dan kada je proglašena restrikcija (19.03.2020). Hajdemo pogledati situaciju u Italiji i kada je kod njih proglašena karantena:

Ako pogledamo situaciju kod nas gdje se možemo malo više fokusirati na dane kada je korona virus bio aktivniji kod nas:

Isto tako možemo pogledati i u Italiji:

Osim što su brojevi puno veći, vidimo da krivulja ide u istom smjeru. To je zanimljivo. Ali da bi uopće mogli početi razmišljati o tome kako će ova situaciju napredovati, bilo bi korisno imati što više podataka. Najviše podataka imamo u Kini, pošto je situacija od tamo krenula. Hajdemo se fokusirati na kratko na Kinu, gdje imamo najviše podataka i gdje postoje pokrajine koje su na dobrom putu da spriječe širenje virusa dalje.

Situacija u Kini

Što bi rekla moja nona, “oni usrani Kinezi šporki, sve su zarazili”. Ah, (nenamjerni?) rasizam je smiješan. Situacijama u pokrajinama u Kini je sljedeća:

Vidimo da Hubei daleko vodi i da bi možda bilo korisno kada bi pogledali graf bez te pokrajine:

Bilo bi lijepo kada bi mogli prikazati ovu situaciju na karti kako bi bilo malo jasnije gdje je to i koji je broj potvrđenih slučajeva. Evo situaciju u cijeloj Aziji:

Isto tako, možemo se malo više fokusirati na Kinu i pogledati situaciju tamo:

Fokusirajte se na promjenu boje a ne na veličinu kruga. Nećemo ovdje stavljati ali postoji lijepa animacija u notebook-u kako se broj potvrđenih slučajeva povećava.

 Nego, ako želimo pogledati kako virus napreduje moramo se fokusirati na pojedine pokrajine i pogledati što se tamo događa, i ono nama bitnije, što se tamo događalo. Pogledajmo četiri pokrajine s najvećim brojem zaraženih.

Kineske pokrajine

Kao prvo, te pokrajine koje ćemo pogledati su redom:

  1. Hubei
  2. Guangdong
  3. Henan
  4. Zhejiang

Pogledajmo koja je situacija u pokrajini Hubei:

Situacija u pokrajini Guangdong:

Situacija u pokrajini Henan:

Situacija u pokrajini Zhejiang:

Iako je broj potvrđenih slučajeva različit, iako su mjesta na kojima se virus pojavio različit, slike izgledaju jako slično. Postoji nekakve krivulja koja izgleda kao slovo S na svakom grafu. Zašto?

Pa to je puno bolje objašnjeno na ovom videu i ne želim previše ulaziti u detalje, ali mogu na jedan relativno jednostavan način pokušati objasniti.

Uzmimo jedan od ovih grafova.

Na Y osi (ovo gore-dolje) imamo broj potvrđenih slučajeva. Na X osi (ovo lijevo-desno) imamo broj dana u godini. Znači 01.01.2020 je prvi dan u godini, 15.01.2020 je petnaesti dan u godini i tako dalje.

Svaki dan imamo broj potvrđenih slučajeva, a zabrinjavajuće je vidjeti kako se svaki dan broj potvrđenih slučajeva povećava. Ta krivulja nikada ne padne na nulu, pošto nije da se broj potvrđenih slučajeva eliminira. Kada je slučaj potvrđen, graf skoči malo prema gore. I ostane gore. Problem ovdje je da se broj potvrđenih slučajeva počne povećavati. Ako to nastane, onda to možemo nazvati eksponencijalnim rastom i svaki dan imamo puno više novih slučajeva nego što smo imali.

Ono što bi bilo lijepo vidjeti je ravna crta koja traje duže vremena kako bi mogli reći – nemamo novozaraženih i situacija je stabilizirana.

Možemo vidjeti kako se količina potvrđenih slučajeva povećava do negdje 43. dana a vidljivo opadanje brojeva vidimo nakon proglašene karantene. 

Postoji jedna krivulja/funkcija koja lijepo opisuje ovakav rast. Ta funkcija zove se logistička funkcija. 

Ako je probamo uglaviti u ovu sliku, slika će izgledati ovako:

Vidimo narančastom bojom funkciju koja najbolje pokušava opisati podatke koje imamo, zajedno sa trenutnom projekcijom broja zaraženih.

Znači, pod pretpostavkom da situacija ostane stabilna, možemo pretpostaviti da bi broj zaraženih bio (pratimo plavu crtu na grafu) negdje malo ispod 70.000 ljudi. To govorimo samo za Hubei.

Crvenom bojom označen je današnji dan, a plave točke po grafu su pravi podatci koje imamo za potvrđene slučajeve. 

Idemo pokušati napraviti za ostale pokrajine. Pogledajmo pokrajinu Guangdog:

Vidimo opet krivulju narančastom bojom, crvenom crtom imamo trenutni dan a plavom procjenu koji bi bio maskimalni broj potvrđenih slučajeva.

Ali, obratimo pozornost na podatke koje smo dobili. Krivulja je negdje do 70. dana bila skoro ravna, ali je tamo malo prije 80. dana počela opet rasti. 

Broj potvrđenih slučajeva po ovoj funkciji ne bi trebao prijeći 1400, a već danas imamo broj veći od toga. Zašto? Zato što je ova funkcija aproksimacija, a ne predviđanje budućnosti.

Ali pogledamo situaciju dalje, pokrajina Henan:

Ovdje jednostavna regresija izgleda opet u redu.

Isto tako, pogledajmo pokrajina Zhejiang:

Ovdje opet vidimo da ova jednostavna regresija nije uspjela uhvatiti/aproksimirati broj potvrđenih slučajeva. Drugim riječima, ovo je jako grub način da nešto procijenimo.

E, sada, možemo pokušati napraviti isto i za druge zemlje, s time da će ovo biti još i manje točno.

Italija

Potvrđeni slučajevi:

Regresija:

Španjolska

Potvrđeni slučajevi:

Regresija:

Njemačka

Potvrđeni slučajevi:

Regresija:

Broj novozaraženih

Da bi možda situaciju malo lakše pokazali, možemo napraviti sljedeći prikaz. Umjesto da pokazujemo koliko imamo potvrđenih slučajeva, možemo pogledati koliko je svaki dan bilo novih slučajeva. 

Tada ćemo dobiti (nadamo se) nešto što liči normalnoj (Gaussovoj) krivulji. Na početku će biti malo ljudi, to će rasti dok ne dođemo do vrhunca broja potvrđenih slučajeva i onda počinje opadati dok broj novih potvrđenih slučajeva ne nestane.

Što je normalna krivulja?

To je nešto što izgleda kao zvono:

Pogledajmo kako izgleda situacija u Henanu u Kini (sada promatramo broj novih potvrđenih slučajeva):

Znači ako bi ovo pokušali aproksimirati normalnom funkcijom, dobili bi nešto ovako:

To bi mogli napraviti i za druge zemlje, ali ovo je prilično neprecizno. Nemamo nikakav interval sigurnosti, ne znamo točno s kojom sigurnošću možemo predvidjeti te vrijednosti.

Ono što možemo probati, ili mogu samo spomenuti kao ideju koju sam htio malo istražiti kada budem imao više vremena, jesu “Gaussovi procesi” (engl. “Gaussian process”). Ono što je zanimljivo s njima je to što nam mogu dati intervale sigurnosti, te su jako jednostavna aproksimacija funkcija koje ne počivaju na (kompliciranim?) modelima.

Interval sigurnosti i procjena bez modela

Trenutno možemo pokazati intervale sigurnosti. Pogledajmo ponovno Henan pokrajinu. Ovo su sami podatci:

Ovako izgleda procjena budućnosti i što će se zbivati s brojem novozaraženih. I ono što je nama bitno, interval sigurnosti u razmaku od dvije standardne devijacije:

Možemo to probati procijeniti i za druge zemlje. Kao primjer, uzmimo Njemačku za primjer:

Vidimo da predviđena funkcija nije najtočnija. Pretpostavlja da je broj novozaraženih na nuli s devijacijom između 3000 i -3000.

 Pogledajmo za Španjolsku:

Ali to nije čudno kada uzmemo u obzir da ovakva funkcija ne zna niti ne razumije ništa o virusu niti o epidemijama generalno – ona uzima hrpu podataka i pokušava na temelju njih stvoriti funkciju koja će tim podatcima odgovarati.

Ono što treba napraviti je (jednostavni?) model, ali za to treba puno vremena i stručnosti.

To definitivno nije nešto niti jednostavno niti brzo, a s ovime već udaram u svoj plafon što se tiče vremena.

Ali paket koji sam uključio, PyMC3, jako bi bio koristan ovdje, pogotovo jer bi mogli baratati s vjerojatnostima u modelu.

Zaključak

Možemo na temelju jednostavnih regresija dobiti okvirne brojke zaraženih i možemo, premda jako okvirno, procijeniti što se može dogoditi u budućnosti.

Algoritmi za opis podataka koji su korišteni ovdje nisu komplicirani, novi niti najbolji, fokus ovoga je bio jednostavnost prije svega – da li postoji jednostavni način da objasnimo kako se ovaj virus širi?

Svi napredniji algoritmi vjerojatno mogu dovesti do veće točnosti, ali često s time gubimo i mogućnost interpretacije tih istih rezultata.