Lección · Módulo 1 · Estadística para IA

La covarianza, vista como rectángulos con signo

Si la varianza es el promedio del área de unos cuadrados, la covarianza es el promedio del área de unos rectángulos — pero con signo. Y de la covarianza a la correlación hay un solo paso.

Mate MathPlay · Lección 1.2 · Estadística para modelos

7 minutosInteractivo 2DVisualCon Python

Idea central: la covarianza mide si dos variables se mueven juntas o al revés. Es como la varianza, pero en lugar de cuadrados aparecen rectángulos con signo: verdes cuando ambas variables se mueven en la misma dirección y rojos cuando se mueven contrarias. La correlación es la misma idea, normalizada para vivir entre −1 y +1.

1 Empecemos con 5 pares de datos

En la lección anterior cada muestra tenía un solo número. Ahora cada muestra tiene dos — un par (x, y). Imagina que para 5 lotes registras dos cosas: la pureza del material (x) y el rendimiento de proceso (y):

Muestrax · purezay · rendimiento
S12.1040
S22.4045
S32.6052
S42.9058
S53.0065

La pregunta natural es: ¿cuando sube x, sube también y? ¿O baja? ¿O no pasa nada? La covarianza pone un número a esa intuición.

2 Primer paso: las dos medias

Calculamos la media de cada variable por separado:

μx = (2.10+2.40+2.60+2.90+3.00) / 5 = 2.60
μy = (40+45+52+58+65) / 5 = 52.0

Estas dos medias forman un centro sobre el plano: el punto x, μy) = (2.60, 52). Por ahí pasan dos líneas que cruzan el plano en cuatro cuadrantes:

80 60 40 20 y 2.0 2.6 3.2 x μx μy S1 S2 S3 S4 S5

Mirá la nube: cuando x crece, y también. Esa intuición — "se mueven juntos" — es exactamente lo que la covarianza va a poner en números.

3 Segundo paso: distancia de cada punto a su media

Para cada muestra calculamos dos distancias: x − μx y y − μy. Y luego las multiplicamos:

Muestraxyx − μxy − μy(x−μx)(y−μy)
S12.1040−0.50−12.0+6.00
S22.4045−0.20−7.0+1.40
S32.60520.000.00.00
S42.9058+0.30+6.0+1.80
S53.0065+0.40+13.0+5.20

Ojo a la última columna: cuando las dos distancias tienen el mismo signo (las dos negativas o las dos positivas), su producto es positivo. Cuando tienen signos contrarios, el producto es negativo. Eso es justamente lo que captura "moverse juntas" o "moverse contrarias".

4 El truco: cada producto es un rectángulo con signo

Para cada muestra, dibujamos un rectángulo desde el punto hasta el centro de las medias. Sus lados son las dos distancias y su área es (x − μx)(y − μy). Y le ponemos color según el cuadrante:

Verde: producto positivo — ambas distancias del mismo signo (cuadrantes Q1 y Q3). Rojo: producto negativo — distancias de signo contrario (Q2 y Q4).
+6.00 +1.40 +1.80 +5.20 S1 S2 S3 (0) S4 S5 μx μy
Por qué el signo importa

Si los puntos se reparten parejo entre cuadrantes verdes y rojos, los positivos y negativos se cancelan: la covarianza queda cerca de cero — las variables no se relacionan. Si todos caen en cuadrantes verdes, la covarianza sube — suben juntas. Si todos caen en rojos, baja — cuando una sube, la otra baja.

5 Tercer paso: promediamos las áreas signadas

Sumamos las 5 áreas (con su signo) y dividimos entre 5. Eso es la covarianza:

+6.00 + 1.40 + 0.00 + 1.80 + 5.20
= 14.40
÷ 5
2.88
covarianza
Cov(x,y)
+6.00
S1
+
+1.40
S2
+
0
S3
+
+1.80
S4
+
+5.20
S5
÷ 5 =
2.88
covarianza
Cov(x,y)
Sumar áreas signadas (verdes positivas, rojas negativas) y dividir entre la cantidad de pares. Si dominan las verdes → cov positiva. Si dominan las rojas → cov negativa. Si se cancelan → cov ≈ 0.
Cov(x,y) = (6.00 + 1.40 + 0.00 + 1.80 + 5.20) / 5 = 2.88

Cov positiva ≈ 2.88 → las dos variables suben juntas. Si fuera negativa, una sube y la otra baja. Si fuera cerca de cero, no hay relación lineal entre ellas.

