Seaborn para visualización de datos | Una guía para principiantes de Seaborn

Contenidos

Este artículo fue publicado como parte del Blogatón de ciencia de datos.

Introducción

¡Una guía paso a paso para comenzar con Seaborn!

Si matplotlib «intenta hacer las cosas fáciles fáciles y las difíciles posibles», seaborn intenta hacer que un conjunto bien definido de cosas difíciles también sea fácil.

Frescura de Seaborn:

Las mayores fortalezas de Seaborn son su diversidad de funciones de trazado. ¡Nos permite hacer gráficos complicados incluso en una sola línea de código!

En este tutorial, utilizaremos tres bibliotecas para hacer el trabajo: Matplotlib, Seaborn, Pandas. Si eres un principiante completo en Python, te sugiero que comiences y te familiarices un poco con Matplotlib y Pandas.

Si sigue exactamente este tutorial, podrá crear hermosos gráficos con estas tres bibliotecas. A continuación, puede utilizar mi código como plantilla para futuras tareas de visualización en el futuro.

Comencemos nuestro viaje en el mar con el famoso conjunto de datos de Pokémon. Antes de comenzar, le recomiendo encarecidamente que escriba sus propios códigos base para cada gráfico e intente experimentar con gráficos.

Puedes encontrar el conjunto de datos de Pokémon en Kaggle. Sin embargo, para facilitar su viaje, he acortado y limpiado esta versión del conjunto de datos.

Puede descargar el conjunto de datos aquí: https://github.com/shelvi31/Seaborn-Experiments

Mi súper ahorrador: Me gustaría mencionar un recurso que siempre es mi súper ahorro cuando estoy atascado. https://python-graph-gallery.com/ .

Empecemos ahora:

Comenzaremos con la importación de las bibliotecas necesarias:

#importing libraries
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

Leer el archivo CSV

data = pd.read_csv(“Pokemon.csv”,encoding= ‘unicode_escape’)

Cambié el error del códec utf8 definiendo un paquete de códec diferente en el comando read_csv ().

Nuestros datos se parecen a esto….

data.head()

Producción:

1ntc2mvcn4dz7uexdgfr1og-5583287Producción

El nombre de las columnas no simplifica claramente su propósito. Es importante conocer el conjunto de datos antes de trabajar en él.

Aquí está la descripción simplificada del conjunto de datos para usted.

Este conjunto de datos incluye 150 Pokémon, se trata de los juegos de Pokémon (NO tarjetas de Pokémon o Pokémon Go).

En este conjunto de datos, tenemos 150 filas y 13 columnas.

Descripción de las columnas:

# ID para cada pokemon
# Nombre: Nombre de cada pokemon
# Tipo 1: cada pokemon tiene un tipo, esto determina la debilidad / resistencia a los ataques
# Tipo 2: Algunos Pokémon son de tipo dual y tienen 2
# Total: suma de todas las estadísticas que vienen después de esto, una guía general de qué tan fuerte es un Pokémon
# HP: puntos de golpe, o salud, define cuánto daño puede soportar un pokemon antes de desmayarse
# Ataque: el modificador base para ataques normales (por ejemplo, Scratch, Punch)
# Defensa: la resistencia base al daño contra ataques normales.
# SP Atk: ataque especial, el modificador base para ataques especiales (por ejemplo, explosión de fuego, haz de burbujas)
# SP Def: la resistencia base al daño contra ataques especiales
# Velocidad: determina qué Pokémon ataca primero en cada ronda.
# Etapa: Número de generación
#Legendario: verdadero si es un Pokémon legendario, falso si no

He cambiado el nombre de los nombres de las columnas para dar más sentido a nuestro trazado y para mayor claridad mental. Aunque es opcional, le recomiendo encarecidamente que lo haga para eliminar cualquier posibilidad de confusión.

