Pivot-taulukoita Pythonilla

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

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

crosstab vai pivot_table?

Kyselytutkimusaineistoista lasketaan tyypillisesti lukumääriä ja prosentteja sisältäviä yhteenvetotaulukoita (frekvenssitaulukot, ristiintaulukoinnit). Näiden laskemiseen käytän mieluiten pandas-kirjaston crosstab-toimintoa. crosstab-toiminto laskee oletuksena lukumääriä. Lukumäärien ja prosenttien laskennasta crosstab-toiminnolla voit lukea lisää artikkeleistani Ristiintaulukointi – crosstab() ja Lukumääriä ja prosentteja.

Monipuolisemmat yhteevedot ja raportit voin laatia pandas-kirjaston pivot_table-toiminnolla. pivot_table laskee oletuksena keskiarvoja, mutta voin määrittää sen laskemaan myös muita tilastollisia tunnuslukuja.

Alkutoimet

Otan aluksi käyttöön tarvitsemani kirjastot: numpy (muutamia jatkossa käytettäviä tunnuslukufunktioita varten), pandas ja matplotlib.pyplot (grafiikkaa varten):

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

Avaan aineiston ja tulostan näkyviin viisi ensimmäistä riviä:

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

pivot1

Pivot-taulukoita

Laadin pivot-taulukon, josta näen onnellisuuspisteiden (Happiness Score) keskiarvot eri vuosina:

data.pivot_table(values = 'Happiness Score', index = 'Year')

pivot2

values määrittää, mistä lasken keskiarvoja ja index määrittää riviotsikot. Jos haluan käyttää useampia muuttujia, niin laitan listan muuttujista hakasulkujen sisään, esimerkiksi:

data.pivot_table(values = 'Happiness Score', index = 
   ['Region', 'Year'])

columns-asetuksella voin lisätä muuttujan sarakkeisiin:

data.pivot_table(values = 'Happiness Score', index= 'Region', 
   columns='Year', margins = True)

Yllä olen lisäksi määrittänyt laskettavaksi myös kaikkien keskiarvot (margins = True). Tulos näyttää seuraavalta:

pivot3

Voin vapaasti rakentaa myös mutkikkaampia yhteenvetoja, esimerkiksi:

data.pivot_table(values = ['Happiness Score', 'Economy 
   (GDP per Capita)', 'Health (Life Expectancy)'], 
   index = 'Region', columns = 'Year', margins = 'True')

Kuten jo nähtiin, niin pivot_table laskee oletuksena keskiarvoja. aggfunc-asetuksella voin määrittää laskettavaksi muita tunnuslukuja:

data.pivot_table(values = 'Happiness Score', index = 'Region', 
	aggfunc = [np.mean, np.median, min, max, np.std])

Tässä lasken keskiarvon, mediaanin, pienimmän, suurimman ja keskihajonnan. Keskiarvon, mediaanin ja keskihajonnan laskemiseen tarvitsen numpy-kirjastoa.

pivot4

Ennen pivot-taulukointia voin luokitella arvoja. Esimerkiksi seuraavassa luokittelen onnellisuuspisteiden vaihteluvälin neljänneksiin qcut-funktiolla. Tämän jälkeen käytän neljänneksiä pivot-taulukoinnissa:

score1 = pd.qcut(data['Happiness Score'], 4)
data.pivot_table(values = 'Happiness Score', index = 'Region', 
   columns=score1, aggfunc= len, fill_value = 0)

pivot5

Yllä lasken lukumääriä (aggfunc=len). Esimerkiksi Australialla ja Uudella-Seelannilla ei ole lainkaan ensimmäisen kolmen neljänneksen onnellisuuspisteitä. Tämä näkyisi taulukossa Nan-merkintöinä ellen korvaa fill_value-asetuksella Nan-merkintöjä nollilla.

Pivot-taulukko pylväskaaviona

Voin esittää pivot-taulukon grafiikkana kohdistamalla plot-komennon pivot-taulukolle, esimerkiksi:

data.pivot_table(values = 'Happiness Score', index = 'Region', 
   columns = 'Year').plot.barh()
plt.xlabel('Happiness Score Mean')

pivot6

Pelkästään vuoden 2017 onnellisuuspistekeskiarvoja keskiarvon mukaan järjestettynä voin tarkastella seuraavasti:

data[data['Year'] == 2017].pivot_table(values = 'Happiness Score', 
   index = 'Region').sort_values('Happiness Score').plot.barh()
plt.xlabel('Happiness Score Mean 2017')

pivot7

Yhteenveto

Pääset hyvään alkuun pivot-taulukoiden kanssa muistamalla neljä asiaa

  • values määrittää muuttujat/kentät/sarkkeet, joista lasketaan jotain.
  • index määrittää muuttujat/kentät/sarakkeet, joiden arvoilla otsikoidaan pivot-taulukon rivit.
  • columns määrittää muuttujat/kentät/sarakkeet, joiden arvoilla otsikoidaan pivot-taulukon sarakkeet.
  • aggfunc määrittää laskettavat tunnusluvut.

Jos values, index tai columns -määrityksessä on useampia muuttujia, niin muuttujaluettelo kirjoitetaan hakasulkeiden sisään.

Jos aggfunc-määrityksessä määritellään laskettavaksi useampia tunnuslukuja, niin tunnuslukufunktiot kirjoitetaan hakasulkeiden sisään. Jos funktio ei toimi, niin toimiva funktio saattaa löytyä numpy-kirjastosta (esimerkiksi np.std()).

Jos haluat muokata pivot-taulukkoa, niin tallenna se muuttujan arvoksi. Pivot-taulukon luonti palauttaa dataframe-tyyppisen muuttujan, jota on helppo jatkotyöstää.

Mainokset