from datetime import datetime
print(f'Päivitetty {datetime.now().date()} / Aki Taanila')
Päivitetty 2024-02-07 / Aki Taanila
Tästä muistiosta voit aloittaa vaikka et olisi koskaan koodannut Pythonilla.
Paketti (kutsutaan myös kirjastoksi) on kokoelma valmista ohjelmakoodia, jota voin käyttää omissa ohjelmissani. Data-analytiikan peruspaketti on nimeltään pandas. Pandas sisältää muiden muassa valmiin crosstab-funktion, jolla voin laskea lukumäärä- ja prosenttiyhteenvetoja sekä describe-funktion, jolla voin nopeasti laskea tilastolliset tunnusluvut.
Useimmat data-analytiikassa tarvittavat paketit sisältyvät Anacondaan ja Colabiin. Jos käytät Minicondaa, niin sinun pitää asentaa jokainen käytettävä paketti erikseen.
Jos paketti on valmiiksi asennettu, niin voin tuoda sen käyttööni import-komennolla. Esimerkiksi import pandas as pd
tuo pandas-paketin käyttööni siten että voin seuraavissa koodisoluissa viitata siihen lyhenteellä pd.
Muistion solun voit suorittaa näppäinyhdistelmillä ctrl-enter (pysyt samassa solussa) tai shift-enter (siirryt seuraavaan soluun).
Pandas-paketin read_excel-funktiolla voin lukea datan Excel-tiedostosta. Jos tiedosto on samassa kansiossa kuin muistio, niin voin viitata siihen pelkällä tiedostonimellä, esimerkiksi 'data1.xlsx'. Seuraavassa tiedosto on kuitenkin nettiosoitteessa. Luen seuraavassa data-objektin df-nimisen (voit käyttää haluamaasi nimeä) muuttujan arvoksi.
Merkkijonot kirjoitetaan heittomerkkien tai lainausmerkkien väliin. Heittomerkin saat enter-näppäimen vierestä (samassa näppäimessä kuin tähti eli asteriski).
import pandas as pd
df = pd.read_excel('https://taanila.fi/data1.xlsx')
Pandas-paketissa on määritelty dataframe-niminen tietorakenne, jota voit hyvin pitää Excel-taulukon vastineena. Edellä avattu data-olio df on dataframe.
Käsky df
näyttää datan ensimmäisimmät ja viimeisimmät rivit.
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
Dataframe-oliolla on lukuisia ominaisuuksia ja funktioita, joista jatkossa esimerkkejä. Huomaa, että
# shape-ominaisuus sisältää rivien ja sarakkeiden lukumäärät
df.shape
(82, 16)
# info-funktio tulostaa tietoja datan sarakkeista
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
Yllä näkyvästä tulosteesta selviää, että tässä dataframessa on int64 eli kokonaislukutyyppistä tietoa ja float64 eli liukulukutyyppistä tietoa. Liukulukuja voit ajatella desimaalilukuina.
Jos sarakkeessa olisi tekstimuotoista tietoa, niin se näyttäytyisi object-tyyppinä.
# unique-funktio tulostaa sarakkeen ainutkertaiset arvot (järjestys tulee datasta)
df['ikä'].unique()
array([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], dtype=int64)
Datalle on helppo tehdä erilaisia suodatuksia. Dataframen sarakkeeseen voin viitata kirjoittamalla sarakkeen nimen hakasulkujen sisään, esimerkiksi df['palkka']
. Suodatuksissa voin käyttää
# 30-vuotiaat
df[df['ikä']==30]
nro | sukup | ikä | perhe | koulutus | palveluv | palkka | johto | työtov | työymp | palkkat | työteht | työterv | lomaosa | kuntosa | hieroja | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2 | 3 | 1 | 30 | 1 | 1.0 | 7.0 | 1989 | 3 | 4.0 | 1 | 1 | 3 | 1.0 | NaN | NaN | NaN |
38 | 39 | 1 | 30 | 1 | 2.0 | 10.0 | 2300 | 3 | 5.0 | 3 | 3 | 4 | NaN | NaN | NaN | NaN |
43 | 44 | 1 | 30 | 1 | 2.0 | 7.0 | 2223 | 2 | 3.0 | 4 | 1 | 3 | 1.0 | NaN | NaN | 1.0 |
# Ne joiden koulutus ei ole 1 ja palkka on korkeintaan 1700 (huomaa sulkumerkit)
df[(df['koulutus']!=1) & (df['palkka']<=1700)]
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 |
75 | 76 | 1 | 37 | 1 | 2.0 | 15.0 | 1598 | 1 | 5.0 | 1 | 1 | 1 | 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 |
# Yli 50-vuotiaat alle 2000 palkalla (huomaa sulkumerkit)
df[(df['ikä']>50) & (df['palkka']<2000)]
nro | sukup | ikä | perhe | koulutus | palveluv | palkka | johto | työtov | työymp | palkkat | työteht | työterv | lomaosa | kuntosa | hieroja | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
45 | 46 | 2 | 51 | 2 | 1.0 | 28.0 | 1989 | 3 | 3.0 | 2 | 2 | 3 | 1.0 | NaN | NaN | 1.0 |
62 | 63 | 2 | 51 | 2 | 2.0 | 10.0 | 1872 | 4 | 3.0 | 2 | 2 | 3 | 1.0 | NaN | NaN | NaN |
# Ne, jotka eivät ole käyttäneet työterveyshuoltoa ja joiden palkka alle 2000
df[~(df['työterv']==1) & (df['palkka']<2000)]
nro | sukup | ikä | perhe | koulutus | palveluv | palkka | johto | työtov | työymp | palkkat | työteht | työterv | lomaosa | kuntosa | hieroja | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
46 | 47 | 2 | 22 | 1 | 3.0 | 21.0 | 1872 | 3 | 3.0 | 4 | 1 | 3 | NaN | NaN | 1.0 | NaN |
77 | 78 | 1 | 22 | 1 | 3.0 | 0.0 | 1598 | 4 | 4.0 | 4 | 3 | 4 | NaN | 1.0 | 1.0 | NaN |
Funktioille voidaan antaa lisätietoa parametreinä. Esimerkiksi nsmallest-funktiolle mahdolliset parametrit löytyvät funktion ohjesivulta https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.nsmallest.html. Jos annat parametrien arvot funktion ohjesivun mukaisessa järjestyksessä, niin parametreja ei tarvitse nimetä. Parametrien nimeäminen on kuitenkin hyvä tapa. Esimerkiksi seuraavassa solussa voisin käyttää nimettyjä parametreja: df.nsmallest(n=3, columns='palkka')
Terminologiaa: n ja columns ovat nsmallest-funktion parametrejä, joille voidaan antaa arvo. Parametrille annettavaa arvoa kutsutaan argumentiksi. Seuraavassa 3 on parametrin n arvo eli argumentti.
# Rivit, joilla kolmen pienintä palkkaa
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 |
# Rivit, joilla viisi korkeinta ikää
df.nlargest(5, 'ikä')
nro | sukup | ikä | perhe | koulutus | palveluv | palkka | johto | työtov | työymp | palkkat | työteht | työterv | lomaosa | kuntosa | hieroja | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
56 | 57 | 1 | 61 | 2 | 2.0 | 36.0 | 3119 | 2 | NaN | 2 | 1 | 5 | 1.0 | NaN | NaN | 1.0 |
32 | 33 | 1 | 59 | 2 | 3.0 | 15.0 | 6278 | 4 | 4.0 | 5 | 4 | 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 |
27 | 28 | 2 | 56 | 1 | 1.0 | 15.0 | 2223 | 3 | 4.0 | 3 | 2 | 4 | 1.0 | NaN | NaN | 1.0 |
36 | 37 | 2 | 56 | 2 | 2.0 | 17.0 | 2729 | 5 | 5.0 | 5 | 5 | 5 | NaN | NaN | NaN | 1.0 |
Describe-funktio laskee tilastolliset tunnusluvut:
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 |
# palkan tunnusluvut
df['palkka'].describe()
count 82.000000 mean 2563.878049 std 849.350302 min 1521.000000 25% 2027.000000 50% 2320.000000 75% 2808.000000 max 6278.000000 Name: palkka, dtype: float64
Seuraavassa sijoitan crosstab-funktion antaman tuloksen df1-nimisen muuttujan arvoksi. Tällöin tulosta ei näytetä ellen anna erikseen käskyä df1
.
Lisätietoa crosstab-funktion parametreista https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.crosstab.html
df1 = pd.crosstab(df['koulutus'], 'f')
df1
col_0 | f |
---|---|
koulutus | |
1.0 | 27 |
2.0 | 30 |
3.0 | 22 |
4.0 | 2 |
Crosstab laskee frekvenssit eli esiintymiskertojen lukumäärät. Esimerkiksi koulutuksen 1 on suorittanut 27 henkilöä.
Crosstab-funktion tuottama taulukko on dataframe kuten alkuperäinen datakin. Dataframe koostuu aina kolmesta osasta:
Yllä indeksinä ovat koulutus-sarakkeessa esiintyneet arvot 1, 2, 3 ja 4. Sarakeotsikoina on ainoastaan f (minulla on tapana käyttää f:ää frekvenssin tunnuksena). Indeksillä on nimi (koulutus) ja sarakeotsikoilla on nimi (col_0).
# Vaihdan sarakeotsikoiden nimeksi tyhjän merkkijonon (peräkkäiset heittomerkit)
df1.columns.name = ''
df1
f | |
---|---|
koulutus | |
1.0 | 27 |
2.0 | 30 |
3.0 | 22 |
4.0 | 2 |
Lista on Pythonin tietorakenne, joka kirjoitetaan hakasulkujen sisään. Seuraavassa määrittelen listan ja sijoitan sen dataframen indeksiin (index).
koulutus = ['Peruskoulu', '2. aste', 'Korkeakoulu', 'Ylempi korkeakoulu']
df1.index = koulutus
df1
f | |
---|---|
Peruskoulu | 27 |
2. aste | 30 |
Korkeakoulu | 22 |
Ylempi korkeakoulu | 2 |
Jos viittaan sarakkeeseen, jota ei ole vielä olemassa, niin sellainen luodaan. Seuraavassa luon sarakkeen, johon lasken prosentit.
# Havaintojen lukumäärä
n = df1['f'].sum()
# Lisään %-sarakkeen
df1['%'] = df1['f']/n*100
df1
f | % | |
---|---|---|
Peruskoulu | 27 | 33.333333 |
2. aste | 30 | 37.037037 |
Korkeakoulu | 22 | 27.160494 |
Ylempi korkeakoulu | 2 | 2.469136 |
Uuden rivin luomiseksi viittaan uuteen riviin loc-ominaisuudella. Seuraavassa lasken sum-funktiolla Yhteensä-rivin.
df1.loc['Yhteensä'] = df1.sum()
df1
f | % | |
---|---|---|
Peruskoulu | 27.0 | 33.333333 |
2. aste | 30.0 | 37.037037 |
Korkeakoulu | 22.0 | 27.160494 |
Ylempi korkeakoulu | 2.0 | 2.469136 |
Yhteensä | 81.0 | 100.000000 |
VAROITUS! Kokeile mitä tapahtuu Yhteensä-rivillä, jos suoritat yllä olevan solun uudelleen? Tämän jälkeen kannattaa suorittaa kaikki muistion solut uudelleen Cell-valikon komennolla Run All.
Yllä mainitun varoituksen mukaisen vaaran voit välttää käyttämällä df1.sum()
sijasta df1.loc['Peruskoulu':'Ylempi korkeakoulu'].sum()
Crosstab-funktiolla voin laskea myös ristiintaulukoinnin. Seuraavassa lasken koulutuksen ja sukupuolen välisen ristiintaulukoinnin.
df2 = pd.crosstab(df['koulutus'], df['sukup'])
df2
sukup | 1 | 2 |
---|---|---|
koulutus | ||
1.0 | 22 | 5 |
2.0 | 23 | 7 |
3.0 | 15 | 7 |
4.0 | 2 | 0 |
Voin sijoittaa koulutuksen tekstimuotoiset arvot (aiemmin määrittelemäni lista) indeksiin. Luon myös sukupuoli-listan ja sijoitan sen arvot sarakeotsikoihin.
sukupuoli = ['Mies', 'Nainen']
df2.index = koulutus
df2.columns = sukupuoli
df2
Mies | Nainen | |
---|---|---|
Peruskoulu | 22 | 5 |
2. aste | 23 | 7 |
Korkeakoulu | 15 | 7 |
Ylempi korkeakoulu | 2 | 0 |
Dataframen indeksille voin antaa nimen. Samoin sarakeotsikoille voin antaa nimen.
df2.index.name = 'Koulutus'
df2.columns.name = 'Sukupuoli'
df2
Sukupuoli | Mies | Nainen |
---|---|---|
Koulutus | ||
Peruskoulu | 22 | 5 |
2. aste | 23 | 7 |
Korkeakoulu | 15 | 7 |
Ylempi korkeakoulu | 2 | 0 |
Listan ohella sanakirja (dictionary) on toinen keskeinen pythonin tietorakenne. Sanakirja kirjoitetaan aaltosulkujen sisään ja se koostuu pareista. Parin jäsenet erotetaan toisistaan kaksoispisteellä.
Seuraavassa käytän sanakirjaa rename-funktion yhteydessä kahden muuttujan (sarakkeen) uudelleen nimeämiseen.
df = df.rename(columns={'sukup':'sukupuoli', 'palveluv':'palveluvuodet'})
# Tarkistan onnistuiko uudelleen nimeäminen
df.columns
Index(['nro', 'sukupuoli', 'ikä', 'perhe', 'koulutus', 'palveluvuodet', 'palkka', 'johto', 'työtov', 'työymp', 'palkkat', 'työteht', 'työterv', 'lomaosa', 'kuntosa', 'hieroja'], dtype='object')
VAROITUS! Jos muuttujien uudelleen nimeämisen jälkeen palaat sellaiseen aiempaan soluun, jossa viitataan sukup- tai palveluv-muuttujaan, niin solun suorittaminen tuottaa virheilmoituksen. Tällaisessa tilanteessa kannattaa suorittaa kaikkien solujen koodit uudelleen Cell-valikon komennolla Run All
# Indeksin järjestyksen vaihtaminen reindex-funktiolla
df2.reindex(['Peruskoulu', 'Ylempi korkeakoulu', 'Korkeakoulu', '2. aste'])
Sukupuoli | Mies | Nainen |
---|---|---|
Koulutus | ||
Peruskoulu | 22 | 5 |
Ylempi korkeakoulu | 2 | 0 |
Korkeakoulu | 15 | 7 |
2. aste | 23 | 7 |
Huomaa, että uusi järjestys ei tallennu dataframeen ellen varta vasten sijoita sitä df2:n arvoksi!
# Sarakkeiden järjestyksen vaihtamiseksi annan axis-parametrille arvon 1
df2.reindex(['Nainen', 'Mies'], axis=1)
Sukupuoli | Nainen | Mies |
---|---|---|
Koulutus | ||
Peruskoulu | 5 | 22 |
2. aste | 7 | 23 |
Korkeakoulu | 7 | 15 |
Ylempi korkeakoulu | 0 | 2 |
# Indeksin siirtäminen pois indeksistä; tilalle oletusindeksi 0, 1,...
df2 = df2.reset_index()
df2
Sukupuoli | Koulutus | Mies | Nainen |
---|---|---|---|
0 | Peruskoulu | 22 | 5 |
1 | 2. aste | 23 | 7 |
2 | Korkeakoulu | 15 | 7 |
3 | Ylempi korkeakoulu | 2 | 0 |
# Koulutuksen palauttaminen indeksiin
df2 = df2.set_index('Koulutus')
df2
Sukupuoli | Mies | Nainen |
---|---|---|
Koulutus | ||
Peruskoulu | 22 | 5 |
2. aste | 23 | 7 |
Korkeakoulu | 15 | 7 |
Ylempi korkeakoulu | 2 | 0 |
Loc-ominaisuudella voin viitata datan "viipaleisiin" indeksin arvoja ja sarakeotsikoita käyttäen.
# Kuinka monta 2. asteen koulutuksen suorittanutta miestä?
df2.loc['2. aste', 'Mies']
23
Pelkkä kaksoispiste tarkoittaa kaikkia rivejä tai kaikkia sarakkeita.
# df2:n 'Nainen'-sarakkeen kaikki rivit
df2.loc[:, 'Nainen']
Koulutus Peruskoulu 5 2. aste 7 Korkeakoulu 7 Ylempi korkeakoulu 0 Name: Nainen, dtype: int64
Edellä dataa on vain yhdessä sarakkeessa ja sen vuoksi tulos ei ole tyypiltään dataframe, vaan series. Voin kuitenkin vaihtaa tuloksen dataframeksi.
df2.loc[:, 'Nainen'].to_frame()
Nainen | |
---|---|
Koulutus | |
Peruskoulu | 5 |
2. aste | 7 |
Korkeakoulu | 7 |
Ylempi korkeakoulu | 0 |
# Kaikki sarakkeet, mutta koulutuksesta jätetään Ylempi korkeakoulu pois
df2.loc['Peruskoulu':'Korkeakoulu', :]
Sukupuoli | Mies | Nainen |
---|---|---|
Koulutus | ||
Peruskoulu | 22 | 5 |
2. aste | 23 | 7 |
Korkeakoulu | 15 | 7 |
Luokkarajojen määrittämistä varten tarkistan pienimmän ja suurimman iän.
df['ikä'].describe()
count 82.000000 mean 37.951220 std 9.773866 min 20.000000 25% 31.000000 50% 37.500000 75% 44.000000 max 61.000000 Name: ikä, dtype: float64
Voin muodostaa luokkia pandas-kirjaston cut-funktiolla. Ensin määritän luokkarajat listana ja annan listan bins-parametrin arvoksi.
bins = [19, 29, 39, 49, 59, 69]
df['ikäluokka'] = pd.cut(df['ikä'], bins=bins)
df
# Ikäluokat löytyvät viimeisestä sarakkeesta
nro | sukupuoli | ikä | perhe | koulutus | palveluvuodet | palkka | johto | työtov | työymp | palkkat | työteht | työterv | lomaosa | kuntosa | hieroja | ikäluokka | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 1 | 1 | 38 | 1 | 1.0 | 22.0 | 3587 | 3 | 3.0 | 3 | 3 | 3 | NaN | NaN | NaN | NaN | (29, 39] |
1 | 2 | 1 | 29 | 2 | 2.0 | 10.0 | 2963 | 1 | 5.0 | 2 | 1 | 3 | NaN | NaN | NaN | NaN | (19, 29] |
2 | 3 | 1 | 30 | 1 | 1.0 | 7.0 | 1989 | 3 | 4.0 | 1 | 1 | 3 | 1.0 | NaN | NaN | NaN | (29, 39] |
3 | 4 | 1 | 36 | 2 | 1.0 | 14.0 | 2144 | 3 | 3.0 | 3 | 3 | 3 | 1.0 | NaN | NaN | NaN | (29, 39] |
4 | 5 | 1 | 24 | 1 | 2.0 | 4.0 | 2183 | 2 | 3.0 | 2 | 1 | 2 | 1.0 | NaN | NaN | NaN | (19, 29] |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
77 | 78 | 1 | 22 | 1 | 3.0 | 0.0 | 1598 | 4 | 4.0 | 4 | 3 | 4 | NaN | 1.0 | 1.0 | NaN | (19, 29] |
78 | 79 | 1 | 33 | 1 | 1.0 | 2.0 | 1638 | 1 | 3.0 | 2 | 1 | 2 | 1.0 | NaN | NaN | NaN | (29, 39] |
79 | 80 | 1 | 27 | 1 | 2.0 | 7.0 | 2612 | 3 | 4.0 | 3 | 3 | 3 | 1.0 | NaN | 1.0 | NaN | (19, 29] |
80 | 81 | 1 | 35 | 2 | 2.0 | 16.0 | 2808 | 3 | 4.0 | 3 | 3 | 3 | NaN | NaN | NaN | NaN | (29, 39] |
81 | 82 | 2 | 35 | 2 | 3.0 | 15.0 | 2183 | 3 | 4.0 | 4 | 3 | 4 | 1.0 | NaN | NaN | NaN | (29, 39] |
82 rows × 17 columns
# Luokiteltu jakauma:
df3 = pd.crosstab(df['ikäluokka'], 'f')
df3.columns.name = ''
df3
f | |
---|---|
ikäluokka | |
(19, 29] | 17 |
(29, 39] | 30 |
(39, 49] | 23 |
(49, 59] | 11 |
(59, 69] | 1 |
Seuraavassa lasken palkalle tilastollisia tunnuslukuja koulutuksen määräämissä ryhmissä. Datan jakaminen ryhmiin sujuu groupby-funktiolla.
df4 = df.groupby('koulutus')['palkka'].describe()
# Aiemmin määritelty koulutus-lista sisältää koulutusten tekstimuotoiset arvot
df4.index = koulutus
df4
count | mean | std | min | 25% | 50% | 75% | max | |
---|---|---|---|---|---|---|---|---|
Peruskoulu | 27.0 | 2310.481481 | 473.108653 | 1638.0 | 2008.00 | 2144.0 | 2534.0 | 3587.0 |
2. aste | 30.0 | 2403.100000 | 533.984395 | 1521.0 | 2008.25 | 2378.5 | 2729.0 | 3510.0 |
Korkeakoulu | 22.0 | 2887.227273 | 1108.404384 | 1559.0 | 2222.25 | 2710.0 | 2925.0 | 6278.0 |
Ylempi korkeakoulu | 2.0 | 5147.000000 | 110.308658 | 5069.0 | 5108.00 | 5147.0 | 5186.0 | 5225.0 |
# Voin halutessani transponoida dataframen
df4.T
Peruskoulu | 2. aste | Korkeakoulu | Ylempi korkeakoulu | |
---|---|---|---|---|
count | 27.000000 | 30.000000 | 22.000000 | 2.000000 |
mean | 2310.481481 | 2403.100000 | 2887.227273 | 5147.000000 |
std | 473.108653 | 533.984395 | 1108.404384 | 110.308658 |
min | 1638.000000 | 1521.000000 | 1559.000000 | 5069.000000 |
25% | 2008.000000 | 2008.250000 | 2222.250000 | 5108.000000 |
50% | 2144.000000 | 2378.500000 | 2710.000000 | 5147.000000 |
75% | 2534.000000 | 2729.000000 | 2925.000000 | 5186.000000 |
max | 3587.000000 | 3510.000000 | 6278.000000 | 5225.000000 |
Merkkijono (string) kirjoitetaan heittomerkkien '' väliin (myös lainausmerkit "" käyvät). Merkkijonoja ovat esimerkiksi tiedostonimet, dataframen sarakeotsikot (muuttujien nimet), muuttujien tekstimuotoiset arvot. Huomaa kuitenkin, että Pythonin muuttujien nimiä ei kirjoitetan heittomerkkien väliin (esimerkiksi df, n jne.)
Paketin tuonti import-toiminnolla; esimerkkinä pandas-paketin tuonti
Pythonin tietorakenne lista, joka kirjoitetaan hakasulkujen sisään
Pythonin tietorakenne sanakirja (dictionary), joka kirjoitetaan aaltosulkujen sisään
Pandas-kirjaston tietorakenteet dataframe ja series
pd.read_excel() datan lukeminen Excel-tiedostosta
df.shape datan rivien ja sarakkeiden lukumäärät
df.info() arvojen lukumäärät ja tietotyypit
df.describe() tilastolliset tunnusluvut
df.nsmallest() n pienintä nimetyn sarakkeen suhteen
df.nlargest() n suurinta nimetyn sarakkeen suhteen
df[].unique() nimetyn sarakkeen ainutkertaisten arvojen luettelo
pd.crosstab() lukumäärä- ja prosenttiyhteenvedot
df.columns sarakeotsikot
df.index riviotsikot
df.columns.name sarakeotsikoiden nimi
df.index.name riviotsikoiden nimi
df.rename() sarakeotsikoiden uudelleen nimeämiseen
df.reindex() sarkeotsikoiden tai indeksin uudelleen järjestäminen
df.reset_index() indeksin siirtäminen tavalliseksi sarakkeeksi (tilalle oletusindeksi)
df.set_index() sarakkeen siirtäminen indeksiin
df.loc[] viittaaminen dataframen "viipaleeseen"
df.to_frame() series dataframeksi
pd.cut() arvojen luokittelu
df.groupby() ryhmittely
df.T dataframen transponointi (rivien ja sarakkeiden vaihtaminen päittäin)
Virhetilanteissa auttaa usein koodisolujen suoritus uudelleen Cell-valikon komennolla Run All. Jos avaat aiemmin aloittamasi muistion, niin ensimmäiseksi kannattaa suorittaa koodisolut Cell-valikon komennolla Run All
Data-analytiikka Pythonilla https://tilastoapu.wordpress.com/python/