58 Andmetega tutvumine ja nende puhastamine

Enne andmete analüüsimist, tuleks andmetest saada ülevaade, sest sageli on töödeldavad andmetabelid väga suured ning nende manuaalne ülevaatamine on liiga ajamahukas. Pandas pakub andmete esmaseks ülevaateks mitmeid võimalusi.

 

Esimene tegevus, mida andmetabeliga teha, on teada saada kui suur on tabel ehk kui palju on selles ridu ja veerge. Selleks saab kasutada funktsiooni shape, mis tagastab kaheelemendilise enniku, kus esimene element on ridade arv ja teine veergude arv. Loeme kasvuhoonegaaside tabeli veebist, kus on andmed Euroopa riikide gaaside kogusest iga elaniku kohta vahemikus 1990-2018.

 

import pandas as pd

# Andmed
url = 'http://kodu.ut.ee/~merka123/plotly/kasvuhoonegaasid.csv'

csv = pd.read_csv(url, encoding='UTF-8', sep=';')

# Uurime, mitu veergu ja rida on selles tabelis.
print(csv.shape)
>>> %Run guido.py
  (33, 31)

Näeme, et tabelis on 33 rida ja 31 veergu. Järgmisena vaatame andmeid tabelis. Selleks, et mitte tervet tabelit väljastada, saab kasutada funktsioone head, mis tagastab read tabeli algusest, ja tail, mis tagastab read tabeli lõpust. Kuvame tabeli esimesed viis rida ja kümme viimast rida. Mõlemale funktsioonile võib anda argumendiks kuvatavate ridade arv, vaikimisi kuvatakse viis rida.

print(csv.head())
print(csv.tail(10))
>>> %Run guido.py
  GEO (Codes)                                      GEO (Labels)  ...  2017  2018
0          BE                                           Belgium  ...  10.8  10.8
1          BG                                          Bulgaria  ...   8.8   8.3
2          CZ                                           Czechia  ...  12.4  12.2
3          DK                                           Denmark  ...   8.9   8.9
4          DE  Germany (until 1990 former territory of the FRG)  ...  11.2  10.7

[5 rows x 31 columns]
   GEO (Codes)    GEO (Labels)  1990  1991  1992  ...  2014  2015  2016  2017  2018
23          SI        Slovenia   9.3   8.7   8.7  ...   8.1   8.2   8.6   8.4   8.5
24          SK        Slovakia  13.9  12.1  11.0  ...   7.6   7.7   7.8   8.0   8.0
25          FI         Finland  14.5  14.0  13.6  ...  11.1  10.4  10.9  10.4  10.7
26          SE          Sweden   8.5   8.4   8.3  ...   5.8   5.7   5.6   5.5   5.4
27          UK  United Kingdom  14.1  14.3  13.9  ...   8.7   8.3   7.9   7.7   7.5
28          IS         Iceland  15.5  14.5  13.9  ...  16.1  16.6  16.9  17.4  17.5
29          LI   Liechtenstein   8.0   8.1   8.0  ...   5.4   5.3   5.0   5.1   4.8
30          NO          Norway  12.3  11.7  11.2  ...  10.8  10.8  10.5  10.2  10.1
31          CH     Switzerland   8.5   8.7   8.6  ...   6.6   6.5   6.4   6.3   6.1
32          TR          Turkey   3.9   4.0   4.0  ...   6.1   6.2   6.4   6.7   6.5

[10 rows x 31 columns]

Näeme, et esimeses veerus on riikide kahetähelised koodid, teises on riikide nimed ja ülejäänud veergudes on kasvuhoonegaaside kogused elaniku kohta aasta järgi.

Kuna loeme andmed tekstifailist, siis on oluline üle vaadata ka veergude andmetüübid. Üldiselt oskab Pandas ise määrata õiged andmetüübid, kuid igaks juhuks tasuks kontrollida. Selleks kasutame funktsiooni dtypes.

print(csv.dtypes)
>>> %Run guido.py
  GEO (Codes)      object
  GEO (Labels)     object
  1990            float64
  1991            float64
  1992            float64
  1993            float64
  1994            float64
  1995            float64
  1996            float64
  1997            float64
  1998            float64
  1999            float64
  2000            float64
  2001            float64
  2002            float64
  2003            float64
  2004            float64
  2005            float64
  2006            float64
  2007            float64
  2008            float64
  2009            float64
  2010            float64
  2011            float64
  2012            float64
  2013            float64
  2014            float64
  2015            float64
  2016            float64
  2017            float64
  2018            float64
  dtype: object

