Biblioteca Seaborn para visualización de datos en Python: Parte 1

En el artículo anterior, vimos cómo se puede usar la biblioteca Matplotlib de Python para la visualización de datos. En este artículo veremos a Seaborn, que es otro...

Introducción

En el Artículo anterior, vimos cómo se puede usar la biblioteca matplotlib de Python para Visualización de datos. En este artículo veremos nacido en el mar que es otra biblioteca extremadamente útil para la visualización de datos en Python. La biblioteca Seaborn está construida sobre Matplotlib y ofrece muchas capacidades avanzadas de visualización de datos.

Aunque la biblioteca de Seaborn se puede usar para dibujar una variedad de gráficos, como gráficos de matriz, gráficos de cuadrícula, gráficos de regresión, etc., en este artículo veremos cómo se puede usar la biblioteca de Seaborn para dibujar gráficos de distribución y categoriales. En la segunda parte de la serie, veremos cómo dibujar gráficos de regresión, gráficos de matriz y gráficos de cuadrícula.

Descarga de la biblioteca Seaborn

La biblioteca seaborn se puede descargar de varias maneras. Si está utilizando el instalador pip para las bibliotecas de Python, puede ejecutar el siguiente comando para descargar la biblioteca:

1
pip install seaborn

Alternativamente, si está utilizando la distribución Anaconda de Python, puede ejecutar el siguiente comando para descargar la biblioteca seaborn:

1
conda install seaborn

El conjunto de datos

El conjunto de datos que vamos a utilizar para dibujar nuestros gráficos será el conjunto de datos Titanic, que se descarga de forma predeterminada con la biblioteca Seaborn. Todo lo que tienes que hacer es usar la función load_dataset y pasarle el nombre del conjunto de datos.

Veamos cómo se ve el conjunto de datos del Titanic. Ejecute el siguiente script:

1
2
3
4
5
6
7
8
9
import pandas as pd
import numpy as np

import matplotlib.pyplot as plt
import seaborn as sns

dataset = sns.load_dataset('titanic')

dataset.head()

La secuencia de comandos anterior carga el conjunto de datos del Titanic y muestra las primeras cinco filas del conjunto de datos mediante la función head. La salida se ve así:

{.img-responsive}

El conjunto de datos contiene 891 filas y 15 columnas y contiene información sobre los pasajeros que abordaron el desafortunado barco Titanic. La tarea original es predecir si el pasajero sobrevivió o no dependiendo de diferentes características como su edad, boleto, cabina en la que abordó, la clase del boleto, etc. Usaremos la biblioteca de Seaborn para ver si podemos encontrar algún patrón en los datos.

