1. Contexte et objectif

Au second tour des municipales de Toulouse 2026, seules deux listes s’affrontent : Moudenc (DVD) et Piquemal (LFI, avec fusion Briançon PS). Pour chaque bureau de vote, on connaît les résultats complets du 1er tour (10 listes) et du 2nd tour (2 listes). L’objectif est d’estimer dans quelle proportion les électeurs de chaque liste du 1er tour ont reporté leurs voix vers l’un des deux finalistes. On tente aussi d’estimer le comportement des nouveaux votants entre les deux tours.

Ce document explique la méthode statistique utilisée, ses hypothèses, ses limites, et l’interprétation des résultats.

On notera R1 le 1er tour et R2 le 2nd tour.

2. Le problème : on n’observe pas le comportement individuel

Les données électorales sont agrégées par bureau de vote. On observe le nombre de voix pour chaque liste dans chaque bureau, mais pas le comportement individuel des électeurs : on ne sait pas qui a voté pour qui. Par exemple, si la liste A fait 100 voix au 1er tour et 80 voix au 2nd tour, on ne peut pas conclure que 80 % des électeurs A ont voté pour le même candidat au 2nd tour. Certains peuvent être partis vers l’autre finaliste, ou s’être abstenus.

Pour inférer un comportement individuel (le taux de report) à partir de données agrégées, on utilise une technique classique en sociologie électorale : la régression écologique (ou inférence écologique [1]).

3. Le modèle de régression linéaire

3.1. Variables

Pour chaque bureau de vote \(i\) (284 au total), on définit :

  • Variable dépendante : \(y_i\) = score de Piquemal au 2nd tour (en % des exprimés R2) dans le bureau de vote \(i\)

  • Variables explicatives :

    • \(x_{k,i}\) = score de la liste \(k\) au 1er tour (en % des exprimés R1) dans le bureau de vote \(i\), pour \(k = 0 \ldots 9\)

    • \(\Delta\text{part}_i\) = variation de participation entre les deux tours :

\[\Delta\text{part}_i = \frac{v^{R2}_i}{I_i} - \frac{v^{R1}_i}{I_i}\]

avec :

\(v^{R1}_i\)

nombre de votants au 1er tour dans le bureau \(i\)

\(v^{R2}_i\)

nombre de votants au 2nd tour dans le bureau \(i\)

\(I_i\)

nombre d’inscrits sur les listes électorales du bureau \(i\) (identique aux deux tours)

3.2. Équation du modèle

On cherche alors à résoudre l’équation suivante pour chaque bureau \(i\) :

\[y_i = \sum_{k=0}^{9} \beta_k \, x_{k,i} \;+\; \gamma \, \Delta\text{part}_i \;+\; \varepsilon_i\]

avec :

\(y_i\)

score de Piquemal au 2nd tour dans le bureau \(i\) (en proportion des exprimés R2)

\(x_{k,i}\)

score de la liste \(k\) au 1er tour dans le bureau \(i\) (en proportion des exprimés R1)

\(\beta_k\)

coefficient de report agrégé estimé de la liste \(k\) vers Piquemal (approximation du taux de report moyen sous hypothèse d’homogénéité). Ce sont ces valeurs là qui nous intéressent car elles permettent d’estimer la fidélité ou infidélité électorale de chaque liste au 1er tour.

\(\gamma\)

effet des nouveaux votants (mobilisés entre R1 et R2) sur le score de Piquemal (paramètre à estimer)

\(\Delta\text{part}_i\)

variation de participation dans le bureau \(i\) (définie ci-dessus)

\(\varepsilon_i\)

terme d’erreur — variation du bureau \(i\) non expliquée par le modèle

Interprétation des coefficients :

  • \(\beta_k\) ≈ part moyenne estimée des électeurs de la liste \(k\) au R1 ayant voté Piquemal au R2 (interprétation agrégée, non individuelle !)

  • \(\gamma\) = effet agrégé de la variation de participation sur le score de Piquemal (interprétation descriptive uniquement ; ne permet pas d’identifier directement le comportement individuel des nouveaux votants)

