Tag Archives: sondage

« Dans toute statistique, l’inexactitude du nombre est compensée par la précision des décimales »

Le statisticien et économiste Alfred Sauvy est resté dans les mémoires pour avoir inventé en 1952 le terme “tiers-monde”. Mais on lui a aussi attribué la paternité de la phrase suivante « dans toute statistique, l’inexactitude du nombre est compensée par la précision des décimales ». J’ai du l’entendre alors que j’étais étudiant, et depuis, elle me suit partout.

J’y repensais l’autre jour, quand Mathieu Gallard mentionnait sur Twitter le graphique suivant (correspondant a la popularité du président de la république, en France, dans les 18 mois qui suivent l’élection).

Le tweet disait (entre autres) “ est à ce stade de son quinquennat légèrement moins populaire que “. Pour rappel, ces courbes “de popularité” sont construites par un sondage, avec a chaque fois environ 1000 personnes interrogées (“sur la taille de l’échantillon on est toujours entre 950 et 970 interviews” me disait Mathieu). Bon, tous ceux qui ont des souvenirs de cours de stats se souviennent qu’avec 1000 personnes interrogées, 2 points de différence, c’est rarement significatif. Mais plus globalement, compte tenu de la marge d’erreur, je me suis demande pourquoi les courbes n’étaient pas lissées ? Ça éviterait les discussions stériles pour une variation de 2 points par exemple..

Si on reprend les données brutes (merci Mathieu), on a ici

rate=read.csv2("http://freakonometrics.free.fr/satisfaction.csv")
plot(rate[,2],type="b",ylim=c(.2,.75),xlim=c(0,20),pch=19)
lines(rate[,3],type="b",col="red")
lines(rate[,4],type="b",col="blue")
lines(rate[,5],type="b",col="dark green")
text(18.15,rate[17,2],"EM")
text(18.15,rate[17,3],"FH",col="red")
text(18.15,rate[17,4],"NS",col="blue")
text(18.15,rate[17,5],"JC",col="dark green")

ce qui donne le même que dans le tweet (même si je n’ose pas interpoler linéairement les valeurs manquantes – il y en a deux dans mon fichier)

Prenons la courbe la plus récente, celle d’Emmanuel Macron (avec en plus les valeurs manquantes pour pimenter un peu) et rajoutons les intervalles de confiance ponctuels.

plot(rate$EM,type="b",ylim=c(.2,.5))
p=rate$EM
n=length(p)
arrows(1:n,p-2/sqrt(1000)*sqrt(p*(1-p)),1:n,p+2/sqrt(1000)*sqrt(p*(1-p)),code=3,angle=90,length=.1,col="blue")

Personnellement, j’aurais bien voulu (1) lisser tout ça, (2) rajouter quelque chose qui s’apparente a des bandes de confiance. Mais avec des erreurs de mesure (c’est comme ça qu’on peut interpréter le fait que les points viennent d’un sondage), je ne sais pas trop quoi faire. J’ai tenté la méthode suivante : le tire au hasard des points dans l’intervalle de confiance, puis je lisse sur ce nouveau jeu de points. Et je répète mille fois

library(mgcv)
Y=matrix(NA,73,1000)
for(s in 1:1000){
  x=(1:n)[!is.na(p)]
  pna=p[!is.na(p)]
  ps=rnorm(length(x),pna,1/sqrt(1000)*sqrt(pna*(1-pna)))
  b=data.frame(x=x,y=ps)
  reg=gam(y~s(x),data=b)
  yp=predict(reg,newdata=data.frame(x=seq(0,18,by=.25)))
  Y[,s]=yp
  if(s<100) lines(seq(0,18,by=.25),yp,col="light blue")
} 
lines(seq(0,18,by=.25),apply(Y,1,mean),col="red",lwd=2)
lines(seq(0,18,by=.25),apply(Y,1,function(x) quantile(x,.95)),col="red",lty=2)
lines(seq(0,18,by=.25),apply(Y,1,function(x) quantile(x,.05)),col="red",lty=2)

On voit que notre courbe lissée est réaliste, voire même les pseudo-bandes de confiance autour. Pour obtenir ces trois courbes, on peut utiliser la fonction suivante

courbe=function(j=1){
p=rate[,1+j]
n=length(p)
Y=matrix(NA,73,1000)
for(s in 1:1000){
  x=(1:n)[!is.na(p)]
  pna=p[!is.na(p)]
  ps=rnorm(length(x),pna,1/sqrt(1000)*sqrt(pna*(1-pna)))
  b=data.frame(x=x,y=ps)
  reg=gam(y~s(x),data=b)
  yp=predict(reg,newdata=data.frame(x=seq(0,18,by=.25)))
  Y[,s]=yp
} 
data.frame(
x=seq(0,18,by=.25),
pred=apply(Y,1,mean),
upr=apply(Y,1,function(x) quantile(x,.975)),
lwr=apply(Y,1,function(x) quantile(x,.025)))
}

Sur les quatre colonnes de notre tableau, ça donne

plot(rate[,2],type="b",ylim=c(0,.8),xlim=c(0,20),col="white")
Y=courbe(4)
polygon(c(Y$x,rev(Y$x)),c(Y$upr,rev(Y$lwr)),col=rgb(0,1,0,.4),border=NA)
lines(Y$x,Y$pred,col="dark green",lwd=2)
text(18.65,Y$pred[73],"JC",col="dark green")
Y=courbe(3)
polygon(c(Y$x,rev(Y$x)),c(Y$upr,rev(Y$lwr)),col=rgb(0,0,1,.4),border=NA)
lines(Y$x,Y$pred,col="blue",lwd=2)
text(18.65,Y$pred[73],"NS",col="blue")
Y=courbe(2)
polygon(c(Y$x,rev(Y$x)),c(Y$upr,rev(Y$lwr)),col=rgb(1,0,0,.4),border=NA)
lines(Y$x,Y$pred,col="red",lwd=2)
text(18.65,Y$pred[73],"FH",col="red")
Y=courbe(1)
polygon(c(Y$x,rev(Y$x)),c(Y$upr,rev(Y$lwr)),col="grey",border=NA)
lines(Y$x,Y$pred,col="black",lwd=2)
text(18.65,Y$pred[73],"EM",col="black")

Pourquoi les instituts de sondages, qui produisent les courbes de popularité, ne montrent pas ce genre de courbes ? Elles sont – a mon avis – aussi justes que celles qu’ils fournissent, au centième près, jouant sur une précision que l’incertitude ne devrait pas autoriser…

Déclarer ou révéler, retour sur les sondages

Voilà une semaine, je mettais en ligne un court billet “les sondages et le bruit” sur les sondages, et leur biais, en préparation pour une intervention en milieu de semaine, sur Paris. Mais cette semaine, je voulais continuer à assembler mes notes de lecture…

  • Déclarer ou révéler

Bon, on va commencer par enfoncer des portes ouvertes, mais il est toujours bon de relire “l’opinion publique n’existe pas” de Bourdieu.

Toute enquête d’opinion suppose que tout le monde peut avoir une opinion ; ou, autrement dit, que la production d’une opinion est à la portée de tous. Quitte à heurter un sentiment naïvement démocratique, je contesterai ce premier postulat. Deuxième postulat : on suppose que toutes les opinions se valent. Je pense que l’on peut démontrer qu’il n’en est rien et que le fait de cumuler des opinions qui n’ont pas du tout la même force réelle conduit à produire des artefacts dépourvus de sens. Troisième postulat implicite : dans le simple fait de poser la même question à tout le monde se trouve impliquée l’hypothèse qu’il y a un consensus sur les problèmes, autrement dit qu’il y a un accord sur les questions qui méritent d’être posées. Ces trois postulats impliquent, me semble-t-il, toute une série de distorsions qui s’observent lors même que toutes les conditions de la rigueur méthodologique sont remplies dans la recollection et l’analyse des données.

