Régression Linéaire

Programme créé par Martine Arrou-Vignod 24 Juin 2015

Ajustement linéaire
En-tête avec les bibliothèques appelées
In [30]:
# -*- coding: utf-8 -*-
#Programme créé par Martine Arrou-Vignod 24 Juin 2015
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

Calcul des paramètres pour tracer la droite d'ajustement linéaire et trace la droite

Données (à changer pour chaque simulation)
Les données dt1, dt2 correspondent à celles rentrées sous forme de tableau
Les données do1, do2 correspondent à celles d'un fichier qui se trouve dans le même répertoire sur le serveur et que l'on peut donc modifier

Données sous forme de tableau

In [31]:
# Données
dt1= np. array ([2.3 , 2.5 , 2.6 , 3.1 , 3.4 , 4 , 3.9 , 4, 4.1 , 4.1 , 4.2 , 4.4 , 4.7 ,
5.1 , 5.5 , 5.8 , 6.2 , 6.9 , 6.9 , 7.3])
dt2 = np. array ([7 , 8, 4.3, 4.7, 6, 6, 12, 8, 5, 7, 8, 7, 9, 10, 13, 7, 11, 11, 16,
14] , dtype = float )

Données dans un fichier

Fonction pour visualiser les données d'un fichier
In [32]:
#Données sous forme de fichier 
def afficher_donnees(monfichier):
    mesdonnees=open(monfichier,'r')
    lecture = mesdonnees.read()
    print('Visualisation des données')
    print(lecture)
    print('fin fichier')
Fonction qui permet de transformer les données du fichier en tableau et de les tracer et de retourner le tableau
In [33]:
#Données sous forme de fichier 
def donnees_fichier(nom_fichier):
    afficher_donnees(nom_fichier)
    donnees1,donnees2 = np.loadtxt(nom_fichier, unpack=True)
    plt.plot( donnees1,donnees2,'go')
    plt.show()
    return  donnees1,donnees2
In [34]:
do1,do2=donnees_fichier("donnees.txt")
Visualisation des données
3.6 3.1
2.3 2.4
5.3 6.1
4.5 4.5
4.2 4.7
5.4 6.4
6.2 6.8
7.5 7.6
8.2 8.7
9.4 9
9.2 9.5
fin fichier
Fonctions du programme permettant de calculer les paramètres et d'afficher la droite de régression
In [35]:
#retourne les paramètres a,b,sigma_x,sigma_y,covar_xy,r 
def param_regression(x,y):
    n = y. size
    x_m=np.mean(x)
    y_m=np.mean(y)
    #calcul de la covariance 
    covar_xy=np.dot(x,y)/n-x_m*y_m

    #calcul de la variance de x
    var_x=np.dot(x,x)/n-x_m*x_m

    #calcul de la variance de y
    var_y=np.dot(y,y)/n-y_m*y_m

    sigma_x=np.sqrt(var_x)
    sigma_y=np.sqrt(var_y)
    #calcul de a 
    a=covar_xy/var_x
    #calcul de b 
    b=y_m-a*x_m
    #calcul du coefficient de corrélation
    r=covar_xy/sigma_x/sigma_y
    return(a,b,sigma_x,sigma_y,covar_xy,r)

#trace une droite quelconque 
def droiteab(a,b,x):
    return(a*x+b)

        

#trace le nuage et la droite 
def tracernuagedroite(dx,dy,a,b):
    x = np.linspace(np.min(dx),np.max(dx),30)
    z=droiteab(a,b,x)
    chaine = " y= %1.3f x " %a
    if b>0 :
        chaine2 ="+%1.3f" %b
    else :
         chaine2 ="%1.3f" %b
    chaine3=chaine + chaine2
    print(chaine3)
    plt.plot(x,z,label=chaine3)
    plt.legend()
    plt.grid(True)
    plt. plot (dx,dy, 'ro ')

