from datetime import datetime
print(f'Päivitetty {datetime.now().date()} / Aki Taanila')
Päivitetty 2023-12-10 / Aki Taanila
Tämä on jatkoa sarjan edellisille osille
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set_style('whitegrid')
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 |
Kaavio on Axes-luokan olio. Kaavio sijaitsee Figure-luokan olion (kuvion) sisällä. Saman kuvion sisälle voin sijoittaa useita kaavioita. Voit ajatella, että Figure on kehys, jonka sisällä on yksi tai useampia kaavioita.
Seuraavassa luon subplots-funktiolla kuvion, jonka sisällä on neljä kaaviota. subplots palauttaa kuvion (annan tässä sille nimeksi fig) ja kokoelman kaavioita listana (annan kokoelmalla nimeksi axs).
fig, axs = plt.subplots(nrows=2, ncols=2)
Seuraavassa lisään kuvion sisään neljä kaavioita kuten edellä ja määritän kuvion kooksi 8 x 5.
wspace ja hspace määrittävät kaavioiden välisen tyhjän tilan (w = weigth eli leveys, h = heigth eli korkeus).
Lisään kuhunkin kaavioon sisältöä yksi kerrallaan. axs[0, 0] viittaa ensimmäisen rivin ensimmäiseen kaavioon, axs[0, 1] viittaa ensimmäisen rivin toiseen kaavioon jne.
fig, axs = plt.subplots(nrows=2, ncols=2, figsize=(8, 5))
fig.subplots_adjust(wspace=0.4, hspace=0.2)
# Kuvion otsikko
fig.suptitle('Vastaajien taustatietoja')
sns.countplot(data=df, y='sukup', ax=axs[0, 0])
axs[0, 0].set_ylabel('')
axs[0, 0].set_yticks([0, 1], ['Mies', 'Nainen'])
axs[0, 0].set_xlabel('')
axs[0, 0].grid(axis='y')
sns.countplot(data=df, y='perhe', ax=axs[0, 1])
axs[0, 1].set_ylabel('')
axs[0, 1].set_yticks([0, 1], ['Perheetön', 'Perheellinen'])
axs[0, 1].set_xlabel('')
axs[0, 1].grid(axis='y')
sns.countplot(data=df, y='koulutus', ax=axs[1, 0])
axs[1, 0].set_yticks([0, 1, 2, 3], ['Peruskoulu', '2. aste', 'Korkeakoulu', 'Ylempi korkeakoulu'])
axs[1, 0].set_xlabel('')
axs[1, 0].grid(axis='y')
sns.histplot(data=df, x='palveluv', bins=6, ax=axs[1, 1])
axs[1, 1].set_ylabel('')
axs[1, 1].grid(axis='x')
Jos teen kaavion suoraan dataframesta, niin subplots-lisäparametrilla kustakin dataframen sarakkeesta tehdään oma kaavio.
sharex ja sharey -lisäparametreilla voin pakottaa kaavioille yhteisen x-akselin ja y-akselin.
# Dataframen laskeminen
df1 = df['johto'].value_counts(normalize=True).sort_index().to_frame()
df1['työtov'] = df['työtov'].value_counts(sort=False, normalize=True)
df1['työymp'] = df['työymp'].value_counts(sort=False, normalize=True)
df1['palkkat'] = df['palkkat'].value_counts(sort=False, normalize=True)
df1['työteht'] = df['työteht'].value_counts(sort=False, normalize=True)
df1.index = ['Erittäin tyytymätön', 'Jokseenkin tyytymätön', 'Ei tyytymätön eikä tyytyväinen',
'Jokseenkin tyytyväinen', 'Erittäin tyytyväinen']
df1 = df1*100
df1
proportion | työtov | työymp | palkkat | työteht | |
---|---|---|---|---|---|
Erittäin tyytymätön | 8.536585 | NaN | 10.975610 | 40.243902 | 6.097561 |
Jokseenkin tyytymätön | 19.512195 | 3.703704 | 10.975610 | 23.170732 | 18.292683 |
Ei tyytymätön eikä tyytyväinen | 36.585366 | 19.753086 | 36.585366 | 23.170732 | 35.365854 |
Jokseenkin tyytyväinen | 28.048780 | 43.209877 | 28.048780 | 12.195122 | 30.487805 |
Erittäin tyytyväinen | 7.317073 | 33.333333 | 13.414634 | 1.219512 | 9.756098 |
axs = df1.plot(kind='bar', figsize=(10, 2), legend=False, subplots=True, layout=(1, 5),
sharex=True, sharey=True)
axs[0, 2].set_xlabel('%')
Text(0.5, 0, '%')
Pääsääntö: Jos teen kaavion suoraan alkuperäisestä datasta (ei siis yhteenvetotaulukosta), niin kannattaa käyttää seaborn-kirjastoa.
Kahdeksanosaisen muistiosarjan viimeinen osa keskittyy seaborn-kirjastoon: https://nbviewer.jupyter.org/github/taanila/kaaviot/blob/master/seaborn.ipynb