All posts by Arthur Charpentier

Arthur Charpentier, professor in Montréal, in Actuarial Science. Former professor-assistant at ENSAE Paristech, associate professor at Ecole Polytechnique and assistant professor in Economics at Université de Rennes 1.  Graduated from ENSAE, Master in Mathematical Economics (Paris Dauphine), PhD in Mathematics (KU Leuven), and Fellow of the French Institute of Actuaries.

“Ethics in Quantitative Finance”

Just before going to the workshop on dependencies in finance and insurance, Tim Johnson (also known as @TCJUK on Twitter), researcher at Heriot-Watt University in Edinburgh and blogger on http://magic-maths-money.blogspot, sent me a copy of his manuscript entitled Ethics in Quantitative Finance: a pragmatic theory of markets. While opening the book, we think of Peter L. Bernstein, his masterpieces Capital Ideas (or the later Capital Ideas Evolving) as well as Against the Gods. But Tim’s book is quite different.  This book is not really about finance, but about financial valuation and actuarial science. We can clearly see the deep interactions between financial mathematics and actuarial science. About uncertainy, prices and probabilities. And all those topics are embeded with a philosophical perspective

the argument is presented that financial markets are radically uncertain environments, where correspondence theories of truth are meaningless since there are no matters of fact about an uncertain financial future. In the face of this uncertainty, markets are places where “the opinion which is fated to be ultimately agreed to by all who investigate” is sought and opinions are expressed through asset prices. This implies that markets are centres of communicative action and money is behaving as a language. Using Jürgen Habermas’ analysis, this implies that market prices ‒ statements of opinions ‒ must satisfy objective, subjective and social truth criteria. The argument presented is that reciprocity guarantees the objective truth, sincerity guarantees the subjective truth and charity guarantees the rightness of a price. This explains why reciprocity is embedded in financial mathematics.

Continue reading “Ethics in Quantitative Finance”

Conference on Finance and Insurance in Aegina, Greece

Next week, I will be in Αίγινα, Greece, for the conference on Recent Developments in Dependence Modelling with Applications in Finance and Insurance. Unfortunately, my plane arrived a bit late Sunday afternoon in Αθήνα to catch the boat, so I will spend the first night in Αθήνα. I will then join the conference, to present some results from our actuarial pricing game.

 

“Statistical Learning and Econometrics” Workshop at Erasmus University Rotterdam

This week, I will be in Rotterdam, at the WorkshopStatistical Learning and Data Science, with Trevor Hastie (Stanford University), Jason Roos (RSM-Erasmus University Rotterdam), David Martens (University of Antwerpen ), Didier Nibbering (ESE-Erasmus University Rotterdam) and Gérard Biau (Université Pierre et Marie Curie).

I will give a talk on quantile and expectile regressions. Slides are online.

Peut-on vraiment prévoir la probabilité de gagner une élection présidentielle ?

Cet article est co-signé avec Avner Bar-Hen, Conservatoire national des arts et métiers (CNAM)

L’élection du Président de la République française constitue un exemple important de mode de scrutin à deux tours. L’issue des deux tours est évidemment liée, et les résultats du premier permettent d’avoir une idée de l’issue du second tour. The Conversation

Il est en effet plausible que les électeurs ayant voté au premier tour pour l’un des candidats qualifiés au second tour confortent leur choix. En revanche, le vote des électeurs ayant accordé au premier tour leur suffrage à des candidats éliminés du second tour est entaché de plus d’incertitude. Le choix de ces électeurs n’est pas totalement aléatoire car il est dépend fortement de la proximité idéologique et partisane entre le candidat pour lequel ils ont voté au premier tour et chacun des candidats qualifiés.

Reports de vote

Les choix électoraux au second tour de scrutin des électeurs ayant voté au premier tour pour un candidat éliminé sont appelés les « reports de vote ». Ils sont généralement appréhendés de manière agrégée et sous forme de proportions : telle fraction de l’électorat de premier tour de tel candidat se reporte sur tel candidat au second tour.

La connaissance de ces reports de votes comporte principalement deux intérêts. D’une part, les reports de votes constituent un élément de science politique à part entière. Ils renseignent au sujet du positionnement respectif des électorats, de l’ordre de priorité qu’ils attribuent aux différentes thématiques du débat public, de leur fidélité partisane et de leur degré d’information politique. À ce titre, ils sont susceptibles d’intéresser les formations politiques et les candidats eux-mêmes dans l’élaboration ex ante de leurs stratégies électorales et dans leur évaluation ex post. D’autre part, connaître les reports de votes permet de construire des prédictions des résultats du second tour à l’issue du premier tour.

Les estimations de reports de votes publiées, notamment dans la presse, résultent le plus souvent de sondages effectués directement auprès des électeurs. L’estimation produite par le sondage va dépendre de l’échantillon tiré, avec pour corollaire l’existence d’un inévitable écart entre le paramètre et son estimation. Cet écart est quantifié en terme de probabilité associée à un sondage. Cependant les tailles d’échantillon utilisées et le très faible taux de réponse génèrent de telles incertitudes qu’il est difficile de conclure quoi que ce soit à partir de ces sondages.

Pour résumer rapidement, l’évolution (positive) de la présentation des sondages, et en particulier la présentation de termes de probabilité, doit s’accompagner d’une évolution des méthodes et en particulier des tailles d’échantillon. Il est important de rappeler que les intervalles de confiance n’ont aucune valeur prédictive (et donc aucune validité testable ex-post). Par exemple, comment lire le graphique ci-dessous sur les intentions de vote au premier tour :

Doit-on comprendre que fin janvier, 16 % des électeurs affirmaient vouloir voter pour Benoît Hamon, et qu’avec 95 chances sur 100 cette proportion était comprise entre 15 % et 17 % ? Un mois plus tard, il était à 14 %. A-t-il perdu des intentions de votes ? ou bien peut-on imaginer que des électeurs indécis fin janvier (et non comptabilisés) aient décidé de voter pour une autre alternative ? Les pourcentages ne sont pas, ici, relatifs à la même quantité.

Mais revenons à l’estimation des reports de voix, outils-clés pour prévoir la probabilité de gagner au second tour. Les estimations produites à l’aide d’outils mathématiques, à partir des résultats de scrutin par bureaux de vote, restent rares dans la presse mais c’est une source importante d’études en science politique. Essayons de voir le principe.

En démocratie, le vote de chaque électeur est confidentiel. À chaque tour d’une élection, seul le résultat agrégé des votes est connu, et le niveau le plus fin d’agrégation est donné par le bureau de vote. Les reports d’un vote à un autre sont inconnus, et leur estimation à partir des résultats agrégés nécessite de définir un modèle statistique. En effet, la décision individuelle de chaque électeur n’obéit à aucune fonction déterministe.

On résume souvent ce principe sous la formule « le vote est privé, les votes sont publics ». Néanmoins ce principe ouvre grand la porte au paradoxe de Simpson (on parle aussi d’erreur écologique) : à cause de la distribution hétérogène de l’échantillon, regrouper les données pointe une tendance qui peut être fausse, et qui disparaît si on analyse les données en séparant selon le facteur de confusion. L’utilisation de données socio-démographiques est donc importante.

Estimer la probabilité qu’un candidat gagne une élection

Tout d’abord, notons que l’élection mobilise un corps électoral composé de N électeurs répartis dans K bureaux de vote, à raison de Nk électeurs dans le bureau k. Le nombre d’électeurs dans chaque bureau demeure identique lors des deux tours. Pour chaque tour et chaque électeur, le vote peut être vu comme la sélection d’une unique modalité dans un ensemble de choix commun à tous les électeurs. Pour l’élection présidentielle de 2017, il y a I=13 choix possibles au premier tour : s’abstenir, voter blanc ou pour un des onze candidats ; et J = 4 choix possibles au second : s’abstenir, voter blanc ou pour les candidats Macron ou Le Pen.

Étant donné l’hypothèse de stabilité du corps électoral, on peut construire pour chaque bureau k, un tableau croisé (on parle de tableau de contingence) constitué des nombres Nk(i,j) d’électeurs ayant opté pour le choix i au premier tour et j au second, à l’issu du dépouillement du second tour. De ces tableaux, seules les marges suivant les lignes Nk(i,) et suivant les colonnes Nk(,j) sont connues et correspondent respectivement aux résultats du premier et du second tour. Les conditions de vote (isoloir, bulletin sous enveloppe, dépouillement à la fin…) font que lors du scrutin, les électeurs sont globalement ignorants des choix des autres électeurs, à l’exception de l’abstention qui fait l’objet d’une estimation communiquée et révisée régulièrement en cours de journée. Par conséquent, il semble relativement raisonnable de considérer que les décisions de vote sont prises simultanément et qu’elles sont donc indépendantes entre électeurs.

Les probabilités de report du candidat i au candidat j diffèrent a priori entre électeurs d’un même bureau et entre bureaux. Même si le résultat final était connu, les différentes manières d’estimer ces probabilités soulèvent des problèmes complexes, résolus en mobilisant de nombreuses techniques algorithmiques. Estimer la probabilité qu’un électeur ayant fait un des 13 choix possibles (par exemple l’abstention) au premier tour en fasse un des 4 possibles au second (par exemple l’abstention) est un exercice compliqué mais indispensable si on souhaite vraiment estimer la probabilité de victoire d’un candidat. Et à part enfoncer des portes ouvertes, on ne peut pas dire grand-chose : si quelqu’un dit qu’une pièce est pipée, et à 80 % de chances de tomber sur « pile », le fait qu’elle tombe une fois sur « pile » ne signifiera pas qu’il a « raison », pas plus que tomber sur « face » ne signifiera qu’il a « tort ».