Andmetüübid on õiged. Ühtlasi nägime ka andmetabeli veergude pealkirju.

Järgmisena kontrollime, kas andmetes on puuduvaid või tundmatuid väärtusi. Kasutame isna funktsiooni, mis tagastab tabeli, kus on tõeväärtused, vastavalt, kas väärtus on NaN või mitte.

print(csv.isna())
>>> %Run guido.py
      GEO (Codes)  GEO (Labels)   1990   1991  ...   2015   2016   2017   2018
  0         False         False  False  False  ...  False  False  False  False
  1         False         False  False  False  ...  False  False  False  False
  2         False         False  False  False  ...  False  False  False  False
  3         False         False  False  False  ...  False  False  False  False
  4         False         False  False  False  ...  False  False  False  False
  5         False         False  False  False  ...  False  False  False  False
  6         False         False  False  False  ...  False  False  False  False
  7         False         False  False  False  ...  False  False  False  False
  ....

Näeme, et tervet tabelit ei väljastata ja manuaalselt üle vaadata, kas mõnes veerus on puuduvaid väärtusi, on tülikas. Selleks, et loendada, kui palju on puuduvaid väärtusi veergudes, saab kasutada sum funktsiooni, mis oskab ka tõeväärtusi liita, kus True on 1 ja False on 0. Kasutame sum funktsiooni koos isna funktsiooniga.

print(csv.isna().sum())
>>> %Run guido.py
  GEO (Codes)     0
  GEO (Labels)    0
  1990            0
  1991            0
  1992            0
  1993            0
  1994            0
  1995            0
  1996            0
  1997            0
  1998            0
  1999            0
  2000            0
  2001            0
  2002            0
  2003            0
  2004            0
  2005            0
  2006            0
  2007            0
  2008            0
  2009            0
  2010            0
  2011            0
  2012            0
  2013            0
  2014            0
  2015            0
  2016            0
  2017            0
  2018            0
  dtype: int64

Näeme, et veergudes ei ole ühtegi puuduvat väärtust, sest kõikide veergude summa on 0.

Järgmisena teeme esmase analüüsi kogu tabelile, kus leiame veergude aritmeetilise keskmise, standardhälbe, maksimaalse ja minimaalse väärtuse, ülemise, alumise ja keskmise kvartiili. Kõik need karakteristikuid kasutatakse andmete iseloomustamiseks. Pandase moodulis on funktsioon describe, mille abil saame kõik eelnevalt nimetatud karakteristikud korraga leida.

print(csv.describe())
>>> %Run guido.py
              1990       1991       1992  ...       2016       2017       2018
  count  33.000000  33.000000  33.000000  ...  33.000000  33.000000  33.000000
  mean   12.427273  12.136364  11.451515  ...   9.209091   9.321212   9.193939
  std     5.775123   5.857037   5.416302  ...   3.505742   3.533125   3.541093
  min     3.900000   4.000000   4.000000  ...   5.000000   5.100000   4.800000
  25%     9.100000   8.700000   8.300000  ...   6.400000   6.700000   6.600000
  50%    11.100000  10.700000   9.800000  ...   8.400000   8.400000   8.300000
  75%    14.500000  14.500000  13.900000  ...  10.900000  11.000000  10.800000
  max    34.400000  35.600000  34.500000  ...  19.800000  20.000000  20.300000

  [8 rows x 29 columns]

Näeme, et arvutused tehti ainult nende veergudega, milles on arvud ja lisatud on ka väärtuste loendus iga veeru kohta (count). Järgnevas tabelis on selgitatud väljastatud karakteristikuid.

Väljund Karakteristik Selgitus
mean Aritmeetiline keskmine Väärtuste summa jagatud nende koguarvuga.
std Standardhälve Hajuvuskarakteristik, mis näitab tunnuse hajuvust (mida suurem, seda suurem on tunnuse hajuvus keskmisest).
min Minimaalne väärtus Väikseim väärtus
25% Alumine kvartiil Väärtus, millest väiksemaid või võrdseid väärtusi on ligikaudu 25%.
50% Keskmine kvartiil ehk mediaan Väärtus, millest suuremaid ja väiksemaid väärtusi on variatsioonireas ligikaudu võrdselt.
75% Ülemine kvartiil Väärtus, millest suuremaid või võrdseid väärtusi on ligikaudu 25%.
max Maksimaalne väärtus Suurim väärtus