Les coefficients ne sont pas contraints dans l’intervalle \([0,1\)]. Cela pourrait donner lieu à une étude plus approfondie intéressante même s’il y a fort à parier (intuition) que les résultats finaux soient similaires. Ils peuvent ainsi, horreur absolue, être négatifs ou supérieurs à 1. Ces valeurs ne doivent pas être interprétées littéralement.

3.3. Résultats avec les données du 1er tour à Toulouse

Liste Voix R1 Score R1 \(\beta_k\) estimé (MCO)

Briançon (PS)

39 245

25,0 %

\(0{,}73\)

Moudenc (DVD)

58 462

37,2 %

\(\approx 0{,}00\)

Piquemal (LFI)

43 274

27,6 %

\(\approx 1{,}00\)

Leonardelli (RN)

8 447

5,4 %

\(\approx 0{,}00\)

Meilhac

2 648

1,7 %

\(0{,}10\)

Autres (5 listes)

4 945

3,1 %

instable (faible volume de voix : coefficients non robustes et non interprétables)

Lecture des résultats

La ligne Briançon (PS) donne \(\beta_{\text{Briançon}} = 0{,}73\) : environ 73 % des électeurs PS ont suivi la consigne de fusion vers Piquemal, soit \(39\,245 \times 0{,}73 \approx 28\,650\) voix transférées. Les 27 % restants ont voté Moudenc ou abstention.

La ligne Leonardelli (RN) donne \(\beta_{\text{Leon}} \approx 0{,}00\) : la quasi-totalité des électeurs RN ont voté Moudenc au 2nd tour.

La ligne Piquemal (LFI) confirme \(\beta_{\text{Piquemal}} \approx 1{,}00\) : la fusion a bien fonctionné côté LFI, avec une fidélité quasi totale à la liste d’union.

Ces valeurs sont issues du modèle mono-output en pourcentages (variable dépendante = score Piquemal R2 en % des exprimés), utilisé ici à des fins d’illustration. L’estimation finale (§ Résultats de la régression) repose sur un modèle multi-output en volumes absolus avec trois équations simultanées (Moudenc, Piquemal, non-votants), ce qui explique des coefficients légèrement différents (ex. \(\beta_{\text{Briançon}}^P = 0{,}674\) au lieu de \(0{,}73\)).

4. Traitement spécial des listes fusionnées

Briançon (PS) et Piquemal (LFI) ont fusionné avant le second tour. Leurs électeurs du 1er tour ont reçu une consigne de vote explicite.

Le modèle confirme que la fusion a fonctionné côté LFI : \(\beta_{\text{Piquemal}} \approx 1{,}00\). En revanche, côté PS, la fusion est partielle : \(\beta_{\text{Briançon}} = 0{,}73\), soit un taux de fuite de 27 % vers Moudenc ou absentention. Ce résultat est analytiquement intéressant car il quantifie le coût électoral de la consigne de fusion pour le PS.

5. Mais qu’est ce qu’une régression linéaire multivariée (MCO) ?

5.1. Exemple introductif

On se place dans un cas volontairement simplifié : 3 listes au 1er tour (A, B, C), seules A et B passent au 2nd tour (C est éliminée). On observe 3 bureaux de vote.

Les données de la colonne « A (2nd tour) » ont été construites à partir de coefficients choisis à l’avance (\(\beta_A = 0{,}90\), \(\beta_B = 0{,}10\), \(\beta_C = 0{,}60\)). Donc dans ce cas, cela tombe en marche ! Les MCO retrouvent donc ces coefficients exactement, avec des résidus nuls (ce qui n’arrive jamais) C’est un choix pédagogique pour rendre le calcul vérifiable à la main. Sur des données réelles, les résidus ne sont jamais nuls.
Table 1. Données fictives (nombres de voix)
Bureau A (1er tour) B (1er tour) C (1er tour) A (2nd tour)

1

100

60

80

144

2

50

100

40

79

3

120

40

60

148

On cherche trois paramètres :

\(\beta_A\)

fraction des voix de la liste A au 1er tour qui se reportent sur A au 2nd tour

\(\beta_B\)