data.rename(columns = {“#”:”No.”,”Type 1":”Pokemon_Type”,”Type 2":”PokemonType2",’Total’:’Sum of Attack’,”HP”:”Hit Points”,”Attack” : “Attack Strength”, “Defense”:”Defensive Strength”,”Sp. Atk”:”Special Attack Stenth”,”Sp. Def”:”Special Defense Strength”,”Stage”:”Generation”}, inplace = True)data.head()

Mi salida ahora se ve:

1q7lk5dweusqe-swaeoi9ba-7965674¡Mucho mejor!

Comencemos la visualización con los simples, el gráfico de distribuciones.

Parcelas de distribución:

A parcela de distribución muestra un distribución y rango de un conjunto de valores numéricos trazados contra una dimensión. Los histogramas le permiten trazar las distribuciones de variables numéricas.

Podría haber usado «Data.hist (figsize = (12,10), bins = 20)» , pero como no todas las columnas de esta base de datos tienen valores numéricos. Por lo tanto, tengo que trazar parcelas de distribución individuales.

plt.figure(figsize=(4,3))
sns.distplot(x=data[“Sum of Attack”],color=”Orange”,kde=True,rug=True);
plt.show()

Salida de la gráfica de distribución: suma del ataque de Pokémon

La función de trazado de seaborn traza un histograma con una curva de densidad. Podemos eliminar la densidad usando la opción kde = ”False”. Controlar la presencia de alfombras usando rug = ”True”.

Hay muchas formas alternativas de trazar un histograma en Python:

plt.figure(figsize=(3,3))
sns.histplot(x=data[“Sum of Attack”],color=”Green”);
plt.show()
Resultado: Suma de los ataques de Pokémon

Otra forma es: usando plt.hist ()

plt.figure(figsize=(3,3))
plt.hist(x=data["Sum of Attack"],color="Red",bins=20);
plt.show()
Salida: histograma, Matplotlib

Por lo tanto, existen muchas formas de graficar distribuciones. Todas las funciones pyplot.hist, seaborn.coOutuntplot y seaborn.displot actúan como envoltorios para un diagrama de barras de matplotlib y se pueden usar si trazar manualmente dicho diagrama de barras se considera demasiado engorroso.

  • Para variables discretas, un seaborn.countplot es más conveniente.
  • Para variables continuas: pyplot.hist o seaborn.distplot son usados.

Parcelas de distribución conjunta:

Los diagramas de distribución conjunta combinan información de diagramas de dispersión e histogramas para darnos información detallada para distribuciones bivariadas.

sns.jointplot(x=data[“Sum of Attack”],y=data[“Defensive Strength”],color=”Red”);
1oaifcmdjkydf4jc89dfmiw-1929873

Salida: Jointplot

Gráficos de densidad:

Los gráficos de densidad muestran la distribución entre dos variables.

sns.kdeplot(x=data[“Sum of Attack”],y=data[“Defensive Strength”])
plt.show()
13rfvxuah1m7x_etcoadunq-5218802Salida: Gráfico de densidad

Gráfico de barras

Los diagramas de barras nos ayudan a visualizar las distribuciones de variables categóricas: Countplot es un tipo de diagrama de barras.

plt.figure(figsize=(10,6));
sns.countplot(x=data.Pokemon_Type,palette=pkmn_type_colors);
plt.show()
1lc4mpdykjuhs8gx4i7j4na-9020691Salida: Gráfico de barras

Mapa de calor

Mapa de calor nos ayuda a visualizar datos matriciales en forma de puntos calientes y fríos. Los colores cálidos indicaron las secciones con la mayor interacción de los visitantes.

plt.figure(figsize=(8,6));
sns.heatmap(data.corr());# Rotate x-labels with the help of matplotlib
plt.xticks(rotation=-45);
1frw2vrtgip5479a0bfegog-1640678Salida: mapa de calor

Gráfico de dispersión:

A gráfico de dispersión (también conocido como dispersión gráfico, Gráfico de dispersión) utiliza puntos para representar valores para dos variables numéricas diferentes. La posición de cada punto en el eje horizontal y vertical indica valores para un punto de datos individual.

Gráfico de dispersión se utilizan para observar relaciones entre variables.

He comparado las estadísticas de ataque y defensa de nuestros Pokémon con la ayuda de diagramas de dispersión.

1t7kwpsrtx-m2pz7tpcrc2a-6289070Salida: gráfico de dispersión

Seaborn no tiene una función de diagrama de dispersión dedicada, por lo que vemos una línea diagonal (línea de regresión) aquí de forma predeterminada.

Afortunadamente, seaborn nos ayuda a modificar la trama:

  • fit_reg = False se usa para eliminar la línea de regresión
  • hue = ‘Stage’ se usa para colorear puntos por un tercer valor variable. De esta forma, nos permite expresar la tercera dimensión de la información utilizando el color.

¡Aquí tengo la etapa de evolución de Pokémon como tercera variable!

#Tweaking with scatter plotsns.lmplot(x=’Attack Strength’, y=’Defensive Strength’, data=data,
 fit_reg = False, #Deleting regression line
 hue=”Generation”); #Separating as per pokemon generation
1khildisnqqzx7wqnlb8w3a-2590333Resultado: gráfico de dispersión ajustado

Más de la densidad cae en la marca 40-120, alteraré los límites de los ejes con la ayuda de matplotlib:

sns.lmplot(x=’Attack Strength’, y=’Defensive Strength’, data=data,
fit_reg = False, #Deleting regression line
hue=”Generation”); #Separating as per pokemon generationplt.ylim(20,130);
plt.xlim(25,125);

¡Ahora podemos ver un gráfico mejor y más enfocado!

1jndlxwrmufgwu3o4e7lrwg-5414401Resultado: mejor trazado de dispersión

Diagrama de caja

Se utiliza un diagrama de caja para representar grupos de datos numéricos a través de su cuartiles.

Los diagramas de caja también pueden tener líneas que se extienden desde las cajas indicando variabilidad fuera del cuartiles superior e inferior, de ahí los términos diagrama de caja y bigotes y diagrama de caja y bigotes

Podemos eliminar la columna «Suma de ataque» ya que tenemos estadísticas individuales. También podemos eliminar las columnas «Generación» y «Legendario» porque no están combatiendo las estadísticas.

plt.figure(figsize=(15,7));# Pre-format DataFrame
stats_data = data.drop([‘Sum of Attack’, ‘Generation’, ‘Legendary’], axis=1);
 
# New boxplot using stats_df
sns.boxplot(data=stats_data,
 showfliers=False); #Removing outlierssns.set_style(“whitegrid”)
1eo6ldo0simjfsrnkj8bz7a-9034159Salida: Diagrama de caja

Recuerde mantener el tamaño de la figura antes de trazar el gráfico.

Tramas de violín

Ahora trazaré la trama del violín.

Los diagramas de violín son alternativas a los diagramas de caja. Muestran la distribución (a través del grosor del violín) en lugar de solo las estadísticas de resumen.

Aquí he mostrado la distribución de Ataque por tipo primario de Pokémon

plt.figure(figsize=(15,7));
sns.violinplot(x=data.Pokemon_Type, y = data[“Attack Strength”]);
1qnzsrsrsqmf1c9hro9vvjw-9594682Salida: Parcela de violín

Como puede ver, los tipos Dragón tienden a tener estadísticas de ataque más altas que los tipos Fantasma, pero también tienen una mayor variación.

Ahora, los fanáticos de Pokémon pueden encontrar algo bastante discordante en esa trama: Los colores son absurdos. ¿Por qué el tipo Hierba es de color rosa o el tipo Agua es de color naranja? ¡Debemos arreglar esto de inmediato!

Afortunadamente, Seaborn nos permite configurar paletas de colores personalizadas. Simplemente podemos crear un pedido Lista de Python de valores hexadecimales de color.

He usado Bulbapedia para crear una nueva paleta de colores.

# using Bulbapedia to create a new color palette:#Bulbapedia : https://bulbapedia.bulbagarden.net/wiki/Category:Type_color_templatspkmn_type_colors = [‘#78C850’, # Grass
 ‘#F08030’, # Fire
 ‘#6890F0’, # Water
 ‘#A8B820’, # Bug
 ‘#A8A878’, # Normal
 ‘#A040A0’, # Poison
 ‘#F8D030’, # Electric
 ‘#E0C068’, # Ground
 ‘#EE99AC’, # Fairy
 ‘#C03028’, # Fighting
 ‘#F85888’, # Psychic
 ‘#B8A038’, # Rock
 ‘#705898’, # Ghost
 ‘#98D8D8’, # Ice
 ‘#7038F8’, # Dragon
 ]

