El coeficiente de Spearman, ρ (rho), mide la intensidad y dirección de una relación monótona usando los rangos de los datos.
La correlación de Spearman es una medida no paramétrica de asociación. En lugar de trabajar directamente con los valores originales, reemplaza cada dato por su posición ordenada, llamada rango.
Es especialmente útil cuando los datos son ordinales, cuando la relación no es lineal pero conserva una dirección general, o cuando no conviene suponer una distribución normal.
Para obtener los rangos se ordenan los valores de menor a mayor. El menor recibe el rango 1 y el siguiente recibe el rango 2. Si hay valores repetidos, se asigna a todos el promedio de las posiciones que ocuparían.
Aquí dᵢ es la diferencia entre el rango de x y el rango de y, y n es la cantidad de pares. Esta fórmula es práctica cuando no existen valores empatados.
Consideremos los pares:
| Persona | x | y | Rango x | Rango y | d | d² |
|---|---|---|---|---|---|---|
| A | 10 | 30 | 1 | 1 | 0 | 0 |
| B | 20 | 20 | 2 | 2 | 0 | 0 |
| C | 30 | 40 | 3 | 3 | 0 | 0 |
| D | 40 | 10 | 4 | 4 | 0 | 0 |
En una tabla real, la suma de d² puede ser distinta de cero. Con empates, la forma más segura es calcular la correlación de Pearson sobre los rangos.
| Valor de ρ | Lectura descriptiva |
|---|---|
| ρ cercano a 1 | Asociación monótona positiva fuerte |
| ρ cercano a 0 | No se observa una asociación monótona clara |
| ρ cercano a −1 | Asociación monótona negativa fuerte |
El signo indica la dirección y el valor absoluto indica la intensidad. Los límites concretos para decir “débil” o “fuerte” dependen del contexto.
Una definición general de Spearman es calcular Pearson después de transformar x e y en rangos. Esta versión funciona también cuando existen empates y es la que conviene programar en una aplicación.
| Característica | Pearson | Spearman |
|---|---|---|
| Trabaja con | Valores originales | Rangos |
| Relación principal | Lineal | Monótona |
| Sensibilidad a outliers | Alta | Menor, aunque no desaparece |
| Escala ordinal | No es la opción natural | Sí resulta adecuada |
Una relación monótona aumenta o disminuye de manera consistente, aunque la velocidad de cambio no sea constante. Por ejemplo, y = √x es creciente y no lineal: Spearman puede detectar su orden, mientras Pearson puede reflejar una relación lineal menos perfecta.
Una relación en forma de U no es monótona en todo su recorrido. En ese caso, un valor cercano a cero no significa que las variables sean independientes.
Si varios participantes tienen el mismo valor, no se deben inventar rangos consecutivos distintos. Se promedian las posiciones. Por ejemplo, si dos valores ocuparían las posiciones 3 y 4, ambos reciben 3,5.
La fórmula de 1 − 6Σd²/[n(n²−1)] es una simplificación y puede perder exactitud con muchos empates. Pearson sobre rangos es una alternativa general.
Spearman permite analizar respuestas ordenadas como “bajo”, “medio” y “alto”, siempre que sea razonable considerar que existe una relación de orden entre las categorías. No transforma automáticamente categorías sin orden, como colores o países.
Al usar rangos, la magnitud extrema de un dato deja de dominar el cálculo como puede ocurrir con Pearson. Sin embargo, un valor atípico todavía puede modificar su posición y alterar la conclusión. Por eso conviene revisar el gráfico.
Un ρ observado en una muestra no demuestra por sí solo que exista una asociación en toda la población. Para inferir, se puede contrastar la hipótesis nula de ausencia de asociación y calcular un valor p o un intervalo de confianza mediante métodos apropiados.
La significancia depende también del tamaño de muestra: una asociación pequeña puede ser detectable con muchos datos y una asociación grande puede ser incierta con pocos.
Un ρ alto no prueba que una variable cause la otra. Puede existir una tercera variable, una causalidad inversa o una coincidencia producida por la selección de los datos. La correlación describe asociación; establecer causalidad requiere un diseño adecuado.
El siguiente ejemplo calcula los rangos medios, aplica Pearson sobre ellos y dibuja el gráfico de rangos. El canvas permanece oculto hasta ejecutar el código.
const datos = [
{ x: 10, y: 30 },
{ x: 20, y: 20 },
{ x: 30, y: 40 },
{ x: 40, y: 10 },
{ x: 50, y: 50 }
];
function rangosMedios(valores) {
const ordenados = valores
.map((valor, indice) => ({ valor, indice }))
.sort((a, b) => a.valor - b.valor);
const rangos = Array(valores.length);
let inicio = 0;
while (inicio < ordenados.length) {
let fin = inicio;
while (fin + 1 < ordenados.length && ordenados[fin + 1].valor === ordenados[inicio].valor) fin++;
const rango = (inicio + 1 + fin + 1) / 2;
for (let i = inicio; i <= fin; i++) rangos[ordenados[i].indice] = rango;
inicio = fin + 1;
}
return rangos;
}
const rangosX = rangosMedios(datos.map(dato => dato.x));
const rangosY = rangosMedios(datos.map(dato => dato.y));
const mediaX = rangosX.reduce((suma, rango) => suma + rango, 0) / rangosX.length;
const mediaY = rangosY.reduce((suma, rango) => suma + rango, 0) / rangosY.length;
const numerador = rangosX.reduce((suma, rango, indice) => suma + (rango - mediaX) * (rangosY[indice] - mediaY), 0);
const sumaX = rangosX.reduce((suma, rango) => suma + (rango - mediaX) ** 2, 0);
const sumaY = rangosY.reduce((suma, rango) => suma + (rango - mediaY) ** 2, 0);
const rho = numerador / Math.sqrt(sumaX * sumaY);
console.log('Rangos de x:', rangosX);
console.log('Rangos de y:', rangosY);
console.log('Correlación de Spearman:', rho.toFixed(3));
if (typeof document !== 'undefined') {
const canvas = document.getElementById('canvasSpearmanCodigo');
const contexto = canvas.getContext('2d');
const margen = { izquierda: 70, derecha: 780, arriba: 35, base: 390 };
const escalaX = rango => margen.izquierda + (rango - 1) / 4 * (margen.derecha - margen.izquierda);
const escalaY = rango => margen.base - (rango - 1) / 4 * (margen.base - margen.arriba);
contexto.clearRect(0, 0, canvas.width, canvas.height);
contexto.strokeStyle = '#b8a5d9';
contexto.lineWidth = 1;
contexto.beginPath(); contexto.moveTo(margen.izquierda, margen.base); contexto.lineTo(margen.derecha, margen.base); contexto.stroke();
contexto.beginPath(); contexto.moveTo(margen.izquierda, margen.base); contexto.lineTo(margen.izquierda, margen.arriba); contexto.stroke();
contexto.fillStyle = '#65468d';
rangosX.forEach((rango, indice) => {
contexto.beginPath();
contexto.arc(escalaX(rango), escalaY(rangosY[indice]), 7, 0, Math.PI * 2);
contexto.fill();
});
}La correlación de Spearman ofrece una forma clara y flexible de medir asociaciones basadas en el orden. Programarla exige ordenar correctamente, tratar los empates con rangos medios y calcular Pearson sobre las posiciones resultantes. Interpretar el número junto con el gráfico y el contexto es tan importante como obtenerlo.