Estadística para IA — 4. Distribuciones y forma de los datos

estadistica
distribuciones
asimetria
Distribuciones discretas y continuas, normal, asimetría, curtosis y detección de anomalías.
Author

Wilder Ramírez Delgado

Published

September 18, 2026

Sesión 4 — Distribuciones y Forma de los Datos

Open in Colab

👋 Sobre el autor

Wilder Ramírez Delgado es Científico de Datos, Arquitecto de IA, Ingeniero Electrónico y Magíster en Analítica de Datos. CEO y fundador de Business Innovation Technology (BIT), consultor y docente universitario, trabaja en la intersección entre Data Science, Inteligencia Artificial, Big Data e IoT, transformando problemas reales en soluciones aplicadas.

De la teoría a la práctica, un problema a la vez.

Distribuciones y Forma de los Datos Aplicadas

Dos conjuntos pueden tener la misma media —e incluso una varianza parecida— y, aun así, mostrar formas distintas: sesgo, colas, una o varias modas. Esa diferencia cambia cómo se interpretan los datos y cómo se elige el preprocesamiento y el algoritmo en Machine Learning.

Este notebook trabaja la forma de la distribución de manera aplicada: qué es una distribución, la normal como referencia, asimetría, curtosis, visualización y detección simple de anomalías.

Contexto de ejemplo: conjuntos sintéticos con la misma media y distinta forma (simétrica frente a sesgada), más un caso de detección de valores extremos.

Electiva I — Estadística Aplicada a la Inteligencia Artificial · Módulo 1 · Sesión 4

Objetivos

  • Comprender qué es una distribución y cómo se lee en una muestra.
  • Distinguir distribuciones discretas y continuas.
  • Interpretar simetría, sesgo y colas.
  • Usar la normal como referencia, no como ley universal.
  • Detectar anomalías con métodos simples (z-score e IQR).
  • Relacionar la forma de los datos con decisiones de Machine Learning y Deep Learning.

Nota: se recomienda ejecutar las celdas en orden. Las fórmulas usan LaTeX ($...$ y $$...$$); si no se ven renderizadas, abre el notebook en Jupyter o Colab.

1. La media no describe la forma

La media resume el centro. La varianza resume el ancho. Ninguna de las dos determina por sí sola cómo se reparte la masa de los datos.

Frase eje: La forma de la distribución determina cómo deben interpretarse, transformarse y modelarse los datos en Machine Learning.

Distribución

Describe qué valores son frecuentes, cuáles son raros y con qué perfil general aparecen: un pico o varios, simetría o sesgo, colas cortas o pesadas.

Asimetría (sesgo)

Una distribución simétrica se equilibra a ambos lados del centro. Una sesgada a la derecha concentra valores bajos y alarga la cola hacia valores altos; una sesgada a la izquierda hace lo contrario.

Colas y curtosis

Las colas indican qué tan frecuentes son los valores extremos. Colas pesadas suelen implicar más outliers y más sensibilidad en pérdidas cuadráticas.

Cuartiles e IQR

Los cuartiles dividen los datos ordenados en cuatro partes iguales: \(Q_1\) (25%), \(Q_2\) (50%, la mediana de la Sesión 2) y \(Q_3\) (75%). El rango intercuartílico \(\text{IQR} = Q_3 - Q_1\) es el ancho del 50% central de los datos. A diferencia de la desviación estándar (Sesión 3), no se mueve con los extremos: es una medida de dispersión robusta. Es la base del boxplot y de la regla de anomalías de la Etapa 9.

Pregunta Qué observar
¿Dónde está el centro? Media o mediana
¿Qué tan anchos son los datos? Desviación estándar o IQR
¿Hay un lado más largo? Asimetría
¿Hay extremos frecuentes? Colas / curtosis
¿Hay más de un pico? Multimodalidad

2. Por qué importa en IA y Machine Learning

El desempeño de un modelo suele mejorar cuando el analista conoce de antemano el comportamiento de las variables de entrada y la forma de los errores o residuos.

  • Preprocesamiento: sesgo y colas condicionan escalamiento, transformaciones y tratamiento de extremos.
  • Algoritmos por distancia: k-NN y clustering son sensibles a escala y a valores alejados.
  • Pérdidas cuadráticas: un extremo pesa más; una cola larga puede distorsionar el ajuste.
  • Redes neuronales: entradas muy asimétricas o no estandarizadas pueden hacer el entrenamiento más inestable.

Idea central: no basta con reportar media y varianza. Dos conjuntos pueden compartir esos resúmenes y exigir decisiones de modelado distintas.

3. Flujo recomendado de trabajo

  1. Mirar la forma, no solo el centro

Comparar histogramas o KDE de conjuntos con media parecida.

  1. Identificar el tipo de variable

Discreta o continua: eso cambia si se habla de frecuencias puntuales o de densidad.

  1. Usar la normal como referencia

La regla 68-95-99.7 ayuda a leer rareza cuando la forma es aproximadamente gaussiana.

  1. Describir sesgo y colas

Decidir si conviene media o mediana, y si un valor extremo es plausible o anómalo.

  1. Detectar anomalías con más de un criterio

Comparar z-score e IQR; el segundo suele ser más robusto ante sesgo.

  1. Traducir la forma a una decisión de modelado

Escalar, transformar, cambiar la pérdida o revisar el algoritmo según la forma observada.

Criterio general: la forma no es un adorno del análisis exploratorio; es un insumo para el pipeline.

4. Preparar el entorno

%matplotlib inline
import sys
print("Python:", sys.version.split()[0])
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
print("pandas:", pd.__version__, "| numpy:", np.__version__)

np.random.seed(42)
Python: 3.13.9
pandas: 2.3.3 | numpy: 2.3.5

5. Desarrollo por etapas

El análisis se divide en etapas: motivar la forma con un ejemplo, definir qué es una distribución, usar la normal como referencia, describir sesgo y colas, visualizar, detectar anomalías y conectar con Machine Learning. Cada etapa de código incluye una interpretación de los resultados.

Marco conceptual: de la muestra a la distribución

Población y muestra ya se definieron en la Sesión 1. Esta sesión agrega dos términos:

  • Variable aleatoria \(X\): la magnitud incierta antes de observarla (el tiempo de la próxima solicitud, la nota del próximo estudiante).
  • Realización \(x\): el valor concreto que queda registrado en una fila de la tabla.

La distribución de \(X\) describe qué valores son plausibles y con qué frecuencia relativa. Con datos, se aproxima con histogramas y frecuencias: cada columna numérica es una muestra de realizaciones.

Los recuadros con notación formal (densidad, función de masa, esperanza \(E[X]\)) son un adelanto: la probabilidad se construye con detalle en la Sesión 8. Para seguir esta sesión basta la lectura empírica: frecuencias, histogramas y resúmenes.

Etapa 1: Motivación — misma media, distinta forma

Dos conjuntos pueden tener media parecida, pero comportarse de forma muy diferente.

Antes de ejecutar el código —¿qué observar? En los dos histogramas: número de picos, simetría o sesgo, anchura (dispersión) y si aparecen colas largas o valores aislados. Compare si la forma es similar aunque la media lo sea.

datos_a = np.random.normal(loc=50, scale=8, size=1000)  # aproximadamente simétrico
datos_b = np.random.exponential(scale=8, size=1000) + 42  # sesgado a la derecha

print(f"Media datos A: {datos_a.mean():.2f}")
print(f"Media datos B: {datos_b.mean():.2f}")
print(f"Desv. estándar A: {datos_a.std(ddof=1):.2f} | Desv. estándar B: {datos_b.std(ddof=1):.2f}")

fig, ax = plt.subplots(1, 2, figsize=(12, 4), sharex=True)   # mismo eje x: se comparan formas
ax[0].hist(datos_a, bins=30, color='steelblue', edgecolor='black')
ax[0].set_title('Dataset A (aprox. normal)')
ax[1].hist(datos_b, bins=30, color='darkorange', edgecolor='black')
ax[1].set_title('Dataset B (sesgado)')
for a in ax:
    a.set_xlabel('Valor')
    a.set_ylabel('Frecuencia')
plt.tight_layout()
plt.show()
Media datos A: 50.15
Media datos B: 50.06
Desv. estándar A: 7.83 | Desv. estándar B: 8.02

Después de los gráficos —interpretación: los dos conjuntos tienen la misma media (≈50) y la misma desviación estándar (≈8): con lo visto en las Sesiones 2 y 3 serían indistinguibles. Sin embargo, uno es simétrico y el otro sesgado a la derecha, con valores que no bajan de 42. Si las medias y desviaciones son iguales pero las formas no, queda claro que el promedio no resume el comportamiento. En ML, eso condiciona escalamiento, detección de extremos y el peso relativo de unas observaciones frente a otras en la función de pérdida.

