Seaborn

Tutorial Seaborn: Gráficos univariantes

Aprende a visualizar y analizar la distribución de una variable usando Seaborn. Descubre cómo los histogramas, boxplots y gráficos de violín facilitan el análisis univariante en Python.

Aprende Seaborn GRATIS y certifícate

¿Qué son las gráficas univariantes?

Las gráficas univariantes son herramientas visuales que permiten analizar la distribución de una variable en un conjunto de datos. Su objetivo principal es resumir y visualizar las características fundamentales de una sola variable, como su tendencia central, dispersión, asimetría y posibles valores atípicos. Estas gráficas son esenciales para entender la estructura de los datos antes de aplicar modelos estadísticos más complejos.

Principales tipos de gráficas univariantes en Seaborn:

  • Histogramas: Representan la distribución de una variable numérica mediante barras consecutivas. Cada barra refleja la frecuencia o densidad de datos en un intervalo específico.
  • Diagramas de caja y bigotes (Boxplots): Muestran la mediana, los cuartiles y los valores atípicos, facilitando la identificación de la dispersión y asimetría de los datos.
  • Gráficos de violín: Combinan el diagrama de caja con una estimación de densidad, proporcionando una visión de la distribución y variabilidad de la variable.
  • Gráficas de línea: Aunque comúnmente utilizadas para datos temporales, pueden mostrar tendencias en datos secuenciales univariantes.

Estas visualizaciones permiten identificar patrones, tendencias y anomalías en los datos. Seaborn, una biblioteca de visualización de datos en Python, facilita la creación de estos gráficos univariantes a través de funciones intuitivas y personalizables, mejorando la interpretación y el análisis de una variable individual.

Histogramas

Los histogramas son herramientas gráficas que representan la distribución de una variable numérica mediante barras consecutivas. Cada barra refleja la frecuencia o la densidad de los datos dentro de un intervalo específico, proporcionando una visión clara de cómo se distribuyen los valores en el conjunto de datos. En Seaborn, la función histplot() permite crear histogramas de forma sencilla y altamente personalizable.

Por ejemplo, para visualizar la distribución de la variable total_bill del conjunto de datos tips, se puede utilizar el siguiente código:

import seaborn as sns
import matplotlib.pyplot as plt

# Cargar el conjunto de datos
df = sns.load_dataset('tips')

# Crear un histograma de la variable 'total_bill'
sns.histplot(data=df, x='total_bill')

plt.xlabel('Total de la factura')
plt.ylabel('Frecuencia')
plt.title('Distribución del total de las facturas')
plt.show()

En este ejemplo, se utiliza el parámetro data para especificar el DataFrame y x para indicar la variable que se desea representar. La función histplot() determina automáticamente el número óptimo de clases o bins, pero es posible ajustarlo según las necesidades del análisis mediante el parámetro bins:

# Especificar el número de bins
sns.histplot(data=df, x='total_bill', bins=20)

La visualización de la densidad en lugar de la frecuencia puede ser útil para comparar distribuciones. Esto se logra ajustando el parámetro stat:

# Mostrar la densidad en el eje y
sns.histplot(data=df, x='total_bill', stat='density')

Agregar una estimación de densidad de kernel (KDE) superpuesta al histograma facilita la identificación de patrones en la distribución:

# Añadir una curva KDE al histograma
sns.histplot(data=df, x='total_bill', kde=True)

La función histplot() permite diferenciar subgrupos dentro de los datos utilizando el parámetro hue. Por ejemplo, para comparar la distribución del total de las facturas entre hombres y mujeres:

# Histograma con diferenciación por sexo
sns.histplot(data=df, x='total_bill', hue='sex', multiple='stack')

El argumento multiple controla cómo se muestran las categorías. Con multiple='stack', las barras se apilan, mientras que con multiple='dodge', se colocan una al lado de la otra:

# Colocar las barras de categorías lado a lado
sns.histplot(data=df, x='total_bill', hue='sex', multiple='dodge')

Para mejorar la legibilidad y estética del gráfico, es posible personalizar los colores y la transparencia de las barras:

# Personalizar color y transparencia
sns.histplot(data=df, x='total_bill', color='teal', alpha=0.6)

