Des simulations d'échantillonnage

Simulations d'échantillonnage avec Python

Parmi les capacités attendues des élèves de seconde, le programme de l’Éducation nationale indique le point suivant : « simuler \(N\) échantillons de taille \(n\) d’une expérience aléatoire à deux issues. Si \(p\) est la probabilité d’une issue et \(f\) sa fréquence observée dans un échantillon, calculer la proportion des cas où l’écart entre p et f est inférieur ou égal à \(\frac{1}{\sqrt{n}}.\) »

Avec un point du programme aussi précis qu’un énoncé d’exercice, toute fantaisie risque d’être malvenue. Alors répondons précisément à cette injonction.

Il est préférable d’avoir lu au préalable la page sur les intervalles de fluctuation et d’échantillonnage.

 

Rappels de Python

Un élève de seconde doit être familiarisé avec le langage Python. Les chapitres concernant les probabilités réclament l’importation du module random (voir la page d’expériences aléatoires avec Python).

Le module math comprend quant à lui la fonction sqrt (racine carrée). Rappelons en outre que la valeur absolue d’un nombre (abs) est toujours positive. Ainsi la valeur absolue de -1 est 1.

En seconde, les programmes écrits en Python sont toujours présentés sous forme de fonctions. Sur ce site, nous partons du principe que l’on n’apprend pas l’informatique avec des morceaux de programmes qui, utilisés seuls, ne peuvent être vérifiés. C’est pourquoi nous intégrons toujours les fonctions dans des algorithmes que vous pouvez réécrire dans un éditeur.

 

Un commerçant désœuvré

Nous allons partir d’un exemple mais les fonctions en Python sont réutilisables telles quelles sur d’autres exemples (évidemment, puisque c’est le principe d’une fonction !)

Un commerçant reçoit un carton qui contient 500 bougies de couleur indiscernables au toucher dont le fabricant certifie que \(40\%\) sont rouges.

Il tire une bougie du carton (sans regarder, ça doit rester une expérience aléatoire !), il note sa couleur puis la remet dans le carton. Il réitère l’expérience 100 fois (le commerçant a très peu de clients alors il n’a que ça à faire, le pauvre).

Mais soudain, les clients affluent. Notre commerçant n’ayant plus le temps de compter ses bougies lui-même, il demande à son ordinateur s’il veut bien simuler cette expérience. L’ordinateur accepte volontiers.

La fréquence

Rédigeons une fonction qui permet de déterminer une fréquence. Le principe consiste à entrer une proportion théorique \(p\) (comprise entre 0,2 et 0,8) puis à tirer des réels \(k\) au hasard, compris entre 0 et 1, et d’incrémenter un compteur r (nombre de bougies rouges) chaque fois que \(k\) est compris entre 0 et \(p.\)

Soit \(n\) l’effectif de l’échantillon.

def frequence(n,p):
    r = 0
    for k in range (n):
        if random() <= p:
            r = r + 1
    f = r/n
    return f

Pour faire fonctionner cette fonction :

from random import random
n = int(input("Taille échantillon : "))
p = float(input("Proportion : "))       
print(frequence(n,p))

 

L’écart

À présent, il s’agit de vérifier si l’écart entre \(f\) et \(p\) est bien inférieur à \(\frac{1}{\sqrt{n}}.\)

def ecart(n,f,p):
    if abs(p-f)<=1/sqrt(n):
        return("Dans l'intervalle")
    else:
        return("Hors intervalle")

Intégrons cette fonction dans un algorithme complet.

from math import *
n = int(input("Taille échantillon : "))
f = float(input("Fréquence :"))
p = float(input("Proportion : "))
print (ecart(n,f,p))

 

N échantillons

Il s’agit maintenant de répéter \(N\) fois les étapes précédentes. Nous allons légèrement modifier nos deux fonctions et les réunir en une seule (ci-dessous avec l’éditeur Spyder).

Afin que la fonction programme soit utilisable dans la fonction echantillons, nous avons remplacé "Dans l'intervalle" et "Hors intervalle" par 1 et 0. Cette modification permet de compter les échantillons dont la fréquence se situe dans l'intervalle.

Bien sûr, vous pouvez lancer dix fois ce programme et obtenir autant de résultats différents. Mais si vos paramètres \(n\) et \(N\) sont suffisamment grands (au moins une centaine), le résultat ne devrait pas être loin de 0,95 puisque c'est à ce seuil que les formules des intervalles sont valides.