Tartuntaketjujäljitykseen lisää resursseja

Tämä kirjoitus on julkaistu 16.2.2021.

Edelleen näyttää siltä, että tartuntaketjujäljitys ei toimi optimaalisesti. Tästä kyllä selvitään, mutta vaatii, että jäljitykseen saadaan riittävästi resursseja. Nyt suuria ongelmia näyttäisi olevan HUS:n lisäksi Satakunnassa, Vaasassa ja Varsinais-Suomen shp-alueilla.

Toistan jo monta kertaa aiemmin esittämäni perusteet.

  1. Yksikin tartunta on liikaa ja ainoa keino saada tartunnalle altistuneet kiinni on toimiva tartuntaketjujäljitys.
  2. Mikäli resursseja on liian vähän, niin lisätkää niitä.
  3. Taloutemme ja eritoten yritykset ovat jo nyt kusessa tämän päätöksentekokyvyttömyyden johdosta. Nyt kannattaisi tukahduttaa, koska rokotusten vaikutus näkyy vasta viiveellä.
  4. Mitä enemmän aikaa kuluu, niin sitä suuremmalla todennäköisyydellä kotoperäisiä variantteja ilmenee.
  5. Mikäli variantit saavat yliotteen, niin siinä vaiheessa alkuperäiseen virukseen kehitetyt rokotteet eivät enää pure. Siinä vaiheessa peli kovenee.
  6. Vaadin monen muun tavoin päätöksentekijöiltä NYT rohkeitakin PÄÄTÖKSIÄ.

Rekisteritutkimus ja ryhmittelyanalyysit apuun taistelussa SARS-CoV2 -virusta vastaan

Tilastomatemaattisilla menetelmillä voidaan tuottaa reaaliaikaisesta tietoa koronaviruksen aiheuttamasta taudista ja niiden avulla pystytään saamaan varsin luotettavasti tietoa niistä varhaisen vaiheen oireista, jotka ennustavat parhaiten vakavaa tautimuotoa COVID-19 sairaudesta. Tässä artikkelissa kuvaan pintaraapaisuna, mitä mahdollisuuksia data-analyysit voisivat tuoda tähän vallitsevaan tilanteeseen. Näkemykseni on että SARS-CoV2 -virus selätetään hyvin organisoidulla rekisteritutkimuksella, joka on koordinoitu maailmanlaajuisesti. Tukimustietoa tarvitaan vielä runsaasti niistä riskitekijöistä, jotka altistavat COVID-19 potilaat tehohoitoon.

Eri lähteissä on jo tehty näitä COVID-19 potilaiden oireisiin liittyviä analyysejä ja varsin luotettavana voisi pitää New Yorkin yliopistossa tehtyä analyysiä niistä oireista, jotka luotettavasti ennustivat taudin etenemistä vaikeaan tilaan. ALT entsyymin kasvu (alaniiniaminotransferaasi), kova lihaskipu (MYALGIA). Kolmantena selittävänä muuttujana todettiin tässä tutkimuksessa olleen korkea hemoglobiiniarvo (B-Hb). ALT -arvon nousu on siinä mielessä mielenkiintoinen muuttuja, koska siinä tapahtuu muutos yleensä hyvin varhaisessa vaiheessa, ennen kuin muut elimelliset oireet alkavat.

Toimenpiteiden määräytyminen varhaisten signaalien perusteella

Mitä hyöty on sitten tietää varhaisessa vaiheessa olevan COVID-19 sairauden kehittymistä vaikeaan tautimuotoon? Suurin hyöty lienee se, että näin lääkärit pystyvät näiden merkkien perusteella ryhmittelemään suuren joukon tartunnan saaneita ja lievästi oirehtivia potilaita jo ennalta. Hoidon ja tarvittavan laitekapasiteetin suunnittelu helpottuu ja pystytään paremmin antamaan oikea-aikaista hoitoa näille ryhmille.

Ryhmittelyanalyysit ovat varsin arkipäiväisiä asioita tilastoanalyysien tekijöille. Olen itsekin näitä ryhmittelyitä tehnyt suurelle potilasjoukolle ja tuolloin yllätyin itsekin menetelmän tehokkuudesta varsinkin, kun data-aineiston alkutilanteessa oli tarvetta tutkia kymmenien taustamuuttujien vaikutusta haluttua muuttujaa vasten. Käytännössä analysonti data-aineiston suhteen etenee aina tietyn proseduurin mukaan. Tarvitaan vain tieto, mitä muuttujaa vasten halutaan saada selittäjämuuttujien analyysi. Yleensä tähän vaiheeseen osallistuu suuri joukko asiantuntijoita, joiden asiantuntemusta käytetään parviälytyyppisesti. Asiantuntijajoukko luo ja määrittää reunat muuttujavalinnoille ja data-analyytikko tuottaa sitten alustavat tulokset näiden määritysten mukaisesti.

On toki tullut itsellekin tilanteita vastaa, joissa tämäkään lähestymistapa ei tuota onnistunutta lopputulosta vaan joudutaan tekemään iteratiivista data-analyysiä usealla eri muuttujayhdistelmällä. Tähän ja muihinkin data-analyysien tekoon löytyvät huikeat työkalut mm. R-ohjelmakirjastoista.

Datan laatu ja saanti ovat sellaisia tekijöitä, joiden kanssa data-analyytikot yleensä taistelevat eniten ja osittain näiden tekijöiden johdosta joudutaan tekemään kompromisseja. En kuitenkaan usko, että tässä COVID-19 potilasjoukon tarkastelussa tulisi mitään rekisteritutkimuslupiin liittyviä ongelmia, koska kaikkien etuhan on, että tautiin löydetään parannuskeino ja se hyöty, jonka rekistesteritutkimus voi asiaa kohtaan tuoda on kansanterveyden kannalta huomattavan suuri.