Conexión con ML: Umbrales, escalamiento y sensibilidad a valores extremos dependen de la forma, no solo del promedio.

Más allá de la media: momentos y forma

La media (esperanza) \(\mu = E[X]\) indica el centro de masa probabilístico, pero no determina por sí sola la forma de la distribución. La varianza \(\mathrm{Var}(X) = E[(X-\mu)^2]\) mide la dispersión en unidades al cuadrado; la desviación típica \(\sigma = \sqrt{\mathrm{Var}(X)}\) expresa esa dispersión en las mismas unidades que \(X\).

Dos distribuciones distintas pueden coincidir en media y varianza (lo mismo: mismos \(\mu\) y \(\sigma\), pues \(\sigma\) se deduce de la varianza) y, aun así, diferir en asimetría y curtosis: la masa puede repartirse de otro modo, sobre todo en las colas. Igualar los dos primeros momentos centrados no iguala la forma completa. Por ello, en ML y DL no basta reportar solo promedios (ni solo \(\mu\) y \(\sigma\)): la forma condiciona outliers, escalamiento, elección de funciones de pérdida y la estabilidad numérica de los algoritmos.

Bloque A: Distribuciones de datos

Etapa 2: ¿Qué es una distribución?

La distribución describe cómo se reparten los valores de una variable: cuáles aparecen más, cuáles menos y con qué forma general.

Distribución de una variable: marco probabilístico mínimo

Formalmente, la distribución de una variable aleatoria \(X\) es la regla que asigna probabilidades a eventos asociados a \(X\). Según el tipo de variable:

  • Discreta: probabilidades puntuales \(P(X = x)\) (masa).
  • Continua: probabilidades en intervalos mediante una densidad \(f_X(x)\) (no en puntos aislados).

En una muestra finita, la distribución empírica (histogramas, ECDF, KDE) aproxima la ley teórica; la discrepancia depende del tamaño muestral, del muestreo y de la calidad de los datos.

Objetivo en análisis exploratorio: contrastar la forma empírica con familias de modelos conocidos (normal, exponencial, Poisson, etc.) para guiar supuestos, transformaciones y métodos de detección de valores extremos.

ejemplo = np.array([1, 1, 2, 2, 2, 3, 4, 4, 5])
tabla = pd.Series(ejemplo).value_counts().sort_index()
print('Frecuencia por valor:')
print(tabla)

tabla.plot(kind='bar', color='mediumpurple', edgecolor='black', figsize=(6, 4))
plt.title('Frecuencia de valores (ejemplo simple)')
plt.xlabel('Valor')
plt.ylabel('Frecuencia')
plt.show()
Frecuencia por valor:
1    2
2    3
3    1
4    2
5    1
Name: count, dtype: int64

Conexión con ML: Antes de modelar, conviene identificar qué valores dominan y qué tan frecuente es cada zona de la variable.

Etapa 3: Distribuciones discretas

Una variable discreta toma valores contables (0, 1, 2, …), por ejemplo número de errores en una página.

Variables discretas: función de masa y soporte

Una variable discreta toma valores en un conjunto finito o infinito numerable \(\{x_1, x_2, \dots\}\). Su comportamiento se describe con la función de masa de probabilidad \(p_X(x) = P(X = x)\), sujeta a \(p_X(x) \ge 0\) y \(\sum_x p_X(x) = 1\).

La función de distribución acumulada es \(F_X(x) = P(X \le x)\), una función escalonada que salta en los puntos del soporte.

Ejemplos paradigmáticos: - Bernoulli (éxito/fracaso, una sola prueba). - Binomial (conteo de éxitos en \(n\) pruebas independientes con la misma probabilidad). - Poisson (conteo de eventos raros en un intervalo fijo de tiempo o espacio bajo supuestos de tasa constante e independencia).

En ML, las discretas aparecen como objetivos de clasificación, conteos o variables categóricas codificadas; su tratamiento probabilístico difiere del de variables continuas.

errores = np.random.poisson(lam=2, size=500)
freq_errores = pd.Series(errores).value_counts().sort_index()

freq_errores.plot(kind='bar', color='teal', edgecolor='black', figsize=(8, 4))
plt.title('Distribución discreta: número de errores por página')
plt.xlabel('Número de errores')
plt.ylabel('Frecuencia')
plt.show()

Interpretación y ML: Este tipo de variable aparece en conteos y clasificación (por ejemplo, número de clics, número de reclamos, eventos por hora).

Etapa 4: Distribuciones continuas

Una variable continua puede tomar infinitos valores dentro de un rango (altura, tiempo, temperatura, ingreso, etc.).

Variables continuas: densidad y función de distribución

Una variable continua se modela habitualmente mediante una función de densidad \(f_X(x)\) no negativa tal que \(\int_{-\infty}^{\infty} f_X(x)\,dx = 1\).

  • La probabilidad de un intervalo \([a,b]\) es \(P(a \le X \le b) = \int_a^b f_X(x)\,dx\).
  • No se interpreta \(f_X(x_0)\) como “la probabilidad de \(x_0\)”: en variables continuas, la masa puntual es cero; la densidad indica tasa relativa de probabilidad en torno a \(x_0\).

La función de distribución acumulada \(F_X(x) = P(X \le x)\) es monótona no decreciente y conecta densidad e intervalos: \(F_X(b) - F_X(a) = P(a < X \le b)\).

Ejemplos frecuentes en ingeniería y ML: normal, exponencial (tiempos entre eventos en modelos sencillos), uniforme (ruido de cuantización idealizado), log-normal (productos de factores multiplicativos positivos).

tiempos = np.random.normal(loc=30, scale=5, size=1000)

fig, ax = plt.subplots(1, 2, figsize=(12, 4))
ax[0].hist(errores, bins=np.arange(errores.min(), errores.max()+2)-0.5, color='teal', edgecolor='black')
ax[0].set_title('Discreta (conteo)')
ax[1].hist(tiempos, bins=30, color='slateblue', edgecolor='black')
ax[1].set_title('Continua (tiempo)')
for a in ax:
    a.set_xlabel('Valor')
    a.set_ylabel('Frecuencia')
plt.tight_layout()
plt.show()

Conexión con ML: Muchas variables de entrada en ML son continuas; por ello, el examen de sus distribuciones es un paso habitual del análisis exploratorio.

Hasta aquí se describió qué es una distribución, el contraste discreto/continuo y la frecuencia como pista de la forma. Ahora se estudia un modelo de referencia: la distribución normal, útil para fijar expectativas y para entender límites de los supuestos gaussianos en ML.

Bloque B: La distribución normal

Etapa 5: Distribución normal

Presenta forma de campana, es simétrica y en ella media, mediana y moda coinciden (en una muestra quedan muy cerca).

Advertencia fundamental: No todos los datos reales siguen una distribución normal. Ingresos, tiempos de espera, conteos o proporciones suelen ser asimétricos o multimodales. La normal es un modelo de referencia útil para razonar y comparar, no una regla universal que deba asumirse sin comprobar.

Modelo gaussiano: notación y propiedades básicas

Se dice que una variable continua \(X\) sigue una distribución normal (gaussiana) con media \(\mu\) y varianza \(\sigma^2\) —notación \(X \sim \mathcal{N}(\mu, \sigma^2)\)— si su densidad es la campana simétrica caracterizada por esos dos parámetros.

Propiedades útiles en la práctica:

  • Simetría: la densidad es simétrica respecto de \(\mu\) y tiene un solo pico: media, mediana y moda coinciden en \(\mu\).
  • Decaimiento en colas: la probabilidad de observar valores muy alejados de \(\mu\) cae rápidamente; ello motiva el uso de bandas \(\mu \pm k\sigma\) como referencia.
  • Papel en el modelado: la normal es un modelo idealizado de referencia, no una descripción exacta de la mayoría de conjuntos empíricos. Sirve para razonar sobre ruido, errores de medición agregados y como base de métodos que postulan errores gaussianos cuando ello es razonable.

La simulación con np.random.normal genera realizaciones muestrales de ese modelo; el histograma aproxima visualmente la forma teórica al aumentar el tamaño muestral.

Conexión con ML si la normalidad se asume sin verificar: umbrales basados en desviaciones típicas pueden subestimar o sobrestimar la rareza de valores; la regresión lineal clásica y algunas pruebas inferenciales pierden fiabilidad si los residuos son muy asimétricos o con colas pesadas; métodos que usan z-scores para limpiar datos pueden eliminar observaciones legítimas o dejar pasar valores problemáticos. Por eso la exploración gráfica y la coherencia con el dominio del problema preceden a la elección de supuestos.

