Data-analyysityöpaja Kajaanin Tiedepäivillä

Mitä data-analyysi on? Data-analyysi tarkoitaa sitä, että datan pohjalta päätellään jotain uutta. Esimerkiksi mittausdatan perusteella voidaan todeta, että uusi lääkeaine näyttää laskevan verenpainetta.

No mitä se data on? Nykypäivänä data voi olla mitä tahansa, mikä on saatavissa digitaalisessa muodossa. Perinteisesti data on ollut tieteellisiä havaintoja, joita on tunnollisesti kirjattu ylös, vaikkapa jonkinlaiseksi taulukoksi. Näin on edellisen verenpaine-esimerkin tapauksessa. Nykyään kuitenkin tehdään jo paljon analyysiä esimerkiksi reaaliaikaisesta videokuvasta. Hyvä esimerkki tästä on vaikkapa robottilennokki, joka lentää pitkin voimalinjoja ja videokameran kuvan avulla analysoi, että milloin lumikuorma on vaarallisen suuri.

Mihin data-analyysia tarvitaan? Jos visionäärejä on uskominen, niin kohta ihan kaikkeen. Tieteessä datan analysointi on ollut keskeistä viimeistään 1900-luvun alusta alkaen. Tämä perinteinen tieteen ja asiantuntijatyön analytiikka on kuitenkin nyt saamassa rinnalleen uuden käyttäjäkunnan, kun arkisemmat data-analyysitarpeet ovat suoraan sanoen räjähtäneet. Facebookin ja Googlen kaltaiset internetajan yritykset vetävät uuden data-analytiikan nopeaa kehitystä. Yritysmaailmassa niin kutsuttu Big Data on tällä hetkellä hyvin kuuma aihe.

Joka tapauksessa on selvää, että tulevaisuudessa data-analyysiä tehdään paljon enemmän ja paljon laajemmin. Eli ei pelkästään tutkimuslaitoksissa, vaan myös tavallisissa yrityksissä, virastoissa ja järjestöissä. Jos opettelee ainakin perusasiat, niin saa melkoisen hyödyn tulevaisuutta ajatellen.

Asiaan

Jotta voi analysoida dataa, niin aluksi pitää ladata dataa. Alla oleva koodinpätkä tekee juuri sen.

Koodi ajetaan klikkaamalla harmaaseen laatikkoon, jolloin se tulee valituksi. Valitse ylävalikosta Cell -> Run ja koodi käynnistyy. Sen merkkinä ilmestyy In-riville tähti. Kun homma on valmis, niin alle ilmestyy tulokset. Tässä tapauksessa pitäisi tulla ladattu data näkyviin taulukkona.

Jatkossa koodin voi ajaa myös näppärämmin painamalla Ctrl ja Enter.


In [ ]:
# Luetaan loitsut, jotka alustavat ympäristön
from pandas import DataFrame, Series, read_csv
from numpy import vstack, round, random
from bokeh.plotting import figure, show, output_notebook, hplot
from bokeh.charts import Bar, Scatter
from bokeh._legacy_charts import HeatMap
from bokeh.palettes import YlOrRd9
output_notebook()
import warnings
warnings.filterwarnings("ignore")

# Ladataan datatiedosto
data = read_csv('https://raw.githubusercontent.com/CSC-IT-Center-for-Science/kajaani-science-days-workshop/master/data.csv', sep=';', decimal=',')

# Katsotaan miltä data näyttää
data

Miltä data näyttää?

Data-analyysi alkaa yleensä sillä, että piirretään data kuvaajaksi eli visualisoidaan se. Tai jos rehellisiä ollaan, niin aluksi yleensä tapellaan sen kanssa, että data saadaan siivottua, oikeaan muotoon ja ladattua koneelle. Mutta sen jälkeen siis visualisoidaan.

Meidän datataulukkomme sisältää vähän kaikenlaista tietoa kymmenen viime vuoden ajalta. Sen perusajatus on, että kaikki tiedot on kytketty kuukauteen. Eli on jokaiselle kuukaudelle erilaisia mittauksia ja muita tietoja, kuten kuukauden keskilämpötila Ilmatieteen laitokselta, myyntitilastoja ja sanojen esiintymistä Suomi24-keskustelufoorumin keskusteluissa.

