perjantai 21. joulukuuta 2012

Menneet viimat, tulevaisuuden tuulet

Ajattelin koota hieman mennyttä vuotta yhteen ja katsoa tulevaisuuteen, sillä on tullut aika juhlistaa tämän datajournalismi-blogin syntymäpäivää.

Julkaisin nimittäin ensimmäisen viestin keskiviikkona, 21. joulukuuta 2011. Kirjoituksen aiheena oli tuolloin Ei-versionhallintadatan visualisointi Gource:lla ja käsittelin datan siivoamista ja visualisointia verkostojen avulla. Olin vast'ikään siirtynyt Tampereen teknillisestä yliopistosta ja tutkijan vakanssista Svenska Yle:en Web-suunnittelijaksi (käytännössä Drupal-koodariksi) ja ajattelin, että blogi olisi myös hyvä tapa ylläpitää kontaktia aikaisempaan uraani.

Valitsin nimen lähinnä hetken mielijohteesta mutta myös, koska termi "datajournalismi" ilmensi mielestäni hyvin sellaisia käsitteitä kuten visuaalinen tarinan kerronta sekä käyttäjäinteraktio, joista olin tuolloin hyvin kiinnostunut. Tuossa vaiheessa en kuitenkaan osannut juurikaan ajatella mitä "journalismi"-osuus edes sanassa datajournalismi voisi tarkoittaa. Minulle datajournalismi merkitsi terminä lähinnä sellaisten visualisointien toteuttamista, jotka kertovat datan tarinan lukijalle ymmärrettävässä muodossa. Blogia perustaessani olin siis täysin untuvikko datajournalismin saralla ja olin kuullut koko termistä ensimmäistä kertaa muutamaa kuukautta aikaisemmin osallistuessani Antti Poikolan masinoimaan datajournalismin päivään.

Kuitenkin heti ensimmäinen kirjoitus yllätti minut suosiollaan (tähän päivään mennessä 372 lukukertaa) ja sain sen johdosta paljon positiivista palautetta eri tahoilta. Palautteen kannustamana koin, että blogille on tarvetta ja olenkin kirjoittanut tähän päivään mennessä tämä viesti mukaan lukien 48 kirjoitusta erilaisista datajournalismiin liittyvistä asioista.

Suosituin viesteistäni on ollut kirjoitus Hyvinkään ampumistapauksesta epäillyn sosiaalisesta verkostosta, johon Yle Uutiset linkkasi minusta tehdyssä haastattelussa (2111 lukukertaa). Kokonaisuudessa lukukertojen perusteella kirjoitusten Top5 näyttää seuraavalta:
Keskimäärin yksittäinen kirjoitus blogissa kerää muutama sata lukukertaa. Tavanomaisena päivänä, jolloin en julkaise mitään vierailee blogissa tilastojen mukaan muutamia kymmeniä henkilöitä. Yhteensä blogi on kerännyt runsaat 16 000 lukukertaa, joka tekee runsaat 40 lukukertaa yksittäistä päivää kohden.

Näin tilastojen valossa. En kuitenkaan missään vaiheessa arvannut, että harrastuksesi kirjoittamallani blogilla olisi osaltaan niin merkittävä vaikutus tulevaisuuteeni. Vuoden aikana olen nimittäin Drupal-työni ohessa vapaa-ajallani osallistunut Yle:ssä ja muissa mediaorganisaatioissa yheensä n. 20:een datajournalistiseen projektiin, enkä voi olla uskomatta, etteikö esimerkiksi tämän blogin saamalla huomiolla olisi ollut tiettyä vaikutusta siihen, että olen noihin projekteihin ajautunut. Toki olen ollut myös suotu erittäin hienoilla ystävillä ja työkavereilla, jotka ovat edesauttaneet asioita ja suositelleet minua mukaan hankkeisiin.

Tämä menneistä. Katsottaessa tulevaisuuteen niin on tästä harrastuksesta nyt tulossa minulle oikea työ. Aloitan vuoden vaihteen jälkeen työt Yle:een perustettavassa PlusDesk-toimituksessa Uuden ajan toimittajana eli datajournalistina. Toimitus tulee alkuvaiheessa olemaan viiden hengen suuruinen ja pitää sisällään itseni lisäksi tuottajan (Juho Salminen) ja kolme graafista osaajaa. Tehtävämme on käytännössä tuottaa dataan perustuvaa journalismia uutis- ja ajankohtaistoimituksille. Uudenlaista ja julkiselle palvelulle ominaista sisältöä.

Minulla on paljon suunnitelmia ja odotuksia tulevaa työtäni varten ja niistä toivottavasti kaikki datajournalismista kiinnostuneet saavat tietää tuonnempana.

Kiitos kaikille blogia lukeneille ja hyvää joulua sekä railakasta tulevaa vuotta.

torstai 13. joulukuuta 2012

Sormiharjoitus Twitter-datalla, osa 2

Käsittelin pari viikkoa sitten yksinkertaista Twitter-datan analyysiä, joka muodostui siinä määrin yleisömenestykseksi, että ainakin neljä ihmistä innostui sen perusteella tekemään vastaavanlaisen visualisoinnin ja tästä hurmioituneena ajattelin jatkaa saman aiheen tiimoilta.

Tällä kertaa minulla on tavoitteena kertoa miten on mahdollista kerätä ja visualisoida käyttäjän kuukausittaiset twiittimäärät. Innostuin ideasta viime aikoina Twitter:ssä liikkuneen ilmiön kautta, jossa kerrotaan omista Twitter:iin liittymispäivistä (kts. Twitter Birthday -palvelu). Etenkin, että monet kertoivat liittyneensä jo useita vuosia sitten, mutta aktivoituneen palvelun käyttämiseen vasta viime aikoina, herätti minussa kiinnostuksen siitä milloin itse aloin todella Twitter:ä käyttämään.

Ajatus, joka minulle heräsi oli kerätä talteen kaikki twiittini ja ryhmitellä ne kuukausittaisiksi twiittimääriksi. Eli esimerkiksi niin, että joulukuussa 2011 twiittasin 98 kertaa ja tammikuussa 2012 84 kertaa. Halusin nähdä datan piirrettynä yksinkertaisesti visualisoituna pylväsdiagrammiksi, jossa pystyakseli kuvaa twiittien määrää ja vaaka-akseli aikaa. Näin pystyisin näkemään missä vaiheessa olen esimerkiksi saavuttanut twiittimäärissäni nykyisen tason ja millä tavoin tuo twiittien kuukausitten määrä on vaihdellut eri aikoina.

Mutta nyt itse asiaan!



Kuten aikaisemmasta harjoituksesta opimme on All My Tweets -palvelun kautta mahdollista ladata käyttäjän kaikki twiitit aina
30003200:een viimeisimpään twiittiin saakka (Note: Twitter limits the number of tweets returned to 3,200). Itselläni tämä raja ei tule täyteen, joten edelleen palvelu palvelee käyttötarkoitustani.

Aloitan kuten aikaisemmassakin esimerkissäni eli kopioin henkilökohtaisen All My Tweets -sivuni sisällön Sublime Text -editoriin leikepöydän kautta. Analyysia tehdessäni minulla oli Twitter:n mukaan 1930 twiittiä ja tarkistin, että tämä lukuarvo täsmäsi Sublime Text -editoriin kopioituneiden rivien määrää. (Kuva 1)

Otin twiitit talteen All My Tweets-palvelusta yksinkertaisesti maalaamalla kaikki twiitit ja kopioimalla ne leikepöydän kautta käyttämääni Sublime Text -tekstieditoriin. (Kuva 1)
Edellisellä kerralla halusin poistaa kaikki aikaleimatiedot datasta, koska en halunnut niitä mukaan avainsanapilveen. Tällä kertaa motivaationi on sen sijaan muokata päivämäärätietoa niin, että siitä poistetaan reduntantti tieto twiitin lähetyspäivästä, koska haluan niputtaa twiittejä yhteen nimen omaan kuukauden ja vuoden perusteella. All My Tweets -palvelusta kopioitujen twiittien perässä oleva aikaleima on muotoa "Dec 10, 2012", joten tavoitteeni on muuttaa tekstijono muotoon "Dec, 2012". Tällä tavoin kaikki joulukuussa 2012 lähetetyt twiitit saavat yhteisen nimittäjän, jonka avulla ne on myöhemmässä vaiheeessa mahdollista visualisoida.

Teen muunnoksen jälleen säännöllisten lausekkeiden avulla. Käyttämäni etsi ja korvaa koodi näyttää seuraavalta:

([A-Z]{1}[a-z]{2}) ([0-9]+), ([0-9]{4})

ja

\1, \3