En statistique, c’est la répétition qui permet de savoir si l’estimation d’une probabilité est pertinente. Or c’est le propre d’une élection que de ne se produire qu’une fois.


Pour aller plus loin : Søren Risbjerg Thompsen, « Danish Elections 1920-79 : A logit Approach to Ecological Analysis and Inference » (1987) et Fendrich, L’Hour et Rateau, « Reports de votes entre les deux tours d’une élection présidentielle : estimation statistique et sociologie électorale » (2014).

Avner Bar-Hen, Professeur du Cnam, Conservatoire national des arts et métiers (CNAM) et Arthur Charpentier, Maître de Conférences, Université Rennes 1

La version originale de cet article a été publiée sur The Conversation.

Proportion of people alive in 1945 that are still alive

In demography, we like to use life tables to estimate the probability that someone born in 1945 (say) is still alive nowadays.  But another interesting quantity might be the probability that someone alive in 1945 is still alive nowadays.

The main difference is that we do not know when that person, alive in 1945, was born. Someone who was old in 1945 is very unlikely still alive in 2017. To compute those probabilities, we can use datasets from http://www.mortality.org/hmd/. More precisely, we need both death and birth data. I assume that datasets (text files) were downloaded (it is necessary to register – for free – to get the data).

D=read.table("FRDeaths_1x1.txt",skip=1,header=TRUE)
B=read.table("FRBirths.txt",skip=1,header=TRUE)

In the death dataset, there is a “110+” for people older than 110 years. For convenience, let us cap our observations at 110 years old,

D$Age=as.numeric(as.character(D$Age))
D$Age[is.na(D$Age)]=110

Consider now a first function that will return, for people born in 1930 (say) two informations

  • the number of people (here, let us consider women only) born in 1930 (from the birth database)
  • the number of death of people of age 0 in 1930, people of age 1 in 1931, people of age 2 in 1932, etc…

The code is simple

nb=function(y=1930){
debut=1816
MatDFemale=matrix(D$Female,nrow=111)
colnames(MatDFemale)=debut+0:198
cly=y-debut+1:111
deces=diag(MatDFemale[,cly[cly%in%1:199]])
return(c(B$Female[B$Year==y],deces))}

We have a single number for the number of births, and then a vector for the number of deaths. Consider now another function. Consider the people born in 1930. We want to get two numbers : the number of people still alive in 1945 (say), and the number of people still alive nowadays. The ratio will be the proportion of people born in 1930 that were alive in 1945, that are still alive in 2015.

pop=function(ne=1930,an=1945){
comptage=nb(ne)
s=0
if(an>ne) s=sum(comptage[seq(2,1+an-ne)])
p1=max(comptage[1]-s,0)
p2=max(p1-sum(comptage[seq(2+an-ne,length(comptage))]),0)
c(p1,p2)
}

Then, for a given year (say 1945), to get the proportion of people alive in 1945 that are still alive today, we need to count how many people born in 1944 were still alive in 1945, and in 2015, but also born in 1943, 1942, etc, And we simply consider the ratio of the total number of people alive in 2015 over the total number of people alive in 1945

ptn=function(y=1945){
V=Vectorize(function(x) pop(x,y))(1816:y)
sum(V[2,!is.na(V[2,])])/sum(V[1,!is.na(V[1,])])
}

Hence, 22% of those alive in 1945 are still alive in 2015,

> ptn(1945)
[1] 0.2209435

Actually, instead of looking only at 1945, it is possible to get a plot

P=Vectorize(ptn)(1900:2010)
plot(1900:2010,P,type="l",ylim=0:1)

For instance,

> ptn(1975)
[1] 0.6377413

i.e. 63.7% of those alive in 1975 are stil alive 40 years after. That is a rather interesting function, I was surprised that I couldn’t find it is standard demographical R package…

Le retour des abeilles

Suite à mon précédant billet, “Maudites Abeilles“, j’ai eu des commentaires sur le blog, mais aussi sur Twitter pour me dire que malgré tout, il y avait bien une chance sur deux pour avoir un chemin bleu permettant de connecter les deux régions bleues, celle au nord et celle au sud.

En effet, dans le problème de base, les régions sont colorées, et le problème n’est pas l’existence d’un chemin, mais l’existence d’un chemin de la bonne couleur. Il faut juste rajouter une petite ligne pour spécifier la couleur du chemin

> simu2=function(d){
+ C=sample(c(rep(1,d^2/2),rep(2,d^2/2)),size=d^2)
+ B=NULL
+ for(i in 1:(d^2)){
+ x=rep(i,6)
+ y=c(i-d,i-d+1,i-1,i+1,i+d-1,i+d)
+ if(i%%d==1) y=c(i-d,i-d+1,NA,i+1,NA,i+d)
+ if(i%%d==0) y=c(i-d,NA,i-1,NA,i+d-1,i+d)
+ D=data.frame(x,y)
+ D=D[(D$y>=1)&(D$y<=d^2),] + B=rbind(B,D[which((C[D$y]==C[D$x])&(C[D$x]==1)),]) + } + B=B[(B[,2]>=1)&(B[,2]<=d^2),] + G=as.vector(t(B)) + G_iter=connect(make_graph(G), d^2) + connectpt=function(x) as.numeric(adjacent_vertices(G_iter,x)[[1]]) + sum(unlist(Vectorize(connectpt)(1:d))%in%(d^2+1-(1:d)))>0}
> appr=function(d,nsimu) mean(Vectorize(simu2)(rep(d,nsimu)))
> appr(4,10000)
[1] 0.4993

et en effet, il y a une chance sur deux de trouver un chemin bleu permettant de connecter les deux régions bleues. Mais comme je le disais hier, j’ai du mal avec l’argument de symétrie évoqué dans la “correction”.

Maudites Abeilles

Pendant les “vacances”, j’étais avec les enfants (le plus grand et la plus petite) au palais de la découverte, à Paris, à l’exposition temporaire “faîtes vos jeux“. Comme toujours, je suis surpris quand je compare les musées de sciences, et les musées d’art (j’avais fait un billet voilà quelques années en comparant le MoMaths et le Gugenheim, à New York City). Autant ma grande fille est autant intéressée par les tableaux que par les sciences, autant les deux autres préfèrent mille fois les seconds au premier. On a d’ailleurs passé plus de 4 heures au musée (dont une à faire toutes les animations de “faîtes vos jeux“), il a fallu y aller parce que j’avais une réunion de boulot (oui, les parisiens n’étaient pas en vacances, et j’avais une réunion impossible à déplacer). D’où les guillemets à “vacances” (le second jour de notre excursion, c’était une intervention de deux heures en fin d’après midi).

Mais je m’égare… A un des stands de l’animation, il avait le défi des abeilles,

Sur notre “damier” 8×8 (ici), on a 32 cases bleues et 32 rouges (ou oranges), et on cherche la probabilité qu’un chemin permette de passer d’un côté à l’autre. Sur le moment, le problème m’a pas mal pris la tête, et je me disais que la réponse devait être compliquée… en tout cas, que ça n’était pas aussi simple que ça…

En ligne, on peut trouver le guide de l’enseignant qui apporte des compléments aux divers ateliers, et qui propose, en l’occurrence, une solution

La réponse serait-ici 1/2. Mais la réponse ne me satisfait pas, en particulier la phrase “son absence à l’inverse impose un chemin orange” qui suppose qu’il existe forcément un chemin, soit rouge, soit bleu, pour passer d’un côté à l’autre, ce qui ne me semble pas trivial ! Quant

Par exemple sur le damier 4×4 ci-dessous,

il n’existe aucun chemin rouge allant  du bas vers le haut, et aucun chemin bleu non plus ! Et si on regarde, il existe (au moins) un chemin rouge allant de la gauche vers la droite, et un chemin bleu. Bref, la réponse 1/2 me semble douteuse….  Pour ceux qui veulent de vrai hasard (mais qui a autant de chance d’apparaître que celui au dessus), on a le graph ci-dessous

Mais maintenant essayons de la calculer cette probabilité. Par simulations au moins. Regardons un damier,

on peut le visualiser sous forme d’une matrice

ou en décalant un peu d’une matrice carrée 4×4 (ici)

Si on regarde ce que sont les voisins (afin de faire un chemin), sur le schéma initial, on cherchait les configuration suivantes

ce qui, dans notre matrice, correspond aux éléments ci-dessous,

Bref, on va pouvoir connecter des points d’un graph, et regarder si les 4 premiers éléments du graphs sont connectés aux 4 derniers

(le but est désormais de savoir si le nord et le sud connectent, peu importe la couleur). On peut commencer par créer le graph

d=4
set.seed(1)
C=sample(c(rep(1,d^2/2),rep(2,d^2/2)),size=d^2)
M=matrix(C,d,d)
> M
[,1] [,2] [,3] [,4]
[1,] 1 1 2 2
[2,] 1 2 1 1
[3,] 2 2 1 1
[4,] 2 2 1 2

ce qui correspond bien à notre matrice ci-dessous

On va alors créer le graph, c’est à dire chercher les noeuds qui communiquent

library(igraph)
B=NULL
for(i in 1:(d^2)){
x=rep(i,6)
y=c(i-d,i-d+1,i-1,i+1,i+d-1,i+d)
if(i%%d==1) y=c(i-d,i-d+1,NA,i+1,NA,i+d)
if(i%%d==0) y=c(i-d,NA,i-1,NA,i+d-1,i+d)
D=data.frame(x,y)
D=D[(D$y>=1)&(D$y<=d^2),] B=rbind(B,D[which(C[D$y]==C[D$x]),]) } B=B[(B[,2]>=1)&(B[,2]<=d^2),]
G=as.vector(t(B))
m=make_graph(G)

On peut ainsi voir ici que 1 communique avec 2, et 5

