Aihearkisto: Muut

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

 

 

 

 

 

Koneoppimisen käsitteitä

Data-analytiikan tasot

Data-analytiikka voidaan jakaa neljään tasoon seuraavasti:

dataportaat

Kahdella alimmalla tasolla selvitään yleensä kuvailevilla menetelmillä ja tilastollisten merkitsevyyksien laskemisella. Kahdella ylimmällä tasolla tarvitaan koneoppimisen malleja.

Koneoppimisen menetelmien jaottelu

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

Ohjatussa oppimisessa:

  • Kone muodostaa (oppii) mallin opetusdatan (training set) avulla.
  • Opetusdata koostuu selittävistä muuttujista (feature matrix) ja selitettävästä eli ennustettavasta muuttujasta (target).
  • Opetusdatassa ennustettavan muuttujan arvot (labels) ovat tiedossa.
  • Opitun mallin avulla kone osaa ennustaa ennustettavan muuttujan arvoja (labels) uudelle datalle.

ohjattu1

Ohjatun oppisen prosessi etenee seuraavan kaavion mukaisesti:

ohjattu2

Ohjattua oppimista, jossa ennustettava muuttuja on kategorinen (discrete label) käytetään esimerkiksi seuraavissa:

  • Roskapostisuodatin
  • Sairauden diagnosointi
  • Maksuhäiriön ennakointi
  • Vakuutuspetoksen tunnistaminen
  • Auton rekisterinumeron koneellinen lukeminen
  • Esineiden tunnistaminen valokuvasta

Tällaisissa tilanteissa kyse on luokittelusta (classification) ja käytettäviä malleja ovat esimerkiksi:

  • Naiivi Bayes
  • Logistinen regressio
  • Päätöspuut (decision trees)
  • K lähintä naapuria (K nearest neighbor)

Käytännössä lineaarisesti erotettavissa olevat luokat ovat helpompia erotella:

luokittelu1

Ohjattua oppimista, jossa ennustettava muuttuja on määrällinen (continuous label) käytetään esimerkiksi seuraavissa:

  • Kysynnän ennustaminen
  • Asunnon hinta
  • Käytetyn auton hinta

Tällaisissa tilanteissa käytetään eniten erilaisia regressiomalleja, esimerkiksi lineaarista regressiota.

regressio1.PNG

Ohjaamaton oppiminen

Ohjaamatonta oppimista voidaan käyttää esimerkiksi asiakassegmenttien muodostamiseen. Ohjaamattomassa oppimisessa on käytössä ainoastaan selittävät muuttujat (feature matrix).

ohjaamaton1.PNG

Käytetyin menetelmä on K-means klusterointi, missä K viittaa muodostettavien klusterien lukumäärään, joka tässä mentelmässä päätetään etukäteen.

Datan yksinkertaistamiseen, havainnollistamiseen ja taustalla olevien rakenteiden tunnistamiseen voidaan käyttää pääkomponenttianalyysia (Principal component analysis). Tällä menetelmällä selittävistä muuttujista (feature matrix) muodostetaan laskennallisesti pienempi joukko muuttujia.  Seuraavissa kuvioissa on pelkistetty alkuperäinen kolmen muuttujan asetelma kahden muuttujan asetelmaksi.

ohjaamaton2

Pääkomponenttianalyysillä voidaan esimerkiksi eri oppiaineissa menestymisen takaa tunnistaa erilaisia lahjakkuuksia (verbaalinen, matemaattinen jne.).

Merkitsevyyden testaus Pythonilla

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

https://github.com/taanila/tilastoapu/blob/master/p.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.

Otoksessa havaitsemieni erojen ja riippuvuuksien tilastollista merkitsevyyttä voin arvioida laskemalla p-arvon. Pythonin scipy.stats-ohjelmakirjastosta löydän funktiot p-arvojen laskentaan.

Otan ensiksi käyttöön pandas ja scipy.stats -ohjelmakirjastot ja avaan esimerkkinä käyttämäni aineiston:

import pandas as pd
import scipy.stats as stats

df = pd.read_excel('http://taanila.fi/data1.xlsx', 
   sheet_name = 'Data')
