Ultima modifica:
Note: Per comprendere al meglio la guida è consigliabile una conoscenza semi-avanzata di Python, Matematica e Statistica.
il termine regressione viene utilizzato quando si tenta di trovare la relazione tra variabili. E’ ampiamente utilizzata in statistica per stimare i valori di variabili dipendenti (output, la variabile i cui valori sono da stimare) e variabili indipendenti (input, la variabile “di confronto”). In Machine Learning o apprendimento automatico tale relazione viene utilizzata per prevedere il risultato di eventi futuri. La Regressione Lineare utilizza la relazione tra i punti dati per tracciare una linea retta che attraversa il grafico.
La regressione lineare, un aspetto matematico:
Il grafico che si utilizza per la rappresentazione grafica dei dati è il Scatterplot
Dove i dati sono dati ordinati (in ordine crescente/decrescente) e vengono rappresentati da punti.
Abbiamo sull’asse X i dati della variabile dipendente e sull’asse Y i dati della var. Indipendente.
L’interpretazione del grafico è più o meno la seguente: (Grafico preso da RealPython)
In coding:
Andiamo più nel pratico:
Note: I presenti codici sono stati presi da W3School e non sono stati scritti da me.
**: Per la rappresentazione grafica dei dati su grafico utilizzo l’IDE Spyder
Creiamo due Array X e Y (che rispettivamente saranno l’asse X e Y della tabella)
(I dati X rappresentano l’età di 13 macchine e i dati Y la velocità di ognuna di esse)
Da quanto possiamo intuire dal grafico le due auto più veloci sono le più giovani di età e le più lente sono le più vecchie.
Adesso useremo SciPy per disegnare la linea di regressione lineare:
Spiegazione del codice:
Importa i moduli che ti servono.
Crea gli array che rappresentano i valori degli assi X e Y
Esegui il metodo stats.linregress() di SciPy per far si che restituisca i valori chiave della regressione lineare:
Ti riporto questa pag per ulteriori informazioni sul modulo: QUI
Crea una funzione che utilizzi i valori slope e intercept per restituire un nuovo valore. Questo nuovo valore rappresentato sull'asse y verrà “affiancato” dal valore x corrispondente:
Esegui ogni valore dell’array X attraverso la funzione. Risulterà un nuovo array con i nuovi valori per l’asse Y.
Disegna il grafico a dispersione originale:
Disegna la linea di regressione lineare:
Visualizza il diagramma:
È importante sapere come è la relazione tra i valori dell'asse x e i valori dell'asse y, se non ci sono relazioni la regressione lineare non può essere utilizzata per le previsioni.
Questa relazione - il coefficiente di correlazione - è chiamata r.
Il valore r varia da 0 a 1, dove 0 significa nessuna relazione e 1 significa correlato al 100%.
Python e il modulo Scipy ci aiuteranno a calcolare tale valore.
Nota: il risultato -0,76 mostra che esiste una relazione, non perfetta, ma indica che potremmo utilizzare la regressione lineare nelle previsioni future.
Prevedere i valori futuri
Ora possiamo utilizzare le informazioni che abbiamo raccolto per prevedere i valori futuri.
Esempio: proviamo a prevedere la velocità di un'auto di 10 anni.
Per fare ciò, abbiamo bisogno della stessa funzione myfunc() dell'esempio sopra:
Esempio
Prevedi la velocità di un'auto di 10 anni:
L'esempio prevedeva una velocità a 85,6, che potremmo anche leggere dal diagramma:
Spero quantomeno di aver svelato qualche dubbio sull'argomento e sopratutto di esser stato utile.
Per qualsiasi cosa non esitate a contattarmi sul post!
il termine regressione viene utilizzato quando si tenta di trovare la relazione tra variabili. E’ ampiamente utilizzata in statistica per stimare i valori di variabili dipendenti (output, la variabile i cui valori sono da stimare) e variabili indipendenti (input, la variabile “di confronto”). In Machine Learning o apprendimento automatico tale relazione viene utilizzata per prevedere il risultato di eventi futuri. La Regressione Lineare utilizza la relazione tra i punti dati per tracciare una linea retta che attraversa il grafico.
La regressione lineare, un aspetto matematico:
Il grafico che si utilizza per la rappresentazione grafica dei dati è il Scatterplot
Dove i dati sono dati ordinati (in ordine crescente/decrescente) e vengono rappresentati da punti.
Abbiamo sull’asse X i dati della variabile dipendente e sull’asse Y i dati della var. Indipendente.
L’interpretazione del grafico è più o meno la seguente: (Grafico preso da RealPython)
In coding:
Andiamo più nel pratico:
Note: I presenti codici sono stati presi da W3School e non sono stati scritti da me.
**: Per la rappresentazione grafica dei dati su grafico utilizzo l’IDE Spyder
Creiamo due Array X e Y (che rispettivamente saranno l’asse X e Y della tabella)
Python:
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
(I dati X rappresentano l’età di 13 macchine e i dati Y la velocità di ognuna di esse)
Python:
#Importiamo il modulo Mathplotlib:
import matplotlib.pyplot as plt
#Scriviamo gli Array
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
#Usiamo il metodo scatter() per disegnare il grafico
plt.scatter(x, y)
plt.show()
Da quanto possiamo intuire dal grafico le due auto più veloci sono le più giovani di età e le più lente sono le più vecchie.
Adesso useremo SciPy per disegnare la linea di regressione lineare:
Codice:
import matplotlib.pyplot as plt
from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r, p, std_err = stats.linregress(x, y)
def myfunc(x):
return slope * x + intercept
mymodel = list(map(myfunc, x))
plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()
Spiegazione del codice:
Importa i moduli che ti servono.
Codice:
import matplotlib.pyplot as plt
from scipy import stats
Crea gli array che rappresentano i valori degli assi X e Y
Codice:
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
Esegui il metodo stats.linregress() di SciPy per far si che restituisca i valori chiave della regressione lineare:
Codice:
slope, intercept, r, p, std_err = stats.linregress(x, y)
Ti riporto questa pag per ulteriori informazioni sul modulo: QUI
Crea una funzione che utilizzi i valori slope e intercept per restituire un nuovo valore. Questo nuovo valore rappresentato sull'asse y verrà “affiancato” dal valore x corrispondente:
Codice:
def myfunc(x):
return slope * x + intercept
Esegui ogni valore dell’array X attraverso la funzione. Risulterà un nuovo array con i nuovi valori per l’asse Y.
Codice:
mymodel = list(map(myfunc, x))
Disegna il grafico a dispersione originale:
Codice:
plt.scatter(x, y)
Disegna la linea di regressione lineare:
Codice:
plt.plot(x, mymodel)
Visualizza il diagramma:
Codice:
plt.show()
È importante sapere come è la relazione tra i valori dell'asse x e i valori dell'asse y, se non ci sono relazioni la regressione lineare non può essere utilizzata per le previsioni.
Questa relazione - il coefficiente di correlazione - è chiamata r.
Il valore r varia da 0 a 1, dove 0 significa nessuna relazione e 1 significa correlato al 100%.
Python e il modulo Scipy ci aiuteranno a calcolare tale valore.
Python:
import matplotlib.pyplot as plt
from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r, p, std_err = stats.linregress(x, y)
def myfunc(x):
return slope * x + intercept
mymodel = list(map(myfunc, x))
plt.scatter(x, y)
plt.plot(x, mymodel)
plt.show()
Nota: il risultato -0,76 mostra che esiste una relazione, non perfetta, ma indica che potremmo utilizzare la regressione lineare nelle previsioni future.
Prevedere i valori futuri
Ora possiamo utilizzare le informazioni che abbiamo raccolto per prevedere i valori futuri.
Esempio: proviamo a prevedere la velocità di un'auto di 10 anni.
Per fare ciò, abbiamo bisogno della stessa funzione myfunc() dell'esempio sopra:
Codice:
def myfunc(x):
return slope * x + intercept
Esempio
Prevedi la velocità di un'auto di 10 anni:
Codice:
from scipy import stats
x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
slope, intercept, r, p, std_err = stats.linregress(x, y)
def myfunc(x):
return slope * x + intercept
speed = myfunc(10)
print(speed)
L'esempio prevedeva una velocità a 85,6, che potremmo anche leggere dal diagramma:
Spero quantomeno di aver svelato qualche dubbio sull'argomento e sopratutto di esser stato utile.
Per qualsiasi cosa non esitate a contattarmi sul post!