> B[B$x==1,]
x y
4 1 2
6 1 5

On peut d’ailleurs visualiser le graph, et voir qu’il est constitué de 4 graphs disjoints,

> plot(m)

(le coin 16 étant isolé, sans connection avec le reste – étrangement – il n’apparait pas sur le graph)

Pour trouver tous les points qui communiquent entre eux, on peut itérer un peu (voire beaucoup, peu importe)

G_iter=connect(make_graph(G), d^2)
connectpt=function(x) as.numeric(adjacent_vertices(G_iter,x)[[1]])

Ici, le nord et le sud communiquent s’il y a au moins un chemin (peu importe la longueur)

sum(unlist(Vectorize(connectpt)(1:d))%in%(d^2+1-(1:d)))>0

On peut alors une petite fonction, qui va générer une répartition des couleurs sur un damier carré (de longueur paire)

simu=function(d){
C=sample(c(rep(1,d^2/2),rep(2,d^2/2)),size=d^2)
B=NULL
for(i in 1:(d^2)){
x=rep(i,6)
y=c(i-d,i-d+1,i-1,i+1,i+d-1,i+d)
if(i%%d==1) y=c(i-d,i-d+1,NA,i+1,NA,i+d)
if(i%%d==0) y=c(i-d,NA,i-1,NA,i+d-1,i+d)
D=data.frame(x,y)
D=D[(D$y>=1)&(D$y<=d^2),] B=rbind(B,D[which(C[D$y]==C[D$x]),]) } B=B[(B[,2]>=1)&(B[,2]<=d^2),] G=as.vector(t(B)) G_iter=connect(make_graph(G), d^2) connectpt=function(x) as.numeric(adjacent_vertices(G_iter,x)[[1]]) sum(unlist(Vectorize(connectpt)(1:d))%in%(d^2+1-(1:d)))>0}

On peut alors construire la fonction suivante, pour faire un peu de monte carlo

appr=function(d,nsimu) mean(Vectorize(simu)(rep(d,nsimu)))

Par exemple sur notre damier 4×4, on a environ 3 chances sur 4 d’avoir un chemin (peu importe sa couleur) qui permette de rejoindre le sud depuis le nord

> appr(4,10000)
[1] 0.7446

alors que sur le 8×8 du palais de la découverte, on a

> appr(8,10000)
[1] 0.7805

78% de chances (un peu plus). Ce qui semble confirmer qu’il n’y a pas forcément un chemin permettant d’aller du nord au sud.

On peut d’ailleurs faire un petit dessin pour noter que quand la dimension du damier augmente (je n’ai pas tenté ici le cas impair – avec une case de plus d’une certaine couleur), la probabilité de trouver au moins un chemin semblerait augmenter (même si ça reste à prouver, et en particulier, je serais curieux de voire vers quoi ça converge…)

 

Visualiser les résultats du premier tour

Juste quelques lignes de code, pour visualiser les résultats du premier tour en France. L’idée est de faire une carte assez minimaliste, avec des cercles centrés sur les centroïdes des départements. On commence par récupérer les données pour le fond de carte, un fichier 7z sur le site de l’ign.

download.file("https://wxs-telechargement.ign.fr/oikr5jryiph0iwhw36053ptm/telechargement/inspire/GEOFLA_THEME-DEPARTEMENTS_2016$GEOFLA_2-2_DEPARTEMENT_SHP_LAMB93_FXX_2016-06-28/file/GEOFLA_2-2_DEPARTEMENT_SHP_LAMB93_FXX_2016-06-28.7z",destfile = "dpt.7z")

On a dans ce fichier des informations sur les centroïdes

library(maptools)
library(maps)
departements<-readShapeSpatial("DEPARTEMENT.SHP")
plot(departements)
points(departements@data$X_CENTROID,departements@data$Y_CENTROID,pch=19,col="red")

Comme ça ne marche pas très bien, on va le refaire à la main, par exemple pour l’Ille-et-Vilaine,

pos=which(departements@data[,"CODE_DEPT"]==35)
Poly_35=departements[pos,]
plot(departements)
plot(Poly_35,col="yellow",add=TRUE)
departements@data[pos,c("X_CENTROID","Y_CENTROID")]
points(departements@data[pos,c("X_CENTROID","Y_CENTROID")],pch=19,col="red")
library(rgeos)
(ctd=gCentroid(Poly_35,byid=TRUE))
points(ctd,pch=19,col="blue")

Comme ça marche mieux, on va utiliser ces centroïdes.

ctd=as.data.frame(gCentroid(departements,byid=TRUE))
plot(departements)
points(ctd,pch=19,col="blue")

Maintenant, il nous faut les résultats des élections, par département. On peut aller scraper le site du ministère d’ intérieur. On a une page par département, donc c’est facile de parcourir. Par contre, dans l’adresse url, il faut le code région. Comme je suis un peu fainéant, au lieu de faire une table de correspondance, on teste tout, jusqu’à ce que ça marche. L’idée est d’aller cherche le nombre de voix obtenues par un des candidats.

