R-ohjelmointi.org

Tilastotieteellistä ohjelmointia R-kielellä

Riskin visualisointi

Erilaisten terveysriskien hahmottaminen voi välillä olla vaikeaa. Useinhan riskeistä puhutaan esimerkiksi prosentteina tyyliin: ”Sinulla on 1% mahdollisuus kuolla ennen 30. syntymäpäivääsi”. Yhden prosentin riski voi olla helpommin käsitettävissä, jos siitä puhutaan luonnollisilla frekvensseillä eli tyyliin ”1 henkilö sadasta kuolee ennen 30. syntymäpäiväänsä”. Luonnollisten taajuuksien visualisointi on myös helppoa.

Kirjan The Illusion of Certainty kirjoittajat ehdottavat, että riskien havainnollistamiseen käytettäisiin Risk Characterization Theatre -esitystapaa. Siinä teatterin istumakaaviota käyttäen voidaan eri väreillä merkitä esimerkiksi sairastumisen riskissä olevien henkilöiden määrää osuutena kaikista henkilöistä. Stubborn Mule on tehnyt näistä R-pohjaisen visualisoinnin, jolla hän havainnollistaa kirjassa esitettyä esimerkkiä ja tupakoinnin aiheuttamaa riskiä.

Tuossa teatterimuotoisessa esityksessä minua häiritsi suuresti sen muoto ja ihmisjoukon suuruus. Kuviossa on nimittäin tuhat henkilöä, mutta kuinka moni on nähnyt jossakin salissa 1 000 yhdellä kertaa? Lisäksi kuvio on useampien riskien yhtäaikaista visualisointia ajatellen aavistuksen hankalan muotoinen. Niinpä kirjoitin oman funktion, jossa henkilöiden määrä perustuu Finnairinkin käyttämän Boeing 757-200 -koneen istumapaikkakaavioon. Koneeseen mahtuu 227 matkustajaa.

Itse funktio rct() näyttää R-koodina seuraavalta:

rct<-function(plans="Finnair Boeing 757-200", cases, main) {
   if(plans=="Finnair Boeing 757-200") {
      seats<-227
      available<-"#009900"
      occupied<-"grey75"
      m<-matrix(nrow=6, ncol=39, data=available)
      m[1:3,1]<-"white"
      m[1,10]<-"white"
      m[1,11]<-"white"
      m[6,11]<-"white"
      m[6,30]<-"white"
      x11(width=7, height=0.89)
      par(mar=c(0.1,2,2,0.1), xpd=NA)
      plot(x=1, y=1, xlim=c(1, ncol(m)), ylim=c(1, nrow(m)), 
         col="white", type="n", axes=F, xlab="", ylab="", 
         main=main, family="sans")
      lines(x=c(0.75,-2.5), y=c(0.5,3))
      lines(x=c(-2.5,-2.5), y=c(3,4))
      lines(x=c(-2.5,0.75), y=c(4,6.5))
      lines(x=c(39.5, 40.5), y=c(0.5,2.5))
      lines(x=c(40.5, 40.5), y=c(2.5,4.5))
      lines(x=c(40.5,39.5), y=c(4.5,6.5))   
   }
   if(cases>seats) {
      stop(paste("The plane can only accommodate ", 
         seats, " passangers. You have asked for more 
         cases than available seats!", sep=""))
   }
   m2<-m
   m2[m2!="white"]<-1:seats
   m[m2 %in% as.character(sample(1:seats, cases))]<-occupied
   for(i in 1:nrow(m)) {
      for(j in 1:ncol(m)) {
         points(x=j, y=i, pch=15, col=m[i,j])
      }
   }
}

Funktio ottaa parametreina kuvioon harmaalla merkittävien kuolleiden henkilöiden lukumäärän, joka voi siis olla korkeintaan 227. Lisäksi kuviolle voi antaa otsikon. Esimerkiksi komento:

rct(cases=100, main="Testi")

piirtää kuvion, jossa 100 penkkiä on väritetty harmaalla (kuolleet), ja jäljelle jäävät 127 penkkiä (elossa olevat) vihreällä.

Miltä esimerkiksi Suomen vuoden 2010 kuolleisluvut (Tilastokeskus) näyttävät tätä visualisointi käyttäen? Tämä on esitetty seuraavassa kuviossa, joka siis vastaa kysymykseen: ”Jos vauvoja syntyi yhteensä 227, kuinka moni heistä on elossa täytettyään X vuotta?”

Saman tiedon voi toki visualisoida paljon pienemmässä tilassa esimerkiksi viiva- tai pylväskaaviota käyttäen, mutta tällainen esitystapa voi toisinaan olla vaikuttavampi.