Piirretään taulukosta löytyvät jäätelömyynnin määrät kuukausittain. Dataa on pitkältä ajalta ja visualisointi on siksi vaikea lukea sellaisenaan, mutta sitä pystyy liikuttelemaan ja sillä tavalla tekemään paremmin ymmärrettäväksi.


In [ ]:
show(Bar(data, label='Kuukausi', values='Jaatelomyynti'))

Surffaile hetken ajan ylläolevaa visualisointia. Mikä on jäätelömyynnin perusidea?

Satunnaisuus

Katsotaan ensimmäistä vuotta tarkemmin. Mitä muuta huomaat kuin kuin kesän vaikutuksen?


In [ ]:
data2005 = data[0:12]
show(Bar(data2005, label='Kuukausi', values='Jaatelomyynti'))

Joulukuun myynti on myös kohollaan. Syödäänkö jouluna paljon jäätelöä? Ehkäpä.

Nyt katsoimme kuitenkin vain yhtä vuotta ja yksittäiseen havaintoon ei pidä luottaa. Valitettavasti suuresta kaaviosta on mahdoton nähdä, että mitä joulukuussa myynti on keskimäärin verrattuna muihin talvikuukausiin. Voimme kuitenkin kätevästi poimia datasta halutut tiedot ja piirtää uudet visualisoinnit.


In [ ]:
talvikuukaudet = [i % 12 in (11, 0, 1) for i in range(120)]
datajoulu = data.copy()
datajoulu['Joulu'] = Series(i[-2:] != '12' for i in data['Kuukausi'])

show(Bar(datajoulu[talvikuukaudet], label='Kuukausi', values='Jaatelomyynti', title='Talven myynti', group='Joulu'))

Nyt näemme, että talvikuukausien myynti vaihtelee aika paljon, eivätkä punaiseksi piirretyt joulukuut poikkea muista kuukausista juurikaan. Varsinaisessa data-analyysissa satunnaisen vaihtelun käsittelyyn käytetään tilastollisia testejä. Tällainen yksinkertainen visualisointi kuitenkin auttaa jo silmämääräisesti hahmottamaan, että kuinka suurta satunnaista vaihtelua datassa on ja tekemään jonkinlaisen arvion siitä, että onko havaittu arvo todellakin poikkeava.

Datan yhdistelyä

Data-analyytikkoa usein kiinnostaa, että millaisia yhteyksiä kahden eri asian välillä on. Meidän taulukossamme se käytännössä tarkoittaa, että löytyyko eri sarakkeiden arvojen väliltä kiinnostavia yhteyksiä.

Piirretään datasta kaksi eri tietoa: jäätelömyynti ja allergialääkkeiden myynti. Voiko näistä kaavioista nähdä mitään?


In [ ]:
show(Bar(data, label='Kuukausi', values='Jaatelomyynti'))
show(Bar(data, label='Kuukausi', values='Allergialaakemyynti'))

Suoraan piirrettynä tiedoista näkee, että molemmissa on selvä vuositasolla toistuva kuvio. Mutta osuvatko ne yhteen, ja jos osuvat, niin kuinka paljon?

Sitä varten vaihdetaan toisenlaiseen kuvaajaan, nimittäin hajontakaavioon. Siinä nämä kaksi tietoa x- ja y-akseleille. Jokaista täplää vastaa yksi kuukausi ja sen x- ja y-koordinaatit otetaan jäätelö- ja allergialääkemyyntiä vastaavista sarakkeista.


In [ ]:
show(Scatter(data, x='Jaatelomyynti', y='Allergialaakemyynti'))

Nähdään, että nämä kaksi asiaa tavallaan kulkevat käsi kädessä. Kun jäätelömyynti on suuri, niin myös allergialääkkeiden myynti on suuri. Niinpä hajontakaavio näyttää vasemmasta alakulmasta oikeaan yläkulmaan lentävälle täpläparvelle.

Voidaanko tästä siis päätellä, että toinen aiheuttaa toisen? Eli jos syödään paljon jäätelöä, niin se aiheuttaa heinänuhaa? Tai että jos podetaan heinänuhaa, niin sitä hoidetaan lurpsimalla jäätelöä? Koska sitähän se data näyttäisi sanovan?

