from datetime import datetime
print(f'Päivitetty {datetime.now().date()} / Aki Taanila')
Päivitetty 2024-04-15 / Aki Taanila
Datan avaamisen jälkeen kannattaa ensimmäiseksi tutustua dataan. Tähän muistioon olen koonnut mielestäni keskeisimmät pandas-kirjaston funktiot ja ominaisuudet, joita voit käyttää dataan tutustuttaessa.
# Tuon data-analytiikan peruspaketin
import pandas as pd
# Luen datan dataframeen
df = pd.read_excel('https://taanila.fi/data1.xlsx')
# Datan rivien ja sarakkeiden lukumäärät
df.shape
(82, 16)
df
# Huomaa että vain datan ensimmäiset ja viimeiset rivit näytetään
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
Huomautus: työtov-muuttujan arvot ovat desimaalimuodossa (3.0, 5.0, jne.), koska työtov-muuttujalla on puuttuvia arvoja. Kokonaislukutyyppinen muuttuja ei voi sisältää puuttuvia arvoja ja sen vuoksi Python on muuttanut tietotyypiksi liukuluvun (desimaaliluku).
# Datan alkupää. Voin myös määrittää näytettävien rivien määrän, esimerkiksi df.head(10)
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 |
# Datan loppupää
df.tail()
nro | sukup | ikä | perhe | koulutus | palveluv | palkka | johto | työtov | työymp | palkkat | työteht | työterv | lomaosa | kuntosa | hieroja | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
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 |
# Tietyt rivit (huomaa, että rivien numerointi alkaa nollasta)
df[10:15]
nro | sukup | ikä | perhe | koulutus | palveluv | palkka | johto | työtov | työymp | palkkat | työteht | työterv | lomaosa | kuntosa | hieroja | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
10 | 11 | 1 | 39 | 2 | 1.0 | 22.0 | 2651 | 3 | 5.0 | 3 | 1 | 3 | NaN | NaN | NaN | NaN |
11 | 12 | 1 | 40 | 2 | 3.0 | 21.0 | 2846 | 3 | 5.0 | 3 | 1 | 2 | NaN | 1.0 | NaN | 1.0 |
12 | 13 | 1 | 35 | 2 | 3.0 | 15.0 | 2808 | 3 | 5.0 | 3 | 1 | 4 | NaN | 1.0 | NaN | NaN |
13 | 14 | 1 | 58 | 2 | 3.0 | 21.0 | 3587 | 4 | 5.0 | 4 | 1 | 3 | NaN | NaN | NaN | NaN |
14 | 15 | 1 | 53 | 2 | 3.0 | 12.0 | 3393 | 4 | 4.0 | 4 | 4 | 4 | NaN | 1.0 | NaN | NaN |
# Jos haluan näyttää kaikki rivit, niin asetan max_rows arvoksi None
# pd.options.display.max_rows = None
# Jos haluan näyttää kaikki sarakkeet, niin asetan max_columns arvoksi None
#pd.options.display.max_columns = None
# df
Varoitus! Edellisen solut komentoja kannattaa käyttää varoen. Kaikki näytetyt rivit ja sarakkeet tallentuvat muistion mukana, kasvattavat muistion tiedostokokoa ja hidastavat toimintaa.
# Sarakkeiden otsikot (muuttujien nimet) ja arvojen lukumäärät
df.count()
nro 82 sukup 82 ikä 82 perhe 82 koulutus 81 palveluv 80 palkka 82 johto 82 työtov 81 työymp 82 palkkat 82 työteht 82 työterv 47 lomaosa 20 kuntosa 9 hieroja 22 dtype: int64
# Puuttuvien arvojen lukumäärät
df.isnull().sum()
nro 0 sukup 0 ikä 0 perhe 0 koulutus 1 palveluv 2 palkka 0 johto 0 työtov 1 työymp 0 palkkat 0 työteht 0 työterv 35 lomaosa 62 kuntosa 73 hieroja 60 dtype: int64
# Sarakkeiden otsikot, arvojen lukumäärät ja sarakkeiden tietotyypit
df.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 82 entries, 0 to 81 Data columns (total 16 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 nro 82 non-null int64 1 sukup 82 non-null int64 2 ikä 82 non-null int64 3 perhe 82 non-null int64 4 koulutus 81 non-null float64 5 palveluv 80 non-null float64 6 palkka 82 non-null int64 7 johto 82 non-null int64 8 työtov 81 non-null float64 9 työymp 82 non-null int64 10 palkkat 82 non-null int64 11 työteht 82 non-null int64 12 työterv 47 non-null float64 13 lomaosa 20 non-null float64 14 kuntosa 9 non-null float64 15 hieroja 22 non-null float64 dtypes: float64(7), int64(9) memory usage: 10.4 KB
Pelkästään numeroarvoja sisältävät sarakkeet ovat kokonaislukuja (int) tai liukulukuja (float). Liukuluvun voit ajatella olevan käytännössä sama kuin desimaaliluku.
unique-funktion avulla on helppo huomata virheellisiä tai epäilyttäviä arvoja.
Unique näyttää sarakkeen ainutkertaiset arvot listana. Esimerkiksi seuraavasta selviää, että 'työtov' (tyytyväisyys työtovereihin) sarakkeella on arvoja 2, 3, 4 ja 5 sekä yksi tai useampia puuttuvia arvoja (nan). Yksikään vastaajista ei siis ole ollut erittäin tyytymätön työtovereihin (arvo 1).
Arvot tulostuvat siinä järjestyksessä kuin ne tulevat datassa vastaan.
df['työtov'].unique()
array([ 3., 5., 4., 2., nan])
for-silmukka on toistorakenne, joka osaa läpikäydä erilaisia luetteloja. Seuraavan solun for-silmukka käy läpi dataframen sarakkeet lukuun ottamatta nro-saraketta, joka poistetaan drop-funktiolla. Parametri axis=1 määrittää läpi käytäväksi sarakkeet; ilman tätä parametria käytäisiin läpi dataframen rivit.
# for-silmukalla käyn läpi kaikki sarakkeet paitsi 'nro'
# drop poistaa oletuksena rivejä (axis=0), mutta haluan poistaa sarakkeita (axis=1)
for sarake in df.drop('nro', axis=1):
print(sarake, df[sarake].unique())
sukup [1 2] ikä [38 29 30 36 24 31 49 55 40 33 39 35 58 53 42 26 47 44 43 56 21 45 59 37 28 50 32 51 22 34 27 41 25 61 20 52 46] perhe [1 2] koulutus [ 1. 2. 3. 4. nan] palveluv [22. 10. 7. 14. 4. 16. 0. 23. 21. 15. 12. 2. 17. 20. 13. 27. 1. 3. nan 24. 5. 9. 6. 35. 28. 18. 36. 19. 8.] palkka [3587 2963 1989 2144 2183 1910 2066 2768 2106 2651 2846 2808 3393 2691 5225 2729 2925 2457 4874 3510 4446 1521 2223 1949 2340 6278 1559 2027 2300 2534 1872 2261 2417 3119 2574 1715 5069 2495 3470 1598 1638 2612] johto [3 1 2 4 5] työtov [ 3. 5. 4. 2. nan] työymp [3 2 1 5 4] palkkat [3 1 2 4 5] työteht [3 2 4 1 5] työterv [nan 1.] lomaosa [nan 1.] kuntosa [nan 1.] hieroja [nan 1.]
# kolme riviä, joissa palkalla suurin arvo
df.nlargest(3, 'palkka')
nro | sukup | ikä | perhe | koulutus | palveluv | palkka | johto | työtov | työymp | palkkat | työteht | työterv | lomaosa | kuntosa | hieroja | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
32 | 33 | 1 | 59 | 2 | 3.0 | 15.0 | 6278 | 4 | 4.0 | 5 | 4 | 4 | NaN | 1.0 | NaN | NaN |
16 | 17 | 1 | 26 | 1 | 4.0 | 2.0 | 5225 | 5 | 5.0 | 5 | 4 | 5 | NaN | NaN | 1.0 | NaN |
66 | 67 | 1 | 37 | 2 | 4.0 | 8.0 | 5069 | 3 | 4.0 | 3 | 2 | 2 | 1.0 | 1.0 | NaN | 1.0 |
# kolme riviä, joissa palkalla pienin arvo
df.nsmallest(3, 'palkka')
nro | sukup | ikä | perhe | koulutus | palveluv | palkka | johto | työtov | työymp | palkkat | työteht | työterv | lomaosa | kuntosa | hieroja | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
25 | 26 | 1 | 26 | 1 | 2.0 | 3.0 | 1521 | 2 | 4.0 | 2 | 1 | 3 | 1.0 | NaN | 1.0 | 1.0 |
35 | 36 | 1 | 31 | 2 | 3.0 | 0.0 | 1559 | 2 | 4.0 | 3 | 1 | 3 | 1.0 | NaN | NaN | NaN |
53 | 54 | 1 | 25 | 1 | 2.0 | 1.0 | 1559 | 2 | 4.0 | 3 | 1 | 2 | 1.0 | NaN | NaN | NaN |
value_counts-funktio laskee ainutkertaisten arvojen frekvenssit eli esiintymiskertojen lukumäärät.
Seuraavassa lasken frekvenssit kaikille muuttujille paitsi juoksevalle järjestysnumerolle, iälle ja palkalle. sort_index() järjestää arvot arvojen mukaiseen järjestykseen.
for muuttuja in df.drop(['nro', 'ikä', 'palkka'], axis=1):
print(df[muuttuja].value_counts().sort_index())
sukup 1 63 2 19 Name: count, dtype: int64 perhe 1 31 2 51 Name: count, dtype: int64 koulutus 1.0 27 2.0 30 3.0 22 4.0 2 Name: count, dtype: int64 palveluv 0.0 4 1.0 9 2.0 4 3.0 3 4.0 1 5.0 1 6.0 2 7.0 7 8.0 1 9.0 1 10.0 5 12.0 2 13.0 1 14.0 3 15.0 5 16.0 4 17.0 5 18.0 2 19.0 1 20.0 3 21.0 3 22.0 4 23.0 4 24.0 1 27.0 1 28.0 1 35.0 1 36.0 1 Name: count, dtype: int64 johto 1 7 2 16 3 30 4 23 5 6 Name: count, dtype: int64 työtov 2.0 3 3.0 16 4.0 35 5.0 27 Name: count, dtype: int64 työymp 1 9 2 9 3 30 4 23 5 11 Name: count, dtype: int64 palkkat 1 33 2 19 3 19 4 10 5 1 Name: count, dtype: int64 työteht 1 5 2 15 3 29 4 25 5 8 Name: count, dtype: int64 työterv 1.0 47 Name: count, dtype: int64 lomaosa 1.0 20 Name: count, dtype: int64 kuntosa 1.0 9 Name: count, dtype: int64 hieroja 1.0 22 Name: count, dtype: int64
# Tilastolliset tunnusluvut kannattaa myös vilkaista
df.describe()
nro | sukup | ikä | perhe | koulutus | palveluv | palkka | johto | työtov | työymp | palkkat | työteht | 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 |
pd.read_excel() datan lukeminen Excel-tiedostosta
df.shape datan rivien ja sarakkeiden lukumäärät
pd.options.display.max_rows = None dataframejen kaikkien rivien näyttäminen
pd.options.display.max_columns = None dataframejen kaikkien sarakkeiden näyttäminen
df.head() datan alkupää
df.tail() datan loppupää
df.count() sarakkeiden otsikot ja arvojen lukumäärät kussakin sarakkeessa
df.isnull().sum() puuttuvien arvojen lukumäärät kussakin sarakkeessa
df.info() sarakkeiden otsikot, arvojen lukumäärät ja sarakkeiden tietotyypit
df['sarake'].unique() nimetyn sarakkeen ainutkertaisten arvojen luettelo
df.drop() rivien tai sarakkeiden poistamiseen
print() näytölle tulostaminen
df.nlargest() n suurinta nimetyn sarakkeen suhteen
df.nsmallest() n pienintä nimetyn sarakkeen suhteen
df['sarake'].value_counts() arvojen esiintymiskertojen (frekvenssien) laskemiseen
df.describe() tilastolliset tunnusluvut
Lisäksi opittiin toistamaan samankaltaisia toimia for-silmukalla.
Data-analytiikka Pythonilla https://tilastoapu.wordpress.com/python/