fraction des voix de la liste B au 1er tour qui se reportent sur A au 2nd tour

\(\beta_C\)

fraction des voix de la liste C au 1er tour qui se reportent sur A au 2nd tour

Le modèle sans constante pour le bureau \(i\) s’écrit :

\[\underbrace{y_i}_{\substack{\text{voix pour A} \\ \text{au 2nd tour, bureau } i}} = \beta_A \cdot \underbrace{a_i}_{\text{voix A, 1er tour}} + \beta_B \cdot \underbrace{b_i}_{\text{voix B, 1er tour}} + \beta_C \cdot \underbrace{c_i}_{\text{voix C, 1er tour}} + \underbrace{\varepsilon_i}_{\text{résidu}}\]

avec :

\(y_i\)

nombre de voix obtenues par la liste A au 2nd tour dans le bureau \(i\)

\(a_i, b_i, c_i\)

nombres de voix obtenues par les listes A, B, C au 1er tour dans le bureau \(i\)

\(\beta_A, \beta_B, \beta_C\)

taux de report estimés vers A — les inconnues du modèle

\(\varepsilon_i\)

résidu — écart entre la valeur observée et la valeur prédite par le modèle

On applique dans tous les cas la même formule MCO. Ici, avec 3 bureaux et 3 inconnues, le système est carré et les données fictives sont sans bruit : les MCO donnent une solution exacte (\(\varepsilon_i = 0\) pour tout \(i\)). Sur des données réelles avec \(n = 284\) bureaux, le système est sur-déterminé et les résidus sont non nuls — mais la formule reste identique.

Qu’est-ce qu’un système sur-déterminé ?

Un système d’équations est dit sur-déterminé lorsqu’il y a plus d’équations que d’inconnues (\(n > p\)). Ici, chaque bureau de vote génère une équation, et les inconnues sont les taux de report \(\beta_k\).

Avec \(n = 284\) bureaux et \(p = 11\) inconnues (cas réel), il y a 284 équations pour 11 inconnues. Sauf si les données sont parfaitement cohérentes — ce qui ne se produit jamais sur des données réelles en raison du bruit électoral —, il n’existe aucune solution exacte. Les MCO trouvent alors le vecteur \(\hat{\boldsymbol{\beta}}\) qui minimise la somme des carrés des résidus \(\sum_i \varepsilon_i^2\), c’est-à-dire la solution « la moins mauvaise » au sens de l’erreur quadratique.

On pose :

\[\mathbf{X} = \begin{pmatrix} 100 & 60 & 80 \\ 50 & 100 & 40 \\ 120 & 40 & 60 \end{pmatrix} \qquad \mathbf{y} = \begin{pmatrix} 144 \\ 79 \\ 148 \end{pmatrix}\]

La solution MCO est donnée par l’équation normale :

\[\hat{\boldsymbol{\beta}} = \left(\mathbf{X}^\top \mathbf{X}\right)^{-1} \mathbf{X}^\top \mathbf{y}\]
Cette expression suppose que la matrice \(\mathbf{X}^\top \mathbf{X}\) est inversible. En pratique, les solveurs numériques utilisent une pseudo-inverse ou une décomposition lorsque cette condition n’est pas vérifiée.

Après calcul :

\[\mathbf{X}^\top \mathbf{X} = \begin{pmatrix} 26\,900 & 15\,800 & 17\,200 \\ 15\,800 & 15\,200 & 11\,200 \\ 17\,200 & 11\,200 & 11\,600 \end{pmatrix} \qquad \mathbf{X}^\top \mathbf{y} = \begin{pmatrix} 36\,110 \\ 22\,460 \\ 23\,560 \end{pmatrix}\]

Ce qui donne :

\[\hat{\boldsymbol{\beta}} = \begin{pmatrix} 0{,}90 \\ 0{,}10 \\ 0{,}60 \end{pmatrix}\]
Lecture
  • \(\hat\beta_A = 0{,}90\) : 90 % des électeurs de la liste A au 1er tour sont restés sur A au 2nd tour

  • \(\hat\beta_B = 0{,}10\) : 10 % des électeurs de la liste B au 1er tour ont voté A au 2nd tour (90 % sont restés sur B)

  • \(\hat\beta_C = 0{,}60\) : 60 % des électeurs éliminés (liste C) se sont reportés sur A, les 40 % restants sur B