Cela dit, j’irais probablement plus loin, en disant que le sondage crée une opinion, au sens où la personne interrogée se force à chercher la réponse à une question qu’elle ne s’était peut être jamais posée. Ou pas encore posée, dans le cas des sondages électoraux. Mais c’est le principe même des sondages, les personnes interrogée devant déclarer pour qui elles comptent voter le jour de l’élection (avec toutes sortes d’autres questions).

D’ailleurs, un des problèmes de cette “déclaration” est le biais de “désirabilité sociale“: les personnes interrogées aimer se présenter sous un jour favorable à l’enquêteur. Le vote pour Trump a été comme le vote pour le Front National (historiquement), quelquechose d’inavouable. Le soucis, c’est qu’il est difficile d’estimer ce biais. En France, une correction était possible, en tenant compte de la différence entre les sondages, et les résultats sur des élections passées. Mais aux Etats-Unis, il n’y avait pas de précédant.

Et si on va plus loin, on peut se demander s’il est pertinent d’utiliser des enquêtes sur les intentions de votes comme outils de prévision électorale. Ne pourrait-on pas y voir pour les personnes interrogées, de “mini-élection”, avec moins d’impact? Ne peut-on pas imaginer l’électeur socialiste, qui se dirait “et si je disais que je vais voter pour Jean-Luc Mélanchon, ça permettra peut être de tirer un peu plus vers la gauche, même si le jour J je voterais probablement pour Benoît Hamon” (le fameux vote “utile”). Compte tenu de l’importance des sondages pour les journalistes politiques, ne peut-on imaginer que les personnes interrogées jouent un jeu un peu plus subtile que juste réponse à une question sur leurs intentions de vote ? C’est un biais bien connu en économie expérimentale, lorsque l’on cherche à connaître les préférences des agents, entre les préférences déclarées et celles qui sont révelées.

  • Les sondeurs sont ils (vraiment) si mauvais ?

Les erreurs sont souvent bien connues. On peut penser aux élections en Angleterre de juin 1970, lorsque Harold Wilson perdit face à Edward Heathà la surprise générale (la légende prétend qu’il avait même vendu sa maison, tellement il était certain de rester au 10 Downing Street). En France, le choc d’avril 2002 reste dans la mémoire collective. Comment les instituts de sondages n’avaient pas vu venir le second tour entre Jacques Chirac et Jean-Marie Le Pen? C’est le repproche qui avait été fait, à l’époque, où les sondeurs ont été tenu pour responsable. Etrangement, retrospectivement, le risque était présent. Mais personne n’ausait l’admettre. Plus récement, en juin 2016, c’était le choc du Brexit, et en décembre 2016, c’était l’élection de Donald Trump. Si beaucoup on critiqué les sondages suite à son élection, il convient de relire certains articles publiés à cette époque. Par exemple, mi-octobre, “pourquoi des sondages donnent encore Trump gagnant ?“, parmi tant d’autres (oui, nous avons une mémoire très sélective).

Ce qui semble être reproché aux instituts de sondages, c’est leur opacité, et leur manipulation des chiffres. Mais il faut leur donner raison. Comme le dit la loi, “les listes électorales peuvent être consultées par tout électeur (même inscrit sur une autre commune) à condition de ne pas les utiliser à des fins commerciales“. Autrement dit, les instituts de sondages ne peuvent pas les utiliser pour constituer un plan de sondage. Ne pouvant faire de vrai sondage aléatoire, il faut donc ruser, et on va échantillonner par quotas. C’est ce qu’on appelle du redressement. Pour faire simple, on applique des poids pour se rapprocher de la “population de base”. Qu’on ne connait pas. Idéalement, on aimerait bien connaître ces gens inscrits sur les listes. Mieux encore, connaître ceux qui iront effectivement voter (car ce sont vraiment ces personnes qui nous intéressent). Si aucun homme ne va voter, le jour J, il conviendrait de faire un échantillon de sondage avec uniquement des femmes. Encore une fois, comprendre l’abstention est essentiel.

Pour faire les quotas, on utilise des données géographiques, mais aussi d’âge, de genre, et de catégorie soci-professionnelle. En fait, cette dernière est (malheuresement) seulement une catégorie profesionnelle. On pensera à cette merveilleuse catégorie des “inactifs” qui correspond à des réalités très différentes. On utilise très peu les données de niveau d’étude par exemple, comme le rappelle Avner dans les sondages sont-ils devenus fous, les personnes faiblement diplômées sont faiblement présentes dans les sondages,

Il devient nécessaire de faire des redressements. Mais ces derniers n’ont de sens que s’il bien faits. Certains préconisent d’ailleurs des catégories “socio-affinitaires“, et non plus socio-professionnelles.

  • On veut des chiffres !

Allez, quelques chiffres, que j’ai découvert dans l’article les sondages sont-ils devenus fous d’Avner Bar-Hen, qui permettent d’avoir un ordre de grandeur intéressant. Pour faire une enquête, on peut avoir envie d’avoir 5000 personnes qui répondent à une liste de questions. Mais combien de personnes faut-il solliciter, par téléphone, pour avoir 5000 réponses. La réponse est simple, plus de 15 fois plus : pour avoir 5240 réponses, il a été nécessaire de composer 84000 coups de fils,

  • Des intensions de vote à une probabilité de gagner

Les sondages reposent sur la théorie de l’échantillonnsages, et il y a une part (importante) d’incertitude, comme on le voyait la dernière fois. Et comme le savent les statisticiens, il est possible de mal faire son travail, mais d’avoir de la chance, et de faire une bonne prévision, mais aussi de faire son travail correctement, et de se tromper lourdement.

Ce qui m’a intéressé lors des dernières élections américaines, c’est qu’on ne regarde pas le nombre de voix (prédit), mais la probabilité de gagner, pour tel ou telle candidat. Ce qui a du sens quand on pense au mode de scrutin. Mais traduit dans un contexte plus français (où on se place entre les deux tours), la probabilité de gagner est une information sur l’incertitude du sondage.

> simu=function(i){
+ n=1+2000
+ vote=sample(c("A","B"),size=n,
+ replace=TRUE,prob=c(.515,.485))
+ france1=mean(vote=="A")
+ n=1+200
+ vote=sample(c("A","B"),size=n,
+ replace=TRUE,prob=c(.515,.485))
+ france2=mean(vote=="A")
+ prop=c(france1,france2)
+ names(prop)=c("FR1","FR2")
+ return(prop)
+ }
> Sbi=Vectorize(simu)(1:1e4)
> plot(density(Sbi[1,]))

Ici, le candidat rouge a 15% de chances de gagner, contre 85% pour le candidat bleu. Avec 2000 personnes interrogées. Mais si on a seulement 200 personnes interrogées, on passe à 40% de chances de gagner pour A.

> plot(density(Sbi[2,]))

Autrement dit, la probabilité de gagner est, à mon sens, essentiellement une information liée à l’incertitude qui entoure le scrutin.

  • Quid du… “big data” ?

Allez, mettons enfin les pieds dans le plat… pourquoi pas utiliser “le big data”? Oui, le “big data” peut tout, je pense qu’il peut même assurer le retour de l’être aimé, alors il doit bien pouvoir prédire qui va gagner une élection…

Il y a 15 ans, internet n’était pas considéré comme un média. Personne n’osait trop faire des sondages en ligne*. Cette époque est révolue*. Au point que bon nombre se sentent aujourd’hui observés, et adoptent des stratégies, des comportements, qu’il convient de décoder en prenant des précautions.

L’écoute de la toile permet d’éviter l’écueil du déclaratif, pour observer, et induire des tendances, des comportements. Il serait intéressant de voir ce qu’en pensent les data scientists de chez Facebook par exemple. Comme le notait Stéphane Rozès, “si la France est une grande consommatrice de sondages, l’idée même qu’un statisticien puisse annoncer en amont le résultat de l’élection est baroque et attentatoire à l’imaginaire politique français.C’était en 2013. Depuis, comme le montre the pulse of the people, l’analyse des tweets (par exemple) permet d’observer beaucoup de choses. La difficulté est que si une équipe électorale sait ce qui est observé, il est aisé de créer des robots pour manipuler l’analyse. Le jeu du chat et de la souris peut commencer.

Mais il n’en reste pas moins que l’analyse des traces laisses sur la toile est importante, et les instituts de sondages le savent. Un “like” est une information intéressante, de même que savoir les pages vues, et les liens partagés. Cela dit, si on pousse un peu le raisonnement, comme le faisait Andrew Gelman dans un article paru au début du mois dans Science, si on était capable de prédire parfaitement le résultat d’une élection, cette dernière devient superflue, non ?

* ce qui est intéressant, c’est que dans le cas du Brexit, ce sont justement les sondages en ligne qui avaient “prévu” la victoire du leave, contrairement aux sondages téléphoniques qui donnaient le remain en tête….

Les sondages et le bruit

Après les sondages pour les présidentielles américaines l’été passé, on commence à crouler sous les sondages, en France, pour la prochaine élection présentielle. Avec les questions que ça induit. Et loin de moi l’idée de faire un billet sur les sondeurs sont des gros nuls, parce que c’est quand même plus compliqué que ça. Et il est normal de faire des erreurs, comme le rappelait  Ranganathan (2014). Et comme on m’a convié dans deux semaines à une table ronde sur les sondages, je me suis dit qu’il serait temps que je travaille un peu.

Même si ça semble être des banalités, les élections américaines et les élections en France sont très différentes.

Premier point, les 538 grands électeurs, contre un vote direct en France. Quand on estime la probabilité de gagner on obtient des choses très différentes.

On peut faire des simulations pour s’en rendre compte

simu=function(i){
n=1+2000
vote=sample(c("A","B"),size=n,replace=TRUE,prob=c(.51,.49))
region=sample(1:50,size=n,replace=TRUE)
france=mean(vote=="A")
us=aggregate(vote,by=list(region),function(x) mean(x=="A"))$x
prop=c(france,mean(us>1/2))
names(prop)=c("FR","US")
return(prop)
}
S=Vectorize(simu)(1:1e4)
plot(density(S[1,]))

En France, en interrogeant 2000 personnes, on a une très faible incertitude sur probabilités réelles, et dans 82% des scénarios, le candidats qui a 51% d’intention de vote est déclaré vainqueur.

> mean(S[1,]<.5)
[1] 0.1841

Aux Etats-Unis (ou disons une simulation d’une élection avec un collège électoral, avec ici 50 grands électeurs), c’est une autre histoire.

plot(density(S[2,]))

Dans un tiers des cas, on se trompe sur le vainqueur.

> mean(S[2,]<.5)
[1] 0.3319

Et la distribution de la couleur des grands électeurs peut être très volatile… allant de 30% à 70% pour A, alors la moitié du peuple a voté pour lui.

Deviner qui va gagner est un exercice manifestement compliqué aux Etats-Unis, à cause de ces grands électeurs. Et je ne parle pas du fait qu’estimer une probabilité très finement ne présage en rien du résultat final, comme  je l’avais dit dans un précédant billet.

Deuxième point, le nombre de candidats dans la course. Un simplifiant un peu, ils sont deux aux Etats-Unis, avec (quasiment) un vote en un tour, alors qu’en France, ils sont plus nombreux, avec un vote en deux tours, et une règle qui dit que seuls les deux premiers accèdent au second tour.

Commençons par le cas simple, avec quatre candidats, et une élection à un tour (à la majorité)

simu=function(i){
n=1+2000
vote=sample(c("A","B","C","D"),size=n,replace=TRUE,prob=c(.27,.26,.24,.23))
tb=table(vote)
return(names(which.max(tb)))
}
S=Vectorize(simu)(1:1e4)
barplot(table(S))

Pour passer au second tour, on imagine qu’il faut comprendre comment se passe le report des voix. On va supposer qu’il existe une espèce d’ordre, entre les candidats, A, B, C et D. Si son candidat ne passe pas le prochain tour, on vote pour un voisin. Autrement dit, A ne votera jamais pour C, ni pour D.  Mais si B est candidat, il votera pour lui. Par contre, si B a le choix entre A et C, on va supposer que l’électorat se partage en deux, entre A et C. Par contre, il ne votera jamais pour D.

simu=function(i){
n=1+2000
probabilite=c(.27,.26,.24,.23)
vote=sample(c("A","B","C","D"),size=n,replace=TRUE,prob=probabilite)
tb=table(vote)+rnorm(4)/1000
perdants=LETTERS[1:4][(rank(tb)%in%1:2)]
if(("A"%in%perdants)&("B"%in%perdants)) prob2=c(0,0,probabilite[2]+probabilite[3],probabilite[4])
if(("A"%in%perdants)&("C"%in%perdants)) prob2=c(0,probabilite[2]+probabilite[1]+probabilite[3]/2,0,probabilite[4]+probabilite[3]/2)
if(("A"%in%perdants)&("D"%in%perdants)) prob2=c(0,probabilite[2]+probabilite[1],probabilite[4]+probabilite[3],0)
if(("B"%in%perdants)&("C"%in%perdants)) prob2=c(probabilite[2]+probabilite[1],0,0,probabilite[4]+probabilite[3])
if(("B"%in%perdants)&("D"%in%perdants)) prob2=c(probabilite[1]+probabilite[2]/2,0,probabilite[3]+probabilite[2]/2+probabilite[4],0)
if(("C"%in%perdants)&("D"%in%perdants)) prob2=c(probabilite[1],probabilite[2]+probabilite[3],0,0)
vote=sample(c("A","B","C","D"),size=n,replace=TRUE,prob=prob2)
tb=table(vote)
return(LETTERS[which.max(tb)])
}
S=Vectorize(simu)(1:1e4)
barplot(table(S))

Le résultat est vraiment différent. Et la clé est le report des voix, entre les deux tours. Aussi, deviner qui va gagner est un exercice manifestement compliqué en France, à cause de ces deux tours.

Au delà des systèmes de votes, il existe quand même des similitudes, quand on parle d’incertitude dans les sondages. Classiquement, on pense au biais d’estimation. Parce qu’il correspond à ce que toute personne ayant fait un peu de statistiques (ce qui représentera bientôt la majorité des français, si j’en crois les réformes du programme du lycée) doit savoir (je n’ai pas dit compris). C’est le fameux « le sondage IFOP publié jeudi dans France-Soir a, quant à lui, été mené auprès de 1 046 personnes, soit une marge d’erreur d’environ 2,5 % » . Il s’agit de la marge d’erreur.

