Tag Archives: Paris

Marques du passé, marques du futur

J’en parlais l’autre jour, mais à peine arrivés à Kyoto, il a fallu passer au ward office, le 区役所 (kuyakusho), pour régler les formalités de base. Parmi les guichets, les formulaires et les tampons, et à la toute fin, on nous a fait passer par un service de prévention, où l’on nous a remis un petit paquet de documents, des cartes d’aléas, des recommandations en cas de typhon, des consignes d’évacuation. En particulier, je suis reparti avec un de ces cartes où la ville se colore par profondeurs d’eau possibles.

Dans la rue, ensuite, la théorie se retrouve mise en pratique. À force de marcher, on finit par les remarquer partout, avec des panneaux fixés aux poteaux, des stickers sur des pylônes, des plaques à hauteur d’yeux, qui disent la même chose (en changeant de chiffres régulièrement). Sur l’un d’eux, près de chez moi, on lit : 「想定最大規模 1.3 m」 et, en dessous, en anglais, “Flood Water Depth (Projected)”. Sur un autre, un peu plus loin, ce n’est plus 1,3 m, c’est 5,5 m.

La première fois qu’on croise ce panneau, on croit lire un avertissement commémoratif, comme une crue passée qu’on aurait gravée sur le décor urbain. Mais ici, le panneau ne raconte pas “ce qui s’est produit”. Il raconte “ce qui pourrait se produire”. La ligne bleue matérialise le niveau d’eau potentiel, mesuré depuis le sol. Autrement dit, si l’événement de référence se produit, l’eau atteindrait cette hauteur à cet endroit précis, dans la rue, devant cette façade. Mais que signifie exactement 「想定最大規模」, ce “scénario maximal de référence” ? Est-ce une période de retour classique, un 100 ans, un 500 ans, un 1000 ans ? Et si oui, qu’est-ce que cela veut dire, concrètement ?

Sur ce point, la FAQ officielle du Hazard Map Portal Site est étonnamment claire. Elle explique que, pour les cartes et informations “想定最大規模”, l’échelle de pluie visée est environ une fois en 1000 ans”, mais ajoute immédiatement que cela ne doit pas être compris comme un cycle régulier, ce n’est pas “tous les 1000 ans”, c’est une probabilité annuelle d’environ 1/1000 (0,1%) ou moins, c’est ce qu’on appelle classiquement un “période de retour”

「『想定最大規模』の降雨規模は1000年に1回程度を想定…1年の間に発生する確率が1/1000(0.1%)以下」

Autrement dit, on ne parle pas d’une horloge du risque, mais d’un langage probabiliste, avec une (très) faible chance de survenir chaque année. Les chances sont faibles, mais on parle d’un événement suffisamment important pour être traité comme référence de sécurité publique.

Pour comprendre ce que sont ces marques de niveau d’eau, revenons à Paris, et à l’histoire de l’hiver 1740–1741. Cet hiver là, une vague de froid brutal s’est abattue sur Paris avec -13,7°C à Paris en janvier, -12,6°C en février et une température qui reste sous 0°C pendant un mois. La Seine qui gèle, la ville est immobilisée, puis, sans transition, un dégel soudain. La glace cède, l’eau grossit, la Seine déborde, envahit les rues basses, avale les quais. Dans l’urgence, on répare, on pompe, on improvise. Mais ce qui rend cet épisode durable, ce n’est pas seulement la violence de la crue, c’est la manière dont elle a été transformée en mémoire organisée. Dans Les crues de la Seine (1910), Auguste Pawlowski et Albert Radoux notent une régularité dans les crues,

« on peut remarquer que les mêmes quartiers ont été inondés en 1658, en 1740, en 1802 et en 1910 (…) La plupart des terrains envahis par l’eau en 1740 le furent de nouveau en 1764 »

Le propos contient déjà une intuition statistique. L’événement n’est pas un point isolé, il appartient à un processus spatio-temporel. Et si une série existe, alors une ville peut apprendre, non pas seulement en souffrant, mais en enregistrant. Ils rappellent aussi l’effet psychologique et politique de la crue

« La crue de décembre 1740, beaucoup plus importante que celle de 1711, avait frappé les imaginations dès le début de l’inondation. L’Académie des sciences pensa qu’il convenait, pour la postérité, de conserver le souvenir précis des zones envahies par les eaux »

De là né l’idée est de “conserver le souvenir précis”. Pas un souvenir vague, pas une légende. Une mémoire indexée, consultable, transmissible, scientifique. À partir de ce moment, les marques de crue changent de statut. Elles ne sont plus seulement des traces accidentelles (un mur noirci, une porte gondolée), elles deviennent des inscriptions, des repères, des archives publiques. Elles fixent une hauteur, elles localisent un débordement, elles mettent une mesure sur ce que le récit seul laisserait flou. Une marque de crue, c’est une phrase très courte, mais gravée, “l’eau est montée jusqu’ici”.Cette volonté de fixer la catastrophe ne date pas uniquement de 1740–1741. Deparcieux raconte qu’il a relevé plusieurs “repères” de l’inondation de 1658, tout en soulignant que certains sont fiables et d’autres beaucoup moins.