On peut vérifier : \(\hat{y}_1 = 0{,}90 \times 100 + 0{,}10 \times 60 + 0{,}60 \times 80 = 90 + 6 + 48 = 144\). Les résidus sont nuls et le \(R^2 = 1\).

Les résidus sont nuls ici parce que les données fictives ont été construites sans bruit. Sur des données réelles, le comportement électoral varie d’un bureau à l’autre (profils sociologiques différents, dynamiques locales) et le modèle linéaire n’est qu’une approximation : les résidus sont alors non nuls, et le \(R^2 < 1\).

5.2. Exemple avec résidus non nuls

On reprend le même cadre mais avec 4 bureaux et des données de vote qui ne vérifient plus exactement le modèle linéaire. Le système est sur-déterminé (4 équations, 3 inconnues).

Table 2. Données fictives avec bruit (nombres de voix)
Bureau A (1er tour) B (1er tour) C (1er tour) A (2nd tour)

1

100

60

80

147

2

50

100

40

82

3

120

40

60

145

4

70

80

90

128

On pose :

\[\mathbf{X} = \begin{pmatrix} 100 & 60 & 80 \\ 50 & 100 & 40 \\ 120 & 40 & 60 \\ 70 & 80 & 90 \end{pmatrix} \qquad \mathbf{y} = \begin{pmatrix} 147 \\ 82 \\ 145 \\ 128 \end{pmatrix}\]

Le code R suivant réalise l’estimation :

X <- matrix(c(100, 60, 80,
               50, 100, 40,
              120, 40, 60,
               70, 80, 90), nrow = 4, byrow = TRUE)

y <- c(147, 82, 145, 128)

# Régression sans constante (- 1)
# On contraint le modèle à passer par l'origine : sans voix au 1er tour, il n'y a pas de voix au 2nd tour !
modele <- lm(y ~ X - 1)

print(round(coef(modele), 3))        # XA=0.842  XB=0.133  XC=0.661 Les reports agrégés estimés !
print(round(fitted(modele), 1))      # 145.1  81.9  146.0  129.1
print(round(residuals(modele), 1))   #   1.9   0.1   -1.0   -1.1
print(round(summary(modele)$r.squared, 4))  # 0.99

Après calcul de l’équation normale \(\hat{\boldsymbol{\beta}} = (\mathbf{X}^\top \mathbf{X})^{-1} \mathbf{X}^\top \mathbf{y}\) :

\[\mathbf{X}^\top \mathbf{X} = \begin{pmatrix} 31\,800 & 21\,400 & 23\,500 \\ 21\,400 & 21\,600 & 18\,400 \\ 23\,500 & 18\,400 & 19\,700 \end{pmatrix} \qquad \mathbf{X}^\top \mathbf{y} = \begin{pmatrix} 45\,160 \\ 33\,060 \\ 35\,260 \end{pmatrix}\]
\[\hat{\boldsymbol{\beta}} = \begin{pmatrix} 0{,}842 \\ 0{,}133 \\ 0{,}661 \end{pmatrix}\]
Lecture
  • \(\hat\beta_A = 0{,}842\) : 84 % de fidélité estimée des électeurs A (contre 90 % dans l’exemple sans bruit)

  • \(\hat\beta_B = 0{,}133\) : 13 % des électeurs B se sont reportés sur A

  • \(\hat\beta_C = 0{,}661\) : 66 % des électeurs de la liste C ont voté A

Les coefficients estimés correspondent à la meilleure approximation linéaire (au sens des moindres carrés) des voix du second tour à partir des résultats du premier tour. C’est un abus de langage de parler de « taux de report » au sens strict, car les coefficients ne sont pas contraints à être des proportions entre 0 et 1. Ils doivent être interprétés comme des flux agrégés, avec une part de résidu (comportements non captés par le modèle) qui peut être négative ou positive…​

Les valeurs prédites et les résidus sont :

