Les statistiques à deux variables.

Le tableau suivant donne l'évolution des bénéfices d'une société.

Année Bénéfice
1 28
3 27.2
8 37.6
13 40.7

On cherche à savoir s'il existe une corrélation entre les années et les bénéfices de la société.

Liens intéressants :

http://www.python-simple.com/python-matplotlib/scatterplot.php

http://www.python-simple.com/python-numpy-scipy/fitting-regression.php

Outils PYTHON utilisés :

  • Outils d'affichage de matplotlib (axis, xlable,ylabel,title, grid, scatter, show)
  • outils de numpy (création d'un tableau à partir d'une liste, fonction mean(), np.polyfit() qui renvoie les coefficients du polynôme de régression, np.poly1d qui créer un polynome de régression)
  • outils linregress de scipy.stats, cette fonction renvoie une liste de 5 informations à partir de deux listes de nombres. Les trois premières sont a, b et coefficient de corrélation.
In [1]:
from math import *
# from random import *
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import linregress
In [2]:
liste_x=[1,3,8,13]
liste_y=[28,27.2,37.6,40.7]
plt.axis([0,15, 0, 50]) # Attention [x1,x2,y1,y2]
plt.xlabel('Années')
plt.ylabel('Bénéfices')
plt.title('Evolution des bénéfices de la société')
plt.grid()
plt.scatter(liste_x,liste_y)
plt.show()
In [3]:
# Recherche du point moyen associé à la série.

def PointMoyen(liste_x,liste_y):
    X=np.array(liste_x) # Transformation de la liste en un tableau de valeurs numpy.
    Y=np.array(liste_y)
    return X.mean(), Y.mean()
In [4]:
print(f"Le point moyen associée à la liste a pour coordonnées : {PointMoyen(liste_x,liste_y)[0]:.2f}, {PointMoyen(liste_x,liste_y)[1]:.2f}")

lr = linregress(liste_x, liste_y) # lr reçoit cinq informations, on n'utilise que les trois premières
print("Ecriture y=ax+b")
print("a= ", lr[0])
print("b= ",lr[1])
print("coefficient de corrélation : ",lr[2])
Le point moyen associée à la liste a pour coordonnées : 6.25, 33.38
Ecriture y=ax+b
a=  1.2118155619596545
b=  25.80115273775216
coefficient de corrélation :  0.9589661306755194
In [5]:
# Une autre méthode, np.polyfit renvoie a et b
fit =np.polyfit(liste_x, liste_y, 1)
poly = np.poly1d(fit) # On crée une fonction polynimiale à partir de a et b.


print(poly)

poly(4)
 
1.212 x + 25.8
Out[5]:
30.648414985590776
In [6]:
liste_x=[1,3,8,13]
liste_y=[28,27.2,37.6,40.7]
plt.axis([0,15, 0, 50])
plt.xlabel('Années')
plt.ylabel('Bénéfices')
plt.title('Evolution des bénéfices de la société')
plt.grid()

plt.scatter(liste_x,liste_y)

lx= np.linspace(0,30,100) #créer une liste de 100 valeurs dans l'intervalle[0,30]
plt.plot(lx,poly(lx))
plt.show()

Exercice 1

On considère la série statistique à deux variables suivantes : .

x y
1 1
3 2
4 4
6 4
8 5
9 7
11 8
14 9
  1. Déterminer les coordonnées du point moyen G du nuage de points associé à cette série.
    1. Déterminer à l’aide d’un calculateur par la méthode des moindres carrés une équation de la droite de régression de y en x sous la forme y=ax+b, où a et b dont à arrondir à $10^{-2}$.
    2. A l’aide de l’équation précédente, estimer la valeur de y pour x=12. Arrondir à l’unité.
In [7]:
# Exercice 1 de la feuille de TD

liste_x=[1,3,4,6,8,9,11,14]
liste_y=[1,2,4,4,5,7,8,9]
plt.axis([0,15, 0, 20])
plt.xlabel('X')
plt.ylabel('Y')
plt.title('')
plt.grid()





fit =np.polyfit(liste_x, liste_y, 1)
poly = np.poly1d(fit) # On crée une fonction polynimiale à partir de a et b.
# plt.plot(lx,poly(lx))
plt.scatter(liste_x,liste_y)

lx= np.linspace(0,30,100) #créer une liste de 100 valeurs dans l'intervalle[0,30]

plt.show()
plt.show()


def exercice1():
    print(f"Le point moyen associée à la liste a pour coordonnées : {PointMoyen(liste_x,liste_y)[0]:.2f}, {PointMoyen(liste_x,liste_y)[1]:.2f}") 
    lr = linregress(liste_x, liste_y) # lr reçoit cinq informations, on n'utilise que les trois premières
    fit =np.polyfit(liste_x, liste_y, 1)
    poly = np.poly1d(fit)
    print("Ecriture y=ax+b")
    print("a= ", lr[0])
    print("b= ",lr[1])
    print("coefficient de corrélation : ",lr[2])
    print(poly)
    print(f"L'estimation de y pour x=12 est : {poly(12):.0f}")
    
