Skip to content

Les lois usuelles en NumPy ​

scipy.stats expose chaque loi à travers une interface unique : pmf, cdf, rvs, mean, var. Ce projet consiste à recoder cette interface en NumPy pur, pour les lois du catalogue du chapitre 1, y compris la simulation rvs, qui ne devra utiliser que des tirages uniformes rng.random(). C'est la démarche de tout le cours : faire l'outil à la main une fois, pour comprendre exactement ce que fait la bibliothèque, puis ne plus utiliser que la bibliothèque.

1. Lien avec le cours ​

Le projet met en œuvre l'intégralité du chapitre 1 : les fiches des lois discrètes et continues fournissent chaque PMF, PDF, CDF et les moments ; la simulation de Monte-Carlo sert de banc de validation.

2. Structure du code ​

Chaque loi est une classe au gabarit imposé, celui de scipy.stats : les paramètres θ à la construction, les mêmes noms de méthodes.

python
class Bernoulli:
    """Bernoulli law, scipy.stats-like API, pure NumPy."""

    def __init__(self, p):
        self.p = p

    def pmf(self, k):
        """P(X = k)."""
        ...

    def cdf(self, k):
        """P(X <= k)."""
        ...

    def rvs(self, size, rng):
        """size draws, using rng.random() only."""
        ...

    def mean(self):
        ...

    def var(self):
        ...

Tests imposés. Pour chacune des sept lois : test_mean (gabarit des modalités communes), et un test structurel, la PMF somme à 1 sur le support (discret) ou la densité s'intègre à 1 (continu), la CDF est croissante de 0 à 1.

3. Travail demandé ​

  1. Les lois discrètes. Implémenter Bernoulli(p), Binomiale(n, p), Geometrique(p) et Poisson(lam) : pmf par la formule de la fiche, cdf par sommation, moments par les formules du cours. Pour rvs, utiliser la transformation inverse : tirer u∼U(0,1) et retenir la première valeur k telle que FX(k)≥u. Vérifier sur la Bernoulli que cette méthode se réduit à u < p.
  2. Les lois continues. Implémenter Uniforme(a, b) et Exponentielle(lam) : pour rvs, inverser la CDF analytiquement (x=FX−1(u), à démontrer pour l'exponentielle). Implémenter Normale(mu, sigma2) : la CDF n'ayant pas de forme fermée, coder cdf par intégration numérique de la densité, et rvs par la transformation de Box-Muller, donnée : z=−2ln⁡u1cos⁡(2πu2) produit une N(0,1) à partir de deux uniformes.
  3. Validation contre scipy. Pour chaque loi, confronter pmf/pdf, cdf, mean et var à scipy.stats sur une grille de valeurs : les écarts doivent être numériquement négligeables. Présenter la comparaison dans un tableau.
  4. Validation Monte-Carlo. Pour chaque loi, tirer 100000 réalisations avec votre rvs, superposer l'histogramme à la PMF ou densité théorique, et confronter moyenne et variance empiriques aux moments. C'est le protocole des fiches du cours, appliqué à votre propre code.
  5. Le bon outil. Refaire le tableau de l'étape 3 en une cellule avec scipy.stats seul. Conclure en deux phrases : qu'avez-vous appris en le codant à la main, et pourquoi ne plus jamais le refaire ?

4. Livrables ​

Le notebook reproductible des modalités communes, avec le module de classes, les figures histogramme/théorie des sept lois, et les deux tableaux de validation. Ces classes resserviront dans les autres projets du chapitre.