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-SK
  3. 2. Machine Learning (SK)
  4. Cvičenie 3: Prieskumná analýza súboru údajov

Cvičenie 3: Prieskumná analýza súboru údajov

colab

Tento zápisník je doplnkom k lekcii o prieskumnej analýze údajov. Ukáže niektoré funkcie knižnice Pandas, ktoré možno použiť pri analytických úlohách.

Knižnica Pandas je knižnica programovacieho jazyka Python používaná na prácu s tabuľkovými údajmi. Vyznačuje sa veľkým počtom funkcií, ktoré môžu uľahčiť a urýchliť prácu a poskytnúť užitočné informácie o súbore údajov. Aby sme mohli knižnicu Pandas používať, musíme ju najskôr načítať príkazom import pandas as pd.

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

Importovať Pandy ako PD

 
import numpy as np
from matplotlib import pyplot as plt

Štruktúry radov a údajových rámcov

Základné dátové štruktúry používané knižnicou Pandas sú Series a DataFrame. Štruktúru údajového rámca si môžeme predstaviť ako tabuľkovú štruktúru s funkciami spojenými s riadkami a stĺpcami, zatiaľ čo štruktúru radu si možno predstaviť ako jeden stĺpec tejto tabuľky s funkciami priradenými k riadkom.

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

Ako vidíme, každý záznam je určený indexom riadkov.

Štruktúra DataFrame sa tiež vytvorí pomocou funkcie s rovnakým názvom. Nasledujúci blok kódu vytvorí tabuľku s bodmi v rovine, ktorá obsahuje názvy bodov a ich súradnice.

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

Položky v takýchto štruktúrach sú určené indexmi riadkov a stĺpcovými indexmi. To nám umožňuje získať prístup k ich hodnotám a čítať ich. Jednou z funkcií, ktoré môžeme na tento účel použiť, je funkcia loc, ktorá očakáva index riadkov a index stĺpca oddelené čiarkami.

points.loc[1, 'x']

Ak je potrebné prečítať hodnoty jedného stĺpca, napríklad stĺpca s názvami bodov, môžeme to urobiť zadaním názvu stĺpca v hranatých zátvorkách ako v nasledujúcom príklade. Ak je potrebné načítať hodnoty viacerých stĺpcov, zadá sa zoznam s názvami stĺpcov.

points['point_name']

Ak je potrebné prečítať hodnotu riadku, napríklad toho s indexom 2, môžeme to urobiť pomocou funkcie iloc.

points.iloc[2]

Načítanie množiny údajov

Knižnica Pandas ponúka podporu pre prácu s mnohými formátmi, ako sú CSV, JSON, HTML, Excel a ďalšie. Pre každý z týchto formátov existuje zodpovedajúca funkcia na načítanie údajov: read_csv, read_json, read_html, read_excel. Ako si môžeme všimnúť, všetky začínajú predponou  read_.

Súbor údajov, ktorý použijeme v tomto cvičení, je známy ako Titanic a obsahuje informácie o pasažieroch lode Titanic, ktorá sa potopila v Atlantickom oceáne v roku 1912 po náraze do ľadovca. Tento súbor údajov si môžete stiahnuť z platformy Kaggle na  https://www.kaggle.com/competitions/titanic/. Platforma poskytuje dve časti tohto súboru údajov titanic_train.csv and titanic_test.csv, prvú na trénovanie a druhú na testovanie modelov. Musíte si stiahnuť prvý súbor údajov a preniesť ho na platformu Disku Google podľa pokynov v pokynoch na používanie Disku Google. Pod rovnakým názvom by sa mal nachádzať v adresári  sample_data.

Keďže údaje sú vo formáte CSV, na ich načítanie použijeme funkciu  read_csv .

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

Informácie o rozmeroch datasetu, t. j. počte riadkov a stĺpcov, je možné získať pomocou atribútu shape. Počet riadkov zodpovedá počtu inštancií, zatiaľ čo počet stĺpcov zodpovedá počtu atribútov.

data.shape

Prvých niekoľko riadkov načítanej množiny údajov je možné získať volaním funkcie head. Podobne je možné získať posledných pár riadkov načítanej množiny údajov volaním funkcie tail. Obe funkcie môžu prijať počet riadkov, ktoré sa majú zobraziť ako argument - predvolene sa zobrazí päť riadkov.