exercice1()
Le point moyen associée à la liste a pour coordonnées : 7.00, 5.00
Ecriture y=ax+b
a=  0.6363636363636364
b=  0.5454545454545459
coefficient de corrélation :  0.9770084209183943
 
0.6364 x + 0.5455
L'estimation de y pour x=12 est : 8

Exercice 2

Faire l’étude à la calculatrice en arrondissant les résultats à $10^{-3}$

L’étude, durant les cinq dernières années, du nombre de passagers transportés annuellement sur une ligne aérienne a conduit au tableau suivant :

Rang de l’année Nombre de passagers $p_i$
1 7550
2 9325
3 10741
4 12837
5 15655
  1. On pose $y_i=ln⁡(p_i)$ Compléter le tableau suivant :
Rang de l’année $y_i=ln⁡(p_i)$
1
2
3
4
5

Utiliser un calculateur pour représenter le nuage de points $M(x_i,y_i)$ dans un repère orthogonal du plan. Peut-on envisager un ajustement affine de ce nuage ?

    1. Déterminer par la méthode des moindres carrés une équation de la droite de régression de y en x.
    2. Déduire du a) une expression de p en fonction de x.
In [8]:
# Exercice 2 de la feuille de TD

liste_pi=[7550,9325,10741,12837,15655]
liste_ln_pi=[log(i) for i in liste_pi]
liste_x=[1,2,3,4,5]
liste_y=[8.93,9.14,9.28,9.46,9.66]
plt.axis([0,15, 0, 20])
plt.xlabel('X')
plt.ylabel('Y')
plt.title('')
plt.grid()



lr = linregress(liste_x, liste_y) # lr reçoit cinq informations, on n'utilise que les trois premières
print("Ecriture y=ax+b")
print("a= ", lr[0])
print("b= ",lr[1])
print("coefficient de corrélation : ",lr[2])

fit =np.polyfit(liste_x, liste_y, 1)
poly = np.poly1d(fit) # On crée une fonction polynimiale à partir de a et b.
plt.plot(lx,poly(lx))
plt.scatter(liste_x,liste_y)

lx= np.linspace(0,30,100) #créer une liste de 100 valeurs dans l'intervalle[0,30]

plt.show()
Ecriture y=ax+b
a=  0.17800000000000013
b=  8.76
coefficient de corrélation :  0.9983000145113324

Exercice 3

La bibliothèque du comité d’entreprise d’une grande société a établi le bilan de ses activités pour les quatre dernières années. Le tableau suivant donne en milliers pour chaque année :

  • L’augmentation du nombre des prêts de livres $x_i$ ;
  • le nombre des nouveaux lecteurs $y_i$ ;
  • le nombre de nouveautés achetées $z_i$.
Rang de l’année 1 2 3 4
$x_i$ 3 7 1 5
$y_i$ 0,3 1,4 0,1 0,4
$z_i$ 0,9 3,2 2,1 2,8
  1. Représenter la série statistique des ($x_i$,$y_i$), puis dans un repère distinct, la série des ($x_i$,$z_i$). Pour chacun des deux graphiques, prendre un repère orthonormé, unité 2cm.
  2. Déterminer le coefficient de corrélation linéaire de chacune des deux séries. Arrondir à $10^{-3}$.
  3. Que peut-on en conclure ?
In [9]:
liste_x=[3,7,1,5]
liste_y=[0.3,1.4,0.1,0.4]
plt.axis([0,15, 0, 3])
plt.xlabel('X')
plt.ylabel('Y')
plt.title('')
plt.grid()



lr = linregress(liste_x, liste_y) # lr reçoit cinq informations, on n'utilise que les trois premières
print("Ecriture y=ax+b")
print("a= ", lr[0])
print("b= ",lr[1])
print("coefficient de corrélation : ",lr[2])

fit =np.polyfit(liste_x, liste_y, 1)
poly = np.poly1d(fit) # On crée une fonction polynimiale à partir de a et b.
plt.plot(lx,poly(lx))
plt.scatter(liste_x,liste_y)

lx= np.linspace(0,30,100) #créer une liste de 100 valeurs dans l'intervalle[0,30]

plt.show()
Ecriture y=ax+b
a=  0.2
b=  -0.25
coefficient de corrélation :  0.8899883189799698
In [0]:
liste_x=[3,7,1,5]
liste_y=[0.9,3.2,2.1,2.8]
plt.axis([0,15, 0, 5])
plt.xlabel('X')
plt.ylabel('Y')
plt.title('Titre du graphique')
plt.grid()



lr = linregress(liste_x, liste_y) # lr reçoit cinq informations, on n'utilise que les trois premières
print("Ecriture y=ax+b")
print("a= ", lr[0])
print("b= ",lr[1])
print("coefficient de corrélation : ",lr[2])

