set.seed(12345)

On commence par charger le paquet d’outils.

library(outilscoursglm)

1 Récupération du jeu de données

On commence par charger les données utilisées. Il s’agit d’un jeu de données partiellement simulé à partir de vraies données suédoises d’assurance automobile de 1977, récupérées via le paquet CASdatasets.

load(url("https://irma.math.unistra.fr/~jberard/donnees_swautoins_ext_sim"))

Les données ainsi récupérées se trouvent dans une variable appelée donnees, que l’on examine maintenant très sommairement.

str(donnees)
## 'data.frame':    239444 obs. of  7 variables:
##  $ Kilometres: Factor w/ 5 levels "1","2","3","4",..: 1 2 3 4 5 1 2 3 4 5 ...
##  $ Zone      : Factor w/ 7 levels "1","2","3","4",..: 1 1 1 1 1 2 2 2 2 2 ...
##  $ Bonus     : Factor w/ 7 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ Make      : Factor w/ 7 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ Claims    : int  0 1 3 3 6 1 1 1 2 2 ...
##  $ Insured   : num  6.36 7.37 6.81 6.56 13.53 ...
##  $ Payment   : num  0 5475 21866 15230 31354 ...

Le jeu de données se présente sous la forme d’un tableau (data frame) comportant 239444 lignes et 7 colonnes. Chaque ligne représente une observation (correspondant à une ou plusieurs polices d’assurance), chaque colonne représente une variable. On a donc 239444 observations combinées des 7 variables :

  • Kilometres : distance parcourue par le véhicule, 5 catégories
  • Zone : zone géographique du véhicule, 7 catégories
  • Bonus : niveau de Bonus, 7 catégories
  • Make : type de véhicule, 7 catégories
  • Claims : nombre de sinistres enregistrés sur la période d’observation
  • Insured : exposition (en années-police)
  • Payment : montant total des sinistres enregistrés sur la période d’observation

On note que les variables catégorielles sont codées sous forme de facteurs (Factor) : c’est la manière normale de procéder pour que ces variables soient automatiquement reconnues comme des variables catégorielles par la fonction glmet traitées comme telles. (Il faut bien vérifier ce point avant de se lancer dans l’ajustement d’un modèle, et, le cas échéant, re-coder sous forme de facteurs les variables catégorielles lorsqu’elles ne le sont pas dans le jeu de données initial, afin que celles-ci puissent être traitées correctement ensuite.)

Le jeu de données complet est visible ci-après.

Il conviendrait d’examiner en détail la distribution des différentes variables dans le jeu de données, ce qui sera fait sur d’autres exemples. Ici, on se contente de passer directement à l’ajustement du modèle GLM.

2 Modèle GLM log-Poisson pour la fréquence de sinistres

2.1 Ajustement du modèle sur le jeu de données

On ajuste maintenant sur ce jeu de données un modèle GLM utilisant la loi de Poisson et la fonction de lien logarithmique pour modéliser la fréquence de sinistres. On utilise pour cela la commande glm.

ajustement <- glm(formula = Claims ~ Kilometres + Zone + Bonus + Make + offset(log(Insured)),
                  family = poisson(link = "log"),
                  data = donnees)

La formule Claims ~ Kilometres + Zone + Bonus + Make + offset(log(Insured)) traduit le fait que la variable réponse est Claims (fréquence de sinistres brute, non-normalisée par l’exposition), tandis que les variables explicatives utilisées sont Kilometres, Zone, Bonus et Make, qui sont donc ici toutes des variables catégorielles. L’exposition (Insured) est prise en compte en ajoutant en offset le logarithme de l’exposition, ce qui est légitime dans le cadre d’un modèle log-Poisson ajusté sur les fréquences brutes.

Le type du GLM ajusté est précisé par l’argument family = poisson(link = "log"), qui indique à la fois la famille de lois utilisée (ici, Poisson), et la fonction de lien (ici, le logarithme).

Le jeu de données dans lequel les variables doivent être cherchées est précisé par l’argument data = donnees. Il est fortement recommandé de procéder comme on l’a fait ici, en stockant toutes les variables utilisées pour l’ajustement dans un data frame passé en argument à la fonction glm. Dans le cas contraire (s’il n’y a pas d’argument data, ou si celui-ci ne contient pas la totalité des variables nécessaires), la fonction glm va chercher les variables manquantes dans l’environnement courant, ce qui augmente considérablement le risque de confusion.

Le fait d’avoir stocké le résultat produit par la fonction glm dans la variable ajustement nous permet d’accéder à notre guise au résultat produit par celle-ci. On commence par examiner le résumé produit par la fonction summary.

summary(ajustement)
## 
## Call:
## glm(formula = Claims ~ Kilometres + Zone + Bonus + Make + offset(log(Insured)), 
##     family = poisson(link = "log"), data = donnees)
## 
## Coefficients:
##              Estimate Std. Error  z value Pr(>|z|)    
## (Intercept) -1.815334   0.013746 -132.059  < 2e-16 ***
## Kilometres2  0.207678   0.007540   27.544  < 2e-16 ***
## Kilometres3  0.322884   0.008662   37.277  < 2e-16 ***
## Kilometres4  0.407935   0.012048   33.860  < 2e-16 ***
## Kilometres5  0.588288   0.012761   46.101  < 2e-16 ***
## Zone2       -0.226945   0.009521  -23.836  < 2e-16 ***
## Zone3       -0.378087   0.009702  -38.972  < 2e-16 ***
## Zone4       -0.570242   0.008679  -65.703  < 2e-16 ***
## Zone5       -0.309009   0.014513  -21.292  < 2e-16 ***
## Zone6       -0.523777   0.011928  -43.911  < 2e-16 ***
## Zone7       -0.699400   0.040296  -17.357  < 2e-16 ***
## Bonus2      -0.476948   0.012119  -39.355  < 2e-16 ***
## Bonus3      -0.687923   0.013520  -50.883  < 2e-16 ***
## Bonus4      -0.812998   0.014545  -55.896  < 2e-16 ***
## Bonus5      -0.943819   0.014096  -66.955  < 2e-16 ***
## Bonus6      -0.991315   0.011651  -85.086  < 2e-16 ***
## Bonus7      -1.322764   0.008697 -152.095  < 2e-16 ***
## Make2        0.064292   0.021245    3.026  0.00248 ** 
## Make3       -0.272420   0.025246  -10.791  < 2e-16 ***
## Make4       -0.618084   0.023752  -26.022  < 2e-16 ***
## Make5        0.126230   0.020382    6.193 5.90e-10 ***
## Make6       -0.352307   0.017408  -20.238  < 2e-16 ***
## Make7-9     -0.079971   0.009895   -8.082 6.36e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 251312  on 239443  degrees of freedom
## Residual deviance: 220633  on 239421  degrees of freedom
## AIC: 404488
## 
## Number of Fisher Scoring iterations: 6