candidat="M. Emmanuel MACRON"
library(XML)
voix=function(no=35){
testurl=FALSE
i=1
vect_reg=c("084","027","053","024","094","044","032","028","075","076","052",
"093","011","001","002","003","004")
region=NA
while((testurl==FALSE)&(i<=20)){
reg=vect_reg[i]
nodpt=paste("0",no,sep="")
# if(!is.na(as.numeric(no))){if(as.numeric(no)<10) nodpt=paste("00",no,sep="")}
url=paste("http://elections.interieur.gouv.fr/presidentielle-2017/",reg,"/",nodpt,"/index.html",sep="")
test=try(htmlParse(url),silent =TRUE)
if(!inherits(test, "try-error")){testurl=TRUE
region=reg}
i=i+1
}
tabs tab=tabs[[2]]
nb=tab[tab[,1]==candidat,"Voix"]
a<-unlist(strsplit(as.character(nb)," "))
as.numeric(paste(a,collapse=""))}

On peut alors tester

> voix(35)
[1] 84648

Comme ça semble marcher, on le fait pour tous les départements

liste_dpt=departements@data$CODE_DEPT
nbvoix=Vectorize(voix)(liste_dpt)

On peut alors visualiser sur une carte.

plot(departements,border=NA)
points(ctd,pch=19,col=rgb(1,0,0,.25),cex=nbvoix/50000)

Et on peut aussi tenter pour une autre candidate,

candidat="Mme Marine LE PEN"

et on obtient la carte suivante

plot(departements,border=NA)
points(ctd,pch=19,col=rgb(0,0,1,.25),cex=nbvoix/50000)

CartoStats, la Cartographie Statistique

Début juin, une jolie conférence sera organisée à Paris-Diderot, intitulée CartoStats. Au programme:

1. Nouvelles compositions graphiques
– Gilles Palsky (Université Paris 1)
– Karine Hurel (CGET)
– Philippe Rekacewicz (Visions Carto)
2. Nouvelles méthodes, nouveaux outils
– Hervé Paris (Alter Carto)
– Claire Cunty (Université de Lyon 2)
– Boris Mericksay (Université de Rennes 2)
– Timothée Giraud et Nicolas Lambert (CNRS )
3. Nouveaux usages
– Myriam Baron (Université Paris-Est Créteil)
– Arthur Charpentier (Université de Rennes 1)
– Etienne Côme (IFSTTAR)

 

Visualizing (censored) lifetime distributions

There are now more than 10,000 R packages available from CRAN, much more if you include those available only on github. So, to be honest, it become difficult to know all of them. But sometimes, you discover a nice function in one of them, and that is really awesome. Consider for instance some (standard) censored lifetime data,

n=10000
idx=sample(1:4,size=n,replace=TRUE)
pd=LETTERS[idx]
lambda=1+(idx-1)/3
t=rexp(n,lambda)
x=rexp(n)
c=t>x
y=pmin(t,x)
df=data.frame(time=y,status=c,product=pd)

(yes, I will generate them here). Consider Kaplan-Meier estimator of the survival function,

library(survival)
km.base = survfit( Surv(time,status) ~ 1  , data = df )
plot(km.base)

This week end, Anat (currently finishing the Data Science for Actuaries program) made me discover a nice R function, to add information to that graph (well, not that graph, since it will be a ggplot version, but the same survival distribution plot)

library(ggplot2)
library(survminer)
ggsurvplot(km.base, main = "", color = "blue" , censor = FALSE, xlim = c(0,3), risk.table = TRUE ,
risk.table.col = "blue" , risk.table.height = 0.2, risk.table.title = "" , legend.labs = "All" , legend.title = "" , break.time.by = 1, xlab = "" , ylab = "")

This is more interesting when we have different lifetimes

km.prod = survfit( Surv(time,status) ~ product  , data = df )
ggsurvplot(km.prod, main = "", censor = FALSE, xlim = c(0,3), risk.table = TRUE , risk.table.col = "strata" , risk.table.height = 0.3, risk.table.title = "" , legend.labs = LETTERS[1:4] , legend.title = "" , break.time.by = 1, xlab = "" , ylab = "")

or, with a different time granularity

ggsurvplot(km.prod, main = "", censor = FALSE, xlim = c(0,3), risk.table = TRUE , risk.table.col = "strata" , risk.table.height = 0.3, risk.table.title = "" , legend.labs = LETTERS[1:4] , legend.title = "" , break.time.by = .5, xlab = "" , ylab = "")

Nice, isn’t it?

Sondages, intentions de vote et “vote utile”

Il y a plusieurs semaines, Ashley Kirk et Patrick Scott publiaient French presidential election: How the polls are shaping up in the race to become president. Force est de constater qu’ils avaient raison: les sondages prennent une place essentielle dans cette période électorale.