data.head()

Analýza atribútov

Rýchly prehľad názvov a typov atribútov je možné získať pomocou funkcie info. Táto funkcia tiež vypíše počet nechýbajúcich hodnôt pre každý atribút.

data.info()

Atribúty prítomné v súbore údajov sú: identifikátor cestujúceho (PassengerId), ukazovateľ toho, či cestujúci prežil stroskotanie lode alebo nie (Survivord), trieda cestujúceho (Pclass), meno cestujúceho (Meno), pohlavie cestujúceho (Pohlavie), vek (Vek), počet rodinných príslušníkov na palube (SibSp), počet detí alebo rodičov na palube (Parch), kód lístka (Ticket), cena lístka (Tarifné), číslo kajuty (Cabin),  a stanicu, kde cestujúci nastúpil na loď (nalodený). Viac o význame týchto atribútov si môžete prečítať na stránke platformy Kaggle.

Spomedzi číselných atribútov vyberieme jeden atribút a analyzujeme ho samostatne. Nech je to atribút Tarifa, ktorý predstavuje cenu lístka. Ďalšie informácie o tomto atribúte je možné získať volaním funkcie describe - bude nás informovať o minimálnej a maximálnej hodnote atribútu, priemernej hodnote a percentilových hodnotách.

data['Fare'].describe()

Vo výstupe count označuje počet hodnôt v stĺpci, priemernú hodnotu, std smerodajnú odchýlku a minimálnu a maximálnu minimálnu a maximálnu hodnotu. Výstupy 25%, 50% a 75% označujú percentilové hodnoty. 50. percentil je teda hodnota, pod ktorou leží polovica všetkých hodnôt. Táto hodnota je známa aj ako medián. Podobne 25. percentil označuje hodnotu, pod ktorou leží jedna štvrtina všetkých hodnôt, a 75. percentil hodnotu, pod ktorou ležia tri štvrtiny všetkých hodnôt. Tieto hodnoty sa nazývajú aj prvý a tretí kvartil, zatiaľ čo medián sa označuje aj ako druhý kvartil. Účelom všetkých týchto výpočtov je poskytnúť nám prehľad o rozdelení hodnôt atribútov.

Prehľad o hodnotách atribútov získame aj zobrazením histogramov.

data['Fare'].hist()
 

Z týchto analýz môže byť zaujímavé následne skontrolovať záznamy s cenou 0.

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

Podobne môže byť zaujímavé následne skontrolovať vstupy s najvyššími cenami.

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

Priemernú cenu lístka je možné vypočítať pomocou funkcie mean .

 data['Fare'].mean()

Vyberieme aj jeden kategorický atribút. Nech je to pohlavie cestujúcich Pohlavie. Pri atribútoch tohto typu nás zvyčajne zaujíma množina možných hodnôt a ich frekvencia. S touto úlohou nám môže pomôcť funkcia value_counts, ktorá vypočíta počet výskytov pre každú možnú hodnotu.

data['Sex'].value_counts()

Je vhodné graficky zobraziť štatistiky súvisiace s kategorickými premennými.

 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()

Chýbajúce hodnoty

Ako si môžeme všimnúť z výstupu info funkcie, existujú atribúty s chýbajúcimi hodnotami.

Jedným z takýchto atribútov je atribút Nalodenie, ktorý označuje stanicu, kde cestujúci nastúpil na loď. Keďže nám chýbajú iba dve hodnoty, je najprirodzenejšie odstrániť riadky, v ktorých sa vyskytujú. Funkcia isna nám pomáha skontrolovať, či nechýba hodnota, zatiaľ čo samotné vymazanie riadkov je možné realizovať pomocou funkcie drop.

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

Ako si môžeme všimnúť, v množine údajov máme teraz o dva riadky menej. Poskytnutím indexového argumentu funkcii drop sme špecifikovali indexy riadkov, ktoré sa majú odstrániť, zatiaľ čo pri argumente inplace sme uviedli, že chceme, aby sa tieto inštancie odstránili "na mieste". Predvoleným správaním pri odstraňovaní je vygenerovanie upravenej kópie údajov.