Üldiselt võime näha, et kasvuhoonegaaside kogused on aastate jooksul vähenenud. Selle järelduse iseloomustamiseks teeme joondiagrammi Eesti kasvuhoonegaaside koguste kohta 1990-2018. Joonise tegemiseks kasutame Matplotlibi moodulit.

import pandas as pd
import matplotlib.pyplot as plt

# Andmed
url = 'http://kodu.ut.ee/~merka123/plotly/kasvuhoonegaasid.csv'

csv = pd.read_csv(url, encoding='UTF-8', sep=';')

# Leiame tabelist Eesti andmetega rea, tagastatakse ühe reaga andmefreim
eesti_andmed = csv.loc[csv['GEO (Labels)'] == 'Estonia']

# Eraldame Eesti andmetes ainult arvulised andmed
eesti_aastad = eesti_andmed.iloc[:, 2:32]

# Valime andmed tabelist, kus on ainult Eesti arvulised andmed
eesti_aastad.iloc[0].plot.line()

# Joonise kuvamiseks peab kasutama show() Matplotlib moodulist
plt.show()

Lisame juurde ka telgedele ja diagrammile pealkirjad, muudame ka joone värvi.

import pandas as pd
import matplotlib.pyplot as plt

# Andmed
url = 'http://kodu.ut.ee/~merka123/plotly/kasvuhoonegaasid.csv'

csv = pd.read_csv(url, encoding='UTF-8', sep=';')

eesti_andmed = csv.loc[csv['GEO (Labels)'] == 'Estonia']


eesti_aastad = eesti_andmed.iloc[:, 2:32]

eesti_aastad.iloc[0].plot.line(xlabel="Aastad",
                               ylabel="Kasvuhoonegaaside kogus, tonni elaniku kohta",
                               title="Kasvuhoonegaaside kogused Eestis 1990-2018",
                               color='#FF7F50')

# Joonise kuvamiseks peab kasutama show() Matplotlib moodulist
plt.show()

Teeme eelmise andmetabeli põhjal ka kaardi euroopa riikide kasvuhoonegaaside koguste kohta. Selleks kasutame Plotly moodulit.

import pandas as pd
import plotly.express as px

# Andmed
url = 'http://kodu.ut.ee/~merka123/plotly/kasvuhoonegaasid.csv'

csv = pd.read_csv(url, encoding='UTF-8', sep=';')

# locationmode -> riik kaardil ja andmed ühendatakse riigi nime järgi
# location -> veerg, kus saadakse riikide nimed
# color -> andmete veerg
# hover_name -> riikide nimesid kuvatakse hiirega riigile liikumisel
# color_continuous_scale -> värvipaleti määramine
# scope -> kuvatakse ainult Euroopa riike kaardil
# labels -> muudame kuvatavate andmete pealkirju
# title -> kaardi pealkiri
kaart = px.choropleth(csv, locationmode='country names',
                      locations='GEO (Labels)',
                      color='2018',
                      hover_name="GEO (Labels)",
                      color_continuous_scale=px.colors.sequential.Pinkyl,
                      scope='europe',
                      labels={'2018': "Kasvuhoonegaasid, tonni elaniku kohta", 'GEO (Labels)': 'Riik'},
                      title="Kasvuhoonegaaside emissioon 2018")
kaart.show()
🌌 Joonise näide (klõpsa lingil): http://kodu.ut.ee/~merka123/plotly/kasvuhoonegaasid.html

Litsents

Icon for the Creative Commons Attribution 4.0 International License

Tarkvaraarendus. 2. trükk on loodud Eno Tõnisson, Tauno Palts, Kaarel Tõnisson, Heidi Meier, Merilin Säde, Ago Luberg, Birgy Lorenz, Einar Kivisalu, Meelis Antoi, ja Säde Mai Krusberg poolt Creative Commons Attribution 4.0 International License litsentsi alusel, kui pole teisiti märgitud.

Jaga seda raamatut