Le résumé ainsi produit commence par rappeler l’appel de la fonction glm ayant produit l’ajustement.

Figure ensuite la liste des coefficients estimés lors de l’ajustement. Pour chaque coefficient, on trouve :

  • les valeurs estimées des coefficients \(\beta_j\), c’est-à-dire les \(\hat{\beta}_j^{\mbox{obs.}}\)
  • les valeurs estimées des écarts-types \(\sigma(\hat{\beta}_j)\), c’est-à-dire les \(\hat{\sigma}(\hat{\beta}_j)^{\mbox{obs.}}\)
  • les valeurs \(z_j=\hat{\beta}_j^{\mbox{obs.}}/\hat{\sigma}(\hat{\beta}_j)^{\mbox{obs.}}\)
  • les probabilités \(\mathbb{P}(|Z| \geq |z_j|)\), où \(Z \sim \mathcal{N}(0,1)\), qui constituent les \(p-\)valeurs du test de Wald pour l’hypothèse \(\beta_j=0\), avec un code mettant en valeur la “petitesse” des \(p-\)valeurs ainsi calculées. (Plus la valeur est petite, plus l’hypothèse \(\beta_j=0\) est fortement rejetée.)

Par défaut, l’ajustement inclut un terme constant \(\beta_0\), nommé (Intercept). Ensuite, chaque variable catégorielle donne lieu à un coefficient par catégorie, à l’exception de la catégorie de référence. Par exemple, la variable Make possède 7 catégories, nommées 1,2,3,4,5,6 et 7-9, ce qui donne lieu aux 6 coefficients Make2, Make3, Make4, Make5,Make6 et Make7-9, la catégorie nommée 1 ayant été choisie comme référence, et ne donnant donc pas lieu à un coefficient. (On verra plus tard dans un autre exemple comment contrôler le choix de la modalité de référence.)

Vient ensuite la valeur estimée du paramètre de dispersion \(\phi\) (ici, la valeur est automatiquement fixée à 1, puisque l’on utilise la loi de Poisson).

Sont ensuite indiquées les valeurs calculées de la déviance et de la “déviance nulle” de l’ajustement, puis la valeur de l’AIC (Akaike Information Criterion) de l’ajustement. La définition de ces quantités et l’interprétation possible de leur valeur sont discutées dans la suite du cours.

Enfin, le nombre d’itérations de la méthode du Scoring de Fisher nécessaire pour atteindre une convergence “apparente” (déterminée par un seuil de tolérance sur le gradient) vers le maximum de vraisemblance.

2.2 Variantes pour la prise en compte de l’exposition

Dans l’exemple ci-dessus, le terme d’offset a été intégré directement à la formule passée à la fonction glm. De manière mathématiquement équivalente, on peut passer le terme d’offset en argument de la fonction glm, sans le placer dans la formule, comme illustré ci-dessous.

ajustement_bis <- glm(formula = Claims ~ Kilometres + Zone + Bonus + Make, 
                      offset = log(Insured),
                      family = poisson(link = "log"),
                      data = donnees)
summary(ajustement_bis)
## 
## Call:
## glm(formula = Claims ~ Kilometres + Zone + Bonus + Make, family = poisson(link = "log"), 
##     data = donnees, offset = log(Insured))
## 
## Coefficients:
##              Estimate Std. Error  z value Pr(>|z|)    
## (Intercept) -1.815334   0.013746 -132.059  < 2e-16 ***
## Kilometres2  0.207678   0.007540   27.544  < 2e-16 ***
## Kilometres3  0.322884   0.008662   37.277  < 2e-16 ***
## Kilometres4  0.407935   0.012048   33.860  < 2e-16 ***
## Kilometres5  0.588288   0.012761   46.101  < 2e-16 ***
## Zone2       -0.226945   0.009521  -23.836  < 2e-16 ***
## Zone3       -0.378087   0.009702  -38.972  < 2e-16 ***
## Zone4       -0.570242   0.008679  -65.703  < 2e-16 ***
## Zone5       -0.309009   0.014513  -21.292  < 2e-16 ***
## Zone6       -0.523777   0.011928  -43.911  < 2e-16 ***
## Zone7       -0.699400   0.040296  -17.357  < 2e-16 ***
## Bonus2      -0.476948   0.012119  -39.355  < 2e-16 ***
## Bonus3      -0.687923   0.013520  -50.883  < 2e-16 ***
## Bonus4      -0.812998   0.014545  -55.896  < 2e-16 ***
## Bonus5      -0.943819   0.014096  -66.955  < 2e-16 ***
## Bonus6      -0.991315   0.011651  -85.086  < 2e-16 ***
## Bonus7      -1.322764   0.008697 -152.095  < 2e-16 ***
## Make2        0.064292   0.021245    3.026  0.00248 ** 
## Make3       -0.272420   0.025246  -10.791  < 2e-16 ***
## Make4       -0.618084   0.023752  -26.022  < 2e-16 ***
## Make5        0.126230   0.020382    6.193 5.90e-10 ***
## Make6       -0.352307   0.017408  -20.238  < 2e-16 ***
## Make7-9     -0.079971   0.009895   -8.082 6.36e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 251312  on 239443  degrees of freedom
## Residual deviance: 220633  on 239421  degrees of freedom
## AIC: 404488
## 
## Number of Fisher Scoring iterations: 6

On illustre maintenant l’option consistant à prendre en compte l’exposition en utilisant les valeurs normalisées de la réponse et des poids dand l’ajustement. On obtient un modèle équivalent au précédent, mais dont la formulation est légèrement différente.

On commence par ajouter à nos données une nouvelle variable Claims_n égale au nombre de sinistres divisé par l’exposition (en années-police), qui constitue donc la réponse normalisée par l’exposition.

donnees[["Claims_n"]] <- donnees[["Claims"]] / donnees[["Insured"]]
str(donnees)
## 'data.frame':    239444 obs. of  8 variables:
##  $ Kilometres: Factor w/ 5 levels "1","2","3","4",..: 1 2 3 4 5 1 2 3 4 5 ...
##  $ Zone      : Factor w/ 7 levels "1","2","3","4",..: 1 1 1 1 1 2 2 2 2 2 ...
##  $ Bonus     : Factor w/ 7 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ Make      : Factor w/ 7 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ Claims    : int  0 1 3 3 6 1 1 1 2 2 ...
##  $ Insured   : num  6.36 7.37 6.81 6.56 13.53 ...
##  $ Payment   : num  0 5475 21866 15230 31354 ...
##  $ Claims_n  : num  0 0.136 0.441 0.457 0.443 ...

