Simulation par tableur ou Python

2ndeMathematiquesÉchantillonnage et simulationSimulation par tableur ou Python~8 min de lecture

Simulation par tableur ou Python

Simuler, c'est faire jouer le hasard à un ordinateur des milliers de fois en quelques secondes, pour observer comment les fréquences se comportent et estimer une probabilité.

Objectifs

  • Comprendre ce qu'est une simulation d'expérience aléatoire.
  • Utiliser les fonctions de hasard du tableur (ALEA, ALEA.ENTRE.BORNES) et de Python (module random).
  • Calculer la fréquence d'un résultat sur un échantillon de taille \(n\).
  • Observer la fluctuation d'échantillonnage et utiliser l'intervalle \(\left[p - \frac{1}{\sqrt{n}}\,;\,p + \frac{1}{\sqrt{n}}\right]\).

1. Expérience aléatoire, échantillon, fréquence

Exemple : sur 50 lancers d'un dé, le 6 sort 11 fois. Sa fréquence est \(f = \dfrac{11}{50} = 0{,}22\). La probabilité théorique est \(\dfrac{1}{6} \approx 0{,}167\) : la fréquence observée est proche, mais pas égale.

On lance une pièce 200 fois et on obtient 94 « face ». Quelle est la fréquence de « face » ?

  1. 0,94
  2. 0,47
  3. 0,5
\(f = \dfrac{94}{200} = 0{,}47\). 0,5 est la probabilité théorique, pas la fréquence observée.

2. Simuler avec un tableur

  • =ALEA() donne un nombre décimal au hasard entre 0 (compris) et 1 (non compris).
  • =ALEA.ENTRE.BORNES(1;6) donne un entier au hasard entre 1 et 6 : c'est un lancer de dé.
  • =ENT(ALEA()*6)+1 fait la même chose : ALEA()*6 est entre 0 et 6 (exclu), sa partie entière est 0, 1, 2, 3, 4 ou 5, et on ajoute 1.
  • =SI(ALEA()<0,3;1;0) donne 1 avec une probabilité de 0,3 et 0 sinon : c'est une épreuve « succès ou échec ».
  • =NB.SI(A1:A1000;6)/1000 calcule la fréquence des 6 dans les cellules A1 à A1000.

Exemple résolu

Dans un sac, Fatou a mis 3 billes rouges et 7 billes bleues. Elle tire une bille, note sa couleur, la remet. Écrire une formule de tableur qui simule un tirage (1 si rouge, 0 si bleue), puis la formule de la fréquence des rouges sur 500 tirages placés en B1:B500. Cherche d'abord.

Voir la solution

La probabilité de tirer une rouge est \(\dfrac{3}{10} = 0{,}3\). Dans B1 : =SI(ALEA()<0,3;1;0), recopiée jusqu'à B500.

