Saltar al contenido

lección 2

Regresión lineal con inferencia

Una recta es un efecto estimado con su incertidumbre al lado: ajustar una regresión con coeficiente, intervalo y p-valor, y aprender a leerla.

⏱ 55 min

Hay una recta que lleva en los libros desde 1805, cuando un matemático francés llamado Legendre publicó un método para trazar la mejor línea entre un montón de puntos y usarla para predecir la órbita de un cometa. Poco después, Gauss afirmó haberlo usado años antes, y se montó una de las primeras grandes peleas de prioridad de la ciencia moderna. Lo que ninguno de los dos vio del todo fue que aquella recta no servía solo para dibujar una tendencia: servía para poner un número al efecto de una cosa sobre otra, y para decir cuánto te podías fiar de ese número. Esa segunda parte (la inferencia) es la que convierte una línea bonita en una herramienta de decisión, y es la que vas a aprender hoy.

Ya sabes separar el oficio de explicar del de predecir. Esta lección vive de lleno en el primero. Vas a coger dos variables (una que crees que influye y otra que es el resultado), vas a trazar la mejor recta entre ellas, y vas a leer esa recta como lo que de verdad es: una afirmación con la forma "por cada unidad que sube esto, aquello cambia tanto, y con un 95% de confianza ese tanto está entre A y B". La recta es la respuesta y el intervalo es la honestidad. Sin el intervalo, un coeficiente es una opinión disfrazada de dato.

## Qué es una recta de regresión, en una frase

Imagina los datos de una heladería: cada día tienes la temperatura que hizo y cuántos helados vendiste. Si pintas cada día como un punto (temperatura en el eje horizontal, helados vendidos en el vertical), ves una nube que sube: a más calor, más helados. La regresión lineal busca la única recta que pasa lo más cerca posible de todos esos puntos a la vez. Esa recta tiene una fórmula sencilla: helados = origen + pendiente por temperatura. El origen es cuántos helados venderías a cero grados (una extrapolación, muchas veces sin sentido físico), y la pendiente es lo que de verdad te interesa: cuántos helados más vendes por cada grado que sube el termómetro.

Esa pendiente tiene un nombre que vas a usar mil veces: el coeficiente. Si la pendiente es 6,5, la lectura es directa: por cada grado más de temperatura, vendes de media 6,5 helados más. No es magia ni estadística oscura: es el efecto estimado de una variable sobre otra, expresado en las unidades del problema. Y "de media" es la parte importante: no dice que mañana, si sube un grado, venderás exactamente 6,5 helados más. Dice que, promediando todos los días parecidos, esa es la tendencia.

Detente un momento en la expresión "la mejor recta", porque esconde una decisión que conviene entender. ¿Mejor en qué sentido? Hay infinitas rectas que podrías dibujar entre esos puntos; la regresión elige una concreta con un criterio preciso: la que hace más pequeña la suma de los errores al cuadrado. Para cada punto, mide la distancia vertical entre el punto real y la recta (ese es el error, o residuo), la eleva al cuadrado para que los de arriba y los de abajo no se cancelen, y suma todos. La recta ganadora es la que deja esa suma lo más baja posible. Elevar al cuadrado tiene un efecto secundario que importa: penaliza mucho los errores grandes, así que la recta se esfuerza sobre todo en no quedar muy lejos de ningún punto.

Ese método tiene un nombre, mínimos cuadrados, y una historia que ya has rozado: es lo que Legendre y Gauss discutían a principios del siglo XIX. Lo que ellos resolvían a mano con tablas de logaritmos lo hace hoy una librería en milisegundos, pero el criterio es el mismo de hace dos siglos. No necesitas calcularlo tú: necesitas entender qué está optimizando, porque eso explica, por ejemplo, por qué un solo punto muy alejado (un día rarísimo de ventas) puede torcer toda la recta. Al estar los errores elevados al cuadrado, ese punto raro pesa muchísimo, y la recta se desvía para acercarse a él. Saber esto te hace mirar tus datos con otros ojos antes de fiarte del coeficiente.

La pendiente de esa recta es el coeficiente: cuántos helados más por cada grado

## La herramienta: statsmodels y la API de fórmulas

Para ajustar esta recta vas a usar una librería de Python pensada precisamente para el oficio de explicar: statsmodels. Su gracia es que no se limita a darte la pendiente; te entrega, de serie y sin pedirlo, la incertidumbre de cada número. La forma más legible de usarla es la API de fórmulas, que deja escribir la relación casi como se dice en voz alta. La fórmula "helados ~ temperatura" se lee "helados en función de temperatura", y la virgulilla separa lo que quieres explicar (a la izquierda) de lo que crees que lo explica (a la derecha).

1import pandas as pd
2import statsmodels.formula.api as smf
3
4# Datos de una heladeria: temperatura del dia y helados vendidos
5df = pd.DataFrame({
6 "temperatura": [12, 15, 18, 21, 24, 27, 30, 33, 36],
7 "helados": [128, 150, 165, 190, 205, 240, 255, 272, 295],
8})
9
10# "helados ~ temperatura" = helados en funcion de temperatura
11modelo = smf.ols("helados ~ temperatura", data=df).fit()
12
13# El coeficiente de temperatura: el efecto estimado
14print("Pendiente (helados por grado):", round(modelo.params["temperatura"], 2))
15print("Origen (helados a 0 grados):", round(modelo.params["Intercept"], 2))

Ajustar la recta con la API de fórmulas de statsmodels

## El intervalo de confianza del coeficiente: la incertidumbre honesta

Aquí está el salto que distingue trazar una línea de hacer inferencia. El coeficiente que acabas de calcular (digamos 6,5) no es LA verdad: es tu mejor estimación a partir de los datos que tienes. Si hubieras recogido otros días distintos, habrías obtenido un número algo diferente. El intervalo de confianza del coeficiente te dice entre qué dos valores está, razonablemente, el efecto real. Si statsmodels te dice que el intervalo al 95% es [5,45, 6,34], la lectura es: "mi mejor estimación del efecto es 5,89 helados por grado, y con un 95% de confianza el efecto real está entre 5,45 y 6,34".

Esto conecta directamente con lo que ya sabes de intervalos: el 95% es una propiedad del método, no una probabilidad sobre este intervalo concreto. Pero la consecuencia práctica es la que importa. Un intervalo estrecho ([5,45, 6,34]) dice que sabes bastante bien cuánto vale el efecto. Un intervalo ancho que fuera, por ejemplo, [1,0, 12,0], diría que el efecto podría ser pequeño o enorme: tienes una pendiente, sí, pero no te fíes de su valor exacto para tomar decisiones finas.

¿De dónde sale ese ancho? De dos cosas que ya conoces de cuando hablabas de intervalos, y que aquí reaparecen. La primera es cuántos datos tienes: con más días recogidos, el intervalo se estrecha, porque el modelo tiene más información para afinar la pendiente. La segunda es cuánto se dispersan los puntos alrededor de la recta: si los días caen muy pegados a la línea, el modelo está muy seguro de su pendiente y el intervalo es estrecho; si los puntos forman una nube gorda y desordenada, la pendiente podría ser bastante distinta y el intervalo se ensancha. Más datos y menos ruido, intervalo más estrecho; pocos datos y mucho ruido, intervalo ancho. La misma lógica de siempre, ahora aplicada a un coeficiente.

La consecuencia para tu trabajo es directa y vale la pena interiorizarla: nunca presentes un coeficiente solo. "El efecto es de 5,89 helados por grado" es una media verdad; "el efecto es de 5,89, entre 5,45 y 6,34 con un 95% de confianza" es la verdad entera. La diferencia no es pedantería: quien recibe el número necesita saber si puede fiarse de él para decidir. Un coeficiente de 5,89 con un intervalo de [5,45, 6,34] sostiene una decisión; el mismo 5,89 con un intervalo de [0,5, 11,3] no sostiene nada, aunque el número central sea idéntico. El intervalo es la parte del mensaje que dice cuánto apostar.

1import pandas as pd
2import statsmodels.formula.api as smf
3
4df = pd.DataFrame({
5 "temperatura": [12, 15, 18, 21, 24, 27, 30, 33, 36],
6 "helados": [128, 150, 165, 190, 205, 240, 255, 272, 295],
7})
8modelo = smf.ols("helados ~ temperatura", data=df).fit()
9
10# conf_int() devuelve el intervalo al 95% de CADA coeficiente
11ic = modelo.conf_int().loc["temperatura"]
12print(f"Efecto estimado: {modelo.params['temperatura']:.2f} helados por grado")
13print(f"IC 95%: [{ic[0]:.2f}, {ic[1]:.2f}]")