Diagramas de distribución {#diagramas de distribución}

Los gráficos de distribución, como su nombre indica, son tipos de gráficos que muestran la distribución estadística de los datos. En esta sección veremos algunas de las parcelas de distribución más utilizadas en Seaborn.

El diagrama de distancia

El distplot() muestra la distribución del histograma de datos para una sola columna. El nombre de la columna se pasa como parámetro a la función distplot(). Veamos cómo se reparte el precio del billete de cada pasajero. Ejecute el siguiente script:

1
sns.distplot(dataset['fare'])

Producción:

{.img-responsive}

Puedes ver que la mayoría de los tickets se han resuelto entre 0-50 dólares. La línea que ves representa la estimación de la densidad del núcleo. Puede eliminar esta línea pasando False como parámetro para el atributo kde como se muestra a continuación:

1
sns.distplot(dataset['fare'], kde=False)

Producción:

{.img-responsive}

Ahora puede ver que no hay una línea para la estimación de la densidad del núcleo en el gráfico.

También puede pasar el valor del parámetro bins para ver más o menos detalles en el gráfico. Echa un vistazo al siguiente guión:

1
sns.distplot(dataset['fare'], kde=False, bins=10)

Aquí establecemos el número de contenedores en 10. En la salida, verá los datos distribuidos en 10 contenedores como se muestra a continuación:

Producción:

{.img-responsive}

Puedes ver claramente que para más de 700 pasajeros, el precio del billete está entre 0 y 50.

La trama conjunta

El jointplot() se usa para mostrar la distribución mutua de cada columna. Necesitas pasar tres parámetros a jointplot. El primer parámetro es el nombre de la columna para la que desea mostrar la distribución de datos en el eje x. El segundo parámetro es el nombre de la columna para la que desea mostrar la distribución de datos en el eje y. Finalmente, el tercer parámetro es el nombre del marco de datos.

Hagamos un gráfico conjunto de las columnas edad y tarifa para ver si podemos encontrar alguna relación entre las dos.

1
sns.jointplot(x='age', y='fare', data=dataset)

Producción:

{.img-responsive}

A partir de la salida, puede ver que una trama conjunta tiene tres partes. Un diagrama de distribución en la parte superior para la columna en el eje x, un diagrama de distribución a la derecha para la columna en el eje y y un diagrama de dispersión en el medio que muestra la distribución mutua de datos para ambas columnas. Puede ver que no se observa correlación entre los precios y las tarifas.

Puede cambiar el tipo de gráfico conjunto pasando un valor para el parámetro tipo. Por ejemplo, si en lugar de un diagrama de dispersión, desea mostrar la distribución de datos en forma de diagrama hexagonal, puede pasar el valor hex para el parámetro kind. Mira el siguiente guión:

1
sns.jointplot(x='age', y='fare', data=dataset, kind='hex')

Producción:

{.img-responsive}

En el diagrama hexagonal, el hexágono con la mayor cantidad de puntos adquiere un color más oscuro. Entonces, si observa el gráfico anterior, puede ver que la mayoría de los pasajeros tienen entre 20 y 30 años y la mayoría pagó entre 10 y 50 por los boletos.

La trama de pares

El paitplot() es un tipo de gráfico de distribución que básicamente traza un gráfico conjunto para todas las combinaciones posibles de columnas numéricas y booleanas en su conjunto de datos. Solo necesita pasar el nombre de su conjunto de datos como parámetro a la función pairplot() como se muestra a continuación:

1
sns.pairplot(dataset)

A continuación se muestra una instantánea de la parte de la salida:

{.img-responsive}

Nota: Antes de ejecutar el script anterior, elimine todos los valores nulos del conjunto de datos con el siguiente comando:

1
dataset = dataset.dropna()

Desde la salida del gráfico de pares, puede ver los gráficos conjuntos para todas las columnas numéricas y booleanas en el conjunto de datos Titanic.

Para agregar información de la columna categórica al gráfico de pares, puede pasar el nombre de la columna categórica al parámetro tono. Por ejemplo, si queremos graficar la información de género en el gráfico de pares, podemos ejecutar el siguiente script:

1
sns.pairplot(dataset, hue='sex')

Producción:

{.img-responsive}

En la salida puede ver la información de los machos en naranja y la información de la hembra en azul (como se muestra en la leyenda). En el diagrama conjunto en la parte superior izquierda, se puede ver claramente que entre los pasajeros sobrevivientes, la mayoría eran mujeres.

La trama de la alfombra

El rugplot() se usa para dibujar pequeñas barras a lo largo del eje x para cada punto en el conjunto de datos. Para trazar un gráfico de alfombra, debe pasar el nombre de la columna. Hagamos un diagrama de alfombra para la tarifa.

1
sns.rugplot(dataset['fare'])

Producción:

{.img-responsive}

A partir de la salida, puede ver que, como en el caso de distplot(), la mayoría de las instancias de las tarifas tienen valores entre 0 y 100.

Estos son algunos de los diagramas de distribución más utilizados que ofrece la Biblioteca Seaborn de Python. Veamos algunas de las tramas categóricas en la biblioteca de Seaborn.

Gráficos categóricos {#gráficos categóricos}

Los gráficos categóricos, como sugiere su nombre, se utilizan normalmente para trazar datos categóricos. Los gráficos categóricos trazan los valores en la columna categórica contra otra columna categórica o una columna numérica. Veamos algunos de los datos categóricos más utilizados.

El gráfico de barras

El barplot() se usa para mostrar el valor medio de cada valor en una columna categórica, contra una columna numérica. El primer parámetro es la columna categórica, el segundo parámetro es la columna numérica mientras que el tercer parámetro es el conjunto de datos. Por ejemplo, si desea conocer el valor medio de la edad de los pasajeros masculinos y femeninos, puede utilizar el gráfico de barras de la siguiente manera.

1
sns.barplot(x='sex', y='age', data=dataset)

Producción:

{.img-responsive}

A partir de la salida, puede ver claramente que la edad promedio de los pasajeros masculinos es un poco menos de 40 años, mientras que la edad promedio de las pasajeras es de alrededor de 33.

Además de encontrar el promedio, el diagrama de barras también se puede usar para calcular otros valores agregados para cada categoría. Para hacerlo, debe pasar la función agregada al estimador. Por ejemplo, puede calcular la desviación estándar para la edad de cada género de la siguiente manera:

1
2
3
4
5
6
import numpy as np

import matplotlib.pyplot as plt
import seaborn as sns

sns.barplot(x='sex', y='age', data=dataset, estimator=np.std)

Tenga en cuenta que en el script anterior usamos la función agregada std de la biblioteca numpy para calcular la desviación estándar para las edades de los pasajeros masculinos y femeninos. La salida se ve así:

{.img-responsive}

El diagrama de conteo

El gráfico de conteo es similar al gráfico de barras, sin embargo, muestra el conteo de las categorías en una columna específica. Por ejemplo, si queremos contar el número de pasajeros masculinos y femeninos, podemos hacerlo usando el diagrama de conteo de la siguiente manera:

1
sns.countplot(x='sex', data=dataset)

La salida muestra el conteo de la siguiente manera:

Producción:

{.img-responsive}

El diagrama de caja {#el diagrama de caja}

El diagrama de caja se utiliza para mostrar la distribución de los datos categóricos en forma de cuartiles. El centro de la caja muestra el valor de la mediana. El valor desde el bigote inferior hasta la parte inferior del cuadro muestra el primer cuartil. Desde la parte inferior de la caja hasta la mitad de la caja se encuentra el segundo cuartil. Desde el centro de la caja hasta la parte superior de la caja se encuentra el tercer cuartil y, finalmente, desde la parte superior de la caja hasta el bigote superior se encuentra el último cuartil.

Puedes estudiar más sobre cuartiles y diagramas de caja en este enlace.

Ahora hagamos un diagrama de caja que muestre la distribución de la edad con respecto a cada género. Debe pasar la columna categórica como primer parámetro (que es sexo en nuestro caso) y la columna numérica (edad en nuestro caso) como segundo parámetro. Finalmente, el conjunto de datos se pasa como el tercer parámetro, eche un vistazo al siguiente script:

1
sns.boxplot(x='sex', y='age', data=dataset)

Producción:

{.img-responsive}

Tratemos de entender el diagrama de caja para mujeres. El primer cuartil comienza alrededor de los 5 y termina en los 22, lo que significa que el 25 % de los pasajeros tienen entre 5 y 25 años. El segundo cuartil comienza alrededor de los 23 y termina alrededor de los 32, lo que significa que el 25 % de los pasajeros tienen entre 23 años. y 32. De igual forma, el tercer cuartil comienza y termina entre los 34 y 42 años, por lo que el 25% de los pasajeros tienen edad dentro de este rango y finalmente el cuarto o último cuartil comienza en los 43 y termina alrededor de los 65.

Si hay algún valor atípico o los pasajeros que no pertenecen a ninguno de los cuartiles, se denominan valores atípicos y se representan con puntos en el diagrama de caja.

Puede hacer que sus diagramas de caja sean más elegantes agregando otra capa de distribución. Por ejemplo, si desea ver los diagramas de caja del forraje de los pasajeros de ambos sexos, junto con la información sobre si sobrevivieron o no, puede pasar el valor sobrevivió al parámetro hue como se muestra a continuación:

1
sns.boxplot(x='sex', y='age', data=dataset, hue="survived")

Producción:

{.img-responsive}

Ahora además de la información sobre la edad de cada género, también puedes ver la distribución de los pasajeros que sobrevivieron. Por ejemplo, puede ver que entre los pasajeros masculinos, en promedio, sobrevivieron más personas jóvenes en comparación con los mayores. De manera similar, puede ver que la variación entre la edad de las pasajeras que no sobrevivieron es mucho mayor que la edad de las pasajeras sobrevivientes.

La trama del violín

El diagrama de violín es similar al diagrama de caja, sin embargo, el diagrama de violín nos permite mostrar todos los componentes que realmente corresponden al punto de datos. La función violinplot() se utiliza para trazar la trama del violín. Al igual que el diagrama de caja, el primer parámetro es la columna categórica, el segundo parámetro es la columna numérica y el tercer parámetro es el conjunto de datos.

Hagamos un diagrama de violín que muestre la distribución de la edad con respecto a cada género.

1
sns.violinplot(x='sex', y='age', data=dataset)

Producción:

{.img-responsive}

Puede ver en la figura anterior que los diagramas de violín brindan mucha más información sobre los datos en comparación con el diagrama de caja. En lugar de trazar el cuartil, el gráfico de violín nos permite ver todos los componentes que realmente corresponden a los datos. El área donde la trama del violín es más gruesa tiene un mayor número de instancias para la edad. Por ejemplo, del gráfico de violín para hombres, se evidencia claramente que el número de pasajeros con edades entre 20 y 40 años es superior al resto de los tramos de edad.

Al igual que los diagramas de caja, también puede agregar otra variable categórica al diagrama de violín usando el parámetro tono como se muestra a continuación:

1
sns.violinplot(x='sex', y='age', data=dataset, hue='survived')

{.img-responsive}

Ahora puedes ver mucha información sobre la trama del violín. Por ejemplo, si observa la parte inferior de la gráfica de violín para los machos que sobrevivieron (izquierda-naranja), puede ver que es más gruesa que la parte inferior de la gráfica de violín para los machos que no sobrevivieron (izquierda- azul). Esto significa que el número de pasajeros varones jóvenes que sobrevivieron es mayor que el número de pasajeros varones jóvenes que no sobrevivieron. Las tramas de violín transmiten mucha información, sin embargo, en el lado negativo, se necesita un poco de tiempo y esfuerzo para comprender las tramas de violín.

En lugar de trazar dos gráficos diferentes para los pasajeros que sobrevivieron y los que no, puede tener un diagrama de violín dividido en dos mitades, donde una mitad representa los sobrevivientes mientras que la otra representa a los pasajeros que no sobreviven. Para hacerlo, debe pasar True como valor para el parámetro split de la función violinplot(). Veamos cómo podemos hacer esto:

1
sns.violinplot(x='sex', y='age', data=dataset, hue='survived', split=True)

La salida se ve así:

{.img-responsive}

Ahora puede ver claramente la comparación entre la edad de los pasajeros que sobrevivieron y los que no, tanto para hombres como para mujeres.

Tanto los diagramas de violín como los de caja pueden ser extremadamente útiles. Sin embargo, como regla general, si está presentando sus datos a una audiencia no técnica, se deben preferir los diagramas de caja, ya que son fáciles de comprender. Por otro lado, si está presentando sus resultados a la comunidad de investigación, es más conveniente utilizar el diagrama de violín para ahorrar espacio y transmitir más información en menos tiempo.

La trama de la tira

El diagrama de franjas dibuja un diagrama de dispersión donde una de las variables es categórica. Hemos visto diagramas de dispersión en las secciones de diagrama conjunto y diagrama de pares donde teníamos dos variables numéricas. El gráfico de franjas es diferente en el sentido de que una de las variables es categórica en este caso, y para cada categoría en la variable categórica, verá un gráfico de dispersión con respecto a la columna numérica.

La función stripplot() se utiliza para trazar la trama del violín. Al igual que el diagrama de caja, el primer parámetro es la columna categórica, el segundo parámetro es la columna numérica y el tercer parámetro es el conjunto de datos. Mira el siguiente guión:

1
sns.stripplot(x='sex', y='age', data=dataset)

Producción:

{.img-responsive}

Puede ver las parcelas dispersas de edad tanto para hombres como para mujeres. Los puntos de datos parecen tiras. Es difícil comprender la distribución de datos en este formulario. Para comprender mejor los datos, pase True para el parámetro jitter que agrega un poco de ruido aleatorio a los datos. Mira el siguiente guión:

1
sns.stripplot(x='sex', y='age', data=dataset, jitter=True)

Producción:

{.img-responsive}

Ahora tiene una mejor vista de la distribución de la edad entre los géneros.

Al igual que los diagramas de caja y de violín, puede agregar una columna categórica adicional al diagrama de bandas usando el parámetro tono como se muestra a continuación:

1
sns.stripplot(x='sex', y='age', data=dataset, jitter=True, hue='survived')

{.img-responsive}

Una vez más, puede ver que hay más puntos para los machos que sobrevivieron cerca del final de la parcela en comparación con los que no sobrevivieron.

Al igual que las tramas de violín, también podemos dividir las tramas de tiras. Ejecute el siguiente script:

1
sns.stripplot(x='sex', y='age', data=dataset, jitter=True, hue='survived', split=True)

Producción:

{.img-responsive}

Ahora puede ver claramente la diferencia en la distribución de la edad de los pasajeros masculinos y femeninos que sobrevivieron y los que no sobrevivieron.

La trama del enjambre {#la trama del enjambre}

La trama de enjambre es una combinación de la tira y las tramas de violín. En los diagramas de enjambre, los puntos se ajustan de tal manera que no se superponen. Hagamos un diagrama de enjambre para la distribución de edad contra género. La función swarmplot() se usa para trazar la trama del violín. Al igual que el diagrama de caja, el primer parámetro es la columna categórica, el segundo parámetro es la columna numérica y el tercer parámetro es el conjunto de datos. Mira el siguiente guión:

1
sns.swarmplot(x='sex', y='age', data=dataset)

{.img-responsive}

Puede ver claramente que el gráfico anterior contiene puntos de datos dispersos como el gráfico de franjas y los puntos de datos no se superponen. Más bien, están dispuestos para dar una vista similar a la de una trama de violín.

Agreguemos otra columna categórica al diagrama de enjambre usando el parámetro hue.

1
sns.swarmplot(x='sex', y='age', data=dataset, hue='survived')

Producción:

{.img-responsive}

A partir de la salida, es evidente que la proporción de machos supervivientes es menor que la proporción de hembras supervivientes. Ya que para la trama masculina, hay más puntos azules y menos puntos naranjas. En cambio, para las hembras, hay más puntos naranjas (sobrevivientes) que puntos azules (no sobrevivientes). Otra observación es que entre los hombres menores de 10 años, más pasajeros sobrevivieron en comparación con los que no lo hicieron.

También podemos dividir las parcelas de enjambre como hicimos en el caso de las parcelas de franjas y cajas. Ejecute el siguiente script para hacerlo:

1
sns.swarmplot(x='sex', y='age', data=dataset, hue='survived', split=True)

Producción:

{.img-responsive}

Ahora puedes ver claramente que sobrevivieron más mujeres, en comparación con los hombres.

Combinación de diagramas de enjambre y violín

Los gráficos de enjambre no se recomiendan si tiene un conjunto de datos enorme, ya que no se escalan bien porque tienen que trazar cada punto de datos. Si realmente te gustan las parcelas de enjambre, una mejor manera es combinar dos parcelas. Por ejemplo, para combinar un diagrama de violín con un diagrama de enjambre, debe ejecutar el siguiente script:

1
2
sns.violinplot(x='sex', y='age', data=dataset)
sns.swarmplot(x='sex', y='age', data=dataset, color='black')

Producción:

{.img-responsive}

Si bien esta serie pretende ser un recurso detallado sobre el uso de Seaborn, hay muchos detalles que no podremos cubrir en algunas publicaciones de blog. También hay muchas otras bibliotecas de visualización para Python que tienen características que van más allá de lo que puede hacer Seaborn. Para obtener una guía más detallada sobre cómo visualizar datos en Python usando Seabor, así como otras 8 bibliotecas, consulta Visualización de datos en Python.

Conclusión

nacido en el mar es una biblioteca avanzada de visualización de datos construida sobre biblioteca matplotlib. En este artículo, analizamos cómo podemos dibujar diagramas de distribución y categóricos utilizando la biblioteca Seaborn. Esta es la Parte 1 de la serie de artículos sobre Seaborn. En el segundo artículo de la serie, veremos cómo jugamos con las funcionalidades de cuadrícula en Seaborn y cómo podemos dibujar Gráficos de matriz y regresión en Seaborn.

Licensed under CC BY-NC-SA 4.0