Uuden koronaviruksen analysointi: COVID-19-tietojoukko

Kirjoittaja Loren Shure

Kun uuden koronaviruksen COVID-19-uhka leviää ympäri maailmaa, elämme yhä ahdistuneemmassa tilanteessa. Samalla kun terveydenhuollon työntekijät taistelevat viruksella etulinjassa, teemme omalta osaltamme harjoittamalla sosiaalista etääntymistä pandemian hidastamiseksi. Tämän päivän vierasbloggari Toshi Takeuchi haluaisi kertoa, kuinka hän viettää aikansa analysoimalla tietoja MATLABissa.

Vastuuvapauslauseke: tämä viesti EI OLE kelvollinen ja uskottava tietolähde COVID-19: lle, joka on vakava uhka, ja sinun on otettava yhteyttä valtuutettuihin lähteisiin saadaksesi tarkkoja tietoja, kuten WHO tai CDC.

Sisällys

  • COVID-19 -tietolähde
  • Vahvistettujen tapausten kartoittaminen globaalisti
  • Vahvistettujen tapausten kartoittaminen Yhdysvalloissa
  • Ranking maa / alue vahvistettujen tapausten perusteella
  • Vahvistettujen tapausten kasvu maittain / alueittain
  • Uusien tapausten kasvu maittain / alueittain
  • Tarkemmin Manner-Kiinassa
  • Käyrän asentaminen
  • Entä Etelä-Korea?
  • Yhteenveto

COVID-19 -tietolähde

Kun kuulemme uutta koronaviruksen COVID-19-uutisia päivä toisensa jälkeen ja alamme harjoittaa sosiaalista etääntymistä, minun piti löytää tapa rauhoittaa hermoani. Olenko ainoa, joka löytää MATLAB-tietoanalyysin meditatiiviseksi harjoitukseksi? Sitten miksi ei analysoida COVID-19, kysyin itseltäni.

Katsoin tiedostovaihtoa ja huomasin, että Kevin Chng teki tämän FileExchnage-ilmoituksen COVID-19: stä. Löysin myös Kagglesta Novel Corona Virus 2019 Dataset. Päätin käyttää Kagglen aineistoa.

Latasin zip-tiedoston Kagglesta ja siirrin sen sisällön nykyiseen työhakemistooni.

Tarkistetaan pakkaamattomat tiedostot. Huomaa, että "| 2019_nCoV_data.csv |" on vanhentunut, eikä meidän pitäisi käyttää sitä.

s = dir ("*. csv"); s = s (arrayfun (@ (x) ~ vastaavat (x.nimi, "2019_nCoV_data.csv"), s)); tiedostonimet = arrayfun (@ (x) merkkijono (x.nimi), s)
tiedostonimet = 6 × 1 merkkijono "COVID19_line_list_data.csv" "COVID19_open_line_list.csv" "covid_19_data.csv" "time_series_covid_19_confirmed.csv" "time_series_covid_19_deaths.csv" "time_series_covid
  • covid_19_data.csv - tämä on tärkein tiedosto - päivittäisen tason tiedot globaaleista tapauksista maakunnittain / osavaltioittain 22. tammikuuta 2020 alkaen
  • time_series_covid_19_confirmed.csv - vahvistettujen tapausten aikasarjatiedot
  • time_series_covid_19_deaths.csv - aikasarjatiedot kuolemien kumulatiivisesta määrästä
  • time_series_covid_19_reposed.csv - aikasarjatiedot palautettujen tapausten kumulatiivisesta määrästä
  • COVID19_line_list_data.csv - henkilökohtaiset tiedot
  • COVID19_open_line_list.csv - henkilökohtaiset tiedot

Vahvistettujen tapausten kartoittaminen globaalisti

Visualisoidaan vahvistettujen tapausten lukumäärä kartalla. Aloitamme lataamalla time_series_covid_19_confirmed.csv, joka sisältää kartoittamiseen tarvittavat leveys- ja pituusmuuttujat. Päätin myös pitää muuttujien nimet sellaisina kuin ne ovat, sen sijaan että anntaisin MATLABin muuntaa ne kelvollisiksi MATLAB-tunnisteiksi, koska jotkut sarakkeiden nimistä ovat päivämääriä.

opts = tuvastaImportOptions (tiedostonimet (4), "TextType", "merkkijono"); valinnat.VariableNamesLine = 1; valinnat.DataLines = [2, inf]; opts.PreserveVariableNames = true; times_conf = luettavissa (tiedostonimet (4), valinnat);