Mais ce n’est pas la seule source d’erreur, loin de là ! La base des sondages, c’est d’avoir un échantillon aléatoire de votants (au sens de personnes qui iront voter), et d’extrapoler ensuite sur la population entière, éventuellement en pondérant les réponses. Les poids sont là pour corriger de différences observables entre la population entière, et la population interrogée. Classiquement, on va utiliser des variables démographiques (âge, genre, profession, région, etc) dans la population des électeurs. Par exemple, si sur les listes électorales on a 50% d’hommes et 50% de femmes, mais que dans notre échantillon, il y a deux fois plus d’hommes que de femmes, on va généralement attribuer un poids de 2 pour les femmes, et de 1 pour les hommes afin de corriger. Malgré tout, on peut observer une différence entre les votes estimés, et la réalité le jour du vote. Une des raisons est que la population des votants peut être différente de celle des populations inscrites sur listes électorales. Si les hommes s’abstiennent beaucoup plus que les femmes, la correction utilisée ne suffira pas. C’est ce qu’on pourrait appeler une erreur de framing. Cette dernière correspond à l’erreur que l’on fait quand la population réelle et la population de l’échantillon diffère. L’exemple classique était lié à l’utilisation du téléphone pour constituer des listes de sondés. Avec cette méthode, les personnes sans téléphone (ou sur liste rouge) étaient systématiquement exclues.

Le second problème est le traitement des non-réponses. Si la non-réponse est un phénomène purement aléatoire, imprévisible, dans ce cas, ça va juste augmenter la variance. C’est ce qu’on observe sur l’exemple ci-dessous. Si tout le monde répond, on a

simu=function(i){
n=2000
vote=sample(c("A","B"),size=n,replace=TRUE,prob=c(.51,.49))
return(mean(vote=="A"))
}
S=Vectorize(simu)(1:1e4)

Supposons maintenant que 50% des gens ne répondent pas

simu=function(i){
n=2000
vote=sample(c("A","B",NA),size=n,replace=TRUE,prob=c(.51/2,.49/2,.5))
return(mean(vote[!is.na(vote)]=="A"))
}
S=Vectorize(simu)(1:1e4)

On a davantage de dispersion, mais on n’a pas de biais. Autrement dit, le nombre de cas où A est effectivement en tête sur le sondage est du même ordre de grandeur, avec ou sans non-réponse.

Par contre, si les électeurs de A ont davantage tendance à ne pas répondre, c’est une toute autre histoire

simu=function(i){
n=2000
vote=sample(c("A",NA,"B",NA),size=n,replace=TRUE,prob=c(.51*.8,.51*.2,.49*.9,.49*.1))
return(mean(vote[!is.na(vote)]=="A"))
}
S=Vectorize(simu)(1:1e4)

Autrement dit, si la non-réponse est liée au vote, on a un biais causé par la non-réponse. C’est le cas lorsque les personnes votant pour un des candidats n’osent pas révéler. C’est ce que montre très bien Fuchs, Bossert & Stukowski (2013).

Un autre exemple connu en sondage est lié à l’ordre des questions, comme le soulignait McFarland (1981), ou même les mots utilisés, pour reprendre Smith (1987). On peut rapprocher ce biais au biais dit de spécification, lorsqu’il y a une mauvaise compréhension de la question.

Enfin (et je m’arrêterais là), il reste un biais important, qui est un biais d’indécision, pour personnes indécises ou qui pourraient juste changer d’avis entre deux dates.

Compte tenu de tous ces biais, on voit qu’il est compliqué d’estimer l’erreur associée à un sondage. En tous cas, on se doute que le fameux « Le sondage IFOP publié jeudi dans France-Soir a, quant à lui, été mené auprès de 1 046 personnes, soit une marge d’erreur d’environ 2,5 % » implique une (forte) sous-estimation de l’incertitude. En fait, si on en croit Shirani-Mehr et al. (2016), la marge d’erreur pourrait être deux fois supérieure, avec un RMSE de ±7% sur l’intervalle de confiance et non pas ±3%. J’aurais donc tendance à croire que les sondages rajoutent essentiellement une information très bruitée dans le climat pré-élections.

Estimer une Proportion sur une Question Sensible, par Enquête

Comme le rapportait Slate hier (dans un article qui, malheureusement ne mérite pas d’être lu), un joli sujet a été proposé au baccalauréat au lycée français de Pondichéry, en mathématiques.

Ce sujet est d’autant plus intéressant qu’il revient sur une méthode assez classique pour questionner les gens sur des questions sensibles (ici sur le téléchargement pirate, mais on peut poser la même question sur la fraude, ou des pratiques sexuelles).

Comme le notait , cette technique avait été introduite initialement par Stanley Warner, voilà un demi-siècle,

Cette technique est particulièrement intéressante, tant d’un point de vu intellectuel que pratique. Plusieurs sur Twitter me faisaient remarquer que, contrairement à ce qui était raconté dans Slate, cette technique est effectivement utilisée.

Quand j’enseignais cette technique, je prenais la version simple, avec une pièce de monnaie. Supposons qu’une proportion  de personnes fraudent le fisc. Et qu’une proportion  aime Prince, va à la piscine une fois par mois, a un diplôme de l’enseignement supérieur, etc. Peut importe, la seconde proportion doit pouvoir être estimée sans problème avec une autre enquête (voire par le recensement). Bref, on a un estimateur de . Ici, les personnes interrogées tirent une pièce et répondent soit à la question “avez-vous déjà fraudé au Fisc?” s’ils tombent sur face, et à la question “aimez-vous Prince?” s’ils tombent sur pile. On pourrait dire qu’ils tirent une pièce dans leur tête, mais il faut s’assurer que la probabilité de tomber sur face est effectivement 1/2.

La magie est de noter que la proportion de personnes qui fraudent le fisc peut s’écrire

On peut avoir, par une autre enquête un estimateur du second terme, . Et en regardant des personnes qui ont répondu “oui” à une question inconnue, on a un estimateur pour

Et par différence, on en déduit un estimateur de . Les maths sont dans l’article de Stanley Warner, mais il faut reconnaître que la méthode est vraiment jolie…. Dans le cas du sujet du bac, la mise en oeuvre est un peu différente, mais l’idée est un peu la même….

(si certains ont des exemples pratiques d’application, les commentaires sont ouverts, ou sinon par mail pour joindre des documents en pièce jointe)

Licornes, philosophes, vieux cons, peer-review et instituts de sondages

oui, vaste programme… Lorsque les enfants étaient petits, je me souviens avoir été maintes fois étonné par la profondeur des questions qu’ils pouvaient poser,

dis papa, comment tu sais tout ça ?

ou

dis papa, si j’étais pas né comment ça serait ?

Toutes ces questions sont embarrassantes, car elles sont assez fondamentales quand on y pense. Car le problème est qu’après, les enfants grandissent, et pensent avoir des réponses à ces mêmes questions,

t’es sûre, tu ne veux pas une licorne pour ton anniversaire ?

mais non papa, ça n’existe pas les licornes

bien sûr que si que ça existe, n’oublie pas que les papas ça sait tout ! Et comment tu sais que ça existe pas d’abord ?

ben j’en ai jamais vu…

et alors… tu n’as jamais vu de crocodiles, et pourtant ça existe…

oui mais j’en ai vu à la télé

et moi à la télé j’ai vu des wookies et des ewoks dans Star Wars, et des dragons dans Harry Potter, et..

oui mais à la télé ça existe pas ! Les licornes personne n’en a jamais vu d’abord

et ça suffit pour dire que ça n’existe pas, tu penses ?

(en fait, on peut avoir ce même genre de dialogue avec dieu, ou mieux, le père Noël). Bref, suite à cette discussion je me demandais ce qui faisait qu’on y croyait ou qu’on n’y croyait plus. Par exemple en sciences: l’opposition classique entre sciences et religion est basée sur le fait que la religion repose sur la foi, et alors que la science non, on doit avoir une preuve de ce qu’on avance. Un peu comme le personnage de Gorgias (de Platon), le précurseur de tous nos hommes (et femmes) politiques: on a raison parce qu’on a eu le dernier mot. Et non parce qu’on l’a prouvé. Mais il faut être lucide. La science devient de plus en plus une histoire de foi et de croyance. Par exemple en cours, la très grande majorité de mes élèves me croient si je leur dit qu’une méthode ne marche pas, rares sont ceux qui penseraient à me demander de leur justifier, ou au mois de trouver des éléments étayant mon propos (car la tendance est de faire de moins de moins de démonstration en cours, surtout quand on fait de la statistique appliquée). Par exemple en séries temporelles: lorsque je faisais cours il y a 10 ans à l’université Paris Dauphine, on passait des heures sur les choix des ordres d’autorégression (faut-il un retard à l’ordre 4, ou 12 ?). Maintenant, tous les logiciels font ça automatiquement. Un peu comme le choix de la fenêtre quand on fait de l’estimation à noyau… sous R, on a un choix optimal de fenêtre… et souvent, quand on est pressé, on y croit.

