tutoriales.com

Análisis y Visualización de Distribuciones de Datos con Pandas y NumPy: Más Allá del Histograma 📊

Este tutorial te guiará a través de técnicas avanzadas para analizar y visualizar distribuciones de datos utilizando Pandas y NumPy. Exploraremos métodos más allá del histograma, como box plots, violin plots y estimaciones de densidad de kernel (KDE), para revelar patrones y anomalías. Al final, tendrás las herramientas para extraer insights significativos de la forma de tus datos.

Intermedio18 min de lectura9 views
Reportar error

¡Bienvenido a este tutorial sobre el análisis y visualización de distribuciones de datos con Pandas y NumPy! En el mundo de la ciencia de datos, comprender la distribución de tus variables es un paso fundamental para descubrir patrones, identificar valores atípicos y tomar decisiones informadas. Si bien el histograma es una herramienta clásica, existen otras técnicas potentes que nos permiten profundizar y obtener una imagen más completa.

En este tutorial, exploraremos cómo utilizar las capacidades de Pandas para manipular y preparar datos, y cómo NumPy nos apoya con operaciones numéricas, para luego visualizar estas distribuciones con herramientas avanzadas. Nos enfocaremos en box plots, violin plots y estimaciones de densidad de kernel (KDE), que ofrecen perspectivas más ricas y detalladas sobre la forma, la simetría y la dispersión de tus datos.


🎯 Objetivos del Tutorial

Al finalizar este tutorial, serás capaz de:

  • Comprender la importancia de analizar las distribuciones de datos.
  • Utilizar Pandas y NumPy para preparar tus datos para el análisis distribucional.
  • Crear e interpretar Box Plots para identificar la mediana, cuartiles y valores atípicos.
  • Generar e interpretar Violin Plots para visualizar la densidad y la forma de la distribución.
  • Aplicar Estimaciones de Densidad de Kernel (KDE) para una representación suavizada de la distribución.
  • Comparar distribuciones entre diferentes grupos o categorías.
  • Identificar la mejor herramienta de visualización para cada escenario.

🛠️ Configuración del Entorno

Antes de empezar, asegúrate de tener instaladas las bibliotecas necesarias. Si no las tienes, puedes instalarlas fácilmente usando pip:

!pip install pandas numpy matplotlib seaborn

Una vez instaladas, podemos importarlas:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# Configuración para mejorar la visualización de los gráficos
sns.set_style("whitegrid")
plt.rcParams['figure.figsize'] = (10, 6)
plt.rcParams['font.size'] = 12
💡 Consejo: `seaborn` es una biblioteca de visualización construida sobre `matplotlib` que facilita la creación de gráficos estadísticos atractivos e informativos. Es ideal para este tipo de análisis.

📖 Entendiendo la Distribución de Datos

La distribución de datos se refiere a la forma en que los valores de una variable se agrupan o dispersan. Es una característica fundamental para cualquier conjunto de datos. Observar la distribución nos ayuda a:

  • Identificar la tendencia central: ¿Dónde se concentran la mayoría de los datos (media, mediana, moda)?
  • Medir la dispersión: ¿Qué tan dispersos están los datos (rango, varianza, desviación estándar)?
  • Detectar asimetría (skewness): ¿La distribución está sesgada hacia un lado?
  • Detectar curtosis: ¿Qué tan "picuda" o "plana" es la distribución?
  • Encontrar valores atípicos (outliers): Datos que se desvían significativamente del resto.

Generación de Datos de Ejemplo 📊

Para nuestros ejemplos, crearemos un DataFrame de Pandas con algunas columnas numéricas y categóricas para simular un conjunto de datos real.

# Semilla para reproducibilidad
np.random.seed(42)

# Generar datos simulados
data = {
    'edad': np.random.randint(18, 65, 1000),
    'ingresos': np.random.normal(50000, 15000, 1000),
    'horas_trabajo': np.random.normal(40, 5, 1000).astype(int),
    'genero': np.random.choice(['Masculino', 'Femenino', 'Otro'], 1000, p=[0.45, 0.50, 0.05]),
    'experiencia': np.random.randint(0, 30, 1000)
}