fit =np.polyfit(liste_x, liste_y, 1)
poly = np.poly1d(fit) # On crée une fonction polynimiale à partir de a et b.
lx= np.linspace(0,30,100) #créer une liste de 100 valeurs dans l'intervalle[0,30]
plt.plot(lx,poly(lx)) # pour dessiner la droite
plt.scatter(liste_x,liste_y)



plt.show()
Ecriture y=ax+b
a=  0.26
b=  1.21
coefficient de corrélation :  0.6657917756510591

Exercice 4

On considère la série statistique à deux variables suivantes : .

x y
80 4
90 4,8
100 6,3
110 8
120 10
  1. Utiliser un calculateur pour représenter le nuage de points $M(x_i,y_i)$ dans un repère orthogonal du plan. Peut-on envisager un ajustement affine de ce nuage ?

  2. Déterminer par la méthode des moindres carrés une équation de la droite de régression de y en x.

  3. Calculer la valeur y pour x=130

Du point de vue PYTHON :

  • Ecrire une fonction qui gère le nuage de points et la droite
  • Ecrire une fonction qui renvoie a et b
  • Ecrire une fonction qui renvoie le coefficient de corrélation
  • Ecrire une fonction qui gère l'affichage de a,b, coeff
  • Ecrire une fonction demo qui gère tous les éléments.
  • Ecrire une fonction qui calcule y pour un x donné.
In [14]:
def Representation(liste_x,liste_y):
    axis=[min(liste_x),max(liste_x),min(liste_y),max(liste_y)]
    plt.axis()
    plt.xlabel('X')
    plt.ylabel('Y')
    plt.title('Titre du graphique')
    plt.grid()
    plt.scatter(liste_x,liste_y)
    fit =np.polyfit(liste_x, liste_y, 1)
    poly = np.poly1d(fit) # On crée une fonction polynimiale à partir de a et b.
    lx= np.linspace(min(liste_x),max(liste_x),100) #créer une liste de 100 valeurs dans l'intervalle[0,30]
    plt.plot(lx,poly(lx))
    plt.show()


def DroiteRegressionLineaire(liste_x,liste_y):  
    "Renoie a et b dans l'écriture y=ax+b"
    lr = linregress(liste_x, liste_y) # lr reçoit cinq informations, on n'utilise que les deux premières a et b
    return lr[0], lr[1]

def CoefficientCorrelation(liste_x,liste_y):
    lr = linregress(liste_x, liste_y)
    return lr[2]

def EvalY(liste_x,liste_y,x):
    fit =np.polyfit(liste_x, liste_y, 1)
    poly = np.poly1d(fit)
    return poly(x)
    
    
def AffichageElements(liste_x,liste_y):
    a,b=DroiteRegressionLineaire(liste_x,liste_y)
    print("Ecriture y=ax+b")
    print("a= ", a)
    print("b= ",b)
    print("coefficient de corrélation : ",CoefficientCorrelation(liste_x,liste_y))
    
    
    

def demo() :
    liste_x=[80,90,100,110,120]
    liste_y=[4,4.8,6.3,8,10]
    Representation(liste_x,liste_y)
    AffichageElements(liste_x,liste_y)
    x=130
    print(f"La valeur pour {x}  est  {EvalY(liste_x,liste_y,x):.2f}")
In [0]:
demo()
Ecriture y=ax+b
a=  0.15200000000000002
b=  -8.580000000000002
coefficient de corrélation :  0.9892680651079838
La valeur pour 130  est  11.18

Exercice 5

Une entreprise fabrique et commercialise un produit rare. Sa production mensuelle, qui ne peut excéder 7 tonnes, est notée X (en tonnes) : le coût total de cette production mensuelle est noté Y (en k€). On rappelle que $1 k€=10^3 €$. On pose $Z=e^{\frac{100-Y}{25}}$

  1. Compléter le tableau avec des valeurs approchées à $10^{-2}$.
x 1 2 3 4 5 6
y 19,2 20,1 27,5 32,2 40,6 57,3
z 25,33
  1. Déterminer les coefficients de corrélation entre X et Y, puis entre X et Z. Arrondir à 10-3. Commenter les résultats obtenus.
  2. Déterminer une équation de la droite de régression de Z en X.
  3. Utiliser le résultat de la question précédente pour obtenir une expression de Y en X.
  4. Déduire du 4 une estimation du coût total pour une production de 7 tonnes.
In [15]:
def demo2() :
    liste_x=[1,2,3,4,5,6]
    liste_y=[48,49,52.5,55,56,61]
    Representation(liste_x,liste_y)
    AffichageElements(liste_x,liste_y)
    x=9
    print(f"La valeur pour {x}  est  {EvalY(liste_x,liste_y,x):.2f}")
    
demo2()
Ecriture y=ax+b
a=  2.528571428571429
b=  44.733333333333334
coefficient de corrélation :  0.9812408373608256
La valeur pour 9  est  67.49
In [ ]: