Regresión múltiple en Python

Shivam Arora 10 octubre 2023
  1. Utilice el módulo statsmodel.api para realizar regresiones lineales múltiples en Python
  2. Utilice numpy.linalg.lstsq para realizar una regresión lineal múltiple en Python
  3. Utilice el método scipy.curve_fit() para realizar una regresión lineal múltiple en Python
Regresión múltiple en Python

Este tutorial discutirá la regresión lineal múltiple y cómo implementarla en Python.

La regresión lineal múltiple es un modelo que calcula la relación entre dos o más de dos variables y una única variable de respuesta ajustando una ecuación de regresión lineal entre ellas. Ayuda a estimar la dependencia o el cambio entre variables dependientes al cambio en las variables independientes. En la regresión lineal múltiple estándar, todas las variables independientes se tienen en cuenta simultáneamente.

Utilice el módulo statsmodel.api para realizar regresiones lineales múltiples en Python

El módulo statsmodel.api en Python está equipado con funciones para implementar la regresión lineal. Usaremos la función OLS(), que realiza una regresión de mínimos cuadrados ordinarios.

Podemos importar un conjunto de datos usando el módulo pandas o crear nuestros propios datos ficticios para realizar regresiones múltiples. Bifurcamos las variables dependientes e independientes para aplicar el modelo de regresión lineal entre esas variables.

Creamos un modelo de regresión usando la función OLS(). Luego, pasamos las variables independientes y dependientes en esta función y ajustamos este modelo usando la función fit(). En nuestro ejemplo, hemos creado algunas matrices para demostrar la regresión múltiple.

Vea el código a continuación.

import statsmodels.api as sm
import numpy as np

y = [1, 2, 3, 4, 3, 4, 5, 3, 5, 5, 4, 5, 4, 5, 4, 5, 6, 0, 6, 3, 1, 3, 1]
X = [
    [0, 2, 4, 1, 5, 4, 5, 9, 9, 9, 3, 7, 8, 8, 6, 6, 5, 5, 5, 6, 6, 5, 5],
    [4, 1, 2, 3, 4, 5, 6, 7, 5, 8, 7, 8, 7, 8, 7, 8, 6, 8, 9, 2, 1, 5, 6],
    [4, 1, 2, 5, 6, 7, 8, 9, 7, 8, 7, 8, 7, 4, 3, 1, 2, 3, 4, 1, 3, 9, 7],
]


def reg_m(y, x):
    ones = np.ones(len(x[0]))
    X = sm.add_constant(np.column_stack((x[0], ones)))
    for ele in x[1:]:
        X = sm.add_constant(np.column_stack((ele, X)))
    results = sm.OLS(y, X).fit()
    return results


print(reg_m(y, x).summary())

Producción :

 OLS Regression Results                            
==============================================================================
Dep. Variable:                      y   R-squared:                       0.241
Model:                            OLS   Adj. R-squared:                  0.121
Method:                 Least Squares   F-statistic:                     2.007
Date:                Wed, 16 Jun 2021   Prob (F-statistic):              0.147
Time:                        23:57:15   Log-Likelihood:                -40.810
No. Observations:                  23   AIC:                             89.62
Df Residuals:                      19   BIC:                             94.16
Df Model:                           3                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
x1            -0.0287      0.135     -0.213      0.834      -0.311       0.254
x2             0.2684      0.160      1.678      0.110      -0.066       0.603
x3             0.1339      0.160      0.839      0.412      -0.200       0.468
const          1.5123      0.986      1.534      0.142      -0.551       3.576
==============================================================================
Omnibus:                        9.472   Durbin-Watson:                   2.447
Prob(Omnibus):                  0.009   Jarque-Bera (JB):                7.246
Skew:                          -1.153   Prob(JB):                       0.0267
Kurtosis:                       4.497   Cond. No.                         29.7
==============================================================================

La función summary() nos permite imprimir los resultados y coeficientes de la regresión. El R-Squared y el Adjusted R-Squared nos informan sobre la eficiencia de la regresión.

Utilice numpy.linalg.lstsq para realizar una regresión lineal múltiple en Python

El método numpy.linalg.lstsq devuelve la solución de mínimos cuadrados a una ecuación proporcionada al resolver la ecuación como Ax=B calculando el vector x para minimizar el ||B-Ax|| normal.

Podemos usarlo para realizar regresiones múltiples como se muestra a continuación.

import numpy as np

y = [1, 2, 3, 4, 3, 4, 5, 3, 5, 5, 4, 5, 4, 5, 4, 5, 6, 0, 6, 3, 1, 3, 1]
X = [
    [0, 2, 4, 1, 5, 4, 5, 9, 9, 9, 3, 7, 8, 8, 6, 6, 5, 5, 5, 6, 6, 5, 5],
    [4, 1, 2, 3, 4, 5, 6, 7, 5, 8, 7, 8, 7, 8, 7, 8, 6, 8, 9, 2, 1, 5, 6],
    [4, 1, 2, 5, 6, 7, 8, 9, 7, 8, 7, 8, 7, 4, 3, 1, 2, 3, 4, 1, 3, 9, 7],
]
X = np.transpose(X)  # transpose so input vectors
X = np.c_[X, np.ones(X.shape[0])]  # add bias term
linreg = np.linalg.lstsq(X, y, rcond=None)[0]
print(linreg)

Producción :

[ 0.1338682   0.26840334 -0.02874936  1.5122571 ]

Podemos comparar los coeficientes de cada variable con el método anterior y notar que el resultado es el mismo. Aquí el resultado final está en un array NumPy.

Utilice el método scipy.curve_fit() para realizar una regresión lineal múltiple en Python

Este modelo usa una función que se usa además para calcular un modelo para algunos valores, y el resultado se usa con mínimos cuadrados no lineales para ajustar esta función a los datos dados.

Vea el código a continuación.

from scipy.optimize import curve_fit
import scipy
import numpy as np


def function_calc(x, a, b, c):
    return a + b * x[0] + c * x[1]


y = [1, 2, 3, 4, 3, 4, 5, 3, 5, 5, 4, 5, 4, 5, 4, 5, 6, 0, 6, 3, 1, 3, 1]
X = [
    [0, 2, 4, 1, 5, 4, 5, 9, 9, 9, 3, 7, 8, 8, 6, 6, 5, 5, 5, 6, 6, 5, 5],
    [4, 1, 2, 3, 4, 5, 6, 7, 5, 8, 7, 8, 7, 8, 7, 8, 6, 8, 9, 2, 1, 5, 6],
    [4, 1, 2, 5, 6, 7, 8, 9, 7, 8, 7, 8, 7, 4, 3, 1, 2, 3, 4, 1, 3, 9, 7],
]

popt, pcov = curve_fit(function_calc, x, y)
print(popt)
print(pcov)

Producción :

[1.44920591 0.12720273 0.26001833]
[[ 0.84226681 -0.06637804 -0.06977243]
 [-0.06637804  0.02333829 -0.01058201]
 [-0.06977243 -0.01058201  0.02288467]]

Artículo relacionado - Python Regression