El intervalo de confianza del coeficiente, de serie

## El p-valor: ¿distingo este efecto del cero?

Hay una pregunta previa a "cuánto vale el efecto", y es "¿hay efecto, o lo que veo es ruido?". El p-valor del coeficiente responde a eso, y lo entiendes con lo que ya sabes. La hipótesis nula aquí es "el efecto real es cero" (la temperatura no influye en las ventas, y la pendiente que veo es casualidad del muestreo). El p-valor es la probabilidad de ver una pendiente al menos tan grande como la tuya si en realidad el efecto fuera cero. Un p-valor pequeño (por convención, por debajo de 0,05) dice: "sería muy raro ver esta pendiente por puro azar, así que me cuesta creer que el efecto sea cero".

Hay un atajo visual que te ahorra mirar el p-valor en la mayoría de los casos: mira si el intervalo de confianza del coeficiente contiene el cero. Si el intervalo es [5,45, 6,34], no contiene el cero por ningún lado, así que el efecto es claramente distinguible de cero (y el p-valor será minúsculo). Si el intervalo fuera [-1,2, 3,4], SÍ contiene el cero: no puedes descartar que el efecto real sea nulo, y el p-valor será mayor que 0,05. El intervalo y el p-valor cuentan la misma historia desde dos ángulos; con tener claro uno, tienes el otro.

La razón de que coincidan es bonita y vale la pena verla. El p-valor pregunta "¿sería raro ver esta pendiente si el efecto real fuera cero?". El intervalo pregunta "¿entre qué valores está, razonablemente, el efecto real?". Si el intervalo no incluye el cero, es que el cero NO es un valor razonable para el efecto, lo que es otra forma de decir que sería raro que el efecto fuera cero. Son la misma afirmación girada. Por eso en la práctica miras el intervalo (que además te dice el tamaño del efecto) y usas el p-valor como confirmación rápida, no al revés. El intervalo es más informativo porque te da el "cuánto" además del "sí o no".

Si el intervalo del coeficiente no toca el cero, el efecto es distinguible del ruido

No confundas "distinguible del cero" con "importante". Un p-valor pequeño solo dice que el efecto no es cero; no dice que sea grande ni que importe en el negocio. Con muchísimos datos, un efecto ridículo (medio helado por cada diez grados) puede salir con un p-valor minúsculo y ser irrelevante para cualquier decisión. Mira siempre el VALOR del coeficiente y su intervalo, no solo si el p-valor baja del umbral. La significancia estadística y la importancia práctica son dos preguntas distintas.

Cada punto de la recta tiene su incertidumbre: la banda muestra entre dónde está, con un 95% de confianza

## Leer el summary completo, sin memorizarlo

statsmodels tiene un método, .summary(), que vuelca una tabla llena de números. A primera vista intimida. No hace falta memorizarla: hace falta saber dónde mirar. Son cuatro sitios, y ya conoces los tres primeros.

1import pandas as pd
2import statsmodels.formula.api as smf
3
4df = pd.DataFrame({
5 "temperatura": [12, 15, 18, 21, 24, 27, 30, 33, 36],
6 "helados": [128, 150, 165, 190, 205, 240, 255, 272, 295],
7})
8modelo = smf.ols("helados ~ temperatura", data=df).fit()
9
10print(modelo.summary())

El summary completo: parece mucho, pero solo miras cuatro cosas

## El R² : cuánto explica el modelo, y por qué no es la nota

El R² (erre cuadrado) mide qué fracción de la variación del resultado consigue explicar el modelo. Va de 0 a 1. Un R² de 0,90 significa que la temperatura explica el 90% de por qué unos días vendes más helados que otros; el 10% restante es otras cosas (una ola de calor puntual, un festivo, el azar). Es un número útil, pero cuidado con tratarlo como la nota del modelo, porque en el oficio de explicar no lo es. Un modelo con un R² modesto puede tener un coeficiente clarísimo y valiosísimo: que la temperatura explique "solo" el 40% de las ventas no quita que sepas con precisión cuántos helados más vendes por grado.