6 Tu turno: arrastra los puntos en el plano

Mové cada punto en cualquier dirección. Vas a ver cómo se redibujan los rectángulos — algunos verdes (positivos), otros rojos (negativos) — y cómo cambian la media, la covarianza y la correlación en vivo.

Sandbox interactivo

Arrastrá los puntos naranjas en cualquier dirección del plano.

μx
2.60
μy
52.00
Cov(x,y)
2.88
x · y
Corr(x,y)
+0.98
−1 a +1

Arrastrá los puntos naranjas en cualquier dirección.

7 De covarianza a correlación: el problema de las unidades

La covarianza tiene un detalle incómodo: sus unidades son (unidad de x) · (unidad de y). En el ejemplo de arriba: "% pureza · kg/h". Eso es raro de comparar entre estudios.

La correlación arregla eso dividiendo la covarianza entre las dos desviaciones estándar:

r = Cov(x, y) / (σx · σy) = 2.88 / (0.329 · 8.92) ≈ +0.98

Esa división hace dos cosas: cancela las unidades (queda un número puro) y aprieta el resultado al rango [−1, +1]. Lo que sale se interpreta fácil:

Escala de la correlación r

−1−0.50+0.5+1

El marcador negro sigue el valor de correlación del sandbox de arriba en vivo. Mové los puntos y mirá cómo se desliza.

Cuidado: correlación no implica causalidad

Que dos variables se muevan juntas no significa que una cause a la otra. Pueden tener una causa común, o ser coincidencia. La correlación te dice "ojo, hay algo aquí" — investigar la causa es otro trabajo.

8 Variante 1: cuando los datos no son lineales (Spearman)

La correlación de Pearson que acabamos de ver tiene una trampa silenciosa: solo mide relaciones lineales. Si dos variables están perfectamente relacionadas pero por una curva (no por una recta), Pearson te dirá "no hay correlación" y eso es falso.

Mirá este caso real:

Y crece siempre que X crece — pero por una curva, no una recta x y Pearson = 0.91 "hay relación, pero no perfecta" Spearman = 1.00 "relación perfecta monótona"

El razonamiento: Spearman no mira los valores absolutos, mira los rangos. Le pregunta a los datos: "¿cuando una variable sube de posición, la otra también sube de posición?" Si la respuesta es sí siempre, da 1.00 sin importar si la curva es recta, exponencial o logarítmica.

Spearman = correlación de Pearson aplicada a los rangos de las variables, no a sus valores

Fórmula rápida: ordenás los valores de cada variable y reemplázalos por su posición (1, 2, 3, ...). Después calculás Pearson sobre esos rangos. Listo.

Cuándo elegir cada una

Pearson: cuando esperás relaciones lineales y los datos no tienen outliers extremos. Spearman: cuando la relación puede ser curva pero monótona (siempre sube o siempre baja), o cuando hay outliers que distorsionan a Pearson.

Caso aplicado · relaciones no lineales en yacimientos

Ley vs profundidad

En muchos yacimientos de cobre porfido, la ley empieza baja en superficie (zona oxidada), sube en la zona enriquecida supergena (a 80-150 m), y vuelve a bajar en la zona primaria más profunda. La relación entre profundidad y ley no es lineal: forma una "joroba".

Si usás Pearson sobre profundidad vs ley en este yacimiento, te va a dar un número cercano a cero — "no hay relación". Y eso es peligrosamente falso: la relación existe, es muy fuerte, pero no es una recta.

Pearson te miente cuando la relación es curva — siempre mirá el scatter plot primero

Recuperación metalúrgica vs P80 de molienda

La recuperación de cobre en flotación sube a medida que el P80 (granulometría) baja — hasta cierto punto. Si seguis moliendo más fino, la recuperación empieza a caer porque las partículas ultrafinas no flotan bien.

Tampoco es una relación lineal. Spearman te va a dar una correlación negativa fuerte (cuando una sube, la otra baja, monótonamente hasta cierto punto). Es más honesto que Pearson aquí.

Antes de reportar correlación, mirá el scatter; si tiene forma de "S" o "U", usa Spearman

Tip práctico

En todo proyecto minero, siempre calculá Pearson Y Spearman y compáralos. Si dan parecido, la relación es aproximadamente lineal. Si Pearson es mucho menor que Spearman, hay no-linealidad importante — vale la pena ajustar un modelo más flexible (polinomio, GAM, árbol de decisión) en lugar de regresión lineal.