On effectue ensuite l’ajustement en utilisant la réponse normalisée au lieu de la réponse brute (donc Claims_n au lieu de Claims dans la formule), et des poids égaux aux expositions, avec weights = Insured, conformément à la méthode généralement utilisée pour tenir compte d’expositions variables dans un GLM. (Dans le cas log-Poisson, il est néanmoins plus habituel d’utiliser les réponses brutes avec le logarithme de l’exposition en offset.)

ajustement_ter <- glm(formula = Claims_n ~ Kilometres + Zone + Bonus + Make, 
                      weights = Insured, 
                      family = poisson(link = "log"),
                      data = donnees)

Cet ajustement produit des avertissements liés au fait que, pour un GLM basé sur la loi de Poisson, le logiciel s’attend à des réponses brutes et non pas normalisées, avec donc des valeurs entières pour la variable réponse, ce qui n’est pas le cas ici. On constate néanmoins que les valeurs estimées des coefficients sont exactement les mêmes que celles obtenues en traitant l’exposition à l’aide d’un terme d’offset.

summary(ajustement_ter)
## 
## Call:
## glm(formula = Claims_n ~ Kilometres + Zone + Bonus + Make, family = poisson(link = "log"), 
##     data = donnees, weights = Insured)
## 
## Coefficients:
##              Estimate Std. Error  z value Pr(>|z|)    
## (Intercept) -1.815334   0.013746 -132.059  < 2e-16 ***
## Kilometres2  0.207678   0.007540   27.544  < 2e-16 ***
## Kilometres3  0.322884   0.008662   37.277  < 2e-16 ***
## Kilometres4  0.407935   0.012048   33.860  < 2e-16 ***
## Kilometres5  0.588288   0.012761   46.101  < 2e-16 ***
## Zone2       -0.226945   0.009521  -23.836  < 2e-16 ***
## Zone3       -0.378087   0.009702  -38.972  < 2e-16 ***
## Zone4       -0.570242   0.008679  -65.703  < 2e-16 ***
## Zone5       -0.309009   0.014513  -21.292  < 2e-16 ***
## Zone6       -0.523777   0.011928  -43.911  < 2e-16 ***
## Zone7       -0.699400   0.040296  -17.357  < 2e-16 ***
## Bonus2      -0.476948   0.012119  -39.355  < 2e-16 ***
## Bonus3      -0.687923   0.013520  -50.883  < 2e-16 ***
## Bonus4      -0.812998   0.014545  -55.896  < 2e-16 ***
## Bonus5      -0.943819   0.014096  -66.955  < 2e-16 ***
## Bonus6      -0.991315   0.011651  -85.086  < 2e-16 ***
## Bonus7      -1.322764   0.008697 -152.095  < 2e-16 ***
## Make2        0.064292   0.021245    3.026  0.00248 ** 
## Make3       -0.272420   0.025246  -10.791  < 2e-16 ***
## Make4       -0.618084   0.023752  -26.022  < 2e-16 ***
## Make5        0.126230   0.020382    6.193 5.90e-10 ***
## Make6       -0.352307   0.017408  -20.238  < 2e-16 ***
## Make7-9     -0.079971   0.009895   -8.082 6.36e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 251312  on 239443  degrees of freedom
## Residual deviance: 220633  on 239421  degrees of freedom
## AIC: Inf
## 
## Number of Fisher Scoring iterations: 6

On montre à présent une approche incorrecte dans laquelle on “oublie” de prendre en compte l’exposition.

ajustement_err <- glm(formula = Claims ~ Kilometres + Zone + Bonus + Make,
                      family = poisson(link = "log"),
                      data = donnees)

Cet ajustement ne produit pas d’avertissement (le logiciel ne peut pas deviner qu’on lui demande d’ajuster un modèle auquel manque un élément important). On constate que les coefficients estimés sont différents des précédents. La conséquence la plus manifeste est ici la différence considérable entre les deux termes constants : \(\beta_0^{incorrect}-\beta_0^{correct} \approx 2,3\), soit, en repassant aux espérances modélisées (donc en prenant l’exponentielle) un écart d’environ un un facteur 10 sur le résultat.

summary(ajustement_err)
## 
## Call:
## glm(formula = Claims ~ Kilometres + Zone + Bonus + Make, family = poisson(link = "log"), 
##     data = donnees)
## 
## Coefficients:
##              Estimate Std. Error  z value Pr(>|z|)    
## (Intercept)  0.475400   0.013746   34.585  < 2e-16 ***
## Kilometres2  0.207619   0.007538   27.544  < 2e-16 ***
## Kilometres3  0.318567   0.008656   36.802  < 2e-16 ***
## Kilometres4  0.391105   0.012039   32.486  < 2e-16 ***
## Kilometres5  0.563307   0.012753   44.171  < 2e-16 ***
## Zone2       -0.226658   0.009521  -23.807  < 2e-16 ***
## Zone3       -0.377260   0.009701  -38.887  < 2e-16 ***
## Zone4       -0.566816   0.008679  -65.309  < 2e-16 ***
## Zone5       -0.323362   0.014512  -22.282  < 2e-16 ***
## Zone6       -0.526163   0.011928  -44.113  < 2e-16 ***
## Zone7       -0.831607   0.040297  -20.637  < 2e-16 ***
## Bonus2      -0.477041   0.012118  -39.365  < 2e-16 ***
## Bonus3      -0.687880   0.013518  -50.885  < 2e-16 ***
## Bonus4      -0.813264   0.014543  -55.922  < 2e-16 ***
## Bonus5      -0.940400   0.014092  -66.732  < 2e-16 ***
## Bonus6      -0.981928   0.011643  -84.334  < 2e-16 ***
## Bonus7      -1.308606   0.008687 -150.642  < 2e-16 ***
## Make2        0.037673   0.021247    1.773   0.0762 .  
## Make3       -0.304977   0.025244  -12.081  < 2e-16 ***
## Make4       -0.633979   0.023740  -26.706  < 2e-16 ***
## Make5        0.098961   0.020383    4.855 1.20e-06 ***
## Make6       -0.358455   0.017407  -20.593  < 2e-16 ***
## Make7-9     -0.074257   0.009893   -7.506 6.11e-14 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 258579  on 239443  degrees of freedom
## Residual deviance: 228419  on 239421  degrees of freedom
## AIC: 412274
## 
## Number of Fisher Scoring iterations: 6

2.3 Calculs à l’aide du modèle ajusté

