4.4. Visualizaciones#

El análisis visual de los datos es discutiblemente uno de los aspectos más importantes del proceso analítico. En python existen múltiples librerías para generar visualizaciones informativas y hermosas, en esta libreta aprenderás los aspectos básicos de cómo utilizar dos de ellas matplotlib y seaborn.

Trabajaremos con los mismos datos que hemos estado analizando palmer penguins.

4.4.1. Cargar librerías#

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
print('Importaciones listas')
Importaciones listas

4.4.2. Carga de datos#

url = 'https://raw.githubusercontent.com/raphaelvallat/pingouin/refs/heads/main/src/pingouin/datasets/penguins.csv'

df = pd.read_csv(url)
df.head()
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
0 Adelie Biscoe 37.8 18.3 174.0 3400.0 female
1 Adelie Biscoe 37.7 18.7 180.0 3600.0 male
2 Adelie Biscoe 35.9 19.2 189.0 3800.0 female
3 Adelie Biscoe 38.2 18.1 185.0 3950.0 male
4 Adelie Biscoe 38.8 17.2 180.0 3800.0 male

4.4.3. Análisis con matplotlib#

Retomaremos la última figura del tema de descriptivos básicos. Pudimos usar pandas para separar por color las tres especies pero no sabíamos cuál era cual. Retomaremos esto con matplotlib.

Por favor revisa los acordeone y la documentación de la librería.

Importante

En particular revisa la guía de inicio rápido de matplotlib que puedes encontrar aquí: https://matplotlib.org/stable/users/explain/quick_start.html

Primero, volvamos a hacer la gráfica sin color.

plt.scatter( # matplotlib también tiene una función para la gráfica de dispersión
    x=df['bill_length_mm'],
    y=df['bill_depth_mm'],
)
<matplotlib.collections.PathCollection at 0x11f880b1d30>
../_images/e5b778b7ed32da55dfd36944f5a49073b649d2717f5af48c5b5395a7b6d44869.png

Podemos ver nuevamente los conglomerados, vamos a colorearlos, pero primero veamos el algoritmo de cómo lo vamos a hacer.

        flowchart TD;
	A[Separar especies] -->
	B(Por cada una) --> 
	C[Generar dispersión] -->
	D[Dar color]
    

Sin embargo, primero entonces necesatamos saber cómo separar a las especies.

En pandas podemos generar un filtro de la siguiente manera:

filtro = df[columna] == valor
filtrados = df[filtro]

Probémoslo seleccionando a los Gentoo.

es_gentoo = df['species'] == 'Gentoo'
gentoo = df[es_gentoo]
gentoo.head() 
species island bill_length_mm bill_depth_mm flipper_length_mm body_mass_g sex
220 Gentoo Biscoe 46.1 13.2 211.0 4500.0 female
221 Gentoo Biscoe 50.0 16.3 230.0 5700.0 male
222 Gentoo Biscoe 48.7 14.1 210.0 4450.0 female
223 Gentoo Biscoe 50.0 15.2 218.0 5700.0 male
224 Gentoo Biscoe 47.6 14.5 215.0 5400.0 male

Ahora veamos qué pasa si lo graficamos

plt.scatter(
    x=gentoo['bill_length_mm'],
    y=gentoo['bill_depth_mm'],
)
<matplotlib.collections.PathCollection at 0x11f8a2c6350>
../_images/2545efb59daf7344262afd823d5ee63034919c7567ead69dba0c7424d172889c.png

Intenta buscar este patrón en el grafico de todas las especies.

Ahora apliquemos esto en un bucle for.

especies = ['Adelie', 'Gentoo', 'Chinstrap']
for especie in especies:
    filtro = df['species'] == especie
    datos_especie = df[filtro]
    plt.scatter(
        x=datos_especie['bill_length_mm'],
        y=datos_especie['bill_depth_mm'],
        label=especie, # paso clave
    )
    plt.legend() # le dice a matplotlib que ponga la leyenda.
# mira la magia
../_images/d6750714ace28e383cafb5c11719001bd9d72ce2411a74eee6c42d5c04891b56.png

Como ves, a pesar de que generamos tres «gráficos» diferentes, uno por cada especie, en realidad todos se fueron a la misma figura.

4.4.4. Análisis con seaborn#

Ahora, solo para calentar motores, miremos como se ve esto con seaborn.

sns.scatterplot(
    data=df, # todos los datos
    x='bill_length_mm', # solo el nombre, no los datos
    y='bill_depth_mm', # igual
    hue='species' # columna para separar colores
)
<Axes: xlabel='bill_length_mm', ylabel='bill_depth_mm'>
../_images/15dc237f856ea80a281be1cb40adbc63ad4009bb8c36adb8e7008f17fa1dc9ee.png