Oui, en sciences, on utilise beaucoup cet argument de foi. Le plus classique étant de dire que ça a été publié dans une grande revue… Et c’est le principe du peer-review: on délègue à d’autres chercheurs la responsabilité de regarder en détails un papier, qui souvent dépasse nos propres compétences, afin de se reposer sur leur jugement les yeux fermés. C’est bien entendu stupide, et c’est pour ça qu’on demande aux étudiants de maîtrise de creuser les papiers en détails, de relire et comprendre les démonstrations, et de faire des simulations pour vérifier si ça marche ! Et je serais bien le premier à dire qu’il ne faut jamais croire ce qui est écrit dans mes livres ou mes papiers ! ou sur le blog ! Quoi que… sur le blog, je mets autant que possible l’intégralité des codes, afin de permettre aux personnes de vérifier plus facilement ce que j’ai fait. Et c’est le gros intérêt du blog pour les chercheurs, par rapport aux articles publiés: on n’est pas là pour épater la galerie (je renvoie d’ailleurs à un très bon article expliquant comment écrire un article scientifique). Sur le blog, on peut davantage lancer des discussions, et être beaucoup plus transparents, et modestes !

Soit dit en passant, cette histoire de foi se retrouve largement dans cette mise en abyme des sondages, évoquée dans un précédant billet, sur le fait que plus personne ne croit aux sondages. Pourtant des grands sociologues et des grands statisticiens ont travaillé depuis des dizaines d’années sur la théorie des sondages. Des centaines d’articles (parus dans des articles relus par d’autres grands scientifiques) justifient certaines méthodes d’analyse. Et pourtant la foi n’est pas là. Peut-être serait-il temps que les instituts soient plus transparents, qu’ils donnent accès aux données brutes. Car je suis convaincu que la transparence est la clé de tout. Enfin presque… pour l’existence du père Noël, je vais me battre autant que possible pour maintenir le doute !

25% ? sérieusemement, vous y croyez ?

(pour reprendre les statistiques postées par @guybirenbaum l’autre jour)

Réfléchissons deux minutes (ou un peu plus, c’est ce qu’on a fait ce midi avec @J_P_Boucher). On vous interroge sur un sondage: si vous croyez aux sondages, vous le dites. Mais si vous n’y croyez pas… vous répondez n’importe quoi (sinon c’est que vous y croyez, non ?). Bon essayons de formaliser ça afin de mieux comprendre… Soit https://latex.codecogs.com/gif.latex?X la réponse donnée, et https://latex.codecogs.com/gif.latex?Y la vérité (ce que pense vraiment la personne interrogée). On sait que

https://latex.codecogs.com/gif.latex?\mathbb{P}(X=C)=1-\mathbb{P}(X=CP)=\frac{1}{4}

Mais ce qu’on veut calculer, c’est https://latex.codecogs.com/gif.latex?p=%20\mathbb{P}(Y=C), la probabilité qu’une personne y croit vraiment aux sondages. Pour ça, on sait que

https://latex.codecogs.com/gif.latex?\mathbb{P}(X=C)=\mathbb{P}(X=C|Y=C)\cdot%20\mathbb{P}(Y=C)

https://latex.codecogs.com/gif.latex?+\mathbb{P}(X=C|Y=CP)\cdot%20\mathbb{P}(Y=CP)

Pour le premier terme, une personne qui y croit le dira (sinon c’est qu’elle n’y croit pas), donc https://latex.codecogs.com/gif.latex?%20\mathbb{P}(X=C|Y=C)=1. Par contre, une personne qui n’y croit pas peut dire n’importe quoi. Disons que https://latex.codecogs.com/gif.latex?%20\mathbb{P}(X=C|Y=CP) vaut https://latex.codecogs.com/gif.latex?%20\alpha. Dans ce cas

https://latex.codecogs.com/gif.latex?%20\frac{1}{4}=p+\alpha(1-p)

ou encore

https://latex.codecogs.com/gif.latex?%20p=\frac{1/4-\alpha}{1-\alpha}

Supposons par exemple qu’une petite proportion des personnes qui n’y croient pas disent y croire, disons 10%. Dans ce cas, la vraie probabilité qu’une personne croit au sondage serait plutôt 16%. Si https://latex.codecogs.com/gif.latex?%20\alpha était un peu plus grand (25%), on serait juste tombé sur la proportion des rigolos qui répondent n’importe quoi aux sondages, car personne n’y croit !

Sondages et prévisions de séries temporelles

Ce soir, @imparibus proposait sur son blog un billet passionnant sur l’élection présidentielle en France, avec des graphiques superbes, basé sur un lissage temporel des résultats des sondages pour le premier tour de l’élection présidentielle en France (qu’il a fait sous excel, on saluera la performance !). En reprenant les données du site http://www.lemonde.fr/, on peut obtenir la même chose assez simplement (j’ai repris – ou presque – les couleurs utilisées sur le site, François Hollande en rose, Nicolas Sarkozy en bleu, François Bayrou en orange, et Marine Le Pen en noir…). Pour commencer, le code en R pour importer les données et les manipuler est le suivant

sondage=read.table("http://freakonometrics.blog.free.fr/
public/data/sondage1ertour2012.csv",
header=TRUE,sep=";",dec=",")
sondage[36,1]="11/03/12"
sondeur=unique(sondage$SONDEUR)
sondage$date=as.Date(as.character(sondage$DATE),
"%d/%m/%y")

(je fais manuellement une correction de date car je me suis trompé en saisissant les chiffres à la main). A partir de là, on peut reprendre l’idée de faire une régression locale pour trouver une tendance,

CL=brewer.pal(6, "RdBu")
couleur=c(CL[1],CL[6],"orange","grey")
datefin=as.Date("2012/04/12")
k=1
plot(sondage$date,sondage[,k+2],col=couleur[k],
pch=19,cex=.7,xlab="",ylab="",ylim=c(0,40),
xlim=c(min(sondage$date),datefin))
rl=lowess(sondage$date,sondage[,k+2])
lines(rl,lwd=2,col=couleur[k])
for(k in 2:4){
points(sondage$date,sondage[,k+2],
col=couleur[k],pch=19,cex=.7)
rl=lowess(sondage$date,sondage[,k+2])
lines(rl,lwd=2,col=couleur[k])
}

Le code a l’air long mais il faut définir les couleurs, générer une fenêtre graphique, mettre les régressions locales dedans, etc. En tant que telle, la commande qui permet de faire le lissage est juste

rl=lowess(sondage$date,sondage[,k+2])

Bon, on peut d’ailleurs faire toutes sortes de lissages, avec des splines par exemple (ce que j’ai davantage tendance à utiliser),