9 Variante 2: cuando hay más de dos variables (matriz de correlación)

Hasta ahora miramos 2 variables. Pero en la vida real una tabla tiene 5, 10 o 100 columnas. La matriz de correlación es simplemente una grilla donde la celda (i, j) es la correlación entre la variable i y la variable j:

Matriz de correlación entre 4 variables (heatmap) Temp Humedad Presión Viento Temp Humedad Presión Viento 1.00 -0.72 0.45 0.12 -0.72 1.00 -0.31 0.58 0.45 -0.31 1.00 0.08 0.12 0.58 0.08 1.00 Leyenda: +1: perfecta positiva +0.5: positiva fuerte 0: sin relación -0.5: negativa fuerte -1: perfecta negativa La diagonal siempre vale 1 (correlación de una variable consigo misma). La matriz es simétrica: la celda (i,j) y la celda (j,i) son iguales.

El razonamiento: con un vistazo a esta grilla detectás patrones que en números sueltos no verí>as. Aquí queda claro que la temperatura y la humedad están fuertemente correlacionadas negativamente (a más temperatura, menos humedad). El viento se relaciona bien con la humedad pero casi nada con la temperatura ni la presión.

Por qué importa para IA

La matriz de correlación es el primer paso de Análisis de Componentes Principales (PCA), la técnica más usada para reducir dimensiones. PCA busca los vectores propios de esta matriz — las direcciones donde la varianza se concentra. Vas a ver esa idea de nuevo en la lección de vectores propios.

Caso aplicado · primer análisis de un yacimiento polimetálico

El primer día en un yacimiento nuevo

El laboratorio te entrega un dataset con 1200 muestras de testigos y 12 variables: Cu, Au, Ag, Mo, Pb, Zn, Fe, As, S, profundidad, dureza, ph_in_situ. ¿Por dónde empezas?

Primero, matriz de correlación sobre las 12 variables. En 30 segundos vas a ver:

  • Asociaciones típicas: Cu-Au-Ag suelen correlacionar positivo (sulfuros polimetálicos). Si así sale, confirma que estás en un porfido.
  • Bandera roja de contaminantes: si As correlaciona positivo con Au, va a ser un problema metalúrgico (el arsenico baja la recuperación).
  • Estructura del yacimiento: si Cu correlaciona con profundidad de una forma rara (poco lineal), usá Spearman como segundo chequeo.
  • Variables redundantes: si dos variables correlacionan a más de 0.9, una sobra — no aporta información nueva. Eso te ahorra costos de laboratorio futuro.
La matriz de correlación es el primer plano general de cualquier yacimiento nuevo

Para modelos predictivos de recuperación

Cuando tenés 30+ variables operacionales (flujos, presiones, pH, granulometría, reactivos) y querés entrenar un modelo que prediga la recuperación, la matriz de correlación te dice cuáles son redundantes y cuáles aportan información única. Esa es la base de la selección de variables (feature selection).

Variables con r > 0.9 entre sí: podés eliminar una sin perder información

Tip práctico

Antes de meterte a entrenar un modelo, siempre primero un heatmap de correlación. Pasas de "tengo un dataset con 30 columnas" a "tengo 8 grupos de variables que se mueven juntos". El modelo posterior es mucho más simple y más interpretable.

10 Variante 3: causalidad ≠ correlación + coeficiente de determinación R2

Repetimos el aviso porque es importante: que dos variables estén correlacionadas no significa que una cause a la otra. Los ejemplos clásicos son brutales:

Tres maneras de tener correlación sin causalidad Causa común Z X Y helados vs ahogamientos (Z = verano) Causalidad inversa X Y creemos: X causa Y realidad: Y causa X paraguas y lluvia Coincidencia X Y sin vínculo real queso suizo y muertes en piscina

Coeficiente de determinación R2

Cuando la correlación sí refleja algo real, una pregunta natural es: ¿qué porcentaje de la varianza de Y queda explicado por X?. Ese porcentaje se llama R2 y es simplemente el cuadrado de la correlación de Pearson:

R2 = r2

Si r = 0.98, entonces R2 = 0.96 — "el 96% de la variación de Y se explica por X". Es la métrica estándar para reportar qué tan bien un modelo lineal ajusta los datos.

Interpretación práctica: si tu modelo da R2 = 0.3, está explicando el 30% de la variación — el 70% restante es ruido o falta de otras variables. Si da R2 = 0.99, hay que sospechar: probablemente esté sobreajustando los datos.

