Font size
  • A-
  • A
  • A+
Site color
  • R
  • A
  • A
  • A
Skip to main content
AI4VET AI4VET
  • Home
  • Calendar
  • More
You are currently using guest access
Log in
AI4VET
Home Calendar
Expand all Collapse all
  1. AI/ML Fundamentals
  2. AIML-SR
  3. 2. Mašinsko učenje (SR)
  4. Vežba 3: Eksplorativna analiza skupa podataka

Vežba 3: Eksplorativna analiza skupa podataka

Eksplorativna analiza skupa podataka

colab

Ova beležnica je dodatak lekciji o istraživačkoj analizi podataka. To će pokazati neke funkcionalnosti biblioteke Pandas koje se mogu koristiti u zadacima analize.

Biblioteka Pandas je biblioteka programskog jezika Pithon koja se koristi za rad sa tabelarnim podacima. Karakteriše ga veliki broj funkcija koje mogu olakšati i ubrzati rad i pružiti korisne informacije o skupu podataka. Da bismo mogli da koristite biblioteku Pandas, prvo moramo da je učitamo komandom import pandas as pd.

#%pip install pandas #uncomment if you need
import pandas as pd

Takođe ćemo učitati preostale biblioteke koje će nam trebati za naš rad.

import numpy as np
from matplotlib import pyplot as plt

Strukture Series i DataFrame 

Osnovne strukture podataka koje koristi biblioteka Pandas su Series i DataFrame. Strukturu DataFrame možemo zamisliti kao tabelarnu strukturu sa karakteristikama povezanim sa redovima i kolonama, dok se struktura serije može zamisliti kao jedna kolona ove tabele, sa karakteristikama povezanim sa redovima.

Struktura Series  je kreirana pomoću istoimene funkcije. Sledeća struktura points_color sadrži informacije o bojama tačaka.

points_color = pd.Series(['red', 'blue', 'red', 'green'])
points_color

Kao što vidimo, svaki unos je određen indeksom redova.

Struktura DataFrame je takođe kreirana pomoću funkcije istog imena. Sledeći blok koda stvara tabelu sa tačkama u ravni koja sadrži imena tačaka i njihove koordinate.

points = pd.DataFrame({
    'point_name': ['A', 'B', 'C', 'D'],
    'x': [20, 11, 3, 27],
    'y': [18, -4, 10, 2]
})
points

Unosi u takvim strukturama određuju se indeksima redova i indeksima kolona. To nam omogućava da pristupimo i pročitamo njihove vrednosti. Jedna od funkcija koje možemo koristiti u tu svrhu je loc funkcija, koja očekuje indeks redova i indeks kolone odvojene zarezima.

points.loc[1, 'x']
 
 

Ako je potrebno pročitati vrednosti jedne kolone, na primer, one sa imenima tačaka, to možemo uraditi tako što ćemo navesti ime kolone u uglatim zagradama kao u sledećem primeru. Ako je potrebno pročitati vrednosti više kolona, navodi se lista sa imenima kolona.

points['point_name']

Ako je potrebno pročitati vrednost reda, na primer, onaj sa indeksom 2, to možemo uraditi pomoću funkcije iloc.

points.iloc[2]

Učitavanje skupa podataka

Pandas biblioteka nudi podršku za rad sa mnogim formatima kao što su CSV, JSON, HTML, Ekcel i drugi. Za svaki od ovih formata postoji odgovarajuća funkcija za učitavanje podataka:

read_csv, read_json, read_html, read_excel. Kao što možemo primetiti, svi oni počinju sa prefiksom read_.

Skup podataka koji ćemo koristiti u ovoj vežbi poznat je kao Titanik i sadrži informacije o putnicima broda Titanik koji je potonuo u Atlantskom okeanu 1912. godine nakon udara u ledeni breg. Ovaj skup podataka može se preuzeti sa platforme Kaggle na https://www.kaggle.com/competitions/titanic/. Platforma obezbeđuje dva dela ovog skupa podataka, titanic_train.csv  i titanic_test.csv, prvi za obuku, a drugi za testiranje modela. Potrebno je da preuzmete prvi skup podataka i prenese ga na Google Drive platformu u skladu sa smernicama u uputstvima za korišćenje Google diska. Trebalo bi da se nađe pod istim imenom u sample_data direktorijumu.

Pošto su podaci u CSV formatu, koristićemo funkciju read_csv da ih učitamo.

data_path = '/titanic/train.csv'
data = pd.read_csv(data_path)

Informacije o dimenzijama skupa podataka, tj. Broj redova i kolona, mogu se dobiti pomoću atributa oblika. Broj redova odgovara broju instanci, dok broj kolona odgovara broju atributa.

data.shape