Korvaan siis merkkijonon jossa on kolme merkkiä joista ensimmäinen on kapitaali, välilyönti, numeroita yksi tai useampi, pilkku, välilyönti, sekä neljä numeroa siten, että poistan päivämäärää kuvaavan osuuden. (Kuva 2)

Etsi ja korvaa toiminto löytyy CMD/CTRL + SHIFT + F näppäinyhmistelmän takaa. Voit myös tarkistaa, että vasemmasta alanurkasta löytyvä hakutuloksien määrä vastaa twiittiesi määrää. (Kuva 2)
Tähän asti toteutus on edennyt hyvin samalla kaavalla kuin edellisessäkin harjoituksessa. Data hankittiin All My Tweets -palvelusta ja sitä muokattiin hieman sopivampaan muotoon Sublime Text -editorissa. Tässä kohtaa esimerkit lähtevät kuitenkin eri poluille, koska aikaisemmassa harjoituksessa veimme tekstimuotoisen datan suoraan Sublime Text -editorista Wordle:en. Nyt datan muokkaamista tulee kuitenkin jatkaa antamalla sille lisää rakenteisuutta, koska on tarpeellista pystyä osoittamaan missä kohtaa twiitin tekstisisältö loppuu ja tieto twiitin lähetysajankohdasta alkaa.

Tein twiitin tekstisisällön ja aikaleiman erottamisen askelsarkainmerkillä (tabulator). Tämä siitä syystä, että esimerkiksi pilkun tai puolipisteen käyttäminen ei ole oikein mielekästä, koska ne ovat normaalisti twiiteissä/tekstissä käytettäviä merkkejä ja erotinmerkin tulee olla sillä tavalla yksikäsitteinen, ettei sitä voida sekoittaa sisältöön. Eli oletan, ettei twiittien sisällöissä ole askelsarkaimia. (Kuva 3)

Poistan päivämäärien edessä olevan välilyönnin ja korvaan sen askelsarkain merkillä, jota käytän erottamaan tekstisisältö- ja aikasolut toisistaan. (Kuva 3)
Nyt data on valmis tallennettavaksi (CMD/CTRL + S). Tallennettaessa kannattaa käyttää .csv-tiedostopäätettä. CSV-tiedosto on rakenteista dataa sisältävä tiedostoformaatti, jossa data on useimmiten eroteltu toisistaan pilkuilla, mutta pilkkujen sijaan on mahdollista käyttää oikeastaan mitä tahansa erotinmerkkiä (kts. DSV). CSV-tiedoston avaaminen onnistuu kätevimmin LibreOffice-taulukkolaskentaohjelmassa, joka mahdollistaa tiedostossa käytettävän erotinmerkin manuaalisen valitsemisen. (Kuva 4)

Erotinmerkiksi on valittu "Tab". Muut asetukset toimivat usein sellaisenaan, mutta ongelmia voi syntyä esimerkiksi merkistökoodauksen kanssa, jolloin "Character set" asetusta voi yrittää muuttaa valintojen ISO-8859-1:n ja UTF-8:n välillä. (Kuva 4)
Tiedoston avaamisen jälkeen huomasin, että muumien twiittien aikaleimat eivät olleet tulleet oikein erotelluiksi, mutta korjasin ne tässä vaiheessa käsin, koska kyse oli vain muutamasta kymmenestä virheellisestä esiintymästä. (Kuva 5)

Dataa kannattaa selata silmämääräisesti läpi, jotta huomaa tämänkaltaiset ilmiselvät virheet. (Kuva 5)
Korjattuani virheet tallensin tiedoston uudelleen LibreOfficessa ja tehdessäni näin valitsin, että haluan muokata asetuksia (Kuva 6). Tämä mahdollistaa sen, että voin valita mitä erotinmerkkiä jatkossa käytetään (Kuva 7). Tämä on tärkeää, koska seuraavaksi käyttämämme Excel ei osaa käsitellä oletuksena kuin puolipistein eroteltua dataa.

