Exercice : Régression linéaire

Dans cette partie, on souhaite établir l'équation de la droite qui relie au mieux le nuage de points.

Question

Exécuter le code suivant et vérifier que les points sont bien alignés et que l'on peut donc envisager d'écrire une droite sous la forme \(Y=\beta \times X\) ou \(Y=\alpha_1 \times X + \alpha_0\)

1
# -*- coding: utf-8 -*-
2
3
### Importation des bibliohèques
4
5
import matplotlib.pyplot as plt
6
7
###Mesures expérimentales
8
A = [0, 0.182, 0.369, 0.744, 1.115, 1.449, 1.846 ] # sans unité
9
C = [0, 0.2, 0.4, 0.8, 1.2, 1.6, 2]                 # en 10^-5 mol/L           
10
11
### Régression linéaire
12
13
### Tracé A=f(t)
14
15
plt.figure()
16
plt.plot(C, A, '.') # '.' pour tracer les points sinon lissage de la courbe sans les points
17
plt.xlabel('$C (10^{-5} mol/L)$')
18
plt.ylabel('A')
19
plt.title("Dosage spectrophotométrique : droite d'étalonnage")   
20
plt.grid()        
21
22
#plt.text (0.5*10**(-5), 0.32, compléter)
23
#plt.text (0.8*10**(-5), 0.22, 'a='+'{:.4}'.format(compléter))
24
#plt.text (0.8*10**(-5), 0.12, 'b='+'{:.4}'.format(compléter))
25
#plt.text (0.8*10**(-5), 0.02, 'r='+'{:.6}'.format(compléter))
26
27
plt.show()

Question

Importer la bibliothèque Numpy et utiliser la fonction polyfit pour obtenir les coefficients de la droite.

Commenter le résultat obtenu.

Indice

Utiliser la commande suivante pour importer la bibliothèque Numpy

1
import numpy as np

import numpy as np

Indice

Vous pouvez vous référer à la documentation de « numpy.polyfit ».

Solution

Voici les lignes de code à insérer aux zones idoines pour compléter le code.

1
### Importation des bibliohèques
2
import numpy as np
3
4
### Régression linéaire
5
6
P = np.polyfit(C, A, 1)
7
print(P)

Le résultat est discutable car la fonction polyfit renvoie par défaut une ordonnée à l'origine. Celle ci est certes très proche de 0 mais elle n'est pas nulle et influe donc sur la valeur du coefficient directeur de la droite.

Il vaut mieux utiliser dans ce type de cas le module « sklearn.linear_model » ou simplement créer une boucle pour utiliser un modèle \(Y=\beta \times X\).

Question

Compléter le code suivant pour afficher la droite sur le graphique du nuage de points.

Indice

Il faut rajouter une ligne de code après l'affichage du nuage de points qui affiche la droite avec les paramètres obtenus par la régression linéaire.

Solution

1
### Tracé A=f(t)
2
3
plt.figure(1)
4
plt.plot(C, A, '.', label = 'Mesures', color = 'blue') # '.' pour tracer les points sinon lissage de la courbe sans les points
5
plt.plot(C, P[0] *C + P[1], '-', label= 'Droite de régression', color = 'red')
6
plt.xlabel('$C (10^{-5} mol/L)$')
7
plt.ylabel('A')
8
plt.title("Dosage spectrophotométrique : droite d'étalonnage")   
9
plt.grid
10
plt.legend()        
11
12
#plt.text (0.5*10**(-5), 0.32, compléter)
13
#plt.text (0.8*10**(-5), 0.22, 'a='+'{:.4}'.format(compléter))
14
#plt.text (0.8*10**(-5), 0.12, 'b='+'{:.4}'.format(compléter))
15
#plt.text (0.8*10**(-5), 0.02, 'r='+'{:.6}'.format(compléter))
16
17
plt.show()

Question

Compléter le code pour afficher le coefficient de corrélation.

Indice

Il faut utiliser la méthode « corrcoeff » du module numpy.

Solution

1
R = np.corrcoef (C, A)
2
print(R)

Question

Afficher l'équation de la droite sur le graphique.

Solution

1
plt.text (0.75, 0.32, "Droite d'équation A = a*C + b ")
2
plt.text (0.75, 0.22, 'a='+'{:.4}'.format(P[0]))
3
plt.text (0.75, 0.12, 'b='+'{:.4}'.format(P[1]))
4
plt.text (0.75, 0.02, 'r='+'{:.6}'.format(R[0, 1]))

L'affichage des incertitudes est utile lorsqu'on souhaite utiliser la méthode de Monte Carlo pour tracer n droites passant par les différents nuages de points crées aléatoirement en fonction des incertitudes et de leur loi de répartition.

Question

Afficher les incertitudes pour les différents points.

Indice

Il faut utiliser la méthode « errorbar » du module pyplot de la bibliothèque matplolib.

Solution

1
# -*- coding: utf-8 -*-
2
3
### Importation des bibliohèques
4
5
import matplotlib.pyplot as plt
6
import numpy as np
7
8
###Mesures expérimentales
9
A = [0, 0.182, 0.369, 0.744, 1.115, 1.449, 1.846 ] # sans unité
10
C = np.array([0, 0.2, 0.4, 0.8, 1.2, 1.6, 2])                 # en 10^-5 mol/L           
11
12
u_A = 0.05
13
14
### Régression linéaire
15
16
P = np.polyfit(C, A, 1)
17
print(P)
18
R = np.corrcoef (C, A)
19
print(R)
20
21
### Tracé A=f(t)
22
23
plt.figure(1)
24
plt.errorbar(C, A, yerr = u_A,  fmt = '.', label = 'Mesures', color = 'blue') # '.' pour tracer les points sinon lissage de la courbe sans les points
25
plt.plot(C, P[0] *C + P[1], '-', label= 'Droite de régression', color = 'red')
26
plt.xlabel('$C (10^{-5} mol/L)$')
27
plt.ylabel('A')
28
plt.title("Dosage spectrophotométrique : droite d'étalonnage")   
29
plt.grid
30
plt.legend()        
31
32
plt.text (0.8, 0.32, "Droite d'équation A = a*C + b ")
33
plt.text (0.8, 0.22, 'a='+'{:.4}'.format(P[0]) + 'L/mol')
34
plt.text (0.8, 0.12, 'b='+'{:.4}'.format(P[1]))
35
plt.text (0.8, 0.02, 'r='+'{:.6}'.format(R[0, 1]))
36
37
plt.show()