Prvih nekoliko redova učitanog skupa podataka može se dobiti pozivanjem funkcije head. Slično tome, poslednjih nekoliko redova napunjenog skupa podataka može se dobiti pozivanjem tail funkcije. Obe funkcije mogu uzeti broj redova za prikaz kao argument - podrazumevano, pet redova se prikazuje.

data.head()

 

Analiza atributa

Brzi pregled imena i tipova atributa može se dobiti pomoću info funkcije. Ova funkcija će takođe odštampati broj vrednosti koje ne nedostaju za svaki atribut.

data.info()

Atributi prisutni u skupu podataka su: identifikator putnika (PassengerId), indikator da li je putnik preživeo brodolom (Survived), klasa putnika (Pclass), ime putnika (Name), pol putnika (Sex), starost (Age), broj članova porodice na brodu (SibSp), broj dece ili roditelja na brodu (Parch), kod karte (Ticket), cena karte (Fare), broj kabine (Cabin),  i stanica na kojoj se putnik ukrcao na brod (Embarked). Više o značenju ovih atributa možete pročitati na stranici platforme Kaggle.

Među numeričkim atributima, izdvojit ćemo jedan atribut i analizirati ga odvojeno. Neka to bude atribut Fare koji predstavlja cenu karte. Dodatne informacije o ovom atributu mogu se dobiti pozivanjem funkcije describe - ona će nas obavestiti o minimalnoj i maksimalnoj vrednosti atributa, prosečnoj vrednosti i percentilnim vrednostima.

data['Fare'].describe()

U izlazu, count označava broj vrednosti u koloni, mean znači prosečnu vrednost, std standardnu devijaciju i min i max minimalne i maksimalne vrednosti, respektivno. Izlazi 25%, 50% i 75% ukazuju na percentilne vrednosti. Dakle, 50. percentil je vrednost ispod koje leži polovina svih vrednosti. Ova vrednost je takođe poznata kao medijan. Slično tome, 25. percentil označava vrednost ispod koje leži jedna četvrtina svih vrednosti, a 75. percentil vrednost ispod koje leže tri četvrtine svih vrednosti. Ove vrednosti se nazivaju i prvi i treći kvartil, dok se medijan naziva i drugim kvartilom. Svrha svih ovih proračuna je da nam daju uvid u distribuciju vrednosti atributa.

Pregled vrednosti atributa se takođe dobija prikazivanjem histograma.

data['Fare'].hist()
 

Iz ovih analiza, može biti interesantno naknadno proveriti unose po ceni od 0.

data[data['Fare']==0].shape
data[data['Fare']==0].head()

Slično tome, može biti zanimljivo naknadno proveriti unose sa najvišim cenama.

data[data['Fare']>200].shape
 
data[data['Fare']>200].head()

Prosečna cena karte može se izračunati pomoću mean funkcije.

 data['Fare'].mean()

Takođe ćemo izdvojiti jedan kategorički atribut. Neka to bude pol putnika Sex. Za atribute ovog tipa, obično nas zanima skup mogućih vrednosti i njihova učestalost. Funkcija value_counts  može nam pomoći u ovom zadatku, jer izračunava broj pojavljivanja za svaku moguću vrednost.

data['Sex'].value_counts()

Pogodno je grafički prikazati statistiku koja se odnosi na kategoričke varijable.

 statistics_by_gender = data['Sex'].value_counts()
 
plt.title('Passenger Statistics by Gender')
plt.bar(statistics_by_gender.index, statistics_by_gender.values, color='orange')
plt.show()

Nedostajuće vrednosti

Kao što možemo primetiti iz izlaza infofunkcije, postoje atributi sa nedostajućim vrednostima.

Jedan takav atribut je Embarked atribut, koji označava stanicu na kojoj se putnik ukrcao na brod. Pošto imamo samo dve vrednosti koje nedostaju, najprirodnije je izbrisati redove u kojima se pojavljuju. Funkcija isna nam pomaže da proverimo da li nedostaje vrednost, dok se samo brisanje redova može realizovati pomoću funkcije drop .

data[data['Embarked'].isna()]
data.drop(index=[61, 829], inplace=True)
 
data.shape

Kao što možemo primetiti, sada imamo dva reda manje u skupu podataka. Pružajući index argument funkciji drop, naveli smo indekse redova koji će biti obrisani, dok smo sa argumentom inplace  naznačili da želimo da se ove instance izbrišu "na mestu". Uobičajeno ponašanje prilikom brisanja je da se generiše izmenjena kopija podataka.

U koloni Cabin  vidimo da nedostaje mnogo vrednosti - poznate su samo 204 vrednosti. Zbog toga je najpogodnije da u potpunosti izbrišete ovu kolonu. To ćemo postići pomoću funkcije drop , ali ovaj put navodeći ime kolone umesto indeksa.