df = pd.DataFrame(data)

# Añadir algunos valores atípicos para 'ingresos'
df.loc[np.random.choice(df.index, 20), 'ingresos'] = np.random.normal(150000, 30000, 20)

# Asegurarse de que horas_trabajo no sea negativo
df['horas_trabajo'] = df['horas_trabajo'].apply(lambda x: max(20, x))

print(df.head())
print("\nEstadísticas descriptivas:\n", df.describe())
      edad  ingresos  horas_trabajo     genero  experiencia
0     24  49671.41             40  Masculino           10
1     37  38221.23             39    Femenino           16
2     62  59265.51             35    Femenino           29
3     54  65133.56             44    Femenino            8
4     25  43926.86             39    Femenino           23

Estadísticas descriptivas:
              edad      ingresos  horas_trabajo  experiencia
count  1000.000000   1000.000000    1000.000000  1000.000000
mean     41.244000  53280.999464      39.992000    14.621000
std      13.561579  22285.495034       4.957279     8.631853
min      18.000000  11340.975480      20.000000     0.000000
25%      29.000000  40082.915004      37.000000     7.000000
50%      41.000000  49998.056094      40.000000    15.000000
75%      53.000000  60905.006859      43.000000    22.000000
max      64.000000 197824.232535      57.000000    29.000000

📦 Box Plots (Diagramas de Caja y Bigotes) 📊

Los box plots son una excelente manera de visualizar la distribución de un conjunto de datos, mostrando la mediana, los cuartiles y la presencia de valores atípicos. Son particularmente útiles para comparar distribuciones entre diferentes grupos.

Conceptos Clave del Box Plot:

  • Caja: Representa el rango intercuartílico (IQR), que va desde el primer cuartil (Q1, percentil 25) hasta el tercer cuartil (Q3, percentil 75). El 50% central de los datos se encuentra dentro de esta caja.
  • Línea central: Es la mediana (Q2, percentil 50), que divide los datos en dos mitades iguales.
  • Bigotes: Se extienden desde la caja hasta el último dato que no es considerado atípico. Generalmente, los bigotes se extienden hasta 1.5 veces el IQR desde Q1 y Q3.
  • Puntos: Representan los valores atípicos (outliers), que son datos que caen fuera del rango de los bigotes.
Diagrama de Caja y Bigotes (Box Plot) Outlier (Valor atípico) Máximo no atípico Q3 (75%) Mediana (Q2) Q1 (25%) Mínimo no atípico Outliers Rango Intercuartílico (IQR)

Creando un Box Plot con Seaborn

Vamos a crear un box plot para la variable 'ingresos'.

plt.figure(figsize=(8, 6))
sns.boxplot(y=df['ingresos'])
plt.title('Distribución de Ingresos')
plt.ylabel('Ingresos')
plt.show()
📌 Nota: Observa cómo los puntos por encima del bigote superior representan los valores atípicos que introdujimos intencionalmente en nuestros datos simulados.

Comparando Distribuciones con Box Plots

Una de las mayores fortalezas de los box plots es su capacidad para comparar distribuciones de una variable numérica a través de diferentes categorías.

plt.figure(figsize=(10, 7))
sns.boxplot(x='genero', y='ingresos', data=df)
plt.title('Distribución de Ingresos por Género')
plt.xlabel('Género')
plt.ylabel('Ingresos')
plt.show()

Este gráfico nos permite ver rápidamente cómo la mediana, la dispersión y los valores atípicos de los ingresos varían entre los diferentes géneros. Por ejemplo, podríamos observar que un género tiene una mediana de ingresos más alta o una mayor dispersión.


🎻 Violin Plots (Diagramas de Violín) 🎶

Los violin plots son una extensión de los box plots. Combinan la información del box plot (mediana, cuartiles) con una estimación de la densidad del kernel (KDE) de la distribución de los datos. Esto nos da una visión más completa de la forma de la distribución, incluyendo posibles modos múltiples.