Notre modèle ajusté étant purement additif (sans termes d’interaction), la composante systématique se met donc sous la forme :

\[\eta=\beta_0+f_{Kilometres}(Kilometres)+f_{Zone}(Zone)+f_{Bonus}(Bonus)+f_{Make}(Make).\] Pour une exposition égale à \(t\), notre modèle log-Poisson pose donc que la loi de la réponse \(Y\) est donnée par : \[Y \sim \mathcal{P}(t \cdot e^{\eta})= \mathcal{P}(t \cdot e^{\beta_0} \cdot e^{f_{Kilometres}(Kilometres)} \cdot e^{f_{Zone}(Zone)} \cdot e^{f_{Bonus}(Bonus)} \cdot e^{f_{Make}(Make)}).\]

Comme chaque variable explicative est ici catégorielle, et encodée de manière classique (via les indicatrices des différentes modalités, en enlevant une modalité prise comme référence), on a précisément : \[f_{Kilometres}(x) = \beta_{Kilometres,2} \cdot \mathrm{1}(x=2)+\beta_{Kilometres,3} \cdot \mathrm{1}(x=3)+\beta_{Kilometres,4} \cdot \mathrm{1}(x=4)+\beta_{Kilometres,5}\cdot \mathrm{1}(x=5) \] \[f_{Zone}(x) = \beta_{Zone,2} \cdot \mathrm{1}(x=2)+\beta_{Zone,3} \cdot \mathrm{1}(x=3)+\beta_{Zone,4} \cdot \mathrm{1}(x=4)+\beta_{Zone,5}\cdot \mathrm{1}(x=5) + \beta_{Zone,6}\cdot \mathrm{1}(x=6) +\beta_{Zone,7}\cdot \mathrm{1}(x=7) \] \[f_{Bonus}(x) = \beta_{Bonus,2} \cdot \mathrm{1}(x=2)+\beta_{Bonus,3} \cdot \mathrm{1}(x=3)+\beta_{Bonus,4} \cdot \mathrm{1}(x=4)+\beta_{Bonus,5}\cdot \mathrm{1}(x=5) + \beta_{Bonus,6}\cdot \mathrm{1}(x=6) +\beta_{Bonus,7}\cdot \mathrm{1}(x=7) \]

\[f_{Make}(x) = \beta_{Make,2} \cdot \mathrm{1}(x=2)+\beta_{Make,3} \cdot \mathrm{1}(x=3)+\beta_{Make,4} \cdot \mathrm{1}(x=4)+\beta_{Make,5}\cdot \mathrm{1}(x=5) + \beta_{Make,6}\cdot \mathrm{1}(x=6) +\beta_{Make,7-9}\cdot \mathrm{1}(x=7-9) \]

Ainsi, pour une combinaison de variables explicatives données par Kilometres=“3”, Zone=“2”, Bonus=“5”, Make=“4”, et une exposition égale à \(1\), on aura, d’après le modèle : \[Y \sim \mathcal{P}(e^{\beta_0} \cdot e^{\beta_{Kilometres,3}} \cdot e^{\beta_{Zone,2}} \cdot e^{\beta_{Bonus,5}} \cdot e^{\beta_{Make,4}}).\] On note que, lorsqu’une variable explicative prend pour valeur sa modalité de référence, le terme \(\beta_{Variable, Valeur}\) correspondant vaut \(0\), et l’exponentielle correspondante vaut \(1\). A la limite, quand chacune des variables prend pour valeur sa modalité de référence, il ne reste que le terme constant dans la composante systématique : on a \(\eta=\beta_0\), et \(Y \sim \mathcal{P}(e^{\beta_0})\). En ce sens, lors du calcul de l’espérance modélisée, chaque coefficient vient appliquer un facteur correctif (un pour chaque variable explicative) à la valeur modélisée dans le cas où toutes les variables se trouvent égales à leur valeur de référence.

Dans ce qui suit, on va voir comment effectuer concrètement les calculs décrits ci-dessus avec le modèle ajusté.

Pour les besoins de l’illustration, on commence par faire les calculs “à la main” à partir des coefficients du modèle, avant de voir comment procéder de manière automatique. On commence donc par extraire les valeurs estimées des coefficients.

coeff <- coef(ajustement)
coeff
## (Intercept) Kilometres2 Kilometres3 Kilometres4 Kilometres5       Zone2 
## -1.81533423  0.20767829  0.32288358  0.40793471  0.58828802 -0.22694546 
##       Zone3       Zone4       Zone5       Zone6       Zone7      Bonus2 
## -0.37808702 -0.57024216 -0.30900915 -0.52377718 -0.69940014 -0.47694751 
##      Bonus3      Bonus4      Bonus5      Bonus6      Bonus7       Make2 
## -0.68792267 -0.81299838 -0.94381869 -0.99131504 -1.32276381  0.06429186 
##       Make3       Make4       Make5       Make6     Make7-9 
## -0.27241958 -0.61808396  0.12622986 -0.35230735 -0.07997149

On obtient ainsi un vecteur dont les coordonnées portent les noms des différents coefficients.

La composante systématique \(\eta\) est maintenant calculée pour la combinaison de variables explicatives précédente, Kilometres=“3”, Zone=“2”, Bonus=“5”, Make=“4”, et une exposition égale à \(1\).

eta <-
  coeff[["(Intercept)"]] +
  coeff[["Kilometres3"]] +
  coeff[["Zone2"]] +
  coeff[["Bonus5"]] +
  coeff[["Make4"]]
eta
## [1] -3.281299

Pour passer à la valeur modélisée pour l’espérance de la réponse, on doit inverser la fonction de lien, et donc calculer \(e^{\eta}\).

esp_pred <- exp(eta)
esp_pred
## [1] 0.03757942

On en déduit que, avec les paramètres estimés pour notre modèle, on a : \[\mathbb{E}(Y | Kilometres="3", Zone="2", Bonus="5", Make="4")^{est.} = 0.0375794\]

On va maintenant voir comment, partant d’une combinaison de variables explicatives, calculer de manière automatique la valeur modélisée pour l’espérance de la variable réponse correspondante.

On commence par créer un data frame (ici, à une seule ligne) contenant la combinaison de valeurs des variables explicatives pour laquelle on souhaite faire le calcul.

donnees_nouv <- data.frame(Kilometres = "3", Zone = "2", Bonus = "5", Make = "4", Insured = 1)

Ensuite, on utilise la fonction predict pour calculer la valeur modélisée de l’espérance de la réponse. On fournit comme arguments à la fonction le modèle ajusté, avec object = ajustement, le nouveau jeu de données, avec newdata = donnees_nouv, et l’on précise que c’est l’espérance de la réponse que l’on souhaite calculer, avec type = "response".

