torstai 6. maaliskuuta 2014

Python hoitaa, eli kuinka Plus-deski kokeili screen scrapingia

Kun keskustelu Keva-johtaja Merja Ailuksen työsuhde-eduista oli jatkunut jo jonkin aikaa, Yle:n toimittaja Jarno Liski alkoi pyöritellä mielessään kysymyksiä: kuinka kannattava työsuhdeasunnossa asuminen on, kuka siitä todella hyötyy ja millä tavalla työsuhdeasuminen otetaan verotuksessa huomioon. Hänen lähtöoletuksensa oli, että työsuhdeasuntojen verotusarvo vastaisi huonosti asunnoista vapailla markkinoilla maksettavaa vuokraa.

Liski otti yhteyttä Plus-deskin tuottaja Juho Salmiseen, joka lähti yhdessä Teemo Tebestin kanssa viemään asiaa eteenpäin. Lopputulos on nähtävissä täällä.

Verottajan väite syyniin

Verottajan mukaan asuntojen verotusarvo vastaa keskimäärin 90-prosenttisesti asunnosta pyydettyä vuokraa. Esimerkiksi 700 eurolla vuokrattavan asunnon verotusarvon pitäisi olla noin 630 euroa. Tämä tuntui kuitenkin pitävän huonosti paikkansa. Ideana olikin tutkia, minkä suuruisia verotusarvoja asunnot todellisuudessa saavat ja kuinka hyvin verotusarvo vastaa asunnoista pyydettävää vuokraa.

Verottaja määrittelee työsuhdeasunnoille laskukaavan, jonka avulla verotusarvo määritellään asuntokohtaisesti. Verotusarvon laskennassa vaikuttavat asunnon sijainti (pääkaupunkiseutu/muu maa), pinta-ala sekä valmistumisvuosi. Työntekijä saa asuntoedusta lisähyötyä silloin, kun verotusarvo on todellista markkina-arvoa selkeästi alhaisempi, koska tällöin hänen verotuksensa on keveämpi kuin sen tulisi olla.

Teemo ja Juho pohtivat, miten asiaan pääsisi käsiksi. Verottajan kaavan pitäisi tuottaa arvo, joka on hyvin lähellä markkinahintaa. Jarno Liskin idea oli kerätä suuri määrä olemassa olevien vuokra-asuntojen tietoja ja laskea asunnoille verottajan kaavan avulla verotusarvo.

Suomessa on muutama suuri vuokra-asuntoja listaava verkkopalvelu, joiden dataa olisi mahdollista käyttää verottajan kaavan testaamiseen. Käsityönä verotusarvon ja markkina-arvon kattava vertailu ei kuitenkaan onnistuisi, sillä vuokra-asuntoja on sivustoilla tuhansia.

Oli siis kirjoitettava koodinpätkä, jonka avulla pystyttäisiin keräämään tietyn verkkopalvelun vuokra-asuntoja koskeva data, laskea niiden perusteella asunnoille verotusarvo ja analysoida saatuja arvoja. Datan keräämiseen käytettävää menetelmää kutsutaan ruudunraavinnaksi (engl. screen scraping, tuttavallisesti screippaus). Asuntojen tiedot voisi poimia miltä tahansa vuokra-asuntoja listaavalta sivustolta. Teemo käytti tässä tapauksessa Alma Median ylläpitämän Vuokraovi.com-palvelun tietoja.

Koodi ja tietokanta valmiiksi

Ruudunraapijan kirjoittamiseen Teemo päätti käyttää Python-kieltä. Screipatessa kirjoitettu koodi käy järjestelmällisesti läpi verkossa olevia nettisivuja, poimii sivulta halutut elementit ja siirtää ne tietokantaan. Tietokannaksi Teemo valitsi ennestään tutun MongoDB:n. MongoDB sopi käyttötarkoitukseen hyvin, koska noSQL-tietokannassa datalle ei tarvitse määrittää tarkkaa rakennetta etukäteen, vaan sitä voidaan täydentää ja muokata tarpeen mukaan.

Kun Teemo laittoi homman aluilleen 29. marraskuuta, Vuokraovi-palvelussa oli tarjolla noin 6 000 vuokra-asuntoa eri puolilta Suomea. Yhdelle hakutulossivulle saa näkyviin kerrallaan 10–30 vaihtoehtoa, joten tarvittavien kyselyjen määrän minimoimiseksi Teemo sääti määrän maksimiinsa. Näin screipattavaksi jäi hieman yli 200 erillistä sivua, jolla jokaisella oli 30 asuntoa. (Kuva 1)

Helmikuussa 2014 Vuokraovi-palvelussa oli tarjolla n. 8 100 vuokra-asuntoa. (Kuva 1)
Datan keräämistä mutkisti se, että kaikki tarvittavat tiedot eivät löytyneet tältä hakutulossivulta. Koodin tuli käydä läpi myös jokaisen asunnon oma sivu, sillä asunnon rakennusvuotta ei mainita kaikkien asuntojen listauksessa. Kyselyjä piti siis lopulta tehdä 200 hakutulossivuille ja 6 000 yksittäisten asuntojen omille sivuille.

Teemon ensimmäinen ajatus oli kokeilla ScraperWiki -palvelua, jota hän oli kuullut käytettävän screippaukseen. Palvelu on ollut etenkin toimittajien suosiossa ja Teemo ajatteli, että palvelun testaamisen jälkeen hän voisi opettaa sen käyttöä muille toimittajille.

ScraperWiki mahdollistaa esimerkiksi Python-koodin kirjoittamisen ilman erillisten ohjelmointiympäristöjen asentamista. Siksi palvelu sopii esimerkiksi journalisteille, joilla ei usein ole mahdollisuutta tai taitoa asentaa kaikki tarvittavia ohjelmistoja. Teemo päätyi kuitenkin tekemään toteutuksen omalla koneella omassa ympäristössä, koska tämä oli lopulta hänelle kätevämpää.

Scraper käy läpi HTML-koodia ja tallentaa määritellyt osiot talteen myöhempää käyttöä varten. (Kuva 2)
HTML-merkkauksen siivouksessa ja käsittelyssä Teemo käytti hyväkseen BeautifulSoup-nimistä Python-kirjastoa. BeautifulSoup on kirjasto, jonka avulla verkkosivuilla käytetty HTML-merkkaus voidaan muuttaa koneelle ymmärrettävään muotoon. Lopulta koodi ryömi Vuokraovi.comin sivuja muutaman tunnin ajan. Ajo tehtiin vielä uudelleen lopullista uutista varten 2. joulukuuta.>

Trouble shooting vei aikaa

Kun Teemo testasi koodia ensimmäisiä kertoja, koodi ei hakenut dataa halutulla tavalla. Vian etsintään menikin hetki. Lopulta Teemo tajusi tutkiessaan HTTP-pyyntöä, että Vuokraovi.com -sivusto asetti Internet-selaimessa tukun evästeitä, eli cookieita, joiden puute esti scraperin toiminnan. Hän päätteli, että asian korjaamiseksi samaiset evästeet tulisi asettaa myös tietokoneohjelman tekemään HTTP-pyyntöön. Tällöin HTTP-pyyntö vaikuttaisi Vuokraovi.comin näkökulmasta täysin samanlaiselta kuin jos sen tekisi esimerkiksi Google Chrome -selaimella. (Kuva 3)

HTTP-pyyntöihin liittyvät evästeet näkee Google Chrome -selaimessa Inspect Element -valikon takaa. (Kuva3)
Joskus screipatessa voi käydä niin, että jos pyyntöjä tehdään suuri määrä, palvelin voi tulkita ne vihamielisiksi ja estää ne. Vuokraoven tapauksessa reilut 6 000 pyyntöä hukkui luultavasti normaalin verkkoliikenteen sekaan. Screippausta suunnitellessa kannattaa kuitenkin miettiä, voiko rajoituksista tulla ongelmia. Esimerkiksi hakukoneyhtiö Google tunnistaa tehokkaasti koneellisesti tehtävät haut ja estää ne, koska koneellisesti tehtävät haut ovat osa heidän maksullista palveluaan.

Toteutus on ladattavissa avoimena lähdekoodina (CC-BY-SA 4.0) Ylen Github-sivulta.

Yhden päivän työ

Ennen julkaisua aineistosta siivottiin pois sellaiset kohteet, joista puuttui jokin tarvituista tiedoista, kuten rakennusvuosi, sekä autotallit ja kalustetut asunnot. Näin aineistosta saatiin vertailukelpoista. Karsimisen jälkeen pohja-aineistoksi jäi noin 5 000 vuokra-asunnon tiedot. MongoDB:stä data tulostettiin .csv-muodossa ja vietiin Googlen Spreadsheets-taulukkolaskentaohjelmaan, jossa lopullinen verotusarvolaskenta tehtiin. Aineisto on ladattavissa Ylen sivuilta Excel-muodossa.

Jutun teknisten osien toteuttaminen järjesteltävine taulukoineen kesti noin työpäivän verran, joskin homma olisi sujunut nopeammin, jos eväste-ongelman selvittämiseen ei olisi mennyt aikaa. Jatkossa vastaavanlaisia toteutuksia tehtäessä evästeet osataan ottaa paremmin huomioon.

Eräs aineistosta tehty havainto oli, että erot markkinavuokrassa suhteessa verotusarvoon olivat alueellisia. Niinpä juttu sai otsikon: Asuntoedusta hyötyy eniten Helsingissä ja kehyskunnissa – katso oman kuntasi tilanne. Jutun yhteydessä käyttäjä sai tutkia asuntojen markkinavuokran ja verotusarvon eroa sekä kunnan että postinumeroalueen perusteella.

Aineisto myös paljasti, että verotusarvon ja markkina-arvon välinen vastaavuus oli keskimäärin 73 prosenttia, siis huomattavasti verottajan edustajan ilmoittamaa 90 prosenttia pienempi.

Juttu ei ollut varsinainen yleisömenestys. Asuntoedusta nauttii Suomessa alle 20 000 henkilöä, joten kohdeyleisökään ei ollut järin suuri. Vaikuttavuutta ei voida kuitenkaan mitata pelkästään lukijamäärän perusteella.

Screippaus-kokeiluna juttu oli Plus-deskille uusi aluevaltaus ja on hyvin todennäköistä, että tulevaisuudessa tällaisia omaan datan hankintaan perustuvia "skuuppeja" tulee enemmän.

Laita siis Python töihin!

Heidi Kähkönen
Kirjoittaja on vapaa toimittaja ja datajournalismikouluttaja
Twitter:  @heidikahkonen

maanantai 9. joulukuuta 2013

Datajournalistin veropäivä

Tarkoitan veropäivällä tässä yhteydessä marraskuun ensimmäistä, jolloin suomalaisten veronmaksajien edellisen kalenterivuoden verotiedot tulevat julkisiksi. Marraskuussa julkistettiin siis kaikkien suomalaisten pääoma- ja ansiotulotiedot vuodelta 2012. Tiedot ovat julkisia ja meidän jokaisen tulotiedot ovat saatavilla verotoimistoista kysyttäessä.

Kerron aluksi hieman veropäivän taustoja ja sitten tarkemmin mitä tein itse veropäivänä.

Tiedotusvälineissä veropäivä näkyy merkittävällä tavalla. Etenkin iltapäivälehdet tekevät paljon juttuja, koskien erilaisia ryhmiä ja heidän parhaiten tienaavia yksilöitä. Esimerkiksi iltapäivälehdet tekevät veropäivänä paljon juttuja otsikkorakenteella: "Katso kuka tienasi eniten ryhmässä X". Helsingin Sanomissa verotietoihin on myös panostettu ja HS:llä onkin erityinen Verokone, josta verotietoja on mahdollista tarkastella useamman vuoden ajalta. Maakuntalehdet taas tekevät juttuja omista lähtökohdistaan keskittyen etenkin oman alueensa parhaiten tienaaviin.

Yle Uutisissa tendenssi tuntuu kulkevan aina vain vähemmän retostelevaan suuntaan. Tämä näkyy esimerkiksi niin, että yksittäisten ihmisten tuloja nostetaan aina vähenevässä määrin esille. Näiden sijaan pyritään nostamaan enemmän esille ilmiöitä, joita tulojen takaa on nähtävissä kuten tuloerojen muutokset ja alueelliset erot tuloissa.

Viime vuonna tämä näkyi siten, että julkaisimme veropäivänä jutun "Näin moni tienaa vähemmän kuin sinä – kokeile itse", josta tuloja oli mahdollista tarkastella, ei yksilötasolla, vaan alueellisesti ja demograafisesti oman kiinnostuksen mukaan. Tämä vuonna samaa teemaa jatkettiin veropäivää edeltävänä päivänä julkaisemalla vastaavanlainen juttu "Kuinka moni naapurisi tienaa vähemmän kuin sinä? Kokeile itse laskurilla". (Kuva 1)

Rakentamallamme työkalulla tuloeroja saattoi verrata postinumeroalueittain. Kuvassa Vantaalla sijaitsevan Mikkolan tulojakauma (Kuva 1)
Lisäksi olemme tietoisesti pienentäneet "katso kuka tienasi eniten" -listoille päätyvien ihmisten määrää.

Viime vuonna koko maan listalla oli 1000 nimeä ja alueiden listoilla 200. Tänä vuonna näillä listoilla esitettyjen nimien määrät putosivat koko maan osalta 100 nimeen ja alueiden osalta 30 nimeen. Määrät poikkeavat selkeästi useista muista mediataloista ja heidän julkaisemistaan määristä.