Conceptos Clave del Violin Plot:

  • Caja interna y punto: Similar al box plot, muestran la mediana y los cuartiles.
  • Forma del violín: La anchura del "violín" en cada punto de la distribución representa la densidad de los datos en ese valor. Una sección más ancha indica una mayor concentración de datos.
  • Asimetría y múltiples modos: Permiten identificar visualmente la asimetría de la distribución y si existen múltiples picos (modos).
Diagrama de Violin Plot Bigote superior Caja (IQR) Bigote inferior KDE (Densidad) Mediana Categoría / Grupo Valor / Escala

Creando un Violin Plot con Seaborn

Veamos cómo se ve la distribución de 'ingresos' con un violin plot.

plt.figure(figsize=(8, 6))
sns.violinplot(y=df['ingresos'])
plt.title('Distribución de Ingresos (Violin Plot)')
plt.ylabel('Ingresos')
plt.show()
🔥 Importante: Compara este gráfico con el box plot de ingresos. El violin plot nos muestra la 'densidad' de los datos, revelando que la mayoría de los ingresos se concentran alrededor de la mediana, pero también hay una pequeña 'joroba' o concentración de datos atípicos en los valores más altos, que el box plot solo señalaba como puntos.

Comparando Distribuciones con Violin Plots

Al igual que los box plots, los violin plots son excelentes para comparaciones por categorías.

plt.figure(figsize=(10, 7))
sns.violinplot(x='genero', y='ingresos', data=df)
plt.title('Distribución de Ingresos por Género (Violin Plot)')
plt.xlabel('Género')
plt.ylabel('Ingresos')
plt.show()

Este gráfico nos da una visión mucho más rica de las diferencias entre las distribuciones de ingresos por género. Podemos ver no solo las medianas y cuartiles, sino también la forma completa de la distribución para cada categoría. Por ejemplo, si una categoría tuviera una distribución bimodal (dos picos), el violin plot lo revelaría claramente.


📈 Estimación de Densidad de Kernel (KDE) 🧪

La Estimación de Densidad de Kernel (KDE) es una técnica no paramétrica para estimar la función de densidad de probabilidad de una variable aleatoria. Suaviza la distribución y es una excelente alternativa al histograma, ya que no depende de la elección del ancho de los bins (barras).

Conceptos Clave de KDE:

  • Suavizado: KDE produce una curva suave que representa la densidad de probabilidad subyacente de los datos.
  • Ancho de banda (bandwidth): Es un parámetro crucial que controla el grado de suavizado. Un ancho de banda pequeño resulta en una curva más 'picuda' y sensible a los detalles; uno grande produce una curva más suave y generalizada.
  • Modos: La curva KDE ayuda a identificar los picos (modos) en la distribución, que indican dónde se concentran los datos.
Estimación de Densidad de Kernel (KDE) Valores de la Variable Densidad Curva KDE Histograma

Creando una Curva KDE con Seaborn

Vamos a visualizar la distribución de 'experiencia' usando KDE.

plt.figure(figsize=(8, 6))
sns.kdeplot(x=df['experiencia'], fill=True, color='purple', linewidth=2)
plt.title('Distribución de Experiencia (KDE)')
plt.xlabel('Experiencia (años)')
plt.ylabel('Densidad')
plt.show()

La curva KDE nos muestra una representación suavizada de cómo se distribuyen los años de experiencia, revelando la forma de la distribución de una manera continua. Podemos ver claramente dónde se concentra la mayor parte de la experiencia en nuestro conjunto de datos.

Comparando Distribuciones con KDE por Grupos

Podemos superponer múltiples curvas KDE para comparar distribuciones de diferentes grupos.

plt.figure(figsize=(10, 7))

# Obtener categorías únicas de 'genero'
generos = df['genero'].unique()

for genero in generos:
    subset = df[df['genero'] == genero]
    sns.kdeplot(x=subset['experiencia'], fill=True, label=genero, alpha=0.5)

plt.title('Distribución de Experiencia por Género (KDE)')
plt.xlabel('Experiencia (años)')
plt.ylabel('Densidad')
plt.legend(title='Género')
plt.show()