predict(object = ajustement, 
        newdata = donnees_nouv, 
        type = "response")
##          1 
## 0.03757942

On constate que l’on obtient bien le même résultat que précédemment.

Attention : il est important de passer l’argument type = response à la fonction predict, car, par défaut, celle-ci renvoie la valeur calculée de la composante systématique \(\eta\) du modèle, et non pas la valeur \(g^{-1}(\eta)\) qui fournit l’espérance modélisée de la réponse. Ainsi, quand on omet de spécifier type = response, la valeur prise par défaut pour cet argument est type=link La commande ci-dessous fournit donc la valeur calculée de la composante systématique.

predict(object = ajustement, 
        newdata = donnees_nouv)
##         1 
## -3.281299

On obtient le même résultat (avec moins d’ambiguïté) avec la commande ci-dessous.

predict(object = ajustement, 
        newdata = donnees_nouv, 
        type = "link")
##         1 
## -3.281299

2.4 Intervalles de confiance et intervalles de prédiction pour la réponse

On a vu comment calculer la valeur modélisée pour l’espérance associée à une combinaison de variables explicatives. La fonction predict permet également facilement de calculer des intervalles de confiance pour cette valeur. La méthode delta est utilisée pour répercuter sur le calcul de l’espérance l’incertitude portant sur la valeur des coefficients. (On se place ici sous l’hypothèse que le modèle est adéquat pour décrire notre jeu de données, et l’on utilise la normalité asymptotique de l’estimation par maximum de vraisemblance des coefficients dans la limite d’un grand jeu de données.)

L’argument se.fit=TRUE permet en effet d’obtenir, outre la valeur estimée de l’espérance (qui correspond à la composante nommée fit du résultat obtenu), une estimation de l’écart-type de l’estimateur correspondant : c’est la composante nommée se.fit du résultat produit. Un intervalle de confiance basé sur l’approximation normale peut ensuite être obtenu en multipliant cet écart-type estimé par les quantiles souhaités de la loi \(\mathcal{N}(0,1)\). Dans l’illustration ci-dessous, on calcule un intervalle de confiance bilatéral symétrique de niveau de confiance (approché) \(95\)%.

prediction <- predict(object = ajustement, 
                      newdata = donnees_nouv, 
                      type = "response", 
                      se.fit = TRUE) 
prediction[["fit"]]
##          1 
## 0.03757942
prediction[["se.fit"]]
##            1 
## 0.0009855755
intervalle_95pc <- prediction[["fit"]] + qnorm(p = c(0.025, 0.975)) * prediction[["se.fit"]]
intervalle_95pc
## [1] 0.03564773 0.03951111

On peut également obtenir, en poussant cette approche un peu plus loin, des intervalles de confiance pour l’espérance d’une somme de réponses. Pour illustrer cela, on constitue un jeu de variables explicatives en tirant aléatoirement \(1000\) profils dans le jeu de données initial.

indices_choisis <- sample(x = (1:nrow(donnees)), size = 1000)
variables_choisies <- c("Kilometres", "Zone", "Bonus", "Make", "Insured")
nouvelles_donnees <- donnees[indices_choisis, variables_choisies]
str(nouvelles_donnees)
## 'data.frame':    1000 obs. of  5 variables:
##  $ Kilometres: Factor w/ 5 levels "1","2","3","4",..: 1 1 2 3 2 3 1 1 2 2 ...
##  $ Zone      : Factor w/ 7 levels "1","2","3","4",..: 1 3 3 4 4 6 5 6 3 3 ...
##  $ Bonus     : Factor w/ 7 levels "1","2","3","4",..: 3 7 6 7 7 5 7 7 7 7 ...
##  $ Make      : Factor w/ 7 levels "1","2","3","4",..: 7 7 7 7 7 7 7 7 6 7 ...
##  $ Insured   : num  13.03 9.74 14.16 9.04 15.38 ...

On commence par calculer l’espérance modélisée pour la somme des réponses associées à ce jeu de données.

esp_pred_somme <- sum(predict(object = ajustement, newdata = nouvelles_donnees, type = "response"))
esp_pred_somme
## [1] 456.9083

Pour obtenir un intervalle de confiance autour relatif à la valeur de cette espérance, on va faire appel à la fonction predit_somme_reponse qui figure dans le paquet outilscoursglm.

La fonction predit_somme_reponse renvoie l’espérance prédite pour la somme des réponses associées aux combinaisons de variables explicatives fournies, ainsi qu’une estimation de l’écart-type fournie par la méthode delta.

prediction_somme <- predit_somme_reponse(ajustement = ajustement,
                                         nouvelles_donnees = nouvelles_donnees,
                                         nom_exposition = "Insured",
                                         estime_se = TRUE,
                                         type_rep_voulu = "brut",
                                         type_rep_modele = "brut")
prediction_somme

L’intervalle de confiance à 95% produit par approximation normale en utilisant cette estimation de l’écart-type est obtenu comme précédemment :

int_conf <- prediction_somme[["esp_reponse_brute"]] + 
  qnorm(p = c(0.025, 0.975)) * prediction_somme[["se_esp_reponse_brute"]]
int_conf
## [1] 454.2194 459.5971

On calcule maintenant un intervalle de prédiction pour la somme des réponses : ce n’est pas du tout la même chose que l’intervalle de confiance précédent ! L’intervalle de confiance porte sur l’incertitude d’estimation de l’espérance de la somme des réponses. L’intervalle de prédiction porte sur le caractère aléatoire de la réponse : il fournit un intervalle de valeurs dans lequel, selon le modèle, la réponse a une probabilité donnée de se trouver. Ici, d’après le modèle, la loi de la somme des réponses est encore une loi de Poisson, puisque les réponses individuelles suivent chacune une loi de Poisson, et sont indépendantes. On peut simplement faire appel aux quantiles de la loi de Poisson. Ici, on calcule un intervalle de prédiction avec une probabilité de 95% de contenir la valeur de la réponse, en répartissant de part et d’autre de la distribution une probabilité de \(2.5\)%.

int_pred <- qpois(p = c(0.025, 0.975), lambda = esp_pred_somme)
int_pred
## [1] 415 499

On note que, dans le calcul ci-dessus, on a ignoré l’incertitude portant sur l’estimation de l’espérance de la réponse, en utilisant simplement la valeur estimée par le modèle. Ce calcul est donc perfectible !

2.5 Etude des effets estimés par le modèle

2.5.1 Tracé des coefficients

