Big data, statistics and computer science

Today, software and hardware together provide far more powerful factories than most statisticians realize, factories that many of today’s most able young people find exciting and worth learning about on their own. Their interest can help us greatly, if statistics starts to make much more nearly adequate use of the computer. However, if we fail to expand our uses, their interest in computers can cost us many of our best recruits, and set us back many years.” John Tukey, The technical tools of statistics, 1965, http://jstor.org/… via http://cm.bell-labs.com/…

http://freakonometrics.hypotheses.org/files/2013/02/102646212-05-04.jpeg

A random walk ? What else ?

Consider the following time series,

What does it look like ? I know, this is a stupid game, but I keep using it in my time series courses. It does look like a random walk, doesn’t it ? If we use Philipps-Perron test, yes, it does,

> PP.test(x)

	Phillips-Perron Unit Root Test

data:  x 
Dickey-Fuller = -2.2421, Truncation lag parameter = 6, p-value = 0.4758

If we look at the autocorrelation function, we do observe some persistence,

> acf(x,100)

Perhaps this persistence can be related to long range dependence, or to some fractional random walk. A natural idea could be estimate Hurst parameter, using for instance Beran (1992) estimator – based on Whittle (1956) – where we assume that the autocorrelation function satisfies

as  for some  (the so called Hurst index). But here, we start to observe unexpected ouputs,

> library(longmemo)
> (d  <- WhittleEst(x))
'WhittleEst' Whittle estimator for  fractional Gaussian noise ('fGn');	 call:
WhittleEst(x = x)
	  time series of length  n = 759.

H = 0.9899335
coefficients 'eta' =
    Estimate Std. Error z value   Pr(>|z|)
H 0.98993350 0.02468323 40.1055 < 2.22e-16
 <==> d := H - 1/2 = 0.49 (0.025)

 $ vcov       : num [1, 1] 0.000609
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr "H"
  .. ..$ : chr "H"
 $ periodogr.x: num [1:379] 1479.3 1077.3 371.7 287.2 51.2 ...
 $ spec       : num [1:379] 62.5 31.7 21.3 16.1 12.9 ...

or more precisely some non-expected values for Hurst parameter, which should be in 

> confint(d)
      2.5 %   97.5 %
H 0.9415553 1.038312

Oops, perhaps, we did miss something, because it looks like there is extremely strong persistence on our time series,

> plot(d)

It is probablty time to ask where I found that series… To be honest, I did borrow  it from a great canadian website http://climate.weatheroffice.gc.ca/climateData/. For instance, it you want the temperature we did experience a few days ago, you can use