"Edit filter settings" -asetus antaa seuraavassa vaiheessa mahdollisuuden muokata .csv-tiedoston asetuksia. (Kuva 6)
Tärkeää on valita "Field delimeter" -kohtaan puolipiste (;) ja Text delimeter -kohtaan lainausmerkki ("). (Kuva 7)
Nyt minulla on siis hyvin jäsennelty .csv-muotoinen tiedosto, joka sisältää taulukkodataa missä on rivejä twiittieni määrä ja kaksi saraketta. Ensimmäinen sarake pitää sisällään lähettämäni twiitin sisällön ja toinen tiedon siitä minä kuukautena ja vuotena twiitti on lähetetty.

Seuraavaksi avaan tiedoston Excel:ssä. Mikäli huomaat ongelmia ääkkösten kanssa voit yrittää vaihtaa kuvassa 7 näkyvän Character set valinnan ISO-8859-1:ksi (twiittien tekstisisällöllä ei tämän harjoituksen kannalta ole kuitenkaan merkitystä). Kuitenkin jos kaikki meni hyvin näet aika- ja twiittitiedot eroteltuina omiin soluihinsa myös Excel:ssä. Mitä meidän täytyy tässä vaiheessa tehdä on lisätä datan alkuun yksi rivi, johon lisäämme solujen kuvauksen. (Kuva 8)

Sarakkeille on annettava nimet, jotta voimme käsitellä niitä jatkossa. Nimi sijoitetaan lisäämällä alkuun uusi rivi ja sijoittamalla rivien ensimmäisiin sarakkeisiin jokin saraketta kuvaava tunniste. (Kuva 8)
Nyt dataa on mahdollista analysoida Excel:ssä. Tämä onnistuu helposti Pivot-taulukoiden avulla. Pivot-taulukon luominen onnistuu kätevimmin osoittamalla kenttää A1 ja valitsemalla valikosta Tiedot -> Pivot. Pivot-taulukot mahdollistavat taulukkomuotoisen datan jäsentämisen ja yhteenkokoamisen. Eli esimerkiksi tässä tapauksessa Pivot-taulukko mahdollistaa, että voimme niputtaa twiitit aika-sarakkeen perusteella yhteen. Myös LibreOffice:sta löytyy Pivot-toiminnallisuus, mutta olen kokenut, että Excel:n vastaava on hieman näppärämpi käyttää. (Kuva 9)

Luotuani Pivot-taulukon huomasin, ettei taulukkoa ollut mahdollista järjestää ajallisesti laskevaan tai nousevaan järjestykseen, koska kuukausien lyhennetyt nimet eivät järjestäyty tietokoneen avulla millään yksinkertaisella logiikalla kronologiseen järjestykseen. Aikamääreet olisi voinut muuntaa tässä kohtaa johonkin toiseen muotoon, mutta päädyin tekemään järjestämisen käsin, koska kyse oli kuitenkin vain muutamasta kymmenestä data-alkiosta. Käsin järjestetty data on nähtävillä kuvassa 9 oikealla puolella ja alkuperäinen Pivot-taulukko vasemmalla.

Vasemmalla vihreän otsakkeen alla näkyy Pivot-taulukko. Oikealla sama data, mutta jäsennettynä ajallisesti nousevaan järjestykseen. (Kuva 9)
Nyt data on helppo visualisoida Excel:stä löytyvillä kaavio-komponenteilla. Tämä onnistuu maalaamalla haluttu data – tässä tapauksessa kuvassa 9 näkyvä oikeanpuolimmainen data – ja lisäämällä soveltuvan valikon kautta taulukkoon kaaviokomponentti. Kaaviokomponentiksi valitsin pylväsdiagrammin, koska se on melko luonnollinen tapa kuvata tämänkaltaista dataa määrällistä dataa, jolla on kaksi ulottuvuutta (määrä ja aika). (Kuva 10)

Twitter-käyttöni trendi on ollut selkeästi kasvava. (Kuva 10)
Näinkin monivaiheisen toteutuksen tekeminen oli kuitenkin melko yksinkertaista ja ei ehkä vienyt minulta kuin 15-minuuttia. Tämä kertoo toki, että olen melko sopeutunut käyttämään eri sovellusten parhaita puolia datan käsittelyssä ja tiedän valmiita polkuja, joiden avulla pääsen haluamaani lopputulokseen. Uskon kuitenkin, että jos vain suuntaviivat ovat selvillä niin samankaltaiseen lopputulokseen pääseminen ei ole kovin suuri tekninen haaste.

Jatkokehitysideoitakin keksin matkan varrella kuten, että pylväät voisivat pitää sisällään tiedon siitä kuinka moni twiiteistä kulloisenakin kuukautena on ollut uudelleentwiittaus (retweet).

Kuulen taas mielelläni jos joku on onnistunut toteuttamaan omasta Twitter-datastaan samanlaisen analyysin. Tai mielelläni pullautan tarvittaessa tällaisen sellaisesta kiinnostuneelle.

Muokkaus: 14.1.2013

Tässä Anna Emilia Alentolan versio:
https://twitter.com/anniemilia__/status/282175539157028865

maanantai 10. joulukuuta 2012

Datajournalisti vs. Internet Explorer

Tämä on tarina turhautumisesta ja liian pitkäksi venyneestä päivästä.



Tein yhteistyössä Eva Koskisen ja Pekka Palmgrenin kanssa Radar:lle muutaman visualisoinnin koskien amerikkalaisen Capital Group -investointipankin sijoituksia suomalaisissa pörssiyhtiöissä. Aiheesta julkaistu juttu löytyy täältä: Radar: Anonyma ägare på finska börsen

Visualisointien toteutus ja kasaaminen oli melko suoraviivainen ja nopea prosessi, koska käytin olemassa olevia komponentteja. Tämä oli tarkoituksenmukaista sillä muutamassa päivässä, jotka minulla oli aikaa ei ollut mahdollista lähteä toteuttamaan mitään laajempaa omaa ja uudenlaista toteutusta.

Juttuun toteuttamiani tiedonvisualisointikomponentteja oli kolme:
  1. pallovisualisointi, joka kuvaa Capital Group:n sijoitusten suuruutta yrityksissä. (Kuva 1)
  2. taulukko, josta on mahdollista vertailla tietoja perustuen yrityksen omiin kotisivuihin ja muualta kerättyihin tietoihin. (Kuva 2)
  3. pylväsdiagrammi, joka mahdollistaa valittujen yritysten omistajatietojen tarkastelun. (Kuva 3)
Pallovisualisointi kuvasi Capital Group:n sijoitusten arvoja eri yrityksissä. Värit oli asetettu satunnaisesti USA:n lipun väreihin. (Kuva 1)
Taulukosta oli mahdollista vertailla yksittäisen yrityksen omistajalistaa kahden eri lähteen perusteella. (Kuva 2)
Pylväsdiagrammista oli mahdollista selata halutun yrityksen suurimpia omistajia perustuen vaihtoehtoisesta tietolähteestä kerättyihin tietoihin. (Kuva 3)
Pallovisualisoinnin (Kuva 1) toteutin perustuen esimerkkiin, joka löytyy täältä:
http://vallandingham.me/vis/gates/

Samaa lähdekoodia on hyödynnetty mm. New York Times:n toteuttamassa visualisoinnissa, jossa käsitellään USA:n budjettia.

Pylväsdiagrammin toteutin D3-Generator -palvelun avulla. Muokkasin palvelun tuottamaa koodia vain niin, että käyttäjän oli mahdollista valita pudotusvalikon avulla tarkasteluun haluamansa yrityksen tiedot.

Taulukkovisualisointi toteutettiin leipätekstin sekaan sellaisenaan HTML:n ja CSS:n avulla. Kyseessä oli siis tavallinen <table>-HTML-taulukko.



Interaktiiviset visualisoinnit toteutin D3.js-JavaScript-kirjaston avulla. Kirjasto mahdollistaa graafisten elementtien yksinkertaisemman toteuttamisen samaan tapaan kuin jQuery helpottaa tavallisten JavaScript-toiminnallisuuksien toteuttamista. D3.js-kirjasto tarjoaa valmiita funktioita ja toiminnallisuuksia, joiden avulla esimerkiksi kuvassa 3 nähtävien pylväiden piirtäminen onnistuu vain muutaman koodirivin avulla.

D3.js:ää on käytetty maailmalla paljon ja se on Raphaël-kirjaston ohella yksi eniten käytetyistä JavaScript-kirjastoista mitä tulee interaktiviisten visualisointien toteuttamiseen selainympäristöissä. Vaikka D3.js on yleisesti käytetty ei se kuitenkaan ole ongelmaton kaikkien selainten suhteen. Tai pikemminkin kaikki selaimet eivät noudata Internet-standardeja siinä määrin, että D3.js:llä toteutetut visualisoinnit toimisivat niissä aina suoraan. Syyttävä sormi osoittaa tässä etenkin Internet Explorer -selaimeen ja sen vanhempiin versioihin (IE 8 ja vanhemmat).

Myös toteuttamani visualisointien kohdalla jouduin toteamaan, etteivät ne toimi IE 8:n ja vanhemmilla selaimilla. Virheilmotukseksi selain antaa:

CSSStyleDeclaration undefined

joka aiheuttaa, että koko D3.js-kirjasto jää määrittelemättä eikä visualisointi toimi siten lainkaan. Google:n avulla ongelmaan löytää D3.js:ään ja kyseiseen virheilmoitukseen linkittyviä aiheita, mutta mitkään niistä eivät tarjonneet toimivaa ratkaisua, jota olisin voinut hyödyntää.

Tilanne oli sinällään erittäin turhauttava, että visualisointi toimi hienosti missä tahansa modernissa selaimessa. Kuitenkin kun Yleisradio:n hiljainen lupaus on tuottaa sisältöä kaikille kansalaisille velvoittaa se ottamaan huomioon kaikki kohderyhmät. En kuitenkaan halunnut jättää toteutusta tämän lupauksen takia julkaisematta, koska olin käyttänyt jo suhteellisen paljon aikaa visualisointien toteuttamiseen.

Vaihtoehtoina oli pyrkiä korjaamaan virhe ja tekemään D3.js:stä paremmin yhteensopiva Internet Explorer -selaimen kanssa, mutta sinällään tämä tie olisi voinut olla hyvinkin kivinen ja aikataulullisesti haastava, koska toteutus tuli saada ulos seuraavana päivänä. Ratkaisuni oli päätyä toteuttamaan visualisoinneista erilliset versiot vanhemmille selaimille, jotka eivät vaatisi niin monimutkaisia JavaScript-toiminnallisuuksia.

Pallovisualisoinnille (Vis 1) toteutin version, joka toimii myös IE:llä (Vis 2) ottamalla kuvankaappauksen alkuperäisestä versiosta ja lisäämällä kuvankäsittelyohjelmassa eri yritysten tiedot visualisoinnin päälle käsin. Eli sen sijaan, että käyttäjän oli mahdollisuus osoittaa palloja hiirellä näytettiin hänelle kaikki data kerralla (joka ironisesti ehkä osoittautui kyllä paremmaksikin tavaksi esittää data).

Interaktiivinen D3.js toteutus näytti yritysten tiedon käyttäjän viedessä hiiren halutun yrityksen päälle. (Vis 1)
Staattisessa kuvassa kaikki yritysten tiedot olivat esillä heti. (Vis 2)
Pylväsdiagrammivisualisoinnissa taas otin kuvankaappaukset kaikista yksittäisten yritysten tiedoista (Kone, Sampo, Nokian Renkaat, Orion ja Nokia) ja muutin toteutusta niin, että datan interaktiivisen uudelleen piirtämisen sijaan visualisointia hallitaan CSS+JavaScript -toiminnallisuuden avulla. IE:lle optimoitu toteutus toimii niin, että kun käyttäjä klikkaa haluamaansa yritystä, piilottaa JavaScript-koodi CSS:n avulla kaikki muut kuin käyttäjän valitseman yrityksen kuvat näkyvistä. Tämänkaltainen toteutus on siinä määrin yksinkertainen, että edes IE ei pysty sen implementoinnissa epäonnistumaan. (Vis 3 & Vis 4)

Interaktiivisessa pylväsdiagrammissa käyttäjän oli mahdollista osoittaa yksittäisiä pylväitä saadakseen lisätietoja. (Vis 3)
Internet Explorer -selaimelle toteutetussa versiossa yrityksen valinta oli tehty linkkien avulla, jotka mukautuvasti näyttivät ja piilottivat kuvia. (Vis 4)
Leipätekstiin interaktiiviset visualisoinnit upotettiin <iframe>:n avulla seuraavasti:

<!--[if (lt IE 9)&(!IEMobile)]>
<iframe src="http://svenska.yle.fi/dataviz/capitalgroup/juttu3/fallback/index.html?l=se" width="400" height="560" frameborder="0" scrolling="no" style="overflow:hidden;">Laddar...</iframe>
<![endif]-->

<!--[if gte IE 9]><!-->
<iframe src="http://svenska.yle.fi/dataviz/capitalgroup/juttu3/index.html?l=se" width="400" height="560" frameborder="0" scrolling="no" style="overflow:hidden;">Laddar...</iframe>
<!--[endif]-->


Koodissa käytetään IE:n tunnistamia conditional comments -lausekkeita, jotka mahdollistavat IE:lle erityisten koodipätkien kirjoittamisen. Kyseisessä koodissa IE 9:ää vanhemmille selaimille tai IE:n mobiiliselaimelle näytetään yksinkertaistettu "fallback" versio toteutuksesta.

Internet Explorer yhteensopivuuden toteuttaminen vei aikaani siitä kun olisin voinut viimeistellä visualisointeja paremmiksi ja selkeämmiksi, joka aiheutti etenkin pallovisualisoinnin (Vis 1) kohdalla, että en ollut lopputulokseen täysin tyytyväinen.

http://stefanvermaas.nl/wp-content/uploads/2012/08/internet_explorer_fail.jpeg
Suosittelen kaikille esimerkiksi Google Chrome, Mozilla Firefox tai Safari -selaimia, joita käyttäessänne teette minun ja monen muun web-sovelluksia kehittävän ihmisen elämän todella paljon helpommaksi.

keskiviikko 21. marraskuuta 2012

Sormiharjoitus Twitter-datalla

Julkaisin viime viikolla twiitin, jossa kerroin erilaisista tunnusluvuista koskien Twitter:ni käyttöä ja lisäksi olin liittänyt mukaan kuvassa 1 näkyvän twiittieni sanapilven.

Avasin twiittieni tunnuslukuja ja piirsin sisällöistä sanapilven. (Kuva 1)
Mielestäni tekemäni sormiharjoitus oli siinä määrin hauska ja dataa monipuolisesti käsittelevä, että halusin jakaa kokemukseni. En väitä, että käsittelemäni menetelmät olisivat paras tapa selvittää kyseisiä Twitter-tilin tietoja, mutta käytän niitä tässä, koska ne ovat hyödynnettävissä hyvin monenlaisessa datan käsittelyssä.



Tarina sai alkunsa kun löysin netistä palvelun nimeltä All My Tweets, joka listaa annetun käyttäjän kaikki twiitit (3000 ensimmäistä). Egosentrisenä ihmisenä lähdin kokeilemaan oman tilini tilannetta ja löysin palvelulla tuolloin 1729 twiittiä. Tarkastin, että luku täsmäsi Twitter-profiilistani löytyvään arvoon.

Mieleeni tuli, että voisin visualisoida twiitit avainsanapilvenä. Ajattelin, että tämä olisi helppoa verkosta löytyvän Wordle-työkalun avulla, joka mahdollistaa avainsanapilvien toteuttamisen yksinkertaisesti syöttämällä palveluun sisältöä. Haluttu sisältö oli mahdollista kopioida All My Tweets -palvelusta leikepöydälle ja sieltä Wordle:en, mutta ongelma oli, että tässä selaimen ruudulta kopioidussa sisällössä olivat mukana twiittien aikaleimat (esim. Nov 17, 2012). Nämä aikaleimat mielletään Wordle:n puolesta myös osaksi sisältöä, joten halusin päästä niistä eroon, koska ne olisivat esiintymistiheytensä myötä nousseet avainsanapilvessä hallitsevaan asemaan. (Kuva 2)

Nappasin twiittini All My Tweets -palvelusta yksinkertaisesti maalaamalla ja kopioimalla koko sivun sisällön leikepöydälle. (Kuva 2)
Ratkaisin ongelman jatkokäsittelemällä Twitter-dataani. Datan käsittelyyn ja esimerkiksi tämankaltaisen aikaleimatiedon poistamiseen on useita eri mahdollisuuksia, mutta toteutin siivoamisen säännöllisten lausekkeiden avulla Sublime Text -editorissa. Sublime Text on periaatteessa hyvin tavallinen tekstieditori, joka kuitenkin sisältää konepeltinsä alla hyvin laajan ominaisuuksien kirjon. Yksi hyödyllisistä on "etsi/korvaa" -toiminnallisuus, joka mahdollistaa merkkijonojen korvaamisen –  perinteisen tavan lisäksi myös – säännöllisten lausekkeiden avulla.

Säännölliset lausekkeet mahdollistavat hakuehtojen muodostamisen erinäisten hahmojen (engl. pattern) avulla. Säännöllisten lausekkeiden avulla on esimerkiksi mahdollista hakea päivämäärää muodossa 2012-11-19 käskemällä ohjelman etsiä merkkijonoa jossa on:
  • neljä numeroa
  • viiva
  • kaksi numeroa
  • viiva
  • kaksi numeroa.
Näin ollen säännöllisten lausekkeiden avulla on mahdollista hakea kerralla kaikki tekstissä esiintyvät päivämäärät ja muuntaa ne esimerkiksi suomalaiseen muotoon 19.11.2012. Tavallisella etsi/korvaa -toiminnolla tämänkaltainen muuntaminen olisi mahdollista vain päivämäärä kerrallaan.

Tässä tapauksessa halusin poistaa tekstistä kaikki "Nov 16, 2012" -tyyliset merkkijonot. Hakemassani merkkijonossa tulisi siis löytyä:
  • kolme kirjainta
  • välilyönti
  • kaksi numeroa
  • pilkku
  • välilyönti 
  • neljä numeroa. (Kuva 3)
Säännöllisen lausekkeen löytämät merkkijonot näkyvät rajattuina suorakulmioihin. Haettu merkkijono korvataan tyhjällä eli käytännössä poistetaan. (Kuva 3)
Koska tavoitteeni oli poistaa löydetyt päivämäärää kuvaavat merkkijonot valitsin, että kyseisen haun tulokset korvattaisiin tyhjällä merkkijonolla. Haun löytämät merkkijonot näkyvät kuvassa 3 nelikulmioihin rajattuina. Rakentamassani säännöllisessä lauseessa käyttämäni hahmot ovat:

  • a-z, mikä tahansa pieni kirjain väliltä a-z
  • A-Z, mikä tahansa kapitaali kirjain välillä a-z
  • 0-9, mikä tahansa numero välillä 0-9.

Edelleen halusin poistaa All My Tweets -palvelun datasta "RT" merkinnät, koska nämä eivät sinällään olleet twiittien varsinaista sisältöä, jonka halusin mukaan sanapilveen. RT merkkijonon poistamisessa minun ei tarvinnut hyödyntää säännöllisiä lausekkeita, vaan hain yksinkertaisesti merkkijonoa "RT ". Eli hain merkkijonoa, jossa esiintyi järjestyksessä:
  • kapitaali R
  • kapitaali T
  • välilyönti. (Kuva 4)
Sublime Text näyttää tehdyn haun löytämien merkkijonojen esiintyminen määrän editorin vasemmassa alakulmassa, joten ennen kuin tein korvaamisen tarkistin, montako kertaa "RT " esiintyi datassa. Koska RT merkintä tarkoitti, että twiitti oli retwiitti, sain näin selville kuinka moni twiiteistäni oli retwiitti. (Kuva 1)

Halusin poistaa merkkijonot "RT ", mutta samalla selvittää kuinka monta kertaa se datassa esiintyi. (Kuva 4)
Samalla periaatteella ja etsimistoiminnolla tutkin montako kertaa datassa esiintyivät merkit "@" ja "#", jolloin sain selville montako kertaa olin maininnut henkilön ja montako kertaa olin viitannut johonkin Twitter-kanavaan (kts. Twitter-terminilogiaopas). Jälkikäteen ajateltuna olisi ollut, ehkä järkevää poistaa datasta myös henkilöiden maininnan, koska ne nousivat niin hallitsevaan rooliin lopputuloksessa. (Kuva 1)

Lopuksi kopioin käsittelemäni datan Sublime Text -editorista Wordle-palveluun. Wordle on hyvin yksinkertainen käyttää. Haluttu data kopioidaan leikepöydän kautta palveluun, jonka jälkeen käyttäjän on mahdollista piirtää avainsanapilvi haluamallaan tavalla lukuisiin eri muuttujiin perustuen. (Kuva 5) Itse olen käyttänyt lähinnä palvelun "randomize" toimintoa kunnes olen saanut mieleiseni lopputuloksen, mutta palvelu mahdollistaa muuttujien määrittämisen myös käsin. Lopputuloksen otin palvelusta talteen ruudunkaappausohjelmistolla.

Wordle-palveluun on mahdollista liittää mitä tahansa tekstiä tai suoraan haluttu RSS-virta. (Kuva 5)
Käytin siis hyväksi kahta verkosta löytyvää ilmaispalvelua – All My Tweets ja Wordle – sekä Sublime Text -editoria yhdessä säännöllisten lausekkeiden kanssa. Näiden työkalujen avulla keräsin, käsittelin, jäsensin, analysoin ja visualisoin dataa. Tämänkaltainen useiden eri työkalujen käyttäminen on usein tehokasta, koska toiset työkalut ovat hyviä toisissa asioissa kun taas toiset pureutuvat paremmin toisenlaisiin haasteisiin.

Ja eikun itse kokeilemaan! Kuulen mielelläni tuloksista :)

Muokkaus: 22.11.2012

Tässä Micke Hindsbergin versio:
https://twitter.com/mickhinds/status/271282180423032832

Muokkaus: 27.11.2012

Tässä Anna Emilia Alentolan versio:
https://twitter.com/anniemilia__/status/273505849203376128

Tässä Anna-Sofia Niemisen versio:
https://twitter.com/SofiaNieminen/status/273125304132845569

sunnuntai 18. marraskuuta 2012

Datajournalismia Aalto-yliopistolla 15.11.2012

Kävin viime torstaina Markku Reunasen pyynnöstä vierailuluennoimassa Aalto-yliopistolla datajournalismista opintojaksolla "Dynamic Visualization Design 1". Paikalla oli n. kymmenpäinen ja kansainvälinen joukko dynaamisesta visualisoinnista kiinnostuneita ihmisiä.

Vedin esityksen hyvin samalla pohjalla kuin viime kuussa Yle:llä pitämäni Datajournalismi-koulutuksen. Keskityin siis lähinnä erilaisten esimerkkien läpikäymiseen, koska mielestäni ne ovat parasta antia tämankaltaisessa sisällössä.

Lisäksi pääteemani oli kertoa, että kyse on teknisesti hyvin yksinkertaisista ja loogisista toteutuksista, jotka eivät todellakaan vaadi ylimäärin työtä tai osaamista taakseen. Lisäksi pyrin vahvasti tuomaan esiin, että käyttämäni työkalut ovat vapaasti saatavilla olevia avoimeen lähdekoodiin perustuvia toteutuksia. (Kuva 1)