D=data.frame(date=min(sondage$date)+0:148)
library(splines)
k=1
plot(sondage$date,sondage[,k+2],
col=couleur[k],pch=19,cex=.7,
xlab="",ylab="",ylim=c(0,40),xlim=
c(min(sondage$date),datefin))
rs=lm(sondage[,k+2]~bs(date),data=sondage)
prl=predict(rs,newdata=D)
prlse=sqrt(prl/100*(1-prl/100)/1000)*100
polygon(c(D$date,rev(D$date)),c(prl+2*prlse,
rev(prl-2*prlse)),col=CL[3],border=NA)
lines(D$date,prl,lwd=2,col=CL[1])
points(sondage$date,sondage[,k+2],
col=couleur[k],pch=19,cex=.7,)
for(k in 2:4){
points(sondage$date,sondage[,k+2],
col=couleur[k],pch=19,cex=.7)
}

avec, là encore, la commande suivante pour lisser

rs=lm(sondage[,k+2]~bs(date),data=sondage)

Cette fois le code est un peu plus long, parce que j’ai tracé un intervalle de confiance à 95% (intervalle de confiance classique, en supposant que 1000 personnes ont été interrogées, comme évoqué dans d’anciens billets),

http://freakonometrics.hypotheses.org/files/2015/12/adic10.gif

On a ici la courbe suivante

avec l’intervalle de confiance pour François Hollande, mais on peut faire la même chose pour Nicolas Sarkozy,

k=2
plot(sondage$date,sondage[,k+2],
col=couleur[k],pch=19,cex=.7,
xlab="",ylab="",ylim=c(0,40),xlim=
c(min(sondage$date),datefin))
rs=lm(sondage[,k+2]~bs(date),data=sondage)
prl=predict(rs,newdata=D)
prlse=sqrt(prl/100*(1-prl/100)/1000)*100
polygon(c(D$date,rev(D$date)),c(prl+2*prlse,
rev(prl-2*prlse)),col=CL[4],border=NA)
lines(D$date,prl,lwd=2,col=CL[6])
points(sondage$date,sondage[,k+2],col=
couleur[k],pch=19,cex=.7,)
for(k in c(1,3:4)){
points(sondage$date,sondage[,k+2],col=
couleur[k],pch=19,cex=.7)
}

Mais comme auparavant, on peut aussi visualiser les “tendances” des quatre candidats en tête,

Voilà pour le début. En fait, idéalement, on voudrait faire un peu de prévision… Le hic est que les code usuel pour faire de la prévision (avec des ARIMA, du lissage exponentiel ou tout autre modèle classique) nécessitent de travailler avec des séries temporelles, telles qu’elles sont classiquement définies, c’est à dire “régulièrement espacées dans le temps“.

Je ne vais pas commencer à réclamer plus de sondages, loin de moins cette idée, mais pour mon modèle, j’avoue que j’aurais préféré avoir plus de points. Beaucoup plus de points. Un sondage par jour aurait été idéal en fait…

Qu’à cela ne tienne, on va simuler des sondages. L’idée est simple: on a une tendance qui nous donne une probabilité jour par jour (c’est exactement ce qui a été calculé pour tracer les courbes), via

D=data.frame(date=min(sondage$date)+0:148)
prl=predict(rs,newdata=D)

On va ensuite utiliser une hypothèse de normalité multivariée sur nos 4 candidats, auquel j’en ai en rajouté un cinquième fictif (mais ça ne servait à rien) en utilisant l’analogue multivariée de l’expression suivante (évoqué dans le premier billet de l’année sur les élections)

http://freakonometrics.hypotheses.org/files/2015/12/ic-sondage01.gif

On peut alors générer, jour après jour, des sondages, en simulant des vecteurs Gaussiens. Je vais les générer indépendants les uns des autres, parce que c’est plus simple, et que cela ne me semble pas être une trop grosse hypothèse. Pour générer un ensemble de sondages, on utilise la fonction suivante

library(mnormt)
simulation=function(S){
proba=c(S,100-sum(S))/100
variance= -proba%*%t(proba)
diag(variance)=proba*(1-proba)
variance=variance/1000
return(rmnorm(1,proba[1:4],variance[1:4,1:4]))}
simulsondages=function(M){
Z=rep(NA,ncol(M))
for(i in 1:nrow(M)){
Z=rbind(Z,simulation(M[i,]))
}
return(Z[-1,])}
prediction4=matrix(NA,nrow(D),4)
for(k in 1:4){
rs=lm(sondage[,k+2]~bs(date),data=sondage)
prediction4[,k]=predict(rs,newdata=D)
}

Par exemple, si on la fait tourner une fois, on obtient le graphique suivant

set.seed(1)
S4=simulsondages(prediction4)
S100=100*S4
k=1
plot(D$date,S100[,k],col=couleur[k],
pch=19,cex=.7,
xlab="",ylab="",ylim=c(0,40),xlim=
c(min(sondage$date),datefin))
rs=lm(sondage[,k+2]~bs(date),data=sondage)
lines(D$date,predict(rs,newdata=D),
lwd=2,col=couleur[k])
for(k in 2:4){
points(D$date,S100[,k],col=couleur[k],
pch=19,cex=.7)
rs=lm(sondage[,k+2]~bs(date),data=sondage)
lines(D$date,predict(rs,newdata=D),
lwd=2,col=couleur[k])
}

(les courbes lissées sont celles obtenues sur les vrais sondages). Là on peut être heureux, parce qu’on a des vraies séries temporelles. On peut alors faire de la prévision, par exemple en faisant du lissage exponentiel (optimisé),

library(forecast)
k=1
X=S100[,k]
ETS=ets(X)
F=forecast(ETS,h=60)
fdate=max(D$date)+1:60
k=1
plot(D$date,S100[,k],col=couleur[k],
pch=19,cex=.7,
xlab="",ylab="",ylim=c(0,40),xlim=
c(min(sondage$date),datefin))
rs=lm(sondage[,k+2]~bs(date),data=sondage)
lines(D$date,predict(rs,newdata=D),
lwd=2,col=couleur[k])
for(k in 2:4){
points(D$date,S100[,k],col=couleur[k],
pch=19,cex=.7)
rs=lm(sondage[,k+2]~bs(date),data=sondage)
lines(D$date,predict(rs,newdata=D),lwd=2,col=couleur[k])
}
polygon(c(fdate,rev(fdate)),c(as.numeric(F$lower[,2]),
rev(as.numeric(F$upper[,2]))),col=CL[3],border=NA)
polygon(c(fdate,rev(fdate)),
c(as.numeric(F$lower[,1]),rev(as.numeric(F$upper[,1]))),
col=CL[2],border=NA)
lines(fdate,as.numeric(F$mean),lwd=2,col=CL[1])

Là encore le code peut paraître long, mais c’est surtout la partie associée au graphique qui prend de la place (par soucis purement esthétique, on passe du temps sur les codes graphiques depuis le début). Le code qui modélise la série, et qui la projette, est ici donné par les deux lignes suivantes

ETS=ets(X)
F=forecast(ETS,h=60)

Pour François Hollande, sur la simulation des sondages passés que l’on vient d’effectuer, on obtient la prévision suivante

On peut bien entendu faire une projection similaire pour Nicolas Sarkozy,

k=2
X=S100[,k]
ETS = ets(X)
F=forecast(ETS,h=60)
k=1
plot(D$date,S100[,k],col=couleur[k],pch=19,cex=.7,
xlab="",ylab="",ylim=c(0,40),xlim=
c(min(sondage$date),datefin))
rs=lm(sondage[,k+2]~bs(date),data=sondage)
lines(D$date,predict(rs,newdata=D),
lwd=2,col=couleur[k])
for(k in 2:4){
points(D$date,S100[,k],col=couleur[k],
pch=19,cex=.7)
rs=lm(sondage[,k+2]~bs(date),data=sondage)
lines(D$date,predict(rs,newdata=D),
lwd=2,col=couleur[k])
}
polygon(c(fdate,rev(fdate)),c(as.numeric(F$lower[,2]),
rev(as.numeric(F$upper[,2]))),col=CL[4],border=NA)
polygon(c(fdate,rev(fdate)),
c(as.numeric(F$lower[,1]),rev(as.numeric(F$upper[,1]))),
col=CL[5],border=NA)
lines(fdate,as.numeric(F$mean),lwd=2,col=CL[6])