« Deparcieux a relevé, sur divers points de Paris, plusieurs « repères » de l’inondation de 1658. Si certains sont dignes de foi, d’autres, par contre, ne méritent qu’une médiocre confiance. « Presque tout le monde, écrit-il dans son Mémoire, connaît l’inscription en marbre qui est dans le cloître des Célestins, pour l’inondation du 28 février 1658, sans laquelle on douterait peut-être de ce qu’on trouve ailleurs de cette prodigieuse inondation; elle monta 33 pouces et demi (0m 85) plus haut que celle que nous avons eue en 1740. »

Cette phrase dit beaucoup plus qu’une comparaison de hauteurs. Elle dit que la marque n’est pas seulement un souvenir, elle est aussi une preuve. Elle stabilise le récit. Elle tranche entre ce qu’on croit et ce qu’on sait. Sans l’inscription, on douterait, ou on pourrait douter. Avec elle, le doute recule. La mémoire devient matérielle, et la matérialité devient un instrument de gouvernement. C’est ce que disait Mary Douglas quand elle expliquait le rôle d’une institution dans la fabrication de la mémoire. Dans How Institutions Think, elle écrivait

« Institutions create and preserve categories of memory; they decide what must be remembered or forgotten ».

(“Les institutions créent et préservent des catégories de mémoire ; elles décident de ce qui doit être retenu ou oublié.”) La marque de crue parisienne, dans cette perspective, n’est pas seulement un indicateur hydrologique, c’est une décision collective sur ce qui mérite d’être vu, transmis, réactivé. En un sens, on pourrait presque dire que ce dispositif social permet réduit l’incertitude en rendant la répétition imaginable. Le choc du désastre devient une information (ça semble être le thème des billets ces derniers mois). La marque n’empêche pas l’eau de monter, elle empêche la ville de feindre qu’elle ne montera jamais.

Car, sur les côtes japonaises (notamment dans le Tōhoku, 東北地方), on peut croiser ce genre de pierres, dressées face à la mer, les tsunami stones.

Certaines portent un impératif, gravé comme une règle de survie : 「此処より下に家を建てるな」(sur la colonne de gauche) « Ne construisez pas vos maisons en contrebas de cette stèle. » La pierre n’est pas seulement un souvenir, elle est une consigne. Elle transforme un événement passé en une norme pour l’avenir. Dans Tsunami: To Survive from Tsunami, Susumu Murata, Fumihiko Imamura, Kazumasa Katoh, Yoshiaki Kawata, Tomotsuka Takayama, et Shigeo Takahashi rappellent que

« Tsunamis are not only natural events; they are cultural events recorded in the landscape ».

(“Les tsunamis ne sont pas seulement des événements naturels ; ce sont des événements culturels enregistrés dans le paysage.”) On pourrait presque dire la même chose des marques parisiennes. La crue devient culture dès lors qu’elle laisse une trace institutionnalisée, c’est-à-dire une trace qui survit aux témoins.

Mais ce n’est pas ce que j’observe à Kyoto. À Kyoto, on a une inversion du rapport au temps. Les tsunami stones et les marques parisiennes parlent du passé, même lorsqu’elles guident le futur. Les panneaux de Kyoto, eux, parlent d’un futur modélisé, d’un futur anticipé. Ils disent, en gros “voici un niveau d’eau plausible, même si cela n’est jamais arrivé ici”. Ce sont des marques sans catastrophe, des marques en attente. Elles installent une mémoire avant l’événement. Elles font entrer le scénario dans les routines quotidiennes. Et elles s’inscrivent dans une culture où l’inondation n’est pas un accident abstrait, mais un compagnon historique. Kuniyoshi Takeuchi le formule dans Integrated Flood Risk Management :

« People in Japan have been living with flood disasters through a long history ».

Cette continuité n’est pas seulement technique, elle est institutionnelle et scientifique. Dans Science of Societal Safety, Seiji Abe, Mamoru Ozawa, Yoshiaki Kawata décrivent une discipline pensée comme un cycle, prévenir, réduire, secourir, reconstruire. Ici, la catastrophe n’est pas imprévisible, inimaginable, impensable, elle est un objet de connaissance et d’organisation. Même les sciences sociales contemporaines convergent vers cette idée que la catastrophe révèle autant qu’elle détruit. Dans A History of Popular Culture in Japan,Taylor Atkins écrivait

« Disasters do not necessarily change society; they reveal its existing structures ».

