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.