"""
    A partir d'un nuage de points donné par deux vecteurs de valeurs x et y,
    on cherche à trouver la droite de régression qui passe au plus près de ces points.
    La droite de régression est donnée par l'équation y = ax + b où a est le coefficient de la pente
    et b est l'ordonnée à l'origine.
    
"""
import numpy as np
import matplotlib.pyplot as plt

# nombre de valeurs
max=200

# créer un tableau x de 200 valeurs comprises entre 1 et 5
x = np.linspace(1, 5, max)
print(x) # affichage facultatif

# Créer un tableau de 200 valeurs comprises entre -1 et 1
tableau = np.random.uniform(-1, 1, size=max)

# calculer y = 3x + 2 + tableau
y = 3*x + 2 + tableau
print(y) # affichage facultatif

def regression_lineaire(x, y):
    """
        Calculer la droite de régression qui passe au plus près des points
        x et y
    """    
    x_mean = np.mean(x)
    y_mean = np.mean(y)
    a = np.sum((x - x_mean) * (y - y_mean))  / np.sum((x - x_mean) ** 2)
    b = y_mean - a * x_mean
        
    return a, b

a, b = regression_lineaire(x, y)

print(f"Coefficient de la pente a: {a}")
print(f"Ordonnée à l'origine b: {b}")

# Tracer la ligne de régression
plt.scatter(x, y)
plt.plot(x, a*x + b, color='red')
plt.xlabel('x')
plt.ylabel('y')
plt.title('Scatter plot of x and y')
plt.show()

# on aurait pu utiliser la fonction polyfit de numpy
#a, b = np.polyfit(x, y, 1)
#print(f"a = {a}, b = {b}")
