Datan pika-analyysi Pythonilla

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

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

Muuttujatyypit

Voin jakaa analysoitavat muuttujat esimerkiksi seuraavasti:

  • Kategoriset: Näille voin laskea lukumäärä- ja prosenttiyhteenvetoja (frekvenssitaulukot ja ristiintaulukoinnit).
  • Mielipideasteikolliset: Näille voin laskea samat kuin kategorisillekin. Tietyin varauksin voin laskea myös tilastollisia tunnuslukuja kuten keskiarvon ja keskihajonnan.
  • Määrälliset eli kvantitatiiviset: Näille voin laskea tilastollisia tunnuslukuja ja muuttujien välistä riippuvuutta kuvaavat korrelaatiokertoimet.

Pythonilla on suhteellisen helppoa kirjoittaa koodi, joka laskee kategorisille ja mielipideasteikoille frekvenssitaulukot ja kaikki mahdolliset ristiintaulukoinnit sekä määrällisille tunnusluvut ja korrelaatiot, myös kategroristen muuttujien määräämissä ryhmissä.

Frekvenssitaulukot

Laskentaa varten kategoriset, mielipideasteikolliset ja määrälliset muuttujat on määriteltävä. Koodissa tämän voi tehdä seuraavaan tapaan:

kategoriset=['sukup','perhe','koulutus']
mielipiteet=['johto', 'työtov', 'työymp', 'palkkat', 'työteht']
kvantit=['ikä','palveluv','palkka']

Laskettavat tulokset on hyvä tallentaa jonnekin. Voin tallentaa tulokset .csv-muotoiseen tiedostoon, jonka voin myöhemmin avata Exceliin. Uuden tiedoston voin luoda komennolla

f=open('example1.csv', 'a')

Jos en laita tiedoston nimen eteen polkua, niin tiedosto tallentuu siihen kansioon, johon koodikin on tallennettu. Muista huolehtia ettei kansiossa ole entuudestaan saman nimistä tiedostoa! Lisäargumentti ’a’ tarkoittaa tiedoston avaamista uuden tiedon lisäämistä varten.

Kategoristen muuttujien frekvenssitaulukot voin laskea ja kirjoittaa tiedostoon seuraavasti (df viittaa dataframeen, jossa on analysoitava aineisto):

if kategoriset:
   for var in kategoriset:
      df1=pd.crosstab(df[var],'lkm')
      df1['prosenttia'] = df1/df1.sum()
      df1.loc['Yhteensä'] = df1.sum()
      df1.to_csv(f, sep=';', decimal=',')
      f.write('\n')

if kategoriset: testaa onko kategorisia muuttujia mukana. Jos kategoristen muuttujien lista on tyhjä, niin frekvenssitaulukoita ei lasketa.

for var in kategoriset: Aloittaa silmukan, joka toistaa seuraavat koodirivit kaikille kategorisille muuttujille.

df1=pd.crosstab(df[var],’lkm’) laskee frekvenssitaulukon.

df1[’prosenttia’] = df1/df1.sum() luo frekvenssitaulukkoon uuden sarakkeen ja laskee siihen prosentit.

df1.loc[’Yhteensä’] = df1.sum() lisää frekvenssitaulukon alareunaan summarivin.

df1.to_csv(f, sep=’;’, decimal=’,’) tallentaa frekvenssitaulun tiedostoon. Suomessa kannattaa käyttää erottimena puolipistettä ja desimaalierottimena pilkkua, jotta tiedot aukenevat ilman desimaalipilkkuun liittyviä ongelmia.

f.write(’\n’) kirjoittaa tiedostoon tyhjän rivin.

Muista, että Pythonissa osoitetaan sisennyksellä if-rakenteeseen liittyvä koodi samoin kuin for-rakenteeseen liittyvä koodi. Mitään erillistä päättymiskomentoa ei if-  tai for-rakenteelle tarvita, vaan rakenteen päättyminen osoitetaan sisennyksen päättymisellä.

Mielipideasteikollisille muuttujille voin laskea frekvenssitaulukot samanlaisella koodilla kuin kategorisillekin.