Les panneaux de Kyoto, les stèles du Tōhoku, les repères de la Seine sont aussi des révélateurs d’“structures existantes”, d’une manière collective de gérer l’incertitude en l’inscrivant quelque part. Ulrich Beck, de son côté, insiste dans World at Risk sur le fait que les risques sont cadrés socialement, ils sont

« socially constructed, politically framed, and culturally mediated ».

Ce cadrage, à Kyoto, est littéral. Il est présenté sous la forme d’un pictogramme et d’un nombre, répétés de poteau en poteau. Et ce n’est pas anodin, parce que rendre un risque visible, c’est déjà faire de la politique publique. Brian Wynne rappelle dans Misunderstanding Science? que les communautés disposent souvent d’une mémoire empirique du risque, que les institutions peuvent négliger à leurs dépens. Cette tension (entre modèle et mémoire, entre expertise et expérience) se retrouve dans ce que nous appelons aujourd’hui “prévention”. À Kyoto, elle se traduit parfois en un compromis, l’institution affiche le scénario, et la société, elle, apprend à vivre avec cette affiche.

Paris grave la crue après l’avoir subie, pour que l’eau revenue ne soit pas oubliée. Le Japon érige des stèles après la vague, pour que la mer ne surprenne plus. Mais Kyoto, elle, marque la ville avant la crue, pour que le futur ait déjà une forme dans le regard des passants. On pourrait alors proposer une distinction simple, en opposant les marques du passé, qui transforment un événement en mémoire, et les marques d’un futur possible, qui transforment un scénario en présence quotidienne. Les premières disent “c’est arrivé”. Les secondes disent “imagine que cela arrive”. Et dans les deux cas, la même intuition semble être confirmée, le risque devient habitable lorsqu’il devient visible, c’est-à-dire lorsqu’il laisse une trace, une inscription, une hauteur, un mot, une pierre. Que ce soit avant ou après la catastrophe.

Talk, Chaire ACTIONS, CNAM, Paris

Today, I will give a joint presentation with Olivier Côté at the CNAM (Conservatoire National des Arts et Métiers) in Paris, for the chaire ACTIONS. My talk will be an introduction based on our two first joint papers, “A fair price to pay: Exploiting causal graphs for fairness in insurance” that was published early that year, and “Selection Bias in Insurance: Why Portfolio-Specific Fairness Fails to Extend Market-Wide“. Slides are now available. Olivier will present more recent work, to visualize the fairness spectrum on real data from an insurance company. Slides are available.

Continue reading Talk, Chaire ACTIONS, CNAM, Paris

Talks at Milliman R&D, Paris

Tomorrow, I will attend the Milliman R&D Seminar, for a joint presentation with Olivier Côté, who will spend the week in Paris. My talk will be an introduction based on our two first joint papers, “A fair price to pay: Exploiting causal graphs for fairness in insurance” that was published early that year, and “Selection Bias in Insurance: Why Portfolio-Specific Fairness Fails to Extend Market-Wide“. Slides are now available. Olivier will present more recent work, to visualize the fairness spectrum on real data from an insurance company. Slides are available.

Talk at the Groupe de travail ARC (Actuariat et Risques Contemporains), in Paris

This Friday, I will give a talk in Paris, on using optimal transport to mitigate unfair predictions, at the ARC Seminar.

The insurance industry is heavily reliant on predictions of risks based on characteristics of potential customers. Although the use of said models is common, researchers have long pointed out that such practices perpetuate discrimination based on sensitive features such as gender or race. Given that such discrimination can often be attributed to historical data biases, an elimination or at least mitigation is desirable. With the shift from more traditional models to machine-learning based predictions, calls for greater mitigation have grown anew, as simply excluding sensitive variables in the pricing process can be shown to be ineffective. In this talk, we first investigate why predictions are a necessity within the industry and why correcting biases is not as straightforward as simply identifying a sensitive variable. We then propose to ease the biases through the use of Wasserstein barycenters instead of simple scaling. To demonstrate the effects and effectiveness of the approach we employ it on real data and discuss its implications. The talk will be based on recent work with François Hu and Philipp Ratz (2310.20508, 2309.06627, 2306.12912 and 2306.10155).

Slides are now available online.

Equité et discrimination en assurance

Mercredi 18 mai, j’interviendrai au séminaire de la chaire PARI, à Paris, dans les locaux de la CCR, pour parler d’équité et de discrimination en assurance… Les slides sont en ligne.

En poursuivant la discussion abordée dans “L’équité de l’apprentissage machine en assurance” (co-écrit avec Laurence Barry), nous présentons un aperçu des problèmes auxquels les actuaires sont confrontés lorsqu’ils traitent de la discrimination. Depuis le début de leur histoire, les assureurs sont connus pour utiliser des données pour classifier et tarifer les risques. En tant que tels, ils ont été confrontés très tôt au problème de l’équité et de la discrimination associées aux données. Cette question devient de plus en plus importante avec l’accès à des données plus granulaires et comportementales, et évolue pour refléter les technologies et les préoccupations sociétales actuelles. En examinant les débats antérieurs sur la discrimination, nous montrons que certains préjugés algorithmiques sont une version renouvelée de préjugés plus anciens, tandis que d’autres semblent inverser l’ordre précédent. Paradoxalement, alors que la pratique de l’assurance n’a pas profondément changé et que la plupart de ces biais ne sont pas nouveaux, l’ère de l’apprentissage automatique ébranle encore profondément la conception de l’équité en matière d’assurance. (Cette présentation s’appuiera également sur un rapport qui sera bientôt publié par l’Institut Louis Bachelier).

