Datan tutkiminen Pythonilla
Voit ladata materiaalin tästä Jupyter Notebookina
Datan käsitteleminen Pythonilla
Python on kieli, jota on alunperin käytetty skriptaamiseen eli luomaan koodia, joka suorittaa pieniä tehtäviä tietokoneella. Nykyisin Pythonia voidaan käyttää skriptaamisen lisäksi myös web-ohjelmointiin ja data science -tekemiseen, joten se on hyvin monipuolinen kieli.
Python ei itsessään ole tehokas ohjelmointikieli, mutta sen tarjoamat kirjastot datan käsittelyyn pohjautuvat C-ohjelmointikieleen, mikä nopeuttaa ohjelmien suoritusaikaa suurilla datamassoilla. Lisäksi se on helpompi yhdistää olemassa oleviin järjestelmiin monipuolisuutensa ansiosta ja saattaa olla helpompi ottaa käyttöön jo valmiiksi ohjelmointia osaaville. Pythonin lisäksi R on suosittu.
Pandas
Pandas on kirjasto, jota käytetään usein datan tutkimiseen ja siivoamiseen. Se on toteutettu C-ohjelmointikielellä, mikä tekee siitä suoritusajaltaan tehokkaan. Se tarjoaa hyvät tietorakenteet datan käsittelyyn ja sisältää monia hyviä funktioita, jotka tekevät ohjelmoinnista nopeaa ja mutkatonta. Pandasin tietorakenteista käytetyimpiä ovat Dataframe ja Series -tietorakenteet. Pandasin tietotyypit eroavat myös hieman Pythonin perinteisistä tietotyypeistä.
Python | Pandas | Merkitys |
---|---|---|
str | object | Teksti |
int | int64 | Kokonaisluku |
float | float64 | Liukuluku |
bool | bool | Totuusarvo |
datetime | datetime64 | Päivämäärä kellonajalla |
datetime.timedelta | timedelta | Kuvaa päiviä, tunteja, minuutteja, sekunteja |
Ei ole Pythonissa | category | Kategoria |
Series
Series on rivi, jolla on otsikot. Yksi Series voi sisältää eri tyyppistä dataa ja otsikoihin viitataan nimellä index. Seriesin voi luoda dictionarysta, ndarraysta tai skalaarista.
import pandas as pd
import numpy as np
#Dictonary, keys define indeces in Series
dict_data={'A': 1, 'B': 2, 'C':3}
dict_series=pd.Series(dict_data)
print(dict_series)
A 1
B 2
C 3
dtype: int64
## ndarray, we need to define indeces separately
array_data=np.random.random(3)
indeces=['A', 'B', 'C']
array_series=pd.Series(array_data, index=indeces)
print(array_series)
A 0.301430
B 0.786559
C 0.777387
dtype: float64
indeces=['A', 'B', 'C']
scalar_series=pd.Series(3, index=indeces)
print(scalar_series)
A 3
B 3
C 3
dtype: int64
Mitä tapahtuu, jos datan arvojen tyyppejä vaihdetaan? Jos esimerkiksi dictionaryn arvoista johonkin vaihdetaan merkkijono? Entä jos index-taulukossa on enemmän arvoja kuin dictionaryssa? KOKEILLAAN!
Dataframe
Dataframe on matriisin kaltainen tietorakenne. Siinä on siis rivejä ja sarakkeita, ja sarakkeilla on otsikot. Eri sarakkeissa voi olla eri tyyppistä dataa, mutta yhdessä sarakkeessa olevat arvot tulisi olla aina samantyyppisiä. Dataframen voi ajatella olevan kuin suuri joukko Series-rivejä, joilla on yhteinen otsikko. Monet Dataframen funktiot palauttavatkin Series-rivin.
Dataframen voi luoda esimerkiksi
- dictionarysta, joka sisältää yksiulotteisia ndarrayta, listoja, dictionaryja tai Series-rivejä
- kaksiulotteisesta Numpyn ndarraysta
- toisesta Dataframesta
Tässä tapauksessa ne eivät ole kiinnostavia, koska data luetaan yleensä tiedostosta tai tietokannasta. Datan voi lukea csv-tiedostosta dataframeen käyttämällä pandasin funktiota read_csv:
df=pd.read_csv('path/to/file.csv')
Datan importtaaminen ja tutkiminen
Luetaan ensin data sisään tiedostosta. Kyseinen tiedosto sisältää keinotekoista dataa, ja voit luoda sen itsellesi ajamalla tietokoneellasi tämän Jupyter Notebookin .
df=pd.read_csv('generated_dataset.csv', sep=';')
df on muuttuja, johon tieto tallennetaan ja read_csv funktiolle annetaan parametriksi tässä tapauksessa tiedoston sijainti ja mitä erotinmerkkiä tiedostossa on käytetty. Valinnaisia parametreja on enemmänkin, esimerkiksi jos vain osa sarakkeista tai riveistä haluttaisiin lukea.
Tutkitaan seuraavaksi, kuinka monta riviä ja saraketta datasetissä on. Tämä tieto saadaan DataFramen shape-attribuutista.
df.shape
(1000, 7)
Data sisältää siis 1000 riviä ja 7 saraketta. Haetaan seuraavaksi datan n ensimmäistä riviä kutsumalla funktiota head. Funktio ottaa parametriksi rivien lukumäärän n, joka halutaan hakea. Jos mitään parametriä ei anneta, haetaan 5 riviä.
df.head(10)
Student_id | First_name | Last_name | Points | Enrolled | Age | Gender | |
---|---|---|---|---|---|---|---|
0 | 10000 | Pertti | Sanchez | 265 | 0 | 35.0 | Female |
1 | 10001 | Emily | Atkins | 17 | 1 | 30.0 | NaN |
2 | 10002 | Sanna | Atkins | 291 | 1 | 32.0 | Female |
3 | 10003 | Outi | Sanchez | 273 | 1 | 35.0 | Female |
4 | 10004 | Dina | Smith | 273 | 0 | 34.0 | Female |
5 | 10005 | Liisa | Nieminen | 245 | 0 | 35.0 | Female |
6 | 10006 | Liisa | Virtanen | 230 | 0 | NaN | Female |
7 | 10007 | Dina | Laine | 285 | 0 | 28.0 | Other |
8 | 10008 | Emily | Ruiz | 215 | 1 | 25.0 | Other |
9 | 10009 | Pertti | Smith | 241 | 1 | 38.0 | Other |
Seuraavaksi tutkitaan, mitä datatyyppejä datasetti sisältää. Se tieto saadaan DataFramen dtypes-attribuutista.
df.dtypes
Student_id int64
First_name object
Last_name object
Points int64
Enrolled int64
Age float64
Gender object
dtype: object
Tarkastellaan, millaisia arvoja numeeriset sarakkeet saavat.
df.describe()
Student_id | Points | Enrolled | Age | |
---|---|---|---|---|
count | 1000.000000 | 1000.000000 | 1000.000000 | 952.000000 |
mean | 10499.500000 | 154.029000 | 0.488000 | 33.381303 |
std | 288.819436 | 85.183381 | 0.500106 | 6.236370 |
min | 10000.000000 | 0.000000 | 0.000000 | 16.000000 |
25% | 10249.750000 | 85.750000 | 0.000000 | 29.000000 |
50% | 10499.500000 | 153.000000 | 0.000000 | 33.000000 |
75% | 10749.250000 | 228.250000 | 1.000000 | 37.000000 |
max | 10999.000000 | 300.000000 | 1.000000 | 55.000000 |
Ja myös kategorisia muuttujia voidaan tarkastella, luettelemalla niiden kaikki arvot ja määrät:
df['Gender'].value_counts()
Male 329
Other 316
Female 303
Name: Gender, dtype: int64
Aiemmasta taulukosta, jossa näytetään ensimmäisen 5 rivin tietoja, näkyy ‘NaN’-arvoja. Haluamme seuraavaksi tutkia, kuinka monta puuttuvaa arvoa eri sarakkeista löytyy.
df.isna().sum()
Student_id 0
First_name 0
Last_name 0
Points 0
Enrolled 0
Age 48
Gender 52
dtype: int64
Mietitäänpä tarkemmin mitä ylempänä tapahtuu. df on DataFrame-tyyppinen muuttuja. DataFramella on funktio isna. joka palauttaa uuden DataFramen, joka sisältää jokaiselle arvolle DataFramessa tiedon siitä, onko kyseessä puuttuva arvo. Isna-funktion palauttamalle DataFramelle voidaan kutsua sum-funktiota, joka tässä tapauksessa laskee yhteen sarakkeessa esiintyvien True-arvojen määrän. Jos sarakkeissa olisi lukuja, se laskisi niiden summan.
Seuraavaksi voidaan tehdä muutama harjoitus. Se tapahtuu lataamalla omalle tietokoneelle tämä Jupter Notebook. Tähän teoriaosuuteen liittyy kyseisen notebookin osio 1.