Este gráfico es increíblemente útil para comparar la forma de la distribución de la experiencia entre los diferentes géneros. Podemos identificar si un grupo tiende a tener más o menos experiencia, o si sus distribuciones tienen diferentes formas o picos.

💡 Consejo: El parámetro `alpha` es útil para ajustar la transparencia de las curvas, lo que permite visualizar áreas donde las distribuciones se superponen.

🧐 ¿Cuándo usar cada técnica? ✅

Elegir la técnica de visualización adecuada depende de lo que quieras comunicar y del nivel de detalle que necesites.

Técnica¿Qué muestra?Cuándo usarla
---------
HistogramaFrecuencia de datos en intervalos (bins)Para una vista rápida de la forma general; útil para datos discretos o continuos.
Box PlotMediana, cuartiles, rango intercuartílico, atípicosPara comparar distribuciones rápidamente entre grupos; útil para detectar outliers.
---------
Violin PlotBox plot + densidad (KDE)Cuando necesitas la información del box plot Y la forma detallada de la distribución.
KDE PlotFunción de densidad de probabilidad suavizadaPara una representación continua y suave de la distribución; ideal para identificar modos.
90% Dominio de Visualización

🚀 Consideraciones Adicionales y Mejores Prácticas

Combinando Gráficos para una Visión Completa

A menudo, combinar diferentes tipos de gráficos puede proporcionar una comprensión aún más profunda. Por ejemplo, puedes combinar un gráfico de dispersión con histogramas o KDEs marginales para entender las distribuciones de variables individuales y su relación.

Ejemplo: PairPlot de Seaborn

seaborn.pairplot es una excelente herramienta para visualizar las relaciones y distribuciones de múltiples variables en un solo vistazo. Crea matrices de gráficos de dispersión para pares de variables y histogramas/KDEs para las variables individuales en la diagonal.

sns.pairplot(df[['edad', 'ingresos', 'experiencia']], diag_kind='kde')
plt.suptitle('Pair Plot de Edad, Ingresos y Experiencia', y=1.02) # Ajustar título superior
plt.show()

Tratamiento de Valores Atípicos (Outliers)

Los box plots son excelentes para identificar valores atípicos. Una vez identificados, la decisión de cómo manejarlos (eliminarlos, transformarlos, investigar su origen) es crucial y depende del contexto de tu análisis. Pandas y NumPy son herramientas esenciales para estas operaciones.

Ancho de Banda en KDE (Bandwidth Selection)

La elección del ancho de banda (bw_method) en KDE es importante. Un valor muy pequeño puede resultar en una curva sobreajustada que muestra ruido; un valor muy grande puede suavizar demasiado y ocultar características importantes. Seaborn y Matplotlib suelen usar métodos de estimación predeterminados razonables, pero es bueno ser consciente de este parámetro.


📝 Resumen y Próximos Pasos

En este tutorial, hemos ido más allá del histograma para explorar técnicas más sofisticadas de análisis y visualización de distribuciones de datos con Pandas y NumPy, apoyándonos en la potente biblioteca Seaborn. Hemos aprendido a interpretar y crear box plots, violin plots y curvas KDE, comprendiendo sus fortalezas y cuándo aplicar cada uno.

Paso 1: Entendimos la importancia de las distribuciones de datos.
Paso 2: Preparamos datos simulados con Pandas y NumPy.
Paso 3: Visualizamos y comparamos distribuciones con Box Plots.
Paso 4: Exploramos la densidad y forma con Violin Plots.
Paso 5: Utilizamos KDE para una visión suavizada y continua.
Paso 6: Discutimos cuándo usar cada técnica para una comunicación efectiva.

Dominar estas herramientas te permitirá obtener insights más profundos sobre la naturaleza de tus datos, identificar anomalías y tomar decisiones basadas en una comprensión sólida de las distribuciones subyacentes.

¡Sigue explorando! Te animamos a aplicar estas técnicas a tus propios conjuntos de datos. Experimenta con diferentes variables, compara grupos y observa cómo la elección de la visualización puede cambiar tu perspectiva sobre los datos.

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!