Aineisto sisältää maakunnan / osavaltion muuttujan, mutta haluamme yhdistää tiedot maan / alueen tasolla. Ennen kuin teemme niin, meidän on puhdistettava tiedot hiukan. Huomaa, että olen käyttänyt merkintää (), koska muuttujien nimet eivät ole kelvollisia MATLAB-tunnisteita.

Times_conf. ("Maa / alue") (times_conf. ("Maa / alue") == "Kiina") = "Manner-Kiina"; times_conf. ("Maa / alue") (times_conf. ("Maa / alue") == "Tšekki") = "Tšekin tasavalta"; Times_conf. ("Maa / alue") (times_conf. ("Maa / alue") == "Iran (Islamin tasavalta)") = "Iran"; Times_conf. ("Maa / alue") (times_conf. ("Maa / alue") == "Korean tasavalta") = "Etelä-Korea"; Times_conf. ("Maa / alue") (times_conf. ("Maa / alue") == "Moldovan tasavalta") = "Moldova"; times_conf. ("Maa / alue") (times_conf. ("Maa / alue") == "Venäjän federaatio") = "Venäjä"; Times_conf. ("Maa / alue") (times_conf. ("Maa / alue") == "Taipei ja sen ympäristö") = "Taiwan"; Times_conf. ("Maa / alue") (times_conf. ("Maa / alue") == "Taiwan *") = "Taiwan"; Times_conf. ("Maa / alue") (times_conf. ("Maa / alue") == "Iso-Britannia") = "UK"; Times_conf. ("Maa / alue") (times_conf. ("Maa / alue") == "Vietnam") = "Vietnam"; times_conf. ("Maa / alue") (times_conf. ("maakunta / osavaltio") == "St Martin") = "St Martin"; times_conf. ("Maa / alue") (times_conf. ("provinssi / osavaltio") == "Saint Barthelemy") = "Saint Barthelemy";

Nyt voimme käyttää ryhmätiivistelmää tietojen aggregointiin maittain / alueittain laskemalla yhteen vahvistetut tapaukset ja laskemalla keskimääräiset leveys- ja pituusasteet.

vars = times_conf.Kiinteistöjä.VariableNames; times_conf_country = ryhmätiedot (times_conf, "Maa / alue", {'summa', 'keskiarvo'}, varsit (3: loppu));

Tulos sisältää tarpeettomia sarakkeita, kuten leveys- ja pituusasteen summat tai vahvistettujen tapausten keskiarvot. Poistamme nämä muuttujat ja poistamme myös 'sum_' tai 'mean_' etuliitteet säilyttämistämme muuttujista.

vars = kertaa_konf_maakunta.Kiinteistöjä.VariableNames; vars = regexprep (vars, "^ (summa _) (? = L (a | o))", "poista_"); vars = regexprep (vars, "^ (keskiarvo _) (? = [0-9])", "poista_"); vars = poista (vars, {'summa _', 'keskiarvo_'}); times_conf_country.Properties.VariableNames = vars; times_conf_country = removevars (times_conf_country, [{'GroupCount'}, vars (sisältää (vars, "poista_"))]);

Koska Manner-Kiina on niin suhteettoman suuri, haluamme jättää sen visualisointimme ulkopuolelle.

times_conf_exChina = times_conf_country (times_conf_country. ("Maa / alue") ~ = "Manner-Kiina", :); vars = times_conf_exChina.Properties.VariableNames;

Käytämme geobubblea visualisoimaan tietojoukon ensimmäinen ja viimeinen päivämäärä. Koska numeeristen tietojen sarakkeiden nimet ovat päivämääriä, voin valita ensimmäisen päivämäärän ja viimeisen päivämäärän näyttääksesi kartat yhdessä. Huomaa, että geobubble näyttää kupla nolla-arvoille, ja siksi meidän on poistettava nolla-arvoiset rivit, jos emme halua näyttää kuplia nollatapauksissa.

