# Manifeste des figures — Probas/PyMC

Provenance des images de `assets/readme/` (EPIC #5654, source 1 = extraction d'outputs de notebooks).
**Audit G.1 c.483 (2026-07-14, doctrine #5780)** : migration vague-1 → standard avec section *Contenu réel vérifié* + *Ce qui n'est PAS dans la figure* par figure. **Bilan : 3 ACCURATE sans correction + 3 corrections réelles** (pymc2, pymc5, pymc15). 50% bug-rate, cohérent avec familles à dominante matplotlib (L478-L1 — rigueur variable selon auteur).

> **Migration c.761 (2026-07-22, doctrine #5780, asset-side enforcement)** : ajout du champ canonique `Description visuelle` aux 6 entrées. Source = vision-QA MiniMax M3 (Read direct des PNG) + stats RGB PIL. Conformité avec le détecteur `scripts/notebook_tools/detect_manifest_field.py` (PR #7819 c.754). Le champ `Contenu réel vérifié` (audit c.483 po-2025) reste en place comme preuve falsifiable détaillée ; le nouveau `Description visuelle` est la version canonique courte destinée à l'extraction automatique et au lecteur rapide. **6/6 figures conformes au détecteur.** Tranche-5 de la migration opportuniste après les 4 familles SymbolicLearning (c.754 #7819), Part4-Metaheuristics (c.755 #7824), SemanticWeb (c.756 #7826) et ML.Net (c.757 #7830).

## pymc2-gaussian-mixtures.png

- **Source** : notebook `PyMC-02-Gaussian-Mixtures.ipynb` (cellule 4, output 6)
- **Description visuelle** : Figure matplotlib 2 panneaux KDE ArviZ côte à côte (1173×550, fond blanc quasi-pur), titrée « Posterior : moyenne et precision du temps de trajet ». Gauche : densité postérieure `mu` (courbe bleue, pic mean=16, 94% HDI [14, 18], axe 10-22, barre HDI noire horizontale en bas). Droite : densité postérieure `tau` (courbe bleue, pic mean=0.081, 94% HDI [0.025, 0.14], axe 0.00-0.25, barre HDI noire horizontale). Stats RGB PIL : moyenne (250.25, 250.81, 251.21), std (30.67, 27.82, 26.59) — toutes les moyennes >250, std faible = **fond blanc quasi-pur** typique des KDE ArviZ authentiques sur blanc, sans marqueur ni légende. Cohérent avec un **inférence bayésienne sur modèle Normal simple** (sortie ArviZ `plot_posterior` 2 panels μ/τ).
- **Alt-text (FR)** : Inférence bayésienne sur les temps de trajet : postérieures de la moyenne (μ) et de la précision (τ) du modèle Normal simple.
- **Poids** : 44.4 KB (PIL optimisé)
- **Contenu réel vérifié (2026-07-14, c.483)** : **2 panneaux de densité postérieure ArviZ** : gauche `mu` mean=16, 94% HDI [14, 18], axe 10-22 ; droite `tau` mean=0.081, 94% HDI [0.025, 0.14], axe 0-0.25. Title « Posterior : moyenne et precision du temps de trajet ». KDE posteriors ArviZ authentiques, avec barres HDI noires.
- **Ce qui n'est PAS dans la figure** : aucun mélange de gaussiennes n'est visible (le « Gaussian Mixtures » du nom de fichier et de l'alt-text v1 fait référence au *notebook source*, pas au *contenu de cette cellule précise* — le notebook PyMC-2 illustre le modèle Normal simple sur les temps de trajet AVANT d'aborder le modèle de mélange dans les cellules ultérieures, ex. cell[16] `sigma_components`). Alt-text v1 sur-vendeur corrigé.

## pymc5-irt-curves.png

- **Source** : notebook `PyMC-07-Skills-IRT.ipynb` (cellule 15, output 3)
- **Description visuelle** : Courbe ROC matplotlib (690×590, fond blanc) titrée « Courbe ROC - Modele IRT ». Axes standard ROC : X « Taux de faux positifs » (0.0-1.0), Y « Taux de vrais positifs » (0.0-1.0). **Une seule courbe en escalier bleue pleine** « IRT (AUC = 0.788) » + **diagonale pointillée noire** « Aleatoire » (référence hasard, ligne y=x). Légende interne coin haut-gauche (2 entrées). Stats RGB PIL : moyenne (249.09, 249.09, 250.90), std (35.07, 35.07, 28.93) — **R=G (249/249)** signature d'une diagonale pointillée pure (la courbe IRT bleue tire B vers le bas à 250.90). Pas d'autres marqueurs ni séries. Cohérent avec une **évaluation ROC sklearn** sur modèle IRT binaire.
- **Alt-text (FR)** : Évaluation IRT : courbe ROC du modèle sur la prédiction de réussite aux items, AUC=0.788 au-dessus du hasard.
- **Poids** : 29.3 KB (PIL optimisé)
- **Contenu réel vérifié (2026-07-14, c.483)** : **Courbe ROC sklearn-style** : axe x « Taux de faux positifs » 0-1, axe y « Taux de vrais positifs » 0-1, courbe bleue IRT (AUC=0.788) + diagonale pointillée noire « Aleatoire ». Title « Courbe ROC - Modele IRT ».
- **Ce qui n'est PAS dans la figure** : aucune « courbe de réponse aux items » au sens IRT canonique (probabilité de bonne réponse vs compétence latente) n'est tracée — il s'agit d'une **évaluation** (discrimination binaire items réussis/échoués), pas des courbes ICC/IFT du modèle. Alt-text v1 confondait l'objet IRT avec son évaluation ; corrigé pour décrire ce que la figure MONTRE.

## pymc11-sequences.png

- **Source** : notebook `PyMC-14-Sequences.ipynb` (cellule 14, output 0)
- **Description visuelle** : Figure matplotlib 2 subplots empilés verticalement (989×489, fond blanc), partagée axe X temporel « Temps » (0-7). Haut subplot titré « Classification independante (sans transitions) » : barres empilées P(haut) orange + P(bas) bleu ciel, axe Y 0.0-1.0 « Probabilite ». Annotations texte rouge « ambigu » sur les barres des temps 2 et 5 (où la classification hésite). Bas subplot titré « Forward-Backward (avec transitions) » : même structure barres mais avec une **bande orange naissante au temps 2** (P(haut) non nulle) + annotations texte vert « lisse » sur temps 2 et 5 (transitions propageant l'incertitude). Légende interne droite (2 entrées : P(haut) orange, P(bas) bleu ciel). Stats RGB PIL : moyenne (209.74, 197.49, 199.05), std (65.16, 59.04, 70.77) — **std élevé sur les 3 canaux** signature de barres colorées saturées orange+bleu occupant ~50% de la hauteur. Cohérent avec un **comparatif HMM Forward-Backward vs classification i.i.d.** (smoothing via transitions).
- **Alt-text (FR)** : Inférence sur séquences : comparatif HMM Forward-Backward vs classification indépendante, où les transitions lissent les états ambigus.
- **Poids** : 30.2 KB (PIL optimisé)
- **Contenu réel vérifié (2026-07-14, c.483)** : **2 panneaux empilés** : haut « Classification independante (sans transitions) » — barres verticales P(haut)/P(bas) avec labels rouges « ambigu » sur temps 2 et 5 ; bas « Forward-Backward (avec transitions) » — même structure mais labels verts « lisse » sur les mêmes temps (probabilités moins tranchées sur 2 et 5, transitions propageant l'incertitude). Axe x « Temps » 0-7.
- **Verdict** : VRAI — la figure illustre précisément le bénéfice du HMM (transitions → lissage) face à la classification i.i.d.

## pymc12-recommenders.png

- **Source** : notebook `PyMC-15-Recommenders.ipynb` (cellule 48, output 0)
- **Description visuelle** : Figure matplotlib 2 panneaux côte à côte (1200×423, fond blanc). Gauche « Sources vs Score latent » : **barplot grouped** par Document (0-5, axe X), axe Y « Score » (0-5), avec **3 barres groupées par document** : bleu « Jugements », orange « Score latent », vert « Clics (rescaled) ». Hauteur quasi identique des 3 barres par document (le score latent suit les sources observées). Légende interne haut-droit. Droite « Distributions posterieures des scores » : **6 histogrammes ArviZ superposés** colorés par Document (0-5, palette 6 couleurs pastel : Doc 0 bleu, Doc 1 orange, Doc 2 vert, Doc 3 rouge, Doc 4 violet, Doc 5 marron), axe X « Score latent » (1-6), axe Y « Frequence » (0-500), un histogramme par document avec des distributions gaussiennes-like empilées en couches. Légende interne droite (6 entrées). Stats RGB PIL : moyenne (221.20, 222.74, 213.69), std (63.19, 48.11, 66.40) — std modéré sur les 3 canaux, signature de barres groupées 3-couleurs à gauche + histogrammes 6-couleurs à droite. Cohérent avec un **système de recommandation bayésien à facteurs latents** (estimations ponctuelles à gauche, posteriors d'incertitude à droite).
- **Alt-text (FR)** : Système de recommandation bayésien : facteurs latents par document (estimations ponctuelles vs distributions postérieures d'incertitude).
- **Poids** : 58.4 KB (PIL optimisé, downscale manuel 1389→1200 px — voir note PR)
- **Contenu réel vérifié (2026-07-14, c.483)** : **2 panneaux côte à côte** : gauche « Sources vs Score latent » — barplot grouped par Document (0-5) avec 3 barres (Jugements bleu, Score latent orange, Clics rescaled vert), score 0-5 ; droite « Distributions posterieures des scores » — histogrammes ArviZ par Doc 0-5 (6 couleurs), axe x « Score latent » 1-6, axe y « Frequence » 0-500.
- **Verdict** : VRAI — la structure pédagogique est exactement « facteurs latents estimés » : le barplot de gauche compare trois sources observées au score latent inféré, les histogrammes de droite montrent l'incertitude postérieure sur ce score par document.

## pymc13-mcmc-diagnostics.png

- **Source** : notebook `PyMC-02b-Debugging-Python.ipynb` (cellule 21, output 6)
- **Description visuelle** : Figure ArviZ grille 2×2 (1189×413, fond blanc quasi-pur) avec **title général centré** « Trace plots : verifier le melange des chaines ». 4 panneaux : ligne 1 « hyper_mean » avec à gauche une **densité KDE bleue** (overlay 4 chaînes en pointillés + courbe pleine, axe X -10 à 17, pic ~5) + à droite un **trace plot** (axe X 0-2000 samples, axe Y -10 à 20, oscillation dense bleue semi-transparente autour de 5 + rug plot noir en bas marquant les samples) ; ligne 2 « hyper_sigma » symétrique (densité KDE à gauche, axe X 0.0-17.5, pic ~2, queue étalée vers 7+ ; trace plot à droite, axe Y 0-15, oscillations 0-10). Pas de panneau numérique R-hat/ESS visible. Stats RGB PIL : moyenne (233.16, 237.48, 240.46), std (55.07, 47.46, 44.17) — **B plus haut que R** (240 vs 233), std modéré typique d'une grille 2×2 sur fond pâle avec beaucoup de pixels bleus (KDE + trace dense). Cohérent avec un **diagnostic MCMC ArviZ `plot_trace` standard** (densité KDE + trace, **pas de R-hat/ESS numérique**).
- **Alt-text (FR)** : Diagnostics MCMC : vérification visuelle du mélange des chaînes via KDE postérieure et trace plot pour les hyperparamètres.
- **Poids** : 142.1 KB (PIL optimisé)
- **Contenu réel vérifié (2026-07-14, c.483)** : **4 panneaux ArviZ en grille 2×2** : ligne 1 « hyper_mean » (densité KDE à gauche + trace plot 0-2000 samples à droite) ; ligne 2 « hyper_sigma » (densité KDE + trace). Title général « Trace plots : verifier le melange des chaines ».
- **Ce qui n'est PAS dans la figure** : aucun R-hat ni ESS n'est affiché directement (pas de panneau numérique) — le diagnostic est **purement visuel** (KDE + trace), conformément au title. Alt-text v1 mentionnait R-hat et ESS comme « vérifient la convergence » mais la figure montre seulement le mélange des chaînes via KDE et trace. Alt-text corrigé pour refléter ce qui est réellement visible.

## pymc15-sparse-gp.png

- **Source** : notebook `PyMC-16-Sparse-Gaussian-Process.ipynb` (cellule 14, output 2)
- **Description visuelle** : Figure matplotlib 2 **contour plots côte à côte** (1174×533, axes x1/x2 ∈ [-2, 2]) titrée « Classification GP probit sur le donut ». Gauche « Probabilite predite P(classe 1) » : **colormap bleu→rouge** (échelle 0.0-1.0, palette RdBu_r inversée), **frontière de décision en courbe noire** (isosurface P=0.5) en forme de beignet/donut, points bleus (classe 0) au centre du donut + carrés rouges (classe 1) en couronne extérieure, colorbar verticale à droite (8 ticks). Droite « Incertitude (ecart-type de f*) » : **colormap jaune→orange** (échelle 0.725-1.025, palette YlOrBr), contour concentriques en bandes jaune-clair au centre (faible incertitude) → orange-foncé aux coins (forte incertitude), carrés noirs en couronne (les points « test » vus en noir), colorbar verticale à droite (8 ticks). Stats RGB PIL : moyenne (235.26, 208.12, 183.66), std (44.73, 68.10, 95.39) — **R > G > B** avec std énorme sur B (95.39) signature du contour plot colormap **bleu→rouge à gauche** (tire les bleus vers le bas) + **jaune→orange à droite** (tire les bleus encore plus bas). Cohérent avec une **classification GP probit 2D dense sur jouet donut** (sans inducing points visibles — voir *Ce qui n'est PAS dans la figure*).
- **Alt-text (FR)** : Classification par Processus Gaussien sur un problème jouet en « donut » : probabilité prédite de la classe 1 et incertitude associée (écart-type de f*), sans inducer points (illustration dense classique).
- **Poids** : 60.1 KB (PIL optimisé)
- **Contenu réel vérifié (2026-07-14, c.483)** : **2 panneaux côte à côte** : gauche « Probabilite predite P(classe 1) » — contour plot x1∈[-2,2], x2∈[-2,2], colormap bleu→rouge (échelle 0-1), points bleus (classe 0) au centre + carrés rouges (classe 1) en couronne, frontière de décision en noir ; droite « Incertitude (ecart-type de f*) » — contour plot colormap jaune→orange (échelle 0.725-1.025), mêmes axes et points (carrés noirs cette fois). Title « Classification GP probit sur le donut ».
- **Ce qui n'est PAS dans la figure** : aucun **inducing point** (le « sparse » de l'alt-text v1) n'est visible — il s'agit d'un **GP classification 2D dense classique** sur un problème jouet en donut, PAS d'un sparse GP avec inducteurs. Le notebook `PyMC-16-Sparse-Gaussian-Process.ipynb` introduit probablement les inducteurs dans des cellules ultérieures ; la cellule 14 output 2 illustre le pré-requis (GP dense jouet). Alt-text v1 sur-vendeur corrigé pour refléter ce qui est réellement affiché.
