Regressione multipla in Python

Shivam Arora 30 gennaio 2023
  1. Usa il modulo statsmodel.api per eseguire regressioni lineari multiple in Python
  2. Usa numpy.linalg.lstsq per eseguire regressioni lineari multiple in Python
  3. Usa il metodo scipy.curve_fit() per eseguire regressioni lineari multiple in Python
Regressione multipla in Python

Questo tutorial discuterà la regressione lineare multipla e come implementarla in Python.

La regressione lineare multipla è un modello che calcola la relazione tra due o più di due variabili e una singola variabile di risposta inserendo un’equazione di regressione lineare tra di esse. Aiuta a stimare la dipendenza o il cambiamento tra variabili dipendenti rispetto al cambiamento nelle variabili indipendenti. Nella regressione lineare multipla standard, tutte le variabili indipendenti vengono prese in considerazione contemporaneamente.

Usa il modulo statsmodel.api per eseguire regressioni lineari multiple in Python

Il modulo statsmodel.api in Python è dotato di funzioni per implementare la regressione lineare. Useremo la funzione OLS(), che esegue la normale regressione dei minimi quadrati.

Possiamo importare un set di dati utilizzando il modulo pandas o creare i nostri dati fittizi per eseguire regressioni multiple. Dividiamo le variabili dipendenti e indipendenti per applicare il modello di regressione lineare tra quelle variabili.

Creiamo un modello di regressione utilizzando la funzione OLS(). Quindi, passiamo le variabili indipendenti e dipendenti in questa funzione e adattiamo questo modello usando la funzione fit(). Nel nostro esempio, abbiamo creato alcuni array per dimostrare la regressione multipla.

Vedi il codice qui sotto.

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

Produzione:

 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 funzione summary() ci permette di stampare i risultati ei coefficienti della regressione. L’R-Squared e l’Adjusted R-Squared ci parlano dell’efficienza della regressione.

Usa numpy.linalg.lstsq per eseguire regressioni lineari multiple in Python

Il metodo numpy.linalg.lstsq restituisce la soluzione dei minimi quadrati a un’equazione fornita risolvendo l’equazione come Ax=B calcolando il vettore x per minimizzare il normale ||B-Ax||.

Possiamo usarlo per eseguire regressioni multiple come mostrato di seguito.

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)

Produzione:

[ 0.1338682   0.26840334 -0.02874936  1.5122571 ]

Possiamo confrontare i coefficienti per ogni variabile con il metodo precedente e notare che il risultato è lo stesso. Qui il risultato finale è in un array NumPy.

Usa il metodo scipy.curve_fit() per eseguire regressioni lineari multiple in Python

Questo modello utilizza una funzione che viene ulteriormente utilizzata per calcolare un modello per alcuni valori e il risultato viene utilizzato con minimi quadrati non lineari per adattare questa funzione ai dati forniti.

Vedi il codice qui sotto.

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)

Produzione:

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