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.
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):
| Muestra | x · pureza | y · rendimiento |
|---|---|---|
| S1 | 2.10 | 40 |
| S2 | 2.40 | 45 |
| S3 | 2.60 | 52 |
| S4 | 2.90 | 58 |
| S5 | 3.00 | 65 |
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:
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:
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:
| Muestra | x | y | x − μx | y − μy | (x−μx)(y−μy) |
|---|---|---|---|---|---|
| S1 | 2.10 | 40 | −0.50 | −12.0 | +6.00 |
| S2 | 2.40 | 45 | −0.20 | −7.0 | +1.40 |
| S3 | 2.60 | 52 | 0.00 | 0.0 | 0.00 |
| S4 | 2.90 | 58 | +0.30 | +6.0 | +1.80 |
| S5 | 3.00 | 65 | +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:
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:
= 14.40
Cov(x,y)
Cov(x,y)
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.
Arrastrá los puntos naranjas en cualquier dirección.
- Tocá "Correlación positiva" y "Correlación negativa": mirá cómo cambia el color de los rectángulos.
- Tocá "Sin correlación": ahora hay rectángulos verdes Y rojos — se cancelan y la covarianza queda cerca de cero.
- La correlación siempre está entre −1 y +1, sin importar las unidades. Esa es su magia.
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:
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
El marcador negro sigue el valor de correlación del sandbox de arriba en vivo. Mové los puntos y mirá cómo se desliza.
- r ≈ +1: cuando una variable sube, la otra sube casi siempre. Relación lineal positiva fuerte.
- r ≈ 0: las variables son indiferentes una a la otra (linealmente).
- r ≈ −1: cuando una sube, la otra baja casi siempre. Relación lineal negativa fuerte.
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:
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.
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.
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.
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 primeroRecuperació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 SpearmanTip 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:
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.
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.
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.
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ónTip 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:
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:
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.
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 dosTrampa 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 causalPara 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á.
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:
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:
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:
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):
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:
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?
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.
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.
