# -*- coding: utf-8 -*-
"""
Created on Thu Nov 28 16:14:16 2019, updated Sep 2025

@author: topo eso

Méthodes d'estimation - Exercice 2
Calcul d'indicateurs statistiques
Version "pâquerette"

Ce code fait exactement ce qui est demandé dans l'exercice, et rien de
plus. Il est conçu pour introduire l'usage de MatLab. On utilise ici des
fonctions simples et l'on construit des boucles au lieu de recourir aux
fonctions dédiées "mean", "cov", etc.

La version "tournesol" est plus sophistiquée, mais il faut un début à
tout!

"""

# Veuillez tout d'abord installer les librairies suivantes :
# numpy (https://numpy.org/) : pip install numpy
# matplotlib (https://matplotlib.org/) : pip install matplotlib

import numpy as np
import matplotlib.pyplot as plt


#####################################
# Première série de données
# Une virgule entre les éléments d'une ligne n'est pas nécessaire.

x = np.array([0.175, 0.212, 0.251, 0.117, 0.283, 0.393, 0.217, 0.288, 0.339, 0.238])
y = np.array([13, 29, 27, 34, 27, 19, 22, 22, 26, 18])

# Seconde série de données, en commentaire
# Pour la rendre active, il faut la sortir des commentaires en déplaçant
# les "#" vers la première série.

#x = np.array([2.0, 4.4, 7.5, 1.5, 3.8, 1.6, 2.4, 4.0, 1.0, 10.0])
#y = np.array([1.3, 2.2, 2.3, 3.6, 2.4, 4.6, 3.0, 3.3, 3.5, 2.2])


# Commençons par un graphique!

plt.scatter(x, y, marker='o', color='b')
plt.title('Serie de donnees 1')
plt.xlabel("x")
plt.ylabel("y")
plt.show()

# Beaucoup de paramètres sont choisis par défaut, notamment le domaine
# des valeurs et l'échelle pour une zone de graphique rectangulaire.

# plt.axis('square')   # Impose un graphique carré, favorable dans ce cas.


# Vous trouverez un graphique plus élaboré dans le code "tournesol".

###################################################################
##############   Dimension du vecteur x   #########################

# Ainsi il suffit de changer le contenu de x et le calcul s'adapte.

n = len(x)

###################################################################
##############   Calcul de la moyenne des mesures de x   ##########

# Cette opération est nécessaire pour calculer les résidus,
# puis l'estimation de la variance de x.
# Le point-virgule à la fin de la ligne rend son exécution invisible
# dans le fichier des résultats (Command Window).

somme_x = 0.0

for i in range(n):
    somme_x = somme_x + x[i]

moyenne_x = somme_x/n

# Idem pour le vecteur y, qui a la même dimension dans ce cas puisque
# l'on donne toujours des couples de valeurs pour x et y.

somme_y = 0.0

for i in range(n):
    somme_y = somme_y + y[i]


moyenne_y = somme_y/n

###################################################################
###########   Calcul des variances et de la covariance   ##########

# On peut combiner le calcul des sommes quadratiques dans la même boucle.

somme_xx = 0.0
somme_yy = 0.0
somme_xy = 0.0

for i in range(n):
    residu_x = x[i] - moyenne_x
    residu_y = y[i] - moyenne_y
    somme_xx = somme_xx + residu_x * residu_x
    somme_yy = somme_yy + residu_y * residu_y
    somme_xy = somme_xy + residu_x * residu_y

variance_x = somme_xx/(n-1)
variance_y = somme_yy/(n-1)
covar_xy   = somme_xy/(n-1)


###################################################################
###########   Calcul des écarts-types pour x et y   ###############

sigma_x = np.sqrt(variance_x)   # sqrt = racine carrée (square root)
sigma_y = np.sqrt(variance_y)


###################################################################
###########   Calcul de la corrélation de x et y   ################

correl_xy = covar_xy/(sigma_x*sigma_y)


###################################################################
###########   Matrice de covariance de l      #####################

K_ll = np.array([[variance_x,covar_xy],[covar_xy,variance_y]])      # voir documentation matrice numpy 

np.set_printoptions(precision=3)                                    # definit le nombre de decimal a afficher pour les matrices

print('Matrice de covariance de l :')
print(K_ll)


###################################################################
###########   Matrice de correlation de l      #####################

R_ll = np.array([[1,correl_xy],[correl_xy,1]])

print('Matrice de correlation de l :')
print(R_ll)