Antes del gráfico de la distribución normal simulada —¿qué observar?

Campana simétrica, un solo pico cerca de la media, colas que se estrechan hacia ambos lados. Compare la alineación de media y mediana marcadas en el gráfico.

normal = np.random.normal(loc=0, scale=1, size=5000)
media_normal = normal.mean()
mediana_normal = np.median(normal)

plt.figure(figsize=(8, 4))
plt.hist(normal, bins=40, color='cornflowerblue', edgecolor='black', alpha=0.85)
plt.axvline(media_normal, color='red', linestyle='--', label=f'Media: {media_normal:.2f}')
plt.axvline(mediana_normal, color='green', linestyle='--', label=f'Mediana: {mediana_normal:.2f}')
plt.title('Distribución normal simulada')
plt.xlabel('Valor')
plt.ylabel('Frecuencia')
plt.legend()
plt.show()

Conexión con ML: La normal es una brújula, no un destino obligatorio: permite calibrar expectativas sobre colas y valores típicos. Cuando los datos se desvían de ella, conviene adaptar transformaciones, pérdidas (p. ej. pasar de error cuadrático a más robusto) o modelos que no dependan de esa hipótesis.

Antes del gráfico de los parámetros de la normal (media y desviación) —¿qué observar?

Panel izquierdo: desplazamiento horizontal de toda la forma al cambiar la media. Panel derecho: misma media central, pero más angosta o más ancha al cambiar la desviación típica (colas más o menos largas).

# Parámetros de la normal: efecto de media y desviación estándar
x1 = np.random.normal(loc=-2, scale=1, size=3000)
x2 = np.random.normal(loc=2, scale=1, size=3000)
x3 = np.random.normal(loc=0, scale=0.5, size=3000)
x4 = np.random.normal(loc=0, scale=2, size=3000)

fig, ax = plt.subplots(1, 2, figsize=(12, 4))
bins_media = np.linspace(-6, 6, 61)   # mismos intervalos para ambas series
ax[0].hist(x1, bins=bins_media, alpha=0.6, label='media=-2, sd=1')
ax[0].hist(x2, bins=bins_media, alpha=0.6, label='media=2, sd=1')
ax[0].set_title('Cambio en la media')
ax[0].legend()

bins_sd = np.linspace(-8, 8, 81)      # con intervalos distintos, las alturas no serían comparables
ax[1].hist(x3, bins=bins_sd, alpha=0.6, label='media=0, sd=0.5')
ax[1].hist(x4, bins=bins_sd, alpha=0.6, label='media=0, sd=2')
ax[1].set_title('Cambio en la desviación estándar')
ax[1].legend()
for a in ax:
    a.set_xlabel('Valor')
    a.set_ylabel('Frecuencia')
plt.tight_layout()
plt.show()

Interpretación y ML: La media desplaza la distribución; la desviación la hace más concentrada o más dispersa. Como ambas series tienen el mismo número de datos, la campana estrecha (\(sd=0.5\)) es mucho más alta: la misma cantidad de observaciones se reparte en un tramo cuatro veces más corto. Esto se relaciona con escalamiento y variabilidad de features.

Familia de localización y escala (intuición)

Muchas distribuciones —entre ellas la normal— pertenecen a una familia de localización–escala: existe una variable base \(Z\) con forma fija y parámetros de referencia, y la variable observada se expresa como

$$ X = + Z, > 0.

$$

  • \(\mu\) actúa como parámetro de localización (desplazamiento horizontal de la densidad).
  • \(\sigma\) actúa como parámetro de escala (anchura: mayor \(\sigma\) implica mayor dispersión y colas que se extienden más lejos del centro, manteniendo la misma forma relativa).

Esta lectura conecta el ajuste de parámetros con transformaciones afines sobre los datos, habituales en preprocesamiento.

Antes del gráfico de la regla empírica 68–95–99.7 —¿qué observar?

Histograma aproximadamente simétrico; líneas verticales en \(\pm1\sigma\), \(\pm2\sigma\), \(\pm3\sigma\). Tras ejecutar, compare los porcentajes impresos con 68, 95 y 99.7 (muestra grande, datos simulados normales).

# Regla empírica 68%-95%-99.7%
z = np.random.normal(loc=0, scale=1, size=200000)
m, s = z.mean(), z.std()

p1 = np.mean((z >= m - 1*s) & (z <= m + 1*s))
p2 = np.mean((z >= m - 2*s) & (z <= m + 2*s))
p3 = np.mean((z >= m - 3*s) & (z <= m + 3*s))

print(f'Dentro de ±1σ: {p1*100:.2f}%')
print(f'Dentro de ±2σ: {p2*100:.2f}%')
print(f'Dentro de ±3σ: {p3*100:.2f}%')

plt.figure(figsize=(8,4))
plt.hist(z, bins=80, color='lightseagreen', edgecolor='black')
for k in [1,2,3]:
    plt.axvline(m-k*s, color='black', linestyle='--', alpha=0.6)
    plt.axvline(m+k*s, color='black', linestyle='--', alpha=0.6)
plt.title('Regla empírica en distribución normal simulada')
plt.xlabel('Valor')
plt.ylabel('Frecuencia')
plt.show()
Dentro de ±1σ: 68.23%
Dentro de ±2σ: 95.41%
Dentro de ±3σ: 99.75%

Conexión con ML (anomalías y rareza): Bajo normalidad aproximada, la regla empírica orienta la rareza de un valor (qué tan lejos cae respecto del “núcleo” en unidades de \(\sigma\)). Esa intuición alimenta reglas exploratorias de anomalías y la lectura de z-scores. Si la normalidad no es plausible, los porcentajes 68–95–99.7 dejan de ser una guía fiable y conviene complementar con cuantiles, IQR u otros criterios robustos.

Regla 68–95–99.7: alcance y condiciones

Para una variable \(X \sim \mathcal{N}(\mu, \sigma^2)\), las probabilidades de caer dentro de bandas centradas en \(\mu\) son aproximadamente:

  • \(P(\mu-\sigma \le X \le \mu+\sigma) \approx 0.68\)
  • \(P(\mu-2\sigma \le X \le \mu+2\sigma) \approx 0.95\)
  • \(P(\mu-3\sigma \le X \le \mu+3\sigma) \approx 0.997\)

Condición esencial: estas proporciones son una aproximación válida solo si la variable es aproximadamente normal (unimodal, simétrica, sin colas excesivamente pesadas respecto de la gaussiana). Bajo fuerte asimetría, mezclas de subpoblaciones o colas muy pesadas, las proporciones empíricas pueden alejarse de estos porcentajes.

Mal uso frecuente: aplicar la regla “a ojo” a cualquier histograma campaniforme, usar \(\bar{x}\) y \(s\) contaminados por outliers para fijar bandas, o interpretar un valor más allá de \(3\sigma\) como “error” sin contexto de dominio.

Uso práctico (detección de valores raros): si la forma es razonablemente normal, las bandas \(\mu \pm 2\sigma\) y \(\mu \pm 3\sigma\) sirven como reglas exploratorias para señalar observaciones poco frecuentes (posibles anomalías o errores), siempre contrastando con el dominio del problema.

Limitaciones: con sesgo, mezclas de grupos o colas muy pesadas, los porcentajes 68–95–99.7 no calibran bien la rareza; además, \(\bar{x}\) y \(s\) contaminados por outliers deforman las bandas.

En ML, la regla es referencia rápida en colas, no sustituto de pruebas formales de normalidad ni único criterio de limpieza.

Tras la normal y la regla empírica, el foco pasa a describir la forma con tres ideas: asimetría, curtosis y su diferencia respecto de la dispersión. Estas ideas son importantes porque condicionan transformaciones y la robustez de muchos algoritmos.

Bloque C: Forma de la distribución

Etapa 6: Asimetría (sesgo)

A continuación se contrastan una distribución aproximadamente simétrica, un sesgo positivo y un sesgo negativo.

Asimetría: definición e intuición

La asimetría cuantifica la falta de simetría de la distribución respecto de su centro de masa probabilística.

  • Distribución simétrica (unimodal típica): la densidad a izquierda y derecha de la media es parecida en espejo; media y mediana suelen estar muy próximas, y el “valor típico” se resume de forma coherente con ambas.
  • Asimetría positiva (sesgo a la derecha): cola más larga hacia valores mayores; en muchos casos unimodales se observa \(\text{media} > \text{mediana}\) —la media es arrastrada por los valores grandes poco frecuentes.
  • Asimetría negativa (sesgo a la izquierda): cola hacia valores menores; suele darse \(\text{media} < \text{mediana}\) en condiciones similares.

