Méthodologie — QC Élection Forecast
Version du modèle : 3.2.0 « 127 » · Élection cible : générale québécoise du 5 octobre 2026 (127 circonscriptions, majorité à 64).
Ce document est la référence auditable du système. La version grand public est servie sur
/methodologie; les snapshots de chaque exécution sont conservés en base
(forecast_runs) et consultables par l'API.
1. Sources de données et provenance
| Source | Contenu | Rôle |
|---|---|---|
| DGEQ (données ouvertes officielles) | GeoJSON carte 2026 (127 circ.), liste officielle, candidatures (drapeau « député sortant »), résultats en direct le soir du vote | référence géographique, candidats, incumbency |
| Wikipédia (agrégation, liens vers chaque maison) | sondages 2022→2026 (85+), sondages campagne 2022 (106), résultats 2022 par circonscription, variations 2018→2022 | série de sondages, baselines locales, backtest |
| Élections partielles (DGEQ) | 4 partielles 2023-2025 : votes réels comptés | couche 2 — observations nationales du filtre (v2) |
| Baromètres de satisfaction (Léger, via veille web) | % satisfaits envers le gouvernement | couche 3 — entrée du prior de fondamentaux (v2) |
| Presse québécoise (RSS + veille Firecrawl) | Radio-Canada, Le Devoir, La Presse + presse élargie | couche 4 — ajustement borné ±0,35 pp (v2) |
| Polymarket (API Gamma publique) | probabilités implicites « plus de sièges » | couche 5 — ensemble 88/12 sur P(plus de sièges) (v2) |
| Veille web continue (Firecrawl v2 : search + scrape) | radar de nouveaux sondages, satisfaction, articles hors RSS | détection + provenance (pages brutes archivées) |
Chaque enregistrement conserve : source, URL, date d'accès, valeur brute, valeur normalisée.
Les HTML bruts sont archivés dans backend/data/raw/.
Dédoublonnage des sondages : clé (maison, fin de terrain); un même sondage publié à plusieurs endroits n'est compté qu'une fois, et une fiche déjà en base est mise à jour (taille, MoE, chiffres révisés) plutôt que dupliquée quand Wikipédia la complète. Les tables de sondages sont sélectionnées par leur section de page (« Opinion polls », « Campaign period »…) — la table de campagne est captée dès sa première rangée; les ventilations (langue, région) et projections sont exclues. Le mode de collecte est attribué par maison (Léger web, Mainstreet/Pallas IVR, SEGMA téléphone…) pour des design effects réels; la plage de terrain complète est parsée. En période de campagne (≤ 45 j), le pipeline passe de 6 h à 3 h. Boucle de garantie : chaque sondage détecté par le radar de veille doit se retrouver en base (statut « intégré »), sinon l'alerte reste visible dans l'admin et le point du jour.
2. Pondération des sondages
- Récence : poids
0,5^(âge/12 j), l'âge étant mesuré à la fin du terrain, pas à la publication. - Précision : taille effective
n_eff = min(n/deff, 2500)avec design effects par mode (web 1,30; téléphone 1,20; IVR 1,40; SMS 1,45; mixte 1,25; inconnu 1,35). Le plafond de 2 500 empêche un mégasondage de dominer. - Qualité de la maison : multiplicateur 0,6–1,4 selon l'EAM historique de ses sondages finaux; maison sans historique : ×0,9 + erreur excédentaire accrue (+25 %).
- Erreur totale d'enquête : ±1,5 pp ajoutés en variance à chaque sondage (cadre, non-réponse, pondérations internes du sondeur).
3. House effects
Sur chaque élection passée à résultat connu, biais moyen par parti des sondages des 21
derniers jours de chaque maison, rétréci de 50 % vers zéro et borné à ±3 pp, soustrait
avant l'ajustement du modèle. Recalculé à chaque cycle (pollster_ratings).
4. Modèle latent (Bayesian state space)
- Composition : 6 composantes (CAQ, PCQ, PLQ, PQ, QS, Autres), transformées en
log-ratios additifs
y_k = log(p_k/p_CAQ)(5 dimensions) — la somme fait toujours 100 % et la corrélation négative entre partis est structurelle. - Dynamique : marche aléatoire gaussienne
x_t = x_{t-1} + w_t,w_t ~ N(0, q·I). - Observation :
y_sondage ~ N(x_t, R),R= covariance multinomiale (méthode delta) surn_eff× cote maison + erreur excédentaire diagonale. - Inférence : filtre de Kalman exact + lisseur RTS;
qestimé par maximum de vraisemblance (grille log-uniforme, borné à [0,004², 0,030²]).
5. Nowcast vs Forecast
- Nowcast : distribution de
softmax(x_aujourd'hui)— « si l'élection avait lieu aujourd'hui ». - Forecast : même moyenne (martingale), variance augmentée de
q × jours_restants × 1,6(volatilité de campagne) plus l'erreur systémique de sondageσ_industrie = 0,12(voir §7).
5 bis. Au-delà des sondages (v2) — les couches complémentaires
Le forecast v2 combine cinq couches d'inférence, chacune à poids explicite, borné,
débrayable par configuration et décomposé publiquement (/api/beyond, page /signaux) :
- Sondages (couche de base) : le modèle d'état des §4-5, inchangé.
- Votes réels — partielles : chaque élection partielle depuis 2022
(Saint-Henri–Sainte-Anne 2023, Jean-Talon 2023, Terrebonne 2025, Arthabaska 2025)
devient une observation nationale du filtre de Kalman à sa date :
alr_implicite = alr(national 2022) + 0,6 × [alr(partielle) − alr(local 2022)]. Le rétrécissement ×0,6 reflète l'exagération connue du swing des partielles; la variance est celle d'un sondage de n≈350 plus ±3 pp d'erreur excédentaire (participation faible, dynamique locale). Ce sont les seuls bulletins comptés avant le scrutin — et le modèle les voit. - Prior de fondamentaux : régression ridge « vote du sortant ~ vote précédent +
satisfaction envers le gouvernement », pénalité d'usure de 1,5 pp/mandat au-delà du
premier, ajustée sur les 8 générales de 1998 à 2022 (RMSE leave-one-out publié).
Les partis d'opposition reçoivent un prior de persistance (0,65 × vote précédent +
0,35 × moyenne 2008-2022, renormalisé). Le prior (diffus, sd alr ≥ 0,40) est combiné
au posterior des sondages par pondération de précision avec
w(t) = min(0,8; (jours restants/540)^1,3)→ il compte à 18 mois, presque plus la veille du vote. La satisfaction est mise à jour en continu par la veille web (repli configuré sinon), avec provenance. - Ajustement médias : sentiment de presse des 14 derniers jours (RSS + veille) →
delta = ±0,35 pp × tanh(2·sentiment) × min(1, volume/60), nul sous 12 mentions. Un nudge, jamais un moteur. - Ensemble marchés : la probabilité « plus de sièges » publiée est
0,88 × modèle + 0,12 × Polymarket(renormalisée). Les intentions de vote ne sont jamais modifiées par le marché.
Veille web continue (Firecrawl) à chaque cycle de 6 h : (a) radar de nouveaux
sondages dans la presse — alerte avec provenance, aucune ingestion automatique de
chiffres; (b) extraction du % de satisfaits (baromètres Léger); (c) presse élargie
au-delà des RSS. Toutes les pages brutes sont archivées (data/raw/firecrawl/).
Socle de données v3 (ADDENDUM) : hiérarchie de sources (TIER 1 officiel →
TIER 5 agrégateurs, inventaire complet dans DATA_SOURCE_AUDIT.md); Élections
Québec est CANONIQUE (partis autorisés + chefs + candidats scrapés chaque
semaine, alerte « dérive-chef » si divergence — jamais de remplacement
silencieux); registre de comptes sociaux versionné (config/social_seeds.json,
provenance + date, découverte automatique hebdomadaire depuis les sites
officiels, promotion pending_review → verified); requêtes sociales versionnées
(config/social_queries.json); séparation STRICTE contenu officiel (engagement
seulement) / discussion citoyenne (sentiment) via social_posts.content_class;
plan du feature store démographique StatCan→127 circonscriptions dans
POPULATION_FEATURES.md (interpolation pondérée par population des aires de
diffusion — jamais de proxy fédéral).
Signaux web avancés (v2.1) :
- Attention Wikipédia (API Wikimedia, pageviews des pages des partis et chef·fe·s,
fr.wikipédia) — ajoute du pouvoir prédictif au-delà des sondages+fondamentaux
(Smith & Gustafson, POQ 2017; Salem & Stephany 2020). Signal jamais
directionnel : un pic global d'attention (z ≥ 2 sur 3 j vs base 180 j) gonfle la
variance de dérive du forecast (multiplicateur borné ≤ 1,45), sans toucher aucune
moyenne. Parts d'attention 7 j/28 j publiées (
/api/attention). - Sondage synthétique LLM (« silicon sampling », arXiv:2411.01582) — 96 strates
démographiques (région×âge×genre×langue, poids de population), LLM incarnant chaque
strate, ancré dans les manchettes réelles de la veille (jamais de chiffres de
sondage dans le prompt), poststratification. EXPÉRIMENTAL, poids strictement
nul (critique McKown-Dawson 2025 : un LLM ne collecte aucune donnée nouvelle);
écart au forecast publié comme objet d'étude, évaluation après le 5 octobre.
Provenance complète archivée (
data/synthetic_polls/).
Page quotidienne : /aujourdhui (« Le point du jour ») — snapshot daté :
probabilités publiées, Δ vs dernier run de la veille, journal 24 h (sondages intégrés,
détections du radar), attention web, sondage synthétique, état des couches
(/api/today).
Décomposition : à chaque run, le forecast est reconstruit couche par couche (sondages seuls → + partielles → + fondamentaux → + médias) avec 8 000 simulations par variante; les Δ de vote et de probabilité de chaque couche sont publiés.
6. Modèle de circonscription
`part(circ, parti) = softmax( alr(référence 2022 locale) + swing_national_alr
- ε_région + ε_circonscription − pénalité_retraite )`
- Swing proportionnel en espace log-ratio (jamais de swing uniforme).
- Référence locale : résultat 2022 transposé sur la carte 2026 (renommages appliqués; Bellefeuille et Marie-Lacoste-Gérin-Lajoie = moyenne des circonscriptions parentes).
- Pénalité de 0,06 (log-ratio, ≈1,3 pp) au parti sortant si le député ne se représente pas (48 retraits; drapeau raffiné par le registre officiel des candidatures DGEQ).
- Partial pooling : les régions sans sondage propre héritent du national + couche régionale.
7. Monte Carlo et corrélation des erreurs (25 000 simulations)
| Couche | Distribution | Justification |
|---|---|---|
| Opinion | posterior Kalman + dérive | incertitude d'estimation et d'évolution |
| Systémique de sondage | N(0, 0,12²) nationale corrélée |
2022 : toute l'industrie a sous-estimé la CAQ (~3 pp); 2018 idem |
| Régionale | N(0, 0,14²) × 13 régions |
corrélation intrarégionale |
| Locale | N(0, 0,20²) × 127 circ. |
candidats, enjeux locaux |
σ régional/local calibrés sur les résidus du backtest 2022 (swing proportionnel 2018→2022), atténués car 2022 (émergence PCQ) fut un réalignement atypique.
Sorties : distribution complète des sièges par parti (P5–P95, histogramme), P(plus de sièges), P(majorité ≥64), P(gouvernement minoritaire), catégorie par circonscription (Solide ≥95 %, Probable ≥80 %, Favorisé ≥60 %, sinon Chaudement disputé).
8. Backtesting (élection 2022, information à date seulement)
| Horizon | EAM vote (pp) | Couverture IC 95 % | EAM sièges | Brier | Vainqueurs corrects |
|---|---|---|---|---|---|
| J−120 | 2,65 | 100 % | 3,1 | 0,147 | 92 % |
| J−60 | 2,23 | 100 % | 2,2 | 0,133 | 91 % |
| J−30 | 4,15 | 80 % | 4,0 | 0,179 | 88 % |
| J−7 | 2,76 | 60 % | 4,2 | 0,178 | 86 % |
| J−1 | 2,19 | 100 % | 4,3 | 0,179 | 86 % |
Calibration des probabilités locales (tous horizons confondus) : suit la diagonale (ex. bac 70–80 % → observé 84 %; bac 90–100 % → observé 98 %). L'ajout de la couche systémique a fait passer la couverture J−1 de 20 % à 100 % sans dégrader le Brier. Aucune correction maison n'est appliquée en backtest (pas de données antérieures à 2018).
Backtest v2 : le blend de fondamentaux est rejoué avec l'information de 2022
(sortant CAQ, 1er mandat, satisfaction ~54 %, vote 2018); le rapport publie côte à côte
mae_pp (v2) et mae_pp_sondages_seuls. Les partielles et l'ajustement médias ne sont
pas rejouables pour 2022 (données indisponibles) — ils sont exclus du backtest et bornés
par construction.
9. Signaux et leur poids (v2)
- Sentiment médiatique : RSS + veille Firecrawl → extraction d'entités → stance (pro/anti/neutre/ambigu) avec négation et attaques dirigées; scoreur LLM optionnel (MacLustr) sinon lexique; regroupement par grappes; anomalies de volume (z ≥ 2,5) → événements. Poids : ajustement borné ±0,35 pp (§5 bis-4).
- Marchés prédictifs : probabilités implicites Polymarket affichées face au modèle ET intégrées à 12 % dans la P(plus de sièges) publiée (§5 bis-5).
- Momentum : Δ vote modèle 14 j + sentiment 7 j, borné [−100, 100] — purement auxiliaire.
- Radar de sondages (Firecrawl) : détections listées sur
/signauxavec provenance; l'ajout d'un sondage au modèle reste une opération de collecte/validation normale.
9 bis. v3 « 127 » — Social Intelligence, validation et forecast par comté
Règles absolues v3 : calibration > sophistication; chaque couche est mesurable, backtestable, débrayable (feature flags aux défauts conservateurs), bornée et décomposée; aucun signal social ne devient une intention de vote; aucune fuite de données futures dans les replays.
- Social Intelligence Layer : acteur Apify maison
qc-social-pulse(Instagram/Facebook/TikTok des comptes officiels + recherche YouTube et commentaires publics via l'API interne, proxy résidentiel CA, source dansapify/qc-social-pulse/) + Reddit r/Quebec (index Google/Serper), Mastodon et Lemmy.ca. Pipeline : normalisation → dédoublonnage (URL + empreinte) → stance dirigée → pondération engagement 1+ln(1+votes) → filtrage de coordination (quasi-doublons, rafales synchronisées → attention organique vs coordonnée) → métriques standardisées (attention_z,velocity_z, largeur des auteurs, confirmation inter-plateformes, équilibre de stance). Observabilité : chaque run d'acteur est journalisé (apify_runs); un échec d'acteur n'empêche jamais la publication du forecast. Les signaux sociaux mesurent l'attention et le discours en ligne — pas un échantillon représentatif; poids directionnel nul. - Volatilité unifiée :
m = 1 + 0,10·(z_wiki−2)⁺ + 0,06·(z_social−2)⁺ + 0,05·confirmation, bornée à [1, 1,5] — n'agit que sur la variance de dérive. - Event Engine : un événement de campagne n'est retenu que si ≥2 familles de sources le confirment (presse, social, Wikipédia) — aucun effet directionnel présumé.
- Validation : module
modeling/validation/— scoring commun (EAM, RMSE, couverture 50/90/95, Brier, log loss, exactitude, sharpness, biais) et cadre d'ablation : le backtest 2022 est rejoué par variante (FULL, sans fondamentaux, sans partielles, sans médias, sondages seuls) et les deltas publiés (/api/ablation). Une couche qui dégrade les scores est retirée ou reléguée à l'expérimental. - Forecast par comté : page
/circonscriptions(127 fiches, filtres, détail complet) et circonscriptions pivots : dans chaque simulation où un parti atteint 64 sièges, sa 64ᵉ circonscription la plus sûre est celle qui fait basculer la majorité; P(pivot) = fréquence (/api/battlegrounds). - API v3 :
/api/v3/forecast|ridings|social|battlegrounds|events|beyond| calibration|ablation(la v1/api/*reste inchangée).
9 ter. v3.1 — Replay historique multi-élections et erreur des sondeurs
- Replay 2007-2022 (§52-54 du cahier méthodologique) : six élections
rejouées (462 sondages Wikipédia archivés,
data/historical/), horizons J-120→J-1, LOEO strict — house effects, prior de fondamentaux (exclude_year) et σ_industrie appris uniquement sur les AUTRES élections. Scores propres : EAM/RMSE, couverture 50/90/95, CRPS, log score, sharpness (/api/replay). Le cœur alr est paramétré par l'ère de partis (ADQ 2007-2008, CAQ depuis 2012, PCQ en 2022). - Modèle d'erreur des sondeurs (
/api/pollster-error) : l'erreur d'INDUSTRIE (biais partagé des sondages finaux) est mesurée à chaque élection — p. ex. 2018 : CAQ −5,4 pp, PLQ +3,6; 2014 : PQ +4,9; 2007 : PLQ −9,2. σ_industrie devient une quantité apprise (RMS des composantes principales, LOEO, bornée [0,08; 0,25]) ≈ 0,21 au lieu du 0,12 manuel. Adoption validée par le replay : log score −3,80 vs −5,33, CRPS 2,64 vs 2,67, couverture 95 % 83 % vs 76,5 %, EAM inchangée — les intervalles publiés sont plus larges parce que l'histoire le commande. House effects hiérarchiques : moyenne inter-élections rétrécie n/(n+k) + dispersion τ (une maison vue une fois reste incertaine, pas simplement pénalisée). - Leçon des queues (2007 : surge ADQ, EAM 6,6; 2014 : effondrement PQ, 5,2) : les grands mouvements de campagne sont la première source d'erreur — chantier suivant : innovations à queues lourdes (Student-t) testées par le même replay.
9 quater. v3.2 — Phase D (population), soir d'élection, scénarios, connecteurs
- Feature store démographique (Phase D) : classeur OFFICIEL d'Élections
Québec « Statistiques du Recensement 2021 par circonscription 2026 »
(2 917 variables × 127 circonscriptions, codes stables — source parfaite,
aucune interpolation) →
data/population/riding_2026_demographics.csv(population, 65+, langue à la maison, universitaire, locataires, immigrants, revenu 100 k$+, autochtones, appartements, minorités visibles; z-scores) et graphe de similarité top-10 (cosinus) — validation qualitative : Gouin ≈ Mercier/Ste-Marie–St-Jacques; Westmount ≈ NDG/Mont-Royal–Outremont; Ungava profil nordique. Base du MRP (cellules) et du transfert du soir d'élection. Exposé par fiche (/api/demographics/{nom}). - Modèle du soir d'élection (dormant jusqu'au 5 octobre) : prior = forecast
final; résidus des circonscriptions rapportées décomposés hiérarchiquement
(national ~N(0, σ_industrie²) → régional → local), pondérés par leur propre
dépouillement (garde anti-biais des premiers bureaux); resimulation avec
variances réduites; déclarations conservatrices (P ≥ 99,5 % ET ≥ 40 %
dépouillé).
/api/election-night, alimenté par l'admin depuis le DGEQ. - Laboratoire de scénarios : chaque scénario du simulateur est encodé dans l'URL (partage exact), presets reproductibles, étiquetage strict « conditionnel — pas le forecast officiel ».
- Fiches locales : sensibilité au swing (marge attendue, chemin de bascule
minimal vers le challenger, stabilité vs largeur d'IC) + démographie officielle
- circonscriptions semblables.
10. Limites connues
- Pas de sondages régionaux publics structurés — la variation régionale vient de la structure 2022 + couche d'erreur régionale.
- Transposition 2022→2026 approximative pour les circonscriptions dont les limites ont bougé.
- Historique des maisons limité à 2022 (les cotes s'affineront après 2026).
- Participation : outil de scénario (multiplicateurs par électorat), pas un modèle individuel de probabilité de vote.
AUTagrège les tiers partis (PVQ, etc.) — aucun siège projeté pour eux.
11. Reproductibilité
- Chaque run :
forecast_runs(posterior complet, sièges, diagnostics, version du modèle). - Graines aléatoires fixes; simulations vectorisées NumPy; tests unitaires du cœur
statistique (
backend/tests/).