Klikkaa kuvaa siirtyäksesi kalvoihin. (Kuva 1)
Havaitsin, että tarvetta olisi ollut esitellä asioita pidempäänkin kuin kolmen tunnin ajan ja etenkin itse kokeileminen ja konkreettisesti asioiden läpikäyminen – ihan teknologiatasolla – olisi kiinnostanut. Sovimmekin alustavasti Markun kanssa, että olisi mahdollista, että voisin tulla mukaan vetämään jonkinlaista työpajaa myöhemmin keväällä.

Joka tapauksessa minut nähdään ainakin datajournalismin merkeissä Tampereen yliopistolla maaliskuussa.

tiistai 6. marraskuuta 2012

#Kuntavaalit-analyysi

Ajattelin ottaa lyhyesti osaa kuntavaalidatan perkaamiseen ja käsittelyyn. Tähän minut motivoi mm. A-Stream:stä tuttu toimittajana Jaakko Karhu, joka jakoi keräämänsä – Twitter-kavanalle #Kuntavaalit – kerääntyneen keskustelun. Asiaa edisti, että data oli .tsv-muodossa, joten ajattelin, että datan avaaminen ja jatkokäsittely esimerkiksi Excel:ssä olisi siten helppoa ja nopeaa.

Avasin aluksi datan kuitenkin LibreOffice:ssa, jotta sain tallennettua datan uudelleen .csv-muodossa, koska Excel ei oletusarvoisesti – ainakaan minulla – osaa avata .tsv-muotoista tiedostoa oikein. Tämän lisäksi korjasin n. 600 virheellisesti rivitettyä twiittiä säännöllisten lausekkeiden avulla Sublime Text -editorissa. Virheellisesti rivitetyt twiitit oli helppo paikantaa sen perusteella, että rivin ensimmäisenä arvona tuli olla aina yksittäisen twiitin numeerinen id-arvo eikä esimerkiksi kirjaimia.

Näiden toimenpiteiden jälkeen data oli valmis käsiteltäväksi Excel:ssä. Data piti sisällään viisi saraketta, jotka olivat:
  1. Yksittäisen twiitin numeeronen tunniste (ID)
  2. Käyttäjän, joka twiitin oli lähettänyt, käyttäjätunnus (esim. teelmo)
  3. Twiitin lähetyspäivä (esim. 31.10.2012)
  4. Twiitin lähetysaika (esim. 15:44)
  5. Twiitin sisältö
Data oli siis jo lähtökohtaisesti hyvin rakenteistettu eikä sitä tarvinnut siten jatkokäsitellä esimerkiksi pilkkomalla useampiin sarakkeisiin. (Kuva 3)

Analyysin tekemiseen käytin Excel:stä löytyvää Pivot-toiminnallisuutta, jolla sain helposti laskettua, että twiittejä datassa oli mukana yhteensä n. 19 000 kpl:tta. Pivot-taulukkojen avulla on helppoa tutkia datan jakautumista eri sarakkeiden arvoihin perustuen. Ensimmäiseksi tutkin miten twiittien määrä jakautui käyttäjien kesken ja piirsin datasta pylväsdiagrammin. Lopputulos on hyvin perinteinen esimerkki long tail -datasta. Eli pieni osa käyttäjistä oli erittäin aktiivisia kun taas suurin osa osallistui keskusteltuun vain harvoin (Samankaltainen käyttäyminen oli nähtävissä myös Lontoon mellakoista tehdyissä Twitter-analyyseissä). (Kuva 1)

Suurin osa käyttäjistä osallistui keskusteluun vain muutaman kerran. (Kuva 1)
Pivot-taulukosta oli luettavissa, että yksittäisiä twiittaajia datassa oli n. 2 900, joista n. 1 300 twiittasi kanavalle vain kertaalleen. Määrällisesti Top10-twiittaajien lista näytti seuraavalta:
  1. DimitriQvintus (762 twiittiä)
  2. EliasAarnio (319)
  3. EkholmTalas (306)
  4. juffek (274)
  5. jussisalonranta (253)
  6. juhanilohikoski (229)
  7. TimoSoinii (216)
  8. aleksieskelinen (186)
  9. FinlandInc (181)
  10. katleena (175)
Toiseksi halusin katsoa miten twiitit jakautuivat päivittäin. Edelleen Pivot-taulukoissa tämänkaltaisen tiedon esiin tuominen on helppoa. Suosituimmaksi päiväksi osoittautui 25.10., jolloin twiitattiin yhteensä 4 138 kertaa. Päivän suosio selittyy tuona torstaina Yle:n lähettämällä "Kuntavaalit 2012: Loppukiri" -kuntavaalitentillä. Päivien Top6-lista näyttää seuraavalta:
  1. 25.10. (4138 twiittiä)
  2. 24.10. (2183)
  3. 20.9. (1358)
  4. 19.10. (1295)
  5. 27.9. (1271)
  6. 29.10. (1218)
Mielenkiintoista on, ettei itse vaalipäivä (28.10.) nouse listalla kovin korkealle. Keskimäärin seurantajaksolla 20.9.2012 – 31.10.2012 (42 päivää) twiittejä #Kuntavaalit-kanavalle lähetettiin n. 460 kpl:tta (19470 twiittä / 42 päivää). Piirsin myös twiittien päivittäisestä jakautumisesta samankaltaisen pylväsdiagrammin kuin edellä. (Kuva 2)

Suurin päivittäinen keskustelupiikki osui Yle:n vaalitenttipäivälle 25.10. (Kuva 2)
Kolmanneksi tein vielä samankaltaisen analyysin twiittien jakautumisesta tunneittain. Tämän toteuttamiseksi minun piti irrottaa "tunti"-tieto twiitin lähettämisajasta. Onnistuin tekemään tämän Excel:ssä ajamalla jokaiselle twiitille, uudessa lisäämässäni sarakkeessa, seuraavanlaisen komennon.

=JOS(PITUUS(D30)=5;VASEN(D30;2);VASEN(D30;1))

Kyseinen koodi laskee sarakkeessa D rivillä 30 olevan tekstin pituuden merkkeinä ja palauttaa riippuen siitä onko pituus viisi vai ei joko kentän kaksi ensimmäistä tai vain ensimmäisen merkin. Sarakkeessa D on jokaisen twiitin lähetysaika muodossa hh:mm. Kyseinen ehto kahden ensimmäisen tai vain ensimmäisen merkin mukaan ottamisesta oli tehtävä, koska datassa "tunti"-tietoon ei oltu merkitty etunollia, joten ennen klo 10:ntä lähettyistä twiiteistä halusin ottaa mukaan vain ensimmäisen numeron kun taas klo 10:ltä ja sen jälkeen halusin mukaan kaksi ensimmäistä numeroa. (Kuva 3)

Excel:ssä onnistuu melko suurienkin datajoukkojen käsittely vaivattomasti. Hour sarake on luotu time sarakkeen perusteella syöttökentässä näkyvän koodin avulla. (Kuva 3)
Myös twiittien tunnittainen jakauma osoitti, että aktiivisimmat twiittausajankohdat osuivat yhtäaikaisesti TV:n iltaisin tulleiden vaalilähetysten kanssa. (Kuva 4)

Suurin osa keskusteluista ajoittui ilta-aikaan, jolloin myös TV:n vaaliväittelyt pidettiin. (Kuva 4)
Mielenkiintoista tunnittaisessa jakautumisessa on myös aamun korostuminen iltapäivään verrattuna sekä, ettei  keskustelua öisin juuri ollut, joka ei Internet-maailmassa ole niin itsestäänselvä tulos.

