Ryhmittelyjä groupby-toiminnolla

Tässä artikkelissa lasken dataframen sarakkeille tunnuslukuja toisten muuttujien määräämissä ryhmissä. Ryhmittelyt toteutan groupby()-toiminnolla. Tämän artikkelin ohjelmakoodin ja tulosteet löydät GitHubista:

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

Aloitan avaamalla Excel-muotoisen datan dataframeen:

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

Lasken palkalle tunnuslukuja koulutuksen määräämissä ryhmissä uuteen dataframeen (df1):

df1 = df['palkka'].groupby(df['koulutus']).describe()

Tuloste näyttää siistimmältä, jos muotoilen tunnusluvut euron tarkkuudelle jättämällä desimaalit pois:

df1.style.format('{:.0f}')

Muotoilukoodit sijoitan aina aaltosulkeiden {} väliin. Aaltosulkeen jälkeinen kaksoispiste on aloitusmerkki. Pisteen jälkeen ilmoitan desimaalien määrän .0 ja viimeisenä oleva kirjain ilmoittaa tiedon tyypin (f = float eli liukuluku).

Tuloksena saan seuraavan näköisen taulukon:

df8

Seuraavaksi lasken palkkakeskiarvoja sukupuolen ja koulutuksen määräämissä ryhmissä:

df2 = df['palkka'].groupby([df['sukup'], df['koulutus']]).
   mean().unstack()
df2.style.format('{:.0f}')

Huomaa, miten kahden tai useamman ryhmittelevän muuttujan lista täytyy laittaa hakasulkeiden sisään. Funktio unstack() siirtää jälkimmäisen ryhmittelevän muuttujan (koulutus) ryhmät sarakkeisiin:

df9

Koulutuksen 4 (ylempi korkeakoulu) omaavia naisia ei aineistossa ole (nan).

Seuraavassa lasken keskiarvot muuttujille ’palkka’ ja ’tyytyväisyys palkkaan’.

df3 = df.groupby(['koulutus', 'sukup']).agg({'palkka':'mean', 
   'palkkat':'mean'})
df3.style.format('{:.2f}')

Aiemmissa esimerkeissä rajasin heti alussa, että tunnuslukuja lasketaan tietylle muuttujalle (esimerkiksi df[’palkka’]). Tällöin ryhmittelevien muuttujien kohdalla tarvitaan tieto dataframesta (esimerkiksi df[’koulutus’]. Tässä esimerkissä ryhmittelevien muuttujien kohdalla ei tarvitse määritellä erikseen dataframea, koska df on jo alussa määritelty ilman rajauksia (df.groupby…).

Funktiolla agg() voin määritellä täsmällisesti mille muuttujille lasken mitäkin tunnuslukuja. Tulos näyttää seuraavalta:

df10

Seuraavassa lasken tyytyväisyyskeskiarvoja sukupuolen ja koulutuksen mukaan ryhmiteltyinä:

df4 = df.groupby(['sukup', 'koulutus'])[['johtoon','työtov']].
   mean()
df4.style.format('{:.2f}')

Huomaa, miten kahden tai useamman muuttujan lista täytyy laittaa hakasulkeiden sisään. Tulos näyttää seuraavalta:

df11

Seuraavassa lasken palkkakeskiarvot sukupuolittain niille, jotka ovat käyttäneet hierojaa:

df[df['hieroja'] == 1].groupby('sukup')['palkka'].mean()

Seuraavassa lasken palkan tunnusluvut sukupuolittain niille, jotka ovat käyttäneet hierojaa ja työterveyshuoltoa:

df[(df['hieroja'] == 1) & (df['työterv'] == 1)].
   groupby('sukup')['palkka'].describe()

Tulos näyttää seuraavalta:

df12

Seuraavassa artikkelissani Tunnuslukuja Exceliin lasken tilastollisia tunnuslukuja ja tallennan tulokset Excel-tiedostoon.

Mainokset