Lectura práctica: si media y mediana se separan de forma notable, el resumen solo con la media puede ser engañoso; la mediana describe mejor el centro en presencia de sesgo. En reportes y en ingeniería de características, conviene citar ambas o explicitar la transformación aplicada.

En muestras, el skewness se estima con estadísticos muestrales; el signo y la magnitud orientan sobre transformaciones (log, raíz, Box–Cox/Yeo–Johnson) o modelos que toleren asimetría.

Antes del gráfico de asimetría (sesgo) —¿qué observar?

Tres paneles: simetría vs cola hacia la derecha vs cola hacia la izquierda. Relacione la posición relativa de media (rojo) y mediana (verde) con el tipo de sesgo.

simetrica = np.random.normal(0, 1, 4000)
sesgo_pos = np.random.exponential(scale=1.0, size=4000)
sesgo_neg = -np.random.exponential(scale=1.0, size=4000)

def skewness(x):
    mu = np.mean(x)
    sigma = np.std(x)
    return np.mean(((x - mu) / sigma) ** 3)

fig, ax = plt.subplots(1, 3, figsize=(15, 4))
series = [simetrica, sesgo_pos, sesgo_neg]
titulos = ['Simétrica', 'Asimetría positiva', 'Asimetría negativa']
colores = ['royalblue', 'darkorange', 'purple']

for i in range(3):
    ax[i].hist(series[i], bins=40, color=colores[i], edgecolor='black', alpha=0.85)
    ax[i].axvline(np.mean(series[i]), color='red', linestyle='--', label='Media')
    ax[i].axvline(np.median(series[i]), color='green', linestyle='--', label='Mediana')
    ax[i].set_title(f"{titulos[i]}\nSkew={skewness(series[i]):.2f}")
    ax[i].legend(fontsize=8)
plt.tight_layout()
plt.show()

Conexión con ML: El sesgo puede sesgar también el aprendizaje: en regresión con pérdida cuadrática, unos pocos valores en la cola influyen mucho en el ajuste; en distancias (p. ej. k-NN) y en clustering, una variable muy sesgada y mal escalada puede dominar la geometría del espacio de características. Las transformaciones monótonas (p. ej. logarítmica en variables positivas con cola derecha) suelen acercar la forma a supuestos de métodos lineales o mejoran la estabilidad numérica en redes neuronales, siempre validando en el dominio del problema.

Antes del gráfico de curtosis (colas ligeras vs pesadas) —¿qué observar?

Las dos distribuciones tienen la misma varianza (3). Compare la altura del centro y la extensión de las colas entre ambos histogramas, que comparten escala. Colas pesadas: más masa lejos del centro (más candidatos a extremos en ML).

# Curtosis: colas ligeras vs colas pesadas, con la MISMA varianza
def curtosis_exceso(x):
    mu = np.mean(x)
    sigma = np.std(x)
    return np.mean(((x - mu) / sigma) ** 4) - 3

colas_ligeras = np.random.uniform(-3, 3, 5000)             # uniforme: varianza = 6²/12 = 3
colas_pesadas = np.random.laplace(0, np.sqrt(1.5), 5000)   # Laplace: varianza = 2·b² = 3

print(f"Varianza: ligeras {colas_ligeras.var():.2f} | pesadas {colas_pesadas.var():.2f}")
print(f"Valores con |x| > 4: ligeras {100 * np.mean(np.abs(colas_ligeras) > 4):.1f}% | "
      f"pesadas {100 * np.mean(np.abs(colas_pesadas) > 4):.1f}%")

bins = np.linspace(-9, 9, 73)
fig, ax = plt.subplots(1, 2, figsize=(12, 4), sharex=True, sharey=True)
ax[0].hist(colas_ligeras, bins=bins, color='skyblue', edgecolor='black')
ax[0].set_title(f'Colas más ligeras (uniforme)\nCurtosis exceso={curtosis_exceso(colas_ligeras):.2f}')
ax[1].hist(colas_pesadas, bins=bins, color='salmon', edgecolor='black')
ax[1].set_title(f'Colas más pesadas (Laplace)\nCurtosis exceso={curtosis_exceso(colas_pesadas):.2f}')
for a in ax:
    a.set_xlabel('Valor')
    a.set_ylabel('Frecuencia')
plt.tight_layout()
plt.show()
Varianza: ligeras 2.95 | pesadas 3.13
Valores con |x| > 4: ligeras 0.0% | pesadas 3.9%

Interpretación intuitiva: con la misma varianza, la uniforme no tiene ningún valor más allá de ±3, mientras la Laplace tiene un pico central más alto un 3.9% de sus valores cae más allá de ±4. La curtosis de exceso lo resume: teóricamente −1.2 para la uniforme y 3 para la Laplace (los títulos muestran los valores de esta muestra). La curtosis describe si las colas concentran más o menos masa que en una normal de igual varianza: colas pesadas implican mayor probabilidad de valores extremos; colas ligeras, lo contrario.

Interpretación y ML (curtosis / colas): La curtosis (sobre todo en forma de exceso respecto de la normal) distingue distribuciones con colas ligeras (poca masa en extremos, más concentración cerca del centro) frente a colas pesadas (más probabilidad de valores extremos que en una gaussiana de igual varianza).

  • Colas ligeras: los extremos son raros incluso comparados con la normal; los modelos pueden ser menos sensibles a outliers leves, pero conviene no confundir “poca cola” con ausencia de errores de medición.
  • Colas pesadas: aparecen más outliers y valores influyentes; crecen la varianza del error de predicción en métodos cuadráticos y puede perderse estabilidad en el entrenamiento (gradientes ruidosos en DL, centroides y fronteras sensibles en clustering).

En la práctica, colas pesadas sugieren revisar pérdidas robustas, regularización, escala robusta (mediana/IQR) o reglas de negocio antes de eliminar datos.

Etapa 7: Dispersión, asimetría y curtosis

Momentos centrados y la tabla dispersión–asimetría–curtosis

Los momentos centrados describen propiedades sucesivas de la distribución respecto de la media \(\mu\):

  • Varianza (momento de orden 2 centrado): \(\mathrm{Var}(X) = E[(X-\mu)^2]\). Mide dispersión en unidades al cuadrado; la desviación típica \(\sigma = \sqrt{\mathrm{Var}(X)}\) restablece las unidades originales.
  • Asimetría (skewness, momento estándar de orden 3): \(E\big[\big(\frac{X-\mu}{\sigma}\big)^3\big]\). Indica hacia dónde se extiende la cola más larga.
  • Curtosis (orden 4, habitualmente en forma de exceso respecto de la normal): compara el peso de las colas con el de la campana gaussiana de igual varianza.

La curtosis de exceso de la normal es 0 en la convención más usada en software estadístico; valores positivos sugieren colas más pesadas que la normal (más masa en extremos), y valores negativos, colas más ligeras.

La tabla siguiente resume el rol de cada dimensión en el análisis exploratorio orientado a modelado.

tabla_comparativa = pd.DataFrame({
    'Concepto': ['Dispersión', 'Asimetría', 'Curtosis'],
    'Pregunta clave': [
        '¿Qué tan separados están los datos?',
        '¿Hacia qué lado se inclina la distribución?',
        '¿Qué tan pesadas son las colas?'
    ],
    'Indicador común': ['Desviación estándar', 'Skewness', 'Curtosis (exceso)'],
    'Impacto en ML': [
        'Afecta escalamiento y distancias',
        'Puede requerir transformaciones',
        'Aumenta sensibilidad a valores extremos'
    ]
})
tabla_comparativa
Concepto Pregunta clave Indicador común Impacto en ML
0 Dispersión ¿Qué tan separados están los datos? Desviación estándar Afecta escalamiento y distancias
1 Asimetría ¿Hacia qué lado se inclina la distribución? Skewness Puede requerir transformaciones
2 Curtosis ¿Qué tan pesadas son las colas? Curtosis (exceso) Aumenta sensibilidad a valores extremos

Con los conceptos de forma ya nombrados, conviene ver la distribución. A continuación se usan histograma, boxplot y densidad (KDE): cada uno enfatiza aspectos distintos de los mismos datos.

Etapa 8: Visualización

El histograma, el boxplot y la estimación de densidad (KDE aproximada) son herramientas complementarias para describir la forma de los datos.

Enfoque pedagógico: antes de cada gráfico, conviene preguntarse qué se espera observar; después, qué indica lo que se ve respecto de centro, dispersión, sesgo, colas y posibles anomalías —siempre en relación con el tipo de variable y el uso previsto en ML.