Changement Climatique et Assurance

Mercredi, je participerais à la Journée du Marché organisée par AON, pour la table ronde du matin sur le thème du changement climatique, à Paris.

La première partie de la table-ronde portera sur l’impact du changement climatique sur l’assurance et la réassurance, et la partie sur l’impact de l’assurance sur le changement climatique. J’interviendrais principalement dans la première partie.

J’en profite pour remettre un lien vers un court article que nous avions publié il y a quelques temps, ‘Changement Climatique et Assurance‘, dans Variances.

Antisélection en Assurance Automobile et Impact des Jours de Carence sur les Arrêts Maladies

Cet après midi, je suis à Paris-Jourdan pour la soutenance de thèse d’Alexandre Godzinski , sur Three empirical essays on moral hazard identification in insurance, supervisée par Pierre-Yves Geoffard.

Pour l’anecdote, le premier chapitre (Effects of the one-day waiting period for sick leave on health-related absences in the French central civil service) pour sur le jour de carence pour l’assurance maladie (sujet qui fait couler de l’encre ces jours-ci).

Ce jour de carence a été introduit au 1er janvier 2012 et supprimé
au 1er janvier 2014. Durant ces deux années d’application, le premier jour d’arrêts maladie était non rémunéré. Il y avait un groupe de contrôle (le secteur privé) et un groupe test (le secteur public). Le jour de carence conduit à une baisse plus de 50 % de la prévalence des absences de 2 jours,

mais aussi une hausse de 25 % de la prévalence des absences de 1 semaine à 3 mois

Aucun effet n’est trouvé sur la prévalence totale pour la population globale. Les agents ne sont donc ni plus ni moins absents pour raison de santé…

Douce France

Hier, sur Twitter, je mentionnais une carte parue sur Times Higher Education à propos des “100 meilleurs universités” (dans le monde entier). Je ne sais plus par quel biais j’ai vu des cartes, par pays, permettant de voir où étaient les 100 meilleures universités (d’ordinaire, on a un classement, mais là, pour la première fois, on avait des cartes),

Le premier tweet, en anglais, qui montrait la carte est passé assez inaperçu. Ce n’est pas le cas du second, en français, qui a été beaucoup repris, dans lequel je posais la question de manière plus directe, “sauras-tu remarquer une particularité géographique de l’enseignement supérieur français?“. Car je trouve la carte française assez choquante. disait de manière assez élégante que la “ville lumière” faisait de l’ombre aux autres villes françaises. Ce n’est pas peu dire ! Dans tous les autres pays comparables, avec 4, 5 ou 6 universités dans ce classement, on a une relative dispersion sur le territoire. Mais en France, on a Paris. Et c’est tout.

C’est amusant car cette semaine, j’ai commencé le livre Unknown Quantity de John Derbyshire qui raconte, de manière très vulgarisée (et donc parfaite pour moi) l’histoire de l’algèbre. Et dans un des premiers chapitres (on est encore en Mésopotamie) il y a ce paragraphe qui m’a beaucoup rappelé cette carte

Effectivement, il faudrait que je creuse un peu, mais j’ai du mal à voir ce qui va ressortir de cette méga-concentration géographique typiquement française de l’enseignement supérieur. Rien de bon, je crains…

Crowded Cities, Paris, Hong Kong and Montréal

Over the past years, I’ve been living in different cities, all of them being completely different, compared with the others. I have been living in Paris, which is a big city in Europe, with a large suburban neighborhood, too (la banlieue).

Then, I’ve been living in Hong Kong, which is a larger city, in Asia.

It was crowded. I mean, it was the feeling I had, while I was living there. And more recently, I’ve been living in Montréal, in North America. Montreal is a large city. Or to be more specific, an island,

The three cities are quite different. Paris, 2.211 million unhabitants, and 105,4 km² (density 21,057 unhabitants per km²). Montréal, 1.621 million unhabitants, and three times wider 365.1 km² (density 4,441 unhabitants per km²). Hong Kong, 7.234 million unhabitants, and again three times wider 1,104 km² (density 6,553 unhabitants per km²). In Hong Kong, there are several hill where it is not possible to build anything: on a large part of the island, the density is null.

Continue reading Crowded Cities, Paris, Hong Kong and Montréal

Short (but Buzy) Trip in Europe