df.head()

Korrelaatiokertoimen testaus

Iän ja palkan välisen pearsonin korrelaatiokertoimen ja siihen liittyvän 2-suuntaisen p-arvon saan funktiolla

stats.pearsonr(df['ikä'], df['palkka'])

Jos haluankin käyttää spearmanin järjestyskorrelaatiota, niin saan korrelaatiokertoimen ja 2-suuntaisen p-arvon funktiolla

stats.spearmanr(df['ikä'], df['palkka'])

Korrelaatiokertoimen testaamiseen liittyvistä funktioista löydät lisätietoa scipy.org -sivustolta:

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.pearsonr.html#scipy.stats.pearsonr

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.spearmanr.html

Ristiintaulukointi ja khiin neliö -testi

Esimerkiksi sukupuolen ja perhesuhteen väliseen ristiintaulukointiin liittyvän khiin neliö -testin testimuuttujan, p-arvon, vapausasteiden määrän ja odotetut frekvenssit saan funktiolla:

stats.chi2_contingency(pd.crosstab(df['sukup'], 
   df['perhe']))

Lisätietoa khiin neliö -testistä ja sen edeltävyysehdoista löydät scipy.org-sivustolta:

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.chi2_contingency.html#scipy.stats.chi2_contingency

Kahden riippumattoman otoksen t-testi

Jos haluan selvittää, onko miesten ja naisten palkkakeskiarvoissa eroa, niin erotan ensin miesten ja naisten palkat toisistaan (aineistossa 1=mies, 2=nainen)

a=df['palkka'][df['sukup']==1] #Mies
 b=df['palkka'][df['sukup']==2] #Nainen

Tämän jälkeen lasken t-testimuuttujan ja 2-suuntaisen p-arvon funktiolla

stats.ttest_ind(a, b, equal_var=False)

Yllä käytin erisuurten varianssien testiä (equal_var=False).

Lisätietoa riippumattomien otosten t-testistä ja sen edeltävyysehdoista löydät scipy.org-sivustolta:

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.ttest_ind.html

Mann Whitney U -testi

Jos epäilen t-testin edeltävyysehtojen toteutumista, niin voin testata edellisen esimerkin Mann Whitney U-testillä:

stats.mannwhitneyu(a,b)

Tuloksena saan U-testimuuttujan ja p-arvon. Oletuksena saan 2-suuntaisen p-arvon puolikkaan. Lisätietoa löydät scipy.org-sivustolta:

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.mannwhitneyu.html

Yksisuuntainen varianssianalyysi

Jos haluan selvittää onko eri koulutuksen omaavien keskipalkoissa eroja, niin voin käyttää yksisuuntaista varianssianalyysiä (anova).  Ensiksi erotan eri koulutuksen omaavien palkat toisistaan:

k1=df['palkka'][df['koulutus']==1] #peruskoulu
k2=df['palkka'][df['koulutus']==2] #2. aste
k3=df['palkka'][df['koulutus']==3] #korkeakoulu
k4=df['palkka'][df['koulutus']==4] #ylempi korkeakoulu

Tämän jälkeen lasken anovan F-testimuuttujan ja p-arvon funktiolla:

stats.f_oneway(k1,k2,k3,k4)

Lisätietoa anovasta ja sen edeltävyysehdoista löydät scipy.org-sivustolta:

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.f_oneway.html#scipy.stats.f_oneway

Kruskal-Wallis -testi

Jos epäilet varianssianalyysin edeltävyysehtojen  täyttymistä edellisessä esimerkissä, niin voit käyttää varianssianalyysin sijasta Kruskal-Wallis -testiä:

stats.kruskal(k1, k2, k3, k4)

Tuloksena saat H-testimuuttujan ja p-arvon.

Lisätietoa Kruskal-Wallis-testistä löydät scipy.org-sivustolta:

https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.kruskal.html#scipy.stats.kruskal

Muita testejä

Lisää merkitsevyystestejä ja muita tilastollisia funktioita löydät scipy.org-sivustolta:

https://docs.scipy.org/doc/scipy/reference/stats.html