Analyysin perusteella minulle heräsi kysymys; ruokkiiko media toiminnallaan Twitter:n käyttöä vai onko Twitter Suomessa itsenäisesti elävä organimisti, jonka media on luonnollisesti ottanut mukaan toimintaansa. Analyysi osoittaa, että keskustelu oli aktiivista kun Twitter sai näkyvyyttä mediassa, mutta muuten keskustelua oli vähemmän. Toinen hyvä kysymys on; onko Twitter:n laaja läsnäolo esimerkiksi TV-lähetyksissä oikeutettua 2 900:n kansalaisen vuoksi. En tarkoita näitä kysymyksiä sinällään kritiikkinä Twitter:n läsnäoloa ja käyttöä kohtaan, mutta mielestäni tulokset ovat mielenkiintoisia.

Huomioitavaa analyysissä on, että tehnyt havainnot ovat vain yhtä hyviä kuin mitä alkuperäinen raakadata on (toki tekijälläkin on osansa). Esimerkiksi Olli Parviainen raportoi Twitter:ssä, että #Kuntavaalit-kanavalle olisi kirjoitettu reilusti yli 30 000 twiittiä. Uskoisin kuitenkin, koska tehdyt havainnot ovat siinä määrin järjellisiä ja tukevat ennakkohypoteeseja, ettei suurta muutosta tapahtuisi vaikka sama analyysi tehtäisiin tälle laajemmalle twiittimäärälle.

Muokkaus 6.11. klo 19:00

Ero Olli Parviaisen ja Jaakon Karhun keräämien twiittimäärien välillä selittyi sillä, että Olli Parviainen oli kerännyt sanan "kuntavaalit" sisältäneet twiitit kun Jaakko Karhu oli kerännyt nimenomaan #Kuntavaalit-kanavalle lähetetyt twiitit.

Twiittien kerääminen aloitettiin vasta 20.9. eli ensimmäisen kuntavaalitentin jälkeisenä päivänä, joten aineisto ei ole tältä osin täysin kattava eikä koko #Kuntavaalit-ilmiötä kuvaava.

Yksittäisten twiittaajien ja twiittien määrää analysoitaessa on huomioitava Nielsenin 90-9-1 -sääntö.



Siivoamani data Excel-muodossa on ladattavissa Dropbox-palvelusta. (13MB, .xlsx, suomenkielinen Excel).

Linkit alkuperäisiin raportointeihin Twitterissä:

maanantai 5. marraskuuta 2012

Näin tehtiin: "Tässä ovat Suomen parhaat terveyskeskukset"

Viime viikolla Yle:llä pitämästäni datajournalismi koulutuksesta innostuneena Sara Rigatelli Yle Uutisista otti minuun yhteyttä. Hän oli tekemässä juttua suomalaisen terveydenhuollon toimivuudesta ja ajatteli, että olisi mahdollisesti kiinnostavaa kuvata ilmiötä datajournalismin keinoin.

Ajatuksena Saralla oli, josko karttavisualisoinnin avulla voisi kuvata eri sairaanhoitopiirien välisiä eroja keskimääräisen jonotusajan ja toisaalta yleisesti lääkärille pääsemisen osalta. Alunperin ajattelimme, että olisi etenkin toimituksellisesti hyödyllistä nähdä data kartalla, koska tämä helpottaisi mm. alueellisten trendien hahmottamista. Keskustelimme toki, että karttaa olisi mahdollista käyttää myös uutisen yhteydessä mikäli lopputulos olisi selkeä ja lukijalle hyödyllinen.

Tarvitsemamme datan keräsimme THL:n ylläpitämästä Sampo-palvelusta. Palvelusta on mahdollista selata erilaisia terveydenhuoltoon liittyviä tilastoja eri muuttujiin perustuen. Otin tarvittavan datan Sampo-palvelusta talteen Excel-taulukkoon jatkokäsiteltäväksi yksinkertaisesti maalaamalla ja copy-pasteamalla. Itseasiassa käytin LibreOffice:n Spreadsheet -työkalua, jonka olen kokenut olevan hieman kätevämpi tämänkaltaisessa datankäsittelyssä (Kuva 1). Esimerkiksi .csv-tiedostojen avaaminen ja käsittely on ollut mielekkäämpää LibreOffice:ssa kuin Excel:ssä.

Taulukko on hyvä formaatti datan käsittelyyn, koska sen käyttäminen onnistuu niin toimittajalta kuin koneeltakin. (Kuva 1)
Seuraavaksi latasin tallentamani .csv-tiedoston Google Fusion Tables -työkaluun. Ajatuksenani oli, että saisin nopeasti tehtyä demon siitä minkälaiseksi kartta muodostuisi eri muuttujilla. Ongelma oli kuitenkin, ettei minulla ollut käytössäni sairaanhoitopiirien rajoja sisältävää karttapohjaa. Pystyin kuitenkin tekemään demon hyödyntämällä käytössäni ollutta kuntakarttapohjaa yhdistämällä siihen tiedot siitä mihin sairaanhoitopiiriin kukin kunta kuuluu. Sairaanhoitopiirien jäsenkunnat löysin ladattavassa muodossa Kunnat.net -palvelusta.

Yhdistettyäni ensinnäkin käytössäni olleen kuntakarttapohjan sairaanhoitopiiritiedon ja toiseksi keräämämme terveydenhuoltodatan kanssa sainkin demon toteutettua (Kuva 2). Ongelma tässä toteutuksessa – lopulliseen versioon verrattuna – oli kuitenkin, että kartta pohjautui kuntarajoihin eikä sairaanhoitopiirien rajoihin. Tämä aiheutti ongelman, ettei kahta sairaanhoitopiiriä voinut erottaa visuaalisesti toisistaan mikäli ne asettuivat samaan arvoalueeseen ja saivat siten saman värityksen. Esimerkiksi kuvassa 2 nähtävästä esimerkkitoteutuksesta on mahdotonta erottaa Pohjois-Pohjanmaan ja Lapin sairaanhoitopiirien rajaa.

Sairaanhoitopiirit eivät erotu kartassa jos kahden vierekkäisen sairaanhoitopiirin väri on sama. (Kuva 2)
Koimme kuitenkin esimerkkitoteutuksesta, että kartasta muodostui mielenkiintoinen ja tietoja oli hauskaa selata sen kautta. Lähdinkin seuraavaksi toteuttamaan karttaa aikaisemminkin käyttämälläni Raphaël-karttapohjalla. Raphaël on JavaScript-kirjasto, joka mahdollistaa mm. räätälöityjen karttavisualisointien toteuttamisen. Alkuperäinen ongelma kuitenkin säilyi sillä edelleenkään minulla ei ollut käytössäni kuin Suomen kuntakarttapohja ja edellenkään vierekkäisiä sairaanhoitopiirejä ei ollut mahdollista erottaa toisistaan jos ne sattuivat ominaisuuksiensa kautta saamaan saman värityksen. (Kuva 3)

Myös räätälöidyssä JavaScript-toteutuksessa ilmenee sama ongelma käytettäessä kuntapohjaista karttaa. Vierekkäisten sairaanhoitopiirien rajaa ei ole mahdollista erottaa jos sairaanhoitopiirit kuvataan samalla värillä. (Kuva 3)
En myöskään keksinyt mitään (helppoa) tapaa, jolla olisin onnistunut kummassakaan toteutustavassa (Google Fusion Tables tai Raphaël) korostamaan sairaanhoitopiirien rajoja, jotta ne olisivat erottuneet kuntarajoista, joten päädyin etsimään uutta karttapohjaa, joka perustuisi nimenomaan sairaanhoitopiireihin.

Onnekseni löysinkin – edelleen Kunnat.net -palvelusta – kartan, jossa sairaanhoitopiirien rajat oli kuvattu. Haaste oli, että karttadata oli julkaistu .pdf-muodossa ja minulla ei ollut aikaisempaa kokemusta siitä miten .pdf-muotoista dataa olisi mahdollista visualisoida ja hyödyntää etenkään JavaScript-pohjaisessa toteuksessa. Päätin kuitenkin lähteä kokeilemaan miten tämä onnistuisi. Tiesin, että tavoitteena minulla olisi saada karttadata .svg-muotoon, koska tämä oli käyttämäni Raphaël-kirjaston tukema tiedostomuoto.