I will flight tomorrow evening to go to Belgium. I will attend a PhD defense this Monday, at Louvain-la-Neuve. On Tuesday, I will give a crash course on risk measures, for PhD Students, in Louvain-la-Neuve. Then, Wednesday morning, I have a meeting with some friends in an insurance company, in Brussels, and I will be around noon in Paris, to give a talk on Big Data, for the Big Data Task Force of the (French) Institute of Actuaries. I will then have some meetings in the afternoon. I should flight back on Thursday, and give my lecture on Predictive Modeling in the evening…

I guess that Saturday will be a mix between two very different activities, enjoying some time with the kids (and watch the game), and trying to finalize my slides…

Le Vote par Procuration en France

La Vie des Idées a mis en ligne, ce matin, un court texte, écrit par Baptiste Coulmont (a.k.a. @coulmont) et Joël Gombin (a.k.a. @joelgombin), auquel j’ai très modestement contribué, intitulé “Un homme, deux voix. Le vote par procuration“.

Alors que sur son blog, Baptiste a rajouté pas mal d’information sur le vote par procuration en France (et le contexte général, en particulier pourquoi autant de partis courtisent certaines personnes en les incitant à voter par procuration), et sur les bases de données, je voulais en profiter pour mettre en ligne quelques codes utilisés dans l’article, et en particulier, mentionner des graphiques non-utilisés car plus difficile à interpréter, mais à mon avis plus juste en terme de modèle (comme les conclusions étaient les mêmes, on a retenu des graphiques plus classiques). Rappelons tout d’abord qu’on analyse non pas le vote à partir de données individuelles (ceci ne peut s’obtenir, le vote étant encore secret en France), mais à partir des résultats des différents bureaux de vote (c’est la notion de corrélation écologique évoquée dans le texte, à cause du problème potentiel d’ecological fallacy). Moyennant toutes ces précautions d’usage, on a essayé d’analyser les données à notre disposition.

  • Modèle de régression, et recherche de variables explications

Pour faire une régression, et expliquer le taux de procurations dans un bureau de vote, ma première idée était de dire que  où  est le nombre de procurations dans le bureau de vote , et où  est (au choix) le nombre d’électeurs inscrits ou le nombre d’électeurs ayant voté. On suppose ici que , la proportion d’électeurs qui a voté par procuration peut être fonction de divers variables explicatives. Les variables, elles sont dans la base suivante (je renvoie vers le blog de Baptiste pour les bases que l’on utilise, en particulier à partir des données de insee.fr et d’opendata.paris.fr)

> bt1=read.table("paris2007-pres-t1.csv",header=TRUE,sep=";")
> bt2=read.table("paris2007-pres-t2.csv",header=TRUE,sep=";")
> bv=read.table("paris-bv-insee-07.csv",header=TRUE,sep=";")
> bv$BV=bv$BVCOM
> baset1=merge(bt1,bv,by="BV")
> baset2=merge(bt2,bv,by="BV")
> baset1$LOGEMENT=baset1$PROPRIO+baset1$LOCNONHLM+baset1$LOCHLM+baset1$GRATUIT
> baset2$LOGEMENT=baset2$PROPRIO+baset2$LOCNONHLM+baset2$LOCHLM+baset2$GRATUIT

Si on suppose que  est fonction  le taux de logements occupés par leur propriétaire, dans le quartier (associé à un bureau de vote),

> variable="PROPRIO"
> reference="LOGEMENT"
> baset1$taux=baset1[,variable]/baset1[,reference]
> baset2$taux=baset2[,variable]/baset2[,reference]

il est légitime de tenter une régression logistique,

voire un lissage par splines, si on pense que le lien peut ne pas être linéaire,

Ceci se fait à l’aide du code suivant, pour la version lissée (par splines cubiques)

> b=hist(baset1$taux,plot=FALSE)
> library(splines)
> regt1=glm(PROCURATIONS/INSCRITS~bs(taux,6),family=binomial,weights=INSCRITS,data=baset1)
> regt2=glm(PROCURATIONS/INSCRITS~bs(taux,6),family=binomial,weights=INSCRITS,data=baset2)
> u=seq(min(baset1$taux)+.015,max(baset1$taux)-.015,by=.001)
> ND=data.frame(taux=u)
> ug=seq(0,max(baset1$taux)+.05,by=.001)
> pt1=predict(regt1,newdata=ND,se=TRUE,type="response")
> pt2=predict(regt2,newdata=ND,se=TRUE,type="response")
> library(RColorBrewer)
> CL=brewer.pal(6, "RdBu")
> plot(ug,ug*1,col="white",xlab=nom,ylab="Taux de procuration",
+ ylim=c(0,.1))
> for(i in 1:(length(b$breaks)-1)){
+ polygon(b$breaks[i+c(0,0,1,1)],c(0,b$counts[i],b$counts[i],0)
+ /max(b$counts)*.05,col="light yellow",border=NA)}
> polygon(c(u,rev(u)),c(pt1$fit+2*pt1$se.fit,rev(pt1$fit-2*pt1$se.fit)),
+ border=NA,density=30,col=CL[4])