Ristiintaulukoinnit

Kaikki mahdolliset kategoristen muuttujien väliset ristiintaulukoinnit voin laskea seuraavasti:

if kategoriset:
   for var1 in kategoriset:
      for var2 in kategoriset:
         if var1!=var2:
            df1=pd.crosstab(df[var2],df[var1])
            df1.loc['Yhteensä']=df1.sum()
            df2=pd.crosstab(df[var2],df[var1],normalize='columns')
            df2.index.name=var2+'/'+var1
            df2.loc['Yhteensä']=df2.sum()
            df2.loc['n']=df1.loc['Yhteensä']
            df2.to_csv(f, sep=';', decimal=',')
            f.write('\n')

Kaikkien mahdollisten muuttujaparien läpikäymiseen tarvitsen kaksi sisäkkäistä for-silmukkaa. Lisäksi varmistan if-rakenteella, että muuttujaa ei ristiintaulukoida itsensä kanssa.

df1=pd.crosstab(df[var2],df[var1]) laskee ristiintaulukoinnin lukumäärinä.

df1.loc[’Yhteensä’]=df1.sum() lisää ristiintaulukoinnin alareunaan summarivin.

df2=pd.crosstab(df[var2],df[var1],normalize=’columns’) laskee ristiintaulukoinnin, jossa esitetään sarakeprosentit.

df2.index.name=var2+’/’+var1 lisää muuttujien nimet toisen ristiintaulukoinnin vasempaan yläkulmaan.

df2.loc[’Yhteensä’]=df1.sum() lisää toisen ristiintaulukoinnin alareunaan summarivin.

df2.loc[’n’]=df1.loc[’Yhteensä’] lisää ristiintaulukoinnin alareunaan ylimääräisen rivin n-arvoja varten (mistä lukumääristä prosentit on laskettu). n-arvot haetaan ensimmäisen ristiintaulukoinnin summa-riviltä.

Lopuksi toinen ristiintaulukointi kirjoitetaan tiedostoon samalla tavalla kuin frekvenssitaulukotkin.

Kategoristen ja mielipideasteikollisten väliset ristiintaulukoinnit voin laskea samanlaisella koodilla kuin kategoristen väliset ristiintaulukoinnit.

Tunnusluvut

Tunnusluvut lasken describe()-funktiolla. Tiedostoon kirjoittamisen yhteydessä käännän tunnuslukutaulukon (vaihdan rivit ja sarakkeet) transpose()-funktiolla, jotta saan mielestäni helppolukuisemman taulukon.

if mielipiteet:
   df1=df[mielipiteet].describe()
   df1.transpose().to_csv(f, sep=';', decimal=',')
   f.write('\n')

Tunnusluvut kategoristen muuttujien määräämissä ryhmissä lasken kahta sisäkkäistä for-silmukkaa hyödyntäen. Taustamuuttujan mukaisiin ryhmiin jakamisen hoidan groupby()-funktiolla.

if kategoriset and mielipiteet:
   for var1 in kategoriset:
      for var2 in mielipiteet:
         df1=df.groupby(var1)[var2].describe()
         df1.index.name=var2+'/'+var1
         df1.to_csv(f, sep=';', decimal=',')
         f.write('\n')

Korrelaatiot

Määrällisten muuttujien korrelaatiokertoimet saan corr()-funktiolla:

if kvantit:
   df1=df[kvantit].corr()
   df1.index.name='Korrelaatiot'
   df1.to_csv(f, sep=';', decimal=',')
   f.write('\n')

Tiedoston sulkeminen

Koodin lopuksi on tärkeää sulkea tiedosto f.close() -komennolla!

Koodin käyttö

Koodin käyttämiseksi täytyy tietenkin tuoda tarvittavat kirjastot ja avata analysoitava aineisto dataframeen:

import pandas as pd

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

df.head()-komennolla voit tutustua aineistoon ja selvittää eri muuttujien tyypit (kategorinen, mielipideasteikollinen, määrällinen).

Voit muokata ja täydentää koodia omiin tarpeisiisi sopivaksi.

 

Mainokset