from datetime import datetime
print(f'Päivitetty {datetime.now().date()} / Aki Taanila')
Päivitetty 2023-04-30 / Aki Taanila
import pandas as pd
df = pd.read_excel('https://taanila.fi/data1.xlsx')
df.head()
nro | sukup | ikä | perhe | koulutus | palveluv | palkka | johto | työtov | työymp | palkkat | työteht | työterv | lomaosa | kuntosa | hieroja | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 1 | 38 | 1 | 1.0 | 22.0 | 3587 | 3 | 3.0 | 3 | 3 | 3 | NaN | NaN | NaN | NaN |
1 | 2 | 1 | 29 | 2 | 2.0 | 10.0 | 2963 | 1 | 5.0 | 2 | 1 | 3 | NaN | NaN | NaN | NaN |
2 | 3 | 1 | 30 | 1 | 1.0 | 7.0 | 1989 | 3 | 4.0 | 1 | 1 | 3 | 1.0 | NaN | NaN | NaN |
3 | 4 | 1 | 36 | 2 | 1.0 | 14.0 | 2144 | 3 | 3.0 | 3 | 3 | 3 | 1.0 | NaN | NaN | NaN |
4 | 5 | 1 | 24 | 1 | 2.0 | 4.0 | 2183 | 2 | 3.0 | 2 | 1 | 2 | 1.0 | NaN | NaN | NaN |
# Muuttujien tekstimuotoisia arvoja
sukup = ['Mies', 'Nainen']
koulutus = ['Peruskoulu', '2. aste', 'Korkeakoulu', 'Ylempi korkeakoulu']
# Palkan tunnuslukuja koulutuksen määräämissä ryhmissä
df1 = df.groupby('koulutus')['palkka'].describe()
# Koulutuksen tekstimuotoiset arvot numeroiden 1, 2, 3, 4 sijasta
df1.index = koulutus
# Esitän tulokset ilman desimaaleja
df1.style.format('{:.0f}')
count | mean | std | min | 25% | 50% | 75% | max | |
---|---|---|---|---|---|---|---|---|
Peruskoulu | 27 | 2310 | 473 | 1638 | 2008 | 2144 | 2534 | 3587 |
2. aste | 30 | 2403 | 534 | 1521 | 2008 | 2378 | 2729 | 3510 |
Korkeakoulu | 22 | 2887 | 1108 | 1559 | 2222 | 2710 | 2925 | 6278 |
Ylempi korkeakoulu | 2 | 5147 | 110 | 5069 | 5108 | 5147 | 5186 | 5225 |
# Palkkakeskiarvoja sukupuolen ja koulutuksen määräämissä ryhmissä
# unstack() siirtää koulutukset sarakkeisiin
df2 = df.groupby(['sukup', 'koulutus'])['palkka'].mean().unstack()
# Sukupuolen ja koulutuksen tekstimuotoiset arvot
df2.index = sukup
df2.columns = koulutus
# Esitän tulokset ilman desimaaleja
# puuttuvan arvon tilalle '-'
df2.style.format('{:.0f}', na_rep='-')
Peruskoulu | 2. aste | Korkeakoulu | Ylempi korkeakoulu | |
---|---|---|---|---|
Mies | 2354 | 2461 | 3145 | 5147 |
Nainen | 2121 | 2211 | 2334 | - |
# Edellisen voin toteuttaa myös pivot_table()-toiminnolla
df3 = df.pivot_table(values='palkka', index='sukup', columns='koulutus')
df3.index = sukup
df3.columns = koulutus
df3.style.format('{:.0f}', na_rep='-')
Peruskoulu | 2. aste | Korkeakoulu | Ylempi korkeakoulu | |
---|---|---|---|---|
Mies | 2354 | 2461 | 3145 | 5147 |
Nainen | 2121 | 2211 | 2334 | - |
# Keskiarvoja palkalle ja palkkatyytyväisyydelle koulutuksen ja sukupuolen määräämissä ryhmissä
df4 = df.groupby(['koulutus', 'sukup'])[['palkka', 'palkkat']].mean()
# Hierarkinen (koulutus, sukupuoli) indeksi vaatii omat niksinsä tekstiarvojen sijoittamiseen
df4.index = df4.index.set_levels(koulutus, level=0)
df4.index = df4.index.set_levels(sukup, level=1)
# Esitän palkkakeskiarvot ilman desimaaleja ja palkkatyytyväisyydet yhdellä desimaalilla
df4.style.format({'palkka':'{:.0f}', 'palkkat':'{:.1f}'})
palkka | palkkat | ||
---|---|---|---|
koulutus | sukup | ||
Peruskoulu | Mies | 2354 | 1.6 |
Nainen | 2121 | 2.8 | |
2. aste | Mies | 2461 | 1.8 |
Nainen | 2211 | 2.9 | |
Korkeakoulu | Mies | 3145 | 2.3 |
Nainen | 2334 | 2.7 | |
Ylempi korkeakoulu | Mies | 5147 | 3.0 |
# Tyytyväisyyskeskiarvoja sukupuolen ja koulutuksen mukaan
df5 = df.groupby(['sukup', 'koulutus'])[['johto', 'työtov', 'työymp', 'palkkat', 'työteht']].mean()
# Hierarkinen (sukupuoli, koulutus) indeksi vaatii omat niksinsä tekstiarvojen sijoittamiseen
df5.index = df5.index.set_levels(sukup, level=0)
df5.index = df5.index.set_levels(koulutus, level=1)
# Esitän tulokset yhdellä desimaalilla
df5.style.format('{:.1f}')
johto | työtov | työymp | palkkat | työteht | ||
---|---|---|---|---|---|---|
sukup | koulutus | |||||
Mies | Peruskoulu | 2.8 | 4.0 | 2.7 | 1.6 | 2.9 |
2. aste | 2.6 | 4.2 | 2.9 | 1.8 | 3.0 | |
Korkeakoulu | 3.1 | 4.1 | 3.5 | 2.3 | 3.5 | |
Ylempi korkeakoulu | 4.0 | 4.5 | 4.0 | 3.0 | 3.5 | |
Nainen | Peruskoulu | 3.6 | 4.2 | 3.6 | 2.8 | 3.6 |
2. aste | 4.0 | 4.0 | 4.1 | 2.9 | 3.7 | |
Korkeakoulu | 3.4 | 3.4 | 4.0 | 2.7 | 3.3 |
# Keskiarvopalkat hierojaa käyttäneille sukupuolittain
df6 = df[df['hieroja']==1].groupby('sukup')['palkka'].mean()
# Sukupuolen tekstimuotoiset arvot
df6.index = sukup
# mean-funktiolla laskettu yksisarakkeinen tulostaulukko ei ole dataframe,
# joten muunnan sen dataframeksi
pd.DataFrame(df6).style.format('{:.0f}')
palkka | |
---|---|
Mies | 2658 |
Nainen | 2318 |
# Palkan tunnuslukuja sukupuolittain hierojaa ja työterveyshuoltoa käyttäneillä
df7 = df[(df['hieroja']==1) & (df['työterv']==1)].groupby('sukup')['palkka'].describe()
# Sukupuolten oikeat nimet numeroiden sijasta
df7.index = sukup
# Esitän tulokset ilman desimaaleja
df7.style.format('{:.0f}')
count | mean | std | min | 25% | 50% | 75% | max | |
---|---|---|---|---|---|---|---|---|
Mies | 12 | 2642 | 905 | 1521 | 2134 | 2457 | 2974 | 5069 |
Nainen | 7 | 2245 | 382 | 1715 | 1969 | 2223 | 2574 | 2691 |
Data-analytiikka Pythonilla https://tilastoapu.wordpress.com/python/