Avant, une précaution d’usage s’impose, je pense. Les instituts de sondages le rappellent sans cesse, et ils ont raison : leur métier n’est pas véritablement de faire des sondages d’intention de vote. L’essentiel de leurs revenus vient des études de marché,
et d’opinion, généralement pour le compte d’entreprises privées. Néanmoins, les élections sont une fabuleuse vitrine publicitaire. On peut alors imaginer que l’institut qui aura “prédit” le scrutin avec la plus grande précision devrait s’assurer une rente pour les mois – voire les années – à venir. Cette vitrine publicitaire serait importante car elle empêcherait aux instituts de prendre parti : ils ont intérêt à prédire aussi précisément que possible, probablement plus que chercher à influencer les votes. Mais est-ce aussi simple ?

Depuis une quizaine d’années, on voit régulièrement ressurgir le concept de « vote utile ». Ce concept est particulièrement important en France, pour les élections présidentielles, compte tenu du système de vote : un vote en deux tours, avec seulement les deux meilleurs au second tour. Qui dit “meilleur” dit positionnement relatif, et donc importance du vote des autres. Quelque part, mon vote est important, mais celui des autres l’est tout autant (sinon plus). Pour voter de manière rationnelle, il faut savoir comment les autres vont voter. Et comme souvent dans un jeu statégique – et les élections en sont – l’information joue un rôle essentiel.

Lorsqu’un élécteur ne sait pas quel sera le vote des autres, il aura – a priori – intérêt à voter pour son candidat préféré, Mais si ce même électeur a des croyances quant au vote des autres, il peut avoir intérêt à modifier stratégiquement son choix, en votant pour son second, voire son troisième choix : on parlera alors de « vote utile ». Sans information sur les choix des autres (ou leurs stratégie), il ne peut pas y avoir de comportement stratégique. Et force est de constater que les “sondages” (terme générique pour désigner les estimations d’intension de vote) sont devenus des instruments essentiels pour déterminer justement quel sera le choix des autres électeurs.

Les sondages sont devenus l’élément central du vote stratégique, surtout s’ils sont présenté comme fournissant une information précise, voire “statistiquement rigoureuse” des intentions de vote. Les sondages deviennent alors auto-réalisateurs s’ils poussent à voter pour des candidats qui affichent le plus de chances de gagner, ce qu’on appelle communément le « vote utile ». Mais on peut aussi imaginer des stratégies inverses : si mon candidat préféré a 40% d’intention de votes, dans les derniers sondages, a-t-il vraiment besoin de ma voix ? Ne pourrais-je pas éviter de perdre du temps en allant voter ?

Bref, j’ai encore du mal à comprendre le rôle exact des sondages dans les élections, mais ils sont loin d’être neutres. Et j’ai l’impression que comprendre ce mécanisme est plus important pour quantifier les “marges d’erreurs” que toutes les méthodes statistiques que l’on peut imaginer (dont je parlais dans un précédent billet). Et les sondages en période électorale semblent relever davantage de la théorie des jeux que des problèmes d’inférence statistique.

C’est normal ! (partie 1) et si la normalité n’existait pas?

Il y a quelques semaines, je discutais avec une collègue juriste (alors que j’essayais de glaner des statistiques juridiques), et alors que l’on parlait alors de la lenteur de l’instruction, ou de l’inversion de la charge de la preuve (je ne me souviens plus) j’ai été supris qu’elle me dise que “c’est normal“. Je sais qu’un juriste et un statisticien ne donnent pas forcément le même sens aux mots, et cette phrase m’a dérangé parce qu’une situation qui pourrait sembler “normale” (car observée régulièrement) n’est pas pour autant “juste” (c’est le paradoxe is/ought de Hume, mais j’en parlerais dans un autre billet).

Le point de départ est de comprendre ce qu’est la normalité “empirique”, telle qu’observée dans une population. Ce qui pourrait être “normal” pour un statisticien. Pour commencer, je pensais revenir sur un exemple raconté dans The End of Average de Todd Rose, qui essaye de montrer, exemples à l’appui, que l’homme moyen n’existe pas.

  • L’homme moyen de Quételet

Au XIXème siècle, si plusieurs astronomes mesuraient la vitesse d’un même objet céleste, ils obtenaient (souvent) plusieurs mesures différentes. Pour savoir “laquelle” utiliser dans leurs calculs, l’idée d’utiliser “la méthode des moyennes” s’est rapidement imposée – comme le rappelle Stahl (2006), et surtout Sheynin (1973) – cette “moyenne” ayant une précision plus grande que n’importe quelle autre grandeur (ou dirait aujourd’hui “statistique”).