On représente ci-après, en fonction des valeurs de la variable Kilometres, la contribution du terme correspondant dans la composante systématique du modèle, c’est-à-dire ici simplement la valeur du coefficient associé à chaque modalité de la variable (avec \(0\) pour la modalité de référence). Notre modèle étant purement additif (il n’y a pas de terme d’interaction entre les variables), l’“effet” d’une variable s’entend donc ici comme la valeur qui vient s’ajouter à la composante systématique du modèle du fait de la valeur prise par cette variable, le terme constant étant, quant à lui, toujours ajouté dans la composante systématique, quelles que soient les valeurs des variables explicatives. En repassant à l’espérance de la variable réponse, ce sont les exponentielles (du fait d’avoir choisi une fonction de lien logarithmique) des valeurs ainsi tracées qui sont multipliées, variable par variable, pour aboutir à la valeur modélisée de l’espérance, en sus du facteur \(e^{\beta_0}\), toujours présent.

On utilise pour cela la fonction trace_terme_univar du paquet outilscoursglm.

trace_terme_univar(ajustement = ajustement,
                   nom_terme = "Kilometres", 
                   nom_variable = "Kilometres", 
                   titre = "Effet de la variable Kilometres")
## Warning in trace_terme_univar(ajustement = ajustement, nom_terme = "Kilometres", : Utilisation des données de ajustement$data
## Warning in trace_terme_univar(ajustement = ajustement, nom_terme = "Kilometres", : Expositions fixées à 1

On enrichit ensuite le tracé précédent en y ajoutant les intervalles de confiance à 95% associés à chaque coefficient, et les expositions cumulées associées à chaque modalité dans le jeu de données ayant servi pour l’ajustement.

trace_terme_univar(ajustement = ajustement,
                   nom_terme = "Kilometres", 
                   nom_variable = "Kilometres", 
                   titre = "Effet de la variable Kilometres",
                   trace_int_conf = TRUE, 
                   trace_exposition = TRUE,
                   nom_exposition = "Insured")
## Warning in trace_terme_univar(ajustement = ajustement, nom_terme = "Kilometres", : Utilisation des données de ajustement$data

On constate, ce qui semble raisonnable, que, dans notre modèle, l’effet de la variable Kilometressur le nombre de sinistres croît avec la catégorie de kilométrage parcouru. Par exemple, le passage de la modalité de référence “1” à la modalité “2” entraîne une multiplication par \(e^{\beta_{Kilometres,2}}=e^{0.2076783} = 1.2308171\) de l’espérance modélisée, le passage de la modalité “1” à la modalité “3” entraîne une multiplication par \(e^{\beta_{Kilometres,3}}=e^{0.3228836}=1.3811046\) de l’espérance modélisée, ou encore, le passage de la modalité “2” à la modalité “3” entraîne une multiplication par \(e^{\beta_{Kilometres,3}-\beta_{Kilometres,2}}=e^{0.3228836-0.2076783}=1.1221038\) de l’espérance modélisée, toutes choses égales par ailleurs.

On effectue ensuite le même type de tracé pour chacune des variables explicatives.

trace_terme_univar(ajustement = ajustement,
                   nom_terme = "Zone", 
                   nom_variable = "Zone", 
                   titre = "Effet de la variable Zone",
                   trace_int_conf = TRUE, 
                   trace_exposition = TRUE,
                   nom_exposition = "Insured")
## Warning in trace_terme_univar(ajustement = ajustement, nom_terme = "Zone", : Utilisation des données de ajustement$data

On constate des valeurs contrastées selon les zones géographiques. (On note que, contrairement à la variable Kilometres, la variable Zone n’est pas une variable ordinale.) On note l’incertitude plus grande sur le coefficient associé à une exposition plus faible (et donc à un volume plus faible de données).

trace_terme_univar(ajustement = ajustement,
                   nom_terme = "Bonus", 
                   nom_variable = "Bonus", 
                   titre = "Effet de la variable Bonus",
                   trace_int_conf = TRUE, 
                   trace_exposition = TRUE,
                   nom_exposition = "Insured")
## Warning in trace_terme_univar(ajustement = ajustement, nom_terme = "Bonus", : Utilisation des données de ajustement$data

Comme on pouvait s’y attendre, on constate que l’effet décroît avec le niveau de bonus.

trace_terme_univar(ajustement = ajustement,
                   nom_terme = "Make", 
                   nom_variable = "Make", 
                   titre = "Effet de la variable Make",
                   trace_int_conf = TRUE, 
                   trace_exposition = TRUE,
                   nom_exposition = "Insured")
## Warning in trace_terme_univar(ajustement = ajustement, nom_terme = "Make", : Utilisation des données de ajustement$data

On constate des effets contrastés pour la variable non-ordinale Make.

Une remarque importante : parler d’“effet” d’une variable dans l’absolu n’a pas forcément un sens très clair. Dans ce qui précède, nous avons représenté les effets des différentes variables estimés dans le cadre du modèle. Un modèle de forme différente ajusté sur les mêmes données pourra parfaitement donner lieu à des effets différents.

Pour illustrer cela dans une situation simple, on considère ci-après les modèles ajustés en ne tenant compte que d’une seule variable explicative à la fois.

On vérifie ensuite que, pour une variable donnée, les effets estimés par chacun de ces modèles ne sont pas identiques, quoiqu’assez voisins dans ce cas, aux effets estimés par le modèle global (incorporant les 4 variables) que nous avons étudié. De manière imagée, les modèles mono-variables vont attribuer à l’unique variable dont ils disposent une partie des effets que le modèle global attribue aux autres variables, d’où les différences constatées.

# Calcul de l'ajustement avec uniquement la variable Kilometres comme explicative
ajust_Kilometres <- glm(formula = Claims ~ Kilometres + offset(log(Insured)),
                        family = poisson(link = "log"),
                        data = donnees)
# Calcul de l'ajustement avec uniquement la variable Zone comme explicative
ajust_Zone <- glm(formula = Claims ~ Zone + offset(log(Insured)),
                  family = poisson(link = "log"),
                  data = donnees)
# Calcul de l'ajustement avec uniquement la variable Bonus comme explicative
ajust_Bonus <- glm(formula = Claims ~ Bonus + offset(log(Insured)),
                   family = poisson(link = "log"),
                   data = donnees)
# Calcul de l'ajustement avec uniquement la variable Make comme explicative
ajust_Make <- glm(formula = Claims ~ Make + offset(log(Insured)),
                  family = poisson(link = "log"),
                  data = donnees)