Toki Yle:lläkin tehdään edelleen myös henkilöihin kohdistuvia juttuja.

Datajournalistin veropäivä


Itse veropäivänänä 1.11.2013 minun vastuullani oli tuottaa Yle Uutisten sivuille edellä mainitut "katso kuka tienasi eniten" -listat koko maan ja alueiden (maakunnat) osalta. Vastasin siis siitä, että veropäivän aamuna verotiedot olivat luettavissa Yle Uutisten sivuilta mahdollisimman nopeasti (käytännössä muutaman minuutin varoitusajalla) niiden julkistamisesta. Tiedotusvälineet saivat ennakkoon tilaamansa aineistot verottajalta samanaikaisesti veropäivän aamuna kello 8.00.

Yle Uutisten näkökulmasta kyse on siitä, että uutistilanteessa halutaan olla ensimmäisiä tai ensimmäisten joukossa. Ja ensimmäisinä mahdollisimman hyvin lukijoita palvelevalla tavalla. Myös maakuntatasolla halusimme olla uutiskilpailussa rintarinnan maakuntalehtien kanssa. Esimerkiksi niin, että Yle Tampere saisi nettiin samaan aikaan jutun verotiedoista ja eniten tienanneista kuin Aamulehti.

Tämä mahdollisimman hyvä ja nopea tapa oli käytännössä nettiuutiseen upotettava taulukko, jota olisi mahdollista järjestää sarakkeiden perusteella ja josta tietoja olisi mahdollista etsiä.

Kantava ajatus tämän saavuttamiseksi oli, että rakennamme putken verotoimistosta nettiin siten, että tiedot kulkisivat minun kauttani. Minun tehtäväkseni siis tuli muokata alkuperäistiedostot sellaiseen muotoon, että ne on mahdollista julkaista netissä ja sitten julkaista ne.

Sain haltuuni edellisen vuoden vastaavat aineistot, jotka Yle Uutiset oli saanut ja lähdin rakentamaan ratkaisumallia niiden pohjalta. Verohallinto toimittaa tiedot .csv-tiedostoina. Tiedostot on nimetty kryptisesti numerokoodeilla, mutta tiedostot avaamalla selviää, että tiedostonimiin on koodattu maakuntanumero (.xls) sekä tieto siitä minkä tyyppistä tietoa tiedosto sisältää. (Kuva 2)

Verohallinto toimittaa verotiedot toimitusvälineille .csv-muodossa. (Kuva 2)

Olimme tilanneet tänä vuonna samat aineistot kuin aikaisempinakin vuosina eli 1000 eniten tienannutta koko maan osalta sekä 200 eniten tienannutta maakuntien osalta (julkaisimme siis vain osan). Nämä tiedot oli pyydetty sekä ansio-, pääomatulojen sekä kokonaisansioiden mukaan järjestettyinä. Yhteensä tiedostoja oli siis 60 kpl ((19 maakuntaa + koko maa) * 3 tiedostoa / alue).

Ajatukseni siis oli, että tuottaisin tästä .csv-materiaalikasasta mahdollisimman automaattisesti html-muotoiset järjestettävät listat, jotka voitaisiin julkaista Yle Uutisten sivuilla artikkeleihin upotettuina.

Lähdin toteuttamaan tätä automatisointia Python-scriptillä. Apuna käytin MondoDB-tietokantaa, joka toimi tietojen väliaikaisena tallennuspaikkana. Scriptin toimintalogiikka on seuraavanlainen:

  1. Lue kansion kaikki tiedostot (60 kpl).
  2. Avaa kansiosta yksi tiedosto kerrallaan käsiteltäväksi.
  3. Selvitä tiedostonimen perusteella mitä maakuntaa tämä tiedosto edustaa sekä sisältääkö tiedosto ihmiset järjestettynä ansiotulojen (1), pääomatuloje (2) vai kokonaistulojen (3) mukaan.
  4. Tallenna tiedot MongoDB-tietokantaan sarakkeiden mukaisesti.
  5. Kirjoita uusi .csv-tiedosto mihin on otettu alkuperäistiedoihin verrattuna mukaan vain kiinnostavat sarakkeet ja johon on lisäksi lisätty uusia kiinnostavia sarakkeita kuten henkilöiden veroprosentti. Lisäksi tässä kohtaa poistettiin tiedoista kaikkien mahdollisesti alle 18-vuotiaiden nimet.
  6. Toista prosessi aineiston seuraavalla tiedostolle.

Ennen tätä prosessia muunsin alkuperäistiedostojen merkistön UTF-8-muotoon (alunperin ISO-8859-1). Tein tämän, että pystyisin olemaan varma, että skandinaaviset kirjaimet eivät korruptoituisi prosessin aikana. UTF-8 on merkistönä tässä suhteessa parempi. Rakensin tähän erillisen Python-scriptin, joka teki muunnoksen puolestani.

Harjoittelin prosessin läpi edellisen vuoden aineistoilla läpi noin kymmenen kertaa ja sain ajettua prosessin läpi sähköpostista julkaistuksi jutuksi rauhallisessa tahdissa edeten alle kahdessa minuutissa. Eli käytännössä lukijoille hyvin merkityksettömässä ajassa.

Veropäivän aamuna tulin töihin hieman ennen seitsemää aamulla. Verotiedot julkaistiin siis kahdeksalta. Toimittajamme Mikko Naalisvaara oli Haapaniemenkadulla verotoimistossa hakemassa tilaamamme aineistoa ja hänen oli määrä lähettää se minulle sähköpostilla heti aineisto saatuaan. Konkreettisesti Mikko sai verotoimistolta muistitikun, jossa tiedot olivat, jonka hän kiinnitti omaan mukana olleeseen koneeseensa. (Kuva 3)

Verotoimistosta tilatut verotiedot sai nimetyissä muistitukuissa. Tämä Yle:n kappale löysi tiensä työpöydälleni myöhemmin iltapäivällä. (Kuva 3)

Tulin töihin ajoissa ensinnäkin, että kyseisenä päivän HSL:n junat olivat lakossa ja halusin olla erityisen varma, että pääsisin paikalle, mutta toisaalta myös, että pystyin rauhassa käymään vielä ajatustasolla läpi sen mitä olimme tekemässä.

Aamukahdeksan aikaan aloitin sähköpostini "päivitä"-painikkeen aktiivisen naputtamisen. Lopulta kello 8.09 aineisto tippui sähköpostiini. Latasin tiedostot koneelleni ennalta luotuun kansioon ja ajoin tarvittavat Python-scriptit tiedostoille. Tiesin, että hätiköinti ei tulisi säästämään kuin puoli minuuttia kun taas epäonnistuminen johtaisi helposti moninkertaiseen viivästymiseen kun koko prosessi pitäisi aloittaa alusta.