et, pour la régression logistique standard (linéaire)

> lines(u,pt1$fit,col=CL[6],lwd=2)
> polygon(c(u,rev(u)),c(pt2$fit+2*pt2$se.fit,rev(pt2$fit-2*pt2$se.fit)),
+ border=NA,density=30,col=CL[3])
> lines(u,pt2$fit,col=CL[1],lwd=2)
> regt1l=glm(PROCURATIONS/INSCRITS~taux,family=binomial,weights=INSCRITS,data=baset1)
> regt2l=glm(PROCURATIONS/INSCRITS~taux,family=binomial,weights=INSCRITS,data=baset2)
> ND=data.frame(taux=ug)
> pt1l=predict(regt1l,newdata=ND,se=TRUE,type="response")
> pt2l=predict(regt2l,newdata=ND,se=TRUE,type="response")
> lines(ug,pt1l$fit,col=CL[5],lty=2)
> lines(ug,pt2l$fit,col=CL[2],lty=2)
> legend(0,.1,c("Second Tour","Premier Tour"),col=CL[c(1,6)],
+ lwd=2,lty=1,border=NA)

(en rajoutant une petite légende, avec une visualisation pour les deux tours de l’élection présidentielle, avec un intervalle de confiance sur la prévision de mon taux de procuration).

On peut faire la même chose sur le taux de logement HLM, dans le quartier,

Les dessins sont parlant, mais dans la sortie du modèle de régression, l’interprétation de  laisse à désirer (toute suggestion est la bienvenue !).

> summary(regt1l)

Call:
glm(formula = PROCURATIONS/INSCRITS ~ taux, family = binomial, 
    data = baset1, weights = INSCRITS)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-12.9549   -1.5722    0.0319    1.6292   13.1303  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) -3.70811    0.01516  -244.6   <2e-16 ***
taux         1.49666    0.04012    37.3   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 12507  on 836  degrees of freedom
Residual deviance: 11065  on 835  degrees of freedom
AIC: 15699

Number of Fisher Scoring iterations: 4

> summary(regt2l)

Call:
glm(formula = PROCURATIONS/INSCRITS ~ taux, family = binomial, 
    data = baset2, weights = INSCRITS)

Deviance Residuals: 
     Min        1Q    Median        3Q       Max  
-15.4872   -1.7817   -0.1615    1.6035   12.5596  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) -3.24272    0.01230 -263.61   <2e-16 ***
taux         1.45816    0.03266   44.65   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

(Dispersion parameter for binomial family taken to be 1)

    Null deviance: 9424.7  on 836  degrees of freedom
Residual deviance: 7362.3  on 835  degrees of freedom
AIC: 12531

Number of Fisher Scoring iterations: 4

 

On a alors voulu comparer avec un modèle qui me semble moins juste, mais qui est plus simple à interpréter, où on suppose que le taux de procuration (par bureau) est expliqué par un modèle linéaire

(que l’on peut aussi lisser, pour vérifier que le lien est effectivement linéaire). Le code est ici

> regt1=lm(PROCURATIONS/INSCRITS~bs(taux,6),weights=INSCRITS,data=baset1)
> regt2=lm(PROCURATIONS/INSCRITS~bs(taux,6),weights=INSCRITS,data=baset2)
> u=seq(min(baset1$taux)+.015,max(baset1$taux)-.015,by=.001)
> ND=data.frame(taux=u)
> ug=seq(0,max(baset1$taux)+.05,by=.001)
> pt1=predict(regt1,newdata=ND,se=TRUE,type="response")
> pt2=predict(regt2,newdata=ND,se=TRUE,type="response")
> library(RColorBrewer)
> CL=brewer.pal(6, "RdBu")
> plot(ug,ug*1,col="white",xlab=nom,ylab="Taux de procuration",
+ ylim=c(0,.1))
> for(i in 1:(length(b$breaks)-1)){
+ polygon(b$breaks[i+c(0,0,1,1)],c(0,b$counts[i],b$counts[i],0)
+ /max(b$counts)*.05,col="light yellow",border=NA)}
> polygon(c(u,rev(u)),c(pt1$fit+2*pt1$se.fit,rev(pt1$fit-2*pt1$se.fit)),
+ border=NA,density=30,col=CL[4])
> lines(u,pt1$fit,col=CL[6],lwd=2)
> polygon(c(u,rev(u)),c(pt2$fit+2*pt2$se.fit,rev(pt2$fit-2*pt2$se.fit)),
+ border=NA,density=30,col=CL[3])
> lines(u,pt2$fit,col=CL[1],lwd=2)
> regt1l=lm(PROCURATIONS/INSCRITS~taux,weights=INSCRITS,data=baset1)
> regt2l=lm(PROCURATIONS/INSCRITS~taux,weights=INSCRITS,data=baset2)
> ND=data.frame(taux=ug)
> pt1l=predict(regt1l,newdata=ND,se=TRUE,type="response")
> pt2l=predict(regt2l,newdata=ND,se=TRUE,type="response")
> lines(ug,pt1l$fit,col=CL[5],lty=2)
> lines(ug,pt2l$fit,col=CL[2],lty=2)
> legend(0,.1,c("Second Tour","Premier Tour"),col=CL[c(1,6)],
+ lwd=2,lty=1,border=NA)