Los histogramas también pueden visualizar la relación entre dos variables numéricas mediante un histograma bidimensional. Utilizando los parámetros x e y, se crea una representación en dos dimensiones:

# Histograma bidimensional entre 'total_bill' y 'tip'
sns.histplot(data=df, x='total_bill', y='tip')

En este caso, la intensidad del color en cada celda del gráfico refleja la frecuencia de observaciones en ese rango de valores.

Además, es posible ajustar el estilo general del gráfico utilizando las configuraciones predefinidas de Seaborn:

# Configurar el estilo del gráfico
sns.set_style('whitegrid')

sns.histplot(data=df, x='total_bill', kde=True, color='purple')
plt.xlabel('Total de la factura')
plt.ylabel('Frecuencia')
plt.title('Histograma del total de las facturas con KDE')
plt.show()

Finalmente, los histogramas pueden combinarse con otras plotas de Seaborn para enriquecer el análisis. Por ejemplo, superponer un rug plot para visualizar cada observación individual:

# Añadir un rug plot al histograma
sns.histplot(data=df, x='total_bill', kde=True, color='coral')
sns.rugplot(data=df, x='total_bill', color='black')

El uso efectivo de histogramas permite identificar características clave de los datos, como la asimetría, la moda y la presencia de valores atípicos, facilitando así una comprensión profunda de la variable analizada.

Diagramas de Caja y Bigotes (Boxplots)

Los diagramas de caja y bigotes, también conocidos como boxplots, son representaciones gráficas que resumen estadísticamente la distribución de una variable numérica. Estas gráficas muestran la mediana, los cuartiles y los valores atípicos, permitiendo identificar rápidamente la dispersión y la asimetría de los datos.

En Seaborn, se utiliza la función boxplot() para crear diagramas de caja y bigotes de manera sencilla y personalizable. A continuación, se muestra cómo cargar un conjunto de datos y generar un boxplot de una variable:

import seaborn as sns
import matplotlib.pyplot as plt

# Cargar un conjunto de datos de ejemplo
df = sns.load_dataset('tips')

# Crear un diagrama de caja y bigotes de la variable 'total_bill'
sns.boxplot(data=df, x='total_bill')

plt.xlabel('Total de la factura')
plt.title('Diagrama de caja y bigotes del total de las facturas')
plt.show()

En este ejemplo, se representa la variable total_bill del conjunto de datos tips. El diagrama muestra la mediana como una línea dentro de la caja, que representa el segundo cuartil. Los bordes de la caja indican el primer y tercer cuartil, mientras que los bigotes extienden hasta los valores máximos y mínimos dentro de un rango aceptable. Los puntos fuera de este rango se consideran valores atípicos.

Es posible comparar la distribución de una variable categorizada por otra variable utilizando el parámetro y para la variable numérica y x para la categórica. Por ejemplo, para ver cómo varía el total de la factura según el día de la semana:

# Diagrama de caja y bigotes del total de facturas por día
sns.boxplot(data=df, x='day', y='total_bill')

plt.xlabel('Día de la semana')
plt.ylabel('Total de la factura')
plt.title('Total de las facturas por día de la semana')
plt.show()

Este gráfico permite observar cómo la distribución del total de las facturas cambia según el día. Además, se pueden agregar más variables categóricas utilizando el parámetro hue. Por ejemplo, para diferenciar por el tiempo de comida (almuerzo o cena):

# Diagrama de caja y bigotes con diferenciación por tiempo de comida
sns.boxplot(data=df, x='day', y='total_bill', hue='time')

plt.xlabel('Día de la semana')
plt.ylabel('Total de la factura')
plt.title('Total de las facturas por día y tiempo de comida')
plt.legend(title='Tiempo de comida')
plt.show()

La función boxplot() también permite ajustar la orientación del gráfico. Si se prefiere un boxplot horizontal, se pueden intercambiar los parámetros x e y:

# Boxplot horizontal de la variable 'tip'
sns.boxplot(data=df, x='tip')

plt.xlabel('Propina')
plt.title('Diagrama de caja y bigotes de las propinas')
plt.show()

Para mejorar la visualización y hacer que los gráficos sean más informativos, es posible personalizar los colores y estilos. Se puede utilizar la paleta de colores de Seaborn o definir colores específicos:

# Personalizar colores con una paleta
sns.boxplot(data=df, x='day', y='total_bill', palette='Set2', hue='day', dodge=False)
plt.legend([],[], frameon=False) 

plt.xlabel('Día de la semana')
plt.ylabel('Total de la factura')
plt.title('Total de las facturas por día con colores personalizados')
plt.show()

También es posible ajustar el ancho de las cajas o la separación entre ellas con el parámetro width y fliersize para el tamaño de los marcadores de valores atípicos:

# Ajustar el ancho de las cajas y tamaño de los valores atípicos
sns.boxplot(data=df, x='day', y='total_bill', width=0.5, fliersize=4)

plt.xlabel('Día de la semana')
plt.ylabel('Total de la factura')
plt.title('Boxplot ajustado del total de las facturas')
plt.show()

En ocasiones, es útil combinar el boxplot con otras representaciones para enriquecer el análisis. Por ejemplo, superponer un swarmplot para visualizar cada punto de datos:

# Combinar boxplot con swarmplot
sns.boxplot(data=df, x='day', y='total_bill', color='lightgray')
sns.swarmplot(data=df, x='day', y='total_bill', color='steelblue', size=3)

plt.xlabel('Día de la semana')
plt.ylabel('Total de la factura')
plt.title('Boxplot y swarmplot combinados del total de las facturas')
plt.show()

En este ejemplo, el boxplot proporciona un resumen estadístico, mientras que el swarmplot muestra la distribución real de los datos, facilitando la identificación de patrones específicos.

Los diagramas de caja y bigotes son útiles para detectar asimetrías, comprender la variabilidad y identificar posibles valores atípicos en los datos. Al utilizar Seaborn, se puede crear estas visualizaciones de manera eficiente y adaptarlas a las necesidades del análisis.

Gráficos de Violín

Los gráficos de violín son representaciones visuales que combinan un diagrama de caja y bigotes con un gráfico de densidad de kernel. Estos gráficos permiten visualizar la distribución de una variable numérica y comparar múltiples categorías de manera efectiva. Al mostrar tanto la información estadística resumida como la forma de la distribución, los gráficos de violín ofrecen una comprensión más profunda de los datos.

En Seaborn, la función violinplot() se emplea para crear gráficos de violín de forma sencilla y personalizable. A continuación, se muestra cómo cargar un conjunto de datos y generar un gráfico de violín de una variable:

import seaborn as sns
import matplotlib.pyplot as plt

# Cargar un conjunto de datos de ejemplo
df = sns.load_dataset('tips')

# Crear un gráfico de violín de la variable 'total_bill'
sns.violinplot(data=df, x='total_bill')

plt.xlabel('Total de la factura')
plt.title('Gráfico de violín del total de las facturas')
plt.show()

En este ejemplo, se representa la variable total_bill del conjunto de datos tips. El gráfico muestra la distribución de los datos a lo largo del eje x, destacando las áreas donde los datos están más concentrados.

Para comparar la distribución de una variable categorizada por otra, se pueden utilizar los parámetros x y y. Por ejemplo, para analizar cómo varía el total de la factura según el día de la semana:

# Gráfico de violín del total de facturas por día
sns.violinplot(data=df, x='day', y='total_bill')

plt.xlabel('Día de la semana')
plt.ylabel('Total de la factura')
plt.title('Total de las facturas por día de la semana')
plt.show()

Este gráfico permite observar las diferencias en la distribución del total de las facturas entre diferentes días. La anchura de cada violín indica la densidad de los datos en esa región, lo que facilita la identificación de patrones y anomalías.

Para añadir una tercera variable categórica y enriquecer el análisis, se puede utilizar el parámetro hue. Por ejemplo, para distinguir por género:

# Gráfico de violín con diferenciación por sexo
sns.violinplot(data=df, x='day', y='total_bill', hue='sex', split=True)

plt.xlabel('Día de la semana')
plt.ylabel('Total de la factura')
plt.title('Total de las facturas por día y sexo')
plt.legend(title='Sexo')
plt.show()

El argumento split=True divide el violín en dos partes, facilitando la comparación directa entre las categorías de la variable hue. En este caso, se puede analizar cómo difiere el total de las facturas entre hombres y mujeres a lo largo de la semana.