Adolphe Quetelet fut, semble-t-il, le premier à appliquer ce calcul de moyennes à des mesures humaines, introduisant son fameux concept d'”homme moyen”. Comme j’en avais parlé dans un précédant billet, la moyenne est une grande particulière, dont le sens n’est pas forcément clair. Si on définit la moyenne à l’aide d’une minimisation d’erreur quadratique, on a une interprétation en terme de prévision (on retrouve ici la notion de mesure elicitable dont je parlais dans mon dernier cours): la taille moyenne est la taille de “devrait” mesurer une personne tirée au hasard (à une variation aléatoire – et imprévisible – près). En 1846 dans une lettre (publiée dans l’ouvrage Lettres sur la théorie des probabilités, appliquée aux sciences morales) Adolphe Quételet utilise l’image de la statue du gladiateur pour expliquer ce que peut être l’homme moyen.

  • L’interprétation de Francis Galton

Ce homme moyen a beaucoup plu à l’époque, en particulier au sein de l’école anglaise eugéniste, dirigée à l’époque par Francis Galton, même si ce dernier s’intéresse surtout aux déviations par rapport à cette norme (déviation vers le haut et déviation vers le bas). Comme le rappelle Bulmer (2004),the deviations from that average—upwards towards genius, and downwards towards stupidity—must follow the law that governs deviations from all true averages“. Les travaux de Galton ont visé à comprendre ces déviations. Si Florence Nightingale affirmait que “the Average Man is God’s Will“, Galton de son côté s’intéressait davantage au caractère héréditaire. Mais cet “homme moyen” a-t-il pour autant du sens ?

  • L’être humain moyen n’existe pas

Une anecdote intéressante est celle de deux statues, à Cleveland, celles de Norma et Normann. L’artiste Abram Belskie et l’obstetricien Robert Latou Dickinson ont réalisé ensemble ces statues, en 1943. La particularité est qu’aucun modèle n’a été représenté. En fait, il s’agissait de représenter une femme et un homme qui avaient les mensurations moyennes de l’époque.

Une fois ces statues réalisées, un concours a été organisé pour trouver qui ces statues pouvaient bien représenter. Plusieurs milliers de personnes de l’Ohio ont envoyé leurs mensurations, mais aucun ne correspondaient à celles des statues. Certes, plusieurs centaines avaient la même taille. Plusieurs centaines avaient le même tour de poitrine. Mais aucune n’avait toutes les bonnes mesures. Car comme l’explique Todd Rose, l’homme n’est pas unidimensionnel: c’est sur plusieurs dimensions qu’on le mesure.

Et chercher à le résumer en une grandeur unidimensionnel est beaucoup trop réducteur. C’est ce qu’il montre dans son livre sur les tests d’intelligence, par exemple, où un même QI peut être associé à deux personnes très différentes.

Pareil pour décider de recruter quelqu’un, se focaliser sur un seul indicateur n’a pas de sens. Le soucis quand on travaille dans un contexte multivarié, c’est que la moyenne perd de son sens. Pour reprendre le titre d’un billet mis en ligne voilà 6 mois, être moyen peut être extraordinaire.

  • La malédiction de la dimension (en grande dimension, l’espace est très vide…)

En fait, ce problème est bien connu par les statisticiens, sous le nom de “fléau de la dimension“. Prenons un exemple simple: supposons qu’une grandeur d’intérêt suive une loi normale https://latex.codecogs.com/gif.latex?\mathcal{N}(\mu,\sigma^2), par exemple le poids, la taille, le tour de poitrine, etc. On pourrait dire que la norme, c’est se trouver dans un intervalle https://latex.codecogs.com/gif.latex?[\mu\pm%201.5%20\cdot\sigma]. Si on a une loi normale, cette situation survient dans 85% des cas,

> (1-2*pnorm(-1.5))
[1] 0.8663856

Et 15% seront vues comme “anormales”. Elles peuvent être anormalement petites, ou anormalement grandes. C’est le dessin ci-dessous: on regarde ici seulement une dimension

On peut maintenant regarder deux dimensions, le poids et la taille, par exemple. La norme serait ici que dans les deux dimensions, on soit dans l’intervalle https://latex.codecogs.com/gif.latex?[\mu\pm%201.5%20\cdot\sigma]. Si les grandeurs sont indépendantes, la probabilité que les deux grandeurs soient “normale” est de 75%

> (1-2*pnorm(-1.5))^2
[1] 0.750624

En dimension deux, 75% des observations sont “normales”, et 25% sont “anormales”

En dimension 3, on passe à 65%

> (1-2*pnorm(-1.5))^3
[1] 0.6503298

pour 35% d’observations “anormales” (plus du tiers)

Etc. En dimension cinq, on passe en dessous de 50%

> (1-2*pnorm(-1.5))^5
[1] 0.4881532

autrement dit, être dans la norme dans les 5 dimensions, ce n’est plus le cas de la majorité. Et en dimension vingt, ceux qui sont “normaux” sont plutôt atypiques, avec une proportion de l’ordre de 5%,

> (1-2*pnorm(-1.5))^20
[1] 0.0567838

Bref, la normalité est un concept particulièrement étrange sur le plan empirique, car intuitivement associé à l’idée d’une majorité. Alors que ce n’est pas le cas, la normalité étant justement atypique.