Datan käsittelyyn kuuluu myös merkityksettömien muuttujien poissulkemisia, jotta mukaan otetaan vain sellaiset muuttujat, jotka parhaiten kuvaavat selitettävää muuttujaa. Poissulkemiseen löytyy useita menetelmiä, mutta yksinkertaisimmillaan regressiomallinnuksella päästään hyvään lopputulokseen. Initiaalimallin avulla haetaan maksimaalista R-arvoa, eli sellaista muuttujamixiä, joka parhaiten selittää selitettävän muuttujan käyttäytymistä suhteessa selittäjämuuttujiin.

Ryhmittelyanalyysiä

Suuresta joukosta regressioanalyysin muuttujaryhmistä valitaan sitten sellaiset ryhmät tai vain pelkästään yksi muuttujaryhmä, johon voidaan kohdistaa esim. k-means -menetelmällä ryhmittelyanalyysi. K-means menetelmässä haetaan muuttujien havainnoista sellaisia dataryhmiä, jotka eniten ”muistuttavat toisiaan” tai jotka syystä tai toisesta ovat havaintoja samassa ryhmässä vaikkakin ovat eri muuttujian havaintoja. Näiden väliltä löytyy siis jokin yhteinen ”tekijä”, jonka johdosta kyseiset havainnot ovat samassa ryhmässä. Huomautettakoon tässä kohtaa, että rajauksena tässä olisivat vain sellaiset yksilölliset havaintorivit, jotka kuuluvat COVID-19 diagnoosin saaneille.

Riskitekijöiden laajempi tarkastelu on kansallisesti ja kansainvälisesti laajemman rekisteritutkimuksen paikka ja se voidaan tilanteen vakavuudesta riippuen kohdistaa, joko koko väestöön tai vain tiettyyn ennalta määritettyyn riskiryhmään. Tästä asiasta kerron lisää toisessa artikkelissani. 

Klusterointia

Yhteisen tekijän omaavaa havaintojoukkoa voidaan kutsua tässä vaikka klustereiksi. Mikäli kysymyksessä olisi COVID-19 potilaan havaintoaineisto, niin siinä olisi tyypillisesti iän ja sukupuolen lisäksi taustamuuttujina tartunnan saantiaika, mahdollisesti vähäoireisuusaika ja sitten tarkempaa tietoa siinä vaiheessa, kun potilas on siirretty osastohoitoon tai mahdollisesti tehohoitoon. Tehohoidon osalta jokaisesta hoidettavasta potilaasta löytyy valtava määrä dataa aina kehon lämpötilasta lukuisiin laboratorianalyyseihin verenkuvasta jne. Terveyden- ja sosiaalihuollon, Kelan reseptitietokannan rekisteritietojen yhdistäminen on myös jossain vaiheessa oleellista, mutta tästäkin kokonaisuudesta kirjoittelen sitten myöhemmin.

Selitettävänä muuttujana vaikea COVID-19 sairaus

Näitä muuttujajoukkoja (klustereita) voidaan ajaa sitten regressio tai neuroverkkotekniikoilla vasten selitettävää muuttujaa. Tässä tapauksessa selitettävä muuttuja on yksinkertaisesti kaikki ne tapaukset, joilla ilmeni vaikea COVID-19 sairaus ja joka johti tehohoitoon tai sitten joissakin tapauksissa kuolemaan. Se klusteri, joka sai korkeamman R-arvon (selitysasteen) pääsee jatkoon eli tuohon klusteriin liittyviin havaintoriveihin (potilaisiin) kohdistetaan tutkimuksellisesti eniten panostuksia. Tämä ryhmä määrittää myös myöhemmin ns. riskiryhmäarvioinnin, joka mahdollisesti voi olla alueellisestikin erilainen eri osissa maata. Saattaa toki olla, että nykyisiin riskiryhmämääritelmiin ei tämä tutkimus toisi mitään uutta, mutta tässä lähestymistavassa uutuus olisikin se, että riskiryhmään lukeutuvat pystytään identifioimaan ja heille voidaan antaa räätälöityjä ohjeistuksia miten tilanteessa kannattaa toimia.

Malminkartanossa 16.4.2020, Marko Ekqvist DI, tekoälytutkija

ps. mikäli artikkeli herätti kysymyksiä, niin voit lähettää kysymykset suoraan viestipalveluun tai soita numeroon +358 45 1200 944

COVID19fi -tartuntaketjujäljityksen kuntatasoinen tieto julkiseksi

COVID19-tartuntaketjujäljityksen kuntatasoinen tieto tulee julkaista ainakin seuraavien muuttujien suhteen:

  1. Altistuneet
  2. Tavoitetut/tavoittamattomat
  3. Karanteeniin asetettujen lukumäärät
  4. Jäljityksen resurssit/altistuneet

Perusteluita miksi pidän asiaa tärkeänä on yksinkertaisesti #go2zero tilaan pääsy ja siellä pysyminen. Yksikin tartunta on liikaa ja toimimalla järkevästi asian tila saadaan kyllä korjattua.

Vaatii tosin ketteryyttää ja oikea-aikaista reagointia, mutta on täysin mahdollista saavuttaa, mikäli vaan kaikkien tahtotila on sama.

1. Altistuneiden lukumäärä kertoo kuntakohtaisesti, miten vakavasta tai laajasta ongelmasta on kysymys.