#affichage des paramètres 
def affichparametres(x,y):
    p=param_regression(x,y) 
    print('données')
    print(x)
    print(y)
    print('paramètres')
    print('écart type de  x=',p[2])
    print('écart type de  y=',p[3])
    print('variance de y=',p[2]**2)
    print('variance de y=',p[3]**2)
    print('covariance xy=',p[4])
    print('coefficient de corrélation=',p[5])
    if p[1] >0 :
        print('droit: d\'ajustement linéaire y=',"%1.6f"%p[0],'x+',"%1.6f" %p[1])
    else :
         print('droit: d\'ajustement linéaire y=',"%1.6f"% p[0],'x', "%1.6f"%p[1])
    
A partir de ces fonctions on peut faire plusieurs programmes
Fonction pour tracer la droite (utilise les fonctions précédentes)
In [36]:
#tracerdroite et nuage  
def tracer(d1,d2):
    if d1.size == d2.size :
        print('ok')
        #p contient les paramètres de la droite
        p=param_regression(d1,d2)
        tracernuagedroite(d1,d2,p[0],p[1]);
    else: 
        print('la dimension de vos matrices n\'est pas la même')
In [37]:
#les données  sont celles du tableau  :dt1 et dt2
tracer(dt1,dt2)
ok
 y= 1.637 x +1.253
In [38]:
#les données  sont celles du fichier  :do1 et do2
tracer(do1,do2)
ok
 y= 0.996 x +0.295

Affichage des paramètres

In [39]:
#les données  sont celles du tableau  :dt1 et dt2
affichparametres(dt1,dt2)
données
[ 2.3  2.5  2.6  3.1  3.4  4.   3.9  4.   4.1  4.1  4.2  4.4  4.7  5.1  5.5
  5.8  6.2  6.9  6.9  7.3]
[  7.    8.    4.3   4.7   6.    6.   12.    8.    5.    7.    8.    7.
   9.   10.   13.    7.   11.   11.   16.   14. ]
paramètres
écart type de  x= 1.45241178734
écart type de  y= 3.1605379289
variance de y= 2.1095
variance de y= 9.989
covariance xy= 3.4525
coefficient de corrélation= 0.752112689076
droit: d'ajustement linéaire y= 1.636644 x+ 1.253271
In [40]:
#les données  sont celles du fichier  :do1 et do2
affichparametres(do1,do2)
données
[ 3.6  2.3  5.3  4.5  4.2  5.4  6.2  7.5  8.2  9.4  9.2]
[ 3.1  2.4  6.1  4.5  4.7  6.4  6.8  7.6  8.7  9.   9.5]
paramètres
écart type de  x= 2.23029479577
écart type de  y= 2.26650056108
variance de y= 4.97421487603
variance de y= 5.13702479339
covariance xy= 4.95553719008
coefficient de corrélation= 0.980330778237
droit: d'ajustement linéaire y= 0.996245 x+ 0.295188

Calcul automatique de la droite de régression à partir des fonctions de Python

In [41]:
#fonction pour affichage
def pythonreg(d1,d2):
    n = d2. size
    a,b = np.polyfit(d1,d2,1)
    x = np.linspace(np.min(d1),np.max(d1),30)
    print(" a=",a,"b=",b)
    z=a*x+b
    chaine = " y= %1.3f x " %a
    if b >0 :
        chaine2 ="+%1.3f" %b
    else:
        chaine2 ="%1.3f" %b
    chaine3=chaine + chaine2
    print(chaine3)
    plt.plot(x,z,label=chaine3)
    plt.legend()
    plt.grid(True)
    plt. plot (d1,d2, 'bo ')
    print('fin')
In [42]:
#les données  sont celles du fichier  :do1 et do2
pythonreg(do1,do2)
 a= 0.996245098691 b= 0.29518840965
 y= 0.996 x +0.295
fin
In [43]:
#les données  sont celles du tableau  :dt1 et dt2
pythonreg(dt1,dt2)
 a= 1.63664375444 b= 1.25327091728
 y= 1.637 x +1.253
fin
Pour toute question envoyer un mail à Martine Arrou-Vignod
FORMAV Votre partenaire formation