Päädyin Googlettamaan asiaa hakusanoilla ".pdf to .svg" ja yllätyin, että kyse olikin suhteellisen triviaalista operaatiosta. Tiesin kyllä etukäteen, että .pdf on vektorigrafiikkaan perustuva formaatti, mutta jostain syystä ajattelin, ettei yksittäisten elementtien poimiminen .pdf:stä olisi niin helppoa. Toteutin muunnoksen lopulta Inkscape-ohjelmalla Wikipediasta löytyviä ohjeita mukaillen. Muunnoksessa kyse on käytännössä 1) tiedoston avaamisesta ohjelmassa 2) halutun sivun valitsemisesta ja 3) tiedon uudelleentallentamisesta .svg-muodossa.

Lopulliseen visualisointiin toteutimme mahdollisuuden valita karttaan tarkastelun alle kaksi eri tilastoa:
  1. Missä lääkärille pääsee nopeimmin?
  2. Missä lääkäriajan saa helpoimmin?
Lisäksi merkitsimme karttaan sinisillä palluroilla tilastojen mukaan parhaat terveyskeskukset. (Vis 1)

Kartta sisällytettiin uutisen yhteyteen ja siitä oli mahdollisista tarkastella sairaanhoitopiirejä haluamansa muuttujan perusteella. (Vis 1)
Toteutin projektin pääasiassa viikonlopun (26.10. - 28.10.) aikana, mutta maanantaina ja tiistaina jouduin tekemään vielä muutamia pieniä viilauksia esimerkiksi, jotta saimme kartan toimimaan Internet Explorer -selaimessa. Lisäksi halusimme alunperin toteuttaa kartan "inline-koodina", joka upotettaisiin suoraan uutissivuston leipätekstin sekaan, mutta jouduimme lopulta tyytymään iframe-toteutukseen. Inline-koodin etu iframe-toteutukseen nähden olisi ollut laajempi yhteensopivuus eri laitteiden kanssa sekä parempi mobiilikäytettävyys. Edellä mainituissa viilauksissa sain apua Yle:n Web-suunnittelija Oskari Blombergilta, josta suuri kiitos.

Lopullinen uutinen julkaistiin sunnuntaina 4.11. maanantaina 5.11. ja on luettavissa Yle Uutisten verkkosivuilta.

keskiviikko 31. lokakuuta 2012

Kun datajournalismi tapettiin

Tämä on tarina siitä kun datajournalismi meni pieleen.

Oli perjantai 12.10. ja päätimme Svenska Yle:n suunnittelijan ja kollegani Mårten Seiplax:n kanssa ottaa irtioton muista töistä ja tuottaa datajournalismia toteuttamaamme Maktbasen-järjestelmään perustuen. (Kuva 1)

Perjantaisin pyrimme ottamaan aikaa projekteille, jotka muuten jäävät työsyklin ulkopuolelle. (Kuva 1)
Maktbasen on Svenska Yle:n toteuttama järjestelmä, joka pitää sisällään kaikkien suomenruotsalaisten kuntien (n. 30kpl kun Ahvenanmaa lasketaan ulkopuolelle) kuntavaltuutettujen tiedot (Kuva 2). Keräämämme tietokanta yhdistää tietoja n. 1 400:sta kuntavaltuutetusta pitäen sisällään mm. heidän kytköksensä yrityksiin, jotka olemme saaneet Asiakastiedolta.

Suomenruotsalaiset kunnat löytyvät Pohjanlahden rannikolta sekä Suomenlahden rannikolta. (Kuva 2)
Maktbasen on ollut iso satsaus Svenska Yle:ssä ja olimme siten motivoituneita hyödyntämään järjestelmään keräämäämme tietoa (Kuva 3). Ajatuksenamme Mårtenin kanssa oli, että olisi kiva nähdä minkälaisia eroja suomenruotsalaisten alueiden välillä on katsottaessa niiden kunnanvaltuustoja. Esimerkiksi oma hypoteesini oli, että RKP:n kannatus on suhteellisesti suurempaa Pohjanmaalla verrattuna taas esimerkiksi pääkaupunkiseutuun ja Uudenmaan-alueeseen.

Maktbasen listaa suomenruotsalaisten kuntapoliitikkojen tietoja sisältäen heidän kytkökset yrityksiin sekä erilaista kuntiin liittyvää tietoa. (Kuva 3)
Menetelmämme tuon eron esiintuomiseen oli yhdistää alueiden kunnanvaltuustot yhteen. Alunperin ajatuksenamme oli verrata keskenään pelkästään Pohjanlahden ja Suomenlahden rannikon alueita, mutta päädyimme jakamaan Suomenlahden rannikon alueen useampaan eri osa-alueeseen samalla jakoperiaatteella kuin aluetoimituksemmekin toimii (Kuva 2). Samalla saimme alueista asukasluvullisesti enemmän keskenään samankaltaisia (toki edelleen pääkaupunkiseutu on omassa luokassaan). Alueiksi muodostuivat siten:
Toteutimme alueiden kuntavaltuustojen yhdistämisen yksinkertaisesti laskemalla alueiden kuntien valtuustot yhteen. Laskimme esimerkiksi Pohjanmaalla SDP:n valtuutettujen määrän yhteen ja vertasimme tätä lukua alueen kuntien valtuustopaikkojen yhteismäärään. Tällä tavalla laskimme alueittain kaikille puolueille prosentuaaliset valtuustopaikkojen osuudet. Lopputulos vastasi sitä, että kunnat toimisivat ns. kunnanosavaltuustoina koko alueen valtuustolle. Kunnat käyttämässämme mallissa olivat siis edelleen itsenäisesti äänestäneet omat valtuustonsa, mutta nämä valtuustot yhdistettiin osaksi koko alueen valtuustoa. Menetelmä vastaa periaatteeltaan tapaa, jolla eduskunta muodostetaan vaalipiireissä valituista ehdokkaista.

Ajatuksenamme oli, että Svenska Yle:n aluetoimitukset voisivat tehdä työkalumme avulla omia juttuja ja pohtia asiaa rinnastaen omaan alueensa. Mielestämme esimerkiksi, että nykyisin eduskunnan 3. suurin puolue Perussuomalaiset sai tällä tavalla laskettuna Pohjanmaalla vähemmän valtuustopaikkoja kuin paikallinen "Oravais – ändring nu!" -puolue, oli erittäin mielenkiintoinen yksityiskohta.

Julkistimme visualisoinnin sisäisesti (Vis 1) ja siitä kirjoitetun esimerkkijutun maanantaina 14.10., jonka perusteella uutistoimitus teki siitä oman versionsa. Juttu julkaistiin verkossa myöhemmin maanantain aikana.

Toteutus oli interaktiivinen ja mahdollisti tietojen tarkastelemisen alueittain. (Vis 1)
Jotain meni kuitenkin pieleen. Artikkeli keräsi nopeasti paljon hämmentyneitä ja kriittisiä kommentteja, jotka koskivat etenkin pääkaupunkiseutua. Analyysin sanottiin olevan väärä, epäselvä ja koko artikkelin poistamista vaadittiin. Pyrimme toimituksessa vastaamaan tähän kritiikkiin mahdollisimman avoimesti ja kertomaan siitä mistä kartassa oli kyse.

Ongelma oli, että kun puolueiden kannatus alueellisesti määräytyi edellä kuvatulla tavalla syntyi alueen valtuustossa vääristymä, joka johtuu siitä, että valtuuston koko ei kasva lineaarisesti suhteessa kunnan asukaslukuun. Esimerkiksi Kauniaisissa on runsaat 8 800 asukasta ja valtuustossa istuu 36 valtuutettua. Tällöin Helsingissä, missä asukkaita on n. 600 000, tulisi valtuuston koon olla runsaan 2 400 valtuutetun suuruinen. Helsingin valtuustossa istuu kuitenkin vain 86 valtuutettua, jolloin nähtiin, että tekemämme analyysi antoi pääkaupunkiseudulla Kauniaisten äänestäjille liian suuren painon.

Ongelma oli, että emme pystyneet tarpeeksi selkeästi kommunikoimaan toisaalta toimitukselle, joka julkaisi artikkelin ja toisaalta siksi artikkelin kautta lukijoille mistä kartassa oli kyse. Tilannetta ei auttanut, vaikka julkaisimme alkuperäisen datan sisältävän Google-dokumentin avoimesti uutisen yhteydessä sekä selitimme vielä kommenteissa mistä jutussa oli kyse. Toteutus nähtiin lopulta liian epäselvänä ja se poistettiin sivuilta keskiviikon aikana.



Projektista jäi kuitenkin kokonaisuutena hyvin positiivinen jälkimaku. Opimme niin tekniikan ihmisinä journalistisista prosesseista kuin journalisteina siitä mitä datalla on mahdollista tehdä ja siitä miten dataa on mahdollista tulkita väärin. Opimme, että jatkossa kun keksimme vastaavanlaisia ideoita viemme projektin läpi paljon tiiviimmässä yhteistyössä eri osaajien kanssa ja harkitsemme tarkemmin onko toteutus relevantti sekä onko olemassa vaaraa virheellisille tulkinnoille.

