Regressão Múltipla em Python

Shivam Arora 10 outubro 2023
  1. Use o módulo statsmodel.api para realizar regressão linear múltipla em Python
  2. Use o numpy.linalg.lstsq para realizar a regressão linear múltipla em Python
  3. Use o método scipy.curve_fit() para realizar regressão linear múltipla em Python
Regressão Múltipla em Python

Este tutorial discutirá a regressão linear múltipla e como implementá-la em Python.

A regressão linear múltipla é um modelo que calcula a relação entre duas ou mais de duas variáveis ​​e uma única variável de resposta ajustando uma equação de regressão linear entre elas. Ajuda a estimar a dependência ou a mudança entre as variáveis ​​dependentes para a mudança nas variáveis ​​independentes. Na regressão linear múltipla padrão, todas as variáveis ​​independentes são consideradas simultaneamente.

Use o módulo statsmodel.api para realizar regressão linear múltipla em Python

O módulo statsmodel.api em Python está equipado com funções para implementar regressão linear. Usaremos a função OLS(), que realiza a regressão de mínimos quadrados ordinária.

Podemos importar um conjunto de dados usando o módulo pandas ou criar nossos próprios dados fictícios para realizar a regressão múltipla. Nós bifurcamos as variáveis ​​dependentes e independentes para aplicar o modelo de regressão linear entre essas variáveis.

Criamos um modelo de regressão usando a função OLS(). Em seguida, passamos as variáveis ​​independentes e dependentes nesta função e ajustamos este modelo usando a função fit(). Em nosso exemplo, criamos alguns arrays para demonstrar a regressão múltipla.

Veja o código abaixo.

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())

Resultado:

 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
==============================================================================

A função summary() permite-nos imprimir os resultados e coeficientes da regressão. O R-Squared e o Adjusted R-Squared falam-nos sobre a eficiência da regressão.

Use o numpy.linalg.lstsq para realizar a regressão linear múltipla em Python

O método numpy.linalg.lstsq retorna a solução de mínimos quadrados para uma equação fornecida resolvendo a equação como Ax=B calculando o vetor x para minimizar o ||B-Ax|| normal.

Podemos usá-lo para realizar a regressão múltipla, conforme mostrado abaixo.

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)

Resultado:

[ 0.1338682   0.26840334 -0.02874936  1.5122571 ]

Podemos comparar os coeficientes de cada variável com o método anterior e notar que o resultado é o mesmo. Aqui, o resultado final está em um array NumPy.

Use o método scipy.curve_fit() para realizar regressão linear múltipla em Python

Este modelo usa uma função que é usada posteriormente para calcular um modelo para alguns valores, e o resultado é usado com mínimos quadrados não lineares para ajustar essa função aos dados fornecidos.

Veja o código abaixo.

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)

Resultado:

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