La regresión lineal simple es un modelo matemático estadístico para aproximar la relación entre una variable dependiente Y con una variable independiente X. la fórmula se muestra a continuación:
Siendo β0 el corte en el eje Y y β1 la pendiente de la recta. Sin embargo, en muchos casos los modelos no se explican únicamente a través de una variable independiente, sino de múltiples factores que representan varias variables independientes. Por ejemplo, supongamos que queremos obtener un modelo que explique la relación que existe entre el número de habitantes de una zona de la ciudad (X1) y la superficie de una tienda de ropa (X2) con las ventas de dicha tienda (Y):
En este caso tendremos que hacer uso de la regresión lineal múltiple para abordar problemas de este tipo. Pero, te preguntarás. Si en la regresión lineal simple graficamos en un plano, ¿Como podríamos obtener la solución de un modelo con múltiples variables independientes? Para resolver esto debemos hacer uso de álgebra vectorial para obtener la solución de los parámetros β. Miremos este análisis antes de pasar al código:
Tenemos una serie de mediciones como las siguientes:
Para ver de manera matricial obtenemos lo siguiente:
Multiplicando X y β obtenemos lo siguiente:
y esta fórmula es muy similar a la de regresión lineal simple ¿verdad?
La matriz que nos interesa es β y su solución es la siguiente (recordemos que conocemos X y Y):
No profundizaremos en su demostración.
Nota: La matriz X tiene una columna de unos para compensar β0, este valor en ningún caso se multiplica con ninguna variable independiente.
Ya tenemos todo lo necesario para hacer nuestro programa en Python.
Probemos dos ejemplos, el primero va a ser el ejercicio que se vió en el curso de regresión lineal con Python y el segundo lo solucionaremos con el dataset que mostramos en la parte de arriba.
import numpy as np
defdeterminar_b(X, Y):# Llenamos una fila con 1's como en nuestro modelo
X = np.array([np.ones(len(X)), X]).T
# Devolvemos los datos en un arreglo# Usamos el arroba para realizar multiplicacion matricialreturn np.linalg.inv(X.T @ X) @ X.T @ Y
defmain():# Dataset
x = np.array([1,2,3,4,5])
y = np.array([2,3,5,6,5])
b = determinar_b(x, y)
for i in range (len(b)):
print("b{} = {:.3f}".format(i, b[i]))
if __name__ == "__main__":
main()
Al ejecutar el código obtenemos lo siguiente:
Que es el mismo resultado que se obtuvo en el curso
import numpy as np
defdeterminar_b(X, Y):# Llenamos una fila con 1's como en nuestro modelo
X = np.insert(X, 0, np.array((np.ones(len(X[0])))), 0).T
# Devolvemos los datos en un arreglo# Usamos el arroba para realizar multiplicacion matricialreturn np.linalg.inv(X.T @ X) @ X.T @ Y
defmain():# Dataset
x = np.array([[90, 105, 85, 92, 130, 80, 100],
[21, 26, 14, 10, 12, 10, 15]])
y = np.array([198, 219, 167, 167, 250, 150, 218])
b = determinar_b(x, y)
print("Parámetros b -> {}".format(len(b)))
for i in range (len(b)):
print("b{} = {:.3f}".format(i, b[i]))
if __name__ == "__main__":
main()
Al ejecutar el código obtenemos:
Si te das cuenta obtuvimos tres valores, esto sucede porque ahora tenemos dos variables independientes x1 y x2 (Habitantes y superficie). Obviamente esto es posible hacerlo con más variables independientes con el fin de modelar sistemas de regresión lineal múltiple más complejos
Ahora expliquemos dos cosas importantes del código:
return np.linalg.inv(X.T @ X) @ X.T @ Y
X = np.array([np.ones(len(X)), X]).T
Esta línea se usa cuando hay dos o más variables independiente
X = np.insert(X, 0, np.array((np.ones(len(X[0])))), 0).T