Aller au contenu principal
Clowns de la République

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

taux_participation

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').

taux_discipline

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).

cohesion_moyenne (groupe)

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.

score_classement

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.

est_non_inscrit / eligible_classement

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.

ecart_au_groupe

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.

participation_a_verifier

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'.

participation par type de scrutin

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.

participation mensuelle

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.

identité non résolue

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.

organe_id 'PO0' dans vote_groupe/vote_individuel

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.

scrutins majeurs

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.

clown

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).

absent

aucun vote exprimé sur un scrutin majeur tenu pendant le mandat

Regroupe l'absence de ligne vote_individuel et la position explicite 'non_votant'.

fasciste

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).

ecocide

vote 'pour' sur un scrutin majeur classé 'anti_ecologie'

Même principe que 'fasciste' ci-dessus.

videur_droite / videur_gauche

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 :

Corpus de déclarations

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).

Principes synthétisés

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).

Mise en regard

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.

Règle contradictoire/nuance (seuil chiffré)

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.

Contradictions internes (programme ↔ paroles)

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 :

Grille « slop » (jugement qualitatif, programme et déclarations)

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.

Corpus programme

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.

Corpus déclarations

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.

Résolutions art. 34-1 (fait structurel, PAS un jugement de contenu)

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

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.

taux_slop_programme

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 %.

registre_enonciation

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

taux_slop_declarations

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.

nb_resolutions_symboliques / nb_resolutions_pour_100_deputes

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).

score_clown_slop

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