coefficients(ajustement)[c(1, (2:5))]
## (Intercept) Kilometres2 Kilometres3 Kilometres4 Kilometres5 
##  -1.8153342   0.2076783   0.3228836   0.4079347   0.5882880
coefficients(ajust_Kilometres)
## (Intercept) Kilometres2 Kilometres3 Kilometres4 Kilometres5 
##  -3.1929100   0.1678651   0.1975352   0.2384175   0.4413314
coefficients(ajustement)[c(1, (6:11))]
## (Intercept)       Zone2       Zone3       Zone4       Zone5       Zone6 
##  -1.8153342  -0.2269455  -0.3780870  -0.5702422  -0.3090092  -0.5237772 
##       Zone7 
##  -0.6994001
coefficients(ajust_Zone)
## (Intercept)       Zone2       Zone3       Zone4       Zone5       Zone6 
##  -2.6563575  -0.2455855  -0.4161085  -0.6218234  -0.3438933  -0.5567829 
##       Zone7 
##  -0.7497646
coefficients(ajustement)[c(1, (12:17))]
## (Intercept)      Bonus2      Bonus3      Bonus4      Bonus5      Bonus6 
##  -1.8153342  -0.4769475  -0.6879227  -0.8129984  -0.9438187  -0.9913150 
##      Bonus7 
##  -1.3227638
coefficients(ajust_Bonus)
## (Intercept)      Bonus2      Bonus3      Bonus4      Bonus5      Bonus6 
##  -2.1348975  -0.4468947  -0.6325175  -0.7301258  -0.8417649  -0.8728527 
##      Bonus7 
##  -1.2465011
coefficients(ajustement)[c(1, (18:23))]
## (Intercept)       Make2       Make3       Make4       Make5       Make6 
## -1.81533423  0.06429186 -0.27241958 -0.61808396  0.12622986 -0.35230735 
##     Make7-9 
## -0.07997149
coefficients(ajust_Make)
## (Intercept)       Make2       Make3       Make4       Make5       Make6 
## -3.01764751  0.08911852 -0.27103065 -0.41201716  0.14262183 -0.30627414 
##     Make7-9 
## -0.01211666

2.5.2 Autres représentations

On peut envisager d’autres manières de représenter les effets d’une variable explicative, qui ne sont pas nécessairement équivalentes à celle que l’on vient d’utiliser. Une possibilité est de calculer l’espérance de la réponse modélisée en fonction des valeurs de la variable d’intérêt, les valeurs des autres variables explicatives étant fixées à des valeurs conventionnelles.

Pour un modèle purement additif (sans termes d’interaction) comme c’est le cas ici, on obtient un résultat essentiellement équivalent à celui fourni par le tracé précédent. (Au choix de l’origine près, et à condition de travailler sur l’échelle de la composante systématique. Sur l’échelle de la réponse elle-même, se superpose l’effet de l’inverse de la fonction de lien. De plus, les intervalles de confiance diffèrent, du fait de l’ajout des effets estimés des valeurs conventionnelles choisies pour les autres variables explicatives.). Ceci ne serait plus vrai en présence d’interactions.

Ci-dessous, cette approche est illustrée pour la variable Kilometres, d’abord sur l’échelle de la composante systématique, puis sur l’échelle de la réponse. On utilise la fonction trace_effet_univar qui figure dans le paquet outilscoursglm.

trace_effet_univar(ajustement = ajustement,
                   nom_variable = "Kilometres",
                   nom_exposition = "Insured",
                   type_rep_modele = "brut",
                   type_rep_voulu = "norm",
                   trace_int_conf = TRUE,
                   trace_exposition = TRUE)
## Warning in trace_effet_univar(ajustement = ajustement, nom_variable = "Kilometres", : Utilisation des données de ajustement$data
## Valeur de Zone fixée à 1 
## Valeur de Bonus fixée à 1 
## Valeur de Make fixée à 1 
## Valeur de Insured fixée à 6.36

Une autre approche consiste à calculer les espérances de la réponse modélisée sur tout un jeu de données (par exemple celui utilisé pour l’ajustement); le jeu de données est ensuite divisé en groupes correspondant aux différentes valeurs prises par la variable d’intérêt, et la valeur moyenne des espérances modélisées est ensuite calculée chacun des groupes. On peut alors tracer les moyennes ainsi obtenues en fonction de la valeur de la variable d’intérêt. La distribution des valeurs des autres variables au sein du jeu de données utilisé a un impact sur le résultat !

On illustre cette approche sur le jeu de données utilisé pour l’ajustement. On commence donc par ajouter la valeur de l’espérance de la réponse modélisée à notre jeu de données.

donnees[["esp_mod_Claims"]] <- fitted(ajustement)

On fait ensuite appel à la fonction trace_moyenne_univar du paquet outilscoursglm. L’exposition est utilisée pour normaliser correctement les moyennes des espérances des réponses brutes modélisées. (Les intervalles de confiance tracés ici traitent les valeurs modélisées comme des données observées issuées d’un échantillon i.i.d., et n’ont pas de rapport direct avec les intervalles de confiance calculés pour les coefficients).

trace_moyenne_univar(donnees = donnees,
                     nom_reponse = "esp_mod_Claims",
                     nom_variable = "Kilometres",
                     nom_exposition = "Insured",
                     trace_int_conf = TRUE,
                     trace_exposition = TRUE)

Cette représentation nous donne l’occasion de mettre en évidence une propriété importante des GLM utilisant leur fonction de lien canonique (c’est le cas ici, puisque la fonction de lien canonique pour la loi de Poisson est la fonction logarithme) : pour chaque catégorie de chaque variable catégorielle intervenant dans le modèle, l’espérance de la réponse modélisée est égale à la moyenne de la réponse observée, sur le jeu de données utilisé pour l’ajustement. (Ce n’est pas nécessairement le cas si l’on utilise un jeu de données différent de celui utilisé pour ajuster le modèle, si la fonction de lien n’est pas canonique, ou si la variable n’est pas catégorielle.)

