Volver al curso

Data Science con Python: Análisis de Datos para Tu Carrera

leccion
11 / 23
intermediate
8 horas
Analisis Estadistico con Python

Estadistica Descriptiva con Python

Lectura
55 min~4 min lectura

Estadistica Descriptiva con Python

Describiendo Datos con Numeros

La 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:

  1. Genera un dataset de 1000 registros con al menos 4 columnas numericas y 2 categoricas
  2. Calcula todas las medidas de tendencia central y dispersion
  3. Analiza la asimetria y curtosis de cada variable numerica
  4. Compara estadisticas entre grupos (ej: salario por departamento)
  5. Identifica outliers usando el metodo IQR
  6. 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.