Fréquence des rouges : =SOMME(B1:B500)/500 (la somme compte les 1, c'est-à-dire les rouges). On peut aussi écrire =NB.SI(B1:B500;1)/500.

Quels nombres peut renvoyer la formule =ENT(ALEA()*6)+1 ?

  1. Les entiers de 0 à 6
  2. Tous les décimaux entre 1 et 7
  3. Les entiers de 1 à 6
ENT(ALEA()*6) vaut 0, 1, 2, 3, 4 ou 5 (car ALEA()*6 < 6) ; en ajoutant 1, on obtient 1 à 6, comme un dé.

3. Simuler avec Python

On importe le module random :

  • random.randint(1, 6) : entier au hasard entre 1 et 6, bornes comprises.
  • random.random() : décimal au hasard entre 0 (compris) et 1 (non compris), comme ALEA().

Le schéma ci-dessous montre la logique de toute simulation :

flowchart LR
  A[Compteur a 0] --> B[Tirage au hasard]
  B --> C{Succes}
  C -- oui --> D[Ajouter 1]
  C -- non --> E[Rien]
  D --> F[Repeter n fois]
  E --> F
  F --> G[Frequence egale compteur sur n]

Voici une fonction qui simule \(n\) tirages dans le sac de Fatou et renvoie la fréquence des billes rouges :

import random

def frequence_rouge(n):
    rouges = 0
    for i in range(n):
        if random.random() < 0.3:
            rouges = rouges + 1
    return rouges / n

print(frequence_rouge(1000))

Exemple résolu : lire un programme

Que renvoie la fonction ci-dessous, et vers quelle valeur ce résultat s'approche-t-il quand \(n\) est grand ?

import random

def mystere(n):
    c = 0
    for i in range(n):
        if random.randint(1, 6) == 6:
            c = c + 1
    return c / n
À chaque tour, on lance un dé (random.randint(1, 6)) et on ajoute 1 au compteur c si on obtient 6.
Après \(n\) tours, c est le nombre de 6 obtenus ; la fonction renvoie c / n, la fréquence des 6.
Quand \(n\) devient grand, cette fréquence se rapproche de la probabilité \(\dfrac{1}{6} \approx 0{,}167\).

Quelle instruction Python simule un lancer de dé ?

  1. random.randint(1, 6)
  2. random.randint(0, 6)
  3. random.random() * 6
randint(1, 6) donne un entier de 1 à 6, bornes comprises. randint(0, 6) peut donner 0, et random.random()*6 donne un décimal.

4. Fluctuation d'échantillonnage

Fais varier \(p\) avec le curseur : les deux courbes donnent les bornes de l'intervalle selon la taille \(n\) de l'échantillon (en abscisse). Elles se rapprochent de \(p\) quand \(n\) grandit.

Exemple résolu

Un producteur de mangues de Korhogo annonce que 30 % de ses mangues sont assez grosses pour l'export. Un acheteur prend au hasard 100 mangues et en trouve 42 assez grosses. Doit-il douter de l'annonce ? Cherche d'abord.

On a \(p = 0{,}3\) et \(n = 100\) : les conditions \(n \ge 25\) et \(0{,}2 \le p \le 0{,}8\) sont vérifiées.
\(\dfrac{1}{\sqrt{100}} = \dfrac{1}{10} = 0{,}1\). L'intervalle est \([0{,}3 - 0{,}1\,;\,0{,}3 + 0{,}1] = [0{,}2\,;\,0{,}4]\).
Fréquence observée : \(f = \dfrac{42}{100} = 0{,}42\), en dehors de \([0{,}2\,;\,0{,}4]\).
Une telle fréquence n'arrive que dans environ 5 % des échantillons si l'annonce est vraie : l'acheteur a de bonnes raisons de douter de l'annonce (sans en être absolument certain).

Pour \(p = 0{,}5\) et des échantillons de taille \(n = 400\), quel est l'intervalle de fluctuation ?

  1. \([0{,}4\,;\,0{,}6]\)
  2. \([0{,}45\,;\,0{,}55]\)
  3. \([0{,}49\,;\,0{,}51]\)
\(\sqrt{400} = 20\), donc \(\frac{1}{20} = 0{,}05\) : intervalle \([0{,}45\,;\,0{,}55]\).

Erreurs fréquentes

  • Confondre fréquence observée et probabilité.
  • Écrire 0,3 au lieu de 0.3 en Python, ou 0.3 au lieu de 0,3 dans un tableur en français.
  • Utiliser random.randint(0, 6) pour un dé (le 0 n'existe pas sur un dé).
  • Tirer une conclusion à partir d'un tout petit échantillon.
  • Oublier de vérifier les conditions \(n \ge 25\) et \(0{,}2 \le p \le 0{,}8\) avant d'utiliser l'intervalle.

Récapitulatif

  • Simuler = remplacer une expérience aléatoire par des tirages faits par une machine, avec les mêmes probabilités.
  • Tableur : ALEA(), ALEA.ENTRE.BORNES(1;6), SI(ALEA()<p;1;0), NB.SI.
  • Python : random.random(), random.randint(a, b), une boucle for et un compteur.
  • La fréquence fluctue d'un échantillon à l'autre, et se stabilise autour de \(p\) quand \(n\) grandit.
  • Environ 95 % des fréquences tombent dans \(\left[p - \frac{1}{\sqrt{n}}\,;\,p + \frac{1}{\sqrt{n}}\right]\).
Fréquence
Effectif du résultat divisé par la taille \(n\) de l'échantillon.
ALEA.ENTRE.BORNES(1;6)
Entier au hasard de 1 à 6 dans le tableur : un lancer de dé.
random.random()
Décimal au hasard entre 0 et 1 en Python ; « < p » simule un succès de probabilité p.
Fluctuation d'échantillonnage
La fréquence change d'un échantillon à l'autre, moins quand \(n\) est grand.
Intervalle de fluctuation
\(\left[p - \frac{1}{\sqrt{n}}\,;\,p + \frac{1}{\sqrt{n}}\right]\), contient environ 95 % des fréquences.

Teste tes connaissances sur ce cours

Crée ton compte gratuitement pour accéder aux quiz associés et suivre ta progression.