Bureau \(y_i\) (observé) \(\hat{y}_i\) (prédit) \(\varepsilon_i = y_i - \hat{y}_i\)

1

147

145,1

+1,9

2

82

81,9

+0,1

3

145

146,0

−1,0

4

128

129,1

−1,1

Le \(R^2 = 0{,}998\) : le modèle explique 99,8 % de la variance des voix A au 2nd tour. Les résidus sont faibles mais non nuls. Les MCO ont trouvé la solution qui minimise \(\sum_i \varepsilon_i^2 = 1{,}9^2 + 0{,}1^2 + 1{,}0^2 + 1{,}1^2 \approx 5{,}8\).

5.3. Estimation par MCO avec les données réelles : formulation multi-output

On cherche les coefficients du vecteur \(\beta\) de façon à rendre les erreurs les plus petites possibles, au sens de la somme des carrés. C’est-à-dire que l’on cherche à minimiser l’expression suivante :

\[\sum_{i=1}^{n} \left( y_i - \mathbf{x}_i^\top \boldsymbol{\beta} \right)^2\]

avec :

\(n\)

nombre de bureaux de vote (ici \(n = 284\))

\(\mathbf{x}_i\)

vecteur ligne des \(11\) variables explicatives

\(\boldsymbol{\beta}\)

vecteur des \(11\) paramètres à estimer \((\beta_0, \ldots, \beta_9, \gamma)\)

La solution analytique est :

\[\hat{\boldsymbol{\beta}} = \left( \mathbf{X}^\top \mathbf{X} \right)^{-1} \mathbf{X}^\top \mathbf{y}\]

avec :

\(\mathbf{X}\)

matrice \(284 \times 11\) dont chaque ligne est le vecteur \(\mathbf{x}_i\) d’un bureau

\(\mathbf{y}\)

vecteur \(284 \times 1\) des scores Piquemal au R2

\(\mathbf{X}^\top \mathbf{X}\)

matrice \(11 \times 11\) (inversible si les colonnes de \(\mathbf{X}\) sont linéairement indépendantes)

\(\mathbf{X}^\top \mathbf{y}\)

vecteur \(11 \times 1\) des produits scalaires entre chaque variable explicative et \(\mathbf{y}\)

6. Résultats de la régression — données réelles 2026

Contrairement à la formulation initiale en pourcentages, l’estimation finale est réalisée sur les volumes de voix absolus. Les coefficients doivent donc être interprétés comme des flux agrégés et non comme des proportions strictes.

6.1. Mise en œuvre

Le modèle a été estimé sur les 284 bureaux de vote de Toulouse (\(n = 284\), \(p = 11\) variables). Les variables explicatives sont les volumes de voix absolus au R1 (10 listes + non-votants R1). Le terme « non-votants R1 » joue un rôle analogue à \(\Delta\text{part}_i\) dans la formulation en pourcentages : il permet de capter la mobilisation différentielle entre les deux tours, en attribuant un coefficient aux électeurs qui n’avaient pas voté au 1er tour. Les variables dépendantes sont les volumes au R2 : voix Moudenc, voix Piquemal, non-votants R2.

6.2. Coefficients estimés

Liste (1er tour) → Moudenc → Piquemal → Abstention Σ

Briançon (PS)

25 %

67 %

0 %

92 %

Moudenc (DVD)

119 %

−7 %

−12 %

100 %

Piquemal (LFI)

−4 %

106 %

−3 %

100 %

Leonardelli (RN)

112 %

−26 %

+17 %

103 %

Meilhac

81 %

9 %

+3 %

93 %

Scalli

−64 %

137 %

+19 %

— (instable)

Adrada

−11 %

36 %

+8 %

— (instable)

Menéndez

−96 %

85 %

+70 %

— (instable)

Cottrel

150 %

−5 %

−39 %

— (instable)

Pedinotti

−10 %

76 %

+56 %

— (instable)

Non-votants (1er tour)

1 %

9 %

91 %

100 %

Les trois équations (Moudenc, Piquemal, abstention) sont estimées indépendamment sans contrainte de somme. Les coefficients peuvent donc ne pas totaliser 100 % (horreur), ce qui reflète une absence de contrainte de conservation des flux dans le modèle. Encore un fois, on peut refaire une étude analogue avec cette contrainte mais, intuition, les résultats finaux seraient similaires.

6.3. Diagramme de Sankey des reports estimés

Terminons, par un joli diagramme de Sankey pour visualiser les flux de voix estimés par le modèle. Chaque ruban représente un flux de voix d’une liste du 1er tour vers un finaliste du 2nd tour ou vers l’abstention. La largeur de chaque ruban est proportionnelle au volume de voix transférées.

Les coefficients hors [0, 1] sont contraints pour la représentation : valeurs négatives ramenées à 0, sommes supérieures à 1 normalisées, résidu affecté à l’abstention. Les listes en gris ont des coefficients instables (faible volume de voix).

Diagramme de Sankey des reports de voix — Toulouse Municipales 2026

6.4. De la régression aux 27 % : calcul détaillé

Le chiffre "27 % des électeurs Briançon ont voté Moudenc" est la valeur clé de l’analyse. Voici comment on y arrive pas à pas.

6.4.1. Étape 1 : lire les deux coefficients bruts

Au second tour, chaque électeur du 1er tour fait face à exactement trois issues possibles : voter Moudenc, voter Piquemal, ou ne pas voter (abstention, blanc, nul). Pour couvrir les trois issues — et notamment estimer le comportement des nouveaux votants entre les deux tours — le modèle estime simultanément trois régressions sur les 284 bureaux, avec les mêmes 11 variables explicatives :

\[\hat{y}^{M}_i = \hat{\beta}^{M}_{\text{Br}} \cdot a_i + \ldots \qquad \hat{y}^{P}_i = \hat{\beta}^{P}_{\text{Br}} \cdot a_i + \ldots\]

où \(a_i\) désigne le nombre de voix Briançon dans le bureau \(i\) au 1er tour.

On lit dans le tableau précédent :

Source Destination Coefficient brut

Briançon (1er tour)

→ Moudenc (2nd tour)

\(\hat{\beta}^{M}_{\text{Br}} = 0{,}247\)

Briançon (1er tour)

→ Piquemal (2nd tour)

\(\hat{\beta}^{P}_{\text{Br}} = 0{,}674\)

Interprétation directe : pour chaque voix Briançon au 1er tour dans un bureau, le modèle estime que \(0{,}247\) vote va vers Moudenc et \(0{,}674\) vote va vers Piquemal. Les \(1 - 0{,}247 - 0{,}674 = 0{,}079 \approx 8\,\%\) restants correspondent aux blancs, nuls et au résidu du modèle.

6.4.2. Étape 2 : normaliser pour obtenir un pourcentage entre finalistes

Les deux coefficients bruts ne somment pas à 1 (ils somment à \(0{,}247 + 0{,}674 = 0{,}921\)). Pour exprimer la part de chaque finaliste parmi ceux des électeurs Briançon qui ont effectivement voté au 2nd tour, on normalise :

\[\text{Part Moudenc} = \frac{\hat{\beta}^{M}_{\text{Br}}}{\hat{\beta}^{M}_{\text{Br}} + \hat{\beta}^{P}_{\text{Br}}} = \frac{0{,}247}{0{,}247 + 0{,}674} = \frac{0{,}247}{0{,}921} \approx \mathbf{26{,}8\,\%} \approx 27\,\%\]
\[\text{Part Piquemal} = \frac{0{,}674}{0{,}921} \approx 73{,}2\,\% \approx 73\,\%\]
Le 27 % affiché dans l’application est cette valeur normalisée. Les \(1 - 0{,}247 - 0{,}674 = 0{,}079 \approx 8\,\%\) restants représentent la part non ventilée entre les deux finalistes — résidu du modèle et comportements non captés (blancs, nuls, variation d’abstention). Ce résidu ne doit pas être interprété comme un flux identifié vers l’abstention. De même pour les 27 %.

6.5. Les 94 % de mobilisation en faveur de Piquemal : calcul détaillé