Eniten jännitystä näin koodarin toimesta aiheutti epäilys siitä, että verohallinto olisi voinut mennä muuttamaan tiedostojensa formaattia tai merkistöä jollain tavalla. Tämä luonnollisesti johtaisi joko siihen, että scriptit eivät toimisi ollenkaan tai ne toimisivat loogisesti väärin. Tätä mahdollisuutta silmällä pitäen olin kehittänyt varasuunnitelmana manuaalisesti täytettävän, mutta etukäteen rakennetun html-listan, jonka alueet heti tiedot saatuaan saattoivat itse täyttää. Tämä varasuunnitelma varmasti siis sen, että meillä olisi heti aamulla aiheesta netissä kuitenkin jotain.

Tämä varasuunnitelma oli kuitenkin lopulta etenkin alueiden näkökulmasta enemmän tilannetta sekoittava, koska koko aineiston kattava toteutukseni valmistui alueiden käsin tuottamaa listaa nopeammin. Alueet siis edelleen täyttivät etukäteen rakennettua html-listaa kun he olisivat voineet ottaa käyttöön automaattisesti tuotetun taulukon. Tämän osalta täytyy kommukaatiota ensi vuodeksi parantaa.

Scriptit siis toimivat ja ennaltaharjoiteltu prosessi mahdollisti sen, että meillä oli verkossa kello 8.14 artikkeli johon oli upotettu järjestettävä taulukko, josta oli mahdollista tarkastella eniten tienanneiden tietoja koko maan sekä alueiden osalta. Työ oli siis valmis viidessä minuutissa (josta käytimme ehkä 1–2 minuuttia tietojen tarkistamiseen) tuotettua sähköpostiin tulleista .csv-tiedostoista interaktiivisen uutisapplikaation, joka oli käytettävissä koko maan ja jokaisen yksittäisen

Toteutin scriptin pääosin maanantaina (veropäivä oli perjantai) ja käytin välissä olleet päivät lähinnä hienosäätöön. Käytännössä käytin toteutukseen siis yhden työpäivän, jonka kautta veropäivänä lukijat saivat palvelua 15 minuutissa. Tämä oli merkittävä parannus verrattuna viime vuoteen jolloin listoja on tehtaillut useampi ihminen ja viimeiset listat valmistuivat alueille käsittääkseni vasta puolen päivän aikoihin. Jo sellaisenaan varasuunnitelmana käyttämämme etukäteen rakennettu html-lista oli kehitysaskel edelliseen vuoteen, jolloin alueilla ei ollut mitään yhtenäistä tapaa toimia.

Scriptit ovat ladattavissa Yle Uutisten Github:sta. Annoin projektille nimeksi tax-data-organizer. Scripti toimii niin, että sille annetaan kansio, jossa ovat verottajalta saadut tiedostot. Scripti tallentaa sitten uuteen erilliseen kansioon muokatut versiot sille annetuista tiedostoista. Järjestettävä html-taulukko näistä muokatuista .csv-tiedoista on mahdollista tehdä esimerkiksi mukaillen niin ikään Yle Uutisten Githubista löytyvää Sorttable-projektia.

torstai 21. marraskuuta 2013

Suomalainen mies paljastaa – katso kuvat!

Kokoamme joka maanantai yhteen Yle Uutisten ja Yle Urheilun edellisen viikon viisi eniten verkossa luettua juttua. Olemme tehneet tämän tänä vuonna viikosta 3 lähtien eli mukana on juttuja yli 40:ltä viikolta. Päätin ottaa juttujen otsikot yhteen ja tehdä niistä sanapilvet.

Jutut itsessään pitävät sisällään aiheita hyvin monilta aihealueilta.

Tässä ensin Yle Uutisten sanapilvi (Kuva 1):

Yle Uutisten otsikoissa esiintyneiden sanojen kerma. (Kuva 1)

Ja tässä Yle Urheilun vastaava sanapilvi (Kuva 2):

Yle Urheilun otsikoissa esiintyneiden sanojen kerma. (Kuva 2)

Eli Yle Uutisten hittiotsikko kuuluisi esimerkiksi:
Suomalainen mies paljastaa – katso kuvat!
Ja vastaavasti Yle Urheilussa klikkimagneettina voisi toimia:
Katso – Näin Räikkönen eteni voittoon!
Kovin syvällistä analyysiä en kuitenkaan näistä sanapilvistä lähtisi tekemään vaan pitäisin näitä lähinnä viihteellisenä katsontakulmana. Sellaista johtopäätöstä niistä voi lähteä tekemään, että erilaiset kehottavat otsikot (kuten katso ja kokeile) ovat toimivia, mutta väittäisin, että usein myös näissä otsikoissa kiinnostavuus syntyy enemmän objektista eli tekemisen kohteesta.

Sanapilvet on toteutettu Wordle-palvelulla. Blogiin ne on tuotu kuvankaappauksilla.

Disclaimer: Data pitää sisällään vain Yle Uutisten ja Yle Urheilun sisältöjä. Analyysi ei ole täydellinen vaan yksittäisiä virheitä voi olla.

tiistai 8. lokakuuta 2013

Social network analysis of one's Facebook friends

This blog post is in English as you may have noticed. It is made for a training session held at Södertörn University for the Swedish media organizations.

Objective:
Create a network visualization of one's Facebook friends.

Requirements:
Gephi, Python, MongoDB, Google Chrome, Scraper, Google Account

0. Network visulialization examples 


First here are some of examples where network analysis has given insigth to the given story.
  1. Social network analysis of a shooter suspect's Facebook friends
  2. Probing the murky web of foreign ownership in Finnish firms
  3. Spotlight - Party of the True Finns and islamophobia
As you can see network visualizations can be used in various ways. They can be used both in the background and also as an interactive end user application.

 1. Get your Facebook friends


Your own Facebook friends data is available through Facebook API. To access your Friends list through Facebook API browse to address:
https://graph.facebook.com/me/friends?access_token={place_valid_access_token_here}

A valid access token can be acquired from Graph API Explorer. (Pic 1)

You can get your own Facebook friends data from Facebook API in JSON format fairly easily. (Pic 1)

But only your own Facebook friends data is available through the API. So if you desire to get the friends data of any other profile it is vital to know that it is not available through Facebook API. So if you want to make a social network analysis of your friend's Facebook friends you need to make a little detour.

The detour here is called screen scraping. Screen scraping is a method where we use the computer to read the data what we see on our screen. We do this while computers are much faster doing it and make less mistakes. At simplest screen scraping is done from one page but it can be done from any number of pages.

A tool called Scraper is a very good for doing this when we just need to scrape data from one to two pages. Scaper is Google Chrome addon. if you desire to know more see a tutorial by Jens Finnäs.

For scraping we will use Facebook's mobile interface while it has much simpler outlook. This is nice when doing screen scraping because we have to deal with less code.