> Y=2013
> M=1
> D=25
> url=paste(
"http://climate.weatheroffice.gc.ca/climateData/hourlydata_e.html?
timeframe=1&Prov=QC&StationID=5415&hlyRange=1953-01-01|2013-02-
01&Year=",Y,"&Month=",M,"&Day=",D,sep="")
> page=scan(url,what="character")

Yes, that series is the temperature we did experience in Montréal last month (hourly time seies). On the graph below, you can actually compare it with temperature experienced in Januarys over the past 60 years,

So it is not that surprising to see long range dependence models appearing (I did write a paper on that topic precisely a few years ago). What I found puzzeling is that persistence is large, extremely large. And the problem is that I do not see how we can explain ‘jumps’ that we do observe on that series. For instance the behavior of the series while I was in Europe, before January 20th: within 3 days, the temperature went down, from 0°C to -20°C, and up from -20°C to 0°C, and then down again, from 0°C to -20°C (a nice И if we use cyrillic letters). Or how can we explain the oscillating behavior observed the week after, where the temperature went up, from -25°C to (almost) +10°C in a few days. Within 10 days, we did observe also two ‘jumps’ (or ‘crashes‘ if we want to use the terminology of financial time series) with a decrease of 25 degrees in less than 24 hours ! Obviously, we need to find other classes of model to replicate that kind of behavior we observe on temperatures…

Enseigner, et bloguer

Petite introspection aujourd’hui, à la demande de Robin (et en français, car je pense que j’aurais déjà du mal dans une langue que je maitrise). Je n’ai jamais été très doué pour ce genre d’exercice, et je ne pense avoir aucune légitimité en la matière, mais si Robin me demande, je ne vois pas pourquoi refuser. La question était (je me permets de citer) “je me demandais si tu avais écris un billet “meta” sur ton utilisation du blog pour l’enseignement. Si non, ce serait très intéressant que tu en écrives un quand tu auras le temps” (Robin évoque ce point pour introduire son dernier billet, sur  http://robinryder.wordpress.com). Comme je n’ai publié aucun billet répondant à la question, je me lance.

Tout d’abord, mon blog n’est pas un blog de chercheur (comme peuvent l’être celui de Xi’an http://xianblog.wordpress.com/ ou de Djalil, http://djalil.chafai.net/blog/) pas un blog de point de vue sur l’enseignement supérieur et la recherche (comme celui de David http://david.monniaux.free.fr/, ou de Tom Roud http://tomroud.cafe-sciences.org/), pas un blog d’enseignement (euh, je ne sais pas s’il y en a, pour être sincère, ou alors je mettrais le blog improbable de Terry Tao, http://terrytao.wordpress.com/ mais ce qui est de l’enseignement pour lui ressemble à de la recherche pointue et novatrice….), ce n’est rien de tout ça. Ou c’est tout ça à la fois (et je crois que j’en tire une certaine fierté). Mais le fait est que ce blog (ou sa version primitive, https://blogperso.univ-rennes1.fr/arthur.charpentier/) est né via l’enseignement. Peut-être devrais-je revenir un peu en arrière, avant de faire un bilan après… bientôt cinq ans en tant que “blogger académique“.

  • la vie d’enseignant avant le blog

Oui, fut un temps ou j’enseignais sans tenir de blog en parallèle. Enfin, presque. Mon premier cours a été mon cours séries temporelles, théorie et applications aux masters Actuariat et Mathématiques de la Décision, en janvier 2002, à Dauphine.  Je m’en souviens, tout d’abord  car tous les profs se souviennent – je pense – de leur premier cours. Aussi parce qu’à l’époque je travaillais dans le privé comme on dit, et enseigner a été une révélation. Enfin, parce que ce cours aura été (je pense) à l’image de tous mes autres cours: j’étais enthousiaste, je préparais mes cours au dernier moment (en l’occurence, on m’a demandé avant les vacances de Noel si je pouvais assurer un cours de cinquième année au pied levé, au retour des vacances), et je me suis rendu compte que je ne pourrais jamais tout raconter dans un cours, et que je serais toujours affreusement brouillon.

A l’époque, je tapais des documents que je remettais toutes les semaines, qui ont pris la forme de notes de cours quelques années plus tard (qui sont d’ailleurs toujours en ligne sur le site http://193.51.89.161/st/, et que des générations d’étudiants auront cité, à mon grand étonnement). Et sur ma “page internet“, je mettais des liens pour aller plus loin, des liens vers des bases de données, etc. C’était le début d’internet, et on pouvait faire ce qu’on voulait. Je crois qu’à une époque, j’avais même mis une version pirate d’EViews sur la page, pour que les élèves l’installent sur leur PC. Bref, dès mon premier cours, je me souviens avoir pensé que le cours ne s’arrêterait pas aux trois heures de cours magistral, mais il me manquait un support informatique digne de nom.

Je me souviens aussi, pour mon cours de Chaines de Markov, avoir mis sur ma page perso (hébergé alors sur http://crest.fr/) des vidéos que j’utilisais dans mon cours pour montrer la convergence vers la loi limite. Là aussi, je m’étais dit que le polycopié de cours en pdf était un peu dépassé, qu’il manquait les animations que l’on pouvait mettre en ligne pour accompagner un cours (d’un point de vue technique, je suis constamment surpris d’ailleurs qu’on ne puisse insérer un gif animé dans un fichier pdf).

  • la vie d’enseignant qui découvre le blog

En 2008, j’ai rejoint Rennes 1, et le service informatique à l’époque poussait à créer des blogs, plus vivants que des pages persos. Sans être convaincu, je me suis lancé dans l’expérience. Si je n’y voyais aucun intérêt pour la recherche, je me souviens m’être dit que ce support pourrait justement me permettre d’éviter les pages statiques et brouillonnes que je pouvais avoir (je renvoie à la page de mon cours de séries temporelles, qui est encore en ligne sur cf http://193.51.89.161/st/).

Ma première motivation était de pouvoir mettre en ligne, après chaque cours, transparents, codes, bases de données, liens vers des ressources supplémentaires (en particulier je pouvais insister sur les aspects computationnels, que je ne peux aborder en cours, faute de temps, et souvent parce que ce n;est pas l’objet du cours). Bref, avoir sous le coude une espèce de carnet de route du cours. Et c’est comme ça que je voyais le blog, comme un carnet d’enseignant. En plus, j’ai longtemps eu tendance à improviser les cours en classe, au grès du vent, en navigant du tableau blanc à R, constamment ouvert pour illustrer tel ou tel point (je dois avouer que c’est à Bernard Ycart que j’ai emprunté le style, sans jamais réussir à l’égaler).

Ensuite, je me suis rendu compte que cela permettait d’éviter un problème qui m’agaçait depuis mon premier cours: beaucoup d’élèves n’osent pas prendre la parole en cours (ce que je comprends parfaitement, l’idée n’est aucunement de leur jeter la pierre), et un certain nombre venaient me voir à la pause, ou après le cours, pour me poser des questions. Pour les questions à la pause (je continue à fonctionner de cette manière), je les retiens, et je réponds collectivement lorsque le cours reprend, en partant du principe que si un élève ose poser une question, c’est que cinq se la posent aussi sans oser venir me voir. Donc la réponse intéresse tout le monde. Par contre, pour les questions de fin de cours, je trouvais que le blog permettait de répondre à ces questions, qui parfois étaient connexes à la matière vue en cours (je fais assez de digressions dans mon cours, inutile de rajouter de l’huile sur le feu).

Bref, le blog a permis de mettre en place une espèce de forum: quand je postais un billet, les élèves poursuivaient via les commentaires, ou par courriel pour les moins courageux, et le blog est devenu une espèce de forum. Avec le recul, je pense que cela tenait de l’incroyable dynamisme des étudiants que j’ai eu au master statistique et économétrie de Rennes, qui m’ont permis d’avoir un blog à la fois académique, mais un peu décalé, qui n’essayait pas de se prendre au sérieux. Je pense que si je suis devenu accro à mon blog, c’est à cause de cette promotion d’étudiants, qui arrivaient au début du master, en même temps que je prenais possession de mon poste à Rennes.

Avec un peu de recul, je pense qu’il fallait une sacré dose de naïveté pour penser que seuls les étudiants (et les copains) passeraient voir le blog. Car il y a une grande différence entre un forum lié à un cours et un blog ouvert sur le monde. Oui, il faut etre soit mégalo pour tenir un blog, soit oublier que le blog sera lu par plus de 60 utilisateurs (ce que j’appelais de la naïveté). Je me souviens que ça a été un choc de me rendre compte que le nombre de visiteurs n’était pas les 60 étudiants inscrits à mes cours, mais quelques centaines de millers de personnes, après quelques mois d’utilisation, que je ne connaissais pas.

Pour ceux qui veulent savoir dans quelle catégorie je suis, entre le mégalo et le naïf (car j’ai perdu ma naïveté) j’en rajouterais une troisième: il suffit d’être un vieil ours des cavernes, qui se contente de tenir un carnet de route de ses cours, tout en le mettant en accès ouvert, en espérant que ca aide quelqu’un, un jour.

  • un petit bilan avec plus de recul

Qu’en est-il avec cinq ans de recul ? J’avoue que je ne sais pas… Je ne sais pas si le blog est devenu trop sérieux, trop institutionnel (j’évite pourtant de le mettre dans les classements pour éviter de lui faire prendre plus d’importance qu’il ne mérite d’en avoir). J’ai aussi changé de type d’étudiants: en France, je n’ai jamais fait de cours en licence par exemple alors que je fais essentiellement des cours undergraduate à Montréal (mais c’est très lié aux différences fondamentales entre l’actuariat en Amérique du Nord et en Europe, il faudrait un billet entier sur le sujet). Mais force est de constater que ce n’est plus pareil…

L’enthousiasme que j’avais ressenti à Rennes a disparu. A la fin de la session d’automne, des élèves m’ont reproché de bloguer, et de ne pas utiliser moodle (“comme tous les profs“) et j’avoue ne pas avoir compris ce que cela signifiait.

Le dernier élève a avoir posté des commentaires sur le blog, je vais finir par lui proposer de l’encadrer pour son stage de maitrise… A croire que les étudiants sont intimidés par le blog. Cela dit, là encore je ne jetterais la pierre à personne car j’évite autant que possible de poster des commentaires sur les blogs des autres, essentiellement car je n’ai pas la main dessus. Je veux pouvoir effacer mes messages si j’en ai envie. Mais je suis surpris que les seules personnes qui me contactent par email (et ils sont nombreux) ne soient pas mes élèves…

Mais je m’égare. En fait, je tenais à dire qu’avec la migration de mon blog, je me pose beaucoup de questions sur le blog (surtout que Martin a transféré les messages en les mettant tous en pending: je dois rouvrir les billets pour demander à les remettre en ligne). A plusieurs reprises, je me suis demandé si je devais remettre en ligne des vieux billets de cours: le cours est fini, le billet n’intéresse (peut-être) plus personne. Je dois avouer que j’ai remis en ligne plusieurs vieux billets, pour une raison très simple: j’ai beau vieillir, les étudiants, eux, ne vieillissent pas, et me posent les mêmes questions que les étudiants qui avaient suivi le cours une ou deux sessions auparavant. Pour le cours que je donne cette session, il y a les billets que je mets en ligne, régulièrement, mais en plus, j’ai décidé, de rajouter avec le même code les billets passés. En fait – pour faire une petite remarque technique – je classais avant mes billets par un code cours-année. Je me rends compte que l’année ne sert à rien. Mieux vaut avoir une accumulation de billet pour un même cours.

Cela dit, ça semble perturber les étudiants. Là encore, je les comprends: comment s’y retrouver quand un prof demande de fouiller – mon fameux “va voir sur le blog, j’ai fait un billet sur le sujet au printemps 2009” – dans un blog avec plus de 1000 billets ? Ça peut intimider. Peut-être autant que la première fois que j’ai mis les pieds à la bibliothèque de maths de Jussieu (à l’époque) à Paris: on ne sais pas comment s’y retrouver. Ça prend du temps, et à la longue, on finit par s’y sentir comme chez soi, et par s’y retrouver. Et je pense que c’est pareil avec le blog. Il faut comprendre comment naviguer, entre les tags, les catégories, les pages.

Je me rends compte que mon billet a été plus long que prévu. Et que je ne crois pas avoir réussi à conclure. Je ne sais pas si bloguer sert à mes étudiants (si je ne blogue pas pour mes élèves, les courriels que je reçois me laissent croire que je blogue pour d’autres). Ce qui est clair, c’est que personnellement, bloguer me sert à préparer un cours, ça me permet de mieux m’organiser (c’est d’ailleurs un point que notait Simon dans son billet sur le sujet http://blogs.lse.ac.uk/impactofsocialsciences/…), de me laisser de la place pour ce que je n’ai pas le temps de faire au tableau (car oui, auparavant, je voulais tout dire au tableau, quitte à saturer les élèves). Mon blog, c’est la version électronique de mes cahiers, où je note tout. Je me souviens de tout ce que j’ai pu taper depuis 5 ans (je me souviens avoir été impressionné qu’Andrew Gelman se souvienne de billets écrits plusieurs mois auparavant sur son blog http://andrewgelman.com/, mais je dois avouer, avec le recul, qu’effectivement, on s’en souvient), et je sais que je peux y retrouver des choses, quand j’en ai besoin, pour un cours, par exemple. Maintenant, c’est vrai que c’est bordélique. Mais ceux qui trouvent mon blog mal rangé devraient un jour entrer dans mon bureau, ils changeraient d’avis !

Fréquence de sinistres, et surdispersion

Je continue à mettre en ligne les transparents qui serviront de support pour le cours ACT2040. Dans cette dernière partie sur la modélisation de la fréquence de sinistre, on parlera de surdispersion. Les transparents sont en ligne ici,

Sinon, parmi les références complémentaires, je peux suggérer plusieurs documents rédigés par des praticiens, comme Meyers (2009) http://casact.org/education/…, Isamail & Jemain (2009) http://casact.org/pubs/… ou encore le document très intéressant (et critique) de Schmid (2011) http://casact.org/education/…. Les plus motivés pourront aussi survoler les section 2.3 et 2.4. du livre Denuit et al. (2007), en ligne sur http://books.google.ca/…

Overdispersion with different exposures

In actuarial science, and insurance ratemaking, taking into account the exposure can be a nightmare (in datasets, some clients have been here for a few years – we call that exposure – while others have been here for a few months, or weeks). Somehow, simple results because more complicated to compute just because we have to take into account the fact that exposure is an heterogeneous variable.

The exposure in insurance ratemaking can be seen as a problem of censored data (in my dataset, the exposure is always smaller than 1 since observations are contracts, not policyholders),

  • the number of claims https://latex.codecogs.com/gif.latex?N_i on the period https://latex.codecogs.com/gif.latex?[0,1] is unobserved
  • the number of claims https://latex.codecogs.com/gif.latex?Y_i on https://latex.codecogs.com/gif.latex?[0,E_i] is observed (as well as https://latex.codecogs.com/gif.latex?E_i)

And as always, the variable of interest is the unobserved one, because we have to price insurance contract with a cover period of one (full) year. So we have to model the yearly frequency of insurance claims.

http://freakonometrics.hypotheses.org/files/2013/02/Capture-d%E2%80%99e%CC%81cran-2013-02-01-a%CC%80-09.30.00.png

In our dataset, we have https://latex.codecogs.com/gif.latex?(Y_i,E_i)‘s – or more generally also some additional covariates https://latex.codecogs.com/gif.latex?(Y_i,E_i,\boldsymbol{X}_i)‘s. For ratemaking, we need to estimate https://latex.codecogs.com/gif.latex?\mathbb{E}(N\vert\boldsymbol{X}=\boldsymbol{x}) and perhaps also https://latex.codecogs.com/gif.latex?\text{Var}(N|\boldsymbol{X}=\boldsymbol{x}) (for instance to test if the Poisson assumption is valid, or not). To estimate the expected value, a natural estimate for https://latex.codecogs.com/gif.latex?\mathbb{E}(N) (forget about covariates as a start) is
https://latex.codecogs.com/gif.latex?m_N=\frac{\sum_{i=1}^n%20Y_i}{\sum_{i=1}^n%20E_i}
which is also the weight average of annualized individual counts
https://latex.codecogs.com/gif.latex?m_N=\sum_{i=1}^n%20\frac{%20E_i}{\sum_{i=1}^n%20E_i}%20\cdot%20\frac{Y_i}{E_i}
We consider the ratio of the total number of claims to the total exposure-to-
risk. This estimate appears for instance if we consider a Poisson process, so that https://latex.codecogs.com/gif.latex?N\sim\mathcal{P}(\lambda) while https://latex.codecogs.com/gif.latex?Y\sim\mathcal{P}(\lambda%20\cdot%20E). Then, the likelihood is

https://latex.codecogs.com/gif.latex?\mathcal{L}(\lambda,\boldsymbol{Y},\boldsymbol{E})=\prod_{i=1}^n%20\frac{e^{-\lambda%20E_i}%20[\lambda%20E_i]^{Y_i}}{Y_i!}

i.e.

https://latex.codecogs.com/gif.latex?\log%20\mathcal{L}(\lambda,\boldsymbol{Y},\boldsymbol{E})%20=%20-\lambda%20\sum_{i=1}^n%20E_i%20+\sum_{i=1}^n%20Y_i%20\log[\lambda%20E_i]%20-%20\log\left(\prod_{i=1}^n%20Y_i!\right)

The first order condition is here

https://latex.codecogs.com/gif.latex?\frac{\partial}{\partial%20\lambda}\log%20\mathcal{L}(\lambda,\boldsymbol{Y},\boldsymbol{E})%20=%20%20-%20\sum_{i=1}^n%20E_i%20+\frac{1}{\lambda}\sum_{i=1}^n%20Y_i%20=0

which is satisfied if

https://latex.codecogs.com/gif.latex?\widehat{\lambda}=\frac{\sum_{i=1}^n%20Y_i}{\sum_{i=1}^n%20E_i}

So, we do have an estimator for the expected value, and a natural estimator for https://latex.codecogs.com/gif.latex?\mathbb{E}(N\vert\boldsymbol{X}=\boldsymbol{x}) is then (if we consider categorical covariates)
https://latex.codecogs.com/gif.latex?m_{N|\boldsymbol{x}}%20=\frac{\sum_{i,\boldsymbol{X}_i=\boldsymbol{x}}%20Y_i}{\sum_%20{i,\boldsymbol{X}_i=\boldsymbol{x}}%20E_i}

Now, we need an estimate for the variance, or more precisely the conditional variable. Assume (as a starting point) that all have the same exposure https://latex.codecogs.com/gif.latex?E. For instance, if https://latex.codecogs.com/gif.latex?E is one half, insured were observed only the first six months. Then https://latex.codecogs.com/gif.latex?N=Y+Y%27 with https://latex.codecogs.com/gif.latex?Y\overset{\mathcal%20L}{=}Y%27 (https://latex.codecogs.com/gif.latex?Y is the number of claims on the first six months, while https://latex.codecogs.com/gif.latex?Y%27 are the number of claims on the last six months), i.e. https://latex.codecogs.com/gif.latex?\text{Var}(N)=\text{Var}(Y)+%20\text{Var}(Y%27) if we assume independent increments. I.e.
https://latex.codecogs.com/gif.latex?\text{Var}(N)=2\text{Var}(Y), or conversely https://latex.codecogs.com/gif.latex?E%20\cdot\text{Var}(N)=\text{Var}(Y). More generally, it is reasonable to assume that

https://latex.codecogs.com/gif.latex?\text{Var}(Y)=E\cdot%20\text{Var}(N)
for all values of https://latex.codecogs.com/gif.latex?E. And then
https://latex.codecogs.com/gif.latex?\text{Var}\left(\frac{Y}{E}\right)=\frac{1}{E}\cdot%20\text{Var}(N)
Thus, it seems legitimate to assume that the empirical variance of https://latex.codecogs.com/gif.latex?N can be written
https://latex.codecogs.com/gif.latex?S_N^2=E\cdot%20S_{Y/E}^2
Since the average of https://latex.codecogs.com/gif.latex?Y_i/E is https://latex.codecogs.com/gif.latex?\overline{N}=m_N, then
https://latex.codecogs.com/gif.latex?S_N^2=E\cdot%20\frac{1}{n}\sum_{i=1}^n%20\left[\frac{Y_i}{E}-\overline{N}\right]^2}%20=%20\frac{1}{n}\sum_{i=1}^n%20E\left[\frac{Y_i}{E}-\overline{N}\right]^2}
or equivalently
https://latex.codecogs.com/gif.latex?S_N^2=\frac{1}{n}\sum_{i=1}^n%20\frac{E}{E^2}\left[Y_i-\overline{N}\cdot%20E\right]^2}%20=\frac{1}{n}\sum_{i=1}^n%20\frac{1}{E}[Y_i-\overline{N}\cdot%20E]^2i.e.
https://latex.codecogs.com/gif.latex?S_N^2=\frac{\sum_{i=1}^n%20[Y_i-\overline{N}\cdot%20E]^2%20}{nE}
Thus, with different https://latex.codecogs.com/gif.latex?E_i‘s, it would be legitimate (I guess) to consider
https://latex.codecogs.com/gif.latex?S_N^2=\frac{\sum_{i=1}^n%20[Y_i-\overline{N}\cdot%20E_i]^2%20}{\sum_{i=1}^n%20E_i}
Thus, an estimator for https://latex.codecogs.com/gif.latex?\text{Var}(N|\boldsymbol{X}=\boldsymbol{x}) is
https://latex.codecogs.com/gif.latex?S_{N|\boldsymbol{x}}^2=\frac{\sum_{i,\boldsymbol{X}_i=\boldsymbol{x}}%20[Y_i-\overline{N}\cdot%20E_i]^2}{\sum_{i,\boldsymbol{X}_i=\boldsymbol{x}%20}%20E_i}

This can be used to test is the Poisson assumption is valid to model frequency. Consider the following dataset,

>  sinistre=read.table("http://freakonometrics.free.fr/sinistreACT2040.txt",
+  header=TRUE,sep=";")
>  sinistres=sinistre[sinistre$garantie=="1RC",]
>  sinistres=sinistres[sinistres$cout>0,]
>  contrat=read.table("http://freakonometrics.free.fr/contractACT2040.txt",
+  header=TRUE,sep=";")
>  T=table(sinistres$nocontrat)
>  T1=as.numeric(names(T))
>  T2=as.numeric(T)
>  nombre1 = data.frame(nocontrat=T1,nbre=T2)
>  I = contrat$nocontrat%in%T1
>  T1= contrat$nocontrat[I==FALSE]
>  nombre2 = data.frame(nocontrat=T1,nbre=0)
>  nombre=rbind(nombre1,nombre2)
>  baseFREQ = merge(contrat,nombre)

Here, we do have our two variables of interest, the exposure, per contract,

>  E <- baseFREQ$exposition

and the (observed) number of claims (during that time frame)

>  Y <- baseFREQ$nbre

It is possible to compute without covariates, the average (yearly) number of claims, per contract, and the associated variance

> (mean=weighted.mean(Y/E,E))
[1] 0.07279295
> (variance=sum((Y-mean*E)^2)/sum(E)) 
[1] 0.08778567

It looks like the variance is (slightly) larger than the average (we’ll see in a few weeks how to test it, more formally). It is possible to add covariates, for instance the density of population, in the area where the policyholder lives,

>  X=as.factor(baseFREQ$densite)
>  for(i in 1:length(levels(X))){
+ 	   Ei=E[X==levels(X)[i]]
+ 	   Yi=Y[X==levels(X)[i]]
+  (meani=weighted.mean(Yi/Ei,Ei))    # moyenne 
+  (variancei=sum((Yi-meani*Ei)^2)/sum(Ei))    # variance
+ cat("Density, zone",levels(X)[i],"average =",meani," variance =",variancei,"\n")
+ }
Density, zone 11 average = 0.07962411  variance = 0.08711477 
Density, zone 21 average = 0.05294927  variance = 0.07378567 
Density, zone 22 average = 0.09330982  variance = 0.09582698 
Density, zone 23 average = 0.06918033  variance = 0.07641805 
Density, zone 24 average = 0.06004009  variance = 0.06293811 
Density, zone 25 average = 0.06577788  variance = 0.06726093 
Density, zone 26 average = 0.0688496   variance = 0.07126078 
Density, zone 31 average = 0.07725273  variance = 0.09067 
Density, zone 41 average = 0.03649222  variance = 0.03914317 
Density, zone 42 average = 0.08333333  variance = 0.1004027 
Density, zone 43 average = 0.07304602  variance = 0.07209618 
Density, zone 52 average = 0.06893741  variance = 0.07178091 
Density, zone 53 average = 0.07725661  variance = 0.07811935 
Density, zone 54 average = 0.07816105  variance = 0.08947993 
Density, zone 72 average = 0.08579731  variance = 0.09693305 
Density, zone 73 average = 0.04943033  variance = 0.04835521 
Density, zone 74 average = 0.1188611   variance = 0.1221675 
Density, zone 82 average = 0.09345635  variance = 0.09917425 
Density, zone 83 average = 0.04299708  variance = 0.05259835 
Density, zone 91 average = 0.07468126  variance = 0.3045718 
Density, zone 93 average = 0.08197912  variance = 0.09350102 
Density, zone 94 average = 0.03140971  variance = 0.04672329

Perhaps graphs would be a nice tool to play with, to visualize that information

> plot(meani,variancei,cex=sqrt(Ei),col="grey",pch=19,
+ xlab="Empirical average",ylab="Empirical variance")
> points(meani,variancei,cex=sqrt(Ei))

http://freakonometrics.hypotheses.org/files/2013/02/Capture-d%E2%80%99e%CC%81cran-2013-02-01-a%CC%80-10.51.26.png

The size of the circles is related to the size of the group (the area is proportional to the total exposure within the group). The first diagonal corresponds to the Poisson model, i.e. the variance should be equal to the mean. It is also possible to consider other covariates, like the gas type

http://freakonometrics.hypotheses.org/files/2013/02/Capture-d%E2%80%99e%CC%81cran-2013-02-01-a%CC%80-10.52.02.png

or the car brand,

http://freakonometrics.hypotheses.org/files/2013/02/Capture-d%E2%80%99e%CC%81cran-2013-02-01-a%CC%80-10.50.49.png

It is also possible to consider the age of the driver as a categorical variate

http://freakonometrics.hypotheses.org/files/2013/02/Capture-d%E2%80%99e%CC%81cran-2013-02-01-a%CC%80-10.51.40.png

Actually, the age is interesting: we can observe on that dataset a feature that Jean-Philippe Boucher observed also on his own datasets. Let us look more carefully where are the different ages,

http://freakonometrics.hypotheses.org/files/2013/02/Capture-d%E2%80%99e%CC%81cran-2013-02-01-a%CC%80-10.55.17.png

On the right, we can observe young (unexperienced) drivers. That was expected. But some classes are below the first diagonal: the expected frequency is large, but not the variance. I.e. we know for sure that young drivers have more car accidents. It is not an heterogeneous class, on the contrary: young drivers can be seen as a relatively homogeneous class, with a high frequency of car accidents.

With the original dataset (here, I use only a subset with 50,000 clients), we do obtain the following graph:

http://freakonometrics.hypotheses.org/files/2013/02/Capture-d%E2%80%99e%CC%81cran-2013-02-01-a%CC%80-11.27.04.png

If we do not observe underdispersion for young drivers, observe that those are incredibly homogeneous classes. With a clear impact of experience, since circles are moving downward from age 18 to 25.

Another disturbing story (this was – one more time – suggestion from Jean-Philippe) that it might be possible to consider the exposure as a standard variable, and see if the coefficient is actually equal to 1. Without any covariate,

>  reg=glm(Y~log(E),family=poisson("log"))
>  summary(reg)

Call:
glm(formula = Y ~ log(E), family = poisson("log"))

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.3988  -0.3388  -0.2786  -0.1981  12.9036  

Coefficients:
            Estimate Std. Error z value Pr(>|z|)    
(Intercept) -2.83045    0.02822 -100.31   <2e-16 ***
log(E)       0.53950    0.02905   18.57   <2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 

(Dispersion parameter for poisson family taken to be 1)

    Null deviance: 12931  on 49999  degrees of freedom
Residual deviance: 12475  on 49998  degrees of freedom
AIC: 16150

Number of Fisher Scoring iterations: 6

i.e. the parameter is clearly strictly smaller than 1. And it is neither related to significance,

> library(car)
> linearHypothesis(reg,"log(E)",1)
Linear hypothesis test

Hypothesis:
log(E) = 1

Model 1: restricted model
Model 2: Y ~ log(E)

  Res.Df Df  Chisq Pr(>Chisq)    
1  49999                         
2  49998  1 251.19  < 2.2e-16 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

nor to the fact that I did not take into account covariates,

> reg=glm(nbre~log(exposition)+carburant+as.factor(ageconducteur)+as.factor(densite),family=poisson("log"),data=baseFREQ)
>  summary(reg)

Call:
glm(formula = nbre ~ log(exposition) + carburant + as.factor(ageconducteur) + 
    as.factor(densite), family = poisson("log"), data = baseFREQ)

Deviance Residuals: 
    Min       1Q   Median       3Q      Max  
-0.7114  -0.3200  -0.2637  -0.1896  12.7104  

Coefficients:
                              Estimate Std. Error z value Pr(>|z|)    
(Intercept)                  -14.07321  181.04892  -0.078 0.938042    
log(exposition)                0.56781    0.03029  18.744  < 2e-16 ***
carburantE                    -0.17979    0.04630  -3.883 0.000103 ***
as.factor(ageconducteur)19    12.18354  181.04915   0.067 0.946348    
as.factor(ageconducteur)20    12.48752  181.04902   0.069 0.945011

(etc). So it might be a too strong assumption to assume that the exposure is an exogenous variate here. But that’s another story !