from datetime import datetime
print(f'Päivitetty {datetime.now().date()} / Aki Taanila')
Päivitetty 2023-10-23 / Aki Taanila
Määrällisille muuttujille kannattaa laskea
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
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 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
77 | 78 | 1 | 22 | 1 | 3.0 | 0.0 | 1598 | 4 | 4.0 | 4 | 3 | 4 | NaN | 1.0 | 1.0 | NaN |
78 | 79 | 1 | 33 | 1 | 1.0 | 2.0 | 1638 | 1 | 3.0 | 2 | 1 | 2 | 1.0 | NaN | NaN | NaN |
79 | 80 | 1 | 27 | 1 | 2.0 | 7.0 | 2612 | 3 | 4.0 | 3 | 3 | 3 | 1.0 | NaN | 1.0 | NaN |
80 | 81 | 1 | 35 | 2 | 2.0 | 16.0 | 2808 | 3 | 4.0 | 3 | 3 | 3 | NaN | NaN | NaN | NaN |
81 | 82 | 2 | 35 | 2 | 3.0 | 15.0 | 2183 | 3 | 4.0 | 4 | 3 | 4 | 1.0 | NaN | NaN | NaN |
82 rows × 16 columns
# Korvaan joidenkin muuttujien nimet havainnollisemmilla nimillä
df = df.rename(columns={'palveluv':'palveluvuodet', 'johto':'johtoon', 'työtov':'työtovereihin',
'työymp':'työympäristöön', 'palkkat':'palkkaan', 'työteht':'työtehtäviin'})
df
nro | sukup | ikä | perhe | koulutus | palveluvuodet | palkka | johtoon | työtovereihin | työympäristöön | palkkaan | työtehtäviin | 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 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
77 | 78 | 1 | 22 | 1 | 3.0 | 0.0 | 1598 | 4 | 4.0 | 4 | 3 | 4 | NaN | 1.0 | 1.0 | NaN |
78 | 79 | 1 | 33 | 1 | 1.0 | 2.0 | 1638 | 1 | 3.0 | 2 | 1 | 2 | 1.0 | NaN | NaN | NaN |
79 | 80 | 1 | 27 | 1 | 2.0 | 7.0 | 2612 | 3 | 4.0 | 3 | 3 | 3 | 1.0 | NaN | 1.0 | NaN |
80 | 81 | 1 | 35 | 2 | 2.0 | 16.0 | 2808 | 3 | 4.0 | 3 | 3 | 3 | NaN | NaN | NaN | NaN |
81 | 82 | 2 | 35 | 2 | 3.0 | 15.0 | 2183 | 3 | 4.0 | 4 | 3 | 4 | 1.0 | NaN | NaN | NaN |
82 rows × 16 columns
Describe-funktio laskee kaikille numeerisille muuttujille tilastolliset tunnusluvut
df.describe()
nro | sukup | ikä | perhe | koulutus | palveluvuodet | palkka | johtoon | työtovereihin | työympäristöön | palkkaan | työtehtäviin | työterv | lomaosa | kuntosa | hieroja | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
count | 82.000000 | 82.000000 | 82.000000 | 82.000000 | 81.000000 | 80.000000 | 82.000000 | 82.000000 | 81.000000 | 82.000000 | 82.000000 | 82.000000 | 47.0 | 20.0 | 9.0 | 22.0 |
mean | 41.500000 | 1.231707 | 37.951220 | 1.621951 | 1.987654 | 12.175000 | 2563.878049 | 3.060976 | 4.061728 | 3.219512 | 2.109756 | 3.195122 | 1.0 | 1.0 | 1.0 | 1.0 |
std | 23.815261 | 0.424519 | 9.773866 | 0.487884 | 0.844006 | 8.807038 | 849.350302 | 1.058155 | 0.826826 | 1.154961 | 1.111179 | 1.047502 | 0.0 | 0.0 | 0.0 | 0.0 |
min | 1.000000 | 1.000000 | 20.000000 | 1.000000 | 1.000000 | 0.000000 | 1521.000000 | 1.000000 | 2.000000 | 1.000000 | 1.000000 | 1.000000 | 1.0 | 1.0 | 1.0 | 1.0 |
25% | 21.250000 | 1.000000 | 31.000000 | 1.000000 | 1.000000 | 3.750000 | 2027.000000 | 2.000000 | 4.000000 | 3.000000 | 1.000000 | 3.000000 | 1.0 | 1.0 | 1.0 | 1.0 |
50% | 41.500000 | 1.000000 | 37.500000 | 2.000000 | 2.000000 | 12.500000 | 2320.000000 | 3.000000 | 4.000000 | 3.000000 | 2.000000 | 3.000000 | 1.0 | 1.0 | 1.0 | 1.0 |
75% | 61.750000 | 1.000000 | 44.000000 | 2.000000 | 3.000000 | 18.250000 | 2808.000000 | 4.000000 | 5.000000 | 4.000000 | 3.000000 | 4.000000 | 1.0 | 1.0 | 1.0 | 1.0 |
max | 82.000000 | 2.000000 | 61.000000 | 2.000000 | 4.000000 | 36.000000 | 6278.000000 | 5.000000 | 5.000000 | 5.000000 | 5.000000 | 5.000000 | 1.0 | 1.0 | 1.0 | 1.0 |
# Tilastollisia tunnuslukuja valituille muuttujille
df1 = df[['ikä', 'palveluvuodet', 'palkka']].describe()
# Suomenkieliset nimet tunnusluvuille
tunnusluvut = ['lukumäärä', 'keskiarvo', 'keskihajonta', 'pienin',
'alaneljännes', 'mediaani', 'yläneljännes', 'suurin']
df1.index = tunnusluvut
df1
ikä | palveluvuodet | palkka | |
---|---|---|---|
lukumäärä | 82.000000 | 80.000000 | 82.000000 |
keskiarvo | 37.951220 | 12.175000 | 2563.878049 |
keskihajonta | 9.773866 | 8.807038 | 849.350302 |
pienin | 20.000000 | 0.000000 | 1521.000000 |
alaneljännes | 31.000000 | 3.750000 | 2027.000000 |
mediaani | 37.500000 | 12.500000 | 2320.000000 |
yläneljännes | 44.000000 | 18.250000 | 2808.000000 |
suurin | 61.000000 | 36.000000 | 6278.000000 |
# Tilastollisia tunnuslukuja tyytyväisyyksille
df2 = df.loc[:,'johtoon':'työtehtäviin'].describe()
# Sarakkeiden järjestys keskiarvon mukaan suurimmasta pienimpään
df2 = df2.sort_values('mean', axis=1, ascending=False)
df2.index = tunnusluvut
df2
työtovereihin | työympäristöön | työtehtäviin | johtoon | palkkaan | |
---|---|---|---|---|---|
lukumäärä | 81.000000 | 82.000000 | 82.000000 | 82.000000 | 82.000000 |
keskiarvo | 4.061728 | 3.219512 | 3.195122 | 3.060976 | 2.109756 |
keskihajonta | 0.826826 | 1.154961 | 1.047502 | 1.058155 | 1.111179 |
pienin | 2.000000 | 1.000000 | 1.000000 | 1.000000 | 1.000000 |
alaneljännes | 4.000000 | 3.000000 | 3.000000 | 2.000000 | 1.000000 |
mediaani | 4.000000 | 3.000000 | 3.000000 | 3.000000 | 2.000000 |
yläneljännes | 5.000000 | 4.000000 | 4.000000 | 4.000000 | 3.000000 |
suurin | 5.000000 | 5.000000 | 5.000000 | 5.000000 | 5.000000 |
# Edellinen transponoituna
df3 = df2.T
df3
lukumäärä | keskiarvo | keskihajonta | pienin | alaneljännes | mediaani | yläneljännes | suurin | |
---|---|---|---|---|---|---|---|---|
työtovereihin | 81.0 | 4.061728 | 0.826826 | 2.0 | 4.0 | 4.0 | 5.0 | 5.0 |
työympäristöön | 82.0 | 3.219512 | 1.154961 | 1.0 | 3.0 | 3.0 | 4.0 | 5.0 |
työtehtäviin | 82.0 | 3.195122 | 1.047502 | 1.0 | 3.0 | 3.0 | 4.0 | 5.0 |
johtoon | 82.0 | 3.060976 | 1.058155 | 1.0 | 2.0 | 3.0 | 4.0 | 5.0 |
palkkaan | 82.0 | 2.109756 | 1.111179 | 1.0 | 1.0 | 2.0 | 3.0 | 5.0 |
Yleisimmät esitystavat ovat
Grafiikan läheisyydessä pitää olla tiedot siitä kuinka monen havainnon perusteella tunnusluvut on laskettu (n-arvot). Nämä löytyvät esimerkiksi describe-funktiolla lasketusta tunnuslukutaulukosta (count).
# Ruutu- ja janakaavio palkalle
# showmeans-parametrin ansioista myös keskiarvo näytetään (vihreä kolmio)
# Erillisinä pisteinä näytetään yli 1,5 laatikon paksuuden verran laatikon
# reunasta sijaitsevat pisteet
sns.boxplot(x=df['palkka'], showmeans=True)
n = df['palkka'].count()
plt.xlabel(f'Kuukausipalkka, n = {n}')
Text(0.5, 0, 'Kuukausipalkka, n = 82')
# Tyytyväisyysmuuttujien lista keskiarvon mukaisessa järjestyksessä
list = df.loc[:,'johtoon':'työtehtäviin'].mean().sort_values().index
# Tyytyväisyyksien ruutu- ja janakaavio
# data-parametria käyttämällä saan useita muuttujia samaan kaavioon
sns.boxplot(data=df[list], orient='h', showmeans=True)
# Pienin ja suurin n-arvo
n_min = int(df3['lukumäärä'].min())
n_max = int(df3['lukumäärä'].max())
plt.xlabel(f'Tyytyväisyys, n = {n_min} - {n_max}')
Text(0.5, 0, 'Tyytyväisyys, n = 81 - 82')
# Keskiarvoja kuvaavat pylväät ja virhemarginaalit
sns.barplot(data=df[list], orient='h')
# x-akselin skaalaus (pienin arvo 1, suurin arvo 5)
plt.xlim(1, 5)
# x-akselin otsikko
plt.xlabel(f'Tyytyväisyyskeskiarvo, n = {n_min} - {n_max}')
Text(0.5, 0, 'Tyytyväisyyskeskiarvo, n = 81 - 82')
# y-akselin voi tarvittaessa kääntää:
sns.barplot(data=df[list], orient='h').invert_yaxis()
plt.xlim(1, 5)
plt.xlabel(f'Tyytyväisyyskeskiarvo, n = {n_min} - {n_max}')
Text(0.5, 0, 'Tyytyväisyyskeskiarvo, n = 81 - 82')
Data-analytiikka Pythonilla https://tilastoapu.wordpress.com/python/