# -*- coding: utf-8 -*-
"""
Created on Thu Nov 28 16:14:16 2019
Updated on 09/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 "numpy.mean", "numpy.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 = ...TODO 
# y = ...TODO 

# 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()
#plt.axis('square')   # Impose un graphique carré, favorable dans certains cas.

# Beaucoup de paramètres sont choisis par défaut, notamment le domaine
# des valeurs et l'échelle pour une zone de graphique rectangulaire.
# 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

print('Moyenne des mesures de x :')
print(moyenne_x)

# 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.

# ...TODO

print('Moyenne des mesures de y :')
print(moyenne_y)

###################################################################
###########   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

    # ...TODO
    
    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/...TODO
#variance_y = ...TODO
#covar_xy = ...TODO 

print('Variance des mesures de x :')
print(variance_x)
print('Variance des mesures de y :')
print(variance_y)


print('Covariance des mesures de x et de y :')
print(covar_xy)

###################################################################
###########   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)

print('Ecart-type des mesures de x :')
print(sigma_x)
print('Ecart-type des mesures de y :')
print(sigma_y)

###################################################################
###########   Calcul de la corrélation de x et y   ################

#correl_xy = ...TODO

print('Corrélation des mesures de x et de y :')
print(correl_xy)

###################################################################
###########   Matrice de covariance de l      #####################

# voir documentation matrice numpy 
K_ll = np.array([[variance_x,covar_xy],[covar_xy,variance_y]])      

# definit le nombre de decimal a afficher pour les matrices
np.set_printoptions(precision=3)                                    

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 corrélation de l :')
print(R_ll)