Además de las comparaciones categóricas, es posible ajustar el interior del gráfico para mostrar más detalles estadísticos. El parámetro inner controla esta característica:

# Personalizar el interior del gráfico de violín
sns.violinplot(data=df, x='day', y='total_bill', inner='quartile')

plt.xlabel('Día de la semana')
plt.ylabel('Total de la factura')
plt.title('Gráfico de violín con cuartiles del total de las facturas')
plt.show()

Al establecer inner='quartile', se añaden líneas que representan los cuartiles, proporcionando información adicional sobre la dispersión de los datos.

También es posible ajustar el ancho de los violines y la escala de las áreas para enfatizar ciertos aspectos de los datos. El parámetro density_norm permite modificar la forma en que se escala el ancho de los violines:

# Ajustar la escala de los violines
sns.violinplot(data=df, x='day', y='total_bill', density_norm='count')

plt.xlabel('Día de la semana')
plt.ylabel('Total de la factura')
plt.title('Gráfico de violín escalado por recuento')
plt.show()

Al usar density_norm='count', el ancho de cada violín es proporcional al número de observaciones, lo que proporciona información sobre el tamaño de cada grupo.

Otra opción es combinar el gráfico de violín con un stripplot o un swarmplot para mostrar cada observación individual sobre la distribución general:

# Combinar gráfico de violín con stripplot
sns.violinplot(data=df, x='day', y='total_bill', color='lightgray')
sns.stripplot(data=df, x='day', y='total_bill', color='black', size=3)

plt.xlabel('Día de la semana')
plt.ylabel('Total de la factura')
plt.title('Gráfico de violín con observaciones individuales')
plt.show()

Esta combinación permite visualizar tanto la densidad general como la ubicación exacta de cada dato, facilitando la detección de valores atípicos y patrones específicos.

Los gráficos de violín pueden adaptarse para variables categóricas en el eje y y variables numéricas en el eje x, simplemente intercambiando los parámetros:

# Gráfico de violín con orientación horizontal
sns.violinplot(data=df, x='total_bill', y='day')

plt.xlabel('Total de la factura')
plt.ylabel('Día de la semana')
plt.title('Gráfico de violín horizontal del total de las facturas')
plt.show()

Esta orientación puede ser útil cuando las etiquetas de las categorías son largas o cuando se desea enfatizar la comparación entre categorías.

En resumen, los gráficos de violín son herramientas versátiles que combinan información estadística y distribución de datos, permitiendo un análisis profundo de una variable y sus relaciones categóricas. Al aprovechar las capacidades de personalización de Seaborn, es posible crear visualizaciones informativas y estéticamente agradables que facilitan la interpretación de los datos.

Gráficas de Línea

Las gráficas de línea son una herramienta fundamental para visualizar cómo varía una variable numérica a lo largo de una secuencia ordenada, como el tiempo o categorías ordenadas. En el análisis univariante, permiten identificar tendencias, patrones y fluctuaciones en los datos de una manera clara y concisa.

En Seaborn, la función lineplot() se utiliza para crear gráficas de línea de forma eficiente y personalizable. A continuación, se muestra cómo cargar un conjunto de datos y generar una gráfica de línea básica:

import seaborn as sns
import matplotlib.pyplot as plt

# Cargar el conjunto de datos 'fmri'
df = sns.load_dataset('fmri')

# Crear una gráfica de línea básica
sns.lineplot(data=df, x='timepoint', y='signal')

plt.xlabel('Punto en el tiempo')
plt.ylabel('Señal')
plt.title('Evolución de la señal cerebral a lo largo del tiempo')
plt.show()

En este ejemplo, se representa la variación de la variable signal en función de timepoint. La gráfica muestra cómo la señal cambia a lo largo del tiempo, permitiendo observar tendencias generales.

Para comparar múltiples categorías en la misma gráfica, se puede utilizar el parámetro hue. Por ejemplo, para diferenciar por la región cerebral:

# Gráfica de línea diferenciada por región
sns.lineplot(data=df, x='timepoint', y='signal', hue='region')

plt.xlabel('Punto en el tiempo')
plt.ylabel('Señal')
plt.title('Señal cerebral por región a lo largo del tiempo')
plt.legend(title='Región')
plt.show()

