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

En el artículo anterior Biblioteca Seaborn para visualización de datos en Python: Parte 1, vimos cómo se usa la Biblioteca Seaborn para trazar distribuciones y categorías...

En el artículo anterior Biblioteca Seaborn para visualización de datos en Python: Parte 1, vimos cómo la Biblioteca nacida del mar se utiliza para trazar diagramas distribucionales y categoriales. En este artículo continuaremos nuestra discusión y veremos algunas de las otras funcionalidades que ofrece Seaborn para dibujar diferentes tipos de tramas. Comenzaremos nuestra discusión con Matrix Plots.

Gráficos de matriz {#gráficos de matriz}

Los gráficos matriciales son el tipo de gráficos que muestran datos en forma de filas y columnas. Los mapas de calor son los principales ejemplos de diagramas de matriz.

Mapas de calor {#mapas de calor}

Los mapas de calor se utilizan normalmente para trazar la correlación entre columnas numéricas en forma de matriz. Es importante mencionar aquí que para dibujar gráficos matriciales, debe tener información significativa tanto en las filas como en las columnas. Continuando con el tema del último artículo, tracemos las primeras cinco filas del conjunto de datos del Titanic para ver si tanto las filas como los encabezados de columna tienen información significativa. 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()

En la salida, verá el siguiente resultado:

{.img-responsive}

A partir de la salida, puede ver que los encabezados de columna contienen información útil, como los pasajeros que sobrevivieron, su edad, tarifa, etc. Sin embargo, los encabezados de fila solo contienen índices 0, 1, 2, etc. tanto las columnas como los encabezados de las filas. Una forma de hacer esto es llamar al método corr() en el conjunto de datos. La función corr() devuelve la correlación entre todas las columnas numéricas del conjunto de datos. Ejecute el siguiente script:

1
dataset.corr()

En el resultado, verá que tanto las columnas como las filas tienen información de encabezado significativa, como se muestra a continuación:

{.img-responsive}

Ahora, para crear un mapa de calor con estos valores de correlación, debe llamar a la función heatmap() y pasarle su marco de datos de correlación. Mira el siguiente guión:

1
2
corr = dataset.corr()
sns.heatmap(corr)

La salida se ve así:

{.img-responsive}

A partir de la salida, se puede ver que lo que hace esencialmente el mapa de calor es trazar un cuadro para cada combinación de filas y valores de columna. El color de la caja depende del degradado. Por ejemplo, en la imagen de arriba si hay una alta correlación entre dos características, la celda correspondiente o el cuadro es blanco, por otro lado, si no hay correlación, la celda correspondiente permanece negra.

Los valores de correlación también se pueden trazar en el mapa de calor pasando True para el parámetro annot. Ejecute el siguiente script para ver esto en acción:

1
2
corr = dataset.corr()
sns.heatmap(corr, annot=True)

Producción:

{.img-responsive}

También puede cambiar el color del mapa de calor pasando un argumento para el parámetro cmap. Por ahora, solo mira el siguiente script:

1
2
corr = dataset.corr()
sns.heatmap(corr, cmap='winter')

La salida se ve así:

{.img-responsive}

Además de simplemente usar la correlación entre todas las columnas, también puede usar la función pivot_table para especificar el índice, la columna y los valores que desea ver correspondientes al índice y las columnas. Para ver la función pivot_table en acción, usaremos el conjunto de datos "flights" que contiene la información sobre el año, el mes y la cantidad de pasajeros que viajaron en ese mes.

Ejecute el siguiente script para importar el conjunto de datos y ver las primeras cinco filas del conjunto de datos:

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('flights')

dataset.head()

Producción:

{.img-responsive}

Ahora, usando la función pivot_table, podemos crear un mapa de calor que muestre la cantidad de pasajeros que viajaron en un mes específico de un año específico. Para hacerlo, pasaremos month como valor para el parámetro index. El atributo index corresponde a las filas. A continuación, debemos pasar año como valor para el parámetro columna. Y finalmente para el parámetro valores, pasaremos la columna pasajeros. Ejecute el siguiente script:

1
2
data = dataset.pivot_table(index='month', columns='year', values='passengers')
sns.heatmap(data)

La salida se ve así:

{.img-responsive}

De los resultados se desprende que en los primeros años el número de pasajeros que tomaban los vuelos era menor. A medida que avanzan los años, aumenta el número de pasajeros.

Actualmente, puede ver que los cuadros o las celdas se superponen en algunos casos y la distinción entre los límites de las celdas no es muy clara. Para crear un límite claro entre las celdas, puede utilizar los parámetros linecolor y linewidths. Echa un vistazo al siguiente script:

1
2
data = dataset.pivot_table(index='month', columns='year', values='passengers' )
sns.heatmap(data, linecolor='blue', linewidth=1)

En el script anterior, pasamos "blue" como valor para el parámetro linecolor, mientras que el parámetro linewidth se establece en 1. En la salida, verá un límite azul alrededor de cada celda:

{.img-responsive}

Puede aumentar el valor del parámetro linewidth si desea límites más gruesos.

Mapa de clúster

Además de los mapas de calor, otro gráfico de matriz de uso común es el mapa de conglomerados. El mapa de clústeres básicamente usa agrupamiento jerárquico para agrupar las filas y columnas de la matriz.

Tracemos un mapa de conglomerados para la cantidad de pasajeros que viajaron en un mes específico de un año específico. Ejecute el siguiente script:

1
2
data = dataset.pivot_table(index='month', columns='year', values='passengers')
sns.clustermap(data)

Para trazar un mapa de clúster, se usa la función clustermap y, al igual que la función de mapa de calor, el conjunto de datos pasado debe tener encabezados significativos tanto para las filas como para las columnas. La salida del script anterior se ve así:

{.img-responsive}

En el resultado, puede ver meses y años agrupados en función de la cantidad de pasajeros que viajaron en un mes específico.

Con esto, concluimos nuestra discusión sobre las gráficas Matrix. En la siguiente sección, comenzaremos nuestra discusión sobre las capacidades de cuadrícula de la biblioteca Seaborn.

Rejillas marinas

Las cuadrículas en Seaborn nos permiten manipular las subtramas según las características utilizadas en las tramas.

Cuadrícula de pares

En la Parte 1 de esta serie de artículos, vimos cómo se puede usar el gráfico de pares para dibujar un gráfico de dispersión para todas las combinaciones posibles de las columnas numéricas en el conjunto de datos.

Revisemos el diagrama de pares aquí antes de que podamos pasar a la cuadrícula de pares. El conjunto de datos que vamos a utilizar para la sección de cuadrícula de pares es el conjunto de datos "iris" que se descarga de forma predeterminada cuando descarga la biblioteca seaborn. Ejecute el siguiente script para cargar el conjunto de datos del iris:

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('iris')

dataset.head()

Las primeras cinco filas del conjunto de datos del iris se ven así:

{.img-responsive}

Ahora dibujemos un gráfico de pares en el conjunto de datos del iris. Ejecute el siguiente script:

1
sns.pairplot(dataset)

Una instantánea de la salida se ve así:

{.img-responsive}

Ahora, tracemos la cuadrícula de pares y veamos la diferencia entre la gráfica de pares y la cuadrícula de pares. Para crear una cuadrícula de pares, simplemente debe pasar el conjunto de datos a la función PairGrid, como se muestra a continuación:

1
sns.PairGrid(dataset)

Producción:

{.img-responsive}

En la salida, puede ver cuadrículas vacías. Esto es esencialmente lo que hace la función de cuadrícula de pares. Devuelve un conjunto vacío de cuadrículas para todas las características del conjunto de datos.

A continuación, debe llamar a la función mapa en el objeto devuelto por la función de cuadrícula de pares y pasarle el tipo de gráfico que desea dibujar en las cuadrículas. Tracemos un diagrama de dispersión usando la cuadrícula de pares.

1
2
grids = sns.PairGrid(dataset)
grids.map(plt.scatter)

La salida se ve así:

{.img-responsive}

Puede ver diagramas de dispersión para todas las combinaciones de columnas numéricas en el conjunto de datos "iris".

También puede trazar diferentes tipos de gráficos en la misma cuadrícula de pares. Por ejemplo, si desea trazar un diagrama de "distribución" en la diagonal, "kdeplot" en la mitad superior de la diagonal y un diagrama de "dispersión" en la parte inferior de la diagonal, puede usar funciones map_diagonal, map_upper y map_lower, respectivamente. El tipo de gráfico a dibujar se pasa como parámetro a estas funciones. Echa un vistazo al siguiente script:

1
2
3
4
grids = sns.PairGrid(dataset)
grids.map_diag(sns.distplot)
grids.map_upper(sns.kdeplot)
grids.map_lower(plt.scatter)

La salida del script anterior se ve así:

{.img-responsive}

Puede ver el verdadero poder de la función de cuadrícula de pares en la imagen de arriba. En las diagonales tenemos diagramas de distribución, en la mitad superior tenemos los diagramas de densidad kernel, mientras que en la mitad inferior tenemos los diagramas de dispersión.

Cuadrículas de facetas

Las cuadrículas de facetas se utilizan para trazar dos o más de dos características categóricas frente a dos o más de dos características numéricas. Tracemos una cuadrícula de facetas que represente el gráfico de distribución de género vs vivo con respecto a la edad de los pasajeros.

Para esta sección, volveremos a utilizar el conjunto de datos del Titanic. Ejecute el siguiente script para cargar el conjunto de datos Titanic:

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

import matplotlib.pyplot as plt
import seaborn as sns

dataset = sns.load_dataset('titanic')

Para dibujar una cuadrícula facetada, se utiliza la función FacetGrid(). El primer parámetro de la función es el conjunto de datos, el segundo parámetro col especifica la función para trazar en las columnas, mientras que el parámetro fila especifica la función en las filas. La función FacetGrid() devuelve un objeto. Al igual que la cuadrícula de pares, puede usar la función mapa para especificar el tipo de gráfico que desea dibujar.

Ejecute el siguiente script:

1
2
grid = sns.FacetGrid(data=dataset, col='alive', row='sex')
grid.map(sns.distplot, 'age')

En la secuencia de comandos anterior, trazamos el diagrama de distribución para la edad en la cuadrícula de facetas. La salida se ve así:

{.img-responsive}

Desde la salida, puede ver cuatro parcelas. Uno por cada combinación de género y supervivencia del pasajero. Las columnas contienen información sobre la supervivencia, mientras que las filas contienen información sobre el sexo, según lo especificado por la función FacetGrid().

La primera fila y la primera columna contienen la distribución por edades de los pasajeros donde el sexo es masculino y los pasajeros no sobrevivieron. La primera fila y la segunda columna contienen la distribución por edades de los pasajeros donde el sexo es masculino y los pasajeros sobrevivieron. De manera similar, la segunda fila y la primera columna contienen la distribución por edades de los pasajeros donde el sexo es femenino y los pasajeros no sobrevivieron, mientras que la segunda fila y la segunda columna contienen la distribución por edades de los pasajeros donde el sexo es femenino y los pasajeros sobrevivieron.

Además de los diagramas de distribución para una característica, también podemos trazar diagramas de dispersión que involucren dos características en la cuadrícula de facetas.

Por ejemplo, el siguiente guión traza el gráfico de dispersión para la edad y la tarifa para ambos sexos de los pasajeros que sobrevivieron y los que no.

1
2
grid = sns.FacetGrid(data= dataset, col= 'alive', row = 'sex')
grid.map(plt.scatter, 'age', 'fare')

La salida del script anterior se ve así:

{.img-responsive}

Gráficos de regresión {#gráficos de regresión}

Los gráficos de regresión, como sugiere el nombre, se utilizan para realizar [análisis de regresión] (https://en.wikipedia.org/wiki/Regression_analysis) entre dos o más variables.

En esta sección, estudiaremos la gráfica del modelo lineal que traza una relación lineal entre dos variables junto con la línea de regresión que mejor se ajusta según los datos.

El conjunto de datos que vamos a utilizar para esta sección es el conjunto de datos "diamantes" que se descarga de forma predeterminada con la biblioteca seaborn. Ejecute el siguiente script para cargar el conjunto de datos:

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('diamonds')

dataset.head()

El conjunto de datos se ve así:

{.img-responsive}

El conjunto de datos contiene diferentes características de un diamante, como el peso en quilates, el color, la claridad, el precio, etc.

Tracemos una relación lineal entre el quilate y el precio del diamante. Idealmente, cuanto más pesado sea el diamante, mayor debería ser el precio. Veamos si esto es realmente cierto según la información disponible en el conjunto de datos de diamantes.

Para trazar el modelo lineal, se usa la función lmplot(). El primer parámetro es la característica que desea trazar en el eje x, mientras que la segunda variable es la característica que desea trazar en el eje y. El último parámetro es el conjunto de datos. Ejecute el siguiente script:

1
sns.lmplot(x='carat', y='price', data=dataset)

La salida se ve así:

{.img-responsive}

También puede trazar varios modelos lineales basados ​​en una característica categórica. El nombre de la función se pasa como valor al parámetro hue. Por ejemplo, si desea trazar múltiples modelos lineales para la relación entre el quilate y el precio, según el corte del diamante, puede usar la función lmplot de la siguiente manera:

1
sns.lmplot(x='carat', y='price', data=dataset, hue='cut')

La salida se ve así:

{.img-responsive}

A partir de la salida, puede ver que la relación lineal entre el quilate y el precio del diamante es más pronunciada para el diamante de talla ideal como se esperaba y el modelo lineal es más superficial para el diamante de talla justa.

Además de trazar los datos de la función de corte con diferentes tonos, también podemos tener un gráfico para cada corte. Para hacerlo, debe pasar el nombre de la columna al atributo cols. Echa un vistazo al siguiente script:

1
sns.lmplot(x='carat', y='price', data=dataset, col='cut')

En el resultado, verá una columna separada para cada valor en la columna de corte del conjunto de datos de diamantes, como se muestra a continuación:

{.img-responsive}

También puede cambiar el tamaño y la relación de aspecto de los gráficos utilizando los parámetros aspect y size. Echa un vistazo al siguiente script:

1
sns.lmplot(x='carat', y = 'price', data= dataset, col = 'cut', aspect = 0.5, size = 8 )

El parámetro aspect define la relación de aspecto entre el ancho y el alto. Una relación de aspecto de 0,5 significa que el ancho es la mitad de la altura, como se muestra en la salida.

{.img-responsive}

Puede ver que el tamaño de la trama ha cambiado, el tamaño de la fuente sigue siendo muy pequeño. En la siguiente sección, veremos cómo controlar las fuentes y los estilos de las tramas de Seaborn.

Estilo de trama {#trazado de estilo}

La biblioteca Seaborn viene con una variedad de opciones de estilo. En esta sección, veremos algunos de ellos.

Establecer estilo {#establecer estilo}

La función set_style() se utiliza para establecer el estilo de la cuadrícula. Puede pasar darkgrid, whitegrid, dark, white y ticks como parámetros a la función set_style.

Para esta sección, volveremos a utilizar el "conjunto de datos titánico". Ejecute el siguiente script para ver el estilo darkgrid.

1
2
sns.set_style('darkgrid')
sns.distplot(dataset['fare'])

La salida se ve así;

{.img-responsive}

En la salida, puede ver que tenemos un fondo oscuro con cuadrículas. Veamos cómo se ve whitegrid. Ejecute el siguiente script:

1
2
sns.set_style('whitegrid')
sns.distplot(dataset['fare'])

La salida se ve así:

{.img-responsive}

Ahora puede ver que todavía tenemos cuadrículas en el fondo, pero el fondo gris oscuro no es visible. Te sugiero que pruebes y juegues con el resto de opciones y veas qué estilo se adapta a ti.

Cambiar el tamaño de la figura

Dado que Seaborn usa las funciones de Matplotlib detrás de escena, puede usar el paquete pyplot de Matplotlib para cambiar el tamaño de la figura como se muestra a continuación:

1
2
plt.figure(figsize=(8,4))
sns.distplot(dataset['fare'])

En el script anterior, establecemos el ancho y la altura de la trama en 8 y 4 pulgadas respectivamente. La salida del script anterior se ve así:

{.img-responsive}

Establecer contexto

Además del cuaderno, es posible que deba crear tramas para carteles. Para hacerlo, puede usar la función set_context() y pasarla poster como el único atributo como se muestra a continuación:

1
2
sns.set_context('poster')
sns.distplot(dataset['fare'])

En la salida, debería ver un gráfico con las especificaciones del póster como se muestra a continuación. Por ejemplo, puede ver que las fuentes son mucho más grandes en comparación con los gráficos normales.

{.img-responsive}

Conclusión

Biblioteca nacida del mar es una biblioteca avanzada de Python para la visualización de datos. Este artículo es la Parte 2 de la serie de artículos sobre Seaborn para visualización de datos en Python. En este artículo, vimos cómo trazar gráficos de regresión y matriz en Seaborn. También vimos cómo cambiar los estilos de trama y usar funciones de cuadrícula para manipular subtramas. En el próximo artículo, veremos cómo se pueden usar las capacidades integradas de la biblioteca Pandas de Python para la visualización de datos. e datos.

Licensed under CC BY-NC-SA 4.0