Tulemme toivottavasti lähiaikoina julkaisemaan visualisoinnista päivitetyn version, joka tarkastelee ilmiötä eri näkökulmasta ja jonka olemme suunnitelleet alusta asti yhdessä uutistoimituksen kanssa.

maanantai 29. lokakuuta 2012

Kunnallisvaalit: Oikein voitettu vai väärin mitattu?

Eilisten kuntavaalien jälkeen Kokoomus ja Jyrki Katainen juhlivat Suomen suurimman puolueen asemaa. Asemaa, jonka he pystyivät säilyttämään eduskuntavaaleista. Voitossa on kuitenkin paljon mätää.

Ensimmäiseksi; Ongelma on, että kuntavaaleissa ei ole millään tavalla mielekästä mitata puolueiden valtakunnallista ja absoluuttista kannatusta. Valtakunnallinen kannatus on tulevien kuntavaltuustojen kannalta täysin irrelevantti joskin toki annettakoon, että suuntaa antava. Miksi näin?

Kuntavaaleissa jokainen kunta toimii omana vaalipiirinään ja kuntalaisten on mahdollista äänestää vain oman kuntansa ehdokkaita. Kunnissa valtuustopaikkoina realisoitumattomaksi jäänyt kannatus ei valu ei esimerkiksi naapurikuntiin ja lisäksi kuntien valtuuston koko ei määräydy lineaarisesti kunnan asukasluvun mukaan.

Edellä mainittujen tekijöiden vuoksi puolueiden absoluuttinen ja valtakunnallinen kannatus ei ole relevantti tapa mitata kuntavaalien tulosta tai oikea tapa kertoa siitä mikä on valtakunnallisesti johtava kuntapuolue. Vaalien tulos tulisikin mielestäni mitata perustuen puolueiden saamien valtuutettujen määrään. Näin mitattuna vaalien tulos näyttääkin hyvin erilaiselta:

  • Keskusta, 3 078 valtuutettua
  • Kokoomus, 1 735 valtuutettua
  • SDP, 1 729 valtuutettua
  • Perussuomalaiset, 1 195 valtuutettua

Toiseksi; Ongelma on, että nykyjärjestelmässä äänestäjä valitsee äänestyskopissa listalta yksittäisen henkilön ja luulee, että ääni menee juuri hänelle. Näin ei kuitenkaan ole vaan jokaisen meidän ääni menee ensisijaisesti puolueelle, jota henkilö edustaa. Yksilöille annettavilla äänillä on merkitystä vain kun verrataan puolueiden jäsenten keskinäistä järjestystä. Nykyjärjestelmässä puolueen eniten ääniä saanut ehdokas saa kaikki puolueelle kohdistetut äänet, toiseksi tullut puolet äänistä, kolmanneksi tullut kolmasosan ja niin edelleen.

Ongelma on, että tämä johtaa absurdeihin tilanteisiin, jossa vain muutamalla (alle kymmenellä) äänellä on mahdollista päästä läpi valtuustoon, koska puolueen ääniharava vetää perässään vähemmän ääniä saaneita puolueen jäseniä.

Kolmanneksi; Ongelma on, että puolueiden on mahdollista kuntakohtaisesti luoda keskenään vaaliliittoja. Vaaliliitto kahden (tai useamman) puolueen kesken tarkoittaa, että todellisuudessa nämä kaksi puoluetta ovat vaalien ajan teknisesti yksi ja sama puolue. Toisin sanoen omalle puolueelle ja omalle ehdokkaalle annettu ääni voi lopulta auttaa aivan toisen puolueen ehdokkasta pääsemään läpi.

Ongelma on, että vaaliliittojen kohdalla äänestäjän oikeusturvan kannalta hänen olisi kannattanut itseasiassa jäädä äänensä kanssa kotiin.



.... ja tosiaan kauniin ja aurinkoisen syyspäivän päätteeksi äänestysprosentti oli 58,2%.

Muokkaus 30.10.2012

Kts. myös Ruotsin vaalijärjestelmä ja D'Hondtin menetelmä.

Muokkaus 2.11.2012

Jos nykyinen absoluuttinen, ei vaalijärjestelmää huomioiva, tapa olisi käytössä myös USA:n presidentin vaaleissa voitaisiin toinen puolue julistaa vaalien voittajaksi vaikka presidenttiyden viekin toinen puolue.

perjantai 26. lokakuuta 2012

Datajournalismiaamu Yle:llä 24.10.2012

Pidin Yleisradiossa keskiviikkona datajournalismin koulutustilaisuuden. Kolmen tunnin sessiossa oli mukana hyvin sekalainen joukko eri alojen osaajien ympäri Yle:ä. Mukana oli niin kovan luokan tutkivia journalisteja maan ykkösluokan ohjelmista kuin jokapäiväistä uutistoimintaa pyörittäviä toimittajia sekä muita asiasta kiinnostuneita. Hienoa, että asiat kiinnostavat ja session aikana saimmekin aikaan useita mielenkiintoisia keskusteluja.

Twitterissä keskustelimme kanavalla #ddjyle ja saimme sen jopa nousemaan pinnalle Suomalaisena trendinä, joka toki suomalaisessa Twitterissä ei tarkoita muutamaa tweettiä enempää. (Kuva 1)

Suomalaiset trendit on tietokoneohjelma, joka pyrkii tunnistamaan suomalaisia Twitter-trendejä. (Kuva 1)
Toteutin kalvot Impress.js-kirjastolla, joka on JavaScript-kirjasto. Tämä tarkoittaa, että kalvot toimivat selaimessa ja niihin on siten helppo sisällyttää mitä tahansa sisältöä videoista ja kuvista jopa kokonaisiin verkkosivuihin. (Kuva 2)

Klikkaa kuvaa siirtyäksesi kalvoihin. (Kuva 2)

Kalvot eivät sinänsä sovellu itseopiskelumateriaaliksi, mutta toivottavasti niistä on silti hyötyä. Tapahtuma myös videoitiin yleisön pyynnöstä. Tämä tallenne saattaa tulla myöhemmin nähtäville.

Edit: Näillä näkymin seuraavan kerran puhun aiheesta datajournalismi  15. marraskuuta Aalto-yliopistolla seminaarikurssin Dynamic Visualization Design tiimoilla.

perjantai 28. syyskuuta 2012

Naistutka 2000 – minne naiset menneet on?

Viikolla eksyin keskusteluun, jossa yhtenä argumenttina esiin nousi, että datajournalismista tulisi tehdä kansantajuista ja suosittua. Ratkaisumalliksi ongelmaan ehdotimme, että datajournalismin tulisi käsitellä seksiä tavalla tai toisella, koska se tunnetusti myy.

Ihan siihen ei nyt vielä päästä, mutta tässä jokaiselle opiskelupaikkakuntaansa pohtivalle nuorelle miehelle (sexism intended) työkalu, joka tekee valinnasta helppoa. (Kuva 1)

Antakaa minun esitellä....

Naistutka 2000
  – minne naiset menneet on?

Naistutka 2000 kertoo, että naisia on etelän suurissa keskuksissa. Kaupungeissa on kuitenkin eroja. (Kuva 1)
Yleisestihän meillä Suomessa on ihan hyvä tilanne, koska naisia on yli 100 000 miehiä enemmän. Tämä johtuu osittain naisten pidemmästä odotetusta eliniästä. Naisilla 0-vuotiaan ennakollinen elinajanodote on tällä hetkellä 83,2 ja miehillä 76,7 vuotta. (Lähde)

Päivitys 29.9.2012

Sottungassa tilanne on optimaalisin sillä sadan ihmisen kunnassa on tasan 50 naista ja 50 miestä. Kyseessä on muuten myös asukasluvultaan Suomen pienin kunta. Ilmeisesti pienessä kunnassa asiat on helpompi järjestää kuntoon asian osalta. Sottungan alapuolelle sijoittuu Jalasjärvi ja yläpuolelle Siilinjärvi missä naisia siis on juuri ja juuri enemmän kuin miehiä.

Kommenteissa on toivottu siviilisääty sekä ikäjakauman tietojen lisäämistä visualisointiin. Jääköön nähtäväksi jos nämäkin tiedot kävelisivät vastaan jossain vaiheessa. Toki olisi hieman ikävää huomata parikymppisenä, että pääosa naisvaltaisuudesta koostuu oman ikähaitarin ulkopuoltelta tai pelkästään jo parisuhteessa elävistä vastakkaisen (tai saman) sukupuolen ihmisistä.

Data visualisointiin löytyi väestörekisterikeskukselta ja tiedot on päivitetty 31.8. Käyttämäni .csv-muotoinen data, jossa on laskettu suhdeluvut, on ladattavissa Dropbox-palvelusta.