Caso aplicado · trampas clásicas de correlación en operaciones

Trampa 1: causa común oculta

En un dataset operacional ves que el consumo eléctrico del chancado correlaciona positivamente con la recuperación metalúrgica. Conclusión tentadora: "¡más energía, más recuperación!".

Pero la verdadera causa es otra: cuando alimentas mineral más duro, el chancado consume más energía Y la recuperación sube porque ese mismo mineral suele tener mejor calidad. La dureza es la causa común. Si actúas sobre la "causa" equivocada (forzar más consumo eléctrico con mineral blando), no vas a mejorar la recuperación — solo aumentas costos.

Antes de actuar, buscá siempre la tercera variable que pueda estar moviendo a las dos

Trampa 2: causalidad inversa

Mirás historial y notás que "los días con más mantenimiento son los días con menos producción". ¿Conclusión? ¿Reducir mantenimiento aumentaría producción?

Justo al revés. Es la baja producción la que causa el mantenimiento (algo se rompió, hay que pararlo a reparar). Si reduces mantenimiento sin cambiar nada más, lo que vas a ver es más días de baja producción no programada.

Preguntáte siempre: ¿quién viene primero en el tiempo? Eso aclara la dirección causal

Para validar causalidad real (lo que sí sirve)

Cuando una correlación te interesa de verdad, hay tres maneras de probar causalidad:

  • Experimento controlado: cambias solo la variable que sospechas y mirá si la otra responde. Ejemplo: aumenta dosaje de colector en una sola celda durante 4 horas y compara recuperación con la celda gemela.
  • Series temporales con desfase: si X causa Y, los cambios en X deben preceder a los cambios en Y. Si los cambios ocurren al mismo tiempo o después, no es causal.
  • Mecanismo físico: podés explicar la causalidad con un modelo químico, mecánico o termodinámico. Si no, sospechá.
Una correlación + un mecanismo físico = causalidad probable

Tip práctico

Antes de presentar una conclusión del tipo "X correlaciona con Y entonces hay que cambiar X", preguntáte: "¿es esto algo que el operador puede manipular directamente o es un efecto que viene de otra parte?". Esa pregunta sola te ahorra el 90% de los errores caros.

+ Más parientes del concepto

La familia de medidas de relación entre variables es enorme. Los principales:

Correlación de Kendall (τ)Ver

Otra correlación basada en rangos, pero aún más robusta que Spearman. Cuenta cuántos pares de observaciones son concordantes (los dos suben juntos o los dos bajan juntos) versus discordantes. Es muy útil para muestras pequeñas y cuando tenés muchos empates.

Correlación parcialVer

Mide la correlación entre X e Y controlando por otras variables. Útil cuando sospechás que una tercera variable Z está inflando la relación aparente. Si la correlación parcial entre X e Y dada Z es cercana a cero, lo que veías era un efecto de Z.

Información mutua (mutual information)Ver

La versión más general de "qué tanto saber una variable te dice sobre la otra". Captura relaciones no lineales y no monótonas. Si X e Y son independientes, vale 0. Si conocer X te dice todo sobre Y, vale máximo. Se usa muchísimo en selección de variables para modelos de IA.

Heteroscedasticidad (variabilidad no uniforme)Ver

Cuando la dispersión de Y crece (o disminuye) a medida que X crece. Por ejemplo: a mayor ingreso, mayor variabilidad del gasto. Pearson y Spearman no detectan esto — necesitás mirar el scatter plot o calcular varianza condicional. La heteroscedasticidad rompe los supuestos de muchos modelos clásicos.

Ver el código en Python: cinco snippets, de Pearson a la matriz completa Click para abrir

Empezamos con la covarianza pura sin librerías, y vamos escalando hasta la matriz de correlación y un heatmap visual.

1. Covarianza y Pearson sin librerías. Solo Python puro:

01_pearson_basico.pyPYTHON
x = [2.10, 2.40, 2.60, 2.90, 3.00]
y = [40, 45, 52, 58, 65]
n = len(x)

mx = sum(x) / n
my = sum(y) / n

cov = sum((x[i] - mx) * (y[i] - my) for i in range(n)) / n

var_x = sum((xi - mx) ** 2 for xi in x) / n
var_y = sum((yi - my) ** 2 for yi in y) / n

pearson = cov / ((var_x ** 0.5) * (var_y ** 0.5))

print("Covarianza:", round(cov, 3))
print("Pearson r:", round(pearson, 3))

