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 uU(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=FX1(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=2lnu1cos(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.