On notera que je ne me suis pas trop fatigué sur la projection: autant sur la génération de sondages passés on a tenu compte de corrélation (i.e. si un candidat a un score élevé, ça se fera au détriment des autres, d’où la corrélation négative utilisée dans la simulation), autant ici, les projections sont faites de manière complétement indépendantes. En se fatiguant un peu plus, on pourrait se lancer dans un modèle vectoriel gaussien. Ou mieux, on pourrait travailler sur des processus de Dirichlet (surtout que R a un package dédié à ce genre de modèle) parce qu’on travaille depuis le début sur des taux, comme évoqué auparavant. Mais commençons par faire simple pour un premier billet rapide sur ce sujet.

On peut ensuite s’amuser à générer plusieurs jeux de sondages, et de lancer des prévisions dessus,

set.seed(1)
for(sim in 1:20){
Ssim=simulsondages(prediction4)
F1=forecast(ets(100*Ssim[,1]),h=60)
F2=forecast(ets(100*Ssim[,2]),h=60)
lines(fdate,as.numeric(F1$mean),col=CL[1])
lines(fdate,as.numeric(F2$mean),col=CL[6])}

Une fois qu’on a fait tout ça, on a presque fini. On peut regarder au 22 avril qui est en tête (voire, par scénario, calculer la probabilité qu’un des deux candidats soit en tête), c’est à dire au soir du 1er tour

set.seed(1)
VICTOIRE=rep(NA,1000)
for(sim in 1:1000){
Ssim=simulsondages(prediction4)
F1=forecast(ets(100*Ssim[,1]),h=60)
F2=forecast(ets(100*Ssim[,2]),h=60)
VICTOIRE[sim]=(F1$mean[30]>F2$mean[30])}
mean(VICTOIRE)

Et voilà. Ah oui, je n’ai pas laissé le résultat. Tout d’abord parce que je suis un statisticien, pas unprédicateur. Mais aussi parce que si ce genre de pronostic amuse des gens… ils n’ont qu’à se mettre à R pour faire tourner les codes !

Sondages et probabilités en trois graphiques

Petite précision liminaire: je suis nul en sondage. Je n’ai jamais rien compris aux sondages. C’est la matière où j’ai eu ma pire note quand j’étais étudiant. Mais si on voit un sondage comme l’estimation d’une probabilité de succès, dans des tirages de lois binomiales (ou multinomiales), alors je me sens plus à l’aise pour commenter des choses lues ici ou là. Car en ces temps d’élections (qui approchent), on lit beaucoup de choses sur les sondages ou sur les intervalles de confiance des sondages, voire sur des comparaison de sondages… mais rares sont les justifications. Donc on va creuser un peu (histoire de voir ce qui peut être dit, dans un cadre largement simplifié).

  • “Il y a 1 chance sur 4 qu’un sondage donne une variation d’un point en + ou en – sur une proportion inchangée”

comme le disait @adelaigue (sur Twitter). Faire un sondage politique (si on résume simplement) c’est estimer la probabilité http://freakonometrics.hypotheses.org/files/2015/12/adic01.gif de voter pour A, sachant que l’on a alors une probabilité http://freakonometrics.hypotheses.org/files/2015/12/adic02.gif pour qu’une personne prise au hasard ne vote par pour A. Sur http://freakonometrics.hypotheses.org/files/2015/12/adic03.gif personnes interrogées, le nombre de personnes qui déclarera voter pour A est http://freakonometrics.hypotheses.org/files/2015/12/adic04.gif, qui suit une loi binomiale de paramètres http://freakonometrics.hypotheses.org/files/2015/12/adic03.gif et http://freakonometrics.hypotheses.org/files/2015/12/adic01.gif. Or par approximation (ou convergence) de la loi binomiale par une loi Gaussienne, on peut dire que

http://freakonometrics.hypotheses.org/files/2015/12/adic05.gif

Or l’estimateur naturel de http://freakonometrics.hypotheses.org/files/2015/12/adic01.gif est http://freakonometrics.hypotheses.org/files/2015/12/adic06.gif, i.e.

http://freakonometrics.hypotheses.org/files/2015/12/adic07.gif

Aussi, on en déduit l’intervalle de confiance classique, tel que http://freakonometrics.hypotheses.org/files/2015/12/adic01.gif appartient à cet intervalle avec une probabilité http://freakonometrics.hypotheses.org/files/2015/12/adic11.gif,

http://freakonometrics.hypotheses.org/files/2015/12/adic08.gif

http://freakonometrics.hypotheses.org/files/2015/12/adic12.gif désigne la fonction quantile de la loi normale centrée réduite; ou encore, en remplaçant les quantités inconnues par des estimateurs,

http://freakonometrics.hypotheses.org/files/2015/12/adic09.gif

Les bornes de l’intervalle de confiance de niveau http://freakonometrics.hypotheses.org/files/2015/12/adic11.gif sont alors

http://freakonometrics.hypotheses.org/files/2015/12/adic10.gif

C’est ce qu’on peut visualiser sur la figure ci-dessous,

Comme le notait @adelaigue, si on souhaite avoir

http://freakonometrics.hypotheses.org/files/2015/12/adic13.gif

(car on parle d’un point de base 100), il faudrait que

http://freakonometrics.hypotheses.org/files/2015/12/adic14.gif

Classiquement, http://freakonometrics.hypotheses.org/files/2015/12/adic03.gif est aux alentours de 1000. Et ce qu’on cherche c’est une probabilité d’appartenir à un intervalle, i.e. http://freakonometrics.hypotheses.org/files/2015/12/adic11.gif,

http://freakonometrics.hypotheses.org/files/2015/12/adi15.gif

Graphiquement, en fonction de http://freakonometrics.hypotheses.org/files/2015/12/adic01.gif on a alors

p=seq(0,1,by=.0025)
plot(p,2*(1-pnorm(.01/sqrt(p*(1-p)/1000))))

(ca sera notre premier graphique). Effectivement, entre 35% et 65%, il y a environ 50% de chances d’être autour de la fréquence observée, à un point près. Ou 50% de chances d’avoir plus d’un point de différence. Autrement dit, si on a observé avec 1000 personnes une fréquence de 40%, il y a une chance sur 4 que la probabilité soit entre 39% et 40%, une chance sur 4 qu’elle soit entre 40% et 41%, et surtout une chance sur 4 qu’elle soit inférieure à 39%, et 1 chance sur 4 qu’elle soit supérieure à 41%. Comme le notait @adelaigue, sur les bords, il semble que la formule ne soit pas valide. Mais si on prend justement les cas limites (probabilité très proche de 0, voire franchement nulle), est-ce qu’on peut dire quelque-chose ?

  • peut-on dire quelque chose (malgré tout) quand on ne peut rien dire ?

ou plus précisément, si en interrogeant http://freakonometrics.hypotheses.org/files/2015/12/adic03.gif personnes et que personne n’a déclaré vouloir voter pour A, quelle serait l’intervalle de confiance de la probabilité de voter pour A ? J’avais évoqué ce point dans un très vieux billet. La première piste est la réponse apporté par Pearson-Clopper (Pearson & Clopper (1934)), basée sur l’utilisation de la loi binomiale, et non plus d’une approximation.

library(Hmisc)
bornesup=function(N){ binom.test(x=0, n=N, p = 0,
alternative="less")$conf.int[2]*100 }
BS=Vectorize(bornesup)
vn=seq(10,500,by=10)
plot(vn,BS(vn))

