Méthodologie
Sujet sensible : chaque indicateur ci-dessous est défini par sa formule exacte et sa source de données, pas par une appréciation qualitative.
Source des données
Open data officiel de l'Assemblée nationale (data.assemblee-nationale.fr) : scrutins (décompte nominatif par groupe et par député), amendements (texte intégral et exposé des motifs), acteurs/mandats/organes. Aucune donnée n'est déduite ou estimée par un modèle de langage à ce niveau — ce sont des faits enregistrés par l'Assemblée elle-même. Le lien source officiel est fourni pour chaque scrutin cité.
Indicateurs de vote
nb_exprimes / nb_scrutins_mandat
nb_scrutins_mandat = nombre de scrutins tenus pendant la fenêtre de mandat du député (mandat type_organe='ASSEMBLEE'), PAS le nombre de lignes vote_individuel existantes. Correction appliquée après vérification empirique : ~87% des blocs vote_groupe.decompteNominatif.nonVotants sont 'null' dans l'open data AN — un député absent sans être nommément listé n'a AUCUNE ligne vote_individuel pour ce scrutin (cas réel vérifié : un député en exercice sur toute la législature n'avait de ligne nommée que pour ~21% des scrutins). Utiliser le nombre de lignes nommées comme dénominateur aurait donc fortement surestimé la participation réelle. Pour les ~11% de votants sans mandat résolvable (voir 'identité non résolue'), le nombre total de scrutins de la législature est utilisé par défaut (repli conservateur, marqué 'nb_scrutins_mandat_estime').
nb_conformes / nb_exprimes
Parmi les votes exprimés, part où la position du député == position majoritaire de son groupe sur ce même scrutin (vote_groupe.position_majoritaire).
moyenne, par scrutin, de max(pour,contre,abst)/total_exprimes
Mesure la dispersion interne du groupe scrutin par scrutin, puis moyenne sur tous les scrutins où le groupe a voté. cohesion_std (écart-type de la même série par scrutin, affiché en barre d'erreur sur le graphique 'Taille du groupe et cohésion') indique si cette moyenne est stable scrutin après scrutin ou tirée par quelques votes atypiques.
0.6*score_indiscipline + 0.4*score_absenteisme
Pondération choisie et documentée (pas d'optimisation cachée). Un député n'entre dans le classement (eligible_classement=1) qu'à partir de 50 scrutins recensés, pour éviter qu'un petit échantillon fausse le résultat. Sont également exclus du classement (mais visibles dans le détail par député) : taux_participation < 0.05, tout député ayant occupé une fonction ministérielle/gouvernementale sur la période, et les non-inscrits (catégorie administrative sans ligne de groupe réelle — voir 'est_non_inscrit'). AVERTISSEMENT D'INTERPRÉTATION constaté empiriquement : le score brut est corrélé à la cohésion du groupe d'appartenance (un membre d'un groupe très cohésif comme LFI-NFP ou RN obtient mécaniquement un meilleur score, indépendamment de son comportement individuel) — préférer 'ecart_au_groupe' pour comparer des députés de groupes différents ou identifier de vrais dissidents.
groupe_abrege == 'NI'
'Non inscrit' est la catégorie administrative des députés sans groupe, pas un groupe politique avec une ligne à suivre. Mesurer leur 'discipline' par rapport à la coïncidence de vote entre non-inscrits n'a pas de sens. Constaté empiriquement : avant cette exclusion, NI était le groupe avec le pire score_classement moyen (0,43) — artefact de la métrique, pas un comportement distinctif des personnes concernées.
score_classement − moyenne(score_classement) des députés éligibles du même groupe
Réponse à 'ce député se démarque-t-il de ses propres collègues de groupe' plutôt qu'au score brut global (voir avertissement ci-dessus sur score_classement). Un écart positif signale une indiscipline/absentéisme supérieur à la moyenne de son propre groupe.
taux_participation < 0.10
La participation médiane réelle sur la législature est ~23% (voir définition corrigée de taux_participation) : ce seuil cible spécifiquement la queue basse, pas la moitié de l'hémicycle. Certaines fonctions gouvernementales (ex. porte-parole du Gouvernement, ministre délégué) n'apparaissent dans AUCUN mandat de l'open data AN et ne peuvent donc pas être détectées et exclues automatiquement (cas réels constatés : Maud Bregeon et Benjamin Haddad n'ont ni mandat MINISTERE ni GOUVERNEMENT dans les données malgré des fonctions gouvernementales connues). Ces profils restent dans le classement (on ne masque pas une participation réellement faible) mais sont signalés pour inciter à vérifier leur fonction avant toute interprétation individuelle. Ce seuil capture aussi, sans distinction, des cas où la faible participation peut avoir d'autres causes (éloignement géographique, état de santé, etc.) — le signal est délibérément neutre : il indique 'à vérifier', jamais 'coupable'.
somme(exprimés) / nb_total_acteurs, par type_vote_libelle
Calculée séparément car 8 339 des 8 434 scrutins de la législature sont des 'scrutins publics ordinaires' (essentiellement des votes sur amendements pris un par un), contre 72 'scrutins publics solennels' (votes finaux/de principe) et 23 motions de censure. Mesuré empiriquement : participation moyenne 89,4% sur les scrutins solennels contre 25,0% sur les scrutins ordinaires — la faible participation globale reflète le volume de votes de détail, pas un désintérêt pour les votes qui comptent le plus. participation_std (écart-type entre scrutins d'un même type, affiché en barre d'erreur) mesure la régularité de ce chiffre : un std élevé signale un type de scrutin hétérogène, pas une moyenne fiable.
somme(exprimés) / nb_total_acteurs, par mois civil
Tendance temporelle fournie pour vérifier la plausibilité (creux attendus lors des périodes de suspension de séance) plutôt que pour tirer une conclusion sur une amélioration ou dégradation dans le temps, qui nécessiterait un test statistique dédié non réalisé ici. participation_std (écart-type entre scrutins du même mois, affiché en barre d'erreur) distingue un mois à participation homogène d'un mois où quelques scrutins isolés tirent la moyenne.
n/a
Environ 11% des acteur_id référencés dans les votes (probables départs/remplacements en cours de législature) sont absents de l'archive open data 'acteurs'. Leurs votes et KPI sont conservés mais affichés sous 'identité non résolue (PA...)' plutôt que masqués ou attribués à un nom incorrect.
n/a
14 lignes vote_groupe (1 916 votes individuels, 336 députés distincts, répartis sur toute la législature) référencent un organe_id 'PO0' absent de la table organe — un identifiant technique de l'open data AN dont la signification exacte n'a pas été déterminée (probablement un cas de vote sans groupe attaché à ce moment précis). Impact vérifié comme négligeable : aucun député n'a 'PO0' comme groupe principal (groupe_abrege IS NULL : 0 cas), ces votes contribuent normalement à la discipline/participation individuelles mais n'apparaissent simplement pas comme un 'groupe' nommé dans l'onglet Groupes.
Les 6 profils comportementaux
Contrairement aux indicateurs de vote ci-dessus (purement factuels), les profils
fasciste, écocide, videur de droite et
videur de gauche reposent sur une classification du contenu des textes
et amendements — une interprétation, jamais un fait brut. Cette classification a été rédigée à la
main (lecture directe du texte, sans appel à l'API OpenAI, faute de clé configurée et parce que le
périmètre — borné aux scrutins majeurs — le permettait), par Claude (Anthropic), avec citation
systématique de l'extrait du texte source justifiant chaque catégorie. Voir
analysis/data/classification_scrutins_majeurs.json pour le détail complet, sourcé,
de chaque classification, et l'onglet Scrutins majeurs
pour les consulter scrutin par scrutin.
type_vote_libelle IN ('scrutin public solennel','motion de censure') + curation manuelle sourcée
Liste NON EXHAUSTIVE, volontairement — voir analysis/data/scrutins_majeurs.json pour chaque motif et ses sources. L'absence d'un scrutin de cette liste ne signifie pas qu'il est jugé mineur, seulement qu'il n'a pas été retenu pour cette version. Tous les compteurs ci-dessous sont bornés à la fenêtre de mandat réelle du député (voir kpi_depute/nb_scrutins_mandat), comme le reste du pipeline. Pour les ~11% d'acteurs sans mandat résolvable ('identité non résolue'), la fenêtre d'éligibilité est repliée sur l'étendue complète des scrutins majeurs (repli conservateur identique dans l'esprit à kpi_depute.nb_scrutins_mandat_estime) plutôt que de les exclure silencieusement de ces tables.
vote exprimé != position majoritaire du groupe, sur un scrutin majeur
Distinct du profil 'absent' : ne compte que les votes réellement exprimés (pour/contre/abstention).
aucun vote exprimé sur un scrutin majeur tenu pendant le mandat
Regroupe l'absence de ligne vote_individuel et la position explicite 'non_votant'.
vote 'pour' sur un scrutin majeur classé 'liberticide' (classification_scrutin)
Classification de contenu rédigée à la main (voir analysis/data/classification_scrutins_majeurs.json), chaque scrutin classé porte une justification sourcée citant le texte réel — jamais une classification sans justification. Le vote 'pour' est compté que le texte ait été adopté ou non (c'est l'acte de voter pour qui est mesuré, pas seulement son effet).
vote 'pour' sur un scrutin majeur classé 'anti_ecologie'
Même principe que 'fasciste' ci-dessus.
auteur d'un amendement classé 'vidage_droite'/'vidage_gauche', adopté
Un amendement n'est classé 'vidage' que s'il a été vérifié comme (a) une suppression/récriture substantielle d'une disposition, (b) porté par un groupe du bloc opposé à l'auteur du texte/de la disposition visée, (c) effectivement adopté. Blocs : gauche = ['EcoS', 'GDR', 'LFI-NFP', 'SOC'], droite = ['DR', 'RN', 'UDR'] (alliances officielles de la législature ; les groupes de la majorité/du centre ne sont volontairement rattachés à aucun bloc pour ce profil précis).
Volet « Hypocrites » (déclarations publiques vs votes réels)
Confronte les principes déclarés publiquement par les leaders/porte-parole officiels de chaque groupe (une déclaration d'un·e élu·e vaut pour tout son groupe) à leurs votes réels enregistrés, sur les législatures XVI (2022-2024) et XVII (2024-2026). Méthode en 3 étapes, chacune documentée dans son propre fichier source :
analysis/data/declarations_publiques.json — déclarations réellement publiées
(transcriptions/articles de presse citant une émission de télévision ou de radio précise, en tant qu'invité
politique), avec citation exacte, média, émission, date et URL source pour chacune. Corpus curé et concentré sur
les leaders/porte-parole officiels — volontairement non exhaustif (pas de scraping automatisé de
l'audiovisuel, aucun accès à une archive de ce type n'étant disponible).
analysis/data/principes_groupes.json — 3 à 6 principes par groupe, chacun
explicitement fondé sur des déclarations du corpus ci-dessus (jamais un principe inventé sans citation à
l'appui).
analysis/data/mise_en_regard.json — pour chaque couple (principe, scrutin réel), le
vote majoritaire effectif du groupe (donnée officielle Assemblée nationale, table vote_groupe) est
confronté factuellement à la déclaration citée. Statut à 3 valeurs strictement factuelles :
coherent / contradictoire / nuance (ce dernier pour les cas réels mais
ambigus — jamais un verdict binaire forcé). Rédigé à la main (revue manuelle sourcée), pas par appel API — même
mention de transparence que la classification des scrutins majeurs. Les noms de groupe diffèrent entre les deux
législatures (ex. « LFI-NUPES » en XVI vs « LFI-NFP » en XVII) — correspondance vérifiée empiriquement et
documentée dans analysis/load_mise_en_regard.py::GROUPE_LIBELLE_PAR_LEGISLATURE.
Un vote dont le sens confirme le principe déclaré mais avec moins de 70% du groupe effectivement
dans ce sens (« taux d'unité ») est requalifié nuancé plutôt que cohérent — sauf si la
faible mobilisation est elle-même le comportement prédit par le principe (ex. un principe de « refus d'aller
jusqu'à la censure » prédit un score de « pour » très bas sur une motion de censure : le score bas confirme alors
le principe, il n'est pas un signe de faiblesse). Une position d'abstention du groupe est présumée
nuancée quelle que soit son unité interne, sauf si le groupe l'assume publiquement comme équivalente
à un soutien ou une opposition. Cette règle chiffrée sert de déclencheur de vérification systématique, pas de
réécriture automatique — voir RAPPORT_hypocrites.md §2.3bis pour le détail complet de la relecture
qu'elle a déclenchée sur les 52 entrées existantes.
Angle distinct, indépendant du mécanisme ci-dessus : au lieu de confronter une déclaration à un
vote réel, confronte un élément de communication d'un groupe (point de programme, prise de parole) à un AUTRE
élément de communication de ce même groupe. Table contradiction_interne
(analysis/data/contradictions_internes.json, analysis/load_contradictions.py) — chaque
entrée cite les deux extraits exacts confrontés et une justification obligatoire. Seulement deux statuts
(contradictoire, nuance) : cette table ne recense que des tensions candidates identifiées
par lecture croisée délibérée, jamais une paire quelconque — pas de statut « cohérent » ici. Ajoutée comme
vérification indépendante du résultat « 0 contradictoire » de la mise en regard : si les groupes étaient
réellement incohérents, la tension devrait aussi apparaître dans ce qu'ils affirment, comparé à eux-mêmes, pas
seulement dans leurs votes.
Voir RAPPORT_hypocrites.md à la racine du dépôt pour la méthodologie complète et les
limites détaillées (biais de sélection du corpus, un seul « juge » pour la mise en regard, couverture XVI+XVII
uniquement, absence des non-inscrits — catégorie administrative sans ligne politique commune, même exclusion que le
reste du site).
Volet « Clown Slop » (vacuité du programme, des prises de parole et des résolutions)
Étiquette la part d'engagements — points de programme, prises de parole — qui n'engagent sur rien de vérifiable, plus un indicateur séparé de résolutions parlementaires sans portée normative. Trois flux distincts, chacun avec son propre niveau de preuve :
Un item est étiqueté slop=1 s'il remplit au moins un critère structurel : (1) aucun
mécanisme vérifiable (pas de loi/dispositif/chiffre/levier institutionnel nommé), (2) non falsifiable (impossible
de dire, même a posteriori, si l'engagement a été tenu), (3) reformule un consensus sans rien y ajouter de
distinctif. N'est PAS slop, même si le ton est emphatique : présence d'un chiffre/seuil/budget, d'un mécanisme
légal ou d'une institution nommée, d'un calendrier ou objectif mesurable, ou un acte normatif réel. Grille
appliquée SYMÉTRIQUEMENT aux 11 groupes — un test de spécificité/falsifiabilité, jamais d'alignement politique.
Chaque verdict (slop ou non) porte une justification_slop obligatoire, jamais un booléen nu — rédigée
à la main par Claude (Anthropic), non automatisée par API (aucune clé OPENAI_API_KEY configurée),
même mention de transparence que la classification des scrutins majeurs.
analysis/data/programme_groupes.json — points de programme tirés du programme
officiel de la campagne législative 2024 de chaque groupe (repli explicite, signalé item par item via
source_type, vers le programme présidentiel 2022 du parti concerné quand aucun programme législatif
distinct n'a été trouvé). Corpus borné (79 points au total sur cette version, 6 à 8 par groupe) — non exhaustif,
même limite que le reste du pipeline.
Réutilise le corpus declaration_publique du volet Hypocrites — les 42 déclarations
existantes ont été évaluées avec cette grille lors de l'introduction du volet Clown Slop.
analysis/scrutins_symboliques.py — détecte automatiquement, sans aucune lecture de
contenu ni appel WebSearch, les scrutins d'adoption finale de propositions de résolution prises sur le fondement
de l'article 34-1 de la Constitution. L'Assemblée nationale elle-même définit la résolution comme « un acte par
lequel l'Assemblée exprime une opinion sur une question déterminée » (fiche de synthèse officielle n°62, « Les
résolutions de l'article 34-1 de la Constitution »), sans pouvoir contenir d'injonction à l'égard du Gouvernement
(loi organique n° 2009-403 du 15 avril 2009) ni engager sa responsabilité — seuls les articles 49 et 50 de la
Constitution le permettent — un fait de doctrine constitutionnelle, pas une classification de contenu. Périmètre volontairement restreint à cette seule
catégorie de dossier (procedure_libelle = 'Résolution Article 34-1'), à l'exclusion de la catégorie
plus large « Résolution » qui mélange des résolutions déclaratoires et des résolutions à effet institutionnel réel
(ex. création de commission d'enquête) — élargir la règle aurait, à tort, étiqueté « sans impact » des textes ayant
un effet institutionnel réel. L'auteur (député initiateur, puis son groupe) est retrouvé dans l'archive brute de
l'Assemblée nationale (data/raw/<législature>/dossiers_legislatifs.json.zip, champ
initiateur — non conservé par etl/build_db.py), jamais deviné.
score_clown_slop = moyenne des taux de vacuité disponibles (programme,
déclarations) — NULL si aucune des deux composantes n'a d'item évalué pour ce groupe, jamais 0% par défaut. Les
résolutions art. 34-1 restent un indicateur CONTEXTUEL séparé, jamais mélangé au score : nature de preuve
différente (fait structurel vs jugement qualitatif), même principe de séparation fait/interprétation que le reste
du pipeline. Comme score_classement, c'est un instrument de synthèse, pas un verdict — voir les items
sous-jacents, chacun sourcé, pour le détail.
nb_programme_slop / nb_programme_evalues (par groupe)
Part des points de programme du groupe étiquetés « slop » (aucun mécanisme vérifiable, non falsifiable, ou reformulation d'un consensus sans rien y ajouter de distinctif — voir analysis/data/programme_groupes.json pour chaque justification sourcée). NULL si aucun point évalué pour ce groupe, jamais assumé à 0 %.
Seuls les énoncés PROGRAMMATIQUES entrent dans le taux « sans levier ». Une prise de parole qui conteste un fait, commente l'actualité ou répond à une question non programmatique n'avait pas vocation à annoncer une mesure : la compter comme creuse serait une erreur de catégorie. Les énoncés réactifs et indéterminés sont conservés, affichés, et comptés dans nb_declarations_hors_perimetre. Le registre est pré-détecté lexicalement (analysis/registres.py) et doit être relu : le champ registre_enonciation_source dit toujours s'il a été relu ou seulement détecté.
None
nb_declarations_slop / nb_declarations_evaluees (par groupe), sur les seuls énoncés programmatiques
Même grille appliquée aux déclarations publiques du corpus Hypocrites (voir analysis/data/declarations_publiques.json). NULL si aucune déclaration évaluée.
COUNT(scrutin_symbolique) GROUP BY groupe_auteur, normalisé par la taille du groupe
Nombre de propositions de résolution (art. 34-1 de la Constitution, sans portée normative — fait structurel établi par une règle automatique, PAS une classification de contenu, voir analysis/scrutins_symboliques.py) déposées par un membre du groupe et adoptées. Indicateur CONTEXTUEL affiché séparément — jamais mélangé au score_clown_slop, nature de preuve différente (fait juridique vs jugement qualitatif).
moyenne des taux qualitatifs disponibles (programme, déclarations)
Synthèse des deux composantes qualitatives uniquement, quand elles existent — nb_composantes_disponibles indique sur combien de composantes (0, 1 ou 2) le score repose : ne jamais comparer un score à 1 composante à un score à 2 composantes sans regarder ce champ. Comme score_classement (KPI votes), c'est un instrument de synthèse, pas un verdict — voir les items sous-jacents pour le détail sourcé de chaque jugement.
Voir RAPPORT_clown_slop.md à la racine du dépôt pour la méthodologie complète et les
limites détaillées (corpus non exhaustif, curateur unique, asymétrie de source programme 2024/2022, budget de
recherche borné).
Analyse de texte (écart titre/contenu) et croisement presse
Cette partie repose sur un agent utilisant un modèle de langage : elle produit
une interprétation, jamais un fait, et est toujours présentée avec un niveau
de confiance. Prompts versionnés et panel de presse utilisés : voir
plan/PHASE3_analyse_agent.md.
Limites connues
- Périmètre pilote : législature XVII uniquement à ce stade (extension prévue aux
législatures XIV-XVI, voir
plan/PHASE1_methode_et_kpis.md§6). non_votantdans les données AN mélange absence et non-participation institutionnelle (ex. présidence de séance) : le taux de participation ne distingue pas ces deux cas.- Le classement agrégé n'inclut que les députés ayant au moins 50 scrutins recensés, pour éviter qu'un petit échantillon fausse le résultat.
- La "position attendue" d'un groupe sur un thème (cohérence programme/vote) n'est affichée que lorsqu'elle est sourcée par un document officiel ; sinon l'indicateur est marqué "non disponible" plutôt qu'estimé.
- La liste des scrutins majeurs (
analysis/data/scrutins_majeurs.json) est volontairement non exhaustive : elle inclut automatiquement tous les scrutins solennels et motions de censure, enrichis par une recherche documentaire ciblée sur les textes ayant eu un fort retentissement médiatique. Un scrutin absent de la liste n'est pas jugé "mineur" en soi — il n'a simplement pas (encore) été retenu. - La classification de contenu (liberticide/anti-écologique/vidage de substance) est le résultat d'un seul "juge" (Claude, lecture manuelle sourcée), pas d'une revue multi-évaluateurs ni d'un consensus académique — chaque classification cite néanmoins l'extrait de texte précis qui la justifie, pour permettre une vérification indépendante.
- Les blocs "gauche" (LFI-NFP, SOC, EcoS, GDR) et "droite" (RN, UDR, DR) utilisés pour les profils videur de gauche/droite sont une simplification assumée, basée sur l'alliance officielle NFP côté gauche et la proximité RN/UDR/DR côté droite : les groupes de la majorité présidentielle/centre (EPR, HOR, Dem, LIOT) et les non-inscrits ne sont volontairement rattachés à aucun bloc pour ce profil précis.
- Aucune instance "videur de droite" n'a été détectée dans cette version des données — la
recherche ciblée menée (amendements de suppression adoptés, au sein des dossiers des textes
majeurs, dont l'exposé sommaire cite explicitement une disposition portée par le bloc opposé)
n'a fait ressortir qu'un cas "videur de gauche" avec un niveau de preuve suffisant. Ce n'est
pas une conclusion sur l'absence du phénomène côté droite, seulement le résultat de cette
recherche bornée — voir
analysis/data/classification_scrutins_majeurs.json.