REGRESION LINEAL SIMPLE CON
PYTHON
BRIAN LOPEZ GONZALEZ
17 DE MAYO DE 2023
Contenido
Introducción.............................................................................................................1
Conceptos fundamentales......................................................................................2
Regresión lineal simple...............................................................................................................2
Significado "lineal".......................................................................................................................4
Regresión lineal en Python.....................................................................................5
Referencias..................................................................¡Error! Marcador no definido.
Introducción
La regresión lineal es un método estadístico que trata de modelar la relación entre
una variable continua y una o más variables independientes mediante el ajuste de
una ecuación lineal. Se llama regresión lineal simple cuando solo hay una variable
independiente y regresión lineal múltiple cuando hay más de una. Dependiendo
del contexto, a la variable modelada se le conoce como variable dependiente o
variable respuesta, y a las variables independientes como regresores, predictores
o features.
A lo largo de este documento, se describen de forma progresiva los fundamentos
teóricos de la regresión lineal, los principales aspectos prácticos a tener en cuenta
y ejemplos de cómo crear este tipo de modelos en Python
1|Página
Conceptos fundamentales
Primero que nada, demos un repaso por los conceptos fundamentales para
el entendimiento del programa y su funcionamiento, principalmente los
fundamentos matemáticos del análisis mediante Regresión Lineal Simple.
Regresión lineal simple
El objetivo de un modelo de regresión es tratar de explicar la relación que
existe entre una variable dependiente (variable respuesta) Y un conjunto de
variables independientes (variables explicativas) X 1 , ... , X n.
En un modelo de regresión lineal simple tratamos de explicar la relación que existe
entre la variable respuesta Y y una única variable explicativa X.
Mediante las técnicas de regresión de una variable Y sobre una variable X,
buscamos una función que sea una buena aproximación de una nube de puntos (
x i , y i ), mediante una curva del tipo:
2|Página
Los principales elementos que hay que interpretar en un modelo de regresión
lineal son los coeficientes de los predictores:
β 0 es la ordenada en el origen o intercept, se corresponde con el valor
esperado de la variable respuesta y cuando todos los predictores son cero.
β j los coeficientes de regresión parcial de cada predictor indican el cambio
promedio esperado de la variable respuesta y al incrementar en una unidad
de la variable predictora x j , manteniéndose constantes el resto de variables.
La magnitud de cada coeficiente parcial de regresión depende de las unidades en
las que se mida la variable predictora a la que corresponde, por lo que su
magnitud no está asociada con la importancia de cada predictor.
Para poder determinar qué impacto tienen en el modelo cada una de las variables,
se emplean los coeficientes parciales estandarizados, que se obtienen al
estandarizar (sustraer la media y dividir entre la desviación estándar) las variables
predictoras previo ajuste del modelo. En este caso, β 0 se corresponde con el valor
esperado de la variable respuesta cuando todos los predictores se encuentran en
su valor promedio, y β j el cambio promedio esperado de la variable respuesta al
incrementar en una desviación estándar la variable predictora x j , manteniéndose
constantes el resto de variables.
Si bien los coeficientes de regresión suelen ser el primer objetivo de la
interpretación de un modelo lineal, existen muchos otros aspectos (significancia
del modelo en su conjunto, significancia de los predictores, condición de
normalidad...). Estos últimos suelen ser tratados con poca detalle cuando el único
3|Página
objetivo del modelo es realizar predicciones, sin embargo, son muy relevantes si
se quiere realizar inferencia, es decir, explicar las relaciones entre los predictores
y la variable respuesta. A lo largo de este documento se irán introduciendo cada
uno de ellos.
Significado "lineal"
El término "lineal" en los modelos de regresión hace referencia al hecho de
que los parámetros se incorporan en la ecuación de forma lineal, no a que
necesariamente la relación entre cada predictor y la variable respuesta tenga que
seguir un patrón lineal.
La siguiente ecuación muestra un modelo lineal en el que el predictor x 1 no es
lineal respecto a y :
y=β 0 + β 1 x 1 + β 2 log ( x 1 ) +∈
En contraposición, el siguiente no es un modelo lineal:
b2
y=β 0 + β 1 x 1 + ϵ
4|Página
En ocasiones, algunas relaciones no lineales pueden transformarse de forma que
se pueden expresar de manera lineal:
β1
y=β 0 x 1 ϵ
log ( y )=log ( β 0) + β1 log ( x 1 ) +log ( ϵ )
Regresión lineal en Python
Dos de las implementaciones de modelos de regresión lineal más utilizadas
en Python son: scikit-learn y statsmodels. Aunque ambas están muy optimizadas,
Scikit-learn está orientada principalmente a la predicción, por lo que no dispone de
apenas funcionalidades que muestren las muchas características del modelo que
se deben analizar para hacer inferencia. Statsmodels es mucho más completo en
este sentido.
A continuación, presentamos el código:
from math import sqrt as sqrt
import matplotlib.pyplot as plt
class RLS:
def __init__(self,x_ingreso,y_ingreso):
self.x = x_ingreso
self.y = y_ingreso
self.n = len(x_ingreso)
5|Página
if (len(x_ingreso)==len(y_ingreso)):
print("Numero de datos coincidentes...")
print("Variables definidas...")
else:
print("Datos incoincidentes.")
self.x_media = sum(x_ingreso)/self.n
self.y_media = sum(y_ingreso)/self.n
self.sumatoria_xy = RLS.sumatoria(x_ingreso, y_ingreso)
self.sumatoria_x_cuadrada = RLS.sumatoria_cuadrada(x_ingreso)
self.vector_y = []
self.b_0 = 0
self.b_1 = 0
self.SSE = 0
self.SST = 0
self.SSR = 0
self.coef_det = 0
self.var = 0
self.desv_est = 0
6|Página
self.coef_corr_muest = 0.0
self.MSE = 0.0
self.Eror_estandar_estimado = 0.0
def resolver(self):
self.b_1 = RLS.fb_1(self)
self.b_0 = RLS.fb_0(self)
for i in range(0,len(self.x)):
self.vector_y.append(RLS.funcion(self, self.x[i]))
self.SSE = RLS.fSSE(self)
self.SST = RLS.fSST(self)
self.SSR = RLS.fSSR(self)
self.coef_det = RLS.fcoef_det(self)
self.var = RLS.varianza(self)
self.desv_est = RLS.desviacion_estandar(self)
self.coef_corr_muest = RLS.coef_corr_muest(self)
self.MSE = RLS.fMSE(self)
self.Error_estandar_estimado = RLS.fError_estandar_estimado(self)
7|Página
def sumatoria(sum1,sum2):
suma = 0.0
for i in range(0,len(sum1)):
suma += sum1[i]*sum2[i]
return suma
def sumatoria_cuadrada(sum_cuad):
suma = 0
for i in range(0, len(sum_cuad)):
suma += sum_cuad[i]**2
return suma
def fb_1(self):
res = (self.sumatoria_xy
-((sum(self.x)*sum(self.y))/self.n))/(self.sumatoria_x_cuadrada-
(sum(self.x)**2/self.n))
return res
def fb_0(self):
res = self.y_media - (self.b_1*self.x_media)
return res
8|Página
def funcion(self, x_i):
y_estimada = 0
y_estimada = self.b_0 + self.b_1*x_i
return y_estimada
def estimar_y(self):
pass
"""def estimacion():
for i in range(0,len(RLS.x)):
RLS.vector_y.append(RLS.funcion(RLS.x[i]))"""
def fSSE(self):
res = 0
for i in range(0,len(self.x)):
res += (self.y[i]-self.vector_y[i])**2
return res
def fSST(self):
res = 0
for i in range(0,self.n):
res += (self.y[i] - self.y_media)**2
9|Página
return res
def fSSR(self):
res = 0
for i in range(0,len(self.x)):
res += (self.vector_y[i]- self.y_media)**2
return res
def fcoef_det(self):
res = 0
res = self.SSR/self.SST
return res
def coef_corr_muest(self):
res = 0.0
res = sqrt(self.coef_det)
if self.b_1 > 0:
return res
else:
return res*-1
def varianza(self):
10 | P á g i n a
res = 0
aux = 0
for i in range(0,len(self.x)):
aux += (self.x[i] - self.x_media)**2
res = aux/(self.n-1)
return res
def desviacion_estandar(self):
res = 0
res = sqrt(self.var)
return res
def fMSE(self):
res = self.SSE/(self.n - 2)
return res
def fError_estandar_estimado(self):
res = sqrt(self.MSE)
return res
def valor_z(self):
11 | P á g i n a
pass
def impresion(self):
print("Ecuacion de Regresion: y = ",self.b_0," + ",self.b_1,"x")
print("N: ",self.n)
print("Media de x: ",self.x_media)
print("Media de y: ",self.y_media)
print("Sumatoria xy: ",self.sumatoria_xy)
print("Sumatoria x^2: ",self.sumatoria_x_cuadrada)
print("Suma de x: ",sum(self.x))
print("Suma de y: ",sum(self.y))
print("b_1: ",self.b_1)
print("b_0: ",self.b_0)
print("SSE: ",self.SSE)
print("SST: ",self.SST)
print("SSR: ",self.SSR)
print("Coeficiente de determinacion r^2: ",self.coef_det)
12 | P á g i n a
print("Varianza: ",self.var)
print("Desviacion estandar: ",self.desv_est)
print("Coeficiente de correlacion de la muestra: ",self.coef_corr_muest)
print("Error cuadrado medio: ", self.MSE)
print("Error estandar del estimado: ",self.Error_estandar_estimado)
def proyeccion(self):
ax = plt.axes()
plt.plot(self.x,self.vector_y, "-",color="red")
plt.scatter(self.x,self.y)
def modeloCompleto(self):
#RLS.definir()
RLS.resolver(self)
RLS.impresion(self)
RLS.proyeccion(self)
Como Podemos observer todo el programa se encuentra contenido en la clase
llamada RLS, esta recibe 2 listas de datos llamadas “x_ingreso” y “y_ingreso”, las
cuales corresponden a los datos a analizar.
13 | P á g i n a
Una vez ingresados los datos el método “__init__” se encarga de definir las
variables necesarias básicas para realizar el análisis, lo anterior realizando los
cálculos correspondientes según las fórmulas anteriormente presentadas.
En este punto ya tenemos un análisis inicial básico de los principales indicadores
del modelo y podríamos realizar inferencias bastante básicas.
A continuación, se observa un método llamado “resolver”, el cual se encarga de
realizar el siguiente nivel de cálculos utilizando las variables antes definidas, este
método nos devuelve los valores de la desviación estándar, coeficiente de
determinación, coeficientes de correlación y demás indicadores mas profundos a
cerca del modelo, con los cuales en principio ya se puede realizar un análisis más
completo del modelo.
Para poder realizar una interpretación más certera del resultado y así realizar un
análisis mas certero encontramos un método llamado “proyección”, el cual se
encarga de graficar los puntos muestrales y proyectar sobre la grafica la linea de
mejor ajuste calculada.
Adicional a esto encontramos el método impresión, el cual genera una salida en
pantalla con la grafica anterior y todos los parámetros del modelo ya resueltos de
manera numérica, una especie de resumen que nos ayuda a tener toda la
información de manera resumida y a la mano.
Veamos el programa en ejecución, para esto se ingresarán un conjunto de datos
pequeño con una relación y=2 x :
14 | P á g i n a
z = [1,2,3,4,5,6,7,8,9,10]
w = [2,4,6,8,10,12,14,16,18,20]
r1 = RLS(z,w)
Después hacemos uso del método “modelocompleto” el cual implementa los
métodos anteriormente mencionados y nos muestra el modelo completo, el cual
nos devuelve lo siguiente:
15 | P á g i n a
16 | P á g i n a
Como podemos observar el modelo se ajusta perfectamente a la relación
presentada ( y=2 x ), a demás nos devuelve la ecuación estimada, y los demás
parámetros, con lo cual podemos concluir que funciona de manera correcta, visto
con un ejemplo simple.
Viendo que los resultados son los esperables en el modelo que se presentó.
17 | P á g i n a
Conclusiones
En conclusión, este programa puede ser de ayuda a la hora de realizar
análisis empleando el método de regresión lineal, el cual es ampliamente utilizado
en el mundo del análisis de datos e inteligencia artificial, por mencionar algunas.
A demás podemos apreciar que el programa es intuitivo y fácil de utilizar y
entender, permitiendo que puedan realizarse adaptaciones y/o actualizaciones
para ajustarlo a las necesidades de la tarea que quiera realizarse.
18 | P á g i n a
CAMPUS TLÁHUAC 2