Näiden kahden muuttujan välinen suhde ei kuitenkaan ole näin yksinkertainen, vaan mukana on tavallaan kolmas pyörä. Piirretäänpä sama hajontakaavio uudelleen niin, että kesäkuukaudet saavat vihreän värin.


In [ ]:
datakesa = data.copy()
datakesa['Kesa'] = Series(i[-2:] in ('06', '07', '08') for i in data['Kuukausi'])
show(Scatter(datakesa, x='Jaatelomyynti', y='Allergialaakemyynti', color='Kesa'))

Mysteeri ratkesi! Taitaakin olla niin, että kesäkelit aiheuttavat sekä jäätelömyynnin kohoamista, että heinänuhaa.

Uusien yhteyksien löytämistä

Tähän asti emme ole koskeneet koodiin. Mutta seuraavaksi pääset itse tutkailemaan eri sarakkeiden välisiä yhteyksiä. Katsotaan aluksi, että minkä nimiset sarakkeet datasta löytyvät.


In [ ]:
data.columns.values.tolist()[1:10]

Alla on esimerkiksi piirretty jäätelömyynnin ja kuukauden keskilämpötilan yhteys. Voit muuttaa sarakkeiden nimiä ja ajaa koodin uudelleen, jolloin näet valitsemiesi sarakkeiden yhteyden.


In [ ]:
# Muuta hipsujen sisällä olevia arvoja alla
# Älä poista hipsuja tai lisää välilyöntejä niiden sisälle
sarake1 = 'Jaatelomyynti'
sarake2 = 'Lampotila'

# Ja piirretään
show(Scatter(data, x=sarake1, y=sarake2))

Voit esimerkiksi kokeilla Suomi24-foorumin sanojen yleisyyttä ja verrata niitä toisiinsa, tai muihin sarakkeisiin.

Vähän lisää automaatiota

Sarakkeiden välisten yhteyksien etsimistä voi myös automatisoida. Voidaan esimerkiksi mitata sarakkeiden yhteys nk. korrelaation avulla ja tällä tavalla verrata kaikki sarakkeita keskenään. Tuloksena piirretään lämpökartta, jossa tumma väri vastaa vahvaa korrelaatiota.


In [ ]:
show(HeatMap(data.corr(), title="Sarakkeiden yhteys (korrelaatio)", palette=YlOrRd9[::-1]))

Tästä lämpökartasta nähdään, että datassa on kaksi keskenään korreloivaa ryhmää. Toinen ovat kaksi myyntitilastoa ja toinen kaikki Suomi24-hakusanat. Suomi24-korrelaatioiden taustalla on se, että kaikkien sanojen esiintyminen kasvaa foorumin käytön lisääntyessä datan ajanjaksolla. Hyvä seuraava askel olisikin käsitellä data niin, että Suomi24:n suosion kasvu häivytetään laskennallisin menetelmin (normalisoidaan) ja tämän jälkeen kiinnostavammat yhteydet näkyisivät paremmin.

Lopuksi

Jos yhden asian tästä työpajasta muistat, niin toivottavasti se on tämä: jäätelön syönti ei aiheuta heinänuhaa, rokkifestareita tai telkkarin kesäuusintoja. Ne kyllä tapahtuvat samaan aikaan, mutta se ei tarkoita, että toinen aiheuttaa toisen.

Jos muistat toisenkin asian, niin se voisi olla tämä: oikeassa datassa on aina satunnaista vaihtelua, joten muutamien havaintojen perusteella ei voi päätellä juuri mitään. Pitää katsoa isompaa määrää dataa.

Data-analyysiä ymmärretään nykyään melkoisen huonosti, vaikka siihen luotetaankin kovasti. Tartu siis tilaisuuteen ja opettele vähän tätä lajia. Tulet todennäköisesti hyötymään hyvin paljon.

(Datalähteet: Ilmatieteen laitos, Keskisuomalainen 10.07.2014: Suomalainen syö vuodessa näin paljon jäätelöä, Jantunen: Allergian ja astman kustannukset Suomessa vuonna 2011, Suomi24 / Aller Media. Dataa on muokattu ja täydennetty tarpeen mukaan ja tarinaa tukemaan, eli osa datan piirteistä on lisätty sinne keinotekoisesti. )