(j’ai tout mis d’un coup cette fois, les modèles lissés et linéaires, l’un à la suite de l’autre)

Cette fois, on a une sortie de régression plus classique,

> summary(regt1l)

Call:
lm(formula = PROCURATIONS/INSCRITS ~ taux, data = baset1, weights = INSCRITS)

Weighted Residuals:
    Min      1Q  Median      3Q     Max 
-1.9994 -0.2926  0.0011  0.3173  3.2072 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 0.021268   0.001739   12.23   <2e-16 ***
taux        0.054371   0.004812   11.30   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.646 on 835 degrees of freedom
Multiple R-squared:  0.1326,	Adjusted R-squared:  0.1316 
F-statistic: 127.7 on 1 and 835 DF,  p-value: < 2.2e-16

> summary(regt2l)

Call:
lm(formula = PROCURATIONS/INSCRITS ~ taux, data = baset2, weights = INSCRITS)

Weighted Residuals:
    Min      1Q  Median      3Q     Max 
-2.9029 -0.4148 -0.0338  0.4029  3.4907 

Coefficients:
            Estimate Std. Error t value Pr(>|t|)    
(Intercept) 0.033909   0.001866   18.17   <2e-16 ***
taux        0.079749   0.005165   15.44   <2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 0.6934 on 835 degrees of freedom
Multiple R-squared:  0.2221,	Adjusted R-squared:  0.2212 
F-statistic: 238.4 on 1 and 835 DF,  p-value: < 2.2e-16

On note plusieurs choses de ces graphiques. (i) les deux types de régression donnent des modèles pour les taux de procuration très très proches. Donc autant prendre le plus simple à interpréter. (ii) le lissage n’apporte rien, et le modèle linéaire semble pertinent. On a ainsi regardé plusieurs variables, et on en a retenu un certain nombre, pour tenter un modèle multiple. Avant de parler des résidus de notre modèle, je devrais peut être prendre quelques lignes pour parler un peu de cartographie (une nouvelle fois, Baptiste m’a fait découvrir de belles fonctions).

  • Visualiser les bureaux de vote à Paris

Pour récupérer le fond de carte, avec les bureaux de vote, on utilise (là encore, je renvoie au blog de Baptiste, qui explique l’utilisation de données de cartelec.net)

> library(maptools)
> library(rgdal)
> library(classInt)
> paris=readShapeSpatial("paris-cartelec.shp")

Si on veut visualiser, par exemple, le taux de procuration (disons la moyenne entre les deux tours), on utilise les données suivantes

> elec=data.frame()
> elec=cbind(bt1$BV,(bt1$PROCURATIONS+bt2$PROCURATIONS),(bt1$EXPRIMES+bt2$EXPRIMES))
> colnames(elec)=c("BV","PROCURATIONS","EXPRIMES")
> elec=as.data.frame(elec)
> elec$BV=bt1$BV

Ensuite, viennent les fonctions graphiques, où on va passer d’un taux à une classe et d’une classe à une couleur,

> m=match(paris$BUREAU,elec$BV)
> plotvar=100*elec$PROCURATIONS/elec$EXPRIMES
> nclr=7
> plotclr=brewer.pal(nclr,"RdYlBu")[nclr:1] 
> class=classIntervals(plotvar[m], nclr, style="fisher",dataPrecision=1)
> colcode=findColours(class, plotclr)

Reste à conclure, en faisant une visualisation graphique de nos données

> par(mar=c(1,1,1,1))
> plot(paris,col=colcode,border=colcode)
> legend(656274.9, 6867308,legend=names(attr(colcode,"table")), 
+ fill=attr(colcode, "palette"), cex=1, bty="n",
+ title="Frequence procurations (%)")

Histoire de conclure, on peut regarder un peu nos résidus, obtenus sur un modèle linéaire. Considérons un modèle sur seulement trois variables explicatives,

> regt1=lm(PROCURATIONS/INSCRITS~I(POP65P/POP)+
+ I(PROPRIO/LOGEMENT)+I(CS3/POP1564),weights=INSCRITS,data=baset1)

Dans ce cas, la visualisation des résidus donne