2. Sairaanhoitopiiritasolla tämän tiedon avulla voitaisiin kohdentaa tartuntaketjujäljityksen resursseja sellaisille alueille, joissa aivan selvästi on vaikeuksia tavoittaa altistuneita ja/tai heidän läheisiään. Aikaa vievää hommaa, joka vaatii puhelinmyyjän hermot.

3. Karanteeniin asetettuja tulisi kontakoida ja varmistaa, että ketju ei vuoda. Mikäli määrät ovat suuria, niin samalla riski vuodoille kasvaa, koska kukaan ei ehdi kontrolloimaan asiaa. Karanteenissa olevien talous- ja ruokahuolto pitää myös pelata siten, että ketju ei katkea. Mikäli olet karanteenissa, niin yksikin kauppareissu voi aiheuttaa katastrofin.

4. Edellä olevien tietojen perusteella voidaan alueellisesti arvioida onko tartuntaketjujäljityksen resurssit riittävät.
Ei riitä, että hammashuollon työntekijöitä on “lainattu” tähän tehtävään, vaan kokonaisuuteen pitää varata vain tähän tehtävään omistautuneita henkilöitä.

#go2zero #COVID_19 #SARSCoV2 #tartunnat #koronasuomi #koronafi

Oiredata ja tartunnat

Ikäryhmäkohtaisten oiretietojen kautta voidaan approksimoida tartuntamääriä. Mentelmiä on varmaan muitakin, mutta antaa osviitta siitä mitä mahdollisesti tapahtuu seuraavan kahden viikon aikana.

Katsoin ikäryhmäkohtaisia vastaavien viikkojen tartunta- ja oiretietoja. Kun lasketaan viikon 30 oiretietojen summa ja siitä suhdeluku suhteessa tartuntojen viikkokohtaiseen summaan sain keskimäärin ikäryhmäkohtaisessa tarkastelussa 29.4 oire-ilmoitusta / tartunta /viikko.

Kehitysideoita. Viikkokohtaiset erittelyt tulisi tehdä seuraavalla tavalla:

  • oiredata aikaväli viikko, kahden viikon takainen
  • tartuntadata aikaväli viikko, edellinen viikko nykyhetkestä

Tarkastelu tulee oiredatan suhteen tehdä kahden viikon päähän, koska 4-7 päivää COVID-19 tauti saattaa olla oireinen tai vähäoireinen. Oireiden alusta menee 4-6 päivää, kunnes potilas hakeutuu testeihin tai saa testituloksen. Pari kolme päivää varataan testituloksen saamiselle, näin ollen viikkokohtainen aikaväli on perusteltu, kunhan oire- ja tartuntadatan aikaväli on 2 viikkoa. Eli esim. viikon 30 tartuntatiedot ja vastaavasti viikon 27 oiredata. Näiden avulla voidaan määrittää suhdeluvut ja käyttää niitä tulevien viikkojen ennusteissa.

COVID19 – FI – kunta- ja päiväkohtaiset tartunnat 2020

Alla oleva data on ladattu THL:n avoimen rajapinnan kautta. Viimeisin päivitys 26.7.2020 klo 12:00.

LATAA tiedosto: Tartuntatiedot ajettu avoimesta rajapinnasta – päivittäin ja kunnittain.

26.7.2020 ajolistauksessa päiväkohtaisissa tartuntatiedoissa seuraavat muutokset. Sulkeissa eilinen 25.7.2020 lukuarvo.
22.06.2020 | 5(4) +1
25.06.2020 | 14(15) -1
15.07.2020 | 5(6) +1
23.07.2020 | 3(2) +1
24.07.2020 | 8(5) +3
25.07.2020 | 2(0) +2

26.7.2020 ajolistauksen kuntakohtaisissa tartuntatiedoissa seuraavat muutokset. Sulkeissa eilinen 25.7.2020 lukuarvo.
Turku | 212(213) -1
Helsinki | 2771(2769) +2
Vantaa | 910(906) +4

23.7.2020 ajolistauksessa päiväkohtaisissa tartuntatiedoissa seuraavat muutokset. Sulkeissa eilinen 22.7.2020 lukuarvo.
22.04.2020 | 122(123) -1
04.05.2020 | 134(135) -1
07.05.2020 | 106(107) -1
08.05.2020 | 81(79) +2
09.05.2020 | 47(46) +1
11.05.2020 | 93(94) -1
12.05.2020 | 67(68) -1
13.05.2020 | 79(78) +1
14.05.2020 | 51(54) -3
15.05.2020 | 55(54) +1
18.05.2020 | 45(43) +2
20.05.2020 | 43(44) -1
22.05.2020 | 32(31) +1
29.05.2020 | 21(22) -1
30.05.2020 | 10(11) -1
02.06.2020 | 15(14) +1
04.06.2020 | 12(10) +2
18.07.2020 | 7(6) +1
20.07.2020 | 11(10) +1
21.07.2020 | 7(4) +3
22.07.2020 | 4(0) +4
Tartuntojen kokonaismäärä nyt 7372.

23.7.2020 ajolistauksen kuntakohtaisissa tartuntatiedoissa seuraavat muutokset. Sulkeissa eilinen 22.7.2020 lukuarvo.
Jyväskylä | 109(108) +1
Helsinki | 2768(2766) +2
Espoo | 842(839) +3
Kerava | 80(77) +3

22.7.2020 ajolistauksessa päiväkohtaisissa tartuntatiedoissa seuraavat muutokset. Sulkeissa eilinen 21.7.2020 lukuarvo.
03.06.2020 | 25(26) -1
06.06.2020 | 13(12) +1
02.07.2020 | 7(8) -1
18.07.2020 | 6(4) +2
19.07.2020 | 3(2) +1
20.07.2020 | 10(4) +6
21.07.2020 | 3(0) +3
Tartuntojen kokonaismäärä nyt 7362.

