lección 3
Cuando un coeficiente no significa nada
Dos variables parecidas y los coeficientes enloquecen: eso es colinealidad. Qué la provoca, cómo se detecta con el VIF y por qué arruina un modelo.
⏱ 55 min
Un coeficiente negativo donde esperabas uno positivo es una de las experiencias más desconcertantes de quien empieza a modelar. Metes en un modelo la superficie de una vivienda y, de pronto, el coeficiente dice que a mayor superficie, menor precio. Lo lees tres veces. Repasas el código. No hay ningún error. El modelo predice bien, el R² es alto, todo compila. Y sin embargo el coeficiente afirma algo absurdo. Antes de dudar de las leyes de la economía, hay una explicación mucho más probable, y tiene nombre: colinealidad. Es el fenómeno que vas a aprender a reconocer hoy, porque es la causa número uno de coeficientes que no significan nada.
Ya sabes leer un coeficiente con su intervalo y su p-valor, y conectar eso con lo que viste sobre variables que se cuelan entre otras dos. Aquel problema era una tercera variable OCULTA que movía a las otras dos a la vez. El de hoy es casi el opuesto y por eso despista tanto: no es una variable escondida, son dos variables perfectamente VISIBLES, las dos en tu modelo, que se parecen tanto entre sí que el modelo no sabe a cuál dar el crédito. El resultado es un reparto caótico, y entenderlo te ahorrará muchas horas de buscar un error que no existe.
## La causa, en una imagen: dos variables que van de la mano
Imagina que quieres explicar el peso de una persona a partir de su altura, y por despiste metes la altura dos veces: una medida en centímetros y otra en pulgadas. Son, literalmente, la misma información en dos unidades. El modelo tiene que repartir el efecto de "ser alto" entre dos columnas que suben y bajan exactamente a la vez. ¿Cuánto del peso se debe a los centímetros y cuánto a las pulgadas? La pregunta no tiene respuesta, porque no son dos cosas: son una. El modelo puede poner un coeficiente enorme a los centímetros y otro enorme y negativo a las pulgadas que casi se cancelen, o al revés, o mil combinaciones intermedias. Todas predicen igual de bien, y por eso ninguna es fiable.
El caso de los centímetros y las pulgadas es extremo y evidente, pero la colinealidad real es más sutil y más frecuente. No necesitas dos columnas idénticas: basta con dos que se muevan muy parecido. El gasto en marketing y el número de campañas (cuanto más gastas, más campañas haces). Los metros cuadrados de una vivienda y el número de habitaciones (las casas grandes tienen más cuartos). La edad de un cliente y los años que lleva contigo. Cada par son dos variables distintas que, en la práctica, viajan juntas. Y cuando dos variables viajan juntas, el modelo no puede separar sus efectos.
## Por qué enloquecen los coeficientes
La intuición de fondo es esta: un coeficiente responde a la pregunta "si cambio ESTA variable manteniendo las demás fijas, ¿cuánto cambia el resultado?". Es la clave de todo. Si dos variables se mueven siempre juntas, en tus datos no existe ni un solo caso donde una cambie y la otra se quede quieta. Le estás pidiendo al modelo que estime algo (el efecto de mover una dejando la otra fija) sobre lo que no tiene ni un dato. Y como no tiene información, el cálculo se vuelve inestable: pequeñas variaciones en los datos producen coeficientes salvajemente distintos. De ahí los signos imposibles y los valores desorbitados.
Una analogía ayuda a sentirlo. Imagina que dos compañeros, Ana y Luis, siempre trabajan juntos en los mismos proyectos, nunca por separado. Al final del año, la empresa quiere repartir un bonus según cuánto aportó cada uno. Imposible: como nunca han trabajado el uno sin el otro, no hay forma de saber qué parte del éxito es de Ana y qué parte de Luis. Podrías decir "el 90% fue de Ana y el 10% de Luis", o "el 10% de Ana y el 90% de Luis", y ningún dato te desmentiría, porque sus contribuciones nunca se separaron. El equipo (Ana más Luis) claramente aportó mucho, pero el reparto individual es pura invención. Eso es exactamente lo que le pasa al modelo con dos variables colineales: sabe que el par importa, pero el reparto entre ellas es un adivinar.
Y aquí está el detalle que lo vuelve traicionero: el modelo no se queja. No te da un error, no se niega a calcular. Te devuelve un reparto cualquiera de los infinitos posibles, con sus números concretos y su pinta de resultado serio, y si no sabes lo que está pasando te lo crees. Un coeficiente de -0,7 para la altura en centímetros parece un dato; en realidad es una de las mil formas que tiene el modelo de repartir un crédito que no se puede repartir. La colinealidad no rompe el programa: rompe el significado, en silencio. Por eso hay que reconocerla, porque no salta ninguna alarma.
Hay un síntoma delator que te permite reconocer la colinealidad sin saber nada más: coeficientes individuales con p-valores altos (ninguna variable parece importar por separado) mientras el modelo en conjunto predice bien (R² alto). Es contradictorio solo en apariencia. El conjunto "altura" sí explica el peso, por eso el R² es alto; pero cuando preguntas por los centímetros y las pulgadas por separado, ninguno de los dos puede reclamar el mérito en solitario, porque el otro hace lo mismo. El grupo importa, pero ningún miembro del grupo destaca. Ese patrón (modelo bueno, coeficientes todos flojos) es la firma de la colinealidad.
1import numpy as np2import pandas as pd3import statsmodels.formula.api as smf45rng = np.random.default_rng(11)6n = 1207altura_cm = rng.normal(170, 10, n)8# La misma informacion en otra unidad, con un ruido minimo9altura_in = altura_cm / 2.54 + rng.normal(0, 0.05, n)10peso = 0.9 * altura_cm + rng.normal(0, 5, n)11df = pd.DataFrame({"peso": peso, "altura_cm": altura_cm, "altura_in": altura_in})1213# Modelo SANO: una sola variable14m_solo = smf.ols("peso ~ altura_cm", data=df).fit()15print("Con UNA variable:")16print(f" coef altura_cm: {m_solo.params['altura_cm']:.2f} p-valor: {m_solo.pvalues['altura_cm']:.3f}")1718# Modelo ENFERMO: las dos variables casi iguales19m_dos = smf.ols("peso ~ altura_cm + altura_in", data=df).fit()20print("Con LAS DOS (colineales):")21print(f" coef altura_cm: {m_dos.params['altura_cm']:.1f} p-valor: {m_dos.pvalues['altura_cm']:.2f}")22print(f" coef altura_in: {m_dos.params['altura_in']:.1f} p-valor: {m_dos.pvalues['altura_in']:.2f}")23print(f" R2 del modelo: {m_dos.rsquared:.3f}")
El mismo efecto, estable con una variable y caótico con dos colineales
## Cómo se detecta: correlaciones y el VIF
La primera herramienta de detección es la más barata y ya la conoces: mira la correlación entre tus predictores antes de modelar. Si dos variables tienen una correlación de 0,95, viajan casi juntas, y meterlas las dos en el modelo te va a dar problemas. Una matriz de correlaciones de todas las variables explicativas, de un vistazo, te avisa de los pares peligrosos. Es un control de treinta segundos que evita horas de confusión.
La herramienta específica para esto se llama VIF, por sus siglas en inglés (variance inflation factor, factor de inflación de la varianza). El nombre asusta pero la idea es simple: el VIF de una variable mide cuánto se "infla" la incertidumbre de su coeficiente por culpa de su parecido con las demás. Se calcula intentando predecir esa variable a partir de todas las otras: si las demás la predicen muy bien (porque es casi redundante), el VIF se dispara. La regla práctica que usa todo el mundo: un VIF por debajo de 5 es tranquilo, entre 5 y 10 empieza a preocupar, y por encima de 10 indica colinealidad grave que hay que resolver.
La correlación y el VIF detectan cosas parecidas, pero el VIF caza algo que la correlación simple se pierde, y por eso merece la pena tener los dos. La correlación mira los predictores de dos en dos: te dice si A se parece a B, si A se parece a C, y así. Pero la colinealidad puede ser más sutil: a veces ninguna pareja de variables está muy correlacionada, y sin embargo una variable es casi la suma de otras tres. La correlación de dos en dos no vería ese problema, porque reparte el parecido entre tres relaciones flojas. El VIF sí lo ve, porque pregunta "¿puedo predecir esta variable a partir de TODAS las demás juntas?", no solo de una. Para un modelo con muchas variables, el VIF es la red de seguridad que la matriz de correlaciones no te da.
1import numpy as np2import pandas as pd3from statsmodels.stats.outliers_influence import variance_inflation_factor45rng = np.random.default_rng(11)6n = 1207altura_cm = rng.normal(170, 10, n)8altura_in = altura_cm / 2.54 + rng.normal(0, 0.05, n)9df = pd.DataFrame({"altura_cm": altura_cm, "altura_in": altura_in})1011# El VIF necesita una columna de unos (la constante del modelo)12X = df.copy()13X.insert(0, "const", 1.0)1415for i, col in enumerate(X.columns):16 if col == "const":17 continue18 vif = variance_inflation_factor(X.values, i)19 print(f"VIF de {col}: {vif:.0f} -> {'GRAVE' if vif > 10 else 'ok'}")
El VIF pone número a la colinealidad
## Qué se hace cuando hay colinealidad
La buena noticia es que la solución suele ser sencilla, porque la colinealidad casi siempre significa que estás metiendo información repetida. Las opciones, de más a menos recomendable para un modelo que explica:
- 01.Quitar una de las dos variables. Si la altura en cm y en pulgadas son lo mismo, te quedas con una. Si los metros cuadrados y las habitaciones van muy juntos, eliges la que mejor explique el problema y descartas la otra. Es la opción más limpia: menos variables, coeficientes estables, modelo interpretable.
- 02.Combinar las dos en una sola. Si tienes "gasto en TV" y "gasto en radio" muy correlacionados, a veces tiene sentido sumarlos en "gasto en medios" y meter esa. Pierdes el detalle de cada medio, pero ganas un coeficiente fiable del conjunto.
- 03.Dejarlas, pero solo si el modelo es para PREDECIR. Esta es la clave que une esta lección con la primera. La colinealidad no estropea las predicciones: el par de variables sigue prediciendo igual de bien. Solo estropea la INTERPRETACIÓN de los coeficientes. Así que si tu modelo es para acertar un valor y no vas a leer los coeficientes, la colinealidad te da bastante igual.
Esta es la frase que resume la lección: en un modelo que EXPLICA, un coeficiente inestable es inservible aunque el R² sea altísimo. El R² alto te hace creer que el modelo es bueno, y para predecir puede que lo sea. Pero si lo que querías era explicar (decir cuánto influye cada variable), y los coeficientes bailan según qué datos uses, no puedes afirmar nada sobre ninguna variable individual. Un modelo que predice bien pero cuyos coeficientes no te puedes creer no sirve para el trabajo de explicar. Es exactamente la trampa que vimos en la primera lección, ahora con nombre y apellidos.
## Distinguirlo del confusor: dos problemas que se confunden
Vale la pena separar bien este problema del confusor que ya conocías, porque suenan parecidos y son opuestos. Un confusor es una tercera variable que NO está en tu modelo y que mueve a la vez a tu causa y a tu resultado, haciéndote ver un efecto que no existe (o escondiéndote uno que sí). La solución del confusor es METERLO en el modelo. La colinealidad es justo lo contrario: dos variables que SÍ están en tu modelo y se parecen tanto que estorban. La solución de la colinealidad es QUITAR una.
La forma rápida de distinguirlos: con un confusor, el problema es una variable que falta y el síntoma es un efecto sospechoso que cambia cuando la añades. Con colinealidad, el problema son variables que sobran y el síntoma son coeficientes que bailan, con p-valores altos pese a un R² alto. Uno se arregla sumando, el otro restando. Tenerlos separados en la cabeza te evita la tentación de meter todas las variables disponibles "por si acaso": más variables no es mejor modelo, y a veces es un modelo que ya no puedes interpretar.
Esta tensión (añadir para controlar confusores, quitar para evitar colinealidad) es una de las decisiones más finas del oficio de explicar, y no tiene una receta mecánica. Tienes que meter las variables que confunden, porque si no tu efecto sale sesgado; pero no puedes meter dos que sean casi la misma, porque entonces ningún coeficiente es fiable. El equilibrio sale del conocimiento del problema, no de una fórmula: entiendes qué variables podrían confundir tu efecto y las metes, y entiendes cuáles son redundantes y eliges una. Por eso en el oficio de explicar el modelo nunca se construye a ciegas con todas las columnas que tienes: cada variable entra o sale por una razón que puedes decir en voz alta.
Consejo de senior: antes de ajustar un modelo para explicar, dedica un minuto a mirar la matriz de correlaciones de tus variables explicativas. Si ves un par con correlación por encima de 0,8 o 0,9, decide ANTES de modelar cuál te quedas, en vez de meter las dos y luego pelearte con coeficientes imposibles. El modelo más interpretable casi nunca es el que tiene más variables: es el que tiene las variables justas, cada una aportando algo que las demás no aportan.
## El caso que de verdad te vas a encontrar
El ejemplo de los centímetros y las pulgadas es útil para entender, pero es tan evidente que nadie lo cometería dos veces. La colinealidad que de verdad te va a morder es más disimulada, y vale la pena ver un caso realista. Imagina que modelas las ventas de una cadena de tiendas y, con buena intención, metes como variables el gasto total en marketing, el gasto en televisión, el gasto en radio y el gasto en internet. Las cuatro parecen variables distintas y legítimas. Pero el gasto total es, casi exactamente, la suma de los otros tres. Has metido la misma información dos veces sin darte cuenta, y el modelo te va a devolver coeficientes imposibles para los cuatro, con la firma de siempre: p-valores altos y R² alto.
Lo insidioso es que no hay ninguna variable claramente "repetida" que puedas señalar. Las cuatro suenan razonables, y hace falta pararse a pensar para ver que el total ya contiene a los otros tres. La solución, una vez lo ves, es obvia: o quitas el total y te quedas con el desglose por medio (si quieres entender qué medio funciona), o quitas el desglose y te quedas con el total (si solo te interesa el efecto global del marketing). Lo que no puedes es tenerlos todos, porque le estás pidiendo al modelo que separe el efecto del total del efecto de sus propias partes, y eso no tiene respuesta.
Consejo de senior: desconfía especialmente de las variables que son totales, sumas, porcentajes o medias de otras que también están en el modelo. Si tienes "ingresos", "gastos" y "beneficio", recuerda que el beneficio es ingresos menos gastos: meterlos los tres es colinealidad servida. Lo mismo con "ventas totales" junto a "ventas por canal", o "edad" junto a "año de nacimiento". Antes de ajustar, repasa tu lista de variables buscando cuáles se pueden calcular a partir de otras. Esas son las bombas de colinealidad, y casi siempre entran por buena intención, por querer darle al modelo "toda la información disponible".
## Un apunte histórico: por qué "más datos" no siempre es la respuesta
Existe la idea muy extendida de que casi cualquier problema de un modelo se arregla con más datos. La colinealidad es un buen contraejemplo, y por eso merece una nota. Si tus dos variables son redundantes, recoger un millón de filas más no las vuelve independientes: seguirán viajando juntas, porque su relación es estructural, no un accidente de la muestra. Los centímetros seguirán siendo pulgadas por 2,54 por muchos datos que recojas. Más datos estrecha los intervalos cuando el problema es falta de información; pero cuando el problema es información REPETIDA, más de lo mismo no ayuda. La colinealidad se resuelve pensando qué variables aportan algo distinto, no acumulando filas.
Ya sabes leer un coeficiente, y ya sabes cuándo NO creértelo porque dos variables compiten. Pero hay otra forma en que un modelo puede engañarte, y es más insidiosa, porque no hay ningún coeficiente raro que te avise: el summary te da números con buena pinta aunque la recta sea una mentira. Para destaparlo hay que mirar lo que el modelo deja sin explicar, los residuos, y es lo siguiente que vas a aprender a leer.
## comentarios
Reporta erratas, ayuda a otros o comparte tu opinión. Sé constructivo.
Inicia sesión para comentar y responder.
cargando comentarios...
Regístrate para guardar tu progreso.