Consejo de senior: cuando presentes una regresión para explicar algo, lidera con el coeficiente y su intervalo, no con el R². "Por cada euro que subimos el precio, perdemos de media 18 ventas, entre 16 y 20 con un 95% de confianza" es una frase que mueve una decisión. "El modelo tiene un R² de 0,73" no le dice nada a quien tiene que decidir el precio. El R² es para ti, para saber cuánto queda sin explicar; el coeficiente y su intervalo son para la reunión.

Hay un malentendido muy extendido sobre el R² que conviene cortar de raíz: la idea de que un R² bajo significa un modelo malo. No es verdad en el oficio de explicar. Imagina que estudias qué influye en la felicidad de las personas, y encuentras que tener más ingresos la aumenta de forma clara, con un coeficiente estable y significativo, pero el R² es solo 0,15. Ese 0,15 no es un fracaso: es la honesta constatación de que la felicidad depende de muchísimas cosas más que el dinero, y tú solo mediste una. El coeficiente del dinero puede ser valiosísimo y perfectamente creíble aunque explique una fracción pequeña del total. En problemas humanos, un R² bajo es lo normal, no la excepción.

El R² sube siempre que añades variables, aunque sean basura. Si metes en el modelo el número de calzado de la gente para explicar sus ventas, el R² subirá un poquito solo por azar, nunca baja al añadir cosas. Por eso no se puede usar el R² para decidir si una variable merece estar en el modelo: elegiría meterlas todas. Para eso están el coeficiente de esa variable y su significancia, que sí te dicen si aporta algo de verdad. Un R² más alto conseguido metiendo variables sin sentido es un R² inflado, no un modelo mejor.

## Qué significa el origen, y por qué casi nunca lo mires

En el summary también aparece el origen (el intercept): cuánto vale el resultado cuando la variable explicativa es cero. En el ejemplo de los helados, sería cuántos helados venderías a cero grados. Es un número que el modelo necesita para colocar la recta a la altura correcta, pero que casi nunca tiene un significado útil, por una razón sencilla: muchas veces el cero cae fuera del rango de tus datos o no tiene sentido físico. Nunca has tenido un día a cero grados en tu heladería, así que lo que el modelo "predice" ahí es una extrapolación sin respaldo. Mira el origen para dibujar la recta, pero no lo interpretes como si fuera un dato del negocio: el protagonista es siempre la pendiente.

Hay un truco que a veces se usa para que el origen signifique algo: centrar la variable, es decir, restarle su media para que el cero caiga en el centro de los datos en vez de en un punto que no existe. Entonces el origen pasa a ser "el resultado para un caso promedio", que sí es interpretable. No necesitas hacerlo todavía, pero conviene que sepas que el origen que te da el modelo depende de dónde esté el cero de tus variables, y que ese cero a veces se puede mover para que el número tenga sentido. Por ahora, quédate con la regla práctica: la pendiente es la respuesta, el origen es fontanería.

## Un apunte sobre causalidad, para no pasarse de frenada

Un coeficiente te dice cómo se mueven juntas dos variables en tus datos, no necesariamente que una cause la otra. Ya sabes que una tercera variable puede estar moviendo a las dos a la vez. La regresión, por sí sola, no resuelve eso: te da el efecto asociado, y si quieres leerlo como un efecto causal necesitas que el diseño del estudio te lo permita (un experimento, o controlar los confusores que conoces metiéndolos en el modelo). Por ahora quédate con la lectura prudente: "en estos datos, a más temperatura, más ventas, y el efecto asociado es de 6,5 helados por grado". Si además tienes razones para creer que la temperatura causa las ventas (y en una heladería, las tienes), puedes dar el paso causal con la cabeza fría. Pero el paso lo das tú con tu conocimiento del problema, no el coeficiente por ti.

Ya sabes ajustar una recta y leerla como lo que es: un efecto con su incertidumbre. Pero hay una trampa que espera a todo el que empieza a meter más de una variable en el modelo, y es desconcertante: los coeficientes se vuelven locos, cambian de signo, se disparan. No es un error de cálculo. Es lo siguiente que tienes que aprender a reconocer, porque un coeficiente inestable es inservible por muy bueno que parezca el modelo.

Regístrate para guardar tu progreso.