22.7.2020 ajolistauksen kuntakohtaisissa tartuntatiedoissa seuraavat muutokset. Sulkeissa eilinen 21.7.2020 lukuarvo.
Maarianhamina | 16(15) +1
Turku |208(205) +3
Tampere | 141(140) +1
Jyväskylä | 108(107) +1
Helsinki | 2766(2764) +2
Espoo | 839(837) +2
Kerava | 77(76) +1

21.7.2020 ajolistauksessa päiväkohtaisissa tartuntatiedoissa seuraavat muutokset. Sulkeissa eilinen 20.7.2020 lukuarvo.
08.04.2020 | 138(137) +1
05.05.2020 | 126(125) +1
21.05.2020 | 22(21) +1
04.07.2020 | 2(1) +1
15.07.2020 | 5(4) +1
19.07.2020 | 2(0) +2
20.07.2020 | 4(0) +4
Muuttuneita tietoja kaikkiaan 7 kpl. Tartuntojen kokonaismäärä nyt 7351.

21.7.2020 ajolistauksen kuntakohtaisissa tartuntatiedoissa seuraavat muutokset. Sulkeissa eilinen 20.7.2020 lukuarvo.
Turku | 205(204) +1
Eurajoki |7(6) +1
Savonlinna | 12(11) +1
Kokkola | 8(9) -1
Helsinki | 2764(2758) +6
Vantaa | 902(899) +3

20.7.2020 ajolistauksessa päiväkohtaisissa tartuntatiedoissa seuraavat muutokset. Sulkeissa eilinen 19.7.2020 lukuarvo.
14.06.2020 | 4(3) +1
13.07.2020 | 6(7) -1
16.07.2020 | 9(8) +1
18.07.2020 | 4(0) +4
Muuttuneita tietoja kaikkiaan 4 kpl. Tartuntojen kokonaismäärä nyt 7340.

20.7.2020 ajolistauksen kuntakohtaisissa tartuntatiedoissa seuraavat muutokset. Sulkeissa eilinen 19.7.2020 lukuarvo.
Maarianhamina | 15(16) -1
Pori | 25(24) +1
Kokkola | 9(8) +1
Espoo | 837(836) +1
Helsinki | 2758(2756) +2
Vantaa | 899(898) +1

19.7.2020 ajolistauksessa päiväkohtaisissa tartuntatiedoissa seuraavia muutoksia: Sulkeissa eilinen 18.7.2020 lukuarvo.
06.05.2020 | 90(91) -1
25.06.2020 |15(14) +1
02.07.2020 |8(1) +7
16.07.2020 |8(4) +4
17.07.2020 |6(0) +6
Muuttuneita tietoja kaikkiaan 5 kpl. Tartuntojen kokonaismäärä nyt 7335.

18.7.2020 ajolistauksessa päiväkohtaisissa tartuntatiedoissa seuraavia muutoksia: Sulkeissa eilinen 17.7.2020 lukuarvo.
16.03.2020 | 52(51) +1
29.06.2020 |15(14) +1
03.07.2020 |5(4) +1
09.07.2020 |8(5) +3
10.07.2020 |7(3) +4
15.07.2020 |4(2) +2
16.07.2020 |4(0) +4
Muuttuneita tietoja kaikkiaan 8 kpl. Tartuntojen kokonaismäärä nyt 7318.

17.7.2020 ajolistauksen mukaan päiväkohtaisissa tartuntatiedoissa seuraavia muutoksia:
Sulkeissa eilinen 16.7.2020 lukuarvo.
8.4.2020 | 137(138) -1
7.5.2020 |105(107) -2
8.6.2020 |9(8) +1
24.6.2020|15(16) -1
5.7. 2020 |2(1) +1
8.7. 2020 |10(9) +1
10.7.2020|3(2) +1
11.7. 2020|0(1) -1
13.7. 2020|7(6) +1
14.7. 2020|5(2) +3
15.7. 2020|2(0) +2
Muuttuneita tietoja kaikkiaan 11 kpl. Tartuntojen kokonaismäärä nyt 7301 kpl.

COVID19 tartunnat ikäryhmittäin, sukupuolittain, sairaanhoitopiireittäin ja kunnittain – R Studio

THL:n avoimen rajapinnan kautta pääsee lataamaan tartuntatautirekisterin tietoja suoraan alla olevan ohjeen mukaisesti. Alla listattuna tarvittavat R-kirjastot ja omina lisäyksinäni SQL -lauseet haluttujen tietojen poimintaan. Kevään mittaan olen näistä tehnyt päivittäin koosteita mm. Twitteriin ja toistaiseksi toiminut moitteettomasti. Eläköön avoinrajapinta. R-ohjelman voit ladata R-studio versiona täältä tai sitten voit käyttää vaihtoehtoisesti tätä versiota.

Have fun with R!

Marko

#Koodausohje-esimerkki R-kielellä
#Tässä esimerkissä haetaan THL:n rajapinnasta COVID-19-tapaukset ikäryhmittäin ja tehdään niistä aineisto.

#Paketti datan editoimiseen ja visualisointiin
library(tidyverse)
#Paketti datan lukemiseen
library(jsonlite)
library(sqldf)
library(DBI)
library(data.table)

HUOM VAIHDA AINA ENSIN PÄIVÄMÄÄRÄ
#190620
#100620

#-----------------------------------------
#IKÄRYHMITTÄIN
#----------------------------------------

