Avainsana-arkisto: Python

Python ja Power BI yhteiskäyttö

Päivitetty 15.5.2020

Power BI desktop on hyvä työkalu datojen noutamiseen, yhdistelyyn ja visualisointiin. Visualisoinnit kootaan dashboard-tyyppiselle alustalle ja voidaan edelleen julkaista Power BI -pilvipalvelussa tai omalla Power BI -palvelimella.

Jos visualisointien tekemiseksi tarvitaan edistyneempää data-analytiikkaa, niin apuvälineinä voi käyttää Python- ja R-ohjelmointikieliä. Julkaisualustalle siirrettynä tuettuina ovat ainakin seuraavat Pythonin ohjelmakirjastot: numpy, pandas, matplotlib, seaborn, scikit-learn, scipy ja statsmodels.

Seuraavassa luon Excel-muotoiselle datalle ( http://taanila.fi/data3.xlsx ) jointplotin. Lukijan oletan entuudestaan tuntevan Power BI Desktopin toimintoja ja osaavan jonkin verran Python data-analytiikkaa.

Tässä käytävä esimerkki on yksinkertainen, mutta Python-koodi voisi sisältää paljonkin analytiikkaa kunhan lopputuloksena syntyy visualisointi (matplotlib– tai seaborn-kirjaston kuvio).

Käyttöönotto

Power BI desktopille täytyy kertoa, mitä Python-asennusta käytetään:

  • Valitse File – Options and settings – Options.
  • Valitse vasemmasta reunasta Python scripting.
  • Detected Python home directories -listasta löytyy käyttämästäsi koneesta tunnistetut Python-asennukset, joista voit valita haluamasi. Anacondaa käyttävillä, myös minulla, on ollut ongelmia saada Python toimimaan Power BI:n kanssa. Tähän ongelmaan löytyy erilaisia ratkaisuyrityksiä googlaamalla. Tätä kirjoittaessani poistin koneeltani kaikki Python-asennukset ja asensin Anacondan uusimman version. Tässä tapauksessa Anacondan Python toimi ongelmitta Power BI:ssä.

WinPython on kätevä Windows-koneilla toimiva siirrettävissä oleva paketti, joka ei vaadi minkäänlaista asennusta eikä myöskään vaikuta mitenkään koneella jo oleviin Python asennuksiin. Tätä voit käyttää PowerBI:n kanssa, jos et saa muita asennuksia yhteistyöhön. PowerBI ei automaattisesti tunnista koneella olevaa WinPythonia, mutta sen voi ottaa käyttöön valitsemalla Detected Python home directories -listasta Other ja siirtymällä Browse-toiminnolla WinPythonin kansioon:

powerbi1

Visualisointi Pythonilla

Napsauta Visualizations-paneelissa Py-kuvaketta.

powerbi2

Jos saat pyynnön sallia visualisoinnit, niin valitse Enable.

Alareunaan ilmestyy Python script editor, jossa on teksti Drag fields into Values area in the Visualization pane to start scripting. Toimi ohjeen mukaan ja lisää tarvitsemasi kentät Value-alueelle.

powerbi3

Power BI muodostaa valituista kentistä pandas dataframen, jonka nimenä on dataset.

Tärkeää: Power BI poistaa duplikaatit eli rivit, joilla on täsmälleen samat arvot. Jos haluat säilyttää kaikki rivit, niin lisää Value-alueelle myös kenttä, jossa jokaisella rivillä on eri arvo (tässä esimerkissä nro).

Python script editor on valmiina koodia varten. Lisättävän koodin toimivuus kannattaa ehdottomasti testata ohjelmointiympäristössä, jossa yleensä koodaat. Virheiden metsästäminen ja korjaaminen on Power BI:ssä työlästä.

Seuraavassa olen kopioinut koodin Python script editoriin:

powerbi4

Koodin voi suortittaa editorin oikean yläkulman Run script -painikkeella:

powerbi5

Yllä näkyvästä olen lisäksi poistanut Power BI:n tuottaman otsikon.

Ongelmia desimaalipilkkujen kanssa

Pythonia voi käyttää datan noutamiseen valitsemalla Get data – Other – Python script – Connect. Tämän jälkeen pääset kirjoittamaan koodin datan avaamiseen:

powerbi6

Tämä kuitenkin johtaa ongelmiin Suomessa:

  • Python käyttää aina desimaalierottimena pistettä.
  • PowerBI puolestaan tunnistaa pisteitä sisältävän tiedon päivämäärätyyppiseksi.

Seurauksen huomaa tietoa noudettaessa:

powerbi7

Tästä voi toki jatkaa Power Query Editoriin, jossa voi kumota päivämääräksi muuntamisen, korvata pisteet pilkuilla ja antaa sen jälkeen Power BI:n tunnistaa tietotyyppi. Useimmissa tapauksissa kannattanee kuitenkin välttää datan avaamista Python scriptillä.

Power Query Editorissa voit halutessasi muuntaa ja siivota dataa Python scripteillä. Run Python Script -painike löytyy Transform-välilehdeltä.

powerbi8

Toisaalta Power Query Editor tarjoaa monipuoliset toiminnot datan muuntamiseen ja siivoamiseen ilman Python scriptejäkin.

Lisätietoa

https://docs.microsoft.com/fi-fi/power-bi/connect-data/desktop-python-visuals

 

 

 

 

 

Koneoppiminen ja scikit-learn -kirjasto

Pythonia käytettäessä useimmat koneoppimisen mallit löytyvät sklearn (scikit-learn) -kirjastosta. Tästä artikkelista opit  sklearn-kirjaston mallien käytön perusperiaatteet.

Mallien käyttö sujuu seuraavien vaiheiden kautta:

  • Valmistele data.
  • Tuo malli.
  • Sovita malli dataan.
  • Arvioi mallin sopivuutta dataan.
  • Ennusta mallin avulla.

Valmistele data

Käytettävään dataan täytyy tutustua huolellisesti etukäteen. Erityisesti kannattaa kiinnittää huomiota seuraaviin:

  • Puuttuvat arvot: Useimmat mallit eivät siedä puuttuvia muuttujien arvoja. Puuttuvia arvoja sisältävät rivit pitää joka poistaa tai korvata puuttuvat arvot tarkoituksenmukaisella tavalla.

Ohjatun (supervised) oppimisen malleissa tarvitset kaksi dataframea:

  • Selittävien muuttujien arvot (feature-matriisi , x-muuttujat). Selittävien muuttujien dataframen nimeksi voit antaa esimerkiksi X.
  • Selitettävän/ennustettavan muuttujan arvot (target, labels, y-muuttuja). Selitettävän muuttujan dataframen nimeksi voit antaa esimerksi y.

Ohjaamattomissa (unsupervised) malleissa tarvitset ainoastaan feature-matriisin.

Tuo malli

Tuo malli sklearn-kirjastosta. Esimerkiksi lineaarisen regressiomallin tuot seuraavasti:

from sklearn.linear_model import LinearRegression

Sovita malli dataan

Sovita malli dataan fit-funktiolla ja tallenna syntyvä olio muuttujan arvoksi. Esimerkiksi seuraavassa sovitetaan lineaarinen regressio dataan X (selittävien muuttujien dataframe) ja y (ennustettavan muuttujan arvot).

malli = LinearRegression().fit(X, y)

Syntynyt olio (malli)  sisältää monenlaista tietoa mallista. Monissa netistä ja kirjallisuudesta löytyvissä esimerkeissä edellinen tehdään kahdessa vaiheessa:

malli = LinearRegression()
malli.fit(X, y)

Tuloksena syntynyt malli-olio on sama muodostettiinpa se kummalla tavalla tahansa.
Mallia voidaan tuunata erilaisilla lisäparametreilla. Mahdolliset lisäparametrit kirjoitetaan sulkujen sisään. Esimerkiksi seuraavassa muodostetaan lineaarinen regressiomalli, johon ei otetan mukaan lainkaan vakiotermiä (intercept).

malli = LinearRegression(fit_intercept = False).fit(X, y)

Mallien tuunaus lisäparametreilla edellyttää mallien hyvää tuntemusta.

Arvioi mallin sopivuutta

Sopivuuden arviointiin on monia menetelmiä. Voit esimerkiksi tulostaa selityskertoimen arvon komennolla malli.score(X, y). Selityskerroin ilmoittaa kuinka monta prosenttia selitettävän muuttujan vaihtelusta malli selittää.

Ennusta mallin avulla

Ennakoivassa analytiikassa keskeisin vaihe on tietenkin ennusteiden laskeminen uudelle datalle. Jos dataframe X_uusi sisältää uusia selittävän muuttujan arvoja, niin saat ennusteet komennolla:

malli.predict(X_uusi)

Lisätietoa

Lisätietoa koneoppimisen koodiesimerkeistä https://tilastoapu.wordpress.com/python/

Miksi Python?

Miksi vaivautua koodaamaan, koska datojen analysointiin sopivia valmisohjelmia (Excel, SPSS jne.) on olemassa? Seuraavassa muutamia Pythonin vahvuuksia:

  • Jos sinulla ei ole aiempaa kokemusta koodauksesta, niin opit samalla koodaamaan yhdellä suosituimmista ohjelmointikielistä.
  • Python on nopea ja toimii hyvin isojenkin datojen kanssa.
  • Perusasiat hoituvat helposti. Esimerkiksi komennolla data.describe() saat datan kaikkien muuttujien keskeisimmät tilastolliset tunnusluvut ja komennolla data.corr() saat datan muuttujien väliset korrelaatiot.
  • Kerran kirjoitettu koodi on aina suoritettavissa uudelleen. Voit analysoida rakenteeltaan samanlaisia datoja ilman koodin uudelleen kirjoittamista. Voit pienin muutoksin hyödyntää kerran kirjoitettua koodia uusien datojen kanssa.
  • Koodi toimii dokumentaationa tehdyistä analyyseistä. Voit milloin tahansa tehdä muutoksia koodiin ja suorittaa analyysit uudelleen.
  • Python tarjoaa monipuoliset mahdollisuudet tulosten graafiseen havainnollistamiseen.
  • Python on yleiskäyttöinen ohjelmointikieli ja sillä laskettuja tuloksia voit käyttää Pythonilla kirjoitetuissa ohjelmissa (esimerkiksi erilaiset tekoälysovellukset).
  • Ohjemateriaalia ja esimerkkejä löytyy helposti netistä. Jos kohtaat ongelman, niin kirjoittamalla Googleen englanninkielisen kysymyksen, löydät yleensä myös vastauksen (useimmiten stackoverflow-sivustolta).
  • Python toimii samalla tavoin Windows-, Linux– ja MacOS-käyttäjärjestelmissä.
  • Python on ilmainen.

Kuviot ja kaaviot Pythonilla

Päivitetty 6.5.2020

Kuvioiden ja kaavioiden peruskirjasto on matplotlib.pyplot. Vakiintuneen tavan mukaan käytän kirjastosta plt-lyhennettä:

import matplotlib.pyplot as plt
%matplotlib inline

Jupyteria käyttäessäni lisään rivin %matplotlib inline, jonka ansiosta laaditut kaaviot tulostuvat Jupyter-notebookiin ilman erillistä tulostuskomentoa (plt.show()).

Kaavioiden luomiseen ja muotoiluun on erilaisia tapoja. Tarkastelen seuraavassa kahta tapaa, jotka sopivat kaavioiden luomiseen pandas dataframesta. Ensimmäinen tapa on yksinkertaisempi, mutta toinenkin tapa kannattaa opetella.

Tapa1

Pystypylväskaavion (bar) voin luoda dataframesta df:

df.plot.bar()

Muita paljon käytettyjä kaaviolajeja ovat barh (vaakapylväs), pie (piirakka), hist (histogrammi), line (viiva), scatter (piste) ja box (ruutu- ja janakaavio).

Kaavion luonnin yhteydessä voin tehdä kaavioon liittyviä asetuksia lisäparametreilla, esimerkiksi:

  • legend arvoksi voin asettaa False tai ’reverse’. Oletusarvona on True. legend=’reverse’ kääntää selitteen arvojen järjestyksen.
  • width arvoksi voin asettaa luvun väliltä 0-1. Oletusarvona on 0.5. Mitä suurempi arvo, sitä lähempänä toisiaan ja sitä paksumpia pylväät ovat. Jos width=1, niin pylväät ovat kiinni toisissaan.
  • rot kääntää luokka-akselin jakoviivojen (ticks) nimiöt annetun asteluvun mukaan. Esimerkiksi rot=45 kääntää nimiöt 45 asteen kulmaan.
  • stacked=True luo pinotun pylväskaavion.
  • color määrittää pylväiden värin. Esimerkiksi color=’C0′ asettaa väriksi käytössä olevan väripaletin ensimmäisen värin. Voin käyttää värien nimiä tai koodeja (katso https://htmlcolorcodes.com/).
  • style määrittää viivakaavion viivan ja havaintopisteiden tyylin. Esimerkiksi style=’ro-’ tekee punaisen (r) viivan (), jossa havaintopisteet ovat ympyröitä (o). Lisätietoa https://matplotlib.org/3.1.0/api/_as_gen/matplotlib.axes.Axes.plot.html
  • edgecolor määrittää pylväiden reunan värin.

Lisätietoa ominaisuuksista, jotka voit asettaa lisäparametreilla:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.plot.html

Lisäparametrien lisäksi voin muotoilla kaaviota matplotlib.pyplot-funktioilla. Esimerkiksi plt.title(’Kaavion otsikko’). Funktiot kohdistuvat aina viimeksi luotuun kaavioon. Funktiot tarjoavat Matlab-matematiikkaohjelmiston käyttäjille tutun käyttöliittymän kaavioihin. Lisätietoa:

https://matplotlib.org/3.1.0/tutorials/introductory/pyplot.html

Esimerkeissäni en yleensä käytä matplotlib.pyplot-funktioita, vaan muotoilen kaaviot kaavion luonnin palauttaman olion kautta. Tätä varten sijoitan kaavion luonnin palauttaman olion muuttujan arvoksi:

ax = df.plot.bar()

Tämän Axes-luokan olion kautta pääsen käsiksi kaavion elementteihin, esimerkiksi:

  • ax.set_title(’Kaavion otsikko’)
  • ax.set_xlabel(’x-akselin otsikko’)
  • ax.set_ylabel(’y-akselin otsikko’)

Koodiesimerkeistäni löydät malleja useimmin tarvittavista muotoilu-komennoista. Lisätietoa Axes-luokan oliosta:

https://matplotlib.org/3.1.0/api/axes_api.html

Tapa 2

Toinen tapa kaavion luontiin vaatii hieman enemmän koodia (vertaa ax = df.plot.bar()):

fig, ax = plt.subplots()
df.plot.bar(ax = ax)

Tämän hankalamman tuntuisen tavan perusteluksi kannattaa perehtyä kaavion luonnin yhteydessä syntyviin olioihin.

Kaavio itsessään on Axes-luokan olio.

Kaavio sijoittuu aina kuvion sisään. Kuvio puolestaan on Figure-luokan olio. Jos kuvioon pitää viitata, niin kannattaa käyttää kaavion luontiin plt.subplots()-funktiota, joka palauttaa sekä kuvion että ”tyhjän” kaavion. plt.subplots()-funktion palauttaman kuvion ja kaavion sijoitan muuttujien arvoiksi (esimerkiksi fig, ax = plt.subplots()).

Kaavion sisällön määritän plot-funktiolla. Lisäparametrilla ax kerron, minkä nimiseen Axes-luokan olioon kaavio piirretään (esimerkiksi df.plt.bar(ax = ax)) .

Oliohierarkian hahmottamista auttaa oheinen osoitteesta https://realpython.com/python-matplotlib-guide/ lainattu havainnollistus:

matplotlib1

Uloimpana on kuvio (Figure) ja sen sisällä kaavio (Axes). Kaavion sisällä on useita olioita, esimerkiksi kaavion otsikko, akselit, akselien otsikot, jne.

Ensimmäinen, yksinkertaisempi tapa kaavion luontiin, tuottaa saman olioiden hierarkian, mutta ei palauta Figure-luokan olioita siten että voisin sijoittaa sen suoraan muuttujan arvoksi. Saan tosin selville Figure-luokan olion jälkikäteen funktiolla plt.gcf(). Figure-luokan olioita tarvitsen ainakin seuraavissa tilanteissa:

  • Kuvion tallentaminen: jos haluan tallentaa kaavion, niin minun pitää tallentaa kuvio.
  • Useita kaavioita samassa kuviossa: voin sijoittaa saman kuvion sisään useita kaavioita vierekkäin ja allekkain.

Seuraavaksi

Pääset hyvään alkuun tutustumalla esimerkkikokoelmani koodeihin:

https://nbviewer.jupyter.org/github/taanila/kaaviot/tree/master/

Samalla kannattaa alkaa kokeilla omien kaavioiden luomista ja muotoilua.

Perusasiat ja useimmin tarvitut muotoilukomennot oppii nopeasti ulkoa, mutta harvemmin tarvittavia temppuja voi selvitellä googlaamalla. Hämmennystä aiheuttaa netistä löytyvien esimerkkien moninaisuus ja vaihtelevat käytännöt. Monissa koodeissa käytetään sekaisin Axes-olion kautta tehtyjä muotoiluja ja matplotlib.pyplot-funktioilla tehtyjä muotoiluja. Kaavioiden luonnissa käytetään tässä esitettyjen tapojen lisäksi myös kaavion luomista suoraan Axes-olioon (ax.bar()).

Artikkelista jupyter: taulukot ja kaaviot raporttiin selviää, miten tallennat ja siirrät kaavioita raporttiin.

Data-analytiikka Pythonilla

Päivitetty 15.11.2019.

Data-analytiikka antaa vastauksia kysymyksiin

Data-analytiikka on tavoitteellista toimintaa: tavoitteena on vastata kysymyksiin. Data-analytiikan avulla vastataan monenlaisiin kysymyksiin:

  • Minkälainen ikäjakauma asiakkaillamme on?
  • Mihin toimintamme osa-alueisiin asiakkaamme ovat tyytymättömiä?
  • Onko asiakkaan iällä yhteyttä asiakastyytyväisyyteen?
  • Miten yrityksen työilmapiiri on muuttunut viimevuodesta?
  • Ketkä asiakkaistamme ovat vaarassa siirtyä kilpailijalle?
  • Keille tuotteen markkinointikampanja kannattaa suunnata?
  • Mikä mainosvaihtoehdoista tehoaa parhaiten kohderyhmään?
  • Mitä oheistuotteita verkkokaupasta ostaneella kannattaa tarjota?
  • Mikä on tuotteen ennustettu kysyntä ensi kuussa?
  • Liittyykö vakuutuskorvaushakemukseen vakuutuspetos?
  • Millä todennäköisyydellä laina-asiakas ei pysty maksamaan lainaansa takaisin?

Data

Tavoitteiden (kysymykset, joihin halutaan vastata) asettamisen jälkeen pitää selvittää minkälaista dataa tarvitaan. Data voi olla esimerkiksi:

  • Yrityksen tietokannoista löytyvää dataa (esimerkiksi CRM- ja ERP-järjestelmistä).
  • Erilaisten tiedontuottajien tarjoamaa ilmaista tai maksullista dataa.
  • Varta vasten kyselytutkimuksella tai kokeellisella tutkimuksella kerättyä dataa.
  • Erilaisten sensorien/mittalaitteiden mittaamaa dataa.

Blogissani rajoitun rakenteelliseen eli strukturoituun dataan. Rakenteellinen data on sellaista, joka voidaan tallentaa taulukkomuotoon. Yleisiä data-analytiikkaan sopivia tiedostomuotoja ovat pilkkueroteltu tekstimuoto (.csv) ja Excel-muoto (.xls tai .xlsx). Tietokannoista data haetaan kyselyiden (sql kyselykieli) avulla. Nettikyselyohjelmista datan saa yleensä ulos pilkkuerotellussa tekstimuodossa tai Excel-muodossa.

Kun sopiva data on olemassa, niin datasta saadaan vastauksia kysymyksiin seuraavien vaiheiden kautta:

  • Datan valmistelu
  • Kuvaileva analytiikka
  • Selittävä analytiikka; selittävään analytiikkaan liittyy usein tilastollisen merkitsevyyden testaaminen: tilastollinen merkitsevyys kertoo, millä varmuudella otoksessa havaittuja eroja ja riippuvuuksia voidaan yleistää isompaan perusjoukkoon, josta otos on otettu.
  • Ennakoiva analytiikka; tämä tarkoittaa yleensä koneoppimisen mallien hyödyntämistä.

Datan valmistelu

Datan valmistelulla tarkoitan datojen yhdistelyä, dataan tutustumista, datan siivoamista ja datan muunnoksia.

Datan valmistelu voi olla data-analytiikan aikaa vievin vaihe. Ensimmäiseksi kannattaa varmistaa datan taulukkomuotoisuus: muuttujien nimet / kenttien nimet / sarakeotsikot ovat ensimmäisellä rivillä, datassa ei ole tarpeettomia tyhjiä rivejä tai sarakkeita, kuhunkin tilastoyksikköön/havaintoyksikköön liittyvät tiedot ovat yhdellä rivillä. Datan valmistelu voi sisältää muiden muassa seuraavia:

  • Eri lähteistä peräisin olevien datojen yhdistely.
  • Muuttujien uudelleen nimeäminen: jatkotoimet sujuvat sutjakkaammin, jos nimet ovat lyhyitä ja helposti tunnistettavia.
  • Desimaalipilkkujen tarkistaminen: vaikka Suomessa desimaalipilkkuna käytetään pilkkua, niin Pythonissa täytyy käyttää pistettä.
  • Päivämäärien muuntaminen päivämääriksi tunnistettavaan muotoon.
  • Mittayksiköiden tarkistaminen ja tarvittavien muunnosten tekeminen.
  • Puuttuvien arvojen käsittely: poistetaanko puuttuvia arvoja sisältävät rivit, korvataanko puuttuvat arvot jollain, miten puuttuvia arvoja merkitään?
  • Uusien muuttujien laskeminen: esimerkiksi summamuuttuja useasta mielipidemuuttujasta, tilauksen hinta tilausmäärän ja yksikköhinnan avulla jne.
  • Arvojen luokittelu ja uudelleenkoodaaminen: esimerkiksi ikäluokat iän arvoista.

Kuvaileva analytiikka

Datan kuvailu voi sisältää seuraavia:

  • Lukumäärä- ja prosenttiyhteenvetojen laskeminen (frekvenssitaulukot).
  • Tilastollisten tunnuslukujen laskeminen (keskiarvo, keskihajonta, viiden luvun yhteenveto).
  • Prosenttimuutosten laskeminen aikasarjoille.
  • Aikasarjojen tarkastelu viivakaavioina.
  • Liukuvien keskiarvojen esittäminen aikasarjojen yhteydessä.

Kuvailun tuloksia kannattaa visualisoida ja havainnollistaa hyvin viimeistellyillä taulukoilla ja kaavioilla.

Selittävä analytiikka ja tilastollinen merkitsevyys

Selittävä analytiikka voi sisältää seuraavia:

  • Tilastollisten tunnuslukujen vertailua eri ryhmissä.
  • Kategoristen muuttujien riippuvuuden tarkastelua ristiintaulukoimalla.
  • Määrällisten muuttujien välisten korrelaatioiden tarkastelua.
  • Havaittujen erojen ja riippuvuuksien tilastollisen merkitsevyyden tarkastelua.

Jos käytetty data on otos isommasta perusjoukosta, niin tulokset kuvaavat otosta. Jos tarkoituksena on arvioida koko perusjoukkoa, niin otoksessa havaittujen erojen ja riippuvuuksien tilastollinen merkitsevyys kertoo, millä varmuudella eroja ja riippuvuuksia voidaan yleistää otoksesta perusjoukkoon.

Ennakoiva analytiikka ja koneoppiminen

Koneoppimisen malleilla voidaan luokitella (asiakkaat luottoriski-asiakkaisiin ja muihin, vakuutuskorvaushakemukset selviin tapauksiin ja petokselta haiskahtaviin, sähköpostiviestit roskapostiin ja kunnollisiin viesteihin jne.) ja ennakoida määrällisen muuttujan arvoja (käytetyn auton hinta, tuleva kysyntä jne.). Koneoppiminen perustuu siihen, että kone oppii käytettävän mallin parametrit olemassa olevasta datasta ja tämän jälkeen mallia voidaan soveltaa uuteen dataan.

Koneoppimisalgoritmit voidaan luokitella  seuraavasti (suomennokset eivät ole vakiintuneita):

  • Supervised learning (ohjattu oppiminen): Algoritmi opetetaan opetusdatalla (training data). Esimerkiksi roskapostisuodatin opetetaan sähköpostidatalla, jossa on erilaisia tietoja kustakin sähköpostiviestistä sekä tieto siitä oliko sähköpostiviesti roskapostia. Tämän datan perusteella muodostuu malli, jota käyttäen tulevista sähköpostiviesteistä voidaan tunnistaa roskapostiviestit.
  • Unsupervised learning (ohjaamaton oppiminen): Esimerkiksi asiakkaiden jakaminen asiakassegmentteihin.
  • Reinforcement learning (vahvistusoppiminen): Algoritmi suorittaa toimia ja saa niistä palautetta palkkioiden ja rangaistuksen muodoissa. Algoritmi oppii saamistaan palkkioista ja rangaistuksista. Vahvistettua oppimista käytetään esimerkiksi robotiikassa.

Seuraavassa jaotellaan ohjattu ja ohjaamaton oppiminen edelleen alatyyppeihin:

kone1

Ohjattu oppiminen

Label tarkoittaa ennakoitavaa asiaa (selitettävää muuttujaa).

Diskreetti label

Jos ennakoitava asia on diskreetti (epäjatkuva), niin kyseeseen tulevat luokittelua suorittavat algoritmit, esimerkiksi logistinen regressio tai päätöspuut.

Esimerkkejä, joissa on diskreetti label:

  • Roskapostisuodatin: Label on tieto siitä, onko sähköpostiviesti roskapostia vai ei?
  • Lääketieteellinen diagnoosi: Label on tieto siitä, onko tutkitulla potilaalla tietty sairaus vai ei?
  • Vakuutuspetosten tunnistaminen: Label on tieto siitä, liittyykö korvaushakemukseen petos vai ei?

Jatkuva label

Jos ennakoitava asia on jatkuva, niin kyseeseen tulevat regressiomallit ja aikasarjaennustamisen menetelmät. Esimerkkejä, joissa on jatkuva label:

  • Vanhan osakehuoneiston hinnan arviointi: Label on asunnon hinta.
  • Kysynnän ennustaminen aikaisemman kysynnän perusteella: Label on kysyntä.

Ohjaamaton oppiminen

Ohjaamattomassa oppimisessa ei ole labelia (selitettävää/ennakoitavaa muuttujaa). Ohjaamattoman oppimisen algoritmi muodostaa mallin suoraan datasta. Esimerkkinä asiakassegmenttien määrittäminen asiakasdatan pohjalta. Paljon käytetty algoritmi on k-means clustering.

Jos datassa on paljon muuttujia, jotka mittaavat osittain samoja asioita, niin dimensionality reduction -tyyppisillä algoritmeilla voidaan pienentää muuttujien määrää yhdistämällä niitä kimpuiksi. Tunnetuin algoritmi tähän tarkoitukseen on pääkomponenttianalyysi.

Data-analytiikkaa Pythonilla

Jos aiot käyttää Pythonia data-analytiikassa, niin aloita asentamalla Anaconda.

 

Kuviot Pythonilla 3

Kategoristen muuttujien jakauman esitetän lukumäärä- tai prosenttipylväitä käyttäen. Näistä voit lukea lisää Kuviot Pythonilla 1 ja Kuviot Pythonilla 2. Tässä artikkelissa esitän esimerkkejä määrällisen muuttujien kuvaamisesta. Tämän artikkelin ohjelmakoodin ja tulosteet löydät GitHubista:

https://github.com/taanila/tilastoapu/blob/master/kuviot3.ipynb

Jos kopioit koodia itsellesi, niin kannattaa käyttää GitHubia. Tästä artikkelista kopioidut koodit eivät välttämättä toimi oikein.

Oletan, että lukijalla on asennettuna Anaconda ja sen mukana tuleva Jupyter notebook.

Ensimmäiseksi minun täytyy ottaa käyttöön tämän artikkelin kuvioissa tarvittavat kirjastot:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.style.use('seaborn-white')

Tyylin ’seaborn-white’ sijasta voit käyttää sinulle mieluista tyyliä.

Avaan seaborn-kirjastoon sisältyvän esimerkkiaineiston tips (tietoja ravintola-asiakkaiden ravintolakäynneistä):

tips = sns.load_dataset('tips')
tips.head()

tips

Histogrammi

Ensimmäiseksi kuvaan ravintola-asiakkaiden laskujen loppusumman jakauman histogrammina:

ax=tips['total_bill'].plot.hist(bins=5)
ax.set_xlabel('total_bill')

hist1

Lisämääre bins=5 määrittää luokkien (histogrammin pylväiden) lukumäärän.

Voin myös itse määrittää luokkarajat:

ax=tips['total_bill'].plot.hist(bins=[0,10,20,30,40,50,60], 
   edgecolor='white')
ax.set_xlabel('total_bill')

hist2

Antamani luokkarajat tuottavat luokat [0,10), [10,20), [20,30), [30,40), [40,50) ja [50,60]. Luokan alaraja siis sisältyy aina luokkaan, mutta luokan yläraja ei sisälly luokkaan viimeistä luokkaa lukuun ottamatta.

Lisämääre edgecolor=’white’ lisää pylväille valkoisen reunan.

Seuraavaksi kuvaan palvelurahan määrän jakaumaa. Jos haluan esittää histogrammissa lukumäärien sijasta prosentit, niin voin käyttää esimerkiksi seuraavaa esoteerisen näköistä koodia:

weights=np.ones_like(tips['tip'])/float(len(tips['tip']))
ax=tips['tip'].plot.hist(bins=[0,2,4,6,8,10], weights=weights, 
   edgecolor='white')
ax.set_xlabel('tip')
ax.set_ylabel('%')
vals = ax.get_yticks()
ax.set_yticklabels(['{:.0f} %'.format(y*100) for y in vals])

hist3

weights vaatinee selitystä:

Otin edellä käyttöön numpy-kirjaston (import numpy as np). Numpy (numerical python) on peruskirjasto numeerisen tiedon käsittelyyn. Tässä käytän np.ones_like toimintoa, joka korvaa kunkin ravintola-asiakkaan palvelurahan ykkösellä. Jakamalla ykkösen palvelurahaa maksaneiden lukumäärällä (float(len(tips[’tip’]) saan selville prosenttiosuuden kaikista palvelurahaa maksaneista. Kaikkiaan weights=np.ones_like(tips[’tip’])/float(len(tips[’tip’])) muodostaa sarjan prosenttiosuuksia, joilla voin painottaa histogrammin lukumääriä ja näin lopulta saan histogrammiin prosentit.

Todennäköisyysjakauman estimointi

Voin edetä histogrammista taustalla olevan todennäköisyysjakauman tiheysfunktion estimointiin käyttämällä seaborn-kirjaston distplot-toimintoa:

sns.distplot(a=tips['tip'].dropna(), bins=[0,2,4,6,8,10])

distplot1

distplot antaa virheilmoituksen puuttuvista arvoista. Tämän vuoksi poistan dropna()-funktiolla mahdollisia puuttuvia arvoja sisältävät rivit. Kuvion pystyakselin arvot ovat todennäköisyysjakauman tiheysfunktion arvoja. Todennäköisyysjakauma estimoidaan ei-parametrisella KDE-menetelmällä (kernel density estimation). Voit lukea Wikipediasta lisää KDE-menetelmästä https://en.wikipedia.org/wiki/Kernel_density_estimation

Lisämääreellä kde=False voin laatia pelkän histogrammin:

sns.distplot(a=tips['tip'].dropna(), bins=[0,2,4,6,8,10], 
   kde=False, rug=True)

distplot2

Luokkien lukumäärien lisäksi voin tarkastella arvojen jakaumia luokkien sisällä alareunan viivoista. Nämä tulivat kuvioon lisämääreen rug=True ansiosta.

Ruutu- ja janakaavio

Ruutu- ja janakaavio on tehokas tapa määrällisen muuttujan jakauman tarkasteluun kategorisen muuttujan määräämissä luokissa. Voin esimerkiksi tarkstella palvelurahan suuruutta eri kokoisten seurueiden kohdalla:

ax=tips.boxplot(column='tip', by='size')
ax.set_title('')
plt.suptitle('')
ax.set_ylabel('tip')

box1

Ruutu- ja janakaavio vaatii lähtötietoinaan kuvattavan muuttujan (column) ja luokittelevan muuttujan (by). Jos ruutu- ja janakaavio ei ole sinulle entuudestaan tuttu, niin lue lisää artikkelistani Ruutu- ja janakaavio.

Voin laatia ruutu- ja janakaavion kätevämmin seaborn-kirjaston avulla. Esimerkiksi palvelurahat seurueen koon mukaan luokiteltuna sukupuolittain:

sns.boxplot(x='size', y='tip', hue='sex', data=tips)

box2

Pairplot

Kahden muuttujan välisiä riippuvuuksia voin tarkatella seaborn-kirjaston pairplot-kuviona.

Käytän esimerkkinä aineistoa, jossa on eri aiheiden osaamista/lahjakkuutta kuvaavia pistemääriä ja arvosanoja sekä opintomenestystä kuvaava pistemäärä.

opintomenestys = pd.read_excel('http://taanila.fi/
   opintomenestys.xlsx')
opintomenestys.head()

opintomenestys
Voin laatia kaikki parittaiset hajontakuviot useammasta muuttujasta:

sns.pairplot(opintomenestys[['verbaalinen','looginen','kielet',
   'matematiikka','opintomenestys']], kind='reg')

pairplot1

Yllä on näkyvillä vain osa kuvioista. Tuloksena saan jokaisesta muuttujasta histogrammin ja kaikki parittaiset hajontakaaviot pienimmän neliösumman regressiosuoralla täydennettynä. Voin tarkastella asiaa myös sukupuolittain:

sns.pairplot(opintomenestys[['verbaalinen','looginen','kielet',
   'matematiikka','opintomenestys','sukupuoli']], 
   hue='sukupuoli', kind='reg')

pairplot2

Histogrammien sijasta saan KDE-menetelmällä estimoidut todennäköisyysjakaumat miehille (oranssi) ja naisille (sininen). Jos haluan histogrammit, niin voin käyttää lisäparametria diag_kind=’hist’.

Jointplot

Yksittäisen muuttujaparin hajontakuvion saan kätevimmin seaborn-kirjaston jointplot-toiminnolla:

sns.jointplot(x='kielet', y='opintomenestys', data=opintomenestys, 
   kind='reg')

jointplot1

Kuvion reunoilla on muuttujien histogrammit sekä KDE-menetelmällä estimoidut todennäköisyysjakumat.

Tarvittaessa voin laskea kuvioon korrelaatiokertoimen ja sen merkitsevyyttä mittaavan p-arvon. Korrelaatiokertoimen laskemiseen tarvittavat funktiot löytyvät scipy.stats-kirjastosta. Pearsonin korrelaatiokerroin löytyy pearsonr-nimellä ja Spearmanin järjestyskorrelaatiokerroin spearmanr-nimellä.

from scipy.stats import spearmanr
sns.jointplot(x='matematiikka', y='opintomenestys', data=opintomenestys, 
   kind='reg', stat_func=spearmanr)

jointplot2

Aikasarjaennustaminen 3

Päivitetty 22.12.2019

Tämä artikkeli on jatkoa artikkeleille Aikasarjaennustaminen 1 ja Aikasarjaennustaminen 2.

Edellisen artikkelin Aikasarjaennustaminen 2 lopussa totesin, että esimerkkinä käyttämässäni aikasarjassa on neljän vuosineljänneksen välein toistuvaa kausivaihtelua, joka on syytä huomioida ennustamisessa. Tässä artikkelissa tarkastelen kausivaihtelun huomioivaa Holt-Winterin menetelmää.

Holt-Winterin tulomallissa aikasarjan tason L (level) hetkellä t määrittää lauseke

Lt = alfa * Yt/St-s + (1 – alfa)(Lt-1 + Tt-1)

Yllä Yt on viimeisin havainto, St-s on edellisen vastaavan periodin kausivaihtelu ja  Tt-1 on edellinen trendi.

Trendille T hetkellä t saadaan arvio lausekkeesta

Tt = beta * (Lt – Lt-1) + (1 – beta) * Tt-1

Kausivaihtelulle S hetkellä t saadaan arvio lausekkeesta

St = gamma * Yt/Lt + (1 – gamma) * St-s

Ennuste hetkelle t + p saadaan

(Lt + pTt)St-s

Yllä on kyse Holt-Winterin tulomallista, jossa kausivaihtelu huomioidaan kausivaihtelukertoimena. Holt-Winterin mallia voidaan soveltaa myös summamallina, jolloin kausivaihtelu huomioidaan lisättävänä kausivaihteluterminä. Tulomalli soveltuu paremmin tilanteisiin, joissa kausivaihtelukomponentin suuruus vaihtelee aikasarjan tason L mukaan. Summamalli soveltuu tilanteisiin, joissa kausivaihtelukomponentin suuruus ei riipu aikasarjan tasosta L.

Mallin parametrit alfa, beta ja gamma pyritään määrittämään siten että ennustevirheiden neliöiden keskiarvo saadaan mahdollisimman pieneksi.

Python toteutus

Tämän artikkelin ohjelmakoodin ja tulosteet löydät GitHubista:

https://nbviewer.jupyter.org/github/taanila/tilastoapu/blob/master/forecast3.ipynb