Lectura teórica de los gráficos utilizados

  • Histograma: estima la densidad mediante agrupación en intervalos (bins). La elección del ancho del intervalo altera la percepción de la forma (suavizado vs detalle); por ello, conviene contrastar más de una discretización ante datos nuevos.
  • Diagrama de caja (boxplot): resume la distribución mediante estadísticos de orden (cuartiles y mediana). El cuerpo central refleja la dispersión del 50 % central (IQR); los puntos fuera de los bigotes sugieren candidatos a valores extremos según una convención fija (1.5×IQR).
  • KDE (núcleo): construye una curva suave a partir de la suma de funciones núcleo centradas en cada observación. El resultado depende del ancho de banda \(h\): valores grandes producen curvas muy suavizadas; valores pequeños revelan fluctuaciones muestrales.

Principio general: ninguna visualización es neutral; la combinación de vistas reduce el riesgo de lecturas parciales.

Histograma y boxplot · Antes de ejecutar: ¿qué observar?

Histograma: forma global (unimodal/multimodal), simetría o sesgo, anchura (dispersión), presencia de colas largas o grupos separados, y si el número de intervalos (bins) suaviza u oculta detalle.

Boxplot: posición de la mediana dentro de la caja, longitud del IQR, simetría de los bigotes y puntos individuales fuera de ellos (candidatos a valores extremos según la convención 1.5×IQR).

# Datos de ejemplo para visualización
x = np.random.lognormal(mean=3.0, sigma=0.6, size=1200)

# Histograma
plt.figure(figsize=(8,4))
plt.hist(x, bins=40, color='cadetblue', edgecolor='black')
plt.title('Histograma: forma general y frecuencias')
plt.xlabel('Valor')
plt.ylabel('Frecuencia')
plt.show()

# Boxplot
plt.figure(figsize=(8,2.8))
plt.boxplot(x, orientation='horizontal')
plt.yticks([])
plt.title('Boxplot: mediana, cuartiles y valores atípicos')
plt.xlabel('Valor')
plt.show()

Después del histograma y del boxplot: interpretación

En el histograma suele apreciarse si la masa se concentra en un solo pico o en varios, y si hay arrastre hacia la derecha o la izquierda (sesgo). El boxplot resume el 50 % central y resalta observaciones aisladas respecto de los cuartiles; no reemplaza al histograma, pero facilita comparar escala y outliers entre grupos (en este notebook, una sola variable).

Enlace con ML: la forma observada orienta si hacen falta transformaciones, escala común entre variables o revisiones de outliers antes de entrenar.

KDE · Antes de ejecutar: ¿qué observar?

La curva de densidad estimada debe leerse como una versión suavizada del histograma. Conviene fijarse en el número y ubicación de modas (picos), la simetría global y si las colas descienden lentamente (sugerencia de valores extremos más frecuentes que en una campana estrecha). Recuerde que el suavizado depende del ancho de banda: demasiado grande oculta modas; demasiado pequeño introduce ruido muestral.

# KDE (estimación de densidad) sin seaborn
def kde_gaussiana(muestra, puntos=400):
    muestra = np.asarray(muestra)
    n = len(muestra)
    sigma = np.std(muestra)
    h = 1.06 * sigma * n ** (-1/5)  # regla de Silverman
    grid = np.linspace(np.min(muestra), np.max(muestra), puntos)
    densidad = np.zeros_like(grid)
    for xi in muestra:
        densidad += np.exp(-0.5 * ((grid - xi) / h) ** 2)
    densidad /= (n * h * np.sqrt(2 * np.pi))
    return grid, densidad

gx, dx = kde_gaussiana(x)
plt.figure(figsize=(8,4))
plt.plot(gx, dx, color='darkred', linewidth=2)
plt.title('KDE: curva suave de densidad')
plt.xlabel('Valor')
plt.ylabel('Densidad estimada')
plt.show()

Después de la KDE: interpretación

Una KDE unimodal y simétrica sugiere comportamiento parecido al “núcleo + colas equilibradas”; varios picos sugieren mezcla de comportamientos (subpoblaciones, regímenes distintos) que un solo modelo puede mezclar mal. Colas que se extienden lejos del centro implican mayor riesgo de valores influyentes en métodos sensibles a extremos.

Enlace con ML: la presencia de varias modas o colas pesadas puede motivar segmentación, transformaciones, modelos más flexibles o pérdidas robustas.

Histograma + boxplot + KDE · Antes de ejecutar: ¿qué observar?

En la figura combinada, contraste las tres capas: el histograma (frecuencias brutas), el boxplot (cuartiles y candidatos a outliers) y la KDE (forma suavizada). Busque coherencia entre ellas: un pico en el histograma debe reflejarse en la KDE; los puntos extremos del boxplot deben corresponder a la cola del histograma y de la densidad.

# Comparación completa: histograma + boxplot + KDE (eje x compartido)
fig, ax = plt.subplots(3, 1, figsize=(9, 10), sharex=True, gridspec_kw={'height_ratios': [2.5, 0.8, 2]})

ax[0].hist(x, bins=40, color='steelblue', edgecolor='black', alpha=0.85)
ax[0].set_title('Histograma')
ax[0].set_ylabel('Frecuencia')

ax[1].boxplot(x, orientation='horizontal')
ax[1].set_yticks([])
ax[1].set_title('Boxplot')

ax[2].plot(gx, dx, color='darkgreen', linewidth=2)
ax[2].set_title('KDE')
ax[2].set_xlabel('Valor')
ax[2].set_ylabel('Densidad')

plt.tight_layout()
plt.show()

Después de la comparación completa: interpretación conjunta

  • El histograma muestra la concentración de frecuencias y el grado de detalle según los intervalos elegidos.
  • El boxplot resalta mediana, rango intercuartílico y puntos atípicos respecto de una regla fija.
  • La KDE facilita la lectura de la forma global de la densidad (picos y colas).

Si las tres vistas coinciden en señalar sesgo, colas largas o grupos separados, la evidencia es más sólida que con un solo gráfico. La lectura conjunta orienta el preprocesamiento (escala, transformación, tratamiento de extremos) antes de ML.

Enlace con ML: decisiones como estandarizar, aplicar log, usar escala robusta o revisar outliers deben alinearse con lo que estas tres vistas muestran de forma consistente.

Las visualizaciones sugieren valores extremos o comportamientos raros. Ahora se aborda la noción de anomalía y criterios sencillos para marcarlos, siempre conectando con el uso responsable en pipelines de ML.

Etapa 9: Anomalías

¿Qué es una anomalía?

Es un valor que se aleja de manera notable del comportamiento habitual.

Frase clave: No todas las anomalías son errores; algunas pueden representar información valiosa (fraude que debe detectarse, una nueva cohorte de usuarios, un evento físico raro pero real).

Ejemplos en aplicaciones de IA: fraude financiero, lecturas erróneas de sensores, eventos médicos raros.

Tipología y límites del concepto de anomalía

  • Valor atípico estadístico: se aleja del patrón mayoritario según un criterio (p. ej. distancia en desviaciones típicas o posición respecto del IQR). Puede ser legítimo (evento raro pero real) o espurio (error de medición, registro, unidad).
  • Novedad (novelty): en aplicaciones de IA, a veces interesa distinguir un outlier “malo” de un patrón nuevo que merece modelo aparte (cambio de régimen, nueva cohorte de usuarios, etc.).
  • Contexto de dominio: un mismo valor numérico puede ser anómalo en un escenario y normal en otro; la estadística aporta señales, pero la decisión final suele integrar conocimiento del problema.

Los métodos de esta sección son exploratorios; en producción suelen combinarse con reglas de negocio, modelos supervisados de fraude o control de calidad de datos.

Antes del gráfico de detección de anomalías (z-score e IQR) —¿qué observar?

Núcleo aproximadamente normal y colas o puntos aislados que podrían interpretarse como raros. La pregunta no es solo “¿es outlier?” sino si podrían ser errores o señal según el contexto.

# Datos sintéticos con anomalías añadidas de forma deliberada
base = np.random.normal(100, 10, 800)
anomalias_manual = np.array([35, 40, 170, 185, 210])
y = np.concatenate([base, anomalias_manual])

plt.figure(figsize=(8,4))
plt.hist(y, bins=40, color='orange', edgecolor='black')
plt.title('Datos con posibles anomalías')
plt.xlabel('Valor')
plt.ylabel('Frecuencia')
plt.show()

Después del histograma (anomalías) —interpretación

