Hier, sur Twitter, @JF_Godbout partageait un joli graphique relatif aux élections québécoises, avec les nombres de votes obtenus (ici en pourcentage des votes totaux) et le pourcentage de sièges que cela donne,

Il faut dire qu’hier, c’était jour d’élection. Ce sont des élections à un tour, avec plusieurs partis (disons 4 grands partis si on se limite aux élections les plus récentes). Jusqu’à lundi, le PQ (Parti Québécois) avait une majorité (relative), et depuis lundi, le PLQ (Parti Libéral) est revenu au pouvoir. Et il y a à côté de ces deux grands partis d’autres partis, que l’on va regrouper. @JF_Godbout m’ayant envoyé ses données, j’ai pu reproduire les graphiques.

La grande différence ici, entre nos approches est – je pense – la méthode de lissage: alors que @JF_Godbout faisait des régressions locales, j’ai opté pour des splines.
reg=glm(Seat~bs(Election),data=d,family=binomial) yp=predict(reg,newdata=data.frame(Election=1970:2015),type="response")
J’utilise des splines parce que ça se généralise facilement à d’autres lois, et qu’on peut aussi les utiliser quand on régresse sur plusieurs variables continues. Si on rajoute les résultats de l’élection de lundi, on obtient le graphique suivant

Ce qui me gêne dans cette modélisation, c’est qu’on considère nos trois dernières régressions comme indépendantes…. alors que ce n’est pas le cas: on a trois modalités possibles, et la somme doit forcément faire 1. D’ailleurs, quand on somme les prédictions, on dépasse 1.

Avec deux partis, notre régression logistique nous garantie d’avoir une somme à un, mais plus ici. A moins d’utiliser un modèle multinomial. Si on oublie le lissage, l’idée est d’écrire
qui est tout simplement l’extension du modèle logistique. La difficulté technique est que, sous R, quand on fait une régression logistique, la variable d’intérêt doit être une variable prenant trois facteurs, et non pas un vecteur de probabilités. Au lieu d’utiliser des taux, ou des pourcentages, je devrais utiliser des nombres d’observations de chaque modalités. On va donc crééer une fausse base
> vote=data.frame(
+ plq=plq$Vote,
+ pq=pq$Vote,
+ autre=autre$Vote,
+ Election=pq$Election)
> vote
plq pq autre Election
1 0.5465 0.3022 0.1513 1972
2 0.3378 0.4137 0.2485 1976
3 0.4608 0.4926 0.0466 1981
4 0.5599 0.3869 0.0532 1985
5 0.4995 0.4016 0.0989 1989
6 0.4440 0.4475 0.1085 1994
7 0.4355 0.4287 0.1358 1998
8 0.4599 0.3324 0.2077 2003
9 0.3308 0.2835 0.3857 2007
10 0.4208 0.3517 0.2275 2008
11 0.3120 0.3195 0.3685 2012
12 0.4140 0.2538 0.3312 2014
> M=t(round(vote[,1:3]*1000))
> M
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
plq 546 338 461 560 500 444 436 460 331 421 312 414
pq 302 414 493 387 402 448 429 332 284 352 320 254
autre 151 249 47 53 99 108 136 208 386 227 368 331
On réplique alors autant de fois le nom du parti qu’on a de (pseudo) votes
> Y=X=NULL
> for(i in 1:3){
+ for(j in 1:ncol(M)){
+ Y=c(Y,rep(c("PLQ","PQ","Autre")[i],M[i,j]))
+ X=c(X,rep(pq$Election[j],M[i,j]))
+ }}
> basev=data.frame(Y=as.factor(Y),X=X)
C’est un peu artificiel, j’en conviens, mais ça marche… On peut alors faire la régression
> library(nnet) > regv=multinom(Y~bs(X),data=basev) # weights: 15 (8 variable) initial value 13186.643301 iter 10 value 12241.931805 final value 12221.591172 converged
et des prévisions
> ypv=predict(regv,newdata=
+ data.frame(X=1973:2014),type="probs")
> ypv
Autre PLQ PQ
1 0.18426281 0.4705415 0.3451957
2 0.16051060 0.4767408 0.3627486
3 0.14149153 0.4805514 0.3779571
4 0.12631826 0.4826100 0.3910718
5 0.11426236 0.4834165 0.4023212
6 0.10474046 0.4833543 0.4119053
7 0.09729304 0.4827117 0.4199953
8 0.09156246 0.4817016 0.4267360
9 0.08727323 0.4804776 0.4322491
10 0.08421535 0.4791477 0.4366370
11 0.08223095 0.4777835 0.4399855
12 0.08120364 0.4764292 0.4423672
13 0.08105030 0.4751066 0.4438431
14 0.08171457 0.4738203 0.4444651
Et on notera que cette fois, nos prévisions somment à un.
Cela dit, visuellement, on obtient des choses proches de ce qu’on avait auparavant,

mais intellectuellement, je trouve plus logique d’utiliser autre chose que des régressions logistiques quand on est dans une élection où plusieurs partis sont en compétition.
OpenEdition suggests that you cite this post as follows:
Arthur Charpentier (April 8, 2014). Elections Sans Bipartisme. Freakonometrics. Retrieved December 14, 2025 from https://doi.org/10.58079/ouv3