Entre les deux tours, la participation a progressé de +17 017 votants (56,5 % vers 62,6 %). Ces nouveaux votants proviennent nécessairement des non-votants du 1er tour. On applique la même normalisation qu’à l’étape 2 ci-dessus, mais cette fois sur la ligne Non-votants R1 du tableau des coefficients.

6.5.1. Étape 1 — lire les coefficients bruts

Source Destination Coefficient brut

Non-votants R1

→ Moudenc (2nd tour)

\(\hat{\beta}^{M}_{\text{NV}} = 0{,}006\)

Non-votants R1

→ Piquemal (2nd tour)

\(\hat{\beta}^{P}_{\text{NV}} = 0{,}085\)

Le coefficient \(\hat{\beta}^{P}_{\text{NV}} = 0{,}085\) signifie : pour chaque non-votant au 1er tour dans un bureau, le modèle estime que \(0{,}085\) vote va vers Piquemal au 2nd tour. Les \(0{,}914\) restants correspondent aux non-votants R1 qui restent non-votants au R2 (coefficient \(\hat{\beta}^{A}_{\text{NV}} = 0{,}914\)).

6.5.2. Étape 2 — normaliser entre les deux finalistes

On ne garde que ceux qui ont effectivement voté au 2nd tour, en normalisant comme pour Briançon :

\[\text{Part Piquemal} = \frac{\hat{\beta}^{P}_{\text{NV}}}{\hat{\beta}^{M}_{\text{NV}} + \hat{\beta}^{P}_{\text{NV}}} = \frac{0{,}085}{0{,}006 + 0{,}085} = \frac{0{,}085}{0{,}091} \approx 93{,}4\,\% \approx 94\,\%\]
\[\text{Part Moudenc} = \frac{0{,}006}{0{,}091} \approx 6{,}6\,\% \approx 6\,\%\]
Cette estimation repose sur une approximation : le coefficient MCO décrit le comportement moyen de l’ensemble des 122 377 non-votants R1, et on l’applique ici au sous-ensemble des 17 017 qui ont effectivement voté au R2. L’hypothèse implicite est que ce sous-ensemble se comporte comme la moyenne. Ce qui est raisonnable mais non garanti.

6.6. Qualité d’ajustement

Variable dépendante \(R^2\)

Voix Moudenc (2nd tour)

0,9984

Voix Piquemal (2nd tour)

0,9982

Non-votants (2nd tour)

0,9988

Les \(R^2\) sont excellents (≥ 0,984).

Dans les régressions écologiques inter-tours, des valeurs élevées de \(R^2\) sont en partie mécaniques (forte corrélation géographique entre tours) et ne garantissent pas à elles seules la validité des coefficients de report.

6.7. Tentative d’interprétation

Piquemal (LFI)

\(\approx 100\,\%\) de fidélité vers l’union, la fusion côté LFI a fonctionné.

Briançon (PS)

\(73\,\%\) vers Piquemal, \(27\,\%\) vers Moudenc, fuite notable du PS.

Moudenc (DVD)

\(\approx 100\,\%\) de fidélité vers Moudenc.

Leonardelli (RN)

\(\approx 100\,\%\) vers Moudenc. Report quasi-total de l’électorat RN vers la droite.

Meilhac

\(90\,\%\) Moudenc, \(10\,\%\) Piquemal.

Non-votants R1

\(91\,\%\) restent abstenants au R2. Comme vu, selon le modèle, les 9 % qui se mobilisent au R2 voteraient à 94 % pour Piquemal et à 6 % pour Moudenc.

Petites listes

coefficients hors \([0,1]\) — instabilité numérique due au faible nombre de voix. Non interprétables.

6.8. Utilisation dans le simulateur

Les coefficients des listes robustes (Briançon, Moudenc, Piquemal, Leonardelli, Meilhac) sont utilisés comme valeurs par défaut des curseurs du simulateur de report intégré à la carte. Les petites listes conservent une valeur par défaut de 50 %.

7. Limite fondamentale : l’inférence écologique

L'ecological fallacy (paradoxe de Robinson, 1950) désigne l’erreur qui consiste à inférer un comportement individuel à partir de corrélations agrégées.

