Estadistica Descriptiva con Python
Describiendo Datos con NumerosLa estadistica descriptiva es tu primera herramienta de analisis. Antes de hacer modelos complejos, necesitas entender la forma, centro y dispersion de tus datos. En esta leccion vas a aprender a calcular e interpretar las metricas estadisticas mas importantes usando Python.
Medidas de Tendencia Central
import pandas as pd
import numpy as np
from scipy import stats
# Dataset de ejemplo: salarios en una empresa
np.random.seed(42)
salarios = pd.Series(np.random.lognormal(mean=10.8, sigma=0.5, size=500).round(2))
salarios.name = 'Salario'
# Media (promedio)
media = salarios.mean()
print(f"Media: ${media:,.2f}")
# Mediana (valor central)
mediana = salarios.median()
print(f"Mediana: ${mediana:,.2f}")
# Moda (valor mas frecuente)
# Para datos continuos, usamos bins
moda = salarios.round(-3).mode()[0] # Redondeado a miles
print(f"Moda (aprox): ${moda:,.0f}")
# Comparar media vs mediana
if media > mediana * 1.1:
print("Distribucion sesgada a la derecha (hay salarios muy altos)")
elif media < mediana * 0.9:
print("Distribucion sesgada a la izquierda")
else:
print("Distribucion aproximadamente simetrica")
Cuando usar cada una?
| Medida | Cuando usarla | Ejemplo |
|---|---|---|
| Media | Datos simetricos, sin outliers extremos | Notas de examen |
| Mediana | Datos con outliers o sesgados | Salarios, precios de casas |
| Moda | Datos categoricos o discretos | Talla mas vendida, color favorito |
Medidas de Dispersion
# Rango
rango = salarios.max() - salarios.min()
print(f"Rango: ${rango:,.2f}")
# Varianza
varianza = salarios.var()
print(f"Varianza: {varianza:,.2f}")
# Desviacion estandar
desv_est = salarios.std()
print(f"Desviacion estandar: ${desv_est:,.2f}")
# Coeficiente de variacion (permite comparar dispersiones)
cv = (desv_est / media) * 100
print(f"Coeficiente de variacion: {cv:.1f}%")
# Rango intercuartilico (IQR)
Q1 = salarios.quantile(0.25)
Q3 = salarios.quantile(0.75)
IQR = Q3 - Q1
print(f"\nQ1 (25%): ${Q1:,.2f}")
print(f"Q2 (50%): ${salarios.quantile(0.50):,.2f}")
print(f"Q3 (75%): ${Q3:,.2f}")
print(f"IQR: ${IQR:,.2f}")
Funcion describe() de Pandas
La forma mas rapida de obtener estadisticas descriptivas:
# Dataset completo
np.random.seed(42)
df = pd.DataFrame({
'edad': np.random.randint(22, 60, 200),
'salario': np.random.lognormal(10.8, 0.5, 200).round(2),
'experiencia': np.random.randint(0, 30, 200),
'evaluacion': np.random.uniform(1, 5, 200).round(1),
'departamento': np.random.choice(['Marketing', 'Ventas', 'IT', 'RRHH', 'Finanzas'], 200)
})
# Estadisticas de columnas numericas
print("Estadisticas numericas:")
print(df.describe().round(2))
# Estadisticas de columnas categoricas
print("\nEstadisticas categoricas:")
print(df.describe(include='object'))
# Percentiles personalizados
print("\nPercentiles detallados:")
print(df['salario'].describe(percentiles=[0.1, 0.25, 0.5, 0.75, 0.9, 0.95, 0.99]))
# Estadisticas por grupo
print("\nSalario promedio por departamento:")
print(df.groupby('departamento')['salario'].describe().round(2))
Asimetria y Curtosis
# Asimetria (skewness): mide si la distribucion esta sesgada
skewness = df['salario'].skew()
print(f"Asimetria (skewness): {skewness:.3f}")
# > 0: sesgada a la derecha (cola larga a la derecha)
# < 0: sesgada a la izquierda
# = 0: simetrica
# Curtosis: mide si la distribucion tiene colas pesadas
kurtosis = df['salario'].kurtosis()
print(f"Curtosis: {kurtosis:.3f}")
# > 0: colas mas pesadas que normal (mas outliers)
# < 0: colas mas livianas
# = 0: similar a normal
# Interpretacion automatica
if abs(skewness) < 0.5:
print("Distribucion aproximadamente simetrica")
elif skewness > 0:
print("Distribucion sesgada a la derecha (valores altos extremos)")
else:
print("Distribucion sesgada a la izquierda")
Analisis por Grupos
# Estadisticas descriptivas por departamento
resumen = df.groupby('departamento').agg(
empleados=('salario', 'count'),
salario_medio=('salario', 'mean'),
salario_mediano=('salario', 'median'),
salario_std=('salario', 'std'),
edad_media=('edad', 'mean'),
eval_media=('evaluacion', 'mean')
).round(2)
resumen = resumen.sort_values('salario_medio', ascending=False)
print("Resumen por departamento:")
print(resumen)
# Deteccion de diferencias entre grupos
for dept in df['departamento'].unique():
grupo = df[df['departamento'] == dept]['salario']
print(f"\n{dept}: Media=${grupo.mean():,.0f}, Mediana=${grupo.median():,.0f}, CV={grupo.std()/grupo.mean()*100:.1f}%")
Video Recomendado
Estadistica Descriptiva con Python - Curso Completo
Ejercicio Practico
Crea un notebook 11_estadistica_descriptiva.ipynb:
- Genera un dataset de 1000 registros con al menos 4 columnas numericas y 2 categoricas
- Calcula todas las medidas de tendencia central y dispersion
- Analiza la asimetria y curtosis de cada variable numerica
- Compara estadisticas entre grupos (ej: salario por departamento)
- Identifica outliers usando el metodo IQR
- Escribe un parrafo interpretando los resultados
💡 Concepto Clave
Revisemos los puntos más importantes de esta lección antes de continuar.
Resumen
- Tendencia central: Media (promedio), Mediana (valor central), Moda (mas frecuente)
- Dispersion: Desviacion estandar, IQR, Coeficiente de variacion
- Forma: Asimetria (skew) y Curtosis (kurtosis)
- describe(): Resumen rapido de estadisticas
- groupby + agg: Estadisticas por segmentos
- Siempre compara media vs mediana para detectar sesgo
🧠 Pon a prueba tu conocimiento
¿Cuál es el aspecto más importante que aprendiste en esta lección?
- Comprendo el concepto principal y puedo explicarlo con mis palabras
- Entiendo cómo aplicarlo en mi situación específica
- Necesito repasar algunas partes antes de continuar
- Quiero ver más ejemplos prácticos del tema
✅ ¡Excelente! Continúa con la siguiente lección para profundizar más.