#Paketti datan editoimiseen ja visualisointiin
library(tidyverse)
#Paketti datan lukemiseen
library(jsonlite)
library(sqldf)
library(DBI)
library(readr)   # Read tabular data.
library(tidyr)   # Data frame tidying functions.
library(dplyr)   # General data frame manipulation.
library(ggplot2) # Flexible plotting.
mydb <- dbConnect(RSQLite::SQLite(), "my-db.sqlite")
#dbDisconnect(mydb)
#unlink("my-db.sqlite")

#otetaan edellispäivän data talteen 
#Luetaan aineisto sisään
 aineisto <- fromJSON("https://sampo.thl.fi/pivot/prod/fi/epirapo/covid19case/fact_epirapo_covid19case.json?column=ttr10yage-444309")

#puretaan kategoriat paloiksi
 label <- as.data.frame(unlist(aineisto$dataset$dimension$ttr10yage$category$label))
 index <- as.data.frame(unlist(aineisto$dataset$dimension$ttr10yage$category$index))
  
 #Nimetään palaset
 names(label)<-"label"
 names(index)<-"index"
  
 #Laitetana vielä rivinumerot sarakkeiksi, jotta nämä saadaan yhteen.
 label<-rownames_to_column(label)
 index<-rownames_to_column(index)
  
 #Yhdistetään rivinimeä käyttäen
 kategoriat <- index %>% left_join(label,by="rowname")
 
 #otetaan data
 data <- as.data.frame(unlist(aineisto$dataset$value))
 data_old <- as.data.frame(unlist(aineisto$dataset$value))
 
 #Nimetään
 names(data)<-"Tapauksia"
 names(data_old)<-"Tapauksia_edellispvm"

 data<-rownames_to_column(data)
 data_old<-rownames_to_column(data_old)

 data$rowname<-as.numeric(data$rowname)
 data_old$rowname<-as.numeric(data_old$rowname)

 
#Yhdistetään muuhun aineistoon
 dataset_ir_190620 <- kategoriat %>% left_join(data,by=c("index"="rowname"))
 dataset_ir_old <- kategoriat %>% left_join(data_old,by=c("index"="rowname"))

dataset_ir_190620


#VIEDÄÄN TULOKSET KANSIOON

write.table(dataset_ir_190620, file = "C:/...LISÄÄ TÄHÄN OMA POLKUSI/dataset_ir_190620.txt", sep = "\t", col.names = NA, qmethod = "double")
#katsotaan lopuksi tulokset
View(dataset_ir_190620)

#tässä kohtaa voi olla tarvetta hakea aikaisempia tietoja ja se tehdään seuraavalla tavalla
#LUETAAN KOONTI TAKAISIN

dataset_ir_200520 <- read.delim("C:/Users/marko/Dropbox/kuvat/home/Marko/R/koronadataa/dataset_ir_200520.txt")
View(dataset_ir_200520)
#vaihda päivämäärä, jotta saat halutun päivän tiedot tähän vertailuun mukaan

#tämä mikäli, et ole sitä jo tehnyt....
mydb <- dbConnect(RSQLite::SQLite(), "my-db.sqlite")

#ladataan taulut
dbWriteTable(mydb, "dataset_ir_140520", dataset_ir_140520)