kuva t = kaakeloitu välitys ("virtaus"); ii = [4, pituus (vars)) kertaa_conf_exChina.Category = kategorinen (repmat ("<100", korkeus (times_conf_exChina), 1)); times_conf_exChina.Category (table2array (times_conf_exChina (:, ii))> = 100) = "> = 100"; nexttile tbl = times_conf_exChina (:, [1: 3, ii, loppu]); tbl (tbl. (4) == 0, :) = []; gb = geobubble (tbl, "Lat", "pitkä", "SizeVariable", vars (ii), "ColorVariable", "Category"); gb.BubbleColorList = [1,0,1; 1,0,0]; gb.LegendVisible = "pois"; gb.Title = "Alkaen" + vars (ii); gb.SizeLimits = [0, max (times_conf_exChina. (vars {{pituus (vars)}))))]; gb.MapCenter = [21,6385 36,1666]; gb.ZoomLevel = 0,3606; lopun otsikko (t, ["COVID-19 vahvistetut tapaukset Manner-Kiinan ulkopuolella"; ... "Maa / alue, jossa yli 100 tapausta on korostettu punaisella"])

Voimme nähdä, että se vaikutti alun perin vain Manner-Kiinaa ympäröiviin maihin / alueisiin, mutta koska Etelä-Koreassa, Italiassa ja Iranissa on tapahtunut massiivisia eroja. On myös syytä huomata, että meillä oli jo vahvistettu tapauksia Yhdysvalloissa jo 22. tammikuuta 2020.

Vahvistettujen tapausten kartoittaminen Yhdysvalloissa

Koska asun Bostonissa, olen kiinnostunut enemmän paikallisista tapauksista. Mennään alas maakuntien / osavaltioiden tasolle Yhdysvalloissa.

times_conf_us = times_conf ((times_conf. ("Maa / alue") == "USA"), :); times_conf_us (times_conf_us. ("maakunta / osavaltio") == "timanttiprinsessa", :) = []; vars = times_conf_us.Properties.VariableNames; kuva t = kaakeloitu välitys ("virtaus"); ii = [5, pituus (vars)) kertaa_conf_us.Category = kategorinen (repmat ("<100", korkeus (times_conf_us), 1)); times_conf_us.Category (table2array (times_conf_us (:, ii))> = 100) = "> = 100"; nexttile tbl = times_conf_us (:, [1: 4, ii, end]); tbl (tbl. (5) == 0, :) = []; gb = geobubble (tbl, "Lat", "pitkä", "SizeVariable", vars (ii), "ColorVariable", "Category"); gb.BubbleColorList = [1,0,1; 1,0,0]; gb.LegendVisible = "pois"; gb.Title = "Alkaen" + vars (ii); gb.SizeLimits = [0, max (times_conf_us. (vars {{pituus (vars)}))))]; gb.MapCenter = [44,9669 - 113,6201]; gb.ZoomLevel = 1.7678; lopun otsikko (t, ["COVID-19 vahvistetut tapaukset Yhdysvalloissa"; ... "provinssi / osavaltio yli 100 tapausta merkitty punaisella"])

Voit nähdä, että se alkoi Washingtonissa, josta se tuli merkittäväksi puhkeamiseksi, samoin kuin Kaliforniassa ja New Yorkissa.

Ranking maa / alue vahvistettujen tapausten perusteella

Vertaillaan vahvistettujen tapausten lukumäärää maittain / alueittain käyttämällä covid_19_data.csv. Datime-muodossa on epäjohdonmukaisuuksia, joten käsittelemme sitä aluksi tekstinä.

opts = tuvastaImportOptions (tiedostonimet (3), "TextType", "merkkijono", "DatetimeType", "text"); provData = luettavissa (tiedostonimet (3), valinnat);
Varoitus: Tiedoston sarakeotsikot muokattiin tekemään niistä kelvollisia MATLAB-tunnisteita ennen muuttujien nimien luomista taulukolle. Alkuperäiset sarakeotsikot tallennetaan VariableDescriptions-ominaisuuteen. Aseta 'PreserveVariableNames' arvoon true, jos haluat käyttää alkuperäisiä sarakeotsikoita taulukon muuttujien niminä.

Siivotaan päivämäärämuoto.

provData.ObservationDate = regexprep (provData.ObservationDate, "\ / 20 $", "/ 2020"); provData.ObservationDate = päivämäärä (provData.ObservationDate);

Meidän on myös standardisoitava maan / alueen arvot.

provData.Country_Region (provData.Country_Region == "Iran (Islamin tasavalta)") = "Iran"; provData.Country_Region (provData.Country_Region == "Irlannin tasavalta") = "Irlanti"; provData.Country_Region (provData.Country_Region == "Korean tasavalta") = "Etelä-Korea"; provData.Country_Region (provData.Country_Region == "('St. Martin',)") = "St. Martin"; provData.Country_Region (provData.Country_Region == "Pyhä istuin") = "Vatikaanivaltio"; provData.Country_Region (provData.Country_Region == "miehitetty Palestiinan alue") = "Palestiina";