Al añadir hue='region', cada región cerebral se representa con una línea de color distinto, facilitando la comparación de sus tendencias respectivas.

Es posible incorporar más dimensiones categóricas utilizando los parámetros style y markers. Por ejemplo, para distinguir por evento:

# Gráfica de línea con diferenciación adicional por evento
sns.lineplot(data=df, x='timepoint', y='signal', hue='region', style='event', markers=True)

plt.xlabel('Punto en el tiempo')
plt.ylabel('Señal')
plt.title('Señal cerebral por región y evento')
plt.legend(title='Región - Evento')
plt.show()

Aquí, el parámetro style='event' y markers=True permiten diferenciar los eventos mediante distintos estilos y marcadores de línea, enriqueciendo la visualización.

Para visualizar la variabilidad en los datos, se puede ajustar el parámetro errorbar:

# Gráfica de línea con intervalos de confianza
sns.lineplot(data=df, x='timepoint', y='signal', hue='region', errorbar='sd')

plt.xlabel('Punto en el tiempo')
plt.ylabel('Señal')
plt.title('Señal cerebral con intervalos de confianza por región')
plt.legend(title='Región')
plt.show()

El parámetro errorbar='sd' muestra la desviación estándar como área sombreada alrededor de cada línea, proporcionando información sobre la dispersión de los datos.

Si se desea visualizar todas las observaciones individuales sin agregarlas, se puede establecer estimator=None y utilizar el parámetro units:

# Mostrar todas las observaciones individuales
sns.lineplot(data=df, x='timepoint', y='signal', hue='region', estimator=None, units='subject', lw=1)

plt.xlabel('Punto en el tiempo')
plt.ylabel('Señal')
plt.title('Trayectorias individuales de la señal cerebral por región')
plt.legend(title='Región')
plt.show()

Al establecer estimator=None, se trazan todas las líneas individuales sin calcular un promedio, lo que permite analizar las trayectorias individuales dentro de cada región.

La personalización estética es clave para mejorar la claridad de las gráficas. Se pueden ajustar paletas de colores y estilos de línea:

# Personalizar la paleta de colores y estilos de línea
sns.lineplot(data=df, x='timepoint', y='signal', hue='region', style='event', palette='tab10', dashes=False)

plt.xlabel('Punto en el tiempo')
plt.ylabel('Señal')
plt.title('Señal cerebral con estilos personalizados')
plt.legend(title='Región - Evento')
plt.show()

En este ejemplo, se utiliza una paleta de colores específica y se eliminan las líneas discontinuas mediante dashes=False, mejorando la estética del gráfico.

Además, se pueden ajustar aspectos del entorno visual con sns.set():

# Ajustar el estilo general de la gráfica
sns.set(style='whitegrid')

sns.lineplot(data=df, x='timepoint', y='signal', hue='region', style='event', markers=True)

plt.xlabel('Punto en el tiempo')
plt.ylabel('Señal')
plt.title('Análisis de la señal cerebral por región y evento')
plt.legend(title='Región - Evento')
plt.show()

El uso de sns.set(style='whitegrid') establece un fondo con cuadrícula blanca, lo que puede mejorar la legibilidad de la gráfica.

Las gráficas de línea son especialmente útiles para identificar tendencias y patrones en datos temporales o secuenciales. Al aprovechar las funcionalidades de Seaborn, es posible crear visualizaciones informativas y atractivas que facilitan la interpretación y el análisis de los datos.

Aprende Seaborn GRATIS online

Todas las lecciones de Seaborn

Accede a todas las lecciones de Seaborn y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Accede GRATIS a Seaborn y certifícate

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender la importancia de las gráficas univariantes en el análisis exploratorio de datos.
  • Aprender a crear y personalizar histogramas para visualizar distribuciones de frecuencia.
  • Utilizar diagramas de caja y bigotes y gráficos de violín para resumir datos y explorar densidades.
  • Implementar gráficas de línea para analizar tendencias y patrones en datos temporales o secuenciales.
  • Desarrollar habilidades para personalizar y combinar diferentes tipos de gráficas en Seaborn para una interpretación más profunda de los datos.