The following steps allow you to screen scrape your own friends list (that was also available through the API).
  1. Go to your Friends list. It is located at https://m.facebook.com/{place_your_username_here}?v=friends
  2. First scroll down as many times you need to get all of your friends to show on the screen. To achieve this it is quite handy to used the pagedown functionality. You may experience problems if you have more than 500 friends or so.
  3. Next open the context menu while clicking one of your friend and from the context menu select scrape similar. You need to have the Scraper plugin installed and enabled. (Pic 2)
  4. After clicking scrape similar you'll get a new window. On the left side you can define what you are scraping for and on the right side you see what you get. (Pic 3)
  5. To define what you are looking for you need to use either XPath or jQuery. The default selection is XPath and that suits us. Enter the following code without the quotes into the available field "//div[@class='_4mn c']/a" and click Scrape. What the code says is that we want to get the anchor elements (aka. links) which are located under a <div>-element which has class attribute value "_4mn c". In the section columns set XPath to "@href". That tells the code to fetch the @href parameter from those anchors.
  6. Export the dataset to Google Docs and open the document in Google Docs. Remove unnecessary columns B to E.
  7. Download the data as a .csv-file to your local computer. File -> Download as -> Comma separated values (.csv, current sheet)

(Pic 2)

(Pic 3)

 2. Create the connections between friends


Now we have a .csv-file of all your friends. From this we could make a network visualization which would show that all your friends are connected to you.

What we want to do is to figure out how your friends are connected which each other. This can be accomplished via Facebook API's Friend property which allows us to ask wheater to Facebook profiles are friends with each other. This is nice while you can do this for any two Facebook profiles regardless of their privacy settings.

Key point here is that one can't ask Facebook API who are all the friends of a Facebook profile. But one can ask one-by-one wheather to profiles are friends. So if you have a list of Facebook profiles it is possible to make the network. And as you may have realized we have list while we have screen scraped it. This also means that sometimes you can't get the profile list you deside due user's privacy settings. For example users can hide their friends list from users that they have not friended.

But how to use the Friend property. One can access it via Graph API Explorer which we already used to acquire the proper access token.

With Graph API Explorer we could make the network by hand by entering all the queries to Graph API one-by-one. For example the query:

"SELECT uid1 FROM friend WHERE uid2 = 635279474 AND uid1 = 732028610"

tells us whether these to user id's are friends with each other. But for any larger network this would be a pain in the ass while you would have to make hundreds and hundreds of queries. (Pic 4)

(Pic 4)
Fortunately this is not the case. I have written a Python script that does the work for us. But unfortunately I'm quite sure that the script won't work out of the box for most users.

Download the script.

Place the script file in some good place where you can access it. Copy also the .csv-file that same folder. Next open terminal, browse to that folder and run:

python facebook_network.py {filename} ({use_existing = True|False})

for example:

python facebook_network.py teemo_tebest.csv False

When you are asked for an access token please refer to Graph Api Explorer to get one. You may phase several problems while running the script. First check that you have Python installed. Secondly you need a running MongoDB. Thirdly you need to have atleast two Python libraries installed called pyfacegraph and pymongo. (Pic 5)

The script need to be run in terminal environment. (Pic 5)
The script runs for a while. First it fetches all the metadata available from the profiles. After that the script forms the connecions between the users. After all is done the script outputs the data into a network file format.

3. Visualize the data with Gephi


Now that we have the data in a network format (.gexf) we can visualize it with available tools. One great and free tool is called Gephi.

If you failed to form your own dataset you can download and example dataset.

First open Gephi and use the basic file opening functionality to open the .gexf-file created in the previous step. You'll see a pop up window that gives you an overview of the data. After Gephi has loaded the data you'll see a junk of data. (Pic 6)

The data is layouted randomly when the file is loaded for the first time. (Pic 6)

Without adjusting any settings we don't get much out of the data. We can zoom into it and point single nodes to see the edges leaving from it but that is just it.

What we need to do is to define the layout algorithm, the node size and the color values for the nodes to get more out of the data.

Just to make clear:
Node: balloon
Edge: connection between nodes.

For social networks a layout algorithm called ForceAtlas2 is a proper choise so we will use that. Check that your settings are as in the picture. (Pic 7)

ForceAtlas is great for social networks. Other available layout algorithms include for example Geo Layout. (Pic 7)
After you hit run you'll see the magic happening in just a few seconds. The nodes are settled in the network based on the edges between them. Meaning that the nodes which have more connections between each other are grouped closer to each other and the nodes that have less connections to each other are torn apart.

Next you want to define the colors and the node sizes. But before then you need to count some figures. Mainly you want to run Modularity and Eigenvector centrality. Modularity will divide the nodes into groups and eigenvector centrality will allow us to define the node size. (Pic 8)

Statistics can be calculated from the right side. (Pic 8)
Now we can use these figures to define the colors. (Pic 9)

You can change the colors if you want. (Pic 9)
And the node sizes. (Fig 10)

You may define the min and the max node size. (Pic 10)
After doing so your network could look example like this. (Pic 11)

The separate groups are in different colors defined by Modularity and the node sizes tell how central the node is in the network. (Pic 11) 
You can zoom into the groups and point out single nodes to see the edges. To enable the labels click the small arrow icons below the network. (Pic 12)

You may enable the node labels. (Pic 12)
You are all done. You may adjust your colors and nodes sizes. You can test for example to use the gender information to define the colors. You can also try other layout algorithms to see what is available.

See also Olli Parviainen's great slides about visualizing your Twitter network with Gephi. Slides 8 to 17 show you the main visualizing steps inside Gephi that we've also used here.

4. Summary


Using network visualizations to show the connections between your Facebook friends or social media connections in general is a great way to make insight.

There are also several Javascript tools available that enable you to publish your network online as an interactive visualization:
Network visualizations are not that familiar way of visualization for a common user. Not like bar charts or maps. People tend not to understand what they are about and call them these odd spyderweb visualizations.  From this perspective I am not that eager to publish them online. But for professionals like journalists and programmers network visualizations can give real good insigth into the data. Knowing how to do network visualization gives you most often an unique perspective that no one else have thought of.

keskiviikko 2. lokakuuta 2013

Kuntadata + Google Fusion Tables = kuntakartta

Tämän blogikirjoituksen tehtävä on näyttää askel askeleelta miten yksinkertaisen karttavisualisoinnin toteuttaminen onnistuu Google Fusion Tables -työkalulla.

Ohjeet on alunperin kirjoitettu Metropolia:n opintojakson "Toimittaja verkkomediassa" tarpeisiin, mutta ne on kirjoitettu niin, että kuka vain voi niitä seurata.

1. Hanki kuntadataa


Kuntiin liittyvää dataa on saatavilla hyvin monista eri lähteistä. Esimerkiksi THL:n Sotkanet tarjoaa hyvin monipuolisesti erilaista terveyteen liittyvää tietoa. Toinen laaja tietolähde on tietysti Tilastokeskus.