Une alternative est de faire du bayésien. On utilise le fait que la loi conjuguée de la loi binomiale est la loi beta (comme évoqué dans des précédents billets). Si on suppose que la loi a priori de http://freakonometrics.hypotheses.org/files/2015/12/adic01.gifest une loi alors la loi a posteriori, sachant que sur http://freakonometrics.hypotheses.org/files/2015/12/adic03.gif lancés, on n’a observé que des 0, devient

bornesup=function(N){ qbeta(.95,1,1+N)*100 }
BS=Vectorize(bornesup)
lines(vn,BS(vn),lwd=2,col="blue")

La courbe ci-dessus correspond au calcul dans le cas du modèle de Pearson-Clopper, en rouge, et avec le quantile de la loi Beta en bleu (qui sont confondues sur ce graphique). Autrement dit, avec 300 personnes interrogées, si aucune ne dit vouloir voter pour A, l’intervalle de confiance pour http://freakonometrics.hypotheses.org/files/2015/12/adic01.gif est [0%;1%] (environ). Ca sera notre second graphique.

  • si on a trois alternatives, quelles sont les vraies probabilités de gagner ?

c’était déjà sur cette question que je concluais mon précédant billet, mais il est possible d’exploiter davantage cette idée de modèle bayésien avec un a priori suivant une loi beta (comme au dessus) ou de Dirichlet (si on a plus de deux alternatives). La première chose que l’on peut noter, c’est que s’il y a trois alternatives (A, B et C), et que la probabilité de voter pour A est 40%, la probabilité que A gagne… dépend des autres probabilités. On ne peut pas faire comme si A était seul, contre tous les autres:
– si les probabilités de voter pour B et C sont de l’ordre de 30%, on se dit que A a de fortes chances de gagner (oui, pour l’instant ce n’est pas très quantitatif).
– si les probabilités de voter pour B et C sont respectivement 55% et 5%, alors on se dit que A a de faibles chances de gagner.
Plus précisément, si on souhaite savoir si A va l’emporter ou pas, et que 200 personnes ont été interrogées, on peut essayer de faire une abaque, avec des courbes de niveau… dans le simplexe. Pour rappel, les scores obtenus par A, B et C se lisent sur le triangle ci-dessous (le point représenté correspond au triplet (40%,35%,25%))

Les probabilités sont les suivantes, avec n=200 (personnes qui se seraient exprimés)

où la région rouge correspond à une (quasi) certitude de gagner, pour A, et la région blanche, au contraire, une probabilité infinitésimale de gagner.

Ces résultats ont été obtenus par simulation,
vx=v[i]
vz=v[j]
vy=1-vz-vx
alpha=c(vx,vy,vz)
alpha=c(alpha,1-sum(alpha))*200
RD=rdirichlet(ns, alpha)
PROBA[i,j]=mean(RD[,1]>=apply(
cbind(RD[,3],RD[,2]),1,max))

Pour ceux que ne sont pas très à l’aise avec les excursions dans le simplexe, on peut se ramener dans un repère orthonormé. Ici, les scores obtenus par A et B se lisent sur le triangle ci-dessous (le point représenté correspond au triplet (40%,35%,25%), le même qu’auparavant

On a alors les probabilités de gagner suivantes, avec à droite la représentation sur le simplexe, en zoomant autour de notre triplet,

 

(ça sera le troisième et dernier graph). Si on regarde plus en détails, l’intervalle de confiance sur la probabilité de gagner dépend de la région où on se trouve dans le simplexe (un peu comme l’intervalle de confiance dépendait de la probabilité de l’emporter, dans la première partie de ce billet).

Maintenant, comme le rappelait @Christian dans un commentaire, tout cela est la version très simpliste de la pratique des sondages. Dans les vrais sondages (et pas des exercices de probabilités comme on vient d’en faire ici), on utilise des quotas, on fait du redessement, et c’est beaucoup plus complexe (enfin… c’est ce que j’essaye de me dire, pour me convaincre que la mauvaise note que j’avais obtenue lorsque j’étais étudiant était motivée).

et c’est parti pour les élections…

Ce soir, @imparibus reprenait  une information du Point (ici). “Un sondage de l’institut Sensus diffusé jeudi crédite Mme Rousseff, 62 ans, de 46,8% des intentions de vote et José Serra, 68 ans, de 42,7% […]  la marge d’erreur du sondage est de 2,2%, a expliqué un reponsable de l’enquête [… ce qui donne une ] grande probabilité que les 2 candidats soient à égalité”. @imparibus affirmait que c’était faux,@adelaigue me demandant mon avis…
Bon, je suis flâté qu’Alexandre m’appelle à l’aide, mais je suis plutôt nul en sondage… Bref, pour faire une réponse intelligente et détaillée, il me faudra un peu plus de place que ce que ne me propose Twitter…
Soit https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial01.png la probabilité de voter pour R, et https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial02.png la probabilité de voter pour S. On note https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial03.png la probabilité de voter pour un autre candidat, https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial04.png.
Si https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial05.png et https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial06.png sont les fréquences empiriques obtenues à partir de https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial15.png personnes sondées, rappelons que

https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial07.png
https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial08.png

et

https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial09.png

Aussi,

https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial11.png

Si on veut tester https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial12.png (hypothèse https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial13.png) car c’est finalement de ça qu’on parle ici, l’idée la plus naturelle serait d’introduire la statistique de test d’égalité des proportions,

https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial14.png

qui suit – à la louche – une loi normale sous https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial13.png.
C’est bien joli tout ça, mais je ne connais pas https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial15.png ! En fait, on va essayer de s’aider de la petite phrase “la marge d’erreur du sondage est de 2,2%”
Alors si j’en crois le site d’ipsos (ici),  cette marge d’erreur correspond à 2000 personnes interrogées…
Or ici https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial05.png =46% et et https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial06.png = 42.7%, avec

https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial16.png

soit,

https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial18.png

Si on compare à une loi normale, on a 2.6% de chances d’atteindre une telle valeur…
On peut aussi faire un test du chi-deux. En cas d’égalité des proportions, on devrait avoir https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial19.png=44.75%
et si on utilise un test du chi-deux pour mesurer la distance entre les deux lois multinomiale (sous https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial13.png et sous H1), on a comme distance du chi-deux

https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial21.png

soit ici https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial22.png=3.71 avec 2000 personnes interrogées. Sous https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial13.pnghttps://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial22.png devrait suivre une loi du chi-deux à 1 degré de liberté, ce qui donne une p-value de 5.26%.
On peut aussi tenter un test de rapport de vraisemblance. Sous https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial13.png, on a

https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial24.png

alors que sous https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial23.png

https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial25.png

(en utilisant la forme des lois multinomiales). Le rapport des vraisemblances s’écrit alors

https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial26.png

soit ici https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial27.png= 10.436. La statistique de test est icihttps://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial27.png qui doit suivre, sous https://perso.univ-rennes1.fr/arthur.charpentier/latex/multinomial13.png une loi du chi-deux à un degré de liberté. La p-value associée est alors de l’ordre de 0,1%….
Bon, il semble qu’on puisse raffiner un peu les tests, en reprenant les idées de Nass (1959) et de Hoel (1938) – mais qui sont intéressant si on a peu de données (ce qui n’est pas vraiment le cas ici).
Bref, j’aurais tendance à être plutôt d’accord avec @imparibus. Maintenant, je suis nul en sondage, donc si quelqu’un a d’autres idées, je suis preneur ! Surtout que j’ai peut-être fait quelques erreurs de calculs ici ou là….