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\)
# -*- coding: utf-8 -*-
### Importation des bibliohèques
import matplotlib.pyplot as plt
###Mesures expérimentales
A = [0, 0.182, 0.369, 0.744, 1.115, 1.449, 1.846 ] # sans unité
C = [0, 0.2, 0.4, 0.8, 1.2, 1.6, 2] # en 10^-5 mol/L
### Régression linéaire
### Tracé A=f(t)
plt.figure()
plt.plot(C, A, '.') # '.' pour tracer les points sinon lissage de la courbe sans les points
plt.xlabel('$C (10^{-5} mol/L)$')
plt.ylabel('A')
plt.title("Dosage spectrophotométrique : droite d'étalonnage")
plt.grid()
#plt.text (0.5*10**(-5), 0.32, compléter)
#plt.text (0.8*10**(-5), 0.22, 'a='+'{:.4}'.format(compléter))
#plt.text (0.8*10**(-5), 0.12, 'b='+'{:.4}'.format(compléter))
#plt.text (0.8*10**(-5), 0.02, 'r='+'{:.6}'.format(compléter))
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
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.
### Importation des bibliohèques
import numpy as np
### Régression linéaire
P = np.polyfit(C, A, 1)
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
### Tracé A=f(t)
plt.figure(1)
plt.plot(C, A, '.', label = 'Mesures', color = 'blue') # '.' pour tracer les points sinon lissage de la courbe sans les points
plt.plot(C, P[0] *C + P[1], '-', label= 'Droite de régression', color = 'red')
plt.xlabel('$C (10^{-5} mol/L)$')
plt.ylabel('A')
plt.title("Dosage spectrophotométrique : droite d'étalonnage")
plt.grid
plt.legend()
#plt.text (0.5*10**(-5), 0.32, compléter)
#plt.text (0.8*10**(-5), 0.22, 'a='+'{:.4}'.format(compléter))
#plt.text (0.8*10**(-5), 0.12, 'b='+'{:.4}'.format(compléter))
#plt.text (0.8*10**(-5), 0.02, 'r='+'{:.6}'.format(compléter))
plt.show()
Question
Question
Afficher l'équation de la droite sur le graphique.
Solution
plt.text (0.75, 0.32, "Droite d'équation A = a*C + b ")
plt.text (0.75, 0.22, 'a='+'{:.4}'.format(P[0]))
plt.text (0.75, 0.12, 'b='+'{:.4}'.format(P[1]))
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.
Solution
# -*- coding: utf-8 -*-
### Importation des bibliohèques
import matplotlib.pyplot as plt
import numpy as np
###Mesures expérimentales
A = [0, 0.182, 0.369, 0.744, 1.115, 1.449, 1.846 ] # sans unité
C = np.array([0, 0.2, 0.4, 0.8, 1.2, 1.6, 2]) # en 10^-5 mol/L
u_A = 0.05
### Régression linéaire
P = np.polyfit(C, A, 1)
print(P)
R = np.corrcoef (C, A)
print(R)
### Tracé A=f(t)
plt.figure(1)
plt.errorbar(C, A, yerr = u_A, fmt = '.', label = 'Mesures', color = 'blue') # '.' pour tracer les points sinon lissage de la courbe sans les points
plt.plot(C, P[0] *C + P[1], '-', label= 'Droite de régression', color = 'red')
plt.xlabel('$C (10^{-5} mol/L)$')
plt.ylabel('A')
plt.title("Dosage spectrophotométrique : droite d'étalonnage")
plt.grid
plt.legend()
plt.text (0.8, 0.32, "Droite d'équation A = a*C + b ")
plt.text (0.8, 0.22, 'a='+'{:.4}'.format(P[0]) + 'L/mol')
plt.text (0.8, 0.12, 'b='+'{:.4}'.format(P[1]))
plt.text (0.8, 0.02, 'r='+'{:.6}'.format(R[0, 1]))
plt.show()