> m=match(paris$BUREAU,elec$BV)
> plotvar=100*residuals(regt1)
> nclr=7
> plotclr=brewer.pal(nclr,"RdYlBu")[nclr:1] 
> class=classIntervals(plotvar[m], nclr, style="fisher",dataPrecision=1)
> colcode=findColours(class, plotclr)
> par(mar=c(1,1,1,1))
> plot(paris,col=colcode,border=colcode)
> legend(656274.9, 6867308,legend=names(attr(colcode,"table")), 
+ fill=attr(colcode, "palette"), cex=1, bty="n",title="Residus")

Idéalement, il faudrait avoir un beau bruit (spatial), c’est à dire avoir des couleurs réparties aléatoirement sur Paris. Il reste encore pas mal de régions dont les voisins sont de la même couleurs, et on repère quelques quartiers atypiques, avec soit des résidus importants négativement, ou positivement. Comme toujours, en modélisation, on pourrait passer des heures pour essayer de capturer tous les effets, mais aucun modèle avec les variables à notre disposition nous a permis de faire réellement mieux.

Playing with robots

My son would be extremely proud if I tell him I can spend hours building robots. Well, my robots are not as fancy as Dr Tenma’s, but they usually do what I ask them to do. For instance, it is extremely simple to build a robot with R, to extract data from websites. I have mentioned it here (one tennis matches), but it failed there (on NY Marathon). To illustrate the use of robots, assume that one wants to build his own dataset to study prices of airline tickets. First, we have to choose a departure city (e.g. Paris) and an arrival city (e.g. Montreal). Then, one wants to look at all possible dates from April first (I ran it last month) till the end of December (so we create a vector with all leaving dates, namely a vector for the day, one for the month, and one for the year). Then, we choose a return date (say 3 days after).

DEP="Paris"
ARR="Montreal"
DATE1D=rep(c(1:30,1:31,1:30,1:31,1:31,1:30,1:31,1:30,
1:31,1:31,1:29),3)
DATE1M=rep(c(rep(4,30),rep(5,31),rep(6,30),rep(7,31),
rep(8,31),rep(9,30),rep(10,31),rep(11,30),rep(12,31),
rep(1,31),rep(2,29)),3)
DATE1Y=rep(c(rep(2011,30+31+30+31+31+30+31+
30+31+31+28),rep(2012,31+29)),3)
k=3
DATE3D=c((1+k):30,1:31,1:30,1:31,1:31,1:30,1:31,
1:30,1:31,1:31,1:29,1:k)
DATE3M=c(rep(4,30-k),rep(5,31),rep(6,30),rep(7,31),rep(8,31),
rep(9,30),rep(10,31),rep(11,30),rep(12,31),rep(1,31),rep(2,29),
rep(3,k))
DATE3Y=c(rep(2011,30+31+30+31+31+30+31+30+31+
31+28-k),re
p(2012,31+29+k))

It is also possible (for a nice robot), to skip all prior dates

skip=max(as.numeric(Sys.Date()-as.Date("2011-04-01")),1)

Then, we need a website where requests can be written nicely (with cities and dates appearing explicitly). Here, I cannot not mention the website that I used since it is stated on the website that it is strictly forbidden to run automatic requests… Anyway, consider a loop create a url address (actually I chose the value of the date randomly, since I had been told that those websites had memory: if you ask too many times for the same thing during a short period of time, prices would go up),

URL=paste("http://www.♦♦♦♦/dest.dll?qscr=fx&flag=q&city1=",
DEP,"&citd1=",ARR,"&",
"date1=",DATE1D[s],"/",DATE1M[s],"/",DATE1Y[s],
"&date2=",DATE3D[s],"/",DATE3M[s],"/",DATE3Y[s],
"&cADULT=1",sep="")

then, we just have to scan the webpage, looking for ticket prices (just looking for some specific names)

page=as.character(scan(URL,what="character"))
I=which(page%in%c("Price0","Price1","Price2"))
if(length(I)>0){
PRIX=substr(page[I+1],2,nchar(page[I+1]))
if(PRIX[1]=="1"){PRIX=paste(PRIX,page[I+2],sep="")}
if(PRIX[1]=="2"){PRIX=paste(PRIX,page[I+2],sep="")}

Here, we have to be a bit cautious, if prices exceed 1000. Then, it is possible to start a statistical study. For instance, if we compare to destination (from Paris), e.g. Montréal and New York, we obtain the following patterns (with high prices during holidays),

It is also possible to run the code twice (here it was run last month, and a couple of days ago), for the same destination (from Paris to Montréal),

Of course, it would be great if I could run that code say every week, to build up a nice dataset, and to study the dynamic of prices…

The problem is that it is forbidden to do this. In fact, on the website, it is mentioned that if we want to extract data (for an academic purpose), it is possible to ask for an extraction. But if we do tell that we study specific prices, data might be biased. So the good idea would be to use several servers, to make several requests, randomly, and to collect them (changing dates and destination). But here, my computing skills – unfortunately – reach a limit….