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.

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.

Supprimer des données ?

Il y a une dizaine de jours, je participais à la conférence Sciences XXL, à l’INED, où nous parlions des utilisations des données massives en Sciences Sociales, et au même moment, j’ai découvert – en discutant avec plusieurs assureurs – qu’ils envisageaient de supprimer des données, de manière également massive. Quand on veut faire de l’économétrie de la finance, on peut utiliser des données de cours boursiers, qu’on peut trouver en ligne, ou – pour une granularité plus faible – acheter à des fournisseurs de données. Mais quand on fait de l’économétrie de l’assurance, avoir des données est plus compliqué. Dans mon tout premier cours d’assurance dommage, j’enseignais la théorie, faute de données. Depuis, j’ai réussi à récupérer des données. On a mis ces données dans un package R (casdatasets), et mieux: avec des jeux de données (prêtées par des assureurs) on a pu lancer notre troisième pricing game, qui devrait nous permettre de mieux comprendre la dynamique des marchés d’assurance.

Bref, j’ai été particulièrement surpris d’apprendre que des assureurs envisageaient de détruire des données (individuelles). J’avais entendu de tels propos lors qu’avec Arnaud on commencé à travaillé sur le risque de catastrophes naturelles, et qu’on essayait de mieux comprendre l’impact des tempêtes Lothar et Martin, en décembre 2009. En particulier, au commencement de nos recherches, nous voulions avoir un ordre de grandeur du nombre de polices d’assurance (multirisques habitation) dans un portefeuille, ou plutôt le taux de polices touchées, si possible avec une granularité spatiale assez faible. Des assureurs ont pu nous aider à avoir des ordres de grandeur, par département

mais d’autres nous ont dit qu’il serait difficile de retrouver les données, qui remontent à près de 20 ans. Voire impossible. Et c’est là qu’on a commencé à entendre parler de suppression de données personnelles. Et si les données n’ont pas été agrégées au niveau que l’on souhaite, c’est impossible de faire la requête, 20 ans après.

Continue reading Supprimer des données ?

Toi aussi, raconte ce que tu veux avec des graphiques

L’autre jour, les décodeurs publiaient sur le site du Monde un article sur l’utilisation des graphiques en base 100,

Je reprends le commentaire

Celui-ci indique, sans appel selon Mme Le Pen, le déclin des économies françaises, italiennes et espagnoles face à l’industrie allemande. Marine Le Pen n’hésite ainsi pas à affirmer que le déclin de la production française est lié à l’introduction de la monnaie unique en 2001.

On peut reconstruire le graphique assez facilement, les données étant en ligne sur https://data.oecd.org/

base=read.table(loc,sep=",",header=TRUE)
extract=function(nom="FRA"){
b=base[base[,1]==nom,c("TIME","Value")]
names(b)=c("TIME",nom)
return(b)
}
B=extract("FRA")
B=merge(B,extract("DEU"),all.x=TRUE,all.y=TRUE)
B=merge(B,extract("ESP"),all.x=TRUE,all.y=TRUE)
B=merge(B,extract("ITA"),all.x=TRUE,all.y=TRUE)
dim(B)
B$TIME
B$t=seq(1950+1/8,2016+7/8,by=1/4)
plot(B$t,B$FRA,type="l",col="blue",lwd=2)
i=which(B$T=="2001-Q1")
Bi=B
for(j in 2:5) Bi[,j]=Bi[,j]*100/Bi[i,j]
plot(B$t,Bi$FRA,type="l",col="blue",lwd=2,ylim=range(Bi[which(B$T=="1990-Q1"):which(B$T=="2016-Q4"),2:5],na.rm=TRUE),xlim=c(1990,2020))
text(2019,Bi$FRA[max(which(is.na(Bi$FRA)==FALSE))],"FRA",col="blue")
lines(B$t,Bi$DEU,lwd=2)
text(2019,Bi$DEU[max(which(is.na(Bi$DEU)==FALSE))],"DEU")
lines(B$t,Bi$ESP,lwd=2,col="red")
text(2019,Bi$ESP[max(which(is.na(Bi$ESP)==FALSE))],"ESP",col="red")
lines(B$t,Bi$ITA,lwd=2,col="green")
text(2019,Bi$ITA[max(which(is.na(Bi$ITA)==FALSE))],"ITA",col="green")

Maintenant, on peut aussi changer la référence de la base 100. Par exemple, la victoire de la France à la Coupe du Monde Foot

i=which(B$T=="1998-Q2")

Damned,

