{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Päivitetty 2023-04-30 / Aki Taanila\n" ] } ], "source": [ "from datetime import datetime\n", "print(f'Päivitetty {datetime.now().date()} / Aki Taanila')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Ryhmittelyjä groupby-funktiolla" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
nrosukupikäperhekoulutuspalveluvpalkkajohtotyötovtyöymppalkkattyötehttyötervlomaosakuntosahieroja
0113811.022.0358733.0333NaNNaNNaNNaN
1212922.010.0296315.0213NaNNaNNaNNaN
2313011.07.0198934.01131.0NaNNaNNaN
3413621.014.0214433.03331.0NaNNaNNaN
4512412.04.0218323.02121.0NaNNaNNaN
\n", "
" ], "text/plain": [ " nro sukup ikä perhe koulutus palveluv palkka johto työtov työymp \\\n", "0 1 1 38 1 1.0 22.0 3587 3 3.0 3 \n", "1 2 1 29 2 2.0 10.0 2963 1 5.0 2 \n", "2 3 1 30 1 1.0 7.0 1989 3 4.0 1 \n", "3 4 1 36 2 1.0 14.0 2144 3 3.0 3 \n", "4 5 1 24 1 2.0 4.0 2183 2 3.0 2 \n", "\n", " palkkat työteht työterv lomaosa kuntosa hieroja \n", "0 3 3 NaN NaN NaN NaN \n", "1 1 3 NaN NaN NaN NaN \n", "2 1 3 1.0 NaN NaN NaN \n", "3 3 3 1.0 NaN NaN NaN \n", "4 1 2 1.0 NaN NaN NaN " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import pandas as pd\n", "\n", "df = pd.read_excel('https://taanila.fi/data1.xlsx')\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Muuttujien tekstimuotoisia arvoja\n", "sukup = ['Mies', 'Nainen']\n", "koulutus = ['Peruskoulu', '2. aste', 'Korkeakoulu', 'Ylempi korkeakoulu']" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
 countmeanstdmin25%50%75%max
Peruskoulu27231047316382008214425343587
2. aste30240353415212008237827293510
Korkeakoulu222887110815592222271029256278
Ylempi korkeakoulu2514711050695108514751865225
\n" ], "text/plain": [ "" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Palkan tunnuslukuja koulutuksen määräämissä ryhmissä\n", "df1 = df.groupby('koulutus')['palkka'].describe()\n", "\n", "# Koulutuksen tekstimuotoiset arvot numeroiden 1, 2, 3, 4 sijasta\n", "df1.index = koulutus\n", "\n", "# Esitän tulokset ilman desimaaleja\n", "df1.style.format('{:.0f}')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
 Peruskoulu2. asteKorkeakouluYlempi korkeakoulu
Mies2354246131455147
Nainen212122112334-
\n" ], "text/plain": [ "" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Palkkakeskiarvoja sukupuolen ja koulutuksen määräämissä ryhmissä\n", "# unstack() siirtää koulutukset sarakkeisiin\n", "df2 = df.groupby(['sukup', 'koulutus'])['palkka'].mean().unstack()\n", "\n", "# Sukupuolen ja koulutuksen tekstimuotoiset arvot\n", "df2.index = sukup\n", "df2.columns = koulutus\n", "\n", "# Esitän tulokset ilman desimaaleja\n", "# puuttuvan arvon tilalle '-'\n", "df2.style.format('{:.0f}', na_rep='-')" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
 Peruskoulu2. asteKorkeakouluYlempi korkeakoulu
Mies2354246131455147
Nainen212122112334-
\n" ], "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Edellisen voin toteuttaa myös pivot_table()-toiminnolla\n", "df3 = df.pivot_table(values='palkka', index='sukup', columns='koulutus')\n", "df3.index = sukup\n", "df3.columns = koulutus\n", "df3.style.format('{:.0f}', na_rep='-')" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
  palkkapalkkat
koulutussukup  
PeruskouluMies23541.6
Nainen21212.8
2. asteMies24611.8
Nainen22112.9
KorkeakouluMies31452.3
Nainen23342.7
Ylempi korkeakouluMies51473.0
\n" ], "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Keskiarvoja palkalle ja palkkatyytyväisyydelle koulutuksen ja sukupuolen määräämissä ryhmissä\n", "df4 = df.groupby(['koulutus', 'sukup'])[['palkka', 'palkkat']].mean()\n", "\n", "# Hierarkinen (koulutus, sukupuoli) indeksi vaatii omat niksinsä tekstiarvojen sijoittamiseen\n", "df4.index = df4.index.set_levels(koulutus, level=0)\n", "df4.index = df4.index.set_levels(sukup, level=1)\n", "\n", "# Esitän palkkakeskiarvot ilman desimaaleja ja palkkatyytyväisyydet yhdellä desimaalilla\n", "df4.style.format({'palkka':'{:.0f}', 'palkkat':'{:.1f}'})" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
  johtotyötovtyöymppalkkattyöteht
sukupkoulutus     
MiesPeruskoulu2.84.02.71.62.9
2. aste2.64.22.91.83.0
Korkeakoulu3.14.13.52.33.5
Ylempi korkeakoulu4.04.54.03.03.5
NainenPeruskoulu3.64.23.62.83.6
2. aste4.04.04.12.93.7
Korkeakoulu3.43.44.02.73.3
\n" ], "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Tyytyväisyyskeskiarvoja sukupuolen ja koulutuksen mukaan\n", "df5 = df.groupby(['sukup', 'koulutus'])[['johto', 'työtov', 'työymp', 'palkkat', 'työteht']].mean()\n", "\n", "# Hierarkinen (sukupuoli, koulutus) indeksi vaatii omat niksinsä tekstiarvojen sijoittamiseen\n", "df5.index = df5.index.set_levels(sukup, level=0)\n", "df5.index = df5.index.set_levels(koulutus, level=1)\n", "\n", "# Esitän tulokset yhdellä desimaalilla\n", "df5.style.format('{:.1f}')" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
 palkka
Mies2658
Nainen2318
\n" ], "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Keskiarvopalkat hierojaa käyttäneille sukupuolittain\n", "df6 = df[df['hieroja']==1].groupby('sukup')['palkka'].mean()\n", "\n", "# Sukupuolen tekstimuotoiset arvot\n", "df6.index = sukup\n", "\n", "# mean-funktiolla laskettu yksisarakkeinen tulostaulukko ei ole dataframe,\n", "# joten muunnan sen dataframeksi\n", "pd.DataFrame(df6).style.format('{:.0f}')" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
 countmeanstdmin25%50%75%max
Mies12264290515212134245729745069
Nainen7224538217151969222325742691
\n" ], "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Palkan tunnuslukuja sukupuolittain hierojaa ja työterveyshuoltoa käyttäneillä\n", "df7 = df[(df['hieroja']==1) & (df['työterv']==1)].groupby('sukup')['palkka'].describe()\n", "\n", "# Sukupuolten oikeat nimet numeroiden sijasta\n", "df7.index = sukup\n", "\n", "# Esitän tulokset ilman desimaaleja\n", "df7.style.format('{:.0f}')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Lisätietoa\n", "\n", "Data-analytiikka Pythonilla https://tilastoapu.wordpress.com/python/" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.9" } }, "nbformat": 4, "nbformat_minor": 2 }