1 Études statistiques
1.1 Nettoyage des données
Cette partie de ce document sera consacrée à l’étude statistique de notre jeu de données.
Il existe quelques incohérences au niveau des données telles que des charges négatives ou nulles pour des nombres de sinistres positifs et des nombres de sinistres nuls pour des charges positives.
Nous avons donc choisi de remplacer par 0 toutes les charges négatives pour des sinistres nuls, tous les nombres de sinistres positifs pour des charges nulles et par la valeur absolue des charges pour les nombre de sinistres positifs.
library(dplyr)
# Ajout de la somme des sinistres par police
$SumSINAPS <- database %>% select(starts_with("SINAP")) %>%
databaseapply(., 1, sum)
# Transformation des données
<- database %>% mutate(SumSINAPS = case_when(CHARGE==0~0,
database TRUE~SumSINAPS)) %>%
mutate(CHARGE = case_when(SumSINAPS==0~0,
>0~abs(CHARGE),
SumSINAPSTRUE~0))
Nous venons de créer avec le code précédent une nouvelle colonne dans la base de données database
que nous avons appelé SumSINAPS
.
On peut facilement faire un sommaire de la somme des sinistres ainsi que des charges avec la fonction summary
afin de connaître les mesures de tendance de cette variable.
summary(database[,c("CHARGE","SumSINAPS")])
## CHARGE SumSINAPS
## Min. : 0.0 Min. : 0.000
## 1st Qu.: 0.0 1st Qu.: 0.000
## Median : 0.0 Median : 0.000
## Mean : 170.1 Mean : 0.169
## 3rd Qu.: 0.0 3rd Qu.: 0.000
## Max. :95151.0 Max. :10.000
1.2 Représentations graphiques
Dans cette partie du projet, nous allons effectuer un ensemble de représentations graphiques afin de savoir l’impact des variables sur les sinistres.
Ces graphes suivants indiquent la fréquence des sinistre en fonction des différentes variables : sexe, zone, catégorie socio-professionnelle, age, usage du véhicule et statut matrimonial.
library(dplyr)
library(ggplot2)
= database %>% select(SEXE = SEX,STATUT,ZONE,CSP,USAGE,AGECOND) #selection des variables.
B1 <- function(df, N){
plot_ = names(df)
name for (i in name){
<- data.frame(df[[i]],N) # Creation d'une df(Variables,N)
df0 colnames(df0) <- c(i,'N')
<- df0 %>% group_by(valeur = df0[[i]]) %>%
s summarise(total = sum(N)) # Creation d'une df(groupe de Variables, Total)
assign(paste0("table",i),s,.GlobalEnv)
# debut du code pour la figure
<- ggplot(data = s, aes(x = valeur, y = total/sum(total))) +
figure geom_col() +
xlab(i) + # Ajout du label de x
ylab(paste0("Frequence ",i)) + # Ajout du label de y
::theme_ipsum(grid = "Y") # Ajout d'un theme pour la figure
hrbrthemes# fin du code pour la figure
assign(paste0("fig",i),figure,.GlobalEnv) #assigantion de la figure i
}
}=database$SumSINAPS
SumSINAPSplot_(B1,SumSINAPS) # Execution de la fonction precedente
require(patchwork)
|figUSAGE)/figAGECOND (figSEXE
|figZONE)/figCSP (figSTATUT
On constate que pour la variable SEX
la fréquence des sinistres des hommes(M) est plus que le double de celle des femmes(F).
Les clients du type d’usage de véhicule \(2\) ont les fréquences les plus élevées de sinistres, suivit dans cet ordre par les usages \(1\),\(3\) et \(4\).
Les conducteurs de statut A ont une fréquence de sinistre à peu près cinq fois plus élevées que celle des conducteurs de statut C.
On peut utiliser ce même raisonnement pour interpréter tous les autres graphes.
1.3 Tests statistiques
Nous allons faire des tests statistiques histoire de connaître quelle loi suit la somme totale des sinistres SumSINAPS
.
Les tests d’adéquation servent à tester si un échantillon est distribué selon une loi de probabilité donnée.
Ils permettent de décider, avec un seuil d’erreur \(\alpha\) spécifié, si les écarts présentés par l’échantillon par rapport aux valeurs théoriques attendues sont dus au hasard ou sont au contraire significatifs.
Estimation par la méthode du maximum de vraisembance.
Soit \(X\) une variable aléatoire réelle de loi discrète ou continue dont on veut estimer le paramétre \(\theta\). Alors on définit une fonction \(f\) telle que:
\[f(x;\theta) = \begin{cases}
f_\theta(x) : si\; X\;variable\; aléatoire\; continue \\
P_\theta(X=x) : si\; X\;variable\; aléatoire\; discrète
\end{cases}\]
On appelle fonction de vraisemblance de \(\theta\) pour une réalisation \((x_1,\dots,x_n)\) d’un échantillon, la fonction de \(\theta\):
\[L(x_1,\dots,x_n;\theta)=f(x_1,\dots,x_n;\theta)=\prod\limits_{i=1}^{n}f(x;\theta)\]
La méthode consiste à estimer \(\theta\) par la valeur qui maximise \(L\), cette méthode s’appelle méthode du maximum de vraisemblance(\(MLE\)1), on choisit la valeur \(\theta\) qui réalise le maximum de \(L(x_1,\dots,x_n;\theta)\). Pour cela on cherche \(\theta\) telle que:
\[\frac{\partial L}{\partial \theta}=0 \;\; et\;\; \frac{\partial^2 L}{\partial \theta^2}\leq 0\]
On passe en général au logarithme, c’est à dire on cherche \(\theta\) telle que:
\[\frac{\partial\big(ln(L)\big)}{\partial \theta}=0 \;\; et\;\; \frac{\partial^2 \big(ln(L)\big)}{\partial \theta^2}\leq 0\]
Nombre de sinistres
Pour faire les tests, nous allons générer une variable aléatoire \(X\) suivant une loi choisie, puis tester si la somme totale des sinistres SumSINAPS
est de même loi.
Loi de poisson
Dans le cas habituel théorique, le nombre de sinistres suivrait la loi de poisson ce qui nous pousse à faire ce premier test.
#Generer une v.a de longueur indentique a celle de SumSINAPS et suivant la loi de poisson
=rpois(length(SumSINAPS),mean(SumSINAPS))
X#test de poisson
ks.test(SumSINAPS,X)
##
## Two-sample Kolmogorov-Smirnov test
##
## data: SumSINAPS and X
## D = 0.076048, p-value < 2.2e-16
## alternative hypothesis: two-sided
La \(p\)-\(value\) est inférieure à \(0.5\) donc on rejette l’hypothèse \(H_0\) selon laquelle la somme des sinistres suit une loi de poisson.
Pour consolider cette conclusion on peut faire un test visuel avec la fonction qqplot()
.
Si SumSINAPS
et \(X\) suivent la même loi, alors le nuage de points doit s’apparenter à une droite.
qqplot(SumSINAPS,X)
On voit clairement que le nuage de points est loin d’être sur une même droite, ce qui conforte notre conclusion précédente.
Loi géométrique
A part la loi de poisson, le nombre de sinistre pourrait suivre la loi géométrique.
D’ailleur la densité de SumSINAPS
que nous avons tracer a la même forme que le graphe d’une densité de la loi géométrique.
On peut tester graphiquement si une variable suit une loi géométrique toujours avec la même fonction qqplot()
.
Mais faudra trouver le paramètre \(p\) de la loi loi géométrique pour pouvoir générer notre échantillon \(X\).
Il existe un package permettant d’entraîner une donnée selon la loi loi géométrique du nom de fitdistrplus2 afin de trouver l’estimateur du paramètre \(p\) par la méthode du maximum de vraisemblance.
library(fitdistrplus)
<- fitdist(data = SumSINAPS,distr = "geom",
fitSINAPS method = "mle")
summary(fitSINAPS)
## Fitting of the distribution ' geom ' by maximum likelihood
## Parameters :
## estimate Std. Error
## prob 0.8554255 0.002564721
## Loglikelihood: -7767.809 AIC: 15537.62 BIC: 15545.3
La sortie de la fonction summary
indique que \(p =0.8554255\), on va l’utiliser pour générer \(X\) puis faire le test de qqplot
.
= rgeom(length(SumSINAPS),prob =0.8554255)
X qqplot(SumSINAPS,X)
abline(0,0.5)
Ce graphe s’apparente plus avec une droite que celui tracer dans la section précédente. En plus le modèle entraîné présente des valeurs empériques et théoriques très proche.
plot(fitSINAPS)
On peut donc supposé que \(SumSINAPS\sim\mathcal{G}(p:= 0.8554255)\)
Charges de sinistres
Comme nous l’avons fait précédemment, nous allons chercher le meilleur paramétré \(\mu log\) et \(sdlog\) par la méthode \(MLE\) pour la charge des sinistres qui suivrait une loi lognormale.
library(fitdistrplus)
<- database$CHARGE
Charge <- Charge[which(Charge>0)]
Charge <- fitdistr(Charge,"log-normal")
fitCharge fitCharge
## meanlog sdlog
## 6.66608145 1.38553971
## (0.03901768) (0.02758967)
Autrement dit, si la charge de sinistres suit une loi lognormale alors ce sera:
\[log\mathcal{N}(6.66608145,1.38553971)\] On peut faire le test de Kolmogorov-Smirnov3 pour conforter se résultat en tenant compte de l’écart type des erreurs d’estimation de la fonction fitdistr
.
= fitCharge$estimate + fitCharge$sd
estimated <- rlnorm(length(Charge),estimated[["meanlog"]],estimated[["sdlog"]])
X ks.test(Charge,X)
##
## Two-sample Kolmogorov-Smirnov test
##
## data: Charge and X
## D = 0.048374, p-value = 0.1046
## alternative hypothesis: two-sided
La \(p-value = 0.1046>\alpha=5\%\) alors on rejette pas l’hypothèse \(H_0\), alors la charge de sinistres pourrait suivre la loi \(log\mathcal{N}(6.7,1.4)\).
library(ggplot2)
= data.frame(Charge,X)
dfdensity ggplot(data = dfdensity)+
geom_density(aes(x=Charge,color ="blue"))+
geom_density(aes(x=X,color="red"))+
scale_colour_manual(values = c( "red", "blue"),
labels= c("Charge","X"))+
ggtitle("Densités",
subtitle = "X a été généré aléatoirement\nSuivant la loi loi lognormale")+
::theme_tufte() ggthemes
MLE : Maximum likelihood estimation↩︎
https://cran.r-project.org/web/packages/fitdistrplus/index.html↩︎
https://en.wikipedia.org/wiki/Kolmogorov%E2%80%93Smirnov_test↩︎