Exemple : si les bureaux où Leonardelli est fort au 1er tour montrent un score Moudenc plus élevé au 2nd tour, cela ne prouve pas que les électeurs Leonardelli individuellement ont voté Moudenc. Un troisième facteur géographique pourrait expliquer les deux.

Ce que le modèle dit : les \(\beta_k\) sont des estimations de reports moyens agrégés, valides sous hypothèse forte d’homogénéité du comportement entre bureaux. En présence d’hétérogénéité non observée, ils peuvent être biaisés (ecological fallacy).

Avec 284 bureaux couvrant des géographies très diverses (centre, périphérie nord, Mirail, quartiers résidentiels), l’hypothèse d’homogénéité me semble raisonnablement satisfaite.

8. Données de référence

8.1. Résultats du 1er tour — 15 mars 2026

  • Inscrits : 281 354

  • Votants : 158 977 (participation : 56,5 %)

  • Exprimés : 157 021

Liste Voix % exprimés

Moudenc (DVD)

58 462

37,2 %

Piquemal (LFI)

43 274

27,6 %

Briançon (PS)

39 245

25,0 %

Leonardelli (RN)

8 447

5,4 %

Meilhac

2 648

1,7 %

Cottrel

1 953

1,2 %

Pedinotti

1 611

1,0 %

Adrada

653

0,4 %

Scalli

438

0,3 %

Menéndez

290

0,2 %

8.2. Résultats du 2nd tour — 22 mars 2026

  • Inscrits : 281 355

  • Votants : 175 994 (participation : 62,6 %)

  • Exprimés : 171 073

Liste Voix % exprimés Bureaux en tête

Moudenc (DVD)

92 151

53,9 %

160 BV

Piquemal / Briançon (Union gauche)

78 922

46,1 %

124 BV

Moudenc est réélu maire de Toulouse avec 53,9 % des exprimés. La participation a progressé de +6,1 points par rapport au 1er tour (56,5 % → 62,6 %), soit +17 017 votants supplémentaires en valeur absolue.

8.3. Reproduire l’estimation

Les données et le code sont disponibles pour reproduire l’estimation :

  • X_bureaux_R1.csv — matrice des variables explicatives (284 bureaux × 11 colonnes : voix R1 par liste + non-votants R1)

  • Y_bureaux_R2.csv — matrice des variables dépendantes (284 bureaux × 3 colonnes : voix Moudenc, Piquemal, non-votants R2)

Le script R suivant reproduit l’estimation à partir de ces deux fichiers :

#!/usr/bin/env Rscript
# MCO-elections-toulouse.R
# Régression écologique MCO multi-output — Toulouse Municipales 2026
#
# Usage : Rscript notes/MCO-elections-toulouse.R   (depuis la racine du dépôt)
#         Rscript MCO-elections-toulouse.R         (depuis notes/)

# ── Lire les données ──────────────────────────────────────────────────────────
# X : variables explicatives — voix R1 par liste + non-votants R1 (284 bureaux × 11 colonnes)
# Y : variables dépendantes  — voix R2 Moudenc, Piquemal, non-votants  (284 bureaux × 3 colonnes)
X <- as.matrix(read.csv("notes/X_bureaux_R1.csv", row.names = 1)[, -1])
Y <- as.matrix(read.csv("notes/Y_bureaux_R2.csv", row.names = 1)[, -1])

# ── Régression MCO sans constante ─────────────────────────────────────────────
# Le -1 supprime l'ordonnée à l'origine (équivalent de numpy.linalg.lstsq)
# Y peut avoir plusieurs colonnes : lm() estime une équation par colonne
fit <- lm(Y ~ X - 1)

# ── Résultats : coefficients en pourcentages ──────────────────────────────────
# coef(fit) renvoie une matrice (11 variables × 3 équations)
# On multiplie par 100 pour lire des pourcentages de report
beta <- coef(fit)
rownames(beta) <- colnames(X)   # lm() préfixe "X" automatiquement, on corrige
print(round(beta * 100, 1))

9. Références


1. Voir la définition Wikipédia : https://fr.wikipedia.org/wiki/Inf%C3%A9rence_%C3%A9cologique