Mínimos cuadrados ordinarios (OLS) usando statsmodels

En este artículo, utilizaremos el módulo statsmodels de Python para implementar el método de regresión lineal de mínimos cuadrados ordinarios ( OLS ).
Introducción: 
Un modelo de regresión lineal establece la relación entre una variable dependiente ( y ) y al menos una variable independiente ( x ) como: 
\hat{y}=b_1x+b_0
En el método OLS , tenemos que elegir los valores de  b_1  b_0  tal que, la suma total de los cuadrados de la diferencia entre los valores calculados y observados de y, se minimiza. 
Fórmula para OLS:
S=\sum\limits_{i=1}^n (y_i - \hat{y_i})^2 = \sum\limits_{i=1}^n (y_i - b_1x_1 - b_0)^2 = \sum\limits_{i=1}^n (\hat{\epsilon_i})^2 = min
Donde, 
\hat{y_i}  = valor pronosticado para la i-ésima observación 
y_i  = valor real para la i-ésima observación 
\epsilon_i  = error/residual para la i-ésima observación 
n = número total de observaciones
Para obtener los valores de  b_0  b_1  que minimizan S, podemos tomar una derivada parcial para cada coeficiente e igualarlo a cero.
Módulos utilizados: 
 

  • statsmodels : proporciona clases y funciones para la estimación de muchos modelos estadísticos diferentes. 
     
pip install statsmodels
  •  
  • pandas: biblioteca utilizada para la manipulación y el análisis de datos. 
     
 
  •  
  • NumPy: biblioteca central para computación de arreglos. 
     
 
  •  
  • Matplotlib: una biblioteca completa utilizada para crear visualizaciones y gráficos estáticos e interactivos. 
     
 
  •  

Acercarse :
 

  • Primero definimos las variables x e y . En el siguiente ejemplo, las variables se leen desde un archivo csv usando pandas . El archivo utilizado en el ejemplo se puede descargar aquí
     
  • Luego, necesitamos agregar la constante  b_0  a la ecuación usando el método add_constant() .
  • La función OLS() del módulo statsmodels.api se usa para realizar la regresión OLS. Devuelve un objeto OLS. Luego se llama al método fit() en este objeto para ajustar la línea de regresión a los datos.
  • El método summary() se utiliza para obtener una tabla que ofrece una descripción detallada de los resultados de la regresión.

Sintaxis: statsmodels.api.OLS(y, x) 
Parámetros: 
 

  • y : la variable que depende de x
  • x : la variable independiente

 

Código: 
 

Python3

import statsmodels.api as sm
import pandas as pd
 
# reading data from the csv
data = pd.read_csv('train.csv')
 
# defining the variables
x = data['x'].tolist()
y = data['y'].tolist()
 
# adding the constant term
x = sm.add_constant(x)
 
# performing the regression
# and fitting the model
result = sm.OLS(y, x).fit()
 
# printing the summary table
print(result.summary())

Producción : 
 

                            OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.989
Model:                            OLS   Adj. R-squared:                  0.989
Method:                 Least Squares   F-statistic:                 2.709e+04
Date:                Fri, 26 Jun 2020   Prob (F-statistic):          1.33e-294
Time:                        15:55:38   Log-Likelihood:                -757.98
No. Observations:                 300   AIC:                             1520.
Df Residuals:                     298   BIC:                             1527.
Df Model:                           1                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const         -0.4618      0.360     -1.284      0.200      -1.169       0.246
x1             1.0143      0.006    164.598      0.000       1.002       1.026
==============================================================================
Omnibus:                        1.034   Durbin-Watson:                   2.006
Prob(Omnibus):                  0.596   Jarque-Bera (JB):                0.825
Skew:                           0.117   Prob(JB):                        0.662
Kurtosis:                       3.104   Cond. No.                         120.
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.

Descripción de algunos de los términos de la tabla: 
 

  • R-cuadrado : el coeficiente de determinación. Es la proporción de la varianza en la variable dependiente que es predecible/explicada
  • adj. R-cuadrado : R-cuadrado ajustado es la forma modificada de R-cuadrado ajustado por el número de variables independientes en el modelo. Valor de adj. R-squared aumenta cuando incluimos variables adicionales que realmente mejoran el modelo.
  • Estadístico F: la relación entre el error cuadrático medio del modelo y el error cuadrático medio de los residuos. Determina la importancia global del modelo.
  • coef : los coeficientes de las variables independientes y el término constante en la ecuación.
  • t : el valor de la estadística t. Es la relación de la diferencia entre el valor estimado e hipotético de un parámetro, al error estándar

Predicción de valores: 
De la tabla de resultados, anotamos el coeficiente de x y el término constante. Estos valores se sustituyen en la ecuación original y la línea de regresión se traza usando matplotlib
Código: 
 

Python3

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
 
# reading data from the csv
data = pd.read_csv('train.csv')
 
# plotting the original values
x = data['x'].tolist()
y = data['y'].tolist()
plt.scatter(x, y)
 
# finding the maximum and minimum
# values of x, to get the
# range of data
max_x = data['x'].max()
min_x = data['x'].min()
 
# range of values for plotting
# the regression line
x = np.arange(min_x, max_x, 1)
 
# the substituted equation
y = 1.0143 * x - 0.4618
 
# plotting the regression line
plt.plot(y, 'r')
plt.show()

Producción: 
 

Publicación traducida automáticamente

Artículo escrito por cosine1509 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *