Edellisissä postauksissa käsiteltiin prosessi, jolla päädyttiin malliin, joka ennustaa asemakohtaisia todennäköisyyksiä pyörän saapumiselle kahden minuutin sisällä riippuen asemasta, ajankohdasta ja säästä. Malli on toki omasta mielestäni aika hieno, mutta nyt on vuorossa hauskin kohta: tulosten soveltaminen.
Lisäominaisuus: pyörien saapumisväli
Joten: rakennetaan Tableaulla kartta, jossa jokainen asema on oma pallonsa Helsingin ja Espoon alueella. Pallon väri ja koko kertoo pyörän saapumisen todennäköisyyden: alle 50%:n todennäköisyydellä pyörää ei varmaankaan ole tulossa, ja yli 50%:n todennäköisyyksillä pyörää kannattanee jäädä odottamaan. Pienellä matematiikalla todennäköisyyttä voi myös käyttää laskemaan pyörien keskimääräinen saapumisväli:
jossa t on saapumisväli, P on ennustettu todennäköisyys ja µ on ajankohdalle ja asemalle spesifi pyörien historiaan perustuva keskimääräinen saapumismäärä. µ on tässä kaavassa jaettu kahdella, koska havainnothan ovat edelleen kahden minuutin tasolla.
Kuinka murskata 20 miljoonaa riviä kymmenesosaan?
Yksi haaste on ilmeinen: Miten saada 20:n miljoonan rivin datasetti Tableau Publiciin, kun kovakoodattu raja kyseiseen palveluun on 15 miljoonaa riviä? Vastaus on tietenkin yksinkertaistaa datan rakennetta aggregoimalla pois aikadimensio ja säilyttämällä ainoastaan asema-aikakohtainen keskimääräinen todennäköisyys p(Bike) muine tietoineen. Lopulta nämä rivit yhdistetään R:stä ulos vedettyyn estimaattitaulukkoon, joka näkyy alla nimellä ranef. Ranef-taulukko siis sisältää asemakohtaiset laskuohjeet ennusteille, ja ne on yhdistetty muuhun dataan aseman tunnuksen perusteella.
Kiinteät vaikutukset on kätevää sisällyttää calculated fieldillä, joka sisältää ainoastaan kiinteän estimaatin luvun. Loppujen lopuksi kaavahan tarvitsee vain mainitut parametrit “sää” ja “todennäköisyys” laskeakseen tuloksen. Säätiedot voi syöttää yksinkertaisilla Tableau-parametreilla, todennäköisyydet taas laskettiin äsken aikadimensiota aggregoimalla, ja yksittäisen ennusteen tarvitsemaan pohjatodennäköisyyteen pääsee käsiksi hyödyntämällä now()-funktiota.
Vielä viimeinen muokkaus dataan on aggregoida näitä todennäköisyyksiä hieman ylöspäin kymmenen minuutin tasolle: Espoon uusien asemien ylisuuret estimaatit liioittelevat helposti todennäköisyyksiä lyhyillä 2 minuutin aikaväleillä. Ylöspäin aggregoiminen tasoittaa näitä ”ylilyöntejä”. Todennäköisyys on siis edelleen kahden minuutin aikavälille, mutta se on nyt keskiarvo 10:n minuutin ajanjaksolla.
Tableau Publiciin menevä datasetti sisältää aggregoituna lopulta ~259 000 riviä – noin sadasosa alkuperäisestä. Tällä datamäärällä varmistetaan osaltaan myös kartan jouheva toiminta.
Toimivuuden ja käytettävyyden optimointi Tableaussa
Lopulliset ennusteet on siis yksinkertaisesti laskettu aiemmin mainituilla kaavoilla. Tableaun päässä haasteena on enää saada laskut suoritettua ainoastaan tarvituilla riveillä eli täsmälleen oikeana ajankohtana. Tämän voi varmistaa yksinkertaisilla true/false-filttereillä: Esimerkiksi oikean minuutin varmistaminen:
datepart(‘minute’,now()) – int(right(str(datepart(‘minute’,now())),1)) = [Minute]
Vasemman puolen lasku laskee lähimmän kymmenminuuttisen tunnin sisällä, ja pakottaa siten laskutoimitukset tapahtumaan lähimmän intervallin sisällä. Samankaltaiset filtterit rajoittavat laskuja myös tunnin ja viikonpäivän osalta. Lopulta worksheetille sijoitetaan relatiivinen now-filtteri, joka varmistaa, että kartan arvot muuttuvat ajan kuluessa paremmin.
Käytettävyyttä voi vielä parantaa formatoimalla tooltippiä tyylikkäämmäksi. Sen pitää ensinnäkin kertoa selkeästi aseman nimi. Todennäköisyys on hyvä kuvailla ymmärrettävillä termeillä, ja mukaan on hyvä lisätä ennustettu odotusaika, joka laskettiin aiemmin. Lopuksi näyttävyyttä tuo in-tooltip -visualisaatio, joka kertoo todennäköisyyden jakauman kuluvan päivän ajalta.
Lopputulos näyttää tältä:
Näin ollaan siis toteutettu koneoppimisen tekniikoita hyödyntämällä yksinkertainen mutta tehokas sovellus, joka toivottavasti tuo iloa monien cityfillaristien arkeen. Mallia on myös mahdollista viedä eteenpäin huomattavasti: edistyneessä ratkaisussa todennäköisyyksiä voisi laskea neuroverkolla, ja palvelun voisi toteuttaa omana web servicenään. Tämä mahdollistaisi todennäköisyyksien yhdistämisen reaaliaikaiseen pyörätilanteeseen ja säätietoihin – ollaanko enää kaukana varsinaisesta taikuudesta? 🙂
Blogisarjan muut osat, ja alla vielä itse sovellus:
- Osa 1: Kuinka loihtia älyä kaupunkipyörien avoimesta datasta?
- Osa 2: Visuaalisella analyysillä kiinni dataan
- Osa 3: Ongelmasta ideaan, ideasta preppaukseen ja karvalakkimalliin
- Osa 4: Karvalakkimallista jotain hienostuneempaa
- Osa 5: Monitasoinen logistinen regressio
- Osa 7: Mitä opittiin, ja kuinka sitä voisi soveltaa?
