Tomorrow afternoon, because Pavel Shevchenko is currently in Rennes, there will be a small workshop. I will present some recent work with Amadou Barry and Karim Oualkacha on quantile and expectile regressions (our work is more specifically on panel regressions, with random effect models, quantile QRRE and expectile ERRE) but tomorrow, it will be more an introduction. Slides are available online.
Monthly Archives: November 2016
Votes Populaires et Grands Électeurs
La semaine dernière, j’avais mis un billet en ligne où je m’interrogeais sur la pertinence de faire commencer l’axe des ordonnées en 0, quand on regardait les élections américaines, en représentant le nombre de votes obtenus. Mon point était que 0 n’avait pas vraiment de sens, quand on regardait républicains et démocrates (en 2016 en tous cas) car ces deux parties obtiendront toujours plusieurs dizaines de millions de voix, quoi qu’il se passe.
Mais les votes populaires importent finalement peu, compte tenu du mode de scrutin. Le plus importants est le nombre de grands électeurs du collège électoral.
> electoral=as.matrix(data.frame(
+ red=c(306,206,173),
+ blue=c(232,332,365)))
> electoral=electoral[3:1,]
> rownames(electoral)=c(2008,2012,2016)
> barplot(t(electoral), col=c("red","darkblue")
Faire commencer le graphique en 0 a ici davantage de sens, car il serait possible d’imaginer qu’un candidat obtienne très peu de grands électeurs. Et force est de constater que ce graphique est parlant. On peut même tenter d’aller un peu plus loin, en superposant les deux… Le premier soucis est qu’on ne peut pas superposer deux graphiques en barres, donc il faut revenir aux lignes (ou aux points, mais comme c’est une évolution dans le temps, on peut les relier). Le second soucis est que les deux n’ont pas la même échelle (pour les grands électeurs, on en a en tout 539, alors que la population américaine se compte en dizaine de millions d’habitants). On pourrait par exemple tracer
ou encore (de manière toute aussi valide)
Bref, les doubles axes posent soucis (mais ce n’est pas nouveau). La solution serait peut être de travailler en pourcentage. Pour les grands électeurs, on peut mettre le pourcentage obtenu parmi les 539 électeurs. Pour les nombres de votes populaires, on peut se contenter (je pense) de comparer les deux (i.e. pourcentage de voix obtenues par le rouge par rapport au nombre voix obtenues par le rouge et le bleu)
C’est plus parlant, non ?
Actuariat de l’Assurance non-Vie #9
Quelques petits points pour conclure la partie sur la tarification du risque de masse. Les slides sont en ligne. La dernière partie sera dédiée à la modélisation du passif, avec la modélisation des provisions pour sinistres à payer….
Actuariat de l’Assurance non-Vie #8
Pour aller plus loin sur la modélisation des coûts individuels, un mot sur les grands risques. Les slides sont en ligne.
Actuariat de l’Assurance non-Vie #7
Après la modélisation de la fréquence de sinistres, nous allons commencer les modèles de coûts individuels des sinistres. Les slides sont en ligne.
ENSAE, devoir 2
Comme annoncé, le second devoir sera relativement proche du premier. Sauf qu’au lieu de modéliser la survenance, on va chercher à modéliser la fréquence. Le code pour récupérer la base est le même que pour le premier devoir
rm(list=ls()) download.file(url="http://freakonometrics.free.fr/base_ensae_1.RData",destfile="base.RData") load("base.RData")
A partir de la base base_ensae_1, proposez deux modèles (une régression de Poisson, et un modèle parmi ceux vus en cours) pour modéliser la variable Nb1 indiquant le nombre de sinistres survenus sur une police d’assurance (pendant la période de couverture). Il s’agit, comme en cours, d’expliquer la fréquence annuelle de sinistres.
Le rapport doit contenir entre 5 et 10 pages, expliquant les modèles retenus, les choix qui ont été fait (pour rendre catégorielles de variables continues, ou au contraire les lisser, etc).
En plus du rapport, je veux une prévision à l’aide des deux modèles sur la base de données pricing. Je veux, par mail, avec un fichier csv, contenant le numéro de la police, PolNum, et les fréquences annuelles de déclaration d’accidents, avec les deux modèles (Freq1 et Freq2 respectivement)
pricing <- read.csv2("http://freakonometrics.free.fr/pricing.csv")
Le tout (rapport pdf et base csv) doit être envoyé pour le retour des vacances de Noël, par mail à arthur.charpentier@gmail.com. La première page du rapport doit indiquer les noms des deux étudiants du binôme. Je remets une description (succincte) des variables
Les gens bien élevés font commencer les barres en zéro
Il y a quelques jours, je mentionnais sur twitter un graphique mis en ligne sur imgur.com, au sujet des trois dernières élections présidentielles américaines,
Le premier point est que le graphique a été fait alors que les dépouillements n’étaient pas encore finis. 72 heures après la clôture des bureaux de votes, plusieurs millions de bulletins n’avaient pas été dépouillés, comme me l’ont fait noter François Gourio et Tom Roud. Comme on visualise ici le nombre de votants, et pas le pourcentage de votants, c’est génant… Le second point avait été souligné par Marin Dacos, et par plusieurs personnes, toujours sur twitter, qui disaient (je résume un peu)
On ne peut pas faire des diagrammes en barres qui ne commencent pas en zéro ! Sacrilège !
C’est en effet une règle qui semble bien établie. Enfin, quand je dis ‘règle‘, on pourrait penser qu’il s’agit d’une ‘suggestion‘. Des sortes de ‘règles de savoir vivre’, à la Nadine de Rothschild,
Quand on est bien élevé, il est de bon ton de faire commencer ses diagrammes en barres en zéro.
Et cette règle semble importante, car c’est la première que donne Nathan Yau dans ses règles pour faire des graphiques
A bar chart’s baseline must start at zero.
L’intuition est que dans un diagramme en barres, la longueur des barres a un sens.
The bar chart relies on length to show data. Shorter bars represent lower values, and longer bars represent greater values. Compare bar lengths to compare values. That’s how it works. When you shift the baseline, you distort the visual.
Quittons nos élections un instant. Regardons par exemple les temps mis au 100 mètres lors des Championnats du Monde d’Athlétisme.
> year=c(1983,1987,seq(1991,2015,by=2))
> time=c(10.07,9.93,9.86,9.87,9.97,9.86,9.80,9.82, 10.07,9.88,9.85,9.58,9.92,9.77,9.79)
> names(time)=year
> barplot(time,col="darkgreen",beside=TRUE)
Oui, on a compris, les barres ont une interpréation physique, et il ne faut pas les raccourcir ! C’est le temps mis par un sportif pour courrir 100 mètres. Mais force est de constater qu’on ne voit pas grand chose… Allez, souvenez vous en 2009,
Sur notre diagramme en barre, on ne voit rien d’exceptionnel… Allez, osons faire commencer l’axe des ordonnées à 9 secondes,
> barplot(time,ylim=c(9,10.2),col="darkgreen")
Ok, je suis un hérétique… Certes, je mesure ici le temps au delà de 9 secondes, ce qui ne veut pas dire grand chose… J’opère ici la “distortion” dont parle Nathan Yau…. mais j’ai quand même l’impression qu’on voit mieux l’exploit de Bolt (sans laquelle on ne voit absolument rien). Cela dit, on pourrait même tenter quelque chose d’encore plus violent
> barplot(time,ylim=c(min(time),10.2), col="darkgreen")
C’est ridicule comme graphique n’est-ce pas ? Cela dit, à peu de chose près, ce graphique peut se lire en translatant, et en disant qu’il s’agit le temps mis en plus, par rapport au record de Bolt en 2009,
et ce graphique, lui, a du sens et suit la règle de Nathan Yau : il commence en 0.
Sours R, naturellement, un diagramme en baton commencera en 0 mais ça ne sera pas le cas pour une courbe,
Ici, le graphique commence à peu près au minimum de nos observations. Et on comprend avec ce graphique le caractère exceptionnel du temps mis par Bolt, en 2009. Faire commencer le graphique en 0 est ridicule,
C’est presque pire lorsqu’on représente l’évolution du record du monde, au 100 mètres,
Ca n’a pas d’allure ! On ne voit rien sur ce graphique. Alors qu’en changeant l’axe des ordonnées, ça devient plus clair !
Bref, je suis surpris qu’on passe pour un hérétique quand on dit que ce n’est pas génant de ne pas commencer en 0. Ca dépend du message que l’on souhaite faire passer avec le graphique.
En fait, j’ose affirmer que commencer en 0 n’a pas sens ici, car il est impossible qu’un être humain court le 100 mètres en 0 secondes. Cette référence n’a pas lieu d’être ! Mais supposons qu’on nous dise que pour des raisons morphologiques, on pourrait imaginer qu’un homme court, un jour, le 100 mètres en 9 secondes, mais qu’il serait physiologiquement impossible de passer en dessous. Dans ce cas, j’ai envie de croire que la réprésentation en commençant à 9 secondes aurait du sens…
On voit ici non seulement la différence entre Bolt en 2009 et les autres champions du monde, mais on voit aussi la distance qui sépare ces athlètes d’un record absolu. Je suis désolé, mais je ne trouve pas ce graphique dérangeant. Certes, il convient de lire (rapidement) l’axe des ordonnées, pour éviter d’affirmer que Bolt aurait mis 2 fois moins de temps en 2009 que le champion du monde de 2003 pour courrir le 100 mètres (car la barre semble deux fois plus haute).
Revenons maintenant à nos élections américaines, en reprenant les nombres de votes obtenus par candidats en 2008, 2012 et 2016 (avec des chiffres mis à jour)
> votes=data.frame(red=c(59948323,60933504, 62213384),blue=c(69498516,65915795,64154610))
> MV=as.matrix(t(votes))
> colnames(MV)=c(2008,2012,2016)
> barplot(MV/1e6, main="",
+ xlab="", col=c("red","darkblue"),
+ beside=TRUE)
Là encore, j’aurais presque envie d’affirmer que commencer en 0 n’a pas grand sens. Tout d’abord parce qu’il est dur d’imaginer que le candidat des Républicains comme le candidat des Démocrates ait un score proche de zéro. Ensuite, il est aussi difficile d’imaginer qu’un candidat ait deux fois plus de vote que l’autre. Car on peut comparer des barres quand une des deux fois plus grande que l’autre, pas quand elle est 14% plus grande… ça ne se voit pas à l’oeil nu… disons que la différence entre 14% et 18% n’est pas visible. Aussi, quand on connait le contexte, on sait qu’un candidat ne peut pas avoir deux fois plus que l’autre… Donc quand on voit un diagramme à baton de ce genre, on va regarder les valeurs des ordonnées.
> barplot(MV/1e6, main="",
+ xlab="", col=c("red","darkblue"),
+ beside=TRUE,ylim=c(52,72))
J’ai envie de dire qu’on pourrait accepter de fausser la représentation, parce que ce n’est pas ce qu’on veut illustrer avec ce graphique. Ce qu’on veut montrer c’est que le nombre de votes rouges varie augmente un peu, et que le nombre de votes bleus a baissé. Avec des courbes (là on a le droit), on aurait la représentation suivantes
mais je trouve le diagramme en barres plus joli. Et je trouve dommage de dire que le diagramme avec les barres juste au dessus est faussé, alors que le diagramme avec les courbes ne l’est pas… Si on fait commencer en zéro, comme le dit la règle, on ne voit plus rien. Sauf qui ça se joue dans un mouchoir de poche,
Là encore, si on veut respecter la règle du zero, et faire malgré tout des barres, peut être faut-il représenter les variations du nombre de votants (en millions), d’une élection sur l’autre
mais je n’aime pas trop…. Là encore, le graphique le plus parlant reste celui mentionné dans mon tweet
(la nuance est peut être que je ne mets pas ici de barre horizontale en bas). On peut voir le message qu’on veut faire passer avec le graphique de manière beaucoup plus claire. Certains diraient que je fausse l’interprétation, mais je trouve l’affirmation excessive. Il s’agit plutôt de déformer pour s’assurer justement qu’un message (juste et vrai) passe mieux. C’est ce qu’on voyait avec l’exemple du 100 mètres : sans déformation, le seul message que l’on retient est que le record de Bolt est anecdotique.
J’aurais presque envie de croire que la règle ne s’applique pas si la valeur zéro n’est pas atteignable (et n’aurait pas de sens). Mais je ne demande pas mieux que d’être convaincu que même ici, la règle de commencer les barres en zéro doit s’appliquer !
R in Insurance, 2017
Following the successfull conferences in London (2013, 2014, 2016) and in Amsterdam (2015), the next edition will take place in Paris. The R in insurance 2017 will take place in ENSAE on June 8.
This one-day conference will focus again on applications in insurance and actuarial science that use R, the lingua franca for statistical computation. The intended audience of the conference includes both academics and practitioners who are active or interested in the applications of R in insurance. The two invited speakers are Katrien Antonio (KU Leuven) and Julie Seguela (Covea). It will be a nice event !
Actuariat de l’Assurance non-Vie #6
Après la modélisation a priori de la fréquence de sinistres, nous allons voir un peu les modèles a posteriori, avec les méthodes de crédibilité, et les modèles bonus-malus. Les slides sont en ligne.
Actuariat de l’Assurance non-Vie #5
Le cinquième jeu de slides du cours d’actuariat de l’assurance non-vie est maintenant en ligne. Il s’agit des slides sur la surdispersion dans les modèles de fréquence.
Exercices de Statistiques
Je mets en ligne une seconde série d’exercices. Il y a quelques exercices supplémentaires en inférence, et des exercices sur les tests. Comme annoncé, je ne taperais pas de correction. Par contre, si quelqu’un bute sur un exercice, on peut le regarder, en cours !
Dominance stochastique, ordre 1 ou ordre 2 ?
Mercredi dernier, on commençait le cours avec une présentation rapide du test de Wilcoxon-Mann-Whitney (parfois appelé test de la somme des rangs, de Wilcoxon). Ce test a été proposé par Frank Wilcoxon en 1945, et (presque en même temps) par Henry Mann et Donald Whitney (en 1947), dans un article intitulé On a Test of Whether one of Two Random Variables is Stochastically Larger than the Other. Le titre est clair. Ce test (non paramétrique) a vocation à tester l’hypothèse selon laquelle la distribution dans deux échantillons est la même. Ou, pour reprendre les notations du derniers billets, la distribution est la même dans deux groupes.
Autrement dit, on va chercher à tester, ici, , au sens où . Dans le test de Kolmogorov Smirnov, l’hypothèse alternative est .
Ici, comme le notent d’ailleur Mann et Whitney, “the test is shown to be consistent with respect to the class of alternatives for every “. Cette propriété est un peu particulière, et correspond à la notion de dominance stochastique à l’ordre 1. correspond à , ou encore, pour tout fonction croissante, si avec et .
Mais regardons un peu le test. On considère deux populations et . L’idée est de réordonner les éléments de par ordre croissant. On note le vecteur des rangs associés. Soit la somme des (premiers) rangs des éléments de , i.e. .
Comme l’ont montré Wilcoxon, Mann et Whitney, sous , suit une “loi connue”, où classiquement, “connue” veut dire tabulée pour de petits échantillons, et pour des échantillons plus grands.
Histoire d’illustrer, considerons deux échantillons, tirés suivant deux lois et avec , par exemple deux lois normales de moyennes différentes (et de même variance)
> u=seq(-3,4,length=251)
> plot(u,pnorm(u,0,1),col="red",type="l")
> lines(u,pnorm(u,.5,1),col="darkblue")
Effectivement, nos deux fonctions de répartition sont ordonnées, et on est bien dans une situation de dominance stochastique à l’ordre 1. Les densité sont ici
>plot(u,dnorm(u,0,1),col="red",type="l")
>lines(u,dnorm(u,.5,1),col="darkblue")
On peut générer 10,000 paires d’échantillons, de taille 100 (respectivement), et regarder la distribution de (et celle de ).
> P=matrix(NA,1e4,3)
> for(i in 1:1e4){
+ x=c(rnorm(100,0,1),rnorm(100,.5,1))
+ P[i,1:2]=c(sum(rank(x)[1:100]),sum(rank(x)[101:200]))
+ x0=c(rnorm(100,0,1),rnorm(100,0,1))
+ P[i,3]= sum(rank(x0)[1:100])
+}
> plot(density(P[,1]),col="red"))
> lines(density(P[,2]),col="darkblue")
> lines(density(P[,3]),lty=2)
Sous , la somme aurait eu la distribution avec les pointillés. On en est manifestement assez loin, autrement dit, on va rejeter ici l’hypothèse de lois égales, .
Intuitivement, c’est normal, car effectivement, les rangs dans un cas sont – en moyenne – plus faibles que pour l’autre,
Au lieu de simuler des lois dominées, à l’ordre 1, on peut tenter des lois dominées à l’ordre 2. Rappelons que signifie
ou encore
avec et . où est unne fonction croissante et concave.
En gestion des risques (ou sur les inégalités), on va supposer en plus que , ce qui correspond à une notion de “mean preserving spread” (on peut relire le document sur la notion de
single crossing, par Alain Chateauneuf). Une caractérisation est
où et . où est concave. Une caractérisation alternative est avec (on pourra relire Rothschild et Stiglitz, Increasing Risk: A Definition)
Dans le cas des lois normales, on a cette notion de ‘mean preserving spread’ lorsque les moyennes sont identiques, mais pas les variances. On a alors plus de dispersion,
> u=seq(-4,4,length=251)
> plot(u,pnorm(u,0,1),col="red",type="l")
> lines(u,pnorm(u,0,1.5),col="darkblue")
Effectivement, nos deux fonctions de répartition sont ordonnées, et on est bien dans une situation de dominance stochastique à l’ordre 2, avec du single crossing. Les densités sont ici
> plot(u,dnorm(u,0,1),col="red",type="l")
> lines(u,dnorm(u,0,1.5),col="darkblue")
On peut générer 10,000 paires d’échantillons, de taille 100 (respectivement), et regarder la distribution de (et celle de ).
> P=matrix(NA,1e4,3)
> for(i in 1:1e4){
+ x=c(rnorm(100,0,1),rnorm(100,0,1.5))
+ P[i,1:2]=c(sum(rank(x)[1:100]), sum(rank(x)[101:200]))
+ x0=c(rnorm(100,0,1),rnorm(100,0,1))
+ P[i,3]= sum(rank(x0)[1:100])
+}
> plot(density(P[,1]),col="red"))
> lines(density(P[,2]),col="darkblue")
> lines(density(P[,3]),lty=2)
Autrement dit, ici les sommes des rangs sont identiques, avec les deux échantillons, et donc on aura tendance à accepter ici l’hypothèse de lois égales, . L’idée naturelle est que avec les dans le premiers cas, effectivement, on avait plus de petits rangs avec le petit échantillon. Mais plus ici: le fait d’avoir plus de dispersion fait qu’on a en même temps plus de petits, et plus de grands. Et en moyenne, ça ne change rien
Analyse de la variance, et participation en TD
Nous avons vu lors du dernier cours l’analyse de la variance. Comme je l’avais expliqué, comme son nom ne l’indique pas, le but de l’anova est de comparer des moyennes. Histoire d’illustrer ce test, considerons la base suivante, qui donne la note d’étudiants à un examen final de statistique (note comprise entre 0 et 20), dans un cours de Master. Ca sera notre variable , comme nous l’avions noté en cours. La variable de “traitement” sera la participation des étudiants en TD, avec comme modalité possible ‘participation volontaire’ (pour aller faire des exercices au tableau), ‘participation non-volontaire’ (les étudiants vont au tableau quand ils y sont appelés) et enfin ‘non-participation’ (les étudiants qui ne participent pas, ou qui refusent de passer au tableau s’ils y sont appelés). Afin de constituer des groupes, nous disposons de deux variables. La première est le genre de l’étudiant (‘F’ et ‘M’) et la seconde est sur l’origine des étudiants (suivant qu’ils ont fait leur licence ou pas, à Rennes, ‘R1’ ou ‘autre’).
> download.file("http://freakonometrics.free.fr/notes.RData",destfile= tempfile())
> load("notes.RData")
> tail(base)
PART GENRE ORIGINE NOTE
112 volontaire F R1 16.50
113 non_vol. M R1 11.50
114 non_vol. F R1 10.25
115 non_vol. F R1 10.75
116 non_vol. F autre 10.50
117 volontaire M R1 15.75
Avant de commencer avec une analyse à plusieurs facteurs, commençons par une analyse à un facteur. On peut regarder l’évolution des notes, en fonction de la variable de traitement (la participation en TD)
> boxplot(base$NOTE~base$PART,ylim=c(6,20))
> abline(h=mean(base$NOTE),lty=2,col="red")
> lines(1:3,with(base,aggregate(NOTE,by=list(PART), mean)$x),pch=19,lwd=3,type="b")
On peut aussi regarder la note, en fonction du genre
> boxplot(base$NOTE~base$GENRE,ylim=c(6,20))
> abline(h=mean(base$NOTE),lty=2,col="red")
> lines(1:2,with(base,aggregate(NOTE, by=list(GENRE),mean)$x),)
ou en fonction de l’origine des étudiants
> boxplot(base$NOTE~base$ORIGINE,ylim=c(6,20))
> abline(h=mean(base$NOTE),lty=2,col="red")
> lines(1:2,with(base,aggregate(NOTE, by=list(ORIGINE),mean)$x))
Continue reading Analyse de la variance, et participation en TD
Réunion A.N.R. à Montpellier sur les mesures d’inégalité
Jeudi et vendredi, nous organisons à Montpellier notre première réunion ANR sur le thème Ordinal and Multidimensional Inequalities. Tout le monde semble être présent, ça va être sympa ! je vais apprendre plein de choses !
Tests non-paramétriques et simulations
Lors du dernier cours de statistique, nous avons présenter les tests d’ajustment de lois. Nous avions illustré ces tests à partir de la taille d’individus (déjà utilisé pour présenter l’ajustement de lois, et l’estimation de densité), correspondant à .
> Davis=read.table(
+ "http://socserv.socsci.mcmaster.ca/jfox/Books/Applied-Regression-2E/datasets/Davis.txt")
> Davis[12,c(2,3)]=Davis[12,c(3,2)]
> X=Davis$height
> n=length(X)
On notera la statistique d’ordre, au sens où
Parmi les outils graphiques, nous avons vu le PP plot (graphique probabilité-probabilité) et le QQ plot (graphique quantile). Le code pour créer un PP plot peut être le suivant
> PP=function(Y,F=pnorm){
+ n=length(Y)
+ x=F(sort(Y))
+ y=seq(1/n/2,1-1/n/2,by=1/n)
+ return(data.frame(x=x,y=y))
+ }
qui représente (à un détail près) le nuage de points
et celui pour le QQ plot serait
> QQ=function(Y,Q=qnorm){
+ n=length(Y)
+ x=Q(seq(1/n/2,1-1/n/2,by=1/n))
+ y=sort(Y)
+ return(data.frame(x=x,y=y))
+ }
qui représente (toujours à un détail près) le nuage de points
où est la loi que l’on cherche à tester, au sens où on a avec comme hypothèse alternative .