Esimerkiksi voit ladata kuntadataa Tilastokeskuksen Kuntien avainluvut -aineistosta.
  1. Valitse vasemmalta kaikki kunnat niin, että valituksi tulee 320/321 riviä.
  2. Valitse oikealta haluamasi tunnusluku, voit ottaa esimerkiksi "Väkiluvun muutos, % 2011 - 2012".
  3. Valitse pudotusvalikosta valinta "Pilkkueroteltu otsikolla (.csv)".
  4. Paina "Jatka" ja lataa valitsemasi data tietokoneellesi johonkin mistä löydät sen hetken päästä. 
Lisää Valitse kaikki kunnat, haluamasi tunnusluku sekä haluttu dataformaatti.

Nippelitietoina on hyvä tietää, että vuosina 2011–2012 Suomessa oli 336 kuntaa kun taas vuonna 2013 Suomessa on 320 kuntaa. Aineistossa olevien kuntien määrä kertoo usein siitä miltä ajalta aineisto on. Joskus on myös hyvä tietää, että vuosina 2011–2012 Suomessa oli 320 kuntaa mannersuomessa, koska tämä voi joskus olla hämäävää.

2. Lataa aineistosi Google Drive -palveluun


Seuraavaksi haluat siirtää hankkimasi aineiston Google Drive -pilvipalveluun, koska Fusion Tables on sieltä löytyvä työkalu.

Tätä ennen data täytyy kuitenkin puhdistaa. Käytämme myös tähän puhdistamiseen Google Drive -palvelua.
  1. Mene osoitteeseen http://drive.google.com ja kirjaudu sisään omilla Google-tunnuksillasi.
  2. Näet näkymän jossa ovat kaikki Google Drive -tiedostosi. Jos et ole käyttänyt palvelua aikaisemmin saatat saada tervetulotoivotuksia ja muita viestejä.
  3. Valitse vasemmalta löytyvä punainen upload-painike (nuoli ylöspäin).
  4. Etsi koneellesi aiemmin lataama .csv-tiedosto ja lataa se Google Drive -palveluun.
  5. Avaa tiedosto Google Drive:ssä.
Jos kaikki on tähän asti onnistunut pitäisi lopputuloksen näyttää tältä. Toki jos olet valinnut hyvin eri tyyppisen datan näyttäytyy se tietysti eri tavalla.

Mikäli jotain tuntuu menevän väärin eikä lataamastasi dokumentista synny yllä olevan kaltaista taulukkolaskentadokumenttia kokeile ladata .csv-tiedosto uudelleen ja tarkista latausikkunan asetukset. Haluat, että sinulla on "Conversion; on" -asetus päällä.

Asetettuasi "Conversion" -asetuksen tilaan "on" täytyy sinun ladata tiedosto Google Drive:en vielä kertaalleen, koska vasta tällöin asetus tulee voimaan uusille tiedostoille. Voit huoletta poistaa kaikki turhat tiedostot ja epäonnistuneet siirrot Drive:stä.

3. Puhdista data


Data täytyy puhdistaa ennen kuin sitä voidaan käyttää. Tässä tapauksessa puhdistaminen tarkoittaa, että haluamme muuntaa datan sellaiseen muotoon, että meillä on kaksi saraketta, joista ensimmäisessä sarakkeessa (A) meillä on kunnan nimi ja toisessa sarakkeessa (B) meillä on kuntaan liittyvä lukuarvo, joka siis kuvaa jotain kunnan ominaisuutta. Tässä tapauksessa se siis on kunnan muuttovoitto- tai muuttotappioprosentti.

Haluamme myös, että rivillä yksi (1) meillä on otsikkorivi. Eli rivi joka kuvaa sarakkeiden sisällön. Otsikkoriviä seuraa esimerkiksi suomalaisen kuntadatan tapauksessa 320 riviä, jotka kuvaavat kuntien tiedot. On hyvä tarkistaa rivien määrä sekä ettei mukana ole mitään muuta tarpeetonta.

Nämä toimenpiteet on mahdollista tehdä kuten missä tahansa taulukkolaskentaohjelmassa.

Ensimmäinen rivi on nimeltään otsikkorivi. Se kertoo mitä tietoa sarakkeet pitävät sisällään. Samankaltaista tietoa sisällään pitävät tiedot erotellaan omiksi sarakkeikseen.

4. Tallenna data Fusion Tables -dokumenttina


Käsittelemämme dokumentti on tähän asti ollut Google Spreadsheets -dokumentti. Nyt koska haluamme visualisoida datan Fusion Tables -työkalun avulla kartalle täytyy meidän tallentaa tämä Spreadsheet-dokumentti Fusion Tables -dokumentiksi.
  1. Mene Google Drive -palvelun etusivulle.
  2. Valitse vasemmalta painike "Create".
  3. Valitse "Fusion Table". (Mikäli et löydä "Create"-valikon alta Fusion Tables -valintaa täytyy sinun asentaa kyseinen työkalu "Connect more apps" -valikon kautta).
  4. Valitse avautuvasta ikkunasta vasemmalta Google Spreadsheet, hae oikea dokumentti ja valitse se.
  5. Esikatseltuasi dokumenttia ja annettuasi sille haluamasi tiedot pääset näkemään lataamasi tiedot.
Fusion Tables -dokumentti muistuttaa jossain määrin taulukkolaskentadokumenttia ulkonäöllisesti (sarakkeita ja rivejä), mutta ei kuitenkaan ole sellainen.

Tärkein ero taulukkolaskentadokumentin ja Fusion Tables -dokumentin välillä on, että Fusion Tables on nimenomaisesti tiedon visualisointityökalu. Sen avulla on siis mahdollista suhteellisen helposti visualisoida olemassa olevaa tietoa. Tietojen muokkaaminen sen avulla on kuitenkin melko tuskallista. Fusion Tables:ssa esimerkiksi sarakkeiden summaaminen ja muut funktionaaliset toiminnallisuudet loistavat poissaolollaan. Kannattaa siis ensin muokata data valmiiksi taulukkolaskentaohjelmistossa ja vasta sitten tuoda se Fusion Tables:iin.

5. Hanki aluerajat


Jotta voit tehdä datastasi Suomen kuntarajoihin perustuvan visualisoinnin täytyy sinulla olla datan lisäksi toki myös Suomen kuntarajat. Lataa dataasi sopivat rajat tämän blogin KML-aineistot sivulta. Esimerkkitapauksessamme oikea aineisto on "Suomen kuntarajat 2013".

Voit joko käyttää "Make a copy" -toimintoa tai sitten ladata datan ensin koneellesi ja sitten uutena Fusion Tables -dokumenttina omaan Google Drive:esi. Oleellista on, että saat rajat sisältävän Fusion Tables -dokumentin näkymään omassa Google Drive:ssäsi.

Haluat ladata aluerajat omaan Google Drive:esi.

6. Yhdistä datasi aluerajadataan