Realización de modificaciones en la trama del violín según el color del tipo de Pokémon:

plt.figure(figsize=(15,7));
sns.violinplot(x=data.Pokemon_Type, 
 y = data[“Attack Strength”],
 palette = pkmn_type_colors);
1-tvwskx4h42-98x_zjjnpq-2443527Resultado: Mejor trama de violín 🙂

Swarmplots

Como ha visto, los gráficos de violín son excelentes para visualizar distribuciones.

Sin embargo, dado que solo tenemos 150 Pokémon en nuestro conjunto de datos, es posible que queramos simplemente mostrar cada punto. Ahí es donde el trama de enjambre entra. Esta visualización mostrará cada punto, mientras «apila» aquellos con valores similares.

plt.figure(figsize=(12,5));
sns.swarmplot(x=data.Pokemon_Type,y=data[“Attack Strength”],palette=pkmn_type_colors);
1knf0pcuh9euqlto6qy353g-2332982Swarmplot: Pokémon Tipo Vs Fuerza de ataque

Esto se ve bien, pero para obtener mejores imágenes, ¡podemos combinar estos dos! Después de todo, muestran la misma información.

Gráficos superpuestos

plt.figure(figsize=(10,10))sns.violinplot(x=data.Pokemon_Type, y = data[“Attack Strength”],
 inner=None, 
 palette = pkmn_type_colors);sns.swarmplot(x=”Pokemon_Type”,
y=”Attack Strength”,
data=data,
color=’black’, #making points black
alpha=0.5);plt.title(“Attacking Strength as per Pokemon’s Type”);
19wpmqdoiwqqrzvx4paraxg-3042779Gráficos superpuestos

Puntos a tener en cuenta:

inner = None: quita las barras dentro de los violines

alpha = 0.5: hace que los puntos sean ligeramente transparentes: recuerde que el valor alfa debe ser flotante, no lo mantenga en «»

Puede encontrar las referencias para el color marino aquí: https://python-graph-gallery.com/100-calling-a-color-with-seaborn/

Gráficos de factores

Las gráficas de factores facilitan la separación de las gráficas por clases categóricas.

plt.figure(figsize=(5,15))
factplot= sns.factorplot(x="Pokemon_Type",y="Attack Strength",data=data,hue="Generation",col="Generation",kind="swarm");factplot.set_xticklabels(rotation=-45)
plt.show()
14qb1b2gfb2csf8dbhbsyxg-8854765Factorplot: para clases categóricas separadas

Notas rápidas:

  • plt.xticks (rotación = -45): no funciona porque solo rota el último gráfico
  • Necesita usar: set_xticklabels
Suscribite a nuestro Newsletter

No te enviaremos correo SPAM. Lo odiamos tanto como tú.