Celui-ci indique, le déclin des économies françaises, italiennes et espagnoles face à l’industrie allemande. Ce déclin de la production française est lié à la victoire de la France à la Coupe du Monde de Football.

ou la dernière victoire de la France à l’Eurovision

i=which(B$T=="1977-Q3")

Damned,

Celui-ci indique, le déclin des économies françaises et espagnoles face à l’industrie allemande. Ce déclin de la production française est lié à la victoire de la France à l’Eurovision.

ou encore, la naissance de Mme Le Pen

i=which(B$T=="1968-Q3")

Damned,

Celui-ci indique, le déclin de l’économie française face aux industries allemande et espagnole. Ce déclin de la production française est lié à la naissance de Mme Le Pen.

Le Master Statistique & Econométrie est mort

Après 10 ans, le master Statistique & Econométrie de l’Université de Rennes 1 va disparaître…. pour renaître de ses cendres sous le nom Mathématiques Appliquées, Statistique, cohabilité par l’Université de Rennes 1, Rennes 2, Agrocampus Ouest, l’ENSAI et l’INSA Rennes, à la rentrée. En particulier, il y aura un parcours “Prévision et Prédiction Economiques“. Il y aura beaucoup de nouveaux cours, mais j’aurais l’occasion d’en reparler…

The U.S. Has Been At War 222 Out of 239 Years

This morning, I discovered an interesting statistic, America Has Been At War 93% of the Time – 222 Out of 239 Years – Since 1776,  i.e. the U.S. has only been at peace for less than 20 years total since its birth. I wanted to check, get a better understanding and look at other countries in the world.

As always, we can try to extract information from wikipedia, since there are pages dedicated to that information

url="https://en.wikipedia.org/wiki/List_of_wars_involving_the_United_States"
download.file(url,destfile = "warUS.html")
url="https://en.wikipedia.org/wiki/List_of_wars_involving_France"
download.file(url,destfile = "warFR.html")
url="https://fr.wikipedia.org/wiki/Liste_des_guerres_de_la_France#Premi.C3.A8re_R.C3.A9publique"
download.file(url,destfile = "guerre.html")
url="https://en.wikipedia.org/wiki/List_of_wars_involving_Canada"
download.file(url,destfile = "warCAN.html")

If we look at the US page, there are tables, so it should be easy to extract it. For instance,

Even if the war did last 1 day, we will say that the US were at war in 1811. The information we want to confirm can be “there were 21 full years – from Jan 1st till Dec 31st – where the US were not at war, once, during those years“. From the row above, we can claim that the US were at war in 1811. Most of the time, we have

I.e. there is a beginning (here 1775) and an end (1783). So here, the US are said to be at war in 1775, 1776, 1777, 1778, 1779, 1780, 1781, 1782, 1783. To extract the information, we look for regular expressions in the first column, with number, on 4 digits.

https://freakonometrics.hypotheses.org/files/2017/03/guerre-us1.png

Well, sometimes it can be a bit tricky, since we have 3 dates, 1941, 1945 and (in the legend) 1944. But if we consider the minimal and the maximal dates, we have our range of dates.

Now that we we how to extract information, let’s do it. The code will be

library(stringr)
ext_date=function(x){
dates12="[0-9]{4}"
#grep(pattern = dates2, x = col1[1])
L=str_extract_all(as.character(x),dates12)
return_L=list()
if(length(L)>0){
for(j in 1:length(L))
if(length(L[[j]])==1) return_L[[j]]=as.numeric(L[[j]])
if(length(L[[j]])>=2) return_L[[j]]=seq(min(as.numeric(L[[j]])),max((as.numeric(L[[j]]))))
}
return(return_L)}

For the US, we get the following years

library(XML)
tables=readHTMLTable("warUS.html")
list_dates=list()
for(i in 1:length(tables)){
if(!is.null(dim(tables[[i]]))){
if(ncol(tables[[i]])>1){
col1=tables[[i]][,1]
list_dates[[i]]=lapply(col1,ext_date)
}
}}
d=unique(unlist(list_dates))

(red means at war, while green means no-war) and indeed,

> length(d)
[1] 222

there were 222 years with war.  Now, what about another country. Like France. Here I use the French wiki page, since information is not in tables in the English one.

tables=readHTMLTable("guerre.html")
list_dates=list()
for(i in 1:length(tables)){
if(!is.null(dim(tables[[i]]))){
if(ncol(tables[[i]])>1){
col1=tables[[i]][,1]
col2=tables[[i]][,2]
col12=paste(col1,col2)
list_dates[[i]]=lapply(col12,ext_date)
}
}}
d=unique(unlist(list_dates))

On the same period of time (starting in 1775), France was also on war most of the time.

Less than the US, but still: 185 years with war,

> length(d[d>=1775])
[1] 185

And on a longer period of time? Why not start, say, around the Hundred Years’s War,

meaning that since 1337, there were (only) 174 years without a single war where France was involved.

Let’s try another one. Like Canada,

tables=readHTMLTable("warCAN.html")
list_dates=list()
for(i in 1:length(tables)){
if(!is.null(dim(tables[[i]]))){
if(ncol(tables[[i]])>1){
col1=tables[[i]][,1]
list_dates[[i]]=lapply(col1,ext_date)
}
}}
d=unique(unlist(list_dates))

Guess what… there’s a lot of green on that graph. Surprised?

Data XXL et Démographie Participative

Petite virée parisienne pour trois jours. Je serais à Science Po mercredi pour travailler un peu, et à l’INED jeudi et vendredi pour la conférence Sciences XXL – Ce que l’abondance et la diversité des données numériques font aux sciences sociales. Jeudi, je serais discutant pour la session “outils”, et vendredi après-midi, nous allons clôture la conférence avec un rapide retour sur un travail joint avec Olivier et Ewen, sur ‘Les données collaboratives généalogiques au service de la démographie historique’. Le travail est très vaste, et nous présenterons quelques résultats de réconciliation entre les tables de mortalité historique de l’INED, et celle que nous avons reconstituées sur des données démographiques…. Par exemple avec les naissances de 1850

et celles de 1899

La suite…. vendredi (ou plus tard, on n’a pas fini de jouer avec ces données).

 

Reading text automatically

It is now very easy to read (automatically) some text that can be found in a pdf file. For instance, consider the program of the conference we had yesterday – and today – in Rennes

> library(pdftools)
> scan_pdf <- pdf_text("http://crem.univ-rennes1.fr/Documents/Docs_sem_divers/2017_03_10-11_JJD/JDD_prog.pdf")
> cat(scan_pdf)
Journées Jeunes Docteurs
Programme du jeudi 9 mars 2017
Faculty of Economics - Rennes - Amphi Henri Krier
9h- 9h30 - Accueil
9h30-10h15 :      Présentation du CREM, de la faculté et des activités de recherche liées du ou laboratoire
10h15-10h50 :     Emmanuel LORENZON (Université de Bordeaux, GREThA)
Collusion with a rent seeking agency in sponsored search auctions
10h50-11h25 :     Julien BERTHOUMIEU (Université de Bordeaux, GREThA)
The Impact of “At-the-Border” and “Behind-the-Border” Policies on Cost-Reducing Research
and Development
Co-écrit avec Antoine Bouët

(etc). As you can see, it is working well, even in French, where we have those weird letters (with accents). Here, it is working well because the pdf is vectorized, i.e. it was generated properly, by open office.

But sometimes, we can have only a scanned version of a letter

or just a picture with some typed text. I will not mention hand-writing because it is much more complex.

The other day, my friend Fleur did show me a picture, and some very simple lines of code,

> library('tesseract')
> pic1="https://f.hypotheses.org/wp-content/blogs.dir/253/files/2017/03/pic1.png"
> text_fr <- ocr(pic1, engine = tesseract("fra"))
> cat(text_fr)
Près de 14.400 décès

