Régression linéaire

On récupère donc des données intéressantes : le coefficient de la droite et la valeur à l'origine.Prenons un exemple : j'ai généré des données aléatoires, et tracé un graphique

import numpy as np
import matplotlib.pyplot as plt

x = np.array([1,4,8,12,19])
y = np.array([0.54,0.87,0.99,1.20,1.89])

plt.plot(x,y,'o')
plt.show()

L'idée est de réussir à tracer une régression linéaire, et obtenir l'équation de la droite.

Pour obtenir une régression linéaire à partir de données, et obtenir l'équation de la droite, on utilise un nouveau module : scipy.stats. C'est à dire le module "stats" contenu dans la librairie "scipy". Et dans ce module, c'est la fonction "linregress" qui nous interesse.

On peut donc au choix importer la fonction seulement :

from scipy.stats import linregress
#La fonction sera maintenant dispo, exemple d'appel :
>>>linregress(...)

Ou alors faire comme précédemment, créer un alias et appeler la fonction en passant par l'alias. Étant donné que c'est l'unique fonction de ce module que nous allons utiliser, cette approche n'apporte pas de gain.

import scipy.stats as sc
#Exemple d'appel
>>>sc.linregress(...)

linregress

Deux approches : par la doc : https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.linregress.html

ou démonstration par l'exemple

#Import des modules
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import linregress

#Données x et y
x = np.array([1,4,8,12,19])
y = np.array([0.54,0.87,0.99,1.20,1.89])

#On stocke le résultats de fonction regression linéaire dans un fichier reg
reg = linregress(x,y)

Voyons maintenant ce que contient la variable reg :

>>>reg
LinregressResult(slope=0.0701106639839034, intercept=0.4810261569416501, rvalue=0.9823271641321523, pvalue=0.0028127982604107325, stderr=0.007712729271197591)
  • slope : la pente

  • intercept : la valeur à l'origine

  • rvalue : coefficient de corrélation (le plus proche de 1 est le mieux)

La régression étant une droite du type ax+b

On récupère le coefficient "a" par la première valeur, soit reg[0] ; et l'ordonnée à l'origine par reg[1]

On peut maintenant tracer la droite :

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import linregress

#données
x = np.array([1,4,8,12,19])
y = np.array([0.54,0.87,0.99,1.20,1.89])

#regression lineaire
reg = linregress(x,y)
coef = reg[0] #coef de la droite
ordonnee = reg[1] #ordonnée à l'origine

#tracé
X = np.array([min(x),max(x)]) #Pour tracer une droite, 2 points sont suffisants
plt.plot(x,y,'or') #les points de mesure
plt.plot(X,coef*X+ordonnee,'b') #numpy permet de calculer directement les valeurs en ordonnée.
plt.show()  #On affiche

Afficher l'équation de la droite

C'est souvent l'un des objectif : trouver l'équation de la droite.

On va donc afficher le "slope", ici reg[0], et l'ordonnée à l'origine "intercept", ici reg[1]

Ca peut être affiché en console. Voici un exemple qui l'affiche à coté de la droite.

Le graphique a été enrichi de décorations et peut vous servir de "mémo"

plt.plot(x,y,'or',label='données mesurées')
plt.plot(X,coef*X+ordonnee,'b',label='regression linéaire')
plt.title('Données brutes aléatoires et sa regression linéaire')
plt.text(0.5,0.5,"Equation de la regression linéaire : y="+str(round(coef,3))+"x+"+str(round(ordonnee,3)),bbox=dict(facecolor='red', alpha=0.5)) #Affiche le texte en position 0,5;0,5
plt.legend()
plt.grid()
plt.show()

Last updated

Was this helpful?