Seuraavaksi haluat yhdistää kaksi dokumenttia toisiinsa yhteisen nimittäjän avulla. Yhteinen nimittäjä on tässä tapauksessa kunnan nimi, joka siis on yhteinen molempien dokumenttien kesken.
  1. Avaa kuntadata sisältävä Fusion Tables -dokumenttisi.
  2. Valitse File-valikon alta löytyvä Merge-painike.
  3. Etsi dokumenteistasi aluerajat sisältävä dokumentti ja valitse "Next".
  4. Valitse sarake, jonka perusteella dokumenttien yhdistäminen tehdään.
Valitse sarakkeet joissa on toisiaan vastaavat tiedot.

7. Karttadatan visualisointi


Nyt meillä siis on Fusion Tables -dokumentti, joka pitää sisällään niin datan kuin aluerajat. Seuraavaksi haluamme määrittää miltä kartta näyttää. Eli haluamme muun muassa määrittää alueiden värityksen.
  1. Valitse "Map of geometry" -välilehti.
  2. Näet punaisen Suomen kartan.
  3. Valitse "Tools" -> "Change map styles...".
  4. Valitse vasemmalta Polygons.
  5. Valitse Buckets.
  6. Määrittele haluamasi värien määrä. Kohdasta "Divide into x buckets". Esimerkiksi 4–6 on usein hyvä arvo.
  7. Valitse kohtaan "Column" sarakkeen nimi, jossa on visualisointiin haluamasi data.
  8. Tallenna muutokset ja näet tekemäsi muutokset kartalla.
  9. Voit muuntaa alueita klikkaamalla näkyvän infoikkunan sisältöä valitsemalla "Tools" -> "Change info windon layout...". Voit valita mitkä sarakkeet näytetään ja myös muokata vapaasti osatessasi infoikkunan html-koodia.
Yhdistämisen jälkeen sinulla on uusi Fusion Tables -dokumentti missä on niin hankkimasi data kuin aluerajat. Aluerajat näkyvät kuvassa kohdassa "geometry".

Voit vaihtaa raja-arvoja ja värejä haluamallasi tavalla. Näissä valinnoissa tulisi toki julkaistavassa jutussa olla jokin peruste.

Mahdolliset tyhjät alueet tarkoittavat sitä, että yhdistäminen alkuperäisen datan ja aluerajadatan välillä ei ole onnistunut kaikilta osin. Tässä tapauksessa syynä on, että kuntien nimen eivät olleet aineistoissa yhteneväiset.

8. Julkaisu


Valmiin karttatoteutuksen julkaiseminen onnistuu useimmissa sisällön hallintajärjestelmissä niin sanotun iframe-upotuksen avulla. Saat upotukseen tarvittavan html-koodin valitsemalla "Tools" -> "Publish...".

Ennen julkaisua Fusion Tables -dokumentti tulee asettaa näkyväksi Internetissä. Valinta "Everyone with a link" on usein hyvä vaihtoehto.

Tämä iframe-koodi upotetaan hieman riippuen sisällöntuotantojärjestelmästä osaksi jutun leipätekstiä, jolloin sen pitäisi toimia kuten tässä.



Loppusanat


Nämä ohjeet eivät pyri kuvaamaan prosessia täydellisesti vaan on tarkoituksenmukaista, että niitä läpikolutessa joutuu myös ajattelemaan välillä mitä on tekemässä.

Kaikki palaute on tervetullutta :)

perjantai 28. kesäkuuta 2013

Kesäloma edessä, mitä takana?

Aloitin yhdessä Juha Rissasen, Juho Salmisen, Mika Pippurin ja Stina Tuomisen kanssa työt Yle:n PlusDesk-toimituksessa tammikuun 21. päivä kuluvaa vuotta. Tehtävämme PlusDeskissä on tehdä yhdessä muiden toimitusten kanssa verkonomaisia sisältöjä.

Näin heinäkuun kynnyksellä voidaan sanoa, että ensimmäinen rypistys on takana ja omalta osaltani edessä siintää kesäloma. Kolme viikkoa (toivottavasti) jotain aivan muuta.

Mitä sitten on takana? Kulunutta viittä kuukautta ja viikkoa voidaan katsoa monesta näkökulmasta, mutta eräs mittari jota seuraamme on miten paljon juttuja joiden tekemisessä olemme mukana on luettu. Seuraamme lukijamääriä mm. viikkotasolla missä tavoitteenamme on olla Yle Uutisten top3-luetuimman jutun joukossa. Tähän asti olemme onnistuneet tässä yksitoista kertaa.

Tässä nämä onnistumiset koottuna lukijamääräjärjestyksessä. Mukana on eri tyyppisiä juttuja ja juttutyyppejä sisältäen niin laskureita, karttoja, graafeja kuin myös upeita kuvituskuvia. Keräsin jutuista keskeisimmät metatiedot kuten julkaisuajan, kotiosasto, tekijät, lukijamäärät, käytetyt tekniikat sekä datalähteet. Olen merkinnyt kursiivilla PlusDeskin ulkopuoliset tekijät.

1. Laske uusi painoindeksisi täältä

2. Kuinka rikas olet verrattuna muihin eurooppalaisiin? Kokeile laskurilla

  • Linkki: http://yle.fi/uutiset/6672048
  • Kotiosasto: Talous
  • Julkaistu: Torstaina 6. kesäkuuta 2013 klo 6:25
  • Tekijät: Teemo Tebest, Johan Jaakkola, Juha Rissanen, Juho Salminen
  • Lukijamäärä: 166 548
  • Tekniikka: jQuery UI Slider
  • Data: Tilastokeskus, Eurostat

3. Mistä sinä säästäisit jos olisit ministeri? Kokeile laskurilla

  • Linkki: http://yle.fi/uutiset/6544401
  • Kotiosasto: Kotimaa
  • Julkaistu: Torstaina 21. maaliskuuta 2013 klo 6:28
  • Tekijät: Teemo Tebest, Juha Rissanen, Juho Salminen
  • Lukijamäärä: 107 619
  • Tekniikka: Ei erityistä teknologiaa.
  • Data: Valtiovarainministeriö

4. Täällä punkit aiheuttavat tauteja – katso alueesi tilanne

  • Linkki: http://yle.fi/uutiset/6598455
  • Kotiosasto: Kotimaa
  • Julkaistu: Keskiviikkona 15. toukokuuta 2013 klo 6:18
  • Tekijät: Teemo Tebest, Anne Pirskanen, Juha Rissanen, Juho Salminen
  • Lukijamäärä: 106 528
  • Tekniikka: Raphaël
  • Data: Terveyden ja hyvinvoinnin laitos

5. Pyöräilijä: Testaa osaatko liikennesäännöt

  • Linkki: http://yle.fi/uutiset/6688871
  • Kotiosasto: Liikenne
  • Julkaistu: Maanantaina 17. kesäkuuta 2013 klo 6:29
  • Tekijät: Teemo Tebest, Elina Jämsen, Juho Salminen, Juha Rissanen
  • Lukijamäärä: 87 519
  • Tekniikka: Google Form + kuvitus
  • Data: Liikenneturva