Aineisto sisältää maakunnan / osavaltion muuttujan. Yhdistetään tiedot maan / alueen tasolla.

countryData = ryhmäkokoelma (provData, {'ObservationDate', 'Country_Region'}, ... "summa", {'vahvistettu', 'kuolemat', 'toipunut'}); countryData.Properties.VariableNames = erase (countryData.Properties.VariableNames, "sum_");

countryData sisältää päivittäiset kumulatiiviset tiedot. Tarvitsemme vain viimeisimmät numerot.

countryLatest = ryhmätiedot (countryData, "Country_Region", "max", "Confirmed"); countryLatest.Properties.VariableNames = erase (countryLatest.Properties.VariableNames, "max_");

Sarjataan 10 parasta ja visualisoidaan ne histogrammin avulla.

[lajiteltu, idx] = lajitella (countryLatest.Vahvistettu, 'laskeutua'); etiketit = countryLatest.Country_Region (idx); k = 10; topK = lajiteltu (1: k); tarratK = tarrat (1: k); kuviohistogrammi ('Luokat', kategorinen (tarratK), "BinCounts", topK, ... "DisplayOrder", "nouseva", "suunta", "vaakasuora") xlabel ("Vahvistetut tapaukset") otsikko ([säveltää (" COVID-19-vahvistetut tapaukset maittain / alueittain - Suosituimmat% d ", k); ..." Alkaen "+ päivämäärät (max (provData.ObservationDate))))

Manner-Kiinan ulkopuolella, Italia ovat Irania, joka ylittää nyt Etelä-Korean.

Vahvistettujen tapausten kasvu maittain / alueittain

Voimme myös tarkistaa, kuinka nopeasti tapaukset kasvavat noissa maissa.

kuvaaja (countryData.ObservationDate (countryData.Country_Region == labelsK (2)), ... countryData.Confirmed (countryData.Country_Region == labelsK (2))); pidä painettuna ii = 3: pituus (labelsK) kuvaaja (countryData.ObservationDate (countryData.Country_Region == labelsK (ii)), ... countryData.Confirmed (countryData.Country_Region == labelsK (ii)), "LineWidth", 1); lopussa pidä otsikko pois (["COVID-19 vahvistetut tapaukset Manner-Kiinan ulkopuolella"; kirjoita ("Suosituin% d maa / alue", k)]) legenda (etiketitK (2: loppu), "sijainti", "luoteinen") xlabel ("Alkaen" + datetr (max (provData.ObservationDate))) ylabel ("Tapaukset")

Vaikka Etelä-Korea osoittaa hidastumisen merkkejä, se kiihtyy kaikkialla muualla.

Uusien tapausten kasvu maittain / alueittain

Voimme laskea uusien tapausten lukumäärän vähentämällä vahvistettujen tapausten kumulatiivisen määrän kahden päivämäärän välillä.

by_country = solu (koko (tarratK)); kuva t = kaakeloitu välitys ('virtaus'); ii = 1: pituus (labelsK) country = provData (provData.Country_Region == labelsK (ii), :); maa = ryhmien yhteenveto (maa, {'ObservationDate', 'Country_Region'}, ... "summa", {'vahvistettu', 'kuolleet', 'toipunut'}); country.Properties.VariableNames = erase (country.Properties.VariableNames, "summa_"); maa.Uusi = [0; maa.vahvistettu (2: loppu) - maa.vahvistettu (1: loppu-1)]; maa.uusi (maa.uusi <0) = 0; maan_maan {ii} = maa; jos tagsK (ii) ~ = "Muut" seuraavan kaavion (maa.ObservationDate, maa.Uusi) otsikko (tagsK (ii) + säveltää ("-% d", max (maa.vahvistettu))) lopun otsikko (t, säveltää ("COVID-19 uutta tapausta - suosituin% d maa / alue", k)) xlabel (t, "As of" + datetr (max (provData.ObservationDate))) ylabel (t, "New Cases")

Voit nähdä, että Manner-Kiinassa ja Etelä-Koreassa ei ole ollut paljon uusia tapauksia. Näyttää siltä, ​​että he pystyivät hillitsemään puhkeamisen.

Tarkemmin Manner-Kiinassa

Koska tartunta hidastuu Manner-Kiinassa, katsotaan kuinka monta aktiivista tapausta on edelleen täällä. Voit laskea aktiiviset tapaukset vähentämällä todetut tapaukset ja kuolemat vahvistetuista tapauksista.

