Análisis univariante
Analice cada columna de forma independiente: represente las distribuciones de las variables numéricas y los recuentos de valores de las categóricas, y observe los valores atípicos y la asimetría.
Análisis univariante es una lección gratuita de Pandas & NumPy Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Pandas & NumPy Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.
¿Qué es el análisis univariante?
El análisis univariante examina una columna cada vez de forma aislada, ignorando las relaciones entre columnas. El objetivo es comprender la distribución de cada variable, detectar valores atípicos, identificar la asimetría y localizar problemas de calidad de los datos antes de comenzar cualquier modelado. El análisis univariante es diferente para las columnas numéricas y categóricas: las numéricas requieren gráficos de distribución y estadísticas resumidas, mientras que las categóricas requieren recuentos de frecuencias y proporciones.
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
numeric_cols = df.select_dtypes('number').columns.tolist()
categoric_cols = df.select_dtypes('object').columns.tolist()
print('Numeric columns:', numeric_cols)
print('Categorical columns:', categoric_cols)Histogramas para columnas numéricas
Trace un histograma para cada columna numérica a fin de observar la forma de su distribución. Busque simetría frente a asimetría (una cola en un lado), modalidad (un pico frente a varios) y anomalías evidentes (valores en los extremos que parecen inverosímiles). En Pandas, df.hist() crea rápidamente una cuadrícula de histogramas para varias columnas sin necesidad de escribir un bucle, pero histplot de Seaborn ofrece un control más preciso para columnas individuales.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = sns.load_dataset('titanic')
# Quick multi-column histogram grid
numeric = df.select_dtypes('number')
numeric.hist(bins=20, figsize=(12, 8), layout=(2, 3), color='steelblue', edgecolor='white')
plt.suptitle('Univariate Distributions (Numeric Columns)', y=1.02)
plt.tight_layout()
plt.show()Estadísticas resumidas para columnas numéricas
Para cada columna numérica, calcule y compare la media y la mediana. Cuando la media > mediana de forma significativa, la distribución presenta asimetría positiva (una cola derecha larga, habitual en los datos de ingresos y precios). Cuando la media < mediana, presenta asimetría negativa. Compruebe también la desviación estándar en relación con la media: una desviación estándar mayor que la media en una variable no negativa indica una variabilidad elevada o la presencia de valores atípicos. Calcule directamente la asimetría con df.skew().
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')
summary = pd.DataFrame({
'mean': numeric.mean(),
'median': numeric.median(),
'std': numeric.std(),
'skewness': numeric.skew(),
'missing_pct': (numeric.isna().sum() / len(df) * 100).round(1)
}).round(2)
print(summary)Diagramas de caja para detectar valores atípicos
Los diagramas de caja son la herramienta visual más rápida para detectar valores atípicos en columnas numéricas. Cualquier punto situado más allá de los bigotes (a 1.5×IQR de Q1 o Q3) se representa individualmente y se marca como posible valor atípico. Una columna con muchos puntos atípicos merece investigación: ¿son errores de introducción de datos, valores extremos legítimos o indicios de una distribución no normal? Los diagramas de caja también muestran la asimetría positiva o negativa mediante la posición asimétrica de la mediana dentro de la caja.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = sns.load_dataset('titanic')
fig, axes = plt.subplots(1, 3, figsize=(14, 5))
for ax, col in zip(axes, ['age', 'fare', 'sibsp']):
df[[col]].boxplot(ax=ax)
ax.set_title(f'Box Plot: {col}')
plt.tight_layout()
plt.show()Recuento de valores atípicos basado en IQR
El método IQR (rango intercuartílico) define los valores atípicos como aquellos inferiores a Q1 - 1.5×IQR o superiores a Q3 + 1.5×IQR. Puede calcularlo mediante programación para contar e inspeccionar los valores atípicos de cada columna numérica sin generar gráficos. Esto resulta útil en canalizaciones automatizadas en las que necesita registrar recuentos de anomalías en lugar de generar gráficos. Decidir qué hacer con los valores atípicos —eliminarlos, limitar sus valores o marcarlos— debe ser una elección deliberada basada en el conocimiento del dominio.
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')
Q1 = numeric.quantile(0.25)
Q3 = numeric.quantile(0.75)
IQR = Q3 - Q1
lower = Q1 - 1.5 * IQR
upper = Q3 + 1.5 * IQR
outlier_counts = ((numeric < lower) | (numeric > upper)).sum()
print('Outlier counts per column:')
print(outlier_counts[outlier_counts > 0])Recuentos de valores para columnas categóricas
Para cada columna categórica, llame a value_counts() para ver cómo se distribuyen las observaciones entre las categorías. Compruebe siempre lo siguiente: ¿domina alguna categoría individual (>80 %)? Esto provoca un desequilibrio de clases en las tareas de clasificación. ¿Hay categorías poco frecuentes con solo 1 o 2 observaciones (errores tipográficos o de introducción de datos)? ¿Coincide la distribución con las expectativas del negocio (por ejemplo, una columna «país» que muestra que la mayoría de los pedidos proceden de un país inesperado)?
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
for col in ['sex', 'embarked', 'class', 'who']:
counts = df[col].value_counts(dropna=False)
pct = (counts / len(df) * 100).round(1)
result = pd.DataFrame({'count': counts, 'pct%': pct})
print(f'\n--- {col} ---')
print(result)Gráficos de barras para variables categóricas
Visualice los recuentos de valores categóricos como gráficos de barras mediante sns.countplot o llamando a value_counts().plot(kind='bar'). Ordene las barras de la más a la menos frecuente para que el lector pueda identificar inmediatamente las categorías dominantes. Para variables binarias (sí/no, hombre/mujer), un gráfico circular es aceptable, pero con más de 3 categorías los gráficos de barras siempre son más claros. Gire 45 grados las etiquetas de las marcas cuando los nombres de las categorías sean largos.
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
df = sns.load_dataset('titanic')
fig, axes = plt.subplots(1, 2, figsize=(12, 5))
sns.countplot(data=df, x='embarked', order=df['embarked'].value_counts().index, ax=axes[0])
axes[0].set_title('Embarkation Port Counts')
sns.countplot(data=df, x='class', order=['First', 'Second', 'Third'], ax=axes[1])
axes[1].set_title('Passenger Class Counts')
plt.tight_layout()
plt.show()Detección de la asimetría y aplicación de transformaciones
Las columnas numéricas con una fuerte asimetría positiva (asimetría > 1.5) suelen beneficiarse de una transformación logarítmica para hacerlas más simétricas. Esto es importante para muchas pruebas estadísticas y algunos algoritmos de ML que suponen normalidad. Aplique np.log1p() (log(x+1), seguro para valores cercanos a cero) y vuelva a comprobar la asimetría. Compare los histogramas antes y después para confirmar que la distribución se ha vuelto más parecida a una campana.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
df = sns.load_dataset('titanic')
fig, axes = plt.subplots(1, 2, figsize=(10, 4))
sns.histplot(df['fare'], bins=30, kde=True, ax=axes[0])
axes[0].set_title(f'fare (skew={df["fare"].skew():.2f})')
log_fare = np.log1p(df['fare'])
sns.histplot(log_fare, bins=30, kde=True, ax=axes[1], color='coral')
axes[1].set_title(f'log1p(fare) (skew={log_fare.skew():.2f})')
plt.tight_layout()
plt.show()Comprobación de columnas con varianza cero
Una columna con varianza cero (todos sus valores son idénticos) no proporciona información a ningún modelo y debe eliminarse. Una columna con varianza cercana a cero (el 99 % de las filas tiene el mismo valor) es igualmente inútil. Calcule la varianza con df.var() y filtre. Compruebe también si hay columnas donde nunique() == len(df): probablemente sean columnas de ID que no deben utilizarse como características, aunque pueden resultar útiles como identificadores de filas.
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')
# Zero-variance columns
zero_var = numeric.columns[numeric.var() == 0].tolist()
print('Zero-variance columns:', zero_var)
# Near-zero variance (std < 0.01)
nzv = numeric.columns[numeric.std() < 0.01].tolist()
print('Near-zero variance:', nzv)
# Likely ID columns (all unique values)
id_candidates = [c for c in df.columns if df[c].nunique() == len(df)]
print('Likely ID columns:', id_candidates)Bucle de automatización del análisis univariante
En lugar de repetir manualmente el mismo análisis para cada columna, escriba un bucle que itere sobre todas las columnas numéricas e imprima las estadísticas clave en un formato estructurado. Así podrá revisar rápidamente decenas de columnas y marcar las que requieran atención. La salida puede guardarse en un archivo CSV como parte de un registro de auditoría de la canalización que las partes interesadas puedan revisar antes de utilizar los datos en el modelado.
import pandas as pd
import seaborn as sns
df = sns.load_dataset('titanic')
numeric = df.select_dtypes('number')
rows = []
for col in numeric.columns:
s = df[col]
Q1, Q3 = s.quantile(0.25), s.quantile(0.75)
IQR = Q3 - Q1
n_outliers = ((s < Q1 - 1.5*IQR) | (s > Q3 + 1.5*IQR)).sum()
rows.append({
'column': col,
'missing_pct': round(s.isna().mean() * 100, 1),
'mean': round(s.mean(), 2),
'std': round(s.std(), 2),
'skew': round(s.skew(), 2),
'outliers': int(n_outliers)
})
report = pd.DataFrame(rows)
print(report.to_string(index=False))Documentación de los hallazgos univariantes
Después de completar el análisis univariante, documente sus hallazgos de forma sistemática. Para cada columna, anote: la forma de la distribución (asimétrica, bimodal o aproximadamente normal), el porcentaje de valores ausentes y la estrategia de imputación prevista, el recuento de valores atípicos y la decisión correspondiente (limitar, eliminar o marcar), así como cualquier valor sospechoso que requiera aclaración del dominio. Esta documentación se convierte en el registro de calidad de los datos que guía los pasos de limpieza y evita que las decisiones se olviden o se cuestionen posteriormente.
Comprobación rápida
Compruebe su comprensión del análisis univariante presentado en esta lección.
Resumen de la lección
En esta lección ha aprendido: los histogramas muestran la forma de la distribución de las columnas numéricas; los diagramas de caja y los límites basados en IQR identifican valores atípicos; y value_counts muestra la frecuencia de las categorías en las columnas categóricas. Automatizar estas comprobaciones en un bucle crea un informe de calidad reutilizable. A continuación exploraremos el análisis bivariante y de correlación: la comprensión de las relaciones entre pares de columnas.
Aprende Python con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 30
- Lecciones
- 120
Preguntas frecuentes
¿La lección «Análisis univariante» es gratis?
Sí — el texto completo de «Análisis univariante» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Pandas & NumPy Academy, actualiza a CoddyKit PRO. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Análisis univariante»?
Analice cada columna de forma independiente: represente las distribuciones de las variables numéricas y los recuentos de valores de las categóricas, y observe los valores atípicos y la asimetría. Practicas Pandas & NumPy Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Pandas & NumPy Academy?
No se requiere experiencia previa. Pandas & NumPy Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.
¿Cuánto tiempo toma la lección «Análisis univariante»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Pandas & NumPy Academy?
Sí. Cada lección de Pandas & NumPy Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Lista de comprobación para perfilar un dataset
- Análisis univariante
- Análisis bivariante y de correlación
- Resumir conclusiones en un informe