On le vérifie ci-dessous, en comparant au graphique précédent celui des moyennes de la réponse observée (avec nom_reponse =Claims`) au sein de chacune des catégories.

trace_moyenne_univar(donnees = donnees,
                     nom_reponse = "Claims",
                     nom_variable = "Kilometres",
                     nom_exposition = "Insured",
                     trace_int_conf = TRUE,
                     trace_exposition = TRUE)

3 Regroupement des données

On procède maintenant à un regroupement des données selon le principe suivant : les lignes du jeu de données possédant exactement la même combinaison de valeurs des variables explicatives sont groupées en une seule ligne, les nombres de sinistres (Claims), montant de sinistres (Payment), et expositions (Insured) correspondants étant sommés. On utilise pour cela la fonction aggregate (il existe d’autres fonctions permettant de réaliser de tels groupements).

donnees_groupe <- aggregate(x = cbind(Claims, Payment, Insured) ~ Kilometres + Zone + Bonus + Make,
                            data = donnees,
                            FUN = sum)
str(donnees_groupe)
## 'data.frame':    1703 obs. of  7 variables:
##  $ Kilometres: Factor w/ 5 levels "1","2","3","4",..: 1 2 3 4 5 1 2 3 4 5 ...
##  $ Zone      : Factor w/ 7 levels "1","2","3","4",..: 1 1 1 1 1 2 2 2 2 2 ...
##  $ Bonus     : Factor w/ 7 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ Make      : Factor w/ 7 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ Claims    : num  73 94 46 10 12 69 109 50 8 7 ...
##  $ Payment   : num  336602 478366 201823 56473 67723 ...
##  $ Insured   : num  455.1 638.5 213.4 49.3 39.4 ...

On constate une réduction considérable du jeu de données : partant de 239444 lignes, on aboutit à seulement 1703 lignes. Il n’y avait donc en tout que 1703 combinaisons distinctes de valeurs des variables explicatives dans le jeu de données d’origine.

On va maintenant ajuster le modèle GLM log-Poisson sur ce jeu de données groupées, afin de vérifier que (conformément à ce qui est attendu), l’estimation des coefficients produit un résultat identique à l’ajustement effectué sur les données non-groupées.

ajustement_groupe <- glm(formula = Claims ~ Kilometres + Zone + Bonus + Make + offset(log(Insured)),
                         family = poisson(link = "log"),
                         data = donnees_groupe)
summary(ajustement_groupe)
## 
## Call:
## glm(formula = Claims ~ Kilometres + Zone + Bonus + Make + offset(log(Insured)), 
##     family = poisson(link = "log"), data = donnees_groupe)
## 
## Coefficients:
##              Estimate Std. Error  z value Pr(>|z|)    
## (Intercept) -1.815334   0.013746 -132.059  < 2e-16 ***
## Kilometres2  0.207678   0.007540   27.544  < 2e-16 ***
## Kilometres3  0.322884   0.008662   37.277  < 2e-16 ***
## Kilometres4  0.407935   0.012048   33.860  < 2e-16 ***
## Kilometres5  0.588288   0.012761   46.101  < 2e-16 ***
## Zone2       -0.226945   0.009521  -23.836  < 2e-16 ***
## Zone3       -0.378087   0.009702  -38.972  < 2e-16 ***
## Zone4       -0.570242   0.008679  -65.703  < 2e-16 ***
## Zone5       -0.309009   0.014513  -21.292  < 2e-16 ***
## Zone6       -0.523777   0.011928  -43.911  < 2e-16 ***
## Zone7       -0.699400   0.040295  -17.357  < 2e-16 ***
## Bonus2      -0.476948   0.012119  -39.355  < 2e-16 ***
## Bonus3      -0.687923   0.013520  -50.883  < 2e-16 ***
## Bonus4      -0.812998   0.014545  -55.896  < 2e-16 ***
## Bonus5      -0.943819   0.014096  -66.955  < 2e-16 ***
## Bonus6      -0.991315   0.011651  -85.086  < 2e-16 ***
## Bonus7      -1.322764   0.008697 -152.095  < 2e-16 ***
## Make2        0.064292   0.021245    3.026  0.00248 ** 
## Make3       -0.272420   0.025246  -10.791  < 2e-16 ***
## Make4       -0.618084   0.023752  -26.022  < 2e-16 ***
## Make5        0.126230   0.020382    6.193 5.90e-10 ***
## Make6       -0.352307   0.017408  -20.238  < 2e-16 ***
## Make7-9     -0.079971   0.009895   -8.082 6.36e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 32362.8  on 1702  degrees of freedom
## Residual deviance:  1683.4  on 1680  degrees of freedom
## AIC: 8152.1
## 
## Number of Fisher Scoring iterations: 4
summary(ajustement)
## 
## Call:
## glm(formula = Claims ~ Kilometres + Zone + Bonus + Make + offset(log(Insured)), 
##     family = poisson(link = "log"), data = donnees)
## 
## Coefficients:
##              Estimate Std. Error  z value Pr(>|z|)    
## (Intercept) -1.815334   0.013746 -132.059  < 2e-16 ***
## Kilometres2  0.207678   0.007540   27.544  < 2e-16 ***
## Kilometres3  0.322884   0.008662   37.277  < 2e-16 ***
## Kilometres4  0.407935   0.012048   33.860  < 2e-16 ***
## Kilometres5  0.588288   0.012761   46.101  < 2e-16 ***
## Zone2       -0.226945   0.009521  -23.836  < 2e-16 ***
## Zone3       -0.378087   0.009702  -38.972  < 2e-16 ***
## Zone4       -0.570242   0.008679  -65.703  < 2e-16 ***
## Zone5       -0.309009   0.014513  -21.292  < 2e-16 ***
## Zone6       -0.523777   0.011928  -43.911  < 2e-16 ***
## Zone7       -0.699400   0.040296  -17.357  < 2e-16 ***
## Bonus2      -0.476948   0.012119  -39.355  < 2e-16 ***
## Bonus3      -0.687923   0.013520  -50.883  < 2e-16 ***
## Bonus4      -0.812998   0.014545  -55.896  < 2e-16 ***
## Bonus5      -0.943819   0.014096  -66.955  < 2e-16 ***
## Bonus6      -0.991315   0.011651  -85.086  < 2e-16 ***
## Bonus7      -1.322764   0.008697 -152.095  < 2e-16 ***
## Make2        0.064292   0.021245    3.026  0.00248 ** 
## Make3       -0.272420   0.025246  -10.791  < 2e-16 ***
## Make4       -0.618084   0.023752  -26.022  < 2e-16 ***
## Make5        0.126230   0.020382    6.193 5.90e-10 ***
## Make6       -0.352307   0.017408  -20.238  < 2e-16 ***
## Make7-9     -0.079971   0.009895   -8.082 6.36e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for poisson family taken to be 1)
## 
##     Null deviance: 251312  on 239443  degrees of freedom
## Residual deviance: 220633  on 239421  degrees of freedom
## AIC: 404488
## 
## Number of Fisher Scoring iterations: 6

On note néanmoins que les statistiques des résidus de déviance, la déviance et l’AIC sont complètement différents. La perte d’information qui résulte du groupement des données aura un impact lorsque l’on cherchera par exemple à évaluer la qualité d’ajustement du modèle, ou s’il est nécessaire d’estimer le paramètre de dispersion \(\phi\) (ce qui n’est pas le cas ici). Il faudra également tenir compte de cet impact si l’on est amené à comparer des modèles ajustés sur des jeux de données groupées de manière différente.