6. Katso paljonko ikäisilläsi sinkuilla on asuntolainaa

7. Kannattaako koulutus? Näin työntekijä pärjää maisterille

  • Linkki: http://yle.fi/uutiset/6696442
  • Kotiosasto: Kotimaa
  • Julkaistu: Maanantaina 24. kesäkuuta 2013 klo 6:13
  • Tekijät: Teemo Tebest, Hanna Hantula, Mika-Matti Taskinen, Stina Tuominen, Juho Salminen 
  • Lukijamäärä: 70 375
  • Tekniikka: Highcharts Line chart + kuvitus
  • Data: Tilastokeskus, ammattiliitot

8. Nouseeko kotiseudullesi jättimäisiä tuulimyllyjä? Katso kartalta

  • Linkki: http://yle.fi/uutiset/6590722
  • Kotiosasto: Ajankohtainen kakkonen
  • Julkaistu: Tiistaina 23. huhtikuuta 2013 klo 7:09
  • Tekijät: Teemo Tebest, Jari Hakkarainen, Pasi Toivonen, Mika Pippuri, Stina Tuominen
  • Lukijamäärä: 54 314
  • Tekniikka: Google Fusion Tables
  • Data: Suomen Tuulivoimayhdistys ry

9. "Jäin eläkkeelle parikymppisenä"

10. Katso, kuka on kuuma Twitterissä – #SuomiTop100 on täällä taas

  • Linkki: http://yle.fi/uutiset/6698234
  • Kotiosasto: Internet
  • Julkaistu: Tiistaina 25. kesäkuuta 2013 klo 6:27
  • Tekijät: Teemo Tebest, Antti Hirvonen, Juha Rissanen, Stina Tuominen
  • Lukijamäärä: 47 884
  • Tekniikka: Tablesorter, kuvitus
  • Data: Twitter, Toni Nummela, Hampus Brynolf

11. Tuoko ryntäys kaivoksen naapuriisi? Katso kartalta

  • Linkki: http://yle.fi/uutiset/6476988
  • Kotiosasto: Yritysvastuu
  • Tekijät: Teemo Tebest, Jaana Kanninen, Juha Rissanen, Juho Salminen
  • Julkaistu: Maanantaina 4. helmikuuta 2013 klo 10:17
  • Lukijamäärä: 33 506
  • Tekniikka: Google Fusion Tables
  • Data: Tukes
Nämä ovat siis juttuja joita PlusDesk on ollut tekemässä ja jotka ovat nousseet Yle Uutisten top3-luetuimmaksi jutuksi julkaisuviikollaan. Lukijamäärät ovat peräisin ComScore:sta ja ne on tarkastettu aamupäivällä 28.6.2013.

Ruutia jätkät, ruutia!

tiistai 25. kesäkuuta 2013

Pyöräilytestin tulokset

Julkaisimme viime viikon maanantaina (17.6.) pyöräilyaiheisen jutun: "Pyöräilijä: Testaa osaatko liikennesäännöt", jossa kahdeksan pyöräilyn liikennesääntöaiheisen kysymyksen avulla testasimme lukijoidemme pyöräilysääntötietoutta. (Kuva 1)

Jutussa piti vastata kahdeksaan pyöräilyaiheiseen liikennesääntökysymykseen. (Kuva 1)
Juttu oli erittäin suosittu ja vastauksia kyselyyn kerääntyikin eiliseen mennessä 64 571. Tehdessämme aiheesta keskiviikkona (19.6.) jatkojutun – jossa kerroimme tuloksista – oli vastauksia ehtinyt kerääntyä noin 52 000.

Tässä kysymysten oikeinvastausprosentit:
  • 1 kysymys: 64 %
  • 2 kysymys: 90 %
  • 3 kysymys: 92 %
  • 4 kysymys: 86 %
  • 5 kysymys: 72 %
  • 6 kysymys: 85 %
  • 7 kysymys: 75 %
  • 8 kysymys: 73 %
Ensimmäinen kysymys oli siis vaikein (kaksi kolmesta vastasi oikein) ja kolmas taas helpoin (yhdeksän kymmenestä vastasi oikein). Tässä oikeiden vastausten jakauma kysymyksittäin:
  • 0 oikein: 22 vastausta, 0,03 %
  • 1 oikein: 27 vastausta, 0,04 %
  • 2 oikein: 186 vastausta, 0,39 %
  • 3 oikein: 848 vastausta, 1,31 %
  • 4 oikein: 3 288 vastausta, 5,09 %
  • 5 oikein: 9 586 vastausta, 14,83 %
  • 6 oikein: 18 281 vastausta, 28,31 %
  • 7 oikein: 20 394 vastausta, 31,58 %
  • 8 oikein: 11 939 vastausta, 18,49 %
Tyypillinen vastaaja sai siis seitsemän oikein ja vastasi väärin ensimmäiseen kysymykseen. Vastaajien liikennetietämys ainakin näiden kysymysten valossa oli oikein hyvää. Huomionarvoista on, että alle 0,5 % vastaajista sai vain kaksi tai vähemmän oikein. Oikeiden vastausten keskiarvo oli 6,4.

Päiväkohtainen vastausten kertymä näyttää tältä:
  • maanantaina 17.6.2013: 39 731 
  • tiistaina 18.6.2013: 11 089
  • keskiviikkona 19.6.2013: 6 668
  • torstaina 20.6.2013: 2 397
  • perjantaina 21.6.2013: 828
  • lauantaina 22.6.2013: 1 020
  • sunnuntaina 23.6.2013: 948
  • maanantaina 24.6.2013: 1 890
Suurin piikki nähtiin siis julkaisupäivänä, mutta myös julkaisua seuraavina päivinä kyselyyn vastasi huomattava määrä ihmisiä. Testin perusteella saatu tulos oli mahdollista jakaa omassa sosiaalisessa mediassa Twitterin ja Facebookin kautta, joka osalta toi nostetta nimenomaan julkaisun jälkeisille päiville. Tässä luvut katsottuina SharedCount-palvelusta:
  • Facebook-tykkäyksiä: 1 656
  • Facebook-jakoja: 574
  • Facebook-kommentteja: 3 448
  • Twiittejä: 165
Mikäli olet kiinnostunut kyselyn vastausaineistosta voit ladata sen koneellesi .csv-muodossa:
Aineisto sisältää aikaleiman jolloin vastaus on lähetetty sekä kaikkien vastaajien lähettämät vastausrivit (64 571). Lisäksi otsikkoriville on kuvattu kunkin kysymyksen oikea vastaus. Aineisto on lisenssoitu CC-BY-SA 3.0. Lähteenä mainittava Yle Uutiset.