ii = 1: pituus (etiketitK) maan_maalla {ii} .Aktiivinen = maan_maan {ii} .Vahvistettu - maan_maalla {ii} .Kuolemat - maan_maan {ii}. Palautettu; loppukuva-alue (maana {1} .ObservationDate, ... [by_country {1} .Active by_country {1} .Reposed by_country {1} .Deaths]) legenda ("Aktiivinen", "Palautettu", "Kuolemat", " sijainti "," luoteinen ") otsikko (" Vahvistettujen tapausten jakautuminen Manner-Kiinassa ") xlabel (" Alkaen "+ päivämäärät (max (provData.ObservationDate))) ylabel (" Tapaukset ")

Käyrän asentaminen

Aktiivisten tapausten määrä on pudonnut, ja käyrä näyttää karkealta Gaussin suuntaan. Voimmeko sovittaa Gaussin mallin ja ennustaa, milloin aktiiviset tapaukset ovat nolla?

Vastuuvapauslauseke: Tämä on erittäin karkea lähestymistapa, joten sinun ei pitäisi tehdä siitä johtopäätöksiä - tämä on tarkoitettu vain lukemista varten.

Sovitin Gaussian Active-riville Curve Fitting Toolbox -sovelluksen avulla. Sopivuuden arvon arvioimiseksi

[x, y] = valmistaCurveData ((1: pituus (maan_maalla {1}. Aktiivinen)) ', maan_maalla {1} .Aktiivinen); ft = fittype ("gauss1"); opts = fitoptions ("Method", "NonlinearLeastSquares"); opts.Display = "Pois"; optts.Lower = [-Inf -Inf 0]; valinnat.StartPoint = [58046 27 7,66733432245782]; [fobj, gof] = sopii (x, y, ft, valinnat); GOF
gof = rakenne kenttiin: sse: 4.4145e + 08 rsquare: 0.9743 dfe: 47 adjrsquare: 0.9732 rmse: 3.0647e + 03

Projisoidaan lähtö tulevaisuuteen lisäämällä 20 päivää.

pidentää päivää = 20; xhat = [x; (X (pää) +1: x (pää) + extend_days) "]; xdates = [maana {1} .ObservationDate; ... (maatalouden {1} .ObservationDate (loppu) + päivät (1): ... by_country {1} .ObservationDate (end) + days (exten_days)) ']; yhat = fobj (xhat); ci = predint (fobj, yhat);

Nyt olemme valmiita piirtämään sitä.

kuva-alue (maana {1} .ObservationDate, by_country {1} .Aktiivinen) pidä plot (xdates, yhat, "lineWidth", 2) plot (xdates, yhat + ci (:, 1), "Color", "m "," LineStyle ",": "," LineWidth ", 2) kuvaaja (xdate, yhat + ci (:, 2)," Colour "," m "," LineStyle ",": "," LineWidth ", 2 ) pidä pois ylim ([0 inf]) -legenda ("Todellinen", "Gaussian Fit", "Confidence Intevals", "sijainti", "koillinen") otsikko ("Gaussian malli yli Actives-tapausten Manner-Kiinassa") xlabel (" Todellinen päivästä "+ datetr (max (provData.ObservationDate))) ylabel (" Tapaukset ")

En tietenkään aio ottaa tätä nimellisarvoon, mutta eikö olisi hienoa, jos Manner-Kiina voi vähentää aktiiviset tapaukset nollaan huhtikuun alussa?

Entä Etelä-Korea?

Piirrämme Etelä-Korean aktiivisten, palautettujen ja kuolemantapausten lukumäärä.

kuva-alue (maana_maana {4} .ObservationDate, ... "," luoteinen ") otsikko (" Vahvistettujen tapausten jakautuminen Etelä-Koreassa ") xlabel (" Alkaen "+ päivämäärät (max (provData.ObservationDate))) ylabel (" Tapaukset ")

Kuten tontista voi nähdä, on liian aikaista tietää, ovatko ne saavuttaneet huippunsa. En usko, että saamme Gaussian-kielellä mitään hyvää sovi.

Yhteenveto

Käytätkö MATLABia COVID-19: n torjuntaan? Tai ehkä olet jo itsenäinen? Jaa, kuinka käytät MATLABia käydessäsi läpi tämän kokeiluajan.

Julkaistu MATLAB® R2020a: lla

Alun perin julkaistu osoitteessa https://blogs.mathworks.com 16. maaliskuuta 2020.