#TÄMÄ JA EDELLINEN PÄIVÄ (muuta pvm tekstit oman tarpeesi mukaan)
rsa <- dbSendQuery(mydb, 'SELECT a.label, a.Tapauksia as Tapaukset_190620, b.Tapauksia as Tapaukset_180620, (a.Tapauksia)-(b.Tapauksia) as Muutos_lkm
FROM dataset_ir_190620 a  
LEFT JOIN dataset_ir_180620 b 
ON a.label = b.label')
dbFetch(rsa)

#tai sitten vaikka näin

#RAJOITUSTEN PURUSTA TÄHÄN PÄIVÄÄN 
rsa <- dbSendQuery(mydb, 'SELECT a.label, a.Tapauksia as Tapaukset_190620, b.Tapauksia as Tapaukset_310520, (a.Tapauksia)-(b.Tapauksia) as Muutos_lkm
FROM dataset_ir_190620 a  
LEFT JOIN dataset_ir_310520 b 
ON a.label = b.label')
dbFetch(rsa)

Alla esimerkki, miten tiedot haetaan sukupuolittain.

#-----------------------------------------
#SUKUPUOLITTAIN
#----------------------------------------
#Paketti datan editoimiseen ja visualisointiin
 library(tidyverse)
#Paketti datan lukemiseen
library(jsonlite)
library(sqldf)
library(DBI)

mydb <- dbConnect(RSQLite::SQLite(), "my-db.sqlite")
#dbDisconnect(mydb)
#unlink("my-db.sqlite")


#Luetaan aineisto sisään
 aineisto <- fromJSON("https://sampo.thl.fi/pivot/prod/fi/epirapo/covid19case/fact_epirapo_covid19case.json?column=sex-444328")

#puretaan kategoriat paloiksi
 label <- as.data.frame(unlist(aineisto$dataset$dimension$sex$category$label))
 index <- as.data.frame(unlist(aineisto$dataset$dimension$sex$category$index))
  
 #Nimetään palaset
 names(label)<-"label"
 names(index)<-"index"
  
 #Laitetana vielä rivinumerot sarakkeiksi, jotta nämä saadaan yhteen.
 label<-rownames_to_column(label)
 index<-rownames_to_column(index)
  
 #Yhdistetään rivinimeä käyttäen
 kategoriat <- index %>% left_join(label,by="rowname")
 
 #otetaan data
 data <- as.data.frame(unlist(aineisto$dataset$value))
 
 #Nimetään
 names(data)<-"Tapauksia"

 data<-rownames_to_column(data)

 data$rowname<-as.numeric(data$rowname)



#Yhdistetään muuhun aineistoon
dataset_sp_190620 <- kategoriat %>% left_join(data,by=c("index"="rowname"))

dataset_sp_190620

write.table(dataset_sp_190620, file = "C:/....TÄHÄN OMA TIEDOSTOSIJAINTISI TULOSTIEDOSTOILLE.../dataset_sp_190620_sukupuolittain.txt", sep = "\t", col.names = NA, qmethod = "double")

#LUETAAN KOONTI TAKAISIN (MIKÄLI TARVETTA...) HUOM. TÄMÄ ON VAIN MALLI...
dataset_sp_190620 <- read.delim("C:/..TÄHÄN OMA TIEDOSTOSIJAINTISI.../dataset_sp_190620_sukupuolittain.txt")
View(dataset_sp_190620)

#ladataan taulut
dbWriteTable(mydb, "dataset_sp_190620", dataset_sp_190620)

#TOIMII
rsa <- dbSendQuery(mydb, 'SELECT a.label, a.Tapauksia as Tapaukset_190620, b.Tapauksia as Tapaukset_180620, (a.Tapauksia)-(b.Tapauksia) as Ero_eiliseen
FROM dataset_sp_190620 a  
LEFT JOIN dataset_sp_180620 b 
ON a.label = b.label')
dbFetch(rsa)

Seuraavaksi katsotaan, miten saadaan ladattua tiedot sairaanhoitopiireittäin.

#-----------------------------------------
#SAIRAANHOITOPIIREITTÄIN
#----------------------------------------
#Paketti datan editoimiseen ja visualisointiin
 library(tidyverse)
#Paketti datan lukemiseen
 library(jsonlite)
library(sqldf)
library(DBI)
mydb <- dbConnect(RSQLite::SQLite(), "my-db.sqlite")
#Luetaan aineisto sisään
 aineisto <- fromJSON("https://sampo.thl.fi/pivot/prod/fi/epirapo/covid19case/fact_epirapo_covid19case.json?column=hcdmunicipality2020-445222")

#puretaan kategoriat paloiksi
 label <- as.data.frame(unlist(aineisto$dataset$dimension$hcdmunicipality$category$label))
 index <- as.data.frame(unlist(aineisto$dataset$dimension$hcdmunicipality$category$index))
  
 #Nimetään palaset
 names(label)<-"label"
 names(index)<-"index"
  
 #Laitetana vielä rivinumerot sarakkeiksi, jotta nämä saadaan yhteen.
 label<-rownames_to_column(label)
 index<-rownames_to_column(index)
  
 #Yhdistetään rivinimeä käyttäen
 kategoriat <- index %>% left_join(label,by="rowname")
 
 #otetaan data
 data <- as.data.frame(unlist(aineisto$dataset$value))
 
  #Nimetään
 names(data)<-"Tapauksia"
 names(data_old)<-"Tapauksia_edellispvm"
 data<-rownames_to_column(data)
 data_old<-rownames_to_column(data_old)
 data$rowname<-as.numeric(data$rowname)
 data_old$rowname<-as.numeric(data_old$rowname)
 
#Yhdistetään muuhun aineistoon
dataset_shp_190620 <- kategoriat %>% left_join(data,by=c("index"="rowname"))
#dataset <- kategoriat %>% left_join(data,by=c("index"="rowname"))

dataset_shp_190620
#plot(dataset_shp_190620)

write.table(dataset_shp_190620, file = "C:/...TÄHÄN OMA TIEDOSTOSIJAINTISI.../dataset_shp_190620_shp.txt", sep = "\t", col.names = NA, qmethod = "double")

#ja jos on tarvetta niin ladataan vanhaa dataa näin...
#LUETAAN KOONTI TAKAISIN
dataset_shp_050520 <- read.delim("C:/...TÄHÄN OMA TIEDOSTOSIJAINTISI.../dataset_shp_050520_shp.txt")
View(dataset_shp_050520)

#ladataan taulut (jos tarvetta...)
#dbWriteTable(mydb, "dataset_shp_050520", dataset_shp_050520)
#tämä täytyy kyllä tehdä, jotta alla oleva kysely saadaan toimimaan...
dbWriteTable(mydb, "dataset_shp_190620", dataset_shp_190620)

#EILISEEN VERRATTUNA
rsa <- dbSendQuery(mydb, 'SELECT a.label, a.Tapauksia as Tartunnat_190620, b.Tapauksia as Tartunnat_180620, (a.Tapauksia)-(b.Tapauksia) as Ero_edellispäivään
FROM dataset_shp_190620 a  
LEFT JOIN dataset_shp_180620 b 
ON a.label = b.label')
dbFetch(rsa)

#RAJOITUSTEN HÖLLENTÄMINEN 1.6. LÄHTIEN
rsa <- dbSendQuery(mydb, 'SELECT a.label, a.Tapauksia as Tartunnat_190620, b.Tapauksia as Tartunnat_310520, (a.Tapauksia)-(b.Tapauksia) as Muutos_31_5_lähtien
FROM dataset_shp_190620 a  
LEFT JOIN dataset_shp_310520 b 
ON a.label = b.label')
dbFetch(rsa)


#RAJOITUSTEN POISTO - KOULUJEN AVAUS
rsa <- dbSendQuery(mydb, 'SELECT a.label, a.Tapauksia as Tartunnat_190620, b.Tapauksia as Tartunnat_130520, (a.Tapauksia)-(b.Tapauksia) as Muutos_13_5_lähtien
FROM dataset_shp_190620 a  
LEFT JOIN dataset_shp_130520 b 
ON a.label = b.label')
dbFetch(rsa)

Kuntakohtaiseen dataan pääsee käsiksi alla olevan koodin kautta….

#-----------------------------------------
#KUNNITTAIN
#----------------------------------------
#Paketti datan editoimiseen ja visualisointiin
 library(tidyverse)
#Paketti datan lukemiseen
 library(jsonlite)
library(sqldf)
library(DBI)
#Luetaan aineisto sisään
 aineisto <- fromJSON("https://sampo.thl.fi/pivot/prod/fi/epirapo/covid19case/fact_epirapo_covid19case.json?column=hcdmunicipality2020-445268L")

#puretaan kategoriat paloiksi
 label <- as.data.frame(unlist(aineisto$dataset$dimension$hcdmunicipality$category$label))
 index <- as.data.frame(unlist(aineisto$dataset$dimension$hcdmunicipality$category$index))
  
 #Nimetään palaset
 names(label)<-"label"
 names(index)<-"index"
  
 #Laitetana vielä rivinumerot sarakkeiksi, jotta nämä saadaan yhteen.
 label<-rownames_to_column(label)
 index<-rownames_to_column(index)
  
 #Yhdistetään rivinimeä käyttäen
 kategoriat <- index %>% left_join(label,by="rowname")
 
 #otetaan data
 data <- as.data.frame(unlist(aineisto$dataset$value))
 
 #Nimetään
 names(data)<-"Tapauksia"
 data<-rownames_to_column(data)
 data$rowname<-as.numeric(data$rowname)
 
#Yhdistetään muuhun aineistoon
dataset_kunta_190620 <- kategoriat %>% left_join(data,by=c("index"="rowname"))


#TALLENNETAAN OMAAN TIEDOSTOSIJAINTIIN MYÖHEMPÄÄ KÄYTTÖÄ VARTEN...
write.table(dataset_kunta_190620, file = "C:/...TÄHÄN OMA TIEDOSTOSIJAINTI.../dataset_kunta_190620_kunnittain.txt", sep = "\t", col.names = NA, qmethod = "double")

#KATSOTAAN VIELÄ MILTÄ POIMINTA NÄYTTÄÄ...
dataset_kunta_190620

#LUETAAN KOONTI TAKAISIN, MIKÄLI TARVITSET VANHOJA FILUJA....
dataset_kunta_040520 <- read.delim("C:/...TÄHÄN OMA.../dataset_kunta_040520_kunnittain.txt")
View(dataset_kunta_040520)

#ladataan taulut
#dbWriteTable(mydb, "dataset_kunta_040520", dataset_kunta_040520)
#dbWriteTable(mydb, "dataset_kunta_050520", dataset_kunta_050520)
#dbWriteTable(mydb, "dataset_kunta_060520", dataset_kunta_060520)
#dbWriteTable(mydb, "dataset_kunta_070520", dataset_kunta_070520)
#dbWriteTable(mydb, "dataset_kunta_080520", dataset_kunta_080520)
#dbWriteTable(mydb, "dataset_kunta_090520", dataset_kunta_090520)
#dbWriteTable(mydb, "dataset_kunta_100620", dataset_kunta_100620)
#dbWriteTable(mydb, "dataset_kunta_130520", dataset_kunta_130520)
#dbWriteTable(mydb, "dataset_kunta_010620", dataset_kunta_010620)
dbWriteTable(mydb, "dataset_kunta_190620", dataset_kunta_190620)

#LUODAAN NÄKYMÄ (VIEW) JA TEHDÄÄN VERTAILU EDELLISPÄIVÄÄN

dbExecute(mydb, 'CREATE VIEW dataset_sortattu_kunta_190620a AS SELECT a.label, a.Tapauksia as Tartunnat_190620, b.Tapauksia as Tartunnat_180620, (a.Tapauksia)-(b.Tapauksia) as Lisäys
FROM dataset_kunta_190620 a   
LEFT JOIN dataset_kunta_180620 b 
ON a.label = b.label ORDER BY Lisäys DESC')

#View(dataset_sortattu_kunta_190620)

#TOIMII MUTTA ANTAA SAMAN SARAKDATAN KUIN TÄMÄN PÄIVÄN TUTKI TUTKI
rsa <- dbSendQuery(mydb, 'SELECT * FROM dataset_sortattu_kunta_190620a ORDER BY Lisäys DESC')
dbFetch(rsa)

Ladataan vielä päiväkohtainen data ie. tartunnat päivittäin.

#“An inefficient virus kills its host. A clever virus stays with it.”
#—James Lovelock

#-----------------------------------------
#PÄIVITTÄIN
#----------------------------------------
#Paketti datan editoimiseen ja visualisointiin
 library(tidyverse)
#Paketti datan lukemiseen
 library(jsonlite)
library(sqldf)
library(DBI)
#Luetaan aineisto sisään
 aineisto <- fromJSON("https://sampo.thl.fi/pivot/prod/fi/epirapo/covid19case/fact_epirapo_covid19case.json?column=dateweek2020010120201231-443702L")

#puretaan kategoriat paloiksi
 label <- as.data.frame(unlist(aineisto$dataset$dimension$dateweek$category$label))
 index <- as.data.frame(unlist(aineisto$dataset$dimension$dateweek$category$index))
  
 #Nimetään palaset
 names(label)<-"label"
 names(index)<-"index"
  
 #Laitetana vielä rivinumerot sarakkeiksi, jotta nämä saadaan yhteen.
 label<-rownames_to_column(label)
 index<-rownames_to_column(index)
  
 #Yhdistetään rivinimeä käyttäen
 kategoriat <- index %>% left_join(label,by="rowname")
 
 #otetaan data
 data <- as.data.frame(unlist(aineisto$dataset$value))
 
 #Nimetään
 names(data)<-"Tapauksia"
 data<-rownames_to_column(data)
 data$rowname<-as.numeric(data$rowname)
 
#Yhdistetään muuhun aineistoon
dataset_day_190620  <- kategoriat %>% left_join(data,by=c("index"="rowname"))

dataset_day_190620

#TALLENNETAAN TIEDOT KANSIOON...

write.table(dataset_day_190620, file = "C:/..TÄHÄN OMA TIEDOSTOSIJAINTISI.../dataset_day_190620_paivittain.txt", sep = "\t", col.names = NA, qmethod = "double")


COVID-19 datan visualisointi

Sain eilen päivitettyä R-ohjelma viimeisimmän version ja tänään puran joitakin COVID-19 tietolähteitä ja teen malliksi muutaman graafin. Can’t wait…

covid -paketti, jonka latasin löytyy täältä: https://kjhealy.github.io/covdata/index.html

Latailin tarvittavat kirjastot ja samalla perehdyin piiitkästä aikaa R-studion saloihin. Täytyy myöhemmässä vaiheessa katsoa vielä tämän paketin data-päivitykset.

High-efficiency engine turns waste hot water into electricity

Energy news from Ireland
New engine technology that generates electricity from an often overlooked source – waste hot water – could reduce energy consumption for thousands of homes and businesses in Ireland, while also cutting harmful carbon emissions.
High-efficiency engine turns waste hot water into electricity © EXERGYN
Factories, power plants, data centres and cargo ships release waste heat that could be a useful source of energy. Finding an efficient and cost-effective way to capture and use this waste heat can lead to both significant fuel savings and reduced CO2 emissions. There are methods to harvest both high-grade and low-grade waste heat (below 100 ºC) but efficiency drops and cost increases as temperatures dip.

Read more…

Fingridin taajuusdata

Lähde: Fingridin nettisivut
Suomen sähkönkulutus on kaikkien verkkoon kytkettyjen kuormien summa, joten se vaihtelee jatkuvasti. Lisäksi kulutuksen taso muuttuu pidemmällä aikavälillä, tunneittain, vuorokausittain ja vuodenajoittain. Myös tuotannossa tapahtuu muutoksia lyhyellä ja pitkällä aikavälillä.
Kulutuksen ja tuotannon hetkellinen tasapaino ilmenee sähköverkon taajuudesta. Taajuus laskee alle 50 Hz nimellisarvon, kun kulutus on tuotantoa suurempi. Vastaavasti taajuus ylittää 50 Hz:n arvon, kun tuotanto on kulutusta suurempi. Taajuuden sallitaan vaihdella 49,9 ja 50,1 Hz välillä.

Tein r-ohjelmalla yhteenvetoja viime vuoden loka, marras ja joulukuun taajuusvaihteluista. Tulokset ja koodi alla.

#C:\Users\exl.marko.ekqvist\Dropbox\kuvat\home\Marko\Doctoralstudent\R\data\fingridtaajuus\2017\12
in17put1201 <- read.table("C:/.../data/fingridtaajuus/2017/12/2017-12-01.csv", header=TRUE, sep=",", na.strings="NA", dec=".", strip.white=TRUE) in17put1101 <- read.table("C:/.../data/fingridtaajuus/2017/11/2017-11-01.csv", header=TRUE, sep=",", na.strings="NA", dec=".", strip.white=TRUE) in17put1001 <- read.table("C:/.../data/fingridtaajuus/2017/10/2017-10-01.csv", header=TRUE, sep=",", na.strings="NA", dec=".", strip.white=TRUE) #yhdistetään total <- rbind( in17put1201, in17put1101, in17put1001 ) total$Month <- month(total$Time) head(total, 10) newdata <- total[c(2,3)] names(newdata) tmp <- do.call(data.frame, list(mean = apply(newdata, 2, mean), sd = apply(newdata, 2, sd), median = apply(newdata, 2, median), min = apply(newdata, 2, min), max = apply(newdata, 2, max), n = apply(newdata, 2, length))) tmp summary(newdata)

Value Month
Min. :49.83 Min. :10
1st Qu.:49.97 1st Qu.:10
Median :50.00 Median :11
Mean :50.00 Mean :11
3rd Qu.:50.03 3rd Qu.:12
Max. :50.17 Max. :12

Tämän mukaan tuotanto on kulutusta suurempi loppuvuonna, kun taas lokakuussa näyttäisi kulutuksen olevan suurempi kuin tuotanto. Tarkkaavainen lukija huomasi myös, että em. laskenta kohdistui vain tarkastelukuukausien ensimmäisiin päiviin.

Mitä tällä tarkastelulla haetaan?
Tarkoitus on linkittää päiväkohtainen (tai kuukausikohtainen) data ympäristössä tapahtuneisiin muutoksiin. Näitä muutoksia voivat olla uudet laitokset, tehtaiden ylösajot, huoltoseisokit, tuulivoimaloiden käyttöönotto tai niiden kytkeminen valtakunnan verkkoon. Tarkastelun avulla voidaan indikoida sellaisia muutoksia tässä kehysympäristössä, jotka saattavat olla riskejä sähköverkon toimivuuden kannalta. Tämän tarkastelun ulkopuolelle rajataan (tai pyritään rajaamaan) sellaiset laitteiden vikaantumiset, joihin ei eri toimilla pystytä vaikuttamaan tai mikäli mahdollista, niin pyritään tuomaan näistä tekijöistä johtuvat korjaavat toimenpiteet ja niihin liittyvät riskit esille.

Copyright MySci 2025
Tech Nerd theme designed by Siteturner