Skip to content

Commit 5f7df3c

Browse files
authored
Exercice loi des grands nombres avec Numpy (#673)
* prépare nouveaux exos * MC * exo1 * Exo 2 * lln * Reanmee files * Exo LLN anglais
1 parent cd0b3c5 commit 5f7df3c

File tree

9 files changed

+635
-11
lines changed

9 files changed

+635
-11
lines changed

_quarto.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ project:
44
- index.qmd
55
- 404.qmd
66
- content/getting-started/index.qmd
7-
- content/getting-started/03_revisions.qmd
7+
- content/manipulation/01_numpy.qmd
88

99
profile:
1010
default: fr

content/manipulation/01_numpy.qmd

Lines changed: 106 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -706,14 +706,111 @@ x = rng.normal(0, size=(3, 4))
706706
{{< include "01_numpy_exercises/_exo5_solution.qmd" >}}
707707
:::
708708

709+
# Simulations numériques
710+
711+
`Numpy` est incontournable dès lors qu'on effectue des simulations aléatoires, ce qui est très commun en statistiques computationnelles avec un ensemble de méthodes dites de Monte-Carlo. Le principe général est de remplacer un calcul théorique difficile (une intégrale, une probabilité, une espérance) par une approximation numérique obtenue en répétant un grand nombre de tirages aléatoires et en moyennant la quantité d’intérêt, en s’appuyant sur la loi des grands nombres et le théorème central limite pour quantifier la précision de l’estimation.
712+
713+
Illustrons empiriquement quelques théorèmes incontournables de la statistique par une série d'exercices. Cela permettra d'explorer :
714+
715+
* La loi des grands nombres (@tip-exo2fr);
716+
* Le théorème central limite et sa version particulière dans le cas de lancer de pièce, le [théorème de Moivre-Laplace](https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Moivre-Laplace) ;
717+
* Les intervalles de confiance théoriques et leur contrepartie empirique à travers le _bootstrap_ ;
718+
* Le principe des méthodes de Monte Carlo avec l'algorithme du rejet.
719+
720+
Nous allons avoir besoin des éléments suivants pour initialiser notre processus générateur de données.
721+
722+
```{python}
723+
#| echo: true
724+
import numpy as np
725+
726+
def generate_grid(size_max=1000):
727+
n_small = np.arange(3, 200, 2)
728+
n_log = np.unique(np.round(np.logspace(np.log10(200), np.log10(size_max), 120)).astype(int))
729+
return np.unique(np.concatenate([n_small, n_log]))
730+
731+
N_max = 100_000
732+
rng = np.random.default_rng(seed=123)
733+
grid = generate_grid(size_max=N_max)
734+
```
735+
736+
Ces éléments nous permettent de générer une série aléatoire d’observations jusqu’à une taille `N_max`, puis d’observer l’évolution des estimateurs empiriques de moments (moyenne et variance) lorsque l’on ne conserve que les `n` premières observations, pour différents `n` donnés par `grid`. L’objectif est d’illustrer la convergence des estimateurs empiriques vers leurs valeurs théoriques lorsque `n` augmente.
737+
738+
## Loi des grands nombres
739+
740+
Nous sommes accoutumés à faire le lien, assez intuitif, entre la théorie des probabilités et la statistique. C'est notamment possible grâce à des théorèmes comme le [théorème fondamental de la statistique (théorème de Glivenko-Cantelli)](https://fr.wikipedia.org/wiki/Th%C3%A9or%C3%A8me_de_Glivenko-Cantelli). Cette relation est le fondement de la science des données, et plus globalement de la statistique, dans sa dimension inférentielle comme descriptive, puisque sans des intuitions mathématiques formelles nous aurions du mal à généraliser les interprétations issues de données observées.
741+
742+
La [loi des grands nombres](https://fr.wikipedia.org/wiki/Loi_des_grands_nombres) peut être illustrée assez facilement par le biais de simulations numériques. Nous allons simuler une suite répétée de tirages aléatoires, ce sera l'équivalent pratique de la suite i.i.d $(X)_i$ du théorème.
743+
744+
:::: {.content-visible when-profile="fr"}
745+
746+
{{< include "/content/manipulation/01_numpy_exercises/_exo_lln_fr.qmd" >}}
747+
748+
::::
749+
750+
:::: {.content-visible when-profile="en"}
751+
752+
{{< include "/content/manipulation/01_numpy_exercises/_exo_lln_en.qmd" >}}
753+
754+
::::
755+
756+
{{< include "/content/manipulation/01_numpy_exercises/_exo_lln_correction.qmd" >}}
757+
758+
## Distribution de résultats de lancer de pièces
759+
760+
::: {.callout-tip}
761+
## Exercice 6, partie 2. Moivre-Laplace (binomiale)
762+
763+
On considère une suite i.i.d. $(X_i)_{i \ge 1}$ telle que $X_i \sim \mathcal{B}(100,1/2)$ (nombre de piles sur 100 lancers d’une pièce équilibrée).
764+
765+
1. Représenter graphiquement la loi de $X_1$ (fonction de masse) : $k \mapsto \mathbb{P}(X_1=k)$ pour $k \in \{0,\dots,100\}$.
766+
2. Calculer la moyenne $\mu=\mathbb{E}[X_1]$ et la variance $\sigma^2=\mathrm{Var}(X_1)$. Donner leurs valeurs numériques.
767+
3. Pour une valeur $N$ (par exemple $N \in \{50,200,1000,5000\}$), générer $X_1,\dots,X_N$ i.i.d. et calculer $\bar X_N = \frac{1}{N}\sum_{i=1}^N X_i$.
768+
4. En répétant l’expérience un grand nombre de fois, représenter la distribution empirique de
769+
$$
770+
Y_N = \sqrt{N}\,(\bar X_N-\mu).
771+
$$
772+
5. Sur la même figure, superposer la densité de la loi normale $\mathcal{N}(0,\sigma^2)$. Dans ce cas, on doit obtenir $\sigma^2=25$.
773+
774+
:::
775+
776+
::: {.callout-tip}
777+
## Exercice 6, partie 3. TCL pour d’autres lois (variance finie)
778+
779+
Choisir une loi parmi : Poisson, exponentielle, uniforme (au choix), en précisant ses paramètres. On considère une suite i.i.d. $(X_i)_{i \ge 1}$ suivant cette loi, de moyenne $\mu$ et variance $\sigma^2$ (finies).
780+
781+
1. Donner (ou calculer) $\mu$ et $\sigma^2$ pour la loi choisie.
782+
2. Pour plusieurs valeurs de $N$, en répétant l’expérience un grand nombre de fois, représenter la distribution empirique de
783+
$$
784+
Y_N = \sqrt{N}\,(\bar X_N-\mu)
785+
$$
786+
et la comparer à la densité de la loi normale $\mathcal{N}(0,\sigma^2)$.
787+
3. Option : étudier aussi la version standardisée
788+
$$
789+
Z_N = \sqrt{N}\,\frac{\bar X_N-\mu}{\sigma}
790+
$$
791+
et la comparer à $\mathcal{N}(0,1)$.
792+
793+
:::
794+
795+
::: {.callout-tip}
796+
## Exercice 6, partie 4. Contre-exemple : loi de Cauchy
797+
798+
On considère maintenant une suite i.i.d. $(X_i)_{i \ge 1}$ suivant une loi de Cauchy standard.
799+
800+
1. Générer un vecteur `X` de taille `N_max` suivant une loi de Cauchy standard.
801+
2. Pour chaque valeur $n$ de `grid`, calculer la moyenne empirique $\bar X_n = \frac{1}{n}\sum_{i=1}^n X_i$ et tracer $\bar X_n$ en fonction de $n$.
802+
3. Le comportement observé ressemble-t-il à une convergence vers une constante ? Comparer qualitativement avec la partie 1.
803+
4. La LGN et le TCL "classiques" s’appliquent-ils ici ? Justifier en discutant l’existence (ou non) de $\mu$ et de $\sigma^2$.
804+
805+
:::
806+
709807

710808
::: {.content-visible when-profile="fr"}
711809

712810
# _Broadcasting_
713811

714812
Le *broadcasting* désigne un ensemble de règles permettant
715-
d'appliquer des opérations sur des tableaux de dimensions différentes. En pratique,
716-
cela consiste généralement à appliquer une seule opération à l'ensemble des membres d'un tableau `numpy`.
813+
d'appliquer des opérations sur des tableaux de dimensions différentes. En pratique, cela consiste généralement à appliquer une seule opération à l'ensemble des membres d'un tableau `numpy`.
717814

718815
La différence peut être comprise à partir de l'exemple suivant. Le *broadcasting* permet
719816
de transformer le scalaire `5` en *array* de dimension 3:
@@ -762,8 +859,8 @@ lang = "fr"
762859
```
763860

764861

765-
{{< include "01_numpy_exercises/_exo6_fr.qmd" >}}
766-
{{< include "01_numpy_exercises/_exo6_solution.qmd" >}}
862+
{{< include "01_numpy_exercises/_exo_knn_fr.qmd" >}}
863+
{{< include "01_numpy_exercises/_exo_knn_solution.qmd" >}}
767864

768865

769866
Ai-je inventé cet exercice corsé ? Pas du tout, il vient de l'ouvrage [_Python Data Science Handbook_](https://jakevdp.github.io/PythonDataScienceHandbook/02.08-sorting.html#Example:-k-Nearest-Neighbors). Mais, si je vous l'avais indiqué immédiatement, auriez-vous cherché à répondre aux questions ?
@@ -784,8 +881,8 @@ lang = "en"
784881
```
785882

786883

787-
{{< include "01_numpy_exercises/_exo6_en.qmd" >}}
788-
{{< include "01_numpy_exercises/_exo6_solution.qmd" >}}
884+
{{< include "01_numpy_exercises/_exo_knn_en.qmd" >}}
885+
{{< include "01_numpy_exercises/_exo_knn_solution.qmd" >}}
789886

790887

791888
Did I invent this challenging exercise? Not at all, it comes from the book [_Python Data Science Handbook_](https://jakevdp.github.io/PythonDataScienceHandbook/02.08-sorting.html#Example:-k-Nearest-Neighbors). But if I had told you this immediately, would you have tried to answer the questions?
@@ -828,3 +925,6 @@ Site 1 is quite central because it is referenced twice. Site 5 is also central s
828925
v
829926
```
830927
:::
928+
929+
930+

content/manipulation/01_numpy_exercises/_exo6_en.qmd renamed to content/manipulation/01_numpy_exercises/_exo_knn_en.qmd

File renamed without changes.

content/manipulation/01_numpy_exercises/_exo6_fr.qmd renamed to content/manipulation/01_numpy_exercises/_exo_knn_fr.qmd

File renamed without changes.

content/manipulation/01_numpy_exercises/_exo6_solution.qmd renamed to content/manipulation/01_numpy_exercises/_exo_knn_solution.qmd

File renamed without changes.

0 commit comments

Comments
 (0)