Contexte : Ce rapport présente l’analyse technique du portefeuille automobile d’ENSAssuRances. L’objectif est d’identifier les segments à risque et de proposer des leviers d’optimisation tarifaire.
Avant d’entrer dans le détail des analyses, voici une vue d’ensemble du portefeuille ENSAssuRances sur la période étudiée.
| Indicateur | Valeur |
|---|---|
| 📝 Nombre de contrats | 301 437 |
| 💥 Nombre de sinistres total | 33 609 |
| 📊 Fréquence de sinistre | 11.15% |
| 💰 Coût total des sinistres | 10.53 M€ |
| 📉 Coût moyen par sinistre | 313 € |
Nous analysons ici la dynamique du portefeuille pour vérifier la stabilité de notre base d’assurés.
# Distribution des contrats par année
ggplot(df_final, aes(x = factor(idx_year))) +
geom_bar(fill = "#2980B9") +
geom_text(stat = 'count', aes(label = ..count..), vjust = -0.5) +
labs(title = "Distribution des contrats par année",
subtitle = "Évolution de la taille du portefeuille",
x = "Année", y = "Nombre de contrats actifs")
Analyse de la tendance des contrats : Le portefeuille affiche une croissance globale de + 26% sur la période (passant de 55 227 à 69 674 contrats). On distingue deux phases : une progression régulière jusqu’en 2021, suivie d’une accélération marquée en 2023 (+ 13% en un an). Cette dynamique commerciale positive nécessite une surveillance accrue du risque, les affaires nouvelles présentant souvent une sinistralité plus volatile avec un effet de nouveauté.
# Histogramme du total de sinistres par année
df_sinistres_annee <- df_final %>%
group_by(idx_year) %>%
summarise(total_sinistres = sum(nb_sinistres_total))
ggplot(df_sinistres_annee, aes(x = factor(idx_year), y = total_sinistres)) +
geom_col(fill = "#C0392B") +
geom_text(aes(label = total_sinistres), vjust = -0.5) +
labs(title = "Total de sinistres par année",
x = "Année", y = "Nombre de sinistres")
Analyse de la tendance des sinistres : L’année 2020 marque un point très bas avec 3 781 sinistres, dû à la baisse du trafic lors de la crise sanitaire. Cependant, la dynamique s’inverse par la suite. En 2023, on observe une hausse des sinistres de + 21,6%, alors que le portefeuille n’a crû que de + 13%. Les sinistres augmentent beaucoup plus vite que le nombre de nouveaux clients. Cela signifie que la fréquence des accidents augmente.
Comprendre ce que nous assurons permet de mieux anticiper les coûts de réparation.
# Répartition par type de véhicule
ggplot(df_final, aes(x = fct_infreq(vh_segment))) +
geom_bar(fill = "#16A085") +
coord_flip() +
labs(title = "Répartition des types de véhicules",
x = "Types de véhicules", y = "Nombre de véhicules")
Analyse de la répartition par type de véhicule : Le parc assuré est dominé par les Citadines (~120k véhicules), suivies des Familiales et des Compactes. Les SUV représentent la part la plus faible du portefeuille. Cette répartition est un avantage : les citadines coûtent généralement moins cher à réparer en cas d’accident que les gros véhicules, ce qui limite nos dépenses.
# Répartition des véhicules selon l’alimentation (essence, diesel, électrique…)
ggplot(df_final, aes(x = vh_energy, fill = vh_energy)) +
geom_bar() +
scale_fill_brewer(palette = "Set2") +
labs(title = "Répartition des véhicules selon l’alimentation",
x = "Énergie", y = "Volume") +
theme(legend.position = "none")
Analyse de la répartition par type d’alimentation : Le parc est dominé par les motorisations Essence, suivies du Diesel, ce qui est cohérent avec la forte proportion de citadines. Les véhicules Électriques/Hybrides représentent un tiers significatif du portefeuille. La prédominance des moteurs thermiques permet de garder des coûts de réparation bas, contrairement aux véhicules électriques souvent onéreux à réparer
C’est le cœur de l’étude : qui a le plus d’accidents ?
# Nombre de sinistres en fonction de l’âge du sociétaire
sinistres_seuls <- df_final %>% filter(nb_sinistres_total > 0)
ggplot(sinistres_seuls, aes(x = drv1age)) +
geom_histogram(binwidth = 2, fill = "#E74C3C", color = "white", alpha = 0.8) +
labs(title = "Sinistres selon l'âge",
subtitle = "Distribution de l'âge des conducteurs accidentés",
x = "Âge du sociétaire", y = "Nombre de sinistres")
Analyse de la distribution par âge : Le graphique révèle que le plus gros volume de sinistres est généré par la tranche d’âge 35-50 ans. Contrairement à l’attendu théorique, les jeunes conducteurs (18-25 ans) ne représentent pas le volume principal d’accidents en valeur absolue, ce qui suggère qu’ils sont soit sous-représentés dans le portefeuille, soit que leur impact est dilué par la masse des conducteurs expérimentés.
# Nombre et pourcentage de sinistres selon le sexe
analyse_sexe <- df_final %>%
group_by(drv1sex) %>%
summarise(nb_sinistres = sum(nb_sinistres_total)) %>%
mutate(pourcentage = nb_sinistres / sum(nb_sinistres))
ggplot(analyse_sexe, aes(x = drv1sex, y = nb_sinistres, fill = drv1sex)) +
geom_col() +
geom_text(aes(label = paste0(nb_sinistres, "\n(", percent(pourcentage, 0.1), ")")),
position = position_stack(vjust = 0.5),
color = "white",
fontface = "bold") +
labs(title = "Répartition des sinistres par Sexe",
x = "Genre", y = "Nombre de sinistres") +
theme(legend.position = "none")
Analyse comparative H/F : Les données révèlent que les hommes sont impliqués dans 59,3% des sinistres enregistrés, contre 40,7% pour les femmes. Toutefois, pour affiner le risque sans discrimination, il faudrait croiser cette donnée avec le kilométrage annuel pour vérifier si la fréquence au kilomètre parcouru est réellement différente.
# Nombre de sinistres selon le nombre de sinistres antécédents
sinistres_par_ant <- df_final %>%
group_by(claims_ant) %>%
summarise(nb_sinistres = sum(nb_sinistres_total))
ggplot(sinistres_par_ant, aes(x = factor(claims_ant), y = nb_sinistres)) +
geom_col(fill = "#34495E") +
labs(title = "Sinistres selon les antécédents",
x = "Nombre de sinistres passés (Historique)",
y = "Nombre de sinistres actuels (Total)")
Analyse prédictive : En volume absolu, la majorité des sinistres de l’année provient d’assurés sans antécédents, ce qui est logique car ils constituent la base majoritaire du portefeuille. L’historique est un excellent prédicteur du risque. Un assuré ayant déjà eu 1 ou 2 sinistres a une probabilité beaucoup plus forte d’en avoir un nouveau l’année suivante. C’est ce qui justifie l’application du système de Malus.
# Histogramme des contrats avec ou sans option petit rouleur
ggplot(df_final, aes(x = ct_km, fill = ct_km)) +
geom_bar() +
scale_fill_manual(values = c("gray", "orange")) +
labs(title = "Répartition Option Petit Rouleur",
x = "Option souscrite (O/N)", y = "Nombre de contrats")
Analyse de l’option : L’option “Petit Rouleur” concerne environ 20% du portefeuille actuel, la grande majorité des assurés restant sur des contrats classiques. Ce taux modéré suggère un potentiel de développement important, notamment via le ciblage des assurés dont le kilométrage réel a diminué ces dernières année avec l’impact du télétravail.
Nous croisons les données pour identifier les segments déficitaires.
# Identification des véhicules à risque élevé
# On définit le risque par la fréquence (Nb sinistres / Nb contrats)
risque_vehicule <- df_final %>%
group_by(vh_segment) %>%
summarise(
nb_contrats = n(),
nb_sinistres = sum(nb_sinistres_total),
frequence = nb_sinistres / nb_contrats
) %>%
arrange(desc(frequence))
ggplot(risque_vehicule, aes(x = reorder(vh_segment, frequence), y = frequence)) +
geom_col(fill = "#27AE60") +
coord_flip() +
geom_text(aes(label = percent(frequence, 0.01)), hjust = -0.1) +
labs(title = "Véhicules à risque élevé",
subtitle = "Classement par fréquence de sinistre",
x = "", y = "Fréquence (Sinistres / Contrats)") +
scale_y_continuous(labels = percent)
Analyse de la fréquence par segment : L’analyse révèle une homogénéité de la fréquence de sinistre entre les principaux segments : Citadines, Compactes et SUV affichent tous un taux proche de 11,2%. Seul le segment Familiale se distingue par une sinistralité légèrement plus faible avec un taux à 10,91%. Cette quasi-égalité implique que le segment commercial n’est pas un levier pertinent pour segmenter le risque fréquence. La différenciation tarifaire entre ces véhicules devra donc reposer essentiellement sur le coût moyen des réparations et non sur la probabilité d’accident.
# Carte des zones géographiques à risque
geo_risk <- df_final %>%
group_by(departement) %>%
summarise(
nb_sinistres = sum(nb_sinistres_total),
nb_contrats = n(),
frequence = nb_sinistres / nb_contrats
) %>%
filter(nb_contrats > 100) %>%
arrange(desc(frequence)) %>%
slice(1:15)
ggplot(geo_risk, aes(x = reorder(departement, frequence), y = frequence)) +
geom_col(fill = "firebrick") +
coord_flip() +
labs(title = "Zones Géographiques à Risque (Top 15)",
subtitle = "Départements avec la plus forte fréquence de sinistre",
x = "Code Département", y = "Fréquence") +
scale_y_continuous(labels = percent)
Analyse territoriale : Le classement fait apparaître une forte sinistralité dans le Loiret (45), suivi par le Rhône (69) et la Seine-et-Marne (77), avec des fréquences dépassant les 12%. Ce Top 15 mêle des zones à forte densité urbaine (Lyon, Ile-de-France) propices aux chocs matériels fréquents, et des départements plus ruraux. Cette hétérogénéité justifie pleinement l’application d’un zonier tarifaire pour ajuster la prime au lieu de garage du véhicule.
L’étude des données sur la période 2019–2023 permet de dégager plusieurs constats sur la situation du portefeuille ENSAssuRances :
Pour améliorer la rentabilité du portefeuille et limiter les risques de dégradation future, voici des idées d’actions à mener :
Ajustement tarifaire
Action commerciale et prévention
Pilotage Technique
Date de génération du rapport : 17/02/2026 à 01:09