2. Lo mismo con numpy. Tres líneas. Aparece también la matriz de correlación automática:

02_pearson_numpy.pyPYTHON
import numpy as np

x = np.array([2.10, 2.40, 2.60, 2.90, 3.00])
y = np.array([40, 45, 52, 58, 65])

cov = np.cov(x, y, bias=True)[0, 1]   # bias=True usa n; bias=False usa n-1
r = np.corrcoef(x, y)[0, 1]
print("Covarianza:", round(cov, 3))
print("Pearson r:", round(r, 3))
print("R^2 (varianza explicada):", round(r ** 2, 3))

3. Pearson vs Spearman cuando los datos son monótonos pero no lineales:

03_pearson_vs_spearman.pyPYTHON
import numpy as np
from scipy.stats import pearsonr, spearmanr

# Relacion monotonamente creciente pero no lineal (exponencial)
x = np.linspace(0, 5, 30)
y = np.exp(x) + np.random.normal(0, 0.5, 30)

p, _ = pearsonr(x, y)
s, _ = spearmanr(x, y)

print("Pearson  =", round(p, 3), "  (subestima porque es no lineal)")
print("Spearman =", round(s, 3), "  (capta la relacion monotona)")

4. Matriz de correlación con un dataset real (4 variables):

04_matriz_correlacion.pyPYTHON
import numpy as np
import pandas as pd

# 100 observaciones de 4 variables relacionadas
np.random.seed(42)
n = 100
temp = np.random.normal(25, 5, n)
humedad = 80 - 0.7 * temp + np.random.normal(0, 3, n)
presion = 1013 + 0.3 * temp + np.random.normal(0, 2, n)
viento = 5 + 0.05 * humedad + np.random.normal(0, 1, n)

df = pd.DataFrame({
    "temp": temp,
    "humedad": humedad,
    "presion": presion,
    "viento": viento
})

print(df.corr().round(2))

5. Heatmap visual de la matriz con matplotlib:

05_heatmap_correlacion.pyPYTHON
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

np.random.seed(42)
n = 100
df = pd.DataFrame({
    "temp": np.random.normal(25, 5, n),
})
df["humedad"] = 80 - 0.7 * df["temp"] + np.random.normal(0, 3, n)
df["presion"] = 1013 + 0.3 * df["temp"] + np.random.normal(0, 2, n)
df["viento"] = 5 + 0.05 * df["humedad"] + np.random.normal(0, 1, n)

corr = df.corr()

fig, ax = plt.subplots(figsize=(7, 6))
im = ax.imshow(corr, cmap="RdBu_r", vmin=-1, vmax=1)
ax.set_xticks(range(len(corr)))
ax.set_yticks(range(len(corr)))
ax.set_xticklabels(corr.columns, rotation=45)
ax.set_yticklabels(corr.columns)

for i in range(len(corr)):
    for j in range(len(corr)):
        ax.text(j, i, f"{corr.iloc[i, j]:.2f}",
                ha="center", va="center", color="white",
                fontweight="bold")

plt.colorbar(im, ax=ax, label="correlacion")
ax.set_title("Matriz de correlacion")
plt.tight_layout()
plt.show()

11 Pregunta de chequeo

Si todos los puntos cayeran exactamente sobre una línea horizontal (todos con el mismo valor de y, distintos valores de x), ¿cuánto vale la correlación?

Próxima lección

Hasta aquí describimos lo que ya pasó: 5 muestras, sus medias, cómo se mueven juntas. Pero los modelos de IA tienen que decidir qué tan probable es lo que todavía no pasó. Eso pide otra herramienta: probabilidad y distribuciones — que es la próxima parada.

LinkedIn WhatsApp

Regístrate al boletín MathPlay

De la idea al laboratorio que funciona: datos, simulación, visualización, IA y tecnología aplicada a problemas reales de industria y minería. Te escribo cuando hay algo nuevo que vale la pena compartir.

Sin calendario fijo. Sin spam.

Listo. Te escribo cuando haya algo nuevo.

CB
Mg. Ing. Cesar Bobadilla
Ingeniero consultor & docente · Perú

Desarrollo tecnología aplicada a industria y minería, y enseño a convertir datos, prototipos e inteligencia artificial en decisiones útiles. MathPlay conecta matemática, programación, visualización y casos reales de operación.

Dónde publicó
← Lección anterior: varianzaSiguiente: probabilidad →Mate MathPlay