Como ves seaborn abrevia en una sola función de fácil uso, lo que hicimos con plt. Incluso mejor, porque agrega los rótulos de los ejes, cosa que nosotros no hicimos con plt.

4.4.4.1. Las cuatro principales#

Seaborn ofrece tres funciones principales que concentran un enorme porcentaje de nuestras necesidades de visualización:

Función

Documentación

Uso

sns.relplot

liga

Analizar la relación entre variables.

sns.lmplot

liga

Visualizar modelos de regresión lineal (GLM)

sns.catplot

liga

Visualizar variables categóricas y su relación con cuantitativas

sns.displot

liga

Visualizar distribuciones

A continuación veremos solo algunos ejemplos de cómo utilizarlas.

Por favor revisa la documentación de cada una.

4.4.4.1.1. Relplot#

Relplot ayuda a entender la relación entre varias variables. Es fenomenal para el análisis exploratorio.

sns.relplot(
    data=df,
    x='body_mass_g',
    y='flipper_length_mm',
    hue='species',
    style='island',
    col='sex',
)
<seaborn.axisgrid.FacetGrid at 0x11f880b23c0>
../_images/61d93e88c6b7459e596e1f8c85113e7d92999377e55c984f32e918c71e35f1c4.png

Observa como con una sola función obtenemos un montón de información. Vemos que los Gentoo, son generalmente más grandes y con aletas más grandes. En las tres especies existe dimorfismo sexual, los machos son en general más grandes, pero la diferencia es menos dramática en los Adelie y los Chinstrap. Además, podemos ver que los gentoo solo viven en Biscoe, mientras que los chinstrap solo viven en Dream, sin embargo, los Adelie viven en las tres islas.

4.4.4.1.2. LMplot#

LMplot (linear model plot) ayuda a visualizar modelos regresivos. Por ejemplo, qué pasa si queremos averiguar el tamaño total del pingüino, con base en la medición de su pico, sexo y especie.

\(peso \sim pico + sexo + especie\)

sns.lmplot(
    data=df,
    x='bill_length_mm',
    y='body_mass_g',
    hue='species',
    col='sex',
)
<seaborn.axisgrid.FacetGrid at 0x11f8b690910>
../_images/db8b140e2869f51c2c6a43c9f04123958a37f7c7c80e1e576cdd0acce13f1560.png

4.4.4.1.3. Catplot#

Catplot nos ayuda a visualizar variables individuales y categorías.

sns.catplot(
    data=df,
    x='body_mass_g',
    y='species',
    hue='species'
)
<seaborn.axisgrid.FacetGrid at 0x11f8b730e10>
../_images/a57edd5b3cc6c7b76b084252032286215519a2307edcbdbaec2c56d3b816b393.png
sns.catplot(
    data=df,
    x='body_mass_g',
    y='species',
    hue='species',
    kind='box',
    col='island'
)
<seaborn.axisgrid.FacetGrid at 0x11f8bc1c7d0>
../_images/cbdb8feb9369ec8ba7fa464846bdd46ab989c7529777a29ed0fb8aa8a1dad23c.png

4.4.4.1.4. Displot#

Displot nos ayuda a visualizar distribuciones

sns.displot(
    data=df,
    x='body_mass_g',
    hue='species',
    kind='kde',
)
<seaborn.axisgrid.FacetGrid at 0x11f8bd7f250>
../_images/e9dc5c428af4bf92a9491bf0f3eb1505b0749beb683b7118a2369ddd50e2b8c8.png

También funciona con distribuciones bivariadas

sns.displot(
    data=df,
    x='bill_length_mm',
    y='bill_depth_mm',
    hue='species',
    kind='kde',
)
<seaborn.axisgrid.FacetGrid at 0x11f8be15d10>
../_images/47502faf37b792e1be899687144290e2690a5d2a99e613dbfc46d76388975d4f.png

Parece que los Adelíe tienen picos más cortos y anchos, mientras que los Gentoo tienen picos más angostos y largos, aunque los Chintrap se traslapa con las otras dos especies.

4.4.4.1.5. Más sobre seaborn#

Seaborn tiene mucho más que ofrecer, pronto veremos más usos pero vale la pena que conozcas y domines estas cuatro funciones.

4.4.5. Ejercicio#

  1. Revisa la documentación de seaborn. Particularmente su galería para que veas todo lo que puede hacer.

  2. Intenta generar nuevos gráficos para continuar analizando el dataset de palmer penguins.