En un pueblo de playa, los meses en que más helados se venden son también los meses con más quemaduras solares. Alguien con prisa propondría prohibir los helados en la orilla. Antes de eso, una aclaración: el pueblo es inventado y los números también, los he creado yo para este ejemplo. Aun así, lo que vamos a ver es real y es uno de los errores más repetidos al interpretar datos.
## Qué es una correlación
Una correlación es una medida de cuánto se mueven dos columnas de datos a la vez. Se resume en un número entre −1 y 1, el coeficiente de correlación (en los libros, el de Pearson). Cerca de 1, cuando una sube la otra también. Cerca de 0, no hay relación lineal, es decir, los puntos no se alinean en una recta. Cerca de −1, cuando una sube la otra baja.
## Los datos del pueblo (inventados)
Tenemos veinticuatro meses, dos años seguidos, con tres columnas de datos. Cada una es una variable: algo que se mide y cambia de un mes a otro. La primera es la temperatura media del mes en grados. Los helados vendidos en las heladerías del pueblo. Y las quemaduras, los casos de piel quemada por el sol atendidos en el centro de salud. Insisto: son cifras que me he inventado para que se vea el efecto.
Python trae un módulo llamado `statistics` (un módulo es un fichero con herramientas ya hechas) con una función, es decir, una herramienta con nombre a la que le pasas datos y te devuelve un resultado. Se llama `correlation`, existe desde Python 3.10 y calcula ese número entre −1 y 1. La línea `from statistics import correlation` significa «tráeme esa herramienta de ese módulo». Cada columna de datos va en una lista: valores entre corchetes, uno por mes. `round(..., 2)` redondea a dos decimales y `print` escribe el resultado en pantalla.
1from statistics import correlation23temperatura = [11, 12, 16, 19, 23, 27, 29, 30, 27, 20, 15, 12, 11, 12, 17, 20, 22, 28, 29, 32, 27, 22, 17, 13]4helados = [520, 580, 1010, 1440, 2010, 2680, 3100, 3290, 2600, 1440, 850, 650, 500, 810, 1040, 1400, 1860, 2970, 3090, 3760, 2780, 1790, 980, 640]5quemaduras = [10, 4, 13, 18, 21, 29, 31, 37, 28, 16, 10, 6, 10, 7, 14, 20, 18, 27, 23, 29, 25, 22, 18, 10]67print("helados y quemaduras:", round(correlation(helados, quemaduras), 2))8print("temperatura y helados:", round(correlation(temperatura, helados), 2))9print("temperatura y quemaduras:", round(correlation(temperatura, quemaduras), 2))
Salida: "helados y quemaduras: 0.92", "temperatura y helados: 0.99" y "temperatura y quemaduras: 0.95". Python escribe el decimal con punto.
Helados y quemaduras: 0,92. Casi 1. Los datos dicen que cuando se venden más helados hay más quemaduras, y eso es un hecho: no te has equivocado al calcular. Lo que no dicen es por qué. Y aquí está el error de cabecera: de «suben juntas» a «una provoca la otra» hay un salto que los números no dan.
## La tercera variable: el calor
Mira las otras dos líneas de la salida. La temperatura sube y baja con los helados (0,99) y con las quemaduras (0,95). Cuando hace calor, la gente compra helados. Y cuando hace calor, la gente pasa más horas al sol, y es el sol, no el calor, lo que quema. Los helados y las quemaduras no se hablan entre sí, los dos siguen al calor.
Al calor lo llamamos variable de confusión (en inglés, confounder). Es un factor que influye a la vez en las dos cosas que estás comparando y hace que parezcan relacionadas sin estarlo. Y a esa relación aparente, los libros la llaman correlación espuria, es decir, falsa en cuanto a causa. La correlación existe, pero la explicación que se te ocurre a primera vista es la equivocada.
## Cómo comprobar si hay un tercer factor
Si sospechas que el calor lo explica todo, compáralo en igualdad de condiciones: mira solo los meses con casi la misma temperatura, aquí los que están entre 26 y 28 grados. Si helados y quemaduras estuvieran de verdad unidos, la correlación seguiría alta dentro de ese grupo. Si los unía el calor, debería dejar de salir cerca de 1. En estadística esto se llama controlar por una variable: dejar casi fija la tercera para ver qué queda.
En el código, nos quedamos con los meses de 26 a 28 grados. Un `for` repite un bloque de código una vez por cada mes, y `zip` le da las tres listas a la vez, mes a mes. Un `if` ejecuta lo de dentro solo si se cumple la condición (aquí, que la temperatura esté entre 26 y 28). Y `.append` añade un valor al final de una lista: así llenamos dos listas nuevas con los meses que pasan el filtro. Después calculamos la correlación otra vez.
1from statistics import correlation23temperatura = [11, 12, 16, 19, 23, 27, 29, 30, 27, 20, 15, 12, 11, 12, 17, 20, 22, 28, 29, 32, 27, 22, 17, 13]4helados = [520, 580, 1010, 1440, 2010, 2680, 3100, 3290, 2600, 1440, 850, 650, 500, 810, 1040, 1400, 1860, 2970, 3090, 3760, 2780, 1790, 980, 640]5quemaduras = [10, 4, 13, 18, 21, 29, 31, 37, 28, 16, 10, 6, 10, 7, 14, 20, 18, 27, 23, 29, 25, 22, 18, 10]67helados_banda = []8quemaduras_banda = []9for t, h, q in zip(temperatura, helados, quemaduras):10 if 26 <= t <= 28:11 helados_banda.append(h)12 quemaduras_banda.append(q)1314print("meses entre 26 y 28 grados:", len(helados_banda))15print("helados y quemaduras:", round(correlation(helados_banda, quemaduras_banda), 2))
Salida: "meses entre 26 y 28 grados: 4" y "helados y quemaduras: -0.44". De 0,92 a −0,44.
| Qué comparamos | Meses | Correlación |
|---|---|---|
| Helados y quemaduras | los 24 | 0,92 |
| Temperatura y helados | los 24 | 0,99 |
| Temperatura y quemaduras | los 24 | 0,95 |
| Helados y quemaduras | 4 (26-28 °C) | −0,44 |
Con la temperatura casi igual, vender más helados ya no va con más quemaduras: sale −0,44, no 0,92. Cuatro meses son pocos y el número cambia si mueves la banda, así que tómalo como una ilustración de cómo se razona, no como una medida. Con datos reales usarías muchos más registros, pero la idea es la que se usa de verdad.
Si no mides el tercer factor, no puedes controlarlo. La forma más sólida de demostrar una causa es un experimento donde el azar decida quién recibe qué (en el pueblo, repartir helados gratis a unos turistas elegidos a suertes y contar sus quemaduras).
## Qué hacer cuando veas una correlación
Cada vez que dos gráficos suban juntos, pregúntate dos cosas. ¿Podría ser al revés? ¿Hay un tercer factor que mueva a los dos, como el calor? La segunda es la que más se olvida. Y sé exigente cuando alguien te cuente «A provoca B» solo con una correlación: lo normal es que falte el experimento o el tercer factor.
En resumen: helados y quemaduras correlacionan (0,92) porque el calor mueve a las dos, no porque una cause la otra. Una variable de confusión es ese factor oculto, y se busca comparando solo casos parecidos en lo que sospechas. Mi consejo: la próxima vez que calcules un `correlation`, antes de enseñarlo escribe al lado una frase con el posible tercer factor, y mide ese factor si puedes. Esto lo practicamos en la plataforma en la lección «Correlación no es causalidad: el error más caro», con datos y ejercicios.