Seaborn
Contents
Seaborn¶
@Realizado por Aldeir Herrera
Libreria escrita por Michael Waskom y construida sobre Matploblib. Nos permite graficar rápido y con personalizaciones pre-seteadas.
Ventajas:
Velocidad
Poco código
Customizable
Su estructura básica es
sns.<tipo de grafica>.(
data=<Dataset>,
x=<Data en eje x>,
y=<Data en eje y>,
hue=<Variable de agrupamiento>
)
Seaborn tambien ofrece la solucion a problemas específicos de visualización de datos.
Podemos clasificar los gráficos de la siguiente forma:
Replot (relational)
scatterplot
lineplot
Displot (distributions)
histplot
kdeplot
ecdfplot
rugplot
Catplot
stripplot
swarmplot
boxplot
violinplot
pointplot
barplot
Sns nos permite invocar con el argumento kind
las subcategorias desde una categoria superior. Más adelante aplicaremos muchos ejemplos.
Set¶
Con set podemos definir de una manera sencilla el tema, paleta de colores, tipo de fuente, etc. Recordemos que seaborn al ser una libreria basada en Matplotlib, tiende a aceptar cambios que realizemos con funciones de matplot; para este caso veamos que sucede con el set.
Note
En este enlace puedes encontrar las paletas de colores.
#Este es una grafica sencilla de seaborn
import seaborn as sns
import matplotlib.pyplot as plt
sns.barplot(x=['A','B','C'], y=[1,2,3])
plt.show()
![_images/Seaborn_1_0.png](_images/Seaborn_1_0.png)
#Vamos a aplicar set
sns.set(style='ticks',palette='colorblind', font='Segoe UI', font_scale=1.2)
sns.barplot(x=['A','B','C'], y=[1,2,3])
plt.show()
![_images/Seaborn_2_0.png](_images/Seaborn_2_0.png)
Parametros más usados¶
Existe una gran cantida de gráficos en seaborn. De igual forma muchos de ellos comparten argumentos en común. Vamos al código para aclarar la idea.
tips = sns.load_dataset('tips')
tips.head(4)
total_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 |
3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 |
#Como vamos a trabajar con graficas de distribucion usamos "DISPLOT"
#seaborn automaticamente usa el tipo de grafico que mas nos conviene
sns.displot(data=tips, x='size')
plt.show()
![_images/Seaborn_5_0.png](_images/Seaborn_5_0.png)
#Grafico de distribucion con parametro "HUE" que funciona para categorizar
sns.displot(data=tips, x='total_bill', y='tip', hue='smoker', palette='gist_earth_r')
plt.show()
![_images/Seaborn_6_0.png](_images/Seaborn_6_0.png)
#Aca los hombres dan mas propina
sns.displot(data=tips, x='total_bill', kind='kde', hue='sex', alpha=0.5, palette='hot_r', legend=False)
plt.show()
![_images/Seaborn_7_0.png](_images/Seaborn_7_0.png)
En resumen algunos parametros comunes y que debemos aprender son:
hue=’’ define la categoría en las cuales se dividiran los datos.
palette=’’ define el tipo de color que tendran los datos del gráfico.
kind=’’ define el subgráfico a utilizar, ya sea de tipo displot, catplot, replot.
legend=’’ permite mostrar en el grafico, las categorías aplicada con hue.
alpha=’’ nivel de transparencia de las lineas o formas
Distribuciones¶
Las distribuciones son un conjunto de graficos que nos permiten visualizar variables numéricas. Con seaborn este tipo de gráficos son llamadas displot.
import seaborn as sns
import matplotlib.pyplot as plt
tips = sns.load_dataset('tips')
tips
total_bill | tip | sex | smoker | day | time | size | |
---|---|---|---|---|---|---|---|
0 | 16.99 | 1.01 | Female | No | Sun | Dinner | 2 |
1 | 10.34 | 1.66 | Male | No | Sun | Dinner | 3 |
2 | 21.01 | 3.50 | Male | No | Sun | Dinner | 3 |
3 | 23.68 | 3.31 | Male | No | Sun | Dinner | 2 |
4 | 24.59 | 3.61 | Female | No | Sun | Dinner | 4 |
... | ... | ... | ... | ... | ... | ... | ... |
239 | 29.03 | 5.92 | Male | No | Sat | Dinner | 3 |
240 | 27.18 | 2.00 | Female | Yes | Sat | Dinner | 2 |
241 | 22.67 | 2.00 | Male | Yes | Sat | Dinner | 2 |
242 | 17.82 | 1.75 | Male | No | Sat | Dinner | 2 |
243 | 18.78 | 3.00 | Female | No | Thur | Dinner | 2 |
244 rows × 7 columns
#Vamos a utilizar un histograma
#aplicamos visualizar de forma acumulativa
sns.displot(data=tips, kind='hist',x='tip', cumulative=False, hue='sex', stat='frequency', multiple='dodge', bins=10)
plt.show()
![_images/Seaborn_11_0.png](_images/Seaborn_11_0.png)
En el histograma anterior aplicamos 4 argumentos adicionales:
cumulative=’’ va sumando progresivamente cada distribucion
stat=’’ tipo de operacion estadística que queremos aplicar a la grafica
multiple=’’ argumento que pretende mapear y dar forma a los subconjuntos de la misma categoría.
bins=’’ establece la cantidad de cajas disponibles para graficar.
Tambien podemos aplicar directamente el tipo de grafico que queremos utilizar. Es decir sns.<tipo_de_grafico>
; de esta forma le estamos diciendo a seaborn que queremos utilizar un grafico especifico y dejariamos de usar el argumento kind
#usamos shade para repintar el area que ocupa cada categoria
sns.kdeplot(data=tips, x='tip', hue='sex', shade=True)
plt.show()
![_images/Seaborn_13_0.png](_images/Seaborn_13_0.png)
Empirical Cumulative Distribution Function (ecdf). A continuacion puedes leer el siguiente link para instruirte de porque y cuando se usa la ecdf
# Grafico ecdf
sns.ecdfplot(data=tips, x='tip', stat='count', hue='sex')
<AxesSubplot:xlabel='tip', ylabel='Count'>
![_images/Seaborn_15_1.png](_images/Seaborn_15_1.png)
Reto de distribuciones:¶
Utilizar un grafico de distribución que no se haya visto.
Graficar algun valor numerico (total_bill, tip, size) por otra categoria que no sea el sexo (day, time, smoker)
#1 Vamos a utilizar kde pero con DOS ejes escalares
sns.displot(kind='kde', data=tips, x='total_bill', y='size', fill=True)
plt.show()
![_images/Seaborn_17_0.png](_images/Seaborn_17_0.png)
#2. Categorizamos que tanto se repite el tamaño de una orden y luego categorizamos el color por dias
sns.displot( data=tips , x='size', hue='day', palette='PiYG')
plt.show()
![_images/Seaborn_18_0.png](_images/Seaborn_18_0.png)
Datos categóricos¶
Vamos a graficar las variables categoricas es decir, variables que no tiene un valor numerico. Una forma de invocar las variables categoricas es invocando sns.catplot()
. Vamos a ver los tipos.
#Tipo stripplot
sns.stripplot(data=tips, x='day', y='total_bill', hue='smoker', dodge=True, palette='rocket')
plt.show()
# dodge para separar los smokers
![_images/Seaborn_20_0.png](_images/Seaborn_20_0.png)
#Tipo swarmplot es parecido a stripplot pero agrega valor en el eje horizontal
plt.figure(figsize=(7,4)) # Al utilizar swarmplot los puntos se acentuan en el eje horizontal por lo tanto
#es necesario ampliar el ancho de la grafica. De otra forma nos mostrara una advertencia
sns.swarmplot(data=tips, x='day', y='total_bill', hue='smoker', dodge=True, palette='rocket')
plt.show()
![_images/Seaborn_21_0.png](_images/Seaborn_21_0.png)
#Boxplot ...UNA DE LAS MAS IMPORTANTES
plt.figure(figsize=(9,4))
sns.boxplot(data=tips, x='day', y='total_bill', hue='smoker', dodge=True, palette='BuGn')
#sns.swarmplot(data=tips, x='day', y='total_bill', hue='smoker', dodge=True, palette='bright')
<AxesSubplot:xlabel='day', ylabel='total_bill'>
![_images/Seaborn_22_1.png](_images/Seaborn_22_1.png)
#Podemos unir swarmplo y boxplot y visualizar mejor la distribucion de los datos
plt.figure(figsize=(9,4))
sns.boxplot(data=tips, x='day', y='total_bill', hue='smoker', dodge=True, palette='BuGn')
sns.swarmplot(data=tips, x='day', y='total_bill', hue='smoker', dodge=True, palette='bright', marker='<')
<AxesSubplot:xlabel='day', ylabel='total_bill'>
![_images/Seaborn_23_1.png](_images/Seaborn_23_1.png)
#Violinplot
sns.violinplot(data=tips, x='day', y='total_bill', hue='smoker', palette='colorblind', split=True)
#Split nos permite unir en un solo "violin" la categoria smoker
<AxesSubplot:xlabel='day', ylabel='total_bill'>
![_images/Seaborn_24_1.png](_images/Seaborn_24_1.png)
Todos estos graficos podemos llamarlos desde el argumento kind
de la funcion Catplot. Es decir que podemos cambiar de gráfico con solo cambiar un parametro.
Note
Puedes leer la documentacion de los graficos tipo Catplot en el siguiente enlace
#Esta es otra forma de graficar stripplot. Solo cambiamos el argumento kind (tipo)
sns.catplot(kind='strip', data=tips, x='time',y='total_bill',hue='sex', dodge=True, col='smoker')
<seaborn.axisgrid.FacetGrid at 0x2495f09a220>
![_images/Seaborn_26_1.png](_images/Seaborn_26_1.png)
En este caso le agregamos el argumento col
creando una division superior (fumadores y no fumadores). Si queremos cambiar todo este grafico a tipo violin; solo es neceario copiar el mismo codigo y cambiar kind='violin'
.
sns.catplot(kind='violin', data=tips, x='time',y='total_bill',hue='sex', dodge=True, col='smoker')
plt.show()
![_images/Seaborn_28_0.png](_images/Seaborn_28_0.png)
Relation¶
Gráficos que nos sirven para verificar el grado de relacion entre dos variables. Por ejemplo, si X
aumenta/disminuye entonces Y
como se comporta ?
Usaremos relplot y cambiaremos kind
.
#Grafico scatter o en español Grafico de Dispersion
marcadores = {"Lunch":">", "Dinner":"X"} #Vamos a crear un diccionario escribiendo los marcadores para cada tipo de comida
sns.relplot(
data=tips,
kind='scatter',
x='total_bill',
y='tip',
hue='day',
size='size', #utilizamos el tamaño de la compra ¨size¨ para aumentar o disminuir el tamaño del punto
style='time', #style y markers van de la mano
markers=marcadores # los markers se aplicaran a la categoria que le pasamos a style
)
#Si la leyenda que contiene los indicadores crees que debes reubicarla puedes ejecuta la sig linea e ir probando la ubicacion
#plt.legend(loc='center', bbox_to_anchor=(1.12,0.6))
plt.show()
![_images/Seaborn_30_0.png](_images/Seaborn_30_0.png)
#Grafica lineplot solo le cambiamos el kind a line
marcadores = {"Lunch":"s", "Dinner":"X"} #Vamos a crear un diccionario estableciendo los marcadores para cada tipo de comida
sns.relplot(
data=tips,
kind='line',
x='total_bill',
y='tip',
hue='day',
size='size', #utilizamos el tamaño de la compra ¨size¨ para aumentar o disminuir el tamaño del punto
style='time', #style y markers van de la mano
markers=marcadores # los markers se aplicaran a la categoria que le pasamos a style
)
#Si la leyenda que contiene los indicadores crees que debes reubicarla puedes ejecuta la sig linea e ir probando la ubicacion
#plt.legend(loc='center', bbox_to_anchor=(1.12,0.6))
plt.show()
#Este grafico no es tan practico y hay que saber muy bien cuando aplicarlo.
![_images/Seaborn_31_0.png](_images/Seaborn_31_0.png)
#BONUS!! al primer grafico de (Scatter) apliquemosle otra division
#el parametro COL que usamos anteriormente tambien puede aplicarse a graficos relplot
marcadores = {"Lunch":">", "Dinner":"X"}
sns.relplot(
data=tips,
kind='scatter',
x='total_bill',
y='tip',
hue='day',
size='size',
style='time',
markers=marcadores,
col='sex' #Aqui agregamos otra division
)
plt.show()
![_images/Seaborn_32_0.png](_images/Seaborn_32_0.png)
Join-Plot y Pair-plot¶
Join Plot¶
Join plot nos permite visualizar dos gráficos a la vez. Veamos en el codigo como se ejecuta esta función.
sns.jointplot(
data=tips,
x='total_bill',
y='tip',
hue='sex',
#por defecto joinplot grafica un scatter y a los lados graficos kde
kind='hist',
#Marginal hace referencia a los graficos que se encuentran alrededor del orignal
marginal_ticks=True, #indicamos que muestre un eje de medicion a los graficos Marginals
marginal_kws=dict(multiple='stack', bins=10) #estos parametros dependen del tipo de grafico 'kind' que apliquemos
)
plt.show()
![_images/Seaborn_34_0.png](_images/Seaborn_34_0.png)
Pairplot¶
Pairplot nos permite visualizar de manera rápida las variables numericas y su correlación. En nuestro caso tenemos a total_bill, size, tip
como variables numericas.
sns.pairplot(
data=tips,
hue='sex', #estos dos parametros son los basicos
#apliquemos algunos parametros de personalizacion
palette='Set1',
corner=True,
kind='scatter' #por defecto pairplot ejecuta scatter pero podemos cambiarlo a otro
)
plt.show()
![_images/Seaborn_36_0.png](_images/Seaborn_36_0.png)
Heatmap¶
Si bien pairplot nos mostraba de forma gráfica la correlacion entre las variables numericas. Heatmap por otra parte nos muestra la correlacion de las variables en termino de números.
Como primer paso, debemos obtener la matriz de correlacion y luego pasarsela como parametro a la funcion heatmap. Veamos como se hace.
# Solo para recordar, importaremos de nuevo el dataset de propinas (tips)
tips = sns.load_dataset('tips')
#Para obtener la matriz de correlacion solo debemos escribir <nombre_dataset>.corr()
tips.corr()
#Corr() es una funcion que viene integrada en los data sets de pandas
total_bill | tip | size | |
---|---|---|---|
total_bill | 1.000000 | 0.675734 | 0.598315 |
tip | 0.675734 | 1.000000 | 0.489299 |
size | 0.598315 | 0.489299 | 1.000000 |
#Heatmap nos ayuda a visualizar de manera grafica la matriz de correlacion
sns.heatmap(
data=tips.corr(),
annot=True, #Nos ayuda a visualizar los numeros en cada cuadro
#Los siguientes parametros son solo personalizacion
cmap='inferno_r', #esto es equivalente a palette
linewidth=3.5, #Grosor de separacion entre cada cuadro
linecolor='gray'#Color de lineas entre los cuadros
)
<AxesSubplot:>
![_images/Seaborn_40_1.png](_images/Seaborn_40_1.png)
#Si ejecutamos un heatmap limpio
sns.heatmap(
data=tips.corr(),
annot=True, #Nos ayuda a visualizar los numeros en cada cuadro
)
<AxesSubplot:>
![_images/Seaborn_41_1.png](_images/Seaborn_41_1.png)