Prednáška 8: Vizualizácie dát pomocou knižnice Seaborn¶
Obsah¶
- Úvod
- Inštalácia a import knižníc
- Dataset
tips
- Základné typy grafov
- Vizualizácie distribúcie - numerické atribúty
displot()
kdeplot()
- Vizualizácie závislosti dvoch numerických premenných
scatterplot()
lmplot()
aregplot()
jointplot()
pairplot()
- Vizualizácie pre kategorické atribúty
countplot()
barplot()
boxplot()
stripplot()
aswarmplot()
- Facet Grid a kombinované vizualizácie
FacetGrid()
catplot()
- Heatmapy
- Vizualizácie distribúcie - numerické atribúty
- Prispôsobenie štýlu vizualizácií
sns.set_style()
,sns.set_context()
,despine()
- Farebné palety (
set_palette()
)
- Zhrnutie
Úvod¶
Seaborn je knižnica v Pythone určená na dátovú vizualizáciu, ktorá stavia na známej knižnici Matplotlib. Jej cieľom je zjednodušiť a zefektívniť tvorbu pekných a prehľadných grafov a zároveň ponúknuť veľa užitočných funkcií, vďaka ktorým dokážeme rýchlo a jednoducho analyzovať aj zložitejšie dátové súbory.
Seaborn poskytuje vyššiu úroveň abstrakcie oproti Matplotlibu, takže sa dobre hodí pri práci s dátovými rámcami z knižnice pandas. Mnohé funkcie v Seaborne vedia priamo pracovať so stĺpcami Pandas DataFrame-ov, čo výrazne zjednodušuje zápis a čitateľnosť kódu.
V tejto prednáške sa naučíme, ako pomocou Seabornu jednoducho vytvárať základné vizualizácie, a to najmä:
- distribúciu hodnôt (histogramy, kde-ploty),
- vzťahy medzi dvomi (prípadne viacerými) numerickými premennými (scatterplot, regressné grafy, pairplot),
- vizualizácie kategorických atribútov (countplot, barplot, boxplot),
- kombinačné vizualizácie (facet grids, catplot),
- vytvoriť a prispôsobiť rôzne grafické štýly (nastavenie farieb, veľkosti písma, pozadia a pod.),
- heatmapy (napr. pre korelačné matice či pivot tabuľky).
Inštalácia a import knižníc¶
Na používanie Seabornu potrebujete mať vo vašom prostredí nainštalovaný:
- Python (odporúčaná verzia 3+),
- knižnice numpy, pandas a matplotlib,
- knižnicu seaborn.
Inštalovať môžete napríklad cez pip:
pip install seaborn
alebo cez conda:
conda install seaborn
Po nainštalovaní importujeme potrebné knižnice do nášho kódu.
import seaborn as sns
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
sns.set() # základné nastavenie štýlu Seaborn
Dataset tips
¶
Seaborn ponúka vstavanú funkciu load_dataset()
, ktorá načíta ukážkové dataset-y priamo z repozitára Seaborn. Jedným z nich je dataset tips, ktorý obsahuje údaje o platbách a sprepitnom v reštaurácii. Dataset má nasledujúce stĺpce:
- total_bill - výška celého účtu,
- tip - výška sprepitného,
- sex - pohlavie platcu účtu,
- smoker - fajčiar / nefajčiar,
- day - deň v týždni (Thur, Fri, Sat, Sun),
- time - obed / večera (Lunch / Dinner),
- size - veľkosť skupiny.
Načítanie datasetu:
tips = sns.load_dataset('tips')
tips.head()
Základné typy grafov¶
Vizualizácie distribúcie - numerické atribúty¶
Prvou skupinou vizualizácií sú histogramy a KDE ploty (Kernel Density Estimation). Tieto diagramy znázorňujú, ako sú hodnoty danej premennej rozložené.
displot()
¶
Funkcia displot()
je multifunkčná a umožňuje zobraziť histogram, KDE krivku alebo ecdf (empirická distribučná funkcia). Najčastejšie parametre:
data
alebo priamo Series (napr.tips['total_bill']
),bins
- počet intervalov (pri histograme),kde
- akTrue
, zobrazí aj KDE krivku,rug
- akTrue
, zobrazí tzv. „tehličky“ na osi x,kind
- môže nadobúdať hodnoty"hist"
,"kde"
, prípadne"ecdf"
.
Príklad: Zobrazenie distribúcie výšky účtu total_bill
sns.displot(tips['total_bill'])
plt.show()
Implicitne uvidíme histogram s odhadom hustoty (KDE). Počet binov a vzhľad môžeme meniť:
sns.displot(tips['total_bill'], kde=False, bins=40)
plt.show()
Prípadne môžeme zobraziť len KDE:
sns.displot(tips['total_bill'], kind='kde', rug=True)
plt.show()
kdeplot()
¶
Pre vykreslenie samotnej KDE krivky (bez histogramu) môžeme použiť funkciu kdeplot()
.
for col in ['tip', 'total_bill']:
sns.kdeplot(tips[col])
plt.show()
Vizualizácie závislosti dvoch numerických premenných¶
Bodové grafy (scatterplot()
)¶
Najbežnejším spôsobom zobrazenia vzťahu medzi dvomi numerickými premennými je bodový graf (scatter plot). Funkcia scatterplot()
má najčastejšie parametre:
x
,y
- názvy stĺpcov,data
- dátový rámec,hue
- farebné rozlíšenie podľa kategórie,size
- veľkosť bodov podľa niektorej numerickej premennej,style
- iný tvar bodov pri rôznych kategóriách.
Príklad: Vzťah medzi tip
a total_bill
sns.scatterplot(x='tip', y='total_bill', data=tips)
plt.show()
Farebné rozlíšenie fajčiar/nefajčiar:
sns.scatterplot(x='tip', y='total_bill', hue='smoker', data=tips)
plt.show()
Príklad s rozlíšením pohlavia (tvar bodu) a veľkosti skupiny (veľkosť bodu):
sns.scatterplot(x='tip', y='total_bill', hue='smoker', size='size', style='sex', data=tips)
plt.show()
Regresné grafy: regplot()
a lmplot()
¶
Regresný graf je scatterplot doplnený o regresnú priamku (prípadne polynóm).
regplot()
funguje podobne akoscatterplot()
,lmplot()
navyše umožňuje priamo používať aj parametre typuhue
a dokáže graf rozdeliť do tzv. FacetGrid (keď používamecol
,row
).
Príklad:
# Jednoduchý regresný graf
sns.regplot(x='tip', y='total_bill', data=tips)
plt.show()
Príklad s farebným rozlíšením:
sns.lmplot(x='tip', y='total_bill', hue='smoker', data=tips)
jointplot()
¶
Kombinované zobrazenie, kde vidíme:
- Scatter (prípadne reg, hex, kde) pre dve premenné na stredovom grafe,
- Na krajných osiach samostatné histogramy alebo kdeploty rozloženia.
Najčastejšie parametre:
x
,y
- dve numerické premenné,data
- dátový rámec,kind
-"scatter"
,"hex"
,"reg"
,"kde"
.
sns.jointplot(x='tip', y='total_bill', data=tips, kind='scatter')
pairplot()
¶
Párový graf (pairplot) zobrazí matice grafov pre všetky vzájomné kombinácie numerických atribútov v danom DataFrame. Na diagonále bývajú distribúcie premenných (histogramy alebo kdeploty), mimo diagonály scatterplody (resp. iné typy podľa nastavenia).
sns.jointplot(x='tip', y='total_bill', data=tips, kind='scatter')
plt.show()
sns.pairplot(tips) # zobrazenie všetkých numerických stĺpcov
Obmedzenie iba na vybrané stĺpce:
col = ['tip', 'total_bill', 'size']
sns.pairplot(tips[col])
Farebné rozlíšenie hue
:
sns.pairplot(tips[col], hue='sex')
col = ['tip', 'total_bill', 'size', 'sex']
sns.pairplot(tips[col], hue='sex')
plt.show()
sns.countplot(x='smoker', data=tips)
plt.show()
barplot()
¶
Stĺpcový graf v Seaborne zobrazuje priemernú hodnotu numerického atribútu (predvolene) podľa hodnôt kategórie na x-osi. Môžeme samozrejme definovať aj iný estimator (napr. np.median
).
Parametre:
x
(kategória),y
(numerická premenná),data
,hue
,palette
,estimator
(napr.np.median
,np.sum
a pod.),ci
- interval spoľahlivosti (ak nechceme, nastavímeci=None
).
Príklad: Priemerná výška sprepitného podľa pohlavia:
sns.barplot(x='sex', y='tip', data=tips)
plt.show()
Ak chceme vykresliť medián:
from numpy import median
sns.barplot(x='day', y='tip', hue='sex', data=tips, estimator=median)
plt.show()
boxplot()
¶
Krabicový graf (box-and-whisker plot) znázorňuje:
- minimum / maximum,
- prvý a tretí kvartil (box),
- medián,
- potenciálne odľahlé hodnoty (bodky mimo boxu).
Príklad:
sns.boxplot(x='sex', y='tip', data=tips)
plt.show()
Boxplot rozlíšený fajčiar/nefajčiar:
sns.boxplot(x='day', y='tip', hue='smoker', data=tips)
plt.show()
stripplot()
a swarmplot()
¶
Bodové zobrazenie numerickej premennej podľa kategorických hodnôt.
stripplot()
- body sa môžu prekrývať, môžeme použiťjitter
na rozostup,swarmplot()
- body sa neprekrývajú, ale pri veľkom počte záznamov môže byť graf neprehľadný.
Príklad stripplot()
:
sns.stripplot(x='day', y='tip', data=tips, jitter=0.3)
plt.show()
Ak chceme rozlíšiť pohlavie:
sns.stripplot(x='day', y='tip', hue='sex', data=tips, jitter=0.3, palette='coolwarm')
plt.show()
Príklad swarmplot()
:
(namiesto stripplot
):
sns.swarmplot(x='day', y='tip', hue='sex', data=tips)
plt.show()
Tieto grafy sa často kombinujú s boxplotom alebo violinplotom, aby sme získali lepší prehľad o rozložení.
Facet Grid a kombinované vizualizácie¶
FacetGrid()
¶
Nástroj na vytváranie mriežky grafov podľa rôznych hodnôt jedného či viacerých kategorických atribútov. Najprv definujeme mriežku (napr. row
, col
), a potom funkciou .map()
aplikujeme napr. plt.hist
alebo iný typ grafu na zvolený atribút.
Príklad:
- Vytvoríme nový stĺpec
tip_pct
ako percento sprepitného z účtu:tips['tip_pct'] = 100 * tips['tip'] / tips['total_bill']
- Vykreslíme mriežku:
g = sns.FacetGrid(tips, row='sex', col='time') g.map(plt.hist, 'tip_pct')
tips['tip_pct'] = 100 * tips['tip'] / tips['total_bill']
g = sns.FacetGrid(tips, row='sex', col='time')
g.map(plt.hist, 'tip_pct')
plt.show()
catplot()
¶
Vykreslí vybraný typ grafu (bar, strip, point, swarm, …) do mriežky (FacetGrid) podľa nastavenia parametrov row
a col
.
Príklad:
Výška sprepitného podľa dní, rozlíšené pohlavie, a rozdelené do stĺpcov podľa fajčiar/nefajčiar:
sns.catplot(x='day', y='tip', hue='sex', col='smoker', data=tips, kind='bar')
plt.show()
Heatmapy¶
Heatmap je vhodná na zobrazovanie matíc (pivot tabuliek, korelačných matíc).
Najprv si môžeme zobraziť korelačnú maticu numerických atribútov:
numeric_cols = tips.select_dtypes(include=['number'])
sns.heatmap(numeric_cols.corr())
plt.show()
Farebná paleta a popisky hodnôt:
sns.heatmap(numeric_cols.corr(), cmap='coolwarm', annot=True)
plt.show()
Maskovanie horného trojuholníka:
mask = np.zeros_like(numeric_cols.corr(), dtype=bool)
mask[np.triu_indices_from(mask)] = True
sns.heatmap(numeric_cols.corr(), mask=mask, cmap='coolwarm', annot=True)
plt.show()
Heatmapa pre pivot tabuľky:
heatmap_data = pd.pivot_table(tips, values='total_bill', index='size', columns='day')
sns.heatmap(heatmap_data, annot=True, cmap='YlGnBu', cbar=False)
plt.show()
Prispôsobenie štýlu vizualizácií¶
Seaborn ponúka niekoľko možností, ako meniť štýl a vzhľad grafov.
Nastavenie štýlu: sns.set_style()
, sns.set_context()
, despine()
¶
sns.set_style('whitegrid')
/'darkgrid'
/'white'
/'dark'
/'ticks'
– prednastavené štýly.sns.set_context('notebook')
/'paper'
/'talk'
/'poster'
– mení mierku veľkosti prvkov (text, hrúbka čiar).sns.despine()
– odstráni orámovanie grafu (napr. hornú / pravú os).
Môžeme použiť aj with kontext:
with sns.axes_style('whitegrid'):
sns.displot(tips['tip'])
despine(offset=10, trim=True)
ďalej upraví odsadenie a orezanie osí.
with sns.axes_style('whitegrid'):
sns.displot(tips['tip'])
plt.show()
Farebné palety¶
Pri kategorizácii môžeme použiť parametre palette
. Existuje veľa menovaných paliet, napr. "Blues"
, "coolwarm"
, "rainbow"
, "Set1"
, "Paired"
, "Dark2"
a mnoho ďalších.
Takisto môžeme natrvalo nastaviť paletu:
sns.set_palette('Dark2')
sns.displot(tips['tip'])
Alebo aj individuálne pri danom grafe:
sns.countplot(x='smoker', data=tips, palette='coolwarm')
Celú paletu je možné nastaviť aj pre všetky grafy v danom kontexte.
sns.set_palette('Dark2')
sns.displot(tips['tip'])
plt.show()
Zhrnutie¶
Knižnica Seaborn ponúka množstvo funkcií, ktoré nám umožňujú rýchlo a prehľadne získať vizuálnu predstavu o našich dátach. Prácu výrazne uľahčuje fakt, že Seaborn priamo pracuje s dátovými rámcami (Pandas DataFrame) a podporuje jednoduché parametre pre farebné či tvarové rozlíšenie kategórií.
Kľúčové poznatky¶
displot()
,kdeplot()
– histogramy a distribúcie (KDE)scatterplot()
,lmplot()
,regplot()
– bodové grafy, regresné priamejointplot()
,pairplot()
– kombinované vizualizácie (distribúcie + scatter)countplot()
,barplot()
,boxplot()
,stripplot()
,swarmplot()
– najčastejšie grafy pre kategorické atribútycatplot()
– univerzálny nástroj na kategorizované grafy + FacetGridheatmap()
– zobrazenie matíc (napr. korelácie, pivot tabulky)- Nastavovanie štýlu pomocou
sns.set()
,set_style()
,set_context()
, farebných paliet atď.
Dôležité je, že všetky tieto grafy je možné medzi sebou kombinovať a prispôsobovať parametrami, čím sa viete dopracovať k veľmi bohatým a informatívnym vizualizáciám. Pri väčších analýzach budete často využívať aj funkcie typu FacetGrid na paralelné vykresľovanie rôznych podmnožín dát.
Na záver je dobré pripomenúť, že Seaborn tvorí “nadstavbu” nad Matplotlib, preto ak potrebujete jemnejšie vyladenie niektorých častí grafu, môžete využiť funkcie priamo z Matplotlibu (napr. plt.title()
, plt.xlabel()
, a pod.).
Referencie a doplnkové zdroje¶
Týmto končí naša prednáška o Seaborn. Dúfam, že vám pomôže pri tvorbe bohatých a estetických vizualizácií dát.