<a href="https://colab.research.google.com/github/jmamath/UVS-Probabilite-Statistiques/blob/master/Risque_empirique_et_biais_d'un_estimateur.ipynb" target="_parent"></a>

## 0. Introduction
Objectifs pédagogiques:
1. Être capable de calculer les notions de risque quadratique d'un estimateur. 
1. Être capable de calculer le biais d'un estimateur.
1. Renforcer la comprehénsion qu'un estimateur est une variable aléatoire.

Commençons par importer quelques modules.



```
import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt
import seaborn as sns
# settings for seaborn plotting style
sns.set(color_codes=True)
# settings for seaborn plot sizes
sns.set(rc={'figure.figsize':(5,5)})
```

    /usr/local/lib/python3.6/dist-packages/statsmodels/tools/_testing.py:19: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.
      import pandas.util.testing as tm


## 1. Risque quadratique d'un estimateur
Le risque quadratique est l'une des mesure les plus brute de la performance d'un estimateur. Cependant il offre un premier moyen de comparer divers estimateurs.

Plaçons nous dans le cas ou le jeu de données est issu d'une loi normale centrée réduite $\mathcal{N}(0,1)$.


```
# Create a Standard Gaussian and sample from it
num_sample = 10000


# generate random numbers from N(0,1)
data_normal = norm.rvs(size=num_sample,loc=0,scale=1)

ax = sns.distplot(data_normal,
                  bins=100,
                  kde=True,
                  color='skyblue',
                  hist_kws={"linewidth": 20,'alpha':1})
ax.set(xlabel='Loi normale', ylabel='Fréquence')

# data = g.sample([num_sample]).numpy()

```


En connaissant uniquement la moyenne, l'estimateur de la variance issu du maxium de vraisemblance peut être utile car il incorpore la valeur de la moyenne. 

### Questions
* Implémenter l'estimateur de la moyenne et de la variance que vous avez trouvé avec le maximum de vraisemblance que nous noterons $T_{n}$ et $S_{n}$
* Implémenter un estimateur de la variance empririque $S_{n}^{2}$
* Implémenter un estimateur de la variance empririque corrigée $\hat S_{n}^{2}$

Pour rappel en notant la loi normale $\mathcal{N}(\mu,\sigma^{2})$
\begin{align}
T_{n} &= \frac{1}{n} \sum_{i=1}^{n} x_{i} \\
S_{n} &= \frac{1}{n} \sum_{i=1}^{n} (x_{i}-\mu)^{2}\\
S_{n}^{2} &= \frac{1}{n} \sum_{i=1}^{n} (x_{i}-T_{n})^{2}\\
\hat S_{n}^{2} &= \frac{1}{n-1} \sum_{i=1}^{n} (x_{i}-T_{n})^{2}
\end{align}

Vous utiliserez les fonctions ci-dessous à remplir.







```
def estimateur_moyenne_vraisemblance(data):
  """
  Input:
    data: Tableau de nombre: le jeu de données    
  Output:
    moyenne: estimation de la moyenne
  """
  length = len(data)
  moyenne = 0
  for i in range(length):
    moyenne = moyenne + data[i]
  return moyenne / length
  

def estimateur_variance_vraisemblance(data, moyenne):
  """
  Input:
    data: Tableau de nombre: le jeu de données
    moyenne: la moyenne connue
  Output:
    var: estimation de la variance
  """
  length = len(data)
  variance = 0
  for i in range(length):
    variance = variance + (data[i]-moyenne)**2
  return variance / length


def estimateur_variance_empirique(data):
  """
  Input:
    data: Tableau de nombre: le jeu de données
  Output:
    var: estimation de la variance
  """
  length = len(data)
  moyenne = estimateur_moyenne_vraisemblance(data)
  variance = 0
  for i in range(length):
    variance = variance + (data[i]-moyenne)**2
  return variance / length

def estimateur_variance_empirique_corrigee(data):
  """
  Input:
    data: Tableau de nombre: le jeu de données
  Output:
    var: estimation de la variance
  """  
  length = len(data)
  moyenne = estimateur_moyenne_vraisemblance(data)
  variance = 0
  for i in range(length):
    variance = variance + (data[i]-moyenne)**2
  return variance / (length-1)
```


```
# generate random numbers from N(0,1)
num_sample = 5
data_normal = norm.rvs(size=num_sample, loc=0, scale=1)

# Estimations
moyenne = estimateur_moyenne_vraisemblance(data_normal)
var_vraisemblance = estimateur_variance_vraisemblance(data_normal, 0)
var_empirique = estimateur_variance_empirique(data_normal)

print("Moyenne: {}",moyenne)
print("Variance vraisemblance: ", var_vraisemblance)
print("Variance empirique: ", var_empirique)
```

    Moyenne: {} -0.16555148152533544
    Variance vraisemblance:  0.1391702385661771
    Variance empirique:  0.11176294553094361


Nous connaissons les valeurs des paramètres, nous pouvons calculer le risque quadratique de nos estimateurs:

* Rappelez la formule du risque quadratique.
* Éxécutez la cellule de code suivante pour estimer la moyenne de l'échantillon `data_normal` avec $T_{n}$ et sa variance avec respectivement $S_{n},S_{n}^{2}$ et $\hat S_{n}^{2}$.
* Calculez Le risque quadratique associé aux estimateurs: $T_{n}, S_{n}, S_{n}^{2}, \hat S_{n}^{2}$ en utilisant la fonction `risque_quad` à remplir.
* Comparez les divers estimateurs de la variance. Lequel est le plus bas ?


```

```


```
# 1 Generer des donnees aleatoires suivant une loi normale from N(0,1)
num_sample = 5
data_normal = norm.rvs(size=num_sample, loc=0, scale=1)

# 2. Obtenir une estimation de la variance avec chaque estimateur
variance_vraisemblance = estimateur_variance_vraisemblance(data_normal, 0)
variance_empirique = estimateur_variance_empirique(data_normal)
variance_empirique_corrigee = estimateur_variance_empirique_corrigee(data_normal)

# 3. Calculer le risque empirique pour chaque estimateur
def risque_quad(estimation, parametre):
  """
  Input:
    estimation: Float, estimation donnee par un estimateur
    parametre: Float, la veritable valeur du parametre
  Return:
    risque_quadratique: Float. Risque quadratique de l'estimateur
  """
  return (estimation-parametre)**2

# On connait la variance de nos donnees: 1
risque_var_empirique = risque_quad(variance_empirique, 1)
risque_var_vraisemblance = risque_quad(variance_vraisemblance, 1)
risque_var_empirique_corrige = risque_quad(variance_empirique_corrigee, 1)

print("Risque quadratique variance empirique", risque_var_empirique)
print("Risque quadratique variance vraisemblance", risque_var_vraisemblance)
print("Risque quadratique variance empirique corrige", risque_var_empirique_corrige)
```

    Risque quadratique variance empirique 0.7837840635598172
    Risque quadratique variance vraisemblance 0.77402836881981
    Risque quadratique variance empirique corrige 0.7338402250781214


Dans le cas ou le jeu de données connu on peut utiliser $S_{n}$ pour estimer la variance. Dans le cas contraire, il est nécessaire d'utiliser des estimateurs se basant uniquement sur les données comme $S_{n}^{2}, \hat S_{n}^{2}$. 



## 2. Biais et variance d'un estimateur

On veut maintenant calculer le biais d'un estimateur. On va s'intéresser aux estimateurs de la variance, car nous avons vu que l'estimateur de la variance empirique était biaisé. On va illustrer ce que ça signifie.

Dans la suite on continue de considérer la variable aléatoire $X \sim \mathcal{N}(0,1)$ 

### Question
* Rapellez la définition du biais d'un estimateur
* Remplissez le code de `esperance_estimateur` ci dessous pour calculer l'espérance d'un estimateur, vous utiliserez cette fonction pour calculer le biais.



```

def esperance_estimateur(data, estimateur, taille_echantillon, iteration):
  """
  Input:
    data: Jeux de données complet
    estimateur: Estimateur à évaluer
    taille_echantillon: nombre d'éléments à tirer dans le jeu de données pour effectuer une estimation
    iteration: Nombre d'itération pour estimer l'espérance.
  Output:
    biais: le biais de l'estimateur
  """
  estimation = 0
  for i in range(iteration):
    echantillon = np.random.choice(data, taille_echantillon)    
    estimation = estimation + estimateur(echantillon)  
  esperance_estimateur = estimation / iteration
  return esperance_estimateur

  

```

On va comparer plusieurs estimateurs de la variance, dans la suite l'indice représente le nombre d'exemples utilisé pour chaque estimation.
* Comparez le biais de la variance empirique $S_{10}^{2}$ et de la variance empirique corrigée $\hat S_{10}^{2}$.
* Comparez le biais de la variance empirique $S_{100}^{2}$ et de la variance empirique corrigée $\hat S_{100}^{2}$.

Qu'observez-vous ?



```
# Create a Standard Gaussian and sample from it
num_sample = 10000
# generate random numbers from N(0,1)
data_normal = norm.rvs(size=num_sample,loc=0,scale=1)

```


```

esperance_var_emp = esperance_estimateur(data_normal, estimateur_variance_empirique, 15, 50)
esperance_var_corr = esperance_estimateur(data_normal, estimateur_variance_empirique_corrigee, 15, 50)

```

    0.9324079338421366



```
print("Biais estimateur variance empirique", (1-esperance_var_emp))
print("Biais estimateur variance empirique corrigee", 1-esperance_var_corr)
```

    Biais estimateur variance empirique 0.0675920661578634
    Biais estimateur variance empirique corrigee -0.02453540939903709


## 3. Ouverture
On a vu la notion de biais d'un estimateur, dans la suite, on s'intéressera aux propriétés de convergences de ces derniers. maintenant, on va illustrer la convergence d'un estimateur. On va donc voir pourquoi les big data permettent souvent d'obtenir de meilleurs estimateurs.


```

```

d412f60e8d115da1b72ddc074736c6ea6d73f4de
ipynb
Jupyter Notebook
Risque_empirique_et_biais_d'un_estimateur.ipynb
jmamath/UVS-Probabilite-Statistiques
b5874aa10a13d4ad6893cedad1c56e63f8caa7df
MIT
Risque_empirique_et_biais_d'un_estimateur.ipynb
jmamath/UVS-Probabilite-Statistiques
b5874aa10a13d4ad6893cedad1c56e63f8caa7df
MIT
Risque_empirique_et_biais_d'un_estimateur.ipynb
jmamath/UVS-Probabilite-Statistiques
b5874aa10a13d4ad6893cedad1c56e63f8caa7df
MIT
2021-03-26T21:36:50.000Z
2021-03-26T21:36:50.000Z
Qwen/Qwen-72B
1. YES
2. YES