El núcleo concentrado sugiere el comportamiento habitual; las barras aisladas o colas largas sugieren valores poco frecuentes. No todo lo “lejano” es error: puede ser fraude, fallo de sensor o evento raro pero válido. Los siguientes códigos cuantifican candidatos a atípicos con z-score e IQR para comparar criterios.

# Detección con regla empírica (z-score)
media_y = np.mean(y)
std_y = np.std(y)
z_scores = (y - media_y) / std_y
anom_z = y[np.abs(z_scores) > 3]

print(f'Anomalías detectadas por z-score (|z|>3): {len(anom_z)}')
print(np.sort(anom_z))
Anomalías detectadas por z-score (|z|>3): 5
[ 35.  40. 170. 185. 210.]
# Detección con IQR
q1 = np.percentile(y, 25)
q3 = np.percentile(y, 75)
iqr = q3 - q1
lim_inf = q1 - 1.5 * iqr
lim_sup = q3 + 1.5 * iqr
anom_iqr = y[(y < lim_inf) | (y > lim_sup)]

print(f'Anomalías detectadas por IQR: {len(anom_iqr)}')
print(np.sort(anom_iqr))
print(f'Limites IQR: [{lim_inf:.2f}, {lim_sup:.2f}]')
Anomalías detectadas por IQR: 13
[ 35.          40.          67.28026356  67.84452918  67.96711637
  70.09909634 127.85961551 128.03493044 129.9968853  130.4796295
 170.         185.         210.        ]
Limites IQR: [74.55, 125.21]
# Comparación de métodos: z-score vs IQR
comparacion = pd.DataFrame({
    'Metodo': ['z-score (|z|>3)', 'IQR (1.5*IQR)'],
    'Cantidad_anomalias': [len(anom_z), len(anom_iqr)]
})
comparacion
Metodo Cantidad_anomalias
0 z-score (|z|>3) 5
1 IQR (1.5*IQR) 13

Lectura de este resultado. Aquí el núcleo de los datos es normal y solo hay 5 anomalías sembradas. El z-score encontró exactamente las 5; el IQR marcó 13 (las 5 sembradas y 8 valores legítimos del núcleo, el 1% de 800), porque con datos normales la regla de 1.5×IQR señala por construcción alrededor del 0.7% de los valores legítimos. En este caso el z-score funcionó mejor. La ventaja del IQR aparece en otra situación: cuando los propios extremos inflan la media y la desviación estándar.

Enmascaramiento: cuando los extremos esconden a los extremos

Con una muestra pequeña y varios valores anómalos juntos, la media y la desviación estándar se desplazan hacia ellos, y el z-score deja de verlos. Los cuartiles, en cambio, casi no se mueven.

rng_mask = np.random.default_rng(4)
nucleo = rng_mask.normal(100, 10, 50)
extremos = np.array([300, 320, 340, 360, 380])
y_mask = np.concatenate([nucleo, extremos])

z_mask = (y_mask - y_mask.mean()) / y_mask.std()
q1_m, q3_m = np.percentile(y_mask, [25, 75])
iqr_m = q3_m - q1_m
fuera_iqr = (y_mask < q1_m - 1.5 * iqr_m) | (y_mask > q3_m + 1.5 * iqr_m)

print(f"Media {y_mask.mean():.1f} | desv. estándar {y_mask.std():.1f}  (el núcleo tiene media ≈100 y desv. ≈10)")
print(f"z-score de los 5 extremos: {np.round(z_mask[-5:], 2)}")
print(f"Extremos detectados con |z| > 3: {int(np.sum(np.abs(z_mask[-5:]) > 3))} de 5")
print(f"Extremos detectados con IQR:     {int(np.sum(fuera_iqr[-5:]))} de 5")
Media 121.0 | desv. estándar 70.5  (el núcleo tiene media ≈100 y desv. ≈10)
z-score de los 5 extremos: [2.54 2.82 3.11 3.39 3.68]
Extremos detectados con |z| > 3: 3 de 5
Extremos detectados con IQR:     5 de 5

Lectura. Los 5 extremos suben la media a 121 y la desviación estándar a 70.5, cuando el núcleo tiene ≈100 y ≈10: inflan la escala con la que se los mide. Con \(|z|>3\), el z-score solo detecta 3 de los 5 (300 y 320 quedan con z de 2.5 y 2.8); el IQR detecta los 5. Esa es la razón por la que el IQR se prefiere con datos sesgados o contaminados: no porque detecte más, sino porque su centro y su escala no los fijan los mismos valores que se quiere detectar.

Interpretación (z-score vs IQR):

  • z-score (p. ej. \(|z|>3\) junto a la intuición de la regla empírica): funciona mejor cuando la variable es aproximadamente normal y la media y la desviación típica representan el núcleo de los datos (poca contaminación por extremos). Si el sesgo o los outliers inflan \(s\), la regla se debilita.
  • IQR (bigotes 1.5×IQR): se basa en cuartiles; es más robusto ante sesgo y colas pesadas porque no depende de todos los valores para fijar el centro y la escala.

¿Cuándo usar cada uno? En exploración inicial, conviene aplicar ambos y comparar. Priorizar IQR cuando el histograma muestre sesgo marcado, colas pesadas o varias modas; priorizar z-score cuando la forma sea cercana a la normal y el interés esté en rareza en unidades de desviación típica. La decisión de eliminar, acotar, ponderar o conservar un punto atípico no es automática: depende del dominio y del coste de un falso positivo/negativo.

Diferencia esencial: el z-score mide alejamiento en unidades de desviación típica respecto de la media (óptimo si el núcleo de datos es parecido a una normal y sin contaminación fuerte). El IQR se basa en cuartiles y orden estadístico, y tolera mejor sesgo y valores extremos aislados. En ML, conviene comparar ambos antes de eliminar o transformar datos.

z-score frente a IQR: supuestos y robustez

  • z-score (regla empírica): parte de una descripción paramétrica del centro y la dispersión (media y desviación típica). Si la variable es asimétrica o contiene valores extremos influyentes, \(\bar{x}\) y \(s\) pueden dejar de representar el “núcleo” de los datos; en ese caso, la regla pierde fiabilidad.
  • IQR (regla de los bigotes): se basa en cuantiles (orden estadístico). Los cuartiles resisten mejor a una fracción moderada de valores extremos, por lo que el criterio suele ser más robusto ante sesgo y outliers.
  • Muestreo finito: con pocas observaciones, tanto cuantiles como colas empíricas son ruidosas; conviene interpretar bandas y umbrales con cautela.

En resumen: el z-score privilegia modelos cercanos a la normalidad y datos sin contaminación fuerte; el IQR privilegia descripciones resistentes en presencia de sesgo o colas pesadas.

Ya se analizó forma, visualización y anomalías. Esta sección cierra el puente hacia ML y Deep Learning: cómo la forma del dato se traduce en preprocesamiento y en el comportamiento de modelos concretos.

Etapa 10: Machine Learning y Deep Learning

Esta sección articula el vínculo entre forma de los datos, supuestos de los algoritmos y decisiones de preprocesamiento. El objetivo no es memorizar recetas, sino entender por qué la distribución de entradas y residuos condiciona el comportamiento del modelo.

Síntesis: forma → preprocesamiento → comportamiento del modelo

  1. Forma: sesgo, colas, multimodalidad y outliers describen cómo se reparte la masa de los datos.
  2. Preprocesamiento: escalado, transformaciones y reglas de extremos adaptan esa forma al algoritmo (o mitigan sus puntos débiles).
  3. Comportamiento: métodos distintos reaccionan de modo distinto a la misma forma —por geometría (distancias), por pérdida (cuadrática vs robusta), por normalización interna (capas en redes) o por sensibilidad a valores influyentes.

Rol en Machine Learning

Aprendizaje supervisado (regresión y clasificación).
Los algoritmos minimizan, de forma explícita o implícita, una función de pérdida sobre los datos de entrenamiento. La forma de la distribución del objetivo (en regresión) y de los residuos o errores influye en qué observaciones dominan el ajuste: colas pesadas o valores extremos pueden ejercer una influencia desproporcionada en pérdidas cuadráticas (MSE), mientras que otras pérdidas (MAE, Huber) son menos sensibles a esos puntos. La regresión —en particular la lineal con MSE— es un ejemplo claro de sensibilidad a outliers y a heterocedasticidad.

  • Modelos lineales y similares (regresión lineal, regularización L1/L2): suelen asumir relaciones aproximadamente lineales en el espacio de características y, en inferencia clásica, errores con varianza homogénea y colas moderadas. Sesgo fuerte o heterocedasticidad puede requerir transformaciones del objetivo o de predictores, o modelos que expliquen la varianza.
  • k-NN (vecinos más cercanos): las distancias (euclídea, Manhattan, etc.) comparan variables en un espacio común. Si una variable tiene escala mucho mayor que otra, domina la métrica; el escalamiento es parte del modelado.
  • Clustering (p. ej. K-means): optimiza inercia respecto de centroides en el espacio de características. Variables con mayor varianza o colas largas pueden arrastrar los grupos; datos mal escalados o muy sesgados dificultan interpretar los clusters.
  • Árboles y ensambles (Random Forest, gradient boosting): son relativamente invariables a transformaciones monótonas suaves por variable, pero no eliminan el impacto de ruido extremo, clases desbalanceadas o divisiones profundas dominadas por colas.

Validación y generalización.
Las transformaciones deben ajustarse con el entrenamiento y aplicarse igual a validación y prueba; de lo contrario hay fuga de información y se sobreestima el rendimiento. La distribución en producción puede derivar respecto del entrenamiento.

Rol en Deep Learning (redes neuronales)

Escala y estabilidad: las redes combinan productos matriciales y no linealidades; entradas con órdenes de magnitud muy dispares dificultan elegir una tasa de aprendizaje estable y pueden producir gradientes demasiado grandes o demasiado pequeños. Por eso es habitual centrar y escalar entradas o normalizar píxeles en visión.

Activaciones y normalización interna: la distribución de activaciones cambia al actualizar capas previas. Batch Normalization y similares estabilizan el entrenamiento; son complementarias al preprocesamiento de datos brutos.

Activaciones y saturación: sigmoide/tanh saturan con entradas muy grandes o pequeñas; ReLU y variantes tienen otros compromisos. Datos mal escalados pueden ralentizar el aprendizaje.

Softmax y clases desbalanceadas: la forma de la distribución de etiquetas afecta los logits; suele compensarse con ponderación, remuestreo o ajuste de umbral.

Preprocesamiento y transformaciones

Las transformaciones deben elegirse según la forma de cada variable, el algoritmo y el riesgo de valores atípicos:

Enfoque Efecto principal Sensibilidad típica a outliers
Estandarización (media 0, desv. 1) Compara variables en unidades de dispersión típica Media y desviación muestral pueden distorsionarse con colas pesadas
Min–max a \([0,1]\) Acota el rango observado Muy sensible: un solo extremo redefine el denominador
RobustScaler (mediana, IQR) Centrado y escala basados en estadísticos resistentes Menos influencia de colas; útil antes de métodos lineales o SVM con datos sucios
Log / log1p Reduce cola derecha en variables positivas Requiere \(x>0\) (o desplazamiento); interpretación en escala original cambia
Yeo–Johnson / Box–Cox Familias paramétricas que buscan simetría o varianza más estable Útil en pipelines automáticos; los parámetros deben estimarse solo con train

Principio rector: el preprocesamiento es parte del flujo de modelado; sus parámetros se estiman con entrenamiento y se aplican fijamente en inferencia.

Error común del analista: asumir normalidad sin verificar

Tratar toda variable como gaussiana lleva a bandas y z-scores mal calibrados, limpieza de datos inadecuada y supuestos erróneos en modelos o intervalos de confianza. La consecuencia típica en ML es un pipeline que parece riguroso pero no generaliza o que distorsiona la señal (eliminando rarezas informativas o conservando errores sistemáticos). La respuesta prudente es mirar la forma (histograma, boxplot, KDE), cuestionar el dominio y elegir método y transformación en consecuencia.

Las celdas siguientes ilustran dos efectos de forma sintética: cómo la escala cambia las distancias en k-NN y cómo normalización, estandarización y log modifican una variable sesgada.

Ejemplo ilustrativo: escala de variables y distancias (intuición k-NN)

En k-NN y en métodos basados en distancias (la distancia euclídea se formaliza en la Sesión 6), las variables con rango numérico grande pueden dominar la métrica aunque otra variable sea la que realmente separa las clases. El siguiente ejemplo es sintético (dos características, una irrelevante para la etiqueta pero de escala amplia) y compara distancia euclídea sin transformar frente a la misma distancia tras estandarizar columna a columna con media y desviación del conjunto de entrenamiento —el mismo principio que en un pipeline de ML.

# Ejemplo: una variable discrimina la clase; otra tiene rango grande y es ruido
np.random.seed(42)
n = 200
x0 = np.random.rand(n)  # discriminativa: etiqueta según umbral en 0.5
x1 = np.random.uniform(0, 2000, size=n)  # rango grande, independiente de la clase (ruido)
y = (x0 >= 0.5).astype(int)
X = np.column_stack([x0, x1])

# Punto de consulta: cerca del umbral en x0 (debería parecerse más a la clase 0)
q = np.array([[0.48, 1000.0]])


def vecino_mas_cercano(X_train, y_train, punto):
    dist = np.sqrt(((X_train - punto) ** 2).sum(axis=1))
    i = int(np.argmin(dist))
    return y_train[i], i, dist[i]


pred_sin, idx_sin, d_sin = vecino_mas_cercano(X, y, q)
print('Sin estandarizar → clase predicha:', int(pred_sin),
      '| distancia mínima:', f'{d_sin:.1f}',
      '| x0 del vecino:', f'{X[idx_sin, 0]:.3f}', '| x1 del vecino:', f'{X[idx_sin, 1]:.1f}')

# Estandarización con estadísticos del entrenamiento (solo train; aquí todo es train de juguete)
media = X.mean(axis=0)
std = X.std(axis=0, ddof=0)
std = np.where(std < 1e-12, 1.0, std)
X_std = (X - media) / std
q_std = (q - media) / std

pred_std, idx_std, d_std = vecino_mas_cercano(X_std, y, q_std)
print('Estandarizado   → clase predicha:', int(pred_std),
      '| distancia mínima:', f'{d_std:.3f}',
      '| x0 del vecino:', f'{X[idx_std, 0]:.3f}', '| x1 del vecino:', f'{X[idx_std, 1]:.1f}')

print('\nEtiqueta de referencia (solo por x0 < 0.5): clase 0 para el punto de consulta.')

fig, ax = plt.subplots(1, 1, figsize=(8, 4))
ax.scatter(X[y == 0, 0], X[y == 0, 1], alpha=0.45, label='Clase 0', color='steelblue', s=22)
ax.scatter(X[y == 1, 0], X[y == 1, 1], alpha=0.45, label='Clase 1', color='darkorange', s=22)
ax.scatter(q[0, 0], q[0, 1], color='crimson', s=120, marker='*', edgecolors='black', label='Consulta', zorder=5)
ax.set_xlabel('x0 (discriminativa, rango pequeño)')
ax.set_ylabel('x1 (ruido, rango grande)')
ax.set_title('Dos escalas: el gráfico muestra que x1 ocupa más extensión visual que x0')
ax.legend(loc='upper right', fontsize=8)
plt.tight_layout()
plt.show()
Sin estandarizar → clase predicha: 1 | distancia mínima: 3.0 | x0 del vecino: 0.729 | x1 del vecino: 1003.0
Estandarizado   → clase predicha: 0 | distancia mínima: 0.089 | x0 del vecino: 0.494 | x1 del vecino: 1044.5

Etiqueta de referencia (solo por x0 < 0.5): clase 0 para el punto de consulta.

Interpretación y vínculo con ML: Con datos sin escalar, la diferencia en x1 (del orden de cientos) oculta la diferencia en x0 (del orden de décimas); el vecino más cercano puede pertenecer a la clase equivocada. Tras estandarizar con media y desviación del entrenamiento, ambas dimensiones compiten en unidades comparables y la predicción se alinea mejor con la variable que realmente define la etiqueta.

Este mismo razonamiento motiva el preprocesamiento en k-NN, SVM y K-means, y exige ajustar media/desviación (o min–max, etc.) solo con el conjunto de entrenamiento y aplicar los mismos parámetros a validación y prueba.

Detalle matemático del preprocesamiento (complemento al ejemplo de escalamiento y distancias en k-NN)

  • Estandarización (z-score): \(z_i = (x_i - \mu) / \sigma\) en población; en muestra, \(\hat{z}_i = (x_i - \bar{x}) / s\). Es una transformación afín por variable: no elimina el sesgo por sí sola, pero homogeneiza escalas cuando las desviaciones típicas son representativas.
  • Normalización min–max: \(x'_i = (x_i - x_{\min}) / (x_{\max} - x_{\min})\). El rango observado en entrenamiento define el mapa; valores fuera de ese rango en prueba o en producción pueden quedar fuera de \([0,1]\) si no se recorta o no se vuelve a calibrar.
  • Transformación logarítmica (para \(x_i > 0\) o tras un corrimiento positivo): comprime la cola derecha y acerca la forma a simetrías más manejables para ciertos modelos; la interpretación en la escala original pasa por la inversa (exponencial).

En redes profundas, entradas en rangos comparables suelen facilitar la estabilidad de los gradientes y la búsqueda de hiperparámetros; la elección entre estandarización, normalización u otras transformaciones depende de la forma empírica, del algoritmo y de la presencia de valores extremos.

v = np.random.lognormal(mean=2.3, sigma=0.7, size=1000)

v_norm = (v - v.min()) / (v.max() - v.min())
v_std = (v - v.mean()) / v.std()
v_log = np.log(v)

fig, ax = plt.subplots(2, 2, figsize=(12, 8))
ax = ax.ravel()
ax[0].hist(v, bins=35, color='gray', edgecolor='black'); ax[0].set_title('Original (sesgada)')
ax[1].hist(v_norm, bins=35, color='dodgerblue', edgecolor='black'); ax[1].set_title('Normalizada')
ax[2].hist(v_std, bins=35, color='seagreen', edgecolor='black'); ax[2].set_title('Estandarizada')
ax[3].hist(v_log, bins=35, color='tomato', edgecolor='black'); ax[3].set_title('Transformación log')
for a in ax:
    a.set_xlabel('Valor')
    a.set_ylabel('Frecuencia')
plt.tight_layout()
plt.show()

for nombre, serie in [('original', v), ('min-max', v_norm), ('estandarizada', v_std), ('log', v_log)]:
    print(f"Asimetría {nombre:>13}: {skewness(serie):.2f}")

Asimetría      original: 2.15
Asimetría       min-max: 2.15
Asimetría estandarizada: 2.15
Asimetría           log: 0.05

Lectura. Min-max y estandarización son transformaciones afines: cambian la escala del eje, pero la asimetría queda idéntica (2.15 en las tres). Solo el logaritmo cambia la forma: la asimetría baja a 0.05. Escalar no “normaliza” una variable sesgada; si el modelo necesita una forma más simétrica, hace falta una transformación no lineal.

Caso aplicado: reportar la forma de una variable

Se aplica la guía de la sección 7 a la variable sesgada de la Etapa 8 (x, 1200 valores positivos).

q1_x, q2_x, q3_x = np.percentile(x, [25, 50, 75])
iqr_x = q3_x - q1_x
atipicos_x = np.sum((x < q1_x - 1.5 * iqr_x) | (x > q3_x + 1.5 * iqr_x))
print(f"n = {len(x)} | media = {x.mean():.2f} | mediana = {q2_x:.2f} | IQR = {iqr_x:.2f}")
print(f"Asimetría = {skewness(x):.2f} | curtosis de exceso = {curtosis_exceso(x):.2f}")
print(f"Valores fuera de 1.5×IQR: {atipicos_x} ({100 * atipicos_x / len(x):.1f}%)")
print(f"Asimetría tras log: {skewness(np.log(x)):.2f}")
n = 1200 | media = 24.05 | mediana = 19.93 | IQR = 16.13
Asimetría = 2.21 | curtosis de exceso = 8.05
Valores fuera de 1.5×IQR: 53 (4.4%)
Asimetría tras log: 0.12

“Para x (\(n=1200\)), la distribución es sesgada a la derecha (asimetría 2.21) y de colas pesadas (curtosis de exceso 8.05). Se reportan la mediana (19.93) y el IQR (16.13) en lugar de la media (24.05), que la cola desplaza. El 4.4% de los valores queda fuera de 1.5×IQR: forman parte de la cola de una variable sesgada, no necesariamente son errores, así que no se eliminan sin revisar el dominio. Implicación para el modelo: aplicar log (la asimetría baja a 0.12) antes de métodos lineales o por distancia, estimando la transformación solo con el entrenamiento.”

6. Guía rápida: ¿qué mirar en la forma?

Situación Qué reportar Justificación
Misma media y comportamiento distinto Histograma o KDE El centro no distingue sesgo, colas ni multimodalidad.
Variable aproximadamente simétrica Media y desviación estándar La normal es una referencia útil.
Variable sesgada o con extremos Mediana e IQR Son menos sensibles a la cola.
Buscar anomalías en datos sesgados IQR El z-score asume una forma más simétrica.
Comparar rareza en una normal Regla 68-95-99.7 Solo es fiable si la forma se parece a la gaussiana.

Regla de comunicación: indicar la variable, la forma observada y la decisión de modelado que se deriva.

7. Guía práctica para reportar la forma

Paso 1: identificar la variable

Indica su nombre, si es discreta o continua, y su unidad.

Paso 2: visualizar

Usa al menos un histograma. Complementa con boxplot o KDE cuando quieras ver extremos o suavizar la densidad.

Paso 3: describir el perfil

¿Es simétrica o sesgada? ¿Tiene un pico o varios? ¿Las colas son cortas o pesadas?

Paso 4: elegir resúmenes

  • Simétrica: media y desviación estándar.
  • Sesgada: mediana e IQR, y compara con la media.

Paso 5: redactar el reporte

“Para [variable], la distribución es [simétrica/sesgada]. Se reporta [medida] porque [justificación]. Implicación para el modelo: [escalar/transformar/revisar outliers].”

Errores que conviene nombrar

  1. Resumir solo con media y desviación estándar. La Etapa 1 muestra dos conjuntos con ambas iguales y formas opuestas.
  2. Asumir normalidad sin mirar. La regla 68–95–99.7 y el z-score solo calibran bien si la forma se parece a la gaussiana.
  3. Leer una densidad como probabilidad de un punto. En variables continuas la probabilidad está en los intervalos.
  4. Comparar histogramas con intervalos o ejes distintos. Las alturas dejan de ser comparables.
  5. Creer que el IQR siempre es mejor que el z-score. Con datos normales marca falsos positivos; su ventaja es la robustez ante contaminación.
  6. Eliminar todo lo que una regla marca como atípico. Una anomalía puede ser un error o la señal que se busca (fraude, fallas).
  7. Creer que estandarizar corrige el sesgo. Min-max y z-score cambian la escala, no la forma.
  8. Ajustar transformaciones con todos los datos. Los parámetros se estiman con el entrenamiento y se aplican igual a validación y prueba.

Idea clave

La forma de los datos importa tanto como la media, a veces más, porque condiciona directamente el modelado: qué transformaciones aplican, qué regla de anomalías es fiable, qué pérdida es razonable y qué tan influyentes son los extremos. Describir la distribución es un paso obligatorio antes de entrenar; saltárselo suele traducirse en métricas engañosas, pipelines frágiles o decisiones difíciles de explicar.

Síntesis

Se vio que dos conjuntos con la misma media y desviación pueden tener formas opuestas; se distinguieron distribuciones discretas y continuas; la normal quedó como referencia, con la regla 68–95–99.7 y sus límites; la asimetría y la curtosis describieron hacia dónde y cuánto se extienden las colas; histograma, boxplot y KDE mostraron la misma variable desde tres ángulos; el z-score y el IQR se compararon con datos limpios y con enmascaramiento; y las transformaciones mostraron que solo una no lineal (log) cambia la forma.

8. Puente hacia las siguientes sesiones

En esta sesión vimos que el centro y la dispersión no bastan: la forma condiciona la interpretación, las transformaciones y el modelado.

En la Sesión 5 estudiaremos la relación entre variables: covarianza, correlación, fuerza de la asociación y el riesgo de confundir correlación con causalidad.

La tendencia central responde dónde está el centro. La dispersión responde qué tanto varían los datos. Esta sesión respondió qué forma tiene la distribución. La siguiente preguntará cómo se mueven dos variables juntas.

9. Cierre

Este notebook deja una base aplicada sobre la forma de los datos:

  • lectura de una distribución y diferencia entre casos discretos y continuos,
  • uso de la normal como referencia y de la regla empírica con sus límites,
  • descripción de asimetría, colas y multimodalidad,
  • visualización con histograma, boxplot y KDE,
  • detección simple de anomalías y su vínculo con el preprocesamiento.

Resultado esperado: el estudiante no solo describe un gráfico, sino que puede explicar qué implica esa forma para transformar, escalar o entrenar un modelo.

💬 ¿Te sirvió?

Deja en los comentarios una duda o un caso donde aplicarías esto — respondo todos. Sígueme para no perderte el próximo artículo de la serie y comparte con alguien que esté aprendiendo análisis de datos.

👉 El código completo está disponible para ejecutar directamente.