Si [épidémie de grippe est un phénomène récurrent. celle de
2016—2017 présente plusieurs spécificités. outre sa virulence :
une survenue plus précoce que d‘habitude. une activité
modérée en médecine ambulatoire. mais un impact fort en
milieu hospitalier.

It looks like we’ve be able to extract typed text from a picture ! I want to check. I have to admit, first of all that installation on a linux machine is tricky: one has to install first leptonica, and then follow some guidelines to install tesseract (see also Artem‘s advices). It took me some time, but I’ve been able to install the package.

The first important step, it to train the algorithm with some texts in French (because it is in French in my picture)

> library('tesseract')
> tesseract_download("fra")

Then, I did try with the picture that Fleur did send me (the picture was inserted in the core of the message)

> pic2="https://f.hypotheses.org/wp-content/blogs.dir/253/files/2017/03/pic2.png"
> text_fr <- ocr(pic2, engine = tesseract("fra"))
> cat(text_fr)
Près de 14400 decès

s. mm….agw«… ………«…m ……
a……u…u Dhs—ur; ;pmum…. ;: u……
… W»: »… w…q…na… … ……
…… ………u…_ …… mm……
…… nwm/u

… … mm…—mg…»— sa…… su a.…….…
: :mmræwesdæ ; ; m…decnflwtülflws WWW…
un»… M on m…… . … … .. m...… wma:
.,… … V, …… … …;………yg…gn…
…… pe- le…samemeuuœwpwv m…
mum

Clearly, something went wrong here. When I got that output, I thought that I did not train properly the function. But it was not the answer. As described in that post (in French) it is necessary to have a clean picture, to read it properly

And actually, if we zoom in our picture – the first one, used by Fleur, to show me that package – we have

while for the second one – with a lower resolution – we have

It is necessary to have a scan of a typed text with high resolution… And you have to admit that it is awesome….

The good thing is that I have to work with a judge, in France, to assess quality of experts. And since most of the reports are typed, and then scanned, I am glad to have such a function. I just have to make sure that the resolution is high enough…

Juxtaposer des cartes et ‘confounding’

Pour aller un peu plus loin que mon précédant billet, élections, pièges à com(mentaires à la con) je voulais juste montrer quelques cartes, obtenues par simulations. Mais avant, revenons deux minutes sur la notion de ‘confounding‘. Pour reprendre le dessin de wikipedia, l’idée est que, conditionnellement à https://latex.codecogs.com/gif.latex?Z (notre ‘confounding factor’), les variables https://latex.codecogs.com/gif.latex?X et https://latex.codecogs.com/gif.latex?Y sont indépendantes. Mais cette indépendance conditionnelle peut (comme bien souvent) impliquer une forte corrélation entre https://latex.codecogs.com/gif.latex?X et https://latex.codecogs.com/gif.latex?Y. On peut ainsi imaginer un modèle de la forme https://latex.codecogs.com/gif.latex?X=Z+\varepsilonhttps://latex.codecogs.com/gif.latex?\varepsilon désigne une composante idiosyncratique, et https://latex.codecogs.com/gif.latex?Y=Z+\eta (où là aussi https://latex.codecogs.com/gif.latex?\eta est une composante idiosyncratique).

Par exemple, on peut supposer que https://latex.codecogs.com/gif.latex?Z est une variable liés à la lattitude du département, par exemple la température moyenne (histoire d’avoir une vague histoire à raconter, et d’être moins rébarbatif)

> n=115
> X=matrix(rnorm(3*n),n,3)
> X[,1]=sort(X[,1])
> library(maps)
> map("france",fill =TRUE,
col= rgb(1,0,0,pnorm(X[,1])))

Maintenant, supposons qu’on ait une variable https://latex.codecogs.com/gif.latex?X très corrélée à https://latex.codecogs.com/gif.latex?Z, par exemple la vente de crème solaire (en volume, toujours pour raconter une histoire qui illustrerait un peu mon propos)

> r=.8
> X[,2]=r*X[,1]+sqrt(1-r^2)*X[,2]
> map("france",fill =TRUE,
col= rgb(0,1,0,pnorm(X[,1])))

ce qui donne le nuage de points suivant (avec une forte corrélation avec le ‘confounding factor’)

On suppose maintenant qu’on a une autre variable https://latex.codecogs.com/gif.latex?Y, elle aussi très corrélée à https://latex.codecogs.com/gif.latex?Z, par exemple le prix d’une plaquette de beurre (qui pourrait être très cher dans le sud, où l’on cuisine plutôt à l’huile)

> r=.8
> X[,3]=r*X[,1]+sqrt(1-r^2)*X[,3]
> map("france",fill =TRUE,
col= rgb(0,1,0,pnorm(X[,1])))

avec une corrélation du même ordre, avec le ‘confounding factor’

Si on juxtapose les deux cartes, on a des variables corrélées,

mais on ne peut pas en conclure, juste en regardant ces cartes, que les ventes de crème solaire influencent le prix d’une plaquette de beurre ! Et on peut même accentuer encore l’effet, en jouant un peu sur les couleurs. Par exemple, avec

> map("france",fill =TRUE,col = rgb(1,0,0,qbeta(pnorm(X[,1]),.2,.5)))

on accentue un peu l’écart entre le nord et le sud (je joue ici sur l’échelle des couleurs, pas sur les valeurs !)

et sur nos deux variables, on a encore une juxtaposition qui donne envie de raconter un jolie histoire, non ?

Ah oui, ma corrélation entre les variables https://latex.codecogs.com/gif.latex?X et https://latex.codecogs.com/gif.latex?Y est relativement forte, de l’ordre de 0.6 (qui est supérieure à ce qu’on avait observé hier sur le taux de chômage et le taux du FN aux élections régionales)

> cor(X)
[,1]      [,2]      [,3]
[1,] 1.0000000 0.7863838 0.7727523
[2,] 0.7863838 1.0000000 0.6312878
[3,] 0.7727523 0.6312878 1.0000000

mais la corrélation est très sensible aux lois marginales, ça ne veut pas dire grand chose. Même si, visuellement, le nuage de points peut faire penser à celui qu’on avait hier

Bref, juxtaposer des cartes, c’est joli. De là à en déduire quoi que ce soit….

Élections, pièges à com (mentaires à la con)

Je suis tombé hier, sur le site de The Economist sur deux cartes, juxtaposées, une présentant le taux de chômage (en rouge, à gauche) et l’autre le vote FN (en bleu, à droite),

L’idée serait ici de comparer les cartes, et de se dire que les deux variables “taux de chômage” (produit par l’insee) et “vote FN” (aux élections régionales de 2015) seraient corrélées, et que l’une expliquerait peut être l’autre… Comme il est difficile (?) d’affirmer que le vote FN pourrait induire du chômage, on serait tenté de dire que les chômeurs votent FN, un raccourci de ce genre. Je ne dis pas que c’est faux, je dis juste que c’est s’aventurer sur un terrain dangereux, quand on commence à comparer des cartes, rapidement (et donner lieu à toutes sortes de commentaires à la con, pour expliquer le titre du billet). Sur ces deux variables, on peut d’ailleurs regarder les données brutes,

Oui, les variables semble très corrélées, par département. Après, si on calcule la corrélation, on “seulement” 0.516. Soit dit en passant, la corrélation ne dépend pas de l’orientation du graphique, j’aurais parfaitement pu mettre le taux de chômage en ordonnées. Mais classiquement, l’ordonnée est la variable que l’on souhaite expliquer, et l’abscisse est la variable (dite) explicative. Même si, comme toujours en régression, on n’établit aucun lien causal.

Bien sûr, il y a des départements pour lesquels il y a un écart, avec un chômage fort, et qui pourtant ne semblent voter massivement pour le FN (aux élections régionales).

En fait, on peut trouver des dizaines de cartes, qui présente des répartitions relativement proches, comme le rapport inter-décile des niveaux de vie par département

le taux de pauvreté par département

(on pouvait retrouver cette carte en ligne)

ou encore la part des minima sociaux dans le revenu disponible des ménages par département

Bref, on aurait très envie de dire que le vote FN s’explique par le chômage, la pauvreté, etc. Mais on ne peut pas…. C’est une faute de raisonnement, connu sous le nom d’ecological fallacy. En effet, le vote est un comportement individuel, par sa nature même (on va, individuellement, mettre un bulletin dans l’urne). Et on n’a pas le droit d’induire des comportements individuels d’observations agrégées… Ca ne veut pas dire que la relation causale n’est pas présente, ou le contraire… ça veut juste dire qu’on ne peut rien affirmer, juste en juxtaposant des cartes, on n’a aucunement une preuve (tout juste une vague corrélation au niveau agrégé). Aussi tentant que ça puisse être.

Pour dire quelque chose de censé sur les choix de vote, il est nécessaire d’avoir des enquêtes (ou peut être avoir accès à des votes électroniques, comme le vote des français de l’étranger aux législatives, par exemple, mais ça n’est pas vraiment possible, donc on va se limiter aux études, aux sondages). Par exemple le graphique dans Les Echos, à l’époque des régionales, justement,

Le chômage et le niveau de diplôme étant des variables très corrélées, on pourrait avoir l’impression d’avoir une piste.

Un problème important dans les cartes, c’est leur granularité : quand on regarde les départements, on est sur des espaces géographiques beaucoup trop grands ! un département, c’est très hétérogène. En particulier, il peut y avoir, ou pas, de grosse métropole. Certains chercheurs ont souligné que le vote FN est important dans la grande périphérie des métropoles, estimant qu’il augmente avec la distance du centre-ville. On le voit assez nettement sur la carte suivante

Le soucis, quand on utilise une granularité plus fine, c’est qu’on ne voit plus grand chose, comme sur les cartes ci-dessous, qui reprennent le résultat du FN aux élections régionales

et le taux de chômage (des 25-55 ans)

Bref, faire une étude montrant une relation causale, c’est pas simple… mais promis, si je trouve des données, je veux bien me lancer !