data.drop(columns=['Cabin'], inplace=True)
 
data.shape
data.head()

Poslednja kolona sa nedostajućim vrednostima je kolona Starost. Brisanje redova sa nedostajućim vrednostima za ovaj atribut rezultiralo bi gubitkom oko jedne petine skupa podataka, a sama kolona ima više poznatih vrednosti od nedostajućih. Zbog toga je pogodno zameniti nedostajuće vrednosti, na primer, prosečnom starošću putnika. Funkcija fillna, koja očekuje da će vrednost zameniti vrednosti koje nedostaju kao argument, može nam pomoći u ovom zadatku. Takođe smo izvršili ovu zamenu na mestu koristeći argument inplace .

average_age = data['Age'].mean()
 
data['Age'].fillna(average_age, inplace=True)
 
data['Age'].hist()
 

Duplikati

Prisustvo duplikata u skupu podataka može se proveriti pomoću funkcije duplicated . Ova funkcija će vratiti True za svaki ponovljeni red i False u suprotnom.

duplicate = data.duplicated()
 
duplicate.value_counts()
 

Kao što vidimo, sve vrednosti su lažne, tako da možemo zaključiti da nema duplikata.

Otkrivanje outliers

Otkrivanje izuzetaka podrazumeva ispitivanje pojedinačnih vrednosti atributa i dalje analiziranje onih koji izgledaju sumnjivo ili domen-irelevantno. Hajde da dalje analiziramo atribut starosti.

Ispitivanjem vrednosti atributa Age koristeći funkciju describe i grafički iscrtavanje pomoću funkcije boxplot , primećujemo da postoje neke neobično male vrednosti i neke veće vrednosti. Ove potrebe

data['Age'].describe()
data.boxplot(column=['Age'])
data[data['Age']<1]

Čini se da je na brodu bilo dece koja su bila mlađa od godinu dana (srećom, svi su preživeli!). Za slučajeve kada je identifikator putnika 470 i 645, čini se da se svi podaci preklapaju osim imena. Ovo bi mogao biti potencijalni duplikat ili bi mogle biti sestre; Neobično je da je broj karte isti.e.

data[data['Age']>70]

Čini se da među odabranim slučajevima u kojima je starost veća od 70 godina, ne postoje neobične vrednosti.

Slično tome, preostale atribute treba dalje ispitati na isti način.

Atribut korelacija

Da bismo procenili korelaciju atributa u skupu podataka, možemo koristiti funkciju corr . Po defaultu, izračunava Pearsonov koeficijent korelacije između svakog para atributa. Pre upotrebe ove funkcije, hajde da izaberemo atribute čija korelacija želimo da ispitamo. Neka to budu Survived, Pclass, Sex, Age, SibSp, Parch i Fare.

data.head()
data_restriction = data[['Survived', 'Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare']].copy()

Pošto je atribut Sex kategoričan, mapiraćemo vrednost male na 0 i vrednost female na 1. Funkcija map će nam pomoći u ovom zadatku.

 
data_restriction['Sex'] = data_restriction['Sex'].map({'male': 0, 'female':1})
 

Funkcija corr izračunava vrednosti koeficijenta korelacije između atributa.

corelation_matrix = data_restriction.corr()
 
corelation_matrix

Kao što smo razgovarali, radi lakše analize dobijenih vrednosti, korelacijska matrica je takođe prikazana u obliku toplotne mape. Funkcija show_corelations omogućava takav prikaz.

 
def show_corelations(podaci):

  # calculate the correlation matrix
  corelation_matrix = data.corr()

  # prepare axis labels
  atributes_number = podaci.columns.shape[0]
  plt.xticks(np.arange(0, atributes_number), data.columns, rotation=45)
  plt.yticks(np.arange(0, atributes_number), data.columns)

  # prepare the heatmap
  plt.imshow(corelation_matrix)

  # display the color bar with paired colors and values it represents
  plt.colorbar()

  # display the prepared graph
  plt.show()
 
show_corelations(data_restriction)

Iz ove matrice mogu se izvući zaključci kao što su da što je niža klasa putnika, to je niža cijena karte (tamno ljubičasti kvadrat na raskrsnici reda Fare i kolone Pclass), da je pol putnika pozitivno povezan sa informacijom da li je putnik preživeo (korisno je znati da je izvršena evakuacija žena i dece),  i druge informacije.

 

 
Completion requirements:
  • Make a submission
Previous activity Vežba 2.C: Popularni skupovi podataka – COCO
Next activity Vežba 4: Setovi za obuku, validaciju i testiranje
You are currently using guest access (Log in)
Data retention summary
Get the mobile app
Get the mobile app
Play Store App Store
Powered by Moodle

This theme was proudly developed by

Conecti.me