V stĺpci Kabína vidíme, že chýba veľa hodnôt - je známych iba 204 hodnôt. Preto je najvýhodnejšie tento stĺpec úplne odstrániť. Dosiahneme to pomocou funkcie drop, tentoraz však namiesto indexu zadáme názov stĺpca.

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

Posledným stĺpcom s chýbajúcimi hodnotami je stĺpec Age . Odstránenie riadkov s chýbajúcimi hodnotami pre tento atribút by malo za následok stratu približne jednej pätiny množiny údajov a samotný stĺpec má viac známych hodnôt ako chýbajúcich. Preto je vhodné nahradiť chýbajúce hodnoty napríklad priemerným vekom cestujúcich. S touto úlohou nám môže pomôcť funkcia fillna , ktorá očakáva, že hodnota nahradí chýbajúce hodnoty ako argument. Túto výmenu sme vykonali aj na mieste pomocou argumentu inplace .

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

Duplikáty

Prítomnosť duplikátov v množine údajov je možné skontrolovať pomocou duplicated funkcie. Táto funkcia vráti hodnotu True pre každý opakovaný riadok a v opačnom prípade hodnotu False.

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

Ako vidíme, všetky hodnoty sú nepravdivé, takže môžeme dospieť k záveru, že neexistujú žiadne duplikáty.

Zisťovanie odľahlých hodnôt

Zisťovanie odľahlých hodnôt zahŕňa skúmanie individuálnych hodnôt atribútov a ďalšiu analýzu tých, ktoré sa zdajú byť podozrivé alebo doménovo irelevantné. Poďme ďalej analyzovať atribút Age .

Skúmaním hodnôt atribútu Age pomocou funkcie describe a grafickým vykreslením pomocou funkcie boxplot si všimneme, že existujú niektoré nezvyčajne malé hodnoty a niektoré väčšie hodnoty. Tie je potrebné ďalej preskúmať.

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

Zdá sa, že na lodi boli deti, ktoré boli mladšie ako jeden rok (našťastie všetky prežili!). V prípadoch, keď je identifikátor cestujúceho 470 a 645, sa zdá, že všetky údaje sa prekrývajú okrem mena. Môže to byť potenciálny duplikát alebo to môžu byť sestry; Je nezvyčajné, že číslo lístka je rovnaké.

data[data['Age']>70]

Zdá sa, že medzi vybranými prípadmi, kde je vek vyšší ako 70 rokov, nie sú žiadne nezvyčajné hodnoty.

Podobne by sa rovnakým spôsobom mali ďalej skúmať aj ostatné atribúty.

Korelácia atribútov

Na vyhodnotenie korelácie atribútov v datasete môžeme použiť funkciu corr . V predvolenom nastavení vypočítava Pearsonov korelačný koeficient medzi každou dvojicou atribútov. Pred použitím tejto funkcie vyberieme atribúty, ktorých koreláciu chceme preskúmať. Nech sú prežité, Survived, Pclass, Sex, Age, SibSp, Parch a Fare.

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

Keďže atribút Pohlavie je kategorický, namapujeme hodnotu  male na 0 a hodnotu female na 1. S touto úlohou nám pomôže funkcia map .

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

Funkcia corr vypočíta hodnoty korelačného koeficientu medzi atribútmi.

corelation_matrix = data_restriction.corr()
 
corelation_matrix

Ako sme diskutovali, pre jednoduchšiu analýzu získaných hodnôt je korelačná matica zobrazená aj vo forme heatmapy. Funkcia show_corelationsumožňuje takéto zobrazenie.

 
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)

Z tejto matice možno vyvodiť závery, že čím nižšia je trieda cestujúcich, tým nižšia je cena cestovného lístka (tmavofialový štvorec na križovatke radu cestovného a stĺpca Pclass), že pohlavie cestujúceho pozitívne koreluje s informáciou o tom, či cestujúci prežil (je užitočné vedieť, že evakuácia žien a detí bola vykonaná),  a ďalšie informácie.

 
Completion requirements:
  • Make a submission
Previous activity Cvičenie 2.C: Populárne súbory údajov – COCO
Next activity Cvičenie 4: Tréningové, validačné a testovacie súbory
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