Prednáška: pokročilé použitie matplotlib na konkrétnom datasete (Titanic)¶
Obsah¶
- Úvod do dátovej vizualizácie a matplotlib
- Načítanie a predspracovanie dát
- Čiarové grafy a trendové analýzy
- Stĺpcové grafy a kategorizácia
- Histogramy a distribučné analýzy
- Rozptýlené grafy a korelačné vzťahy
- Koláčové grafy a proporčné zobrazenia
- Subplots a kombinované vizualizácie
- Prispôsobenie vzhľadu grafov (styling a témy)
- Pokročilé techniky a interaktívne grafy
- Záver
1. Úvod do dátovej vizualizácie a matplotlib¶
Vizualizácia dát je kľúčovým nástrojom v dátovej analytike, ktorý umožňuje efektívne komunikovať zistenia a objavy z dát. Správne vizualizácie môžu odhaliť skryté vzory, trendy a vzťahy, ktoré by inak zostali neodhalené. V tejto prednáške sa zameriame na pokročilé využitie knižnice Matplotlib v Pythone na vizualizáciu dát z Titanic datasetu. Tento dataset poskytuje bohaté informácie o pasažieroch Titanicu a je ideálny pre praktické ukážky rôznych typov grafov a analytických techník.
2. Načítanie a predspracovanie dát¶
Pred začatím vizualizácie je kľúčové správne načítať a predspracovať dáta. To zahŕňa odstránenie chýbajúcich hodnôt, transformáciu dátových typov a vytvorenie nových premenných, ktoré môžu byť užitočné pre analýzu.
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
# Načítanie Titanic datasetu z CSV súboru
# Predpokladáme, že súbor 'titanic.csv' je v pracovnom adresári
titanic = pd.read_csv('data/titanic.csv')
# Prehľad základných informácií o datasete
titanic.info()
# Kontrola chýbajúcich hodnôt
titanic.isnull().sum()
# Predspracovanie: Vyplnenie chýbajúcich hodnôt veku strednou hodnotou
titanic['age'].fillna(titanic['age'].median(), inplace=True)
# Odstránenie riadkov s chýbajúcimi hodnotami v stĺpci 'Embarked'
titanic.dropna(subset=['embarked'], inplace=True)
# Vytvorenie nového stĺpca 'FamilySize'
titanic['FamilySize'] = titanic['sibsp'] + titanic['parch'] + 1
# Zobrazenie prvých riadkov po predspracovaní
titanic.head()
Vysvetlenie:¶
- Použili sme knižnicu
pandas
na načítanie datasetu z CSV súboru. - Skontrolovali sme základné informácie a identifikovali sme chýbajúce hodnoty.
- Predspracovali sme dáta vyplnením chýbajúcich hodnôt veku a odstránením riadkov s chýbajúcimi hodnotami v stĺpci
embarked
. - Vytvorili sme nový stĺpec
FamilySize
, ktorý predstavuje veľkosť rodiny pasažiera.
3. Čiarové grafy a trendové analýzy¶
Čiarové grafy sú ideálne na zobrazovanie trendov a zmien v dátach v priebehu kontinuálnych premenných. Pomocou čiarových grafov môžeme identifikovať vzory a odchýlky v dátach.
Ukážka: priemerná cena lístka podľa veku¶
# Agregácia dát: Priemerná cena lístka podľa veku
avg_fare_by_age = titanic.groupby('age')['fare'].mean()
# Vytvorenie čiarového grafu
plt.figure(figsize=(12, 6))
plt.plot(avg_fare_by_age.index, avg_fare_by_age.values, color='blue', linewidth=2)
plt.title('Priemerná cena lístka podľa veku', fontsize=16)
plt.xlabel('Vek', fontsize=14)
plt.ylabel('Priemerná cena lístka (£)', fontsize=14)
plt.grid(True, linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
Vysvetlenie:¶
- Agregovali sme dáta tak, že sme vypočítali priemernú cenu lístka pre každý vek pasažiera.
- Vytvorili sme čiarový graf, ktorý zobrazuje, ako sa priemerná cena lístka mení s vekom.
4. Stĺpcové grafy a kategorizácia¶
Stĺpcové grafy umožňujú porovnať kategórie alebo skupiny v dátach. Sú efektívne pri vizualizácii rozdielov medzi jednotlivými kategóriami.
Ukážka: počet preživších a nepreživších podľa triedy¶
# Agregácia dát: Počet preživších a nepreživších podľa triedy
survival_by_pclass = titanic.groupby(['pclass', 'survived']).size().unstack()
# Vytvorenie stĺpcového grafu
survival_by_pclass.plot(kind='bar', stacked=True, figsize=(10, 7), color=['salmon', 'seagreen'])
plt.title('Počet preživších a nepreživších podľa triedy', fontsize=16)
plt.xlabel('Trieda (Pclass)', fontsize=14)
plt.ylabel('Počet pasažierov', fontsize=14)
plt.legend(title='Stav', labels=['Neprežil', 'Prežil'])
plt.xticks(rotation=0)
plt.tight_layout()
plt.show()
Vysvetlenie:¶
- Skupinili sme dáta podľa triedy a stavu prežitia.
- Vytvorili sme stĺpcový graf s poskladanými stĺpcami, ktoré zobrazujú počet preživších a nepreživších v každej triede.
5. Histogramy a distribučné analýzy¶
Histogramy zobrazujú distribúciu jedného numerického atribútu. Umožňujú nám vidieť frekvenciu hodnôt v rôznych intervaloch a identifikovať rozdelenie dát.
Ukážka: Distribúcia veku pasažierov¶
# Vytvorenie histogramu veku
plt.figure(figsize=(12, 6))
plt.hist(titanic['age'], bins=30, color='teal', edgecolor='black', alpha=0.7)
plt.title('Distribúcia veku pasažierov', fontsize=16)
plt.xlabel('Vek', fontsize=14)
plt.ylabel('Počet pasažierov', fontsize=14)
plt.grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
Vysvetlenie:¶
- Vytvorili sme histogram, ktorý zobrazuje, ako je vek pasažierov rozložený.
- Nastavili sme počet binov na 30 pre detailnejšie rozdelenie.
6. Rozptýlené grafy a korelačné vzťahy¶
Rozptýlené grafy (scatter plots) slúžia na zobrazenie vzťahu medzi dvoma numerickými premennými. Pomocou nich môžeme identifikovať koreláciu, skupiny a odľahlé hodnoty.
Ukážka: vzťah medzi cenou lístka a vekom podľa pohlavia¶
# Vytvorenie prispôsobeného rozptýleného grafu
plt.figure(figsize=(12, 8))
colors = {'male': 'blue', 'female': 'pink'}
for sex in titanic['sex'].unique():
subset = titanic[titanic['sex'] == sex]
plt.scatter(subset['fare'], subset['age'], label=sex.capitalize(),
color=colors[sex], edgecolor='k', alpha=0.6, s=80)
plt.title('Vzťah medzi cenou lístka a vekom podľa pohlavia', fontsize=16)
plt.xlabel('Cena lístka (£)', fontsize=14)
plt.ylabel('Vek', fontsize=14)
plt.legend(title='Pohlavie')
plt.grid(True, linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
Vysvetlenie:¶
- Rozdelili sme dáta podľa pohlavia a vytvorili sme rozptýlené body pre mužov a ženy s rôznymi farbami.
- Graf zobrazuje, ako cena lístka koreluje s vekom pasažiera pre každé pohlavie.
7. Koláčové grafy a proporčné zobrazenia¶
Koláčové grafy vizualizujú podiely jednotlivých kategórií v celku. Sú vhodné na zobrazovanie relatívnych veľkostí, avšak je potrebné ich používať opatrne, aby nedošlo k zovšeobecneniu alebo prehĺtaniu detailov.
Ukážka: podiel pohlavia pasažierov¶
# Počet mužov a žien
sex_counts = titanic['sex'].value_counts()
# Vytvorenie koláčového grafu
plt.figure(figsize=(8, 8))
colors = ['lightblue', 'lightcoral']
explode = (0.05, 0) # Výstup prvého segmentu
plt.pie(sex_counts, explode=explode, labels=sex_counts.index, colors=colors,
autopct='%1.1f%%', shadow=True, startangle=140)
plt.title('Podiel pohlavia pasažierov', fontsize=16)
plt.axis('equal') # Zabezpečí kruhový tvar
plt.tight_layout()
plt.show()
Vysvetlenie:¶
- Spočítali sme počet mužov a žien v datasete.
- Vytvorili sme koláčový graf, ktorý zobrazuje percentuálny podiel pohlavia pasažierov.
Poznámka: Koláčové grafy môžu byť menej efektívne pri porovnávaní kategórií. Alternatívou môžu byť pruhové grafy alebo donutové grafy.
8. Subplots a kombinované vizualizácie¶
Subplots umožňujú zobraziť viacero grafov na jednej ploche, čo je užitočné pri porovnávaní rôznych aspektov dát naraz. Pomáhajú vizualizovať komplexnejšie vzťahy a poskytujú komplexnejší pohľad na dáta.
Ukážka: priemerná cena lístka a priemerný vek podľa triedy¶
# Vytvorenie subplots
fig, axs = plt.subplots(2, 1, figsize=(12, 14))
# Prvý graf: Priemerná Cena Lístka podľa Triedy
mean_fare = titanic.groupby('pclass')['fare'].mean()
axs[0].bar(mean_fare.index, mean_fare.values, color='skyblue', edgecolor='k')
axs[0].set_title('Priemerná cena lístka podľa triedy', fontsize=16)
axs[0].set_xlabel('Trieda (pclass)', fontsize=14)
axs[0].set_ylabel('Priemerná cena lístka (£)', fontsize=14)
axs[0].grid(axis='y', linestyle='--', alpha=0.7)
# Druhý graf: Priemerný Vek podľa Triedy
mean_age = titanic.groupby('pclass')['age'].mean()
axs[1].bar(mean_age.index, mean_age.values, color='salmon', edgecolor='k')
axs[1].set_title('Priemerný vek podľa triedy', fontsize=16)
axs[1].set_xlabel('Trieda (pclass)', fontsize=14)
axs[1].set_ylabel('Priemerný vek', fontsize=14)
axs[1].grid(axis='y', linestyle='--', alpha=0.7)
plt.tight_layout()
plt.show()
Vysvetlenie:¶
- Vytvorili sme dva stĺpcové grafy na jednej ploche: jeden zobrazujúci priemernú cenu lístka podľa triedy a druhý zobrazujúci priemerný vek podľa triedy.
- Tento prístup umožňuje porovnať oba aspekty naraz a identifikovať možné vzťahy medzi triedou, cenou lístka a vekom pasažierov.
9. Prispôsobenie vzhľadu grafov (styling a témy)¶
Matplotlib poskytuje široké možnosti prispôsobenia vzhľadu grafov, vrátane farieb, štýlov čiar, veľkosti a typu písma, ako aj integrácie s rôznymi témami pre profesionálny vzhľad.
Ukážka: Prispôsobený rozptýlený graf s vlastným štýlom¶
# Nastavenie vlastného štýlu
plt.style.use('ggplot')
# Vytvorenie prispôsobeného rozptýleného grafu
plt.figure(figsize=(14, 10))
colors = {'male': 'blue', 'female': 'pink'}
for sex in titanic['sex'].unique():
subset = titanic[titanic['sex'] == sex]
plt.scatter(subset['fare'], subset['age'], label=sex.capitalize(),
color=colors[sex], edgecolor='k', alpha=0.7, s=100)
plt.title('Vzťah medzi cenou lístka a vekom podľa pohlavia', fontsize=18, fontweight='bold')
plt.xlabel('Cena lístka (£)', fontsize=14)
plt.ylabel('Vek', fontsize=14)
plt.legend(title='Pohlavie', fontsize=12, title_fontsize=14)
plt.grid(True, linestyle='--', alpha=0.7)
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.tight_layout()
plt.show()
Vysvetlenie:¶
- Nastavili sme vlastný štýl grafov pomocou
plt.style.use('ggplot')
pre esteticky príjemný vzhľad. - Vytvorili sme rozptýlený graf s prispôsobenými farbami, štýlmi a veľkosťou bodov.
- Pridali sme okraje bodov a nastavili sme transparentnosť pre lepšiu prehľadnosť.
10. Pokročilé techniky a interaktívne grafy¶
Matplotlib podporuje pokročilé techniky vizualizácie, vrátane animácií, interaktívnych grafov a integrácie s webovými aplikáciami. Tieto techniky zvyšujú interaktivitu a dynamiku prezentácie dát.
Ukážka: Interaktívny histogram s posuvníkom pre výber binov¶
import matplotlib.widgets as widgets
%matplotlib widget
import matplotlib.widgets as widgets
%matplotlib widget
# Funkcia na aktualizáciu histogramu
def update_hist(val):
bins = int(slider.val)
axs.cla() # Vyčistenie aktuálneho grafu
axs.hist(titanic['age'], bins=bins, color='teal', edgecolor='black', alpha=0.7)
axs.set_title('Distribúcia veku pasažierov', fontsize=16)
axs.set_xlabel('Vek', fontsize=14)
axs.set_ylabel('Počet pasažierov', fontsize=14)
axs.grid(axis='y', linestyle='--', alpha=0.7)
plt.draw()
# Vytvorenie grafu
fig, axs = plt.subplots(1, 1, figsize=(12, 6))
initial_bins = 30
axs.hist(titanic['age'], bins=initial_bins, color='teal', edgecolor='black', alpha=0.7)
axs.set_title('Distribúcia veku pasažierov', fontsize=16)
axs.set_xlabel('Vek', fontsize=14)
axs.set_ylabel('Počet pasažierov', fontsize=14)
# Pridanie posuvníka pre výber počtu binov
ax_slider = plt.axes([0.25, 0.02, 0.5, 0.03])
slider = widgets.Slider(ax_slider, 'Bins', 10, 50, valinit=initial_bins, valstep=1)
slider.on_changed(update_hist)
plt.tight_layout(rect=[0, 0.05, 1, 1])
plt.show()
Vysvetlenie:¶
- Vytvorili sme interaktívny histogram, ktorý umožňuje používateľovi meniť počet binov pomocou posuvníka.
- Použili sme
matplotlib.widgets
na pridanie interaktívneho posuvníka. - Funkcia
update_hist
aktualizuje histogram podľa hodnoty posuvníka.
Poznámka:
Pre interaktívne grafy a pokročilé vizualizácie môže byť efektívnejšie použiť knižnice ako Plotly
alebo Bokeh
, ktoré sú špecializované na interaktivitu a webové aplikácie.
11. Záver a Diskusia¶
Zhrnutie:¶
V tejto prednáške sme prešli pokročilé techniky vizualizácie dát pomocou knižnice Matplotlib na konkrétnom datasete Titanicu. Naučili sme sa:
- Načítať a predspracovať dáta pre analýzu.
- Vytvárať rôzne typy grafov vrátane čiarových, stĺpcových, histogramov, rozptýlených a koláčových grafov.
- Kombinovať viaceré grafy na jednej ploche pomocou subplots.
- Prispôsobovať vzhľad grafov pomocou štýlov a tém.
- Implementovať pokročilé a interaktívne vizualizácie.