Académique Documents
Professionnel Documents
Culture Documents
2017-2018
Remerciements
Tout d’abord, nous tenons à exprimer notre plus grande reconnaissance à Monsieur Nabil RA-
CHDI - responsable Data Science au sein du cabinet Actuaris et tuteur de notre bureau d’étude - pour
sa disponibilité, son attention en particulier lors de nos entretiens téléphoniques, ainsi que pour ses
nombreux conseils qui nous ont permis d’avancer dans notre travail.
Par ailleurs, nous souhaitons tout particulièrement remercier Monsieur Franck VERMET - direc-
teur des études de l’EURIA, responsable de l’encadrement des bureaux d’étude, enseignant chercheur
et également tuteur de notre bureau d’étude - ainsi que Monsieur Pierre AILLIOT - enseignant cher-
cheur - pour l’aide et les indications qu’ils nous ont apportées au cours de nos recherches lors des
différentes étapes de notre travail.
Enfin, nous adressons nos remerciements à Monsieur Anthony NAHELOU pour les conseils com-
plémentaires qu’il a pu nous donner lorsque cela était nécessaire.
1 Introduction 7
2 Open Data 8
2.1 Contexte général . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.1.1 Définition générale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.1.2 Sources de l’Open Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
2.1.2.1 L’intéropérabilité : essence de l’Open Data . . . . . . . . . . . . . . . . . . 9
2.1.2.2 Une grande variété de secteurs sources . . . . . . . . . . . . . . . . . . . . 9
2.2 Exemples d’utilisation d’Open Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3 Bénéfices et répercusions de l’Open Data sur la société . . . . . . . . . . . . . . . . . . . . 10
2.3.1 Les bénéfices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.3.2 Les répercussions sur la vie des citoyens . . . . . . . . . . . . . . . . . . . . . . . . 11
2.4 Ce qu’il faut retenir des Open Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4 La base de données 16
4.1 Importation de la base de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.2 La base de données initiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.2.1 Description . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
4.2.1.1 La sous-base USAGERS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
4.2.1.2 La sous-base VEHICULES . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.2.1.3 La sous-base LIEUX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
4.2.1.4 La sous-base CARACTERISTIQUES . . . . . . . . . . . . . . . . . . . . . . 19
4.2.2 Analyses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.2.2.1 La gravité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.2.2.2 Les quatre sous-bases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
4.3 La nouvelle base de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.3.1 Mise en perspective . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.3.2 Création . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
4.3.2.1 Modification de la sous-base USAGERS . . . . . . . . . . . . . . . . . . . 24
4.3.2.2 Modification de la sous-base VEHICULES . . . . . . . . . . . . . . . . . . 25
4.3.2.3 Modification de la sous-base LIEUX . . . . . . . . . . . . . . . . . . . . . . 26
4.3.2.4 Modification de la sous-base CARACTERISTIQUES . . . . . . . . . . . . . 26
4.3.3 Gestion des valeurs manquantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
4.3.4 Visualisation des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
8 Conclusion 75
A Codes informatiques 76
7.1 Aperçu de la représentation des accidents sur l’année 2016 en France métropolitaine . 73
7.2 Aperçu du nombre de tués en Pointe de Bretagne au cours de l’année 2008 . . . . . . . . 74
Introduction
Au cours de notre année de Master 1 à l’Euro Institut d’Actuariat, des professionnels du domaine
de l’actuariat proposent différents sujets d’étude variés et innovants, accompagnés de probléma-
tiques concrètes. Après le choix d’un sujet, les encadrants professionnels et professeurs assignés nous
guident dans nos travaux de recherche qui ont pour objectif de nous faire découvrir un domaine ac-
tuariel. Le "Bureau d’Etude" est, pour beaucoup d’étudiants, une première expérience de mission de
recherche et permet de tester notre capacité à travailler en groupe. En plus des connaissances ac-
quises et nécessaires lors de nos deux premières années d’études en actuariat, le Bureau d’Etude vise
à nous sensibiliser sur un sujet précis, souvent "inconnu", étendant ainsi notre champ de connais-
sance.
En particulier, notre sujet porte sur l’étude de la sinistralité automobile en France par des mé-
thodes de "Machine Learning". Ce sujet nous a été proposé par le cabinet Actuaris et consiste à ex-
pliquer cette sinistralité au cours des dernières années par des méthodes de prédiction issues de la
"Data Science" ou de l’analyse de données en utilisant des données libres communément décrites
sous le nom d’"Open Data". Il est notifié dans la problématique que la variable à prédire par nos mo-
dèles est le niveau de gravité d’un accident subi par un individu. Les données proposées par Actuaris
sont récupérées sur le site www.data.gouv.fr et sont qualifiées d’Open Data.
Ce sujet est très riche, tant par la diversité des domaines étudiés lors de cette étude (comme la
sinistralité automobile ou l’usage des Open Data) que par l’application de méthodes de Machine
Learning introduites lors de nos cours d’Apprentissage Statistique et de Modèles Linéaires. C’est éga-
lement par ailleurs un sujet d’actualité innovant. En effet, les révolutions numériques et digitales ob-
servées ces dernières années ont pour cause l’explosion de la quantité de données disponibles (d’où
l’appellation anglaise qui qualifie ces données de "Big Data"), mais aussi de défis qui accompagnent
ces évolutions (tels que la protection des données personnelles par exemple). Ces immenses données
vont propulser sur le devant de la scène les techniques de Machine Learning, qui étaient jusqu’alors
difficilement applicables à cause de limitations technologiques, et qui vont permettre aujourd’hui la
mise en place de modèles prédictifs performants.
Après avoir présenté les différentes notions utilisées, notre étude se décomposera en trois étapes
fondamentales présentes dans toutes les études de Data Science. Dans un premier temps, il sera ques-
tion de collecter, analyser et éventuellement modifier les données disponibles. La deuxième étape
consistera ensuite à construire et à expliquer la sinistralité automobile par des modèles prédictifs.
Enfin, il restera à évaluer la qualité de nos modèles et appliquer ces différentes étapes à plusieurs
reprises si nécessaire. Nous compléterons également notre étude par la mise en place d’un outil de
représentation géographique des accidents.
Open Data
Les Open Data ou données ouvertes, sont des données rendues totalement publiques et libres
d’accès et de droit, pouvant être exploitées et réutilisées. Ces "données ouvertes" vont donc permettre
de conduire des études permettant d’approfondir notre connaissance ou compréhension de certains
sujets, et cela dans différents domaines d’activités.
Le terme Open Data désigne un ensemble de données auxquelles tout le monde peut accéder,
utiliser ou partager sans aucune restriction.
Ces trois critères sont essentiels pour l’Open Data car ils permettent l’interopérabilité qui consiste
en la capacité de pouvoir mélanger différents ensembles de données donnant ainsi à différentes en-
treprises et/ou systèmes la possibilité de travailler ensemble.
L’intéropérabilité évoquée ci-dessus est très importante en Open Data car elle donne par la dé-
mocratisation de la donnée, l’opportunité à différentes entités de travailler ensemble créant ainsi des
systèmes d’exploitation plus larges de la donnée. La mise en commun des données qui repose sur la
possibilité de les mélanger librement est nécessaire afin de développer des produits et des services
en plus grande quantité et surtout de meilleure qualité.
Toutefois, cette interopérabilité ne repose pas uniquement sur le partage de données. En effet, les
jeux de données doivent utiliser un langage de programmation commun ou alors un intermédiaire
informatique qui permet de faciliter leur exploitation.
Certaines conditions doivent alors être respectées au moment de la création de données, notam-
ment la certification de la provenance des données publiées, l’indication des caractéristiques qui y
sont liées (nous pouvons par exemple citer la date et l’heure de création des données), ou encore la
garantie de la qualité de l’information...
L’Open Data concerne des informations en provenance de n’importe quelle source d’informa-
tions, dans n’importe quel domaine et sur n’importe quel sujet dès lors que ces données libre d’accès
sont proposées pour un usage gratuit afin que les utilisateurs puissent en tirer un bénéfice, qu’il soit
commercial ou non. La plupart du temps, ces Open Data sont fournies par le gouvernement ou le
secteur public : il peut s’agir de données sur des budgets, des données cartographiques, ou encore de
résultats découlant de recherches scientifiques. Ce ne sont néanmoins pas les seules sources d’Open
Data que l’on peut trouver.
Les Open Data sont généralement des données non personnelles pour des raisons de respect de la
vie privée des individus. Nous pouvons trouver de telles données dans les domaines de la science, de
la cartographie, de l’environnement, de la culture, de l’éducation, de l’économie, du développement,
des affaires, ou encore de la finance. En plus de données chiffrées, nous retrouvons d’autres contenus
comme des images, du texte ou de la musique.
Parmi les collectivités actives, Rennes Métropole est un précurseur avec l’accès gratuit à sa base
de données sur les transports. Par exemple, l’application Androïd ArceauVélo localise sur une carte
les emplacements de supports à vélo proches des utilisateurs. Une autre application, EasyBus, donne
de manière rapide et efficace les horaires de bus sur le réseau de Rennes Métropole.
Comme exemples dans le domaine de la culture, nous pouvons évoquer le partenariat mis en
place entre le Ministère de la Culture et de la Communication, la Bibliothèque nationale de France
(BnF) et la Réunion des musées nationaux et du Grand Palais (Rmn-GP), qui a permis d’élaborer une
offre de parcours géolocalisés à disposition des utilisateurs, proposant de découvrir des œuvres em-
blématiques du patrimoine français accessibles en haute définition. Le contenu de la base de données
est issu des archives de Gallica (BnF) et de celles de la Rmn-GP.
Un dernier exemple d’application dans le domaine de l’environnement, la boussole éco-mobilité
et éco-citoyenneté qui permet de se rendre en un lieu ou établissement de la façon la plus rapide et
écoresponsable possible.
Cette boussole utilise la liste des établissements publics, les données de transport en commun
disponible comme les lignes de bus et de tramway et un utilitaire développée par 3Liz à Montpellier
pour calculer l’itinéraire.
Outre les Open Data, le thème principal de notre étude est la sinistralité automobile en France.
Il est alors nécessaire de comprendre les différentes notions de celle-ci afin d’effectuer notre étude
basée sur les accidents automobiles.
Ainsi, ce chapitre donnera les définitions des différents termes utilisés par la suite, puis fera un
point sur l’historique de la sinistralité automobile en France. Enfin, il discutera des multiples causes
possibles des accidents accompagné de statistiques et de chiffres clés représentatifs.
3.1 Définitions
En 2004, afin de faciliter les comparaisons internationales, en France, le comité interministériel
de la sécurité routière a décidé d’harmoniser les définitions de la gravité dans le fichier des accidents
corporels avec les définitions adoptées par nos principaux voisins européens.
Dans notre jeu de données, la variable à prédire est la variable qui indique le niveau de gravité
de chaque individu présent dans un accident. Cette variable comporte quatre modalités qui sont :
Indemne, Blessé léger, Blessé hospitalisé et Tué. Définissons alors ces différents termes.
— Un accident corporel (mortel et non mortel) de la circulation routière est un accident qui sur-
vient sur une voie ouverte à la circulation publique, qui implique au moins un véhicule, et qui
provoque au moins une victime, c’est-à-dire un usager ayant nécessité des soins médicaux.
Un accident corporel implique un certain nombre d’usagers. Parmi ceux-ci, nous distinguons :
— Les indemnes : impliqués non décédés et dont l’état ne nécessite aucun soin médical
— Les victimes : impliqués non indemnes.
Nous remarquons que le nombre de morts diminue naturellement tous les ans, et que l’ajout de
système de sécurité routière comme les radars automatiques ne semblent pas contribuer à la dimi-
nution de la mortalité automobile.
Le nombre d’accidents corporels recensés par les pouvoirs publics est en baisse de 2, 7% en 2015
par rapport à 2014. Alors que les blessés légers représentent la majorité des sinistres corporels (envi-
ron 71%), leur indemnisation ne représente que 5% de l’ensemble des indemnités versées. A contra-
rio, les blessés les plus graves ne représentent que 2% des sinistres corporels, soit environ 3 000 blessés
par an pour 58% de la charge des indemnités versées.
En 2016, la France a compté 57 522 accidents corporels, ce qui a provoqué la mort de 3 477 per-
sonnes. Selon les chiffres collectés par l’Observatoire National de la Sécurité Routière (ONISR), le
nombre de blessés s’élève à 72 645 personnes, dont 27 187 ont été hospitalisés.
Téléphone au volant Ce facteur n’est pas comptabilisé dans les statistiques d’accidents.
Mais téléphoner au volant multiplie par trois le risque d’accident cor-
porel. Et un accident corporel sur dix est lié à l’usage du téléphone.
Présence d’un obstacle Facteur présent pour les accidents occasionnant 35% des tués.
fixe
Fatigue et somnolence Le facteur « malaise fatigue » apparaît dans 9% des décès sur l’en-
au volant semble du réseau et pour 18% des tués sur l’autoroute. Ce risque ap-
paraît de jour comme de nuit.
Conduite sous influence 23% des décès surviennent dans des accidents impliquant un
du cannabis conducteur contrôlé positif aux stupéfiants. Conduire après avoir
consommé du cannabis multiplie par deux le risque d’être respon-
sable d’un accident mortel. Le risque est multiplié par quatorze en
cas de consommation conjointe de cannabis et d’alcool.
Conduite sans permis / 4% des accidents mortels impliquent un conducteur n’ayant pas le
avec permis inadapté / permis valide, en grande majorité (les 3/4) n’ayant pas de permis. Et
sans assurance 4% des accidents mortels impliquent un véhicule sans assurance.
La base de données
Pour effectuer une étude prédictive en Machine Learning, une base de données est nécessaire.
Comme évoqué en introduction, nous utiliserons dans cette étude des données Open Data ou
libres d’accès. Notre première source de données est le site www.data.gouv.fr, qui est la principale
plate-forme ouverte de données publiques françaises. Lorsque l’on effectue une étude à l’aide d’Open
Data, les données brutes récoltées nécessitent un traitement préalable, car elles correspondent rare-
ment à nos besoins et ne sont pas créées pour une utilisation en particulier.
Ce traitement consiste en la recherche de valeurs manquantes, de variables ou valeurs aberrantes
ou non significatives, et souvent en fonction de l’objectif final recherché, à compléter la base de don-
née initiale par d’autres variables issues d’autres bases de données. Nous voyons ici un avantage non
moindre des Open Data, puisque la modification des données est possible sans restriction de copy-
right (droits d’auteurs), à condition que ces données soient de bonne qualité.
Des analyses descriptives de notre jeu de données ont ensuite été réalisées afin de relever de pre-
mières informations sur la sinistralité automobile, avant même la mise en place de modèles de pré-
diction.
— La rubrique USAGERS qui décrit les individus victimes de l’accident avec 11 variables.
— La rubrique VEHICULES qui décrit les véhicules impliqués dans l’accident avec 8 variables.
— La rubrique CARACTERISTIQUES qui décrit les circonstances générales de l’accident avec 15
variables.
— La rubrique LIEUX qui décrit le lieu de l’accident avec 17 variables.
Chaque accident est représenté par un numéro appelé Num_Acc permettant de l’identifier dans
les différentes bases.
Variables qualitatives :
— num_veh : Identifiant du véhicule repris pour rattacher chaque usager au véhicule associé (y
compris les piétons qui sont rattachés aux véhicules qui les ont heurtés)
— place : Permet de situer la place occupée dans le véhicule par l’usager au moment de l’accident
— catu : Catégorie d’usager entre conducteur, passager, piéton
— grav : Gravité de l’accident pour chaque usager
— sexe : Sexe de l’usager
— trajet : Motif du déplacement au moment de l’accident
— secu : Indique l’existence et/ou l’utilisation d’un équipement de sécurité
— locp : Localisation du piéton par rapport au passage piéton et description des conditions de
traversée de la route
— actp : Action du piéton
— etatp : Précise si le piéton victime était seul ou non au moment de l’accident
Variable quantitative :
Variables qualitatives :
— num_veh : Identifiant du véhicule repris pour chacun des usagers occupant ce véhicule y com-
pris les piétons qui sont rattachés aux véhicules qui les ont heurtés
— senc : Sens de circulation
— catv : Catégorie du véhicule
— obs : Définit l’obstacle dans le cas où le véhicule a heurté un obstacle fixe
— obsm : Définit l’obstacle dans le cas où le véhicule a heurté un obstacle mobile
— choc : Point de choc initial sur le véhicule
— manv : Manœuvre principale avant l’accident
Variable quantitative :
Variables qualitatives :
— situ : Situation de l’accident (Sur chaussée, Sur bande d’arrêt d’urgence, Sur trottoir. . . )
— env1 : Indique si l’accident s’est produit à proximité d’une école
Variables quantitatives :
Variables qualitatives :
Variables quantitatives :
Ainsi, ces données décrivent de manière relativement précise chaque accident recensé.
4.2.2 Analyses
4.2.2.1 La gravité
Une première analyse de notre base de données à été de regarder l’évolution de la proportion des
modalités de la gravité sur la période 2005-2016.
F IGURE 4.5 – Evolution de la proportion des modalités de la gravité des accidents entre 2005 et 2016
Nous remarquons que la proportion relative à la gravité est quasiment constante au cours du
temps. Ainsi, nous avons décidé de merger les données par année.
— La sous-base USAGERS :
On observe principalement trois variables qui ont plus de 80% de valeurs manquantes : locp,
etatp, actp. Ce n’est pas étonnant de retrouver ces variables exclusivement réservées aux piétons, car
la proportion de piétons accidentés est très faible par rapport à la proportion des usagers accidentés.
Ils ne représentent que 8, 5% des usagers.
— La sous-base VEHICULES :
— La sous-base CARACTERISTIQUES :
— La sous-base LIEUX :
Ici, le graphique de droite est manquant, car le logiciel R n’est pas en mesure d’afficher un nombre
trop conséquent de variables.
4.3.2 Création
Rappelons que dans bon nombre d’études statistiques, il est courant de voir les données man-
quantes d’une variable remplacées par une moyenne lorsqu’elle est quantitative et par le mode de
celle-ci lorsqu’elle est qualitative. Le logiciel R, par exemple, dans la méthode d’analyse des compo-
santes principales, adopte cette méthodologie lorsqu’elle observe des données manquantes dans un
jeu de données. Cette méthode d’imputation par la moyenne ou le mode, ou encore le fait de rem-
placer des valeurs manquantes par des zéros, est susceptible d’altérer l’information contenue dans la
base de données. En effet, la corrélation entre les variables peut être modifiée.
Ainsi, il ne nous semblait pas pertinent d’utiliser cette méthode d’imputation dans notre étude.
Le retraitement des variables contenant des valeurs manquantes sera explicité dans la partie "Gestion
des valeurs manquantes".
D’autre part, pour les variables ayant trop de modalités, nous avons trouvé judicieux de les re-
grouper en classes pour faciliter la compilation des algorithmes ainsi que l’interprétation de ceux-ci.
Nous avons aussi rassemblé en une seule variable, des variables ayant des informations complémen-
taires comme la variable moment_accident, qui a été créée à partir des variables jour, mois, année
et heure.
De plus, notre base de données, malgré le fait qu’elle nous permette de décrire plus ou moins
précisément un accident, peut être enrichie par des données externes. Il est en effet possible à partir
des codes département et commune donnés dans la base de données, de reconstituer le code INSEE,
qui va ensuite nous permettre de rajouter des variables telles que la population, la superficie, le nom
de commune du lieu d’accident...
Pour finir, selon l’utilisation de la base de données, nous avons supprimé certaines variables.
Variables qualitatives :
— grav : Même variable que dans la base initiale (4 modalités)
— sexe : Même variable que dans la base initiale (2 modalités)
— trajet : Même variable que dans la base initiale (6 modalités)
— secu : Passage de 25 à 3 modalités
— condu_seul : Variable créée indiquant si le conducteur était seul au moment de l’accident (2
modalités)
Variables quantitatives :
— age : Création de classes d’âge (12 modalités)
— nb_pers : Variable créée recensant le nombre de victimes par accident (62 modalités)
— taux_secu : Variable créée représentant le score de sécurité de l’usager entre 0 et 1 (132 moda-
lités)
Variables qualitatives :
— catv : Passage de 33 à 4 modalités
— choc : Passage de 10 à 3 modalités
— manv : Passage de 25 à 5 modalités
— obstacle : Passage de 17 à 6 modalités
Variable quantitative :
— nb_veh : Variable créée recensant le nombre de véhicules en collision (28 modalités)
Variables qualitatives :
— catr : Même variable que dans la base initiale (7 modalités)
— circ : Même variable que dans la base initiale (5 modalités)
— vosp : Passage de 4 à 2 modalités
— prof : Passage de 5 à 3 modalités
— plan : Même variable que dans la base initiale (5 modalités)
— surf : Passage de 10 à 6 modalités
— situ : Passage de 6 à 3 modalités
Variables qualitatives :
— lum : Même variable que dans la base initiale (5 modalités)
— agg : Même variable que dans la base initiale (2 modalités)
— int : Passage de 10 à 6 modalités
— atm : Passage de 10 à 5 modalités
— col : Passage de 8 à 3 modalités
— com : Même variable que dans la base initiale (925 numéros de communes concernées)
— dep : Même variable que dans la base initiale (101 modalités)
— moment_accident : Variable créée recensant la date et l’heure de l’accident (variable date)
— nom_commune : Variable créée indiquant le nom de la commune où s’est déroulé l’accident
(27885 communes concernées)
— department_name : Variable créée indiquant le nom du département où s’est déroulé l’acci-
dent (101 modalités)
— region_name : Variable créée indiquant le nom de régions où s’est déroulé l’accident (18 mo-
dalités)
Variable quantitative :
— wsemaine : Variable créée indiquant si l’accident a eu lieu en semaine ou durant le week-end
(2 modalités)
— chase : Variable créée indiquant si l’accident est arrivé un week-end d’été (2 modalités)
— heure : Variable créée indiquant à quelle période de la journée l’accident s’est produit (4 mo-
dalités)
— superficie : Variable créée indiquant la superficie de la commune où l’accident s’est produit
( 5096 valeurs uniques)
— population : Variable créée indiquant la démographie de la commune où s’est produit l’acci-
dent (520 valeurs)
Pour rajouter des informations concernant la commune où s’est produit l’accident, nous avons
eu recours à des bases de données externes supplémentaires. Ainsi nous avons pu créer les variables
nom_commune, department_name, latitude, longitude, region_name, superficie, population, la-
titude, longitude de la sous-base CARACTERISTIQUES.
Nous utilisons un graphique en barres pour montrer la répartition des accidents par type d’usa-
gers. Les usagers les plus accidentés sont les conducteurs. Ce résultat n’est pas surprenant, dans le
sens que nous étudions la sinistralité automobile. Cependant, la comparaison entre la proportion de
blessés légers et d’indemnes chez les conducteurs et chez les passagers nous permet d’observer une
différence entre les modalités de ces deux classes : chez les conducteurs, la classe la plus représentée
est la classe des indemnes tandis que chez les passagers et piétons, ce sont les blessés légers. De plus,
chez les piétons, nous pouvons remarquer une très faible proportion d’indemnes, il s’agit de la classe
la moins représentée.
— Age
La classe d’âge la plus accidentée est la classe 20-40 ans, avec un fort taux de mortalité autour de
30 ans. Ce résultat peut être mis en comparaison avec le taux de mortalité en France. En effet, la mor-
talité routière est une des causes importantes de mortalité en France, avec 0.5% de la mortalité due à
des accidents de la route. De plus, le risque de mortalité général augmente de manière exponentielle
à partir de 30 ans, contrairement à la mortalité routière qui baisse après cet âge.
— Sexe
Le nombre de femmes accidentées est de moitié celui des hommes. Le nombre de blessés légers
chez les femmes (125 757), est également de moitié celui des hommes (267 912). De plus, la classe la
plus représentée est la classe des indemnes chez les hommes, alors que chez les femmes, ce sont les
blessé légers.
— Catégorie de véhicule
Nous remarquons que les véhicules à deux roues et les véhicules légers sont les plus accidentés.
— Manoeuvre avant accident
Nous pouvons constater que le nombre d’accidents à l’arrêt (hors stationnement) est plus élevé
que lorsque les conducteur est déporté à droite.
— Catégorie de la route
La plupart des accidents ont lieu sur les voies communales et les routes départementales.
— Surfaces
— Infrastructures
Les accidents ont le plus souvent lieu au niveau des carrefours aménagés et des bretelles d’échan-
geurs. La sécurité au niveau de ces zones peut être améliorée.
— Météo
Cette carte à cases, encore appelée treemap, nous montre que la plupart des accidents ont lieu
en temps normal.
— Heure
Les accidents surviennent en grande partie l’après-midi, plus particulièrement aux heures d’af-
fluence.
Remarque : Il est important de faire attention quant à l’interprétation de ces graphiques et la
déduction d’une quelconque influence de variables sur la sinistralité automobile. Ces analyses des-
criptives sont effectuées sur l’ensemble de notre jeu de données et ne le sont qu’à titre illustratif.
Ainsi le fait que la plupart des accidents aient lieu lors de conditions météorologiques normales ou
encore que les accidents aient lieu en fin d’après-midi ne permettent pas de déduire l’influence de
ces variables sur la sinistralité automobile. Nous savons en effet que le nombre de voitures circulant
aux heures de pointes est nettement plus élevé que celles circulant aux heures creuses. Il faut donc
prendre en compte cet effet "échelle" si l’on veut pouvoir déduire un lien entre la sinistralité automo-
bile et l’heure. De même que la météo, si la plupart des véhicules circulent en temps "normal", il est
alors évident que le nombre d’accidents sous ce temps soit plus élevé que lorsque nous sommes en
temps de pluie forte ou de grêle.
Dans la suite de cette étude, La mise en place des algorithmes de prédiction nous permettrons de
déduire des variables influençant sur la sinistralité automobile.
Dans cette partie, nous présentons les différents packages utilisés sous R qui nous ont servi lors
de l’implémentation des modèles.
5.2.2 Keras
Sur R-Studio, c’est la librairie Keras, qui sert de support a l’implémentation de TensorFlow. Il
s’agit d’une interface facilitant l’implémentation modulaire de réseaux neuronaux complexes. Dé-
veloppée dans l’idée de permettre une expérimentation rapide de modèles, cette librairie supporte
plusieurs bibliothèques d’apprentissage, dont notamment TensorFlow.
Il existe deux méthodes d’implémentation de modèles sous Keras :
— Le modèle sequentiel :
La création d’un réseau neuronal est assez facile dans cette méthode. En effet, un réseau sous ce
modèle est simplement une association de différentes "boites" contenant les paramètres de celui-ci.
C’est celui que nous utiliserons dans notre étude.
— Le modèle de l’API fonctionnelle :
Il permet de construire des modèles plus complexes tels que des modèles à sorties multiples,
des graphes acycliques, ou des modèles à couches partagées. L’implémentation de TensorFlow sous
Keras peut être accélérée si nous possédons une carte graphique assez puissante du type Nvidia.
De même sous Keras, il est possible d’améliorer les performances en utilisant le moteur de Google
(le Google Cloud Machine Learning Engine), qui permet la maximisation du pouvoir prédictif d’un
réseau. Nous ne l’utiliserons cependant pas dans ce projet.
F IGURE 6.1 – Répartition de la gravité avec 4 F IGURE 6.2 – Répartition de la gravité avec 2
modalités modalités
Notre modèle va quant à lui trouver son intérêt du côté de la prévention. En effet, même si l’ac-
tivité d’assurance s’articule autour de la gestion des risques, la prévention est un levier sur lequel les
assureurs peuvent et doivent s’appuyer afin de non seulement améliorer la qualité de leurs services,
mais aussi de conférer des gains à l’ensemble de la collectivité (assurés, pouvoirs publics).
Un autre détail à prendre en compte était que notre base de données contient des variables
connues avant l’accident et des variables connues seulement après l’accident. Quel est dès lors l’in-
térêt d’un modèle prédictif de la sinistralité prenant en compte des informations disponibles après
l’accident ?
L’intérêt purement prédictif d’un tel modèle est limité dans ce cas, mais réside plutôt dans la capa-
cité du modèle à dégager les variables explicatives de la gravité et les interactions entre ces dernières,
et par ailleurs à analyser la fluctuation des résultats prédictifs vis-à-vis de l’absence ou de la présence
de variables connues a posteriori de l’accident.
Nous n’observons pas de fortes relations entre les différentes variables de notre jeu de données,
sauf entre les variables décrivant le même élément comme la variable du taux de sécurité taux_secu
créée qui est corrélée à la variable secu puisqu’elle a été créée à partir de cette dernière, ou encore le
nombre de personnes, qui est lié au nombre d’indemnes. Par la suite, nous choisirons les variables en
fonction du degré d’information qui nous intéresse.
— Base VEHICULES
Nous pouvons ici observer une forte corrélation entre le nombre de véhicules et "obstacle 2" qui
indique une collision avec un véhicule lors de l’accident, "obstacle 1" indiquant une collision avec un
piéton, ainsi que "obstacle 4" indiquant un obstacle fixe, ce qui semble tout à fait normal.
De même, comme précédemment, nous avons les modalités de variables corrélées entre elles.
Nous avons là rien de surprenant.
— Base CARACTERISTIQUES
Là aussi, nous n’observons pas de fortes corrélations entre variables, sauf entre modalités de va-
riables ainsi qu’entre les nouvelles variables et les variables qui ont servi à leur création.
Nous pouvons de plus, noter que ce genre de graphes devient illisible lorsque le nombre de va-
riables est élevé. Nous le garderons alors dans un but purement illustratif.
— Base LIEUX
Dans cette sous-base, nous observons une certaine corrélation entre le régime de circulation
(circ) et la catégorie de route (catr) autour de -23%, ce qui n’est toutefois pas très fort. De même
entre le profil en long de la route (prof) et le tracé en plan (plan) qui décrit la sinuosité de la route,
avec une corrélation autour de 21%.
TP + TN
E xact i t ud e =
TP + FP + T N + FN
TP
P r éci si on =
TP + FP
Nous n’avons pas utilisé cette métrique pour mesurer la qualité de nos modèles. Cette métrique
sert à comprendre comment est construit le Score F1 (que nous définirons un peu plus loin).
TP
Rappel =
TP + FN
6.3.4 Score F1
Le Score F1 (aussi appelé F-score), utilise les notions de précision et de rappel d’un test définies
ci-dessus.
Il s’agit de la moyenne harmonique de la précision et du rappel, pour laquelle un Score F1 atteint
sa meilleure valeur en 1 (précision et rappel parfait) et sa moins bonne valeur en 0.
2 r appel × pr éd i c t i on
Scor e F 1 = 1 1
= 2×
r appel + pr éd i ct i on
r appel + pr éd i c t i on
Notons que le Score F1 ne tient pas compte des vrais négatifs, tout comme la précision et le rappel.
Nous voyons ainsi la limite de ces trois classificateurs.
D’autres classificateurs en tiennent compte, comme par exemple le coefficient de corrélation de
Matthews.
TP
Se =
TP + FN
TN
Sp =
T N + FP
La courbe ROC représente l’évolution de la sensibilité en fonction la spécificité quand nous fai-
sons varier le seuil. Pour évaluer la qualité d’un modèle de prédiction binaire, l’AUC est bon un critère.
Elle est définie comme étant l’aire sous la courbe ROC. Une AUC égale à 1 signifie que le modèle pré-
dictif est parfait, c’est-à-dire qu’il n’y a que des vrais positifs et vrais négatifs, en revanche une AUC
égale à 0.5 signifie que l’affection des classes est faite aléatoirement.
— le lien g, qui fait office de troisième composante, exprime une relation fonctionnelle entre
la composante aléatoire et le prédicteur linéaire. Il spécifie comment l’espérance de Y est liée
au prédicteur linéaire, construit à partir des variables explicatives.
g (E(Yi )) = β0 + β1 x i ,1 + ... + βp x i ,p
g (E(Yi )) = E(Yi )
= µ(x i ,1 , ..., x i ,n )
= β0 + β1 x i ,1 + ... + βp x i ,p
2
Ainsi, Yi ∼ N (β0 + β1 x i ,1 + ... + βp x i ,p , σ ).
x
• pour le modèle GLM Bernoulli : g (x) = l og i t (x) = ln ( 1−x ).
Nous avons alors Yi ∼ B(π(x i ,1 , ..., x i ,p )) avec :
g (E(Yi )) = l og i t (E(Yi ))
π(x i ,1 ,...,x i ,p )
= ln ( 1−π(xi ,1 ,...,xi ,p ) )
= β0 + β1 x i ,1 + ... + βp x i ,p
β0 +β1 x i ,1 +...+βp x i ,p
Nous obtenons donc : P(Yi = 1) = exp( 1+exp(β0 +β1 xi ,1 +...+βp xi ,p ) ).
β0 +β1 x i ,1 +...+βp x i ,p
Finalement, Yi ∼ B(exp( 1+exp(β0 +β1 xi ,1 +...+βp xi ,p ) )).
• pour le modèle GLM Gamma : par défaut, R-Studio utilise le lien g (x) = x1 , mais en tarifi-
cation, le lien classique est g (x) = ln (x).
Nous avons alors Yi ∼ G (α, β(x i ,1 , ..., x i ,p )) avec :
F IGURE 6.8 – Exemple simpliste d’arbre de décision : Trouver la maladie en fonction des symptômes
Les forêts aléatoires peuvent être considérées comme une agrégation d’arbres de décision. Cette
méthode fut introduite par Leo Breinman en 2001, elle se base sur la technique générale du Bagging.
Le Bagging consiste à choisir K sous-ensembles de la base d’apprentissage avec remise, et à construire
un arbre de décision sur chacun d’entre eux. Lors de la prédiction, nous prendrons ainsi la moyenne
des prédictions retournées par chacun des K arbres.
Cependant, dans le Bagging, l’algorithme choisit à chaque noeud la variable qui effectue la meilleure
séparation selon le critère choisi, alors que les forêts aléatoires choisissent la meilleure variable parmi
une sélection aléatoire de q variables parmi les p variables initiales. C’est ce qu’on appelle le Boots-
p p
trapping. Le choix de q est généralement de p pour la classification, et de 3 (arrondis à l’entier
inférieur) pour la régression.
La méthode par forêts aléatoire consiste à faire tourner en parallèle un grand nombre d’arbres de
décisions construits aléatoirement. La construction aléatoires des arbres permet d’obtenir des arbres
décorrélés et donc une faible variance.
1
P[φT (u) = 1] =
1 + exp(− Tu )
Ces premiers travaux de Mac Culloch et Pitts ont donné naissance à l’école connexionniste. Ce
concept fut ensuite mis en réseau avec une couche d’entrée et une couche de sortie par Rosenblatt
(psychologue) en 1957 pour simuler le fonctionnement rétinien. C’est l’origine du perceptron.
— Le perceptron
Le perceptron peut être vu comme le type de réseau de neurones le plus simple. C’est un clas-
sifieur linéaire. Ainsi, la différence avec le modèle de neurone formel est que ce neurone peut « ap-
prendre ». Le perceptron va être capable de classer des entrées et décider si elles correspondent à un
côté ou bien à un autre. C’est la fonction d’activation qui distribue la réponse d’un côté ou de l’autre.
Dans sa version simplifiée, le perceptron est "simple" (mono-couche) et n’a qu’une seule sortie
à laquelle toutes les entrées sont connectées. Les entrées et la sortie sont booléennes. Plus générale-
ment, les entrées peuvent être des nombres réels.
Le perceptron multicouche est un type de réseau neuronal formel organisé en plusieurs couches
au sein desquelles une information circule de la couche d’entrée vers la couche de sortie uniquement.
Il s’agit donc d’un réseau à propagation directe. Chaque couche est constituée d’un nombre variable
de neurones, les neurones de la dernière couche (dite « de sortie ») étant les sorties du système global.
F IGURE 6.11 – Schéma explicatif du fonctionnement d’un perceptron monocouche (1 couche cachée)
— un regroupement des modalités des variables qualitatives, qui a déjà été réalisé précédem-
ment lors de la création de la nouvelle base de données.
Le nombre de paramètres pour la mise en place d’un modèle est très large (plus de 15 paramètres),
même pour un modèle aussi simple que le modèle GLM. Dans la documentation des algorithmes, il
est même conseillé d’utiliser les paramètres par défaut des algorithmes qui, selon le problème auquel
nous faisons face, donnent des résultats satisfaisants.
Il existe des paramètres communs à tous les modèles dans H2O :
— Y : la variable à prédire, ici la variable grav
— X : les variables explicatives, c’est-à-dire toutes les autres variables
6.5.3.2 GLM
6.5.3.4 GBM
Sous le modèle séquentiel, il existe plusieurs types de couches dans un réseau neuronal, et chaque
couche du réseau est paramétrable. Nous avons mis en place un réseau neuronal à 4 couches, dont
une couche d’entrée, 2 couches cachées, et 1 couche de sortie. Nous avons ajouté des couches de
«dropout» qui permettent d’éviter le surapprentissage en ne prenant pas en compte une proportion
de la base d’apprentissage à chaque cycle d’entraînement du réseau. De plus, toujours dans l’optique
d’éviter le surapprentissage, il faut faire attention au nombre d’unités dans les couches cachées, qui
ne doit pas être trop élevé ni trop bas si nous ne voulons pas être non plus en sous-apprentissage.
Avant le paramétrage du réseau, nous allons demander à Keras d’utiliser la bibliothèque Tensor-
Flow grâce à la commande :
— use_condaenv("r-tensorflow",required=T)
Les paramètres communs à toutes les couches sont :
— units : le nombre d’unités dans chaque couche
— kernel_initializer : la méthode d’initialisation de la matrice des poids
— activation : la fonction d’activation
La couche d’entrée, contient juste les données d’entrées. Dans la première couche cachée nous
avons :
— units : 16
— kernel_initializer : uniform
— activation : relu
— input_shape : ncol(x_train_tbl)), le nombre de colonnes de la base d’apprentissage
On ajoute ensuite une couche dropout :
— rate : 0.1, le pourcentage d’observations dans la base d’apprentissage qui n’est pas pris en
compte
Viens ensuite la deuxième couche cachée :
— units : 13
— kernel_initializer : uniform
— activation : tanh
Comme précédemment, nous rajoutons une couche dropout :
— rate : 0.1
Et pour finir, la dernière couche, la couche de sortie :
— units : 1
— kernel_initializer : uniform
— activation : sigmoid
Finalement, les paramètres du compilateur de réseau sous Keras :
— optimizer : adam, l’algorithme d’optimisation
— loss : binary_crossentropy, la fonction de perte binaire, car nous avons un problème de classi-
fication
— metrics : accuracy, la mesure d’évaluation de la qualité du modèle pendant l’apprentissage
On rajoute aussi un paramètres d’arrêt du réseau si les résultats sur la base de validation ne s’amé-
liorent pas après 11 cycles :
— early_stopping <- callback_early_stopping(patience = 11)
Nous présentons les résultats des différents algorithmes, selon les métriques choisies, et sur les
différentes bases de données.
— Sur la base d’apprentissage :
Les courbes ROC obtenues pour nos différents modèles ont des allures quasi-similaires, de la
forme suivante :
Nous pouvons donc voir que les modèles mis en place sont de bonne qualité si nous nous rap-
portons à la définition de l’AUC.
Nous pouvons également visualiser l’historique d’entraînement du réseau neuronal sous Tensor-
flow :
Après 10 cycles d’entraînement, la précision du réseau est de 85%, après 18 cycles d’entraînement,
la courbe de pertes de la base d’entraînement passe légèrement en dessous de celle de validation,
c’est la marque d’un sur-apprentissage. Nous pouvons donc limiter l’entraînement du réseau à ce
nombre de cycles.
Des quatre modèles mis en place, le modèle le plus performant est celui sous TensorFlow, mais
les autres modèles, plus simples, restent néanmoins acceptables. Nous gagnons 3% en termes de
précision par rapport au modèle GLM. De plus si nous prenons en compte la complexité de la mise
en place du réseau neuronal par rapport à celle du GLM en termes de complexité/performance, nous
pouvons dire que le modèle GLM sort gagnant de cette comparaison. C’est une analyse courante en
machine learning.
En effet les modèles les plus performants ne sont pas toujours les plus complexes. Dans certaines
études, les modèles simples ont parfois un rendement similaire par rapport à des modèles plus com-
plexes (c’est le cas ici), et même souvent supérieur. Cependant l’utilité d’un modèle plus complexe
peut se révéler dans son interprétabilité.
Même si le réseau neuronal est loin d’être le réseau le plus interprétable, nous avons utilisé le pa-
ckage LIME (Local Interpretable Model-agnostic Explanations), qui permet d’expliquer localement,
pour toute observation d’un jeu de données, et à partir du modèle mis en place, les variables qui
influent le plus sur la gravité.
Voici ci-dessous les variables les plus influentes de la gravité pour chacun des modèles sous H2O :
— GLM
En bleu, nous observons les variables qui influent positivement la gravité. Par exemple, la catégo-
rie de véhicule 1, soit les véhicules à 2 roues, influent positivement le risque de gravité ; et de manière
contraire, la catégorie obstacle 1, en orange, influe de manière négative la probabilité d’être blessé ou
tué lors de l’accident.
Les coefficients représentés sont les poids prédictifs des données normalisées, et sont inclus uni-
quement à titre informatif (par exemple en comparaison de l’importance relative de variables dans
une forêt aléatoire). Dans ce cas, les coefficients «normaux» sont obtenus à partir des coefficients
standardisés en inversant le processus de standardisation des données (désaxé avec l’ordonnée à
l’origine ajustée par un décalage supplémentaire) afin qu’ils puissent être appliqués aux données
dans leur forme originale.
— Forêts aléatoires
Nous avons le graphe de l’importance des variables dans la construction de la forêt aléatoire. En
effet, celui-ci est déterminé en calculant l’influence relative de chaque variable, en fonction de si elle a
été sélectionnée lors de la division dans le processus de construction de l’arbre, et de combien l’erreur
quadratique (sur tous les arbres construits) s’est améliorée en conséquence.
— GBM
L’importance des variables est déterminée de façon similaire à celle sous les forêts aléatoires.
On peut remarquer que l’interprétation de l’importance des variables pour les variables qualita-
tives, est plus aisée sous les forêts aléatoires, contrairement au GLM qui transforme chaque classe
d’une variable qualitative en une variable unique, mais qui est par conséquent, plus précis au niveau
de l’importance des variables.
Nous utilisons l’ordre d’importance des variables donné par les forêts aléatoires afin de les analy-
ser.
Les variables avec un niveau d’importance au-delà de 15% sont :
— catv
Regardons cette variable, de plus près :
— NB_pers
Les observations au-delà des troisièmes quartiles concernent les accidents survenus avec des
transports en commun.
Le décalage entre les quartiles de la population des indemnes et celle des victimes, soit le troi-
sième quartile des victimes qui est au niveau du deuxième quartile des indemnes, nous montre l’im-
portance du nombre de personnes impliquées dans l’accident, même si la moyenne de personnes
dans les deux catégories est quasiment la même, 2,47 pour les indemnes, et 2,04 pour les victimes.
— obstacle
Nous constatons que lors d’une collision avec un piéton, les usagers de véhicules ont 6,7 fois
moins de chances d’être victime, soit 7% de victimes, en comparaison avec une collision entre deux
véhicules où 46,9% des accidents entraînent des victimes.
— agg
Les accidents hors agglomération sont plus dangereux, ils entrainent plus de victimes que ceux
en agglomération, alors que le nombre d’accidents en agglomération atteint le double du nombre de
ceux qui se sont produits hors agglomération.
— manv
Lorsque la manœuvre avant accident est "déportée", la probabilité d’être victime, soit 75,7%, est
de 3,12 fois celle d’être victime lorsque la manœuvre avant accident est de tourner à droite ou à
gauche.
Il y a également plus de risque qu’un usager soit victime lorsque la manœuvre avant accident est
un dépassement, avec une probabilité de 69,1% des accidents qui engendrent des victimes.
De plus, le nombre d’accidents en tournant, soit un nombre 99 296 accidents, est plus élevé que
le nombre d’accidents lorsque la manœuvre est de rester dans le même sens de circulation, soit 70
900 accidents, alors que nous avons quasiment 2 fois plus de chances d’être victimes lorsque nous
sommes dans le même sens de circulation.
— col
Nous avons seulement 10,1% des accidents qui sont par "collision frontale", avec une probabi-
lité de faire des victimes de 60%, supérieure aux 79,2% des accidents avec une "autre collision" (par
l’arrière, par le coté, en chaines, collisions multiples. . . ), qui ont une probabilité de 43,9% de faire des
victimes.
— densite
Là aussi les quartiles de distribution de la densité de population par rapport à la gravité sont
différents.
En moyenne nous retrouvons moins de victimes dans les communes les plus denses par rapport
aux communes les moins denses.
Cette remarque peut être confirmée par le graphe suivant, si nous segmentons la densité de po-
pulation en 10 classes :
Comme évoqué précédemment, grâce au package LIME, nous allons visualiser l’explication in-
dividuelle pour les 10 premières observations de la base de validation 2016, donnée par le réseau
neuronal dans l’établissement de la prédiction.
Pour ce faire, il a fallu demander à l’explicateur de modèles de nous faire ressortir les 6 variables
qui influent sur le niveau de gravité de chaque individu.
En vert, nous retrouvons les variables qui influent positivement sur l’attribution de la classe pour
chaque observation et en rouge les variables qui influent négativement sur l’attribution de cette
classe.
Nous avons également, en plus de la classe prédite Label et la probabilité de réalisation Probabi-
lity, le pourcentage d’explication donné par l’explicateur Explanation Fit.
La première observation que nous pouvons faire est de remarquer la présence de la catégorie de
véhicule comme premier facteur influent sur le niveau de gravité pour les 10 premières observations.
Après cette première analyse des variables influentes de la gravité, il est important de rappeler que
parmi les variables à notre disposition, nous avions jusqu’à maintenant dans notre jeu de données,
des variables disponibles avant accident et d’autres après accident. Nous allons maintenant retirer
les variables disponibles après accident, puis analyser l’impact de ce retrait sur nos modèles et sur les
variables influentes de la gravité.
Définissons alors les variables disponibles avant accident :
Les variables connues avant accident sont les variables mesurables et déterminables avant acci-
dent, par exemple par un capteur ou tout autre objet connecté, qui est intégré au système du véhicule
permettant de les mesurer, ou encore connu du conducteur avant accident.
Ce sont dans notre cas :
— secu : le niveau de sécurité, soit le port ou non du dispositif de sécurité (système intégré à
l’automobile, ou connu du conducteur)
— densite : la densité de la commune (déterminable par un gps)
— sexe : le sexe du conducteur (connu du conducteur)
— trajet : le trajet (connu du conducteur)
— age : l’âge du conducteur (connu du conducteur)
— condu : variable indiquant si le conducteur est seul ou non (connue du conducteur)
— catv : la catégorie de véhicule (connue du conducteur)
— manv : la manœuvre avant acccident (connue du conducteur)
— lum : les conditions d’éclairage (déterminables par un capteur)
— agg : localisation (déterminable par un gps)
— atm : conditions atmosphériques (déterminables par un capteur)
— jour : le jour (système intégré ou connu du conducteur)
— mois : le mois (connu du conducteur)
— heure : l’heure (connue du conducteur)
— wsemaine : pleine semaine, ou weekend (connu du conducteur)
— chase : période chassé croisé (connue du conducteur)
— catr : catégorie route (déterminable par un gps)
— circ : régime de circulation
— prof : Profil en long décrivant la déclivité de la route (déterminable par un capteur)
— plan : tracé en plan (déterminable par un capteur)
— surf : état de la surface (déterminable par un capteur)
— situ : situation avant accident (connue du conducteur)
Ci-dessous les résultats obtenus pour chacun de nos modèles sur la base de validation 2016 :
TABLE 6.4 – Résultat des nouveaux modèles sur la base de validation 2016
Nous remarquons tout de suite la baisse de qualité de nos modèles. Le modèle obtenu grâce aux
forêts aléatoires est le meilleur modèle de prédiction lorsque les données que nous disposons sont
celles disponibles avant accident. Cette remarque rejoint celle que nous avions faite un peu plus
haut : les forêts aléatoires ont une performance supérieure aux réseaux de neurones sur ce type de
problématique.
Nous pouvons visualiser de nouveau les variables explicatives de la gravité sous les forêts aléa-
toires :
F IGURE 6.26 – Variables explicatives de la gravité par les forêts aléatoires sous le nouveau modèle
Nous observons une décroissance du niveau de gravité par rapport à l’âge. Les 18-20 ans ont un
niveau de gravité très élevé par rapport aux autres groupes et par rapport à la proportion d’accidentés.
— Plan
Cette variable, comme décrite dans le document descriptif des données, décrit la sinuosité de la
route à l’endroit de l’accident. Les informations sont données par rapport au sens de circulation du
premier véhicule décrit. C’est une variable importante pour l’étude des accidents en virage. La pro-
portion d’accidents en courbe est un indicateur typologique classique lors de l’étude d’un réseau ou
d’un itinéraire. Nous observons que les routes en "S" sont les plus dangereuses, avec 71,2% d’acci-
dents entraînant des victimes, alors qu’elles ne représentent que 1,3% des observations. Contraire-
ment aux routes dont la sinuosité est en partie rectiligne, sur lesquelles 76,3% des accidents ont lieu,
la probabilité d’être victime est de 45,7%.
— Heure
Comme également remarqué lors de la visualisation des données, 38,7% des accidents ont lieu en
période d’après-midi, entre 12h et 18h, et la période au cours de laquelle nous avons le moins d’ac-
cidents est pendant le premier quart de la journée (soit entre 00h et 6h du matin) mais les accidents
ayant lieu au cours de cette période entraînent plus de victimes, soit 70,3% de victimes contre 46,3%
de victimes en après-midi.
— Mois
Les périodes estivales engendrent le plus de victimes, soit plus de 50% des accidents en août,
juillet, juin et mai.
Lors du retour des vacances estivales, nous avons aussi 49,9% des accidents qui engendrent des
victimes.
En comparaison avec le mois d’octobre qui compte le plus d’accidents, 71 368 accidents pour
78,9% de victimes.
L’autre objectif de ce bureau d’étude était de mettre en place des cartes interactives de représen-
tation des accidents. Pour cela, nous avons utilisé l’outil 3D Maps permettant de réaliser des cartes
sous Excel à l’aide d’informations géographiques telles que la longitude, la latitude, le département,
et toute information géographique permettant de représenter des lieux. Ces informations sont dispo-
nibles, dans notre jeu de données, dans la sous-base LIEUX.
Ci dessous, la représentation des accidents de l’année 2016 en France métropolitaine :
F IGURE 7.1 – Aperçu de la représentation des accidents sur l’année 2016 en France métropolitaine
F IGURE 7.2 – Aperçu du nombre de tués en Pointe de Bretagne au cours de l’année 2008
Conclusion
Tout au long de cette étude, notre objectif était d’étudier la sinistralité automobile en France avec
des méthodes de Machine Learning en utilisant des Open Data. Nous avons alors choisi d’étudier
la gravité des sinistres automobiles en mettant en place des algorithmes de prédiction sur la variable
grav à partir du jeu de données disponible. Pour cela, nous avons fait un certain nombre d’hypothèses
et de modifications sur les données utilisées. En effet, nous avons d’abord dû retraiter certaines don-
nées, sélectionner les données à utiliser en modifiant la variable cible de départ.
Les résultats obtenus sur les différents algorithmes mis en place nous ont permis de faire ressortir
les différents facteurs influents de cette sinistralité avec une précision que nous pouvons qualifier de
satisfaisante.
Cependant, il aurait été intéressant de comparer la différence de résultats avec d’autres hypo-
thèses, comme :
— l’imputation des valeurs manquantes au lieu d’une suppression de ces dernières, afin d’éva-
luer la perte d’informations résultant de cette suppression ou l’impact de l’imputation sur la
prédiction
— le choix d’une modification de la variable cible en une classe combinée de blessés légers et
de blessés hospitalisés d’une part, et d’autre part d’une classe combinée d’indemnes et de
décédés, puisque la première est plus susceptible d’influer le portefeuille d’un assureur
De plus les données que nous avons utilisées contiennent peu d’informations personnelles telles
que le degré d’alcool des individus accidentés ou encore la vitesse des véhicules avant l’accident, et
cela dans un souci de protection de la vie privée des personnes physiques. Ces données personnelles
nous auraient certainement permis d’améliorer significativement la compréhension de la sinistralité
car celle-ci est la combinaison de facteurs généraux et externes tels que la catégorie des routes ou les
phénomènes météorologiques dont nous avons parlé dans cette étude, ainsi que de facteurs liés au
conducteur et à son comportement.
Cette situation d’informations incomplètes ou partielles est l’un des inconvénients lorsque nous
travaillons avec des données disponibles en Open Data car celles-ci, comme dit précédemment, ne
doivent pas divulguer les informations personnelles des individus. Néanmoins, il est possible pour
un assureur, en accord commun avec ses clients, d’avoir accès à ces informations dites personnelles,
comme cela se fait déjà en assurance automobile même si de façon limitée, avec l’installation de
capteurs, ceci permettant d’adapter la prime en fonction du comportement du conducteur. D’autres
acteurs, tels que les géants du Net encore appelés GAFA, disposent d’un nombre considérable d’in-
formations, comme Google qui mesure la vitesse à laquelle nous circulons lorsque le GPS de notre
téléphone mobile est activé et qui pourrait donc permettre une plus grande compréhension de la
sinistralité.
Pour finir, ce bureau d’études a été une expérience très enrichissante pour nous car il nous a
non seulement permis d’améliorer nos compétences informatiques, mais aussi de toucher à un sujet
d’actualité qui est l’utilisation d’algorithmes de Machine Learning.
Codes informatiques
url = "http://www.data.gouv.fr/fr/datasets/base-de-donnees-accidents-corporels-de-la
-circulation/"
liens = read.csv(url, stringsAsFactors = FALSE)
liens = liens[,1]
View(liens[2,1])
library(stringr)
liens = liens[str_detect(liens,"<a href=https://www.data.gouv.fr/s/resources/")]
liens = liens[str_detect(liens,".csv")]
length(liens)
liens = gsub(c(" <a href="),"",liens)
liens = gsub(">","",liens)
###sous_liens
------------------------------------------------------------------------
##liens de la base véhicule
vehicules_liens = liens[str_detect(liens,"vehicules")]
for(i in seq_along(vehicules_lien)) {
base_vehicule=rbind(vehicule_2005,vehicule_2006,vehicule_2007,vehicule_2008,
vehicule_2009,vehicule_2010,vehicule_2011,vehicule_2012,vehicule_2013,vehicule_2014,
vehicule_2015,vehicule_2016)
base_caracter=rbind(caracter_2005,caracter_2006,caracter_2007,caracter_2008,
caracter_2009,caracter_2010,caracter_2011,caracter_2012,caracter_2013,caracter_2014,
caracter_2015,caracter_2016)
base_lieux=rbind(lieux_2005,lieux_2006,lieux_2007,lieux_2008,lieux_2009,lieux_2010,
lieux_2011,lieux_2012,lieux_2013,lieux_2014,lieux_2015,lieux_2016)
##variable(place)
describe(base_usager$place)
base_usager$place[base_usager$place==0] = NA
##variable(catu)
describe(base_usager$catu) #variable en bon état
##variable(grav)
describe(base_usager$grav) #variable en bon état
##variable(sexe)
describe(base_usager$sexe) #variable en bon état
##variable(an_nais)
describe(base_usager$an_nais) #variable en bon état
##variable(trajet)
describe(base_usager$trajet) #variable en bon état
base_usager$trajet[base_usager$trajet==0] = NA
##variable(secu)
describe(base_usager$secu) #variable en bon état
base_usager$secu[base_usager$secu<11] = NA
##variable(locp)
describe(base_usager$locp)
base_usager$locp[base_usager$locp==0] = NA
##variable(actp)
describe(base_usager$actp)
base_usager$actp[base_usager$actp==0] = NA
##variable(etatp)
##variable(senc)
describe(base_vehicule$senc)
base_vehicule$senc[base_vehicule$senc==0] = NA
##variable(catv)
describe(base_vehicule$catv) #variable en bon état
##variable(obs)
describe(base_vehicule$obs)
base_vehicule$obs[base_vehicule$obs==0] = NA
##variable(obsm)
describe(base_vehicule$obsm)
base_vehicule$obsm[base_vehicule$obsm==0] = NA
##variable(choc)
describe(base_vehicule$choc)
base_vehicule$choc[base_vehicule$choc==0] = NA
##variable(manv)
describe(base_vehicule$manv)
base_vehicule$manv[base_vehicule$manv=="00"] = NA
##variable(occutc)
describe(base_vehicule$occutc)
##variable(lum)
describe(base_caracter$lum) #variable en bon état
##variable(dep)
describe(base_caracter$dep) #variable en bon état
##variable(com)
describe(base_caracter$com) #variable en bon état
##variable(agg)
describe(base_caracter$agg) #variable en bon état
##variable(int)
describe(base_caracter$int) #variable en bon état
base_caracter$int[base_caracter$int==0] = NA
##variable(atm)
describe(base_caracter$atm) #variable en bon état
##variable(col)
describe(base_caracter$col) #variable en bon état
##variable(adr)
describe(base_caracter$adr)
##variable(gps)
describe(base_caracter$gps)
##variable(lat)
describe(base_caracter$lat)
##variable(long)
describe(base_caracter$long)
##variable(catr)
describe(base_lieux$catr) #variable en bon état
##variable(voie)
##variable(v1)
describe(base_lieux$v1) #variable en bon état
##variable(v2)
describe(base_lieux$v2) #variable en bon état
##variable(circ)
describe(base_lieux$circ)
base_lieux$circ[base_lieux$circ==0] = NA
##variable(nbv)
describe(base_lieux$nbv)
base_lieux$nbv = as.numeric(base_lieux$nbv)
base_lieux$nbv[base_lieux$nbv==0] = NA
base_lieux$nbv[base_lieux$nbv>8] = NA
##variable(vosp)
describe(base_lieux$vosp)
base_lieux$vosp[base_lieux$vosp==0] = NA
##variable(prof)
describe(base_lieux$prof)
base_lieux$prof[base_lieux$prof==0] = NA
##variable(pr)
describe(base_lieux$pr)
##variable(pr1)
describe(base_lieux$pr1)
##variable(plan)
describe(base_lieux$plan)
base_lieux$plan[base_lieux$plan==0] = NA
##variable(lartpc)
describe(base_lieux$lartpc)
##variable(larrout)
describe(base_lieux$larrout)
#variable(surf)
describe(base_lieux$surf)
base_lieux$surf[base_lieux$surf==0] = NA
##variable(infra)
describe(base_lieux$infra)
base_lieux$infra[base_lieux$infra==0] = NA
##variable(situ)
describe(base_lieux$situ)
base_lieux$situ[base_lieux$situ==0] = NA
#visualisation
library(treemap)
#base usagers
------------------------------------------------------------------------
#catu
des = base_usager
# irec(des,catu)
## Recodage de des$catu
des$catu <- as.character(des$catu)
des$catu[des$catu == "1"] <- "conducteur"
des$catu[des$catu == "2"] <- "passager"
des$catu[des$catu == "3"] <- "piéton"
des$catu[des$catu == "4"] <- "piéton en roller (ou trotinette)"
des$grav <- as.character(des$grav)
des$grav[des$grav == "4"] <- "Blessé léger"
des$grav[des$grav == "3"] <- "Blessé Hospitalisé"
des$grav[des$grav == "1"] <- "Indemne"
des$grav[des$grav == "2"] <- "Tué"
colnames(des)[colnames(des)=="grav"] = "gravité"
g <- ggplot(des, aes(catu))
g+geom_bar(aes(fill = gravité), position = position_stack(reverse = TRUE)) +
coord_flip() +
theme(legend.position = "top")
#sexe
# irec(des,sexe)
## Recodage de des3$sexe
des$sexe <- as.character(des$sexe)
des$sexe[des$sexe == "1"] <- "Homme"
des$sexe[des$sexe == "2"] <- "Femme"
g <- ggplot(des, aes(sexe))
g+geom_bar(aes(fill = gravité), position = position_stack(reverse = TRUE)) +
coord_flip() +
theme(legend.position = "top")
#base véhicules
------------------------------------------------------------------------
#catv
des = base_vehicule
#manoeuvre
des3 = base_vehicule
# irec(des3,manv)
## Recodage de des3$manv
des3$manv[des3$manv == "01"] <- "Sans changement de direction"
des3$manv[des3$manv == "16"] <- "Tournant à droite"
des3$manv[des3$manv == "13"] <- "Déporté à gauche"
des3$manv[des3$manv == "19"] <- "Traversant la chaussée"
des3$manv[des3$manv == "17"] <- "Dépassant à gauche"
des3$manv[des3$manv == "00"] <- NA
des3$manv[des3$manv == "02"] <- "Même sens, même file"
#base lieux
------------------------------------------------------------------------
des = base_lieux
# irec(des,catr)
## Recodage de des$catr
des$catr <- as.character(des$catr)
des$catr[des$catr == "3"] <- "Route Départementale"
des$catr[des$catr == "2"] <- "Route Nationale"
des$catr[des$catr == "4"] <- "Voie Communale"
des$catr[des$catr == "6"] <- "Parc de stationnement"
des$catr[des$catr == "9"] <- NA
des$catr[des$catr == "5"] <- "Hors réseau public"
des$catr[des$catr == "1"] <- "Autoroute"
des = des$catr
des = as.data.table(des)
des %>%
filter(!is.na(des)) %>%
group_by(des) %>%
summarise(Count = n()) %>%
arrange(desc(Count)) %>%
ungroup() %>%
mutate(des = reorder(des,Count)) %>%
head(10) %>%
#surface
des2 = base_lieux
# irec(des2,surf)
## Recodage de des2$surf
des2$surf <- as.character(des2$surf)
des2$surf[des2$surf == "1"] <- "normale"
des2$surf[des2$surf == "2"] <- "mouillée"
des2$surf[des2$surf == "0"] <- NA
des2$surf[des2$surf == "9"] <- NA
des2$surf[des2$surf == "7"] <- "verglacée"
des2$surf[des2$surf == "8"] <- "corps gras - huile"
des2$surf[des2$surf == "5"] <- "enneigée"
des2$surf[des2$surf == "6"] <- "boue"
des2$surf[des2$surf == "3"] <- "flaques"
des2$surf[des2$surf == "4"] <- "inondée"
des2 = des2$surf
des2 = as.data.table(des2)
des2 %>%
filter(!is.na(des2)) %>%
group_by(des2) %>%
summarise(Count = n()) %>%
arrange(desc(Count)) %>%
ungroup() %>%
mutate(des2 = reorder(des2,Count)) %>%
head(10) %>%
#infrastructures
des3 = base_lieux
# irec(des3,infra)
## Recodage de des3$infra
des3$infra <- as.character(des3$infra)
des3$infra[des3$infra == "0"] <- NA
des3$infra[des3$infra == "5"] <- "Carrefour aménagé"
des3$infra[des3$infra == "4"] <- "Voie ferrée"
des3$infra[des3$infra == "2"] <- "Pont-autopont"
des3$infra[des3$infra == "3"] <- "Bretelle d’échangeur ou de raccordement"
des3$infra[des3$infra == "6"] <- "Zone piétonne"
des3$infra[des3$infra == "1"] <- "Souterrain - tunnel"
# base caractéristiques
------------------------------------------------------------------------
#météo
#conditins atm
des2 = base_caracter
# irec(des2,atm)
## Recodage de des2$atm
des2$atm <- as.character(des2$atm)
des2$atm[des2$atm == "1"] <- "Normale"
des2$atm[des2$atm == "2"] <- "Pluie légère"
des2$atm[des2$atm == "3"] <- "Pluie forte"
des2$atm[des2$atm == "8"] <- "Temps couvert"
des2$atm[des2$atm == "9"] <- NA
des2$atm[des2$atm == "7"] <- "Temps éblouissant"
des2$atm[des2$atm == "6"] <- "Vent fort - tempête"
des2$atm[des2$atm == "4"] <- "Neige-grêle"
des2$atm[des2$atm == "5"] <- "Brouillard-fumée"
## Recodage de des$infra
des2 = des2$atm
describe(des2)
des2 = as.data.table(des2)
des = des2 %>%
filter(!is.na(des2)) %>%
group_by(des2) %>%
summarise(Count = n()) %>%
arrange(desc(Count)) %>%
ungroup() %>%
mutate(des2 = reorder(des2,Count)) %>%
head(10)
treemap(des,
index="des2",
vSize = "Count",
#heure
des3 = base_caracter
des3 = des3$hrmn
des3 = floor(des3/100)
des3[des3==0]=24
des3=as.character(des3)
des3 = as.data.table(des3)
des3 %>%
filter(!is.na(des3)) %>%
group_by(des3) %>%
summarise(Count = n()) %>%
arrange(desc(Count)) %>%
ungroup() %>%
mutate(des3 = reorder(des3,Count)) %>%
head(24) %>%
#packages
library(ade4)
library(lubridate)
library(tidyverse)
library(stringr)
library(questionr)
library(dplyr)
library(data.table)
library("corrplot")
library(caret)
library(h2o)
library(funModeling)
library(ggplot2)
library(ggthemes)
------------------------------------------------------------------------
#retrait des variables inutiles
load("~/BE/files/Data_Final.RData")
data$Num_Acc = NULL
data$vosp = NULL
data$nbv = NULL
data$Nom_commune = NULL
data$departmentName = NULL
#modalité aberrantes
#creation autre situation
data$situ = as.character(data$situ)
data$situ[data$situ=="0"] = "6"
data$situ = as.factor(data$situ)
#MODELES
------------------------------------------------------------------------
#valeur à prédire
data$grav <- as.character(data$grav)
data$grav[data$grav == "1"] <- "Indemne"
data$grav[data$grav == "2"] <- "victime"
data$grav[data$grav == "3"] <- "victime"
data$grav[data$grav == "4"] <- "victime"
data$grav <- as.factor(data$grav)
colnames(data)
colnames(data)[colnames(data)=="grav"] = "gravité"
colnames(data)[colnames(data)=="gravité"] = "grav"
#préparation à la modélisation
------------------------------------------------------------------------
#rajout de l'année comme variable
#préparation à la programmation
------------------------------------------------------------------------
#H2O
localH2O <- h2o.init(nthreads = -1)
h2o.init()
#base apprentissage/test
#accuracy
h2o.accuracy(model)[h2o.accuracy(model)$accuracy==max(h2o.accuracy(model)$accuracy),]
#score f1
h2o.F1(model)[h2o.F1(model)$f1==max(h2o.F1(model)$f1),]
#recall
h2o.recall(model)[h2o.recall(model)$tpr==max(h2o.recall(model)$tpr),]
#AUC
h2o.auc(model)
#base validation
#accuracy
accuracy = h2o.accuracy(h2o.performance(regression.model,newdata = pred))
accuracy[accuracy$accuracy==max(accuracy$accuracy),]
#score f1
F1 = h2o.F1(h2o.performance(regression.model, newdata = pred))
F1[F1$f1==max(F1$f1),]
#recall
h2o.recall(model)[h2o.recall(model)$tpr==max(h2o.recall(model)$tpr),]
#AUC
h2o.auc(h2o.performance(regression.model, newdata = pred))
#graphes
plot(model,timestep = "AUTO", metric = "AUTO")
h2o.varimp_plot(regression.model,10)
#nouveau modèle
regression.model <- h2o.glm( y = y.dep, x = x.dep, training_frame = train,validation_frame = t
# random forest
------------------------------------------------------------------------
colnames(train)
y.dep = 4
x.dep = (1:29)[-4]
#base apprentissage/test
#accuracy
h2o.accuracy(model)[h2o.accuracy(model)$accuracy==max(h2o.accuracy(model)$accuracy),]
#score f1
h2o.F1(model)[h2o.F1(model)$f1==max(h2o.F1(model)$f1),]
#recall
h2o.recall(model)[h2o.recall(model)$tpr==max(h2o.recall(model)$tpr),]
#AUC
h2o.auc(model)
#base validation
#accuracy
accuracy = h2o.accuracy(h2o.performance(rforest.model,newdata = pred))
accuracy[accuracy$accuracy==max(accuracy$accuracy),]
#score f1
F1 = h2o.F1(h2o.performance(rforest.model, newdata = pred))
F1[F1$f1==max(F1$f1),]
#recall
h2o.recall(model)[h2o.recall(model)$tpr==max(h2o.recall(model)$tpr),]
#AUC
h2o.auc(h2o.performance(rforest.model, newdata = pred))
#graphes
plot(model,timestep = "AUTO", metric = "AUTO")
h2o.varimp_plot(rforest.model,10)
#nouveau modèle
rforest.model <- h2o.randomForest(y=y.dep, x=x.dep, training_frame = train,validation_frame =
#graphes
model = h2o.performance(rforest.model,valid=T)
plot(model,timestep = "AUTO", metric = "AUTO")
h2o.varimp_plot(rforest.model,10)
# gbm
------------------------------------------------------------------------
#sélection des variables
colnames(train)
y.dep = 4
x.dep = (1:29)[-4]
#mogèle glm
gbm.model = h2o.gbm(y=y.dep, x=x.dep, training_frame = train,validation_frame = test,distribut
gbm.model
#base apprentissage/test
#accuracy
h2o.accuracy(model)[h2o.accuracy(model)$accuracy==max(h2o.accuracy(model)$accuracy),]
#score f1
h2o.F1(model)[h2o.F1(model)$f1==max(h2o.F1(model)$f1),]
#recall
h2o.recall(model)[h2o.recall(model)$tpr==max(h2o.recall(model)$tpr),]
#AUC
h2o.auc(model)
#base validation
#accuracy
accuracy = h2o.accuracy(h2o.performance(gbm.model,newdata = pred))
accuracy[accuracy$accuracy==max(accuracy$accuracy),]
#score f1
F1 = h2o.F1(h2o.performance(gbm.model, newdata = pred))
F1[F1$f1==max(F1$f1),]
#AUC
h2o.auc(h2o.performance(gbm.model, newdata = pred))
#graphes
plot(model,timestep = "AUTO", metric = "AUTO")
h2o.varimp_plot(gbm.model,10)
#nouveau modèle
gbm.model <- h2o.gbm(y=y.dep, x=x.dep, training_frame = train,validation_frame = test,distribu
#graphes
model = h2o.performance(gbm.model,valid=T)
plot(model,timestep = "AUTO", metric = "AUTO")
h2o.varimp_plot(gbm.model,10)
# tendorflow
------------------------------------------------------------------------
library(keras)
library(reticulate)
library(tensorflow)
library(lime)
library(tidyquant)
library(rsample)
library(recipes)
library(yardstick)
library(corrr)
library(stringi)
use_condaenv("r-tensorflow",required=T)
#données
#verification des données
training$grav = as.character(training$grav)
training$grav[training$grav=="victime"]="1"
training$grav[training$grav=="Indemne"]="0"
training <- training %>%
select(grav, everything())
glimpse(training)
testing$grav = as.character(testing$grav)
testing$grav[testing$grav=="victime"]="1"
testing$grav[testing$grav=="Indemne"]="0"
#variables explicatives
#Predictors
x_train_tbl <- bake(rec_obj, newdata = train_tbl)
x_test_tbl <- bake(rec_obj, newdata = test_tbl)
x_validating_tbl <- bake(rec_obj, newdata = validating_tbl)
x_train_tbl$grav = NULL;x_test_tbl$grav = NULL;x_validating_tbl$grav=NULL
x_train_tbl$age_X.100.110. = NULL;x_train_tbl$age_X.110.120. = NULL
x_test_tbl$age_X.100.110. = NULL;x_test_tbl$age_X.110.120. = NULL
x_validating_tbl$age_X.100.110. = NULL;x_validating_tbl$age_X.110.120. = NULL
glimpse(x_train_tbl);glimpse(x_test_tbl)
#calibration du modele
checkpoint <- callback_model_checkpoint(
filepath = "model.hdf5",
save_best_only = TRUE,
period = 1,
verbose = 1
)
# Predicted Class
yhat_keras_class_vec_train <- predict_classes(object = model_keras, x = as.matrix(x_train_tbl)
as.vector()
yhat_keras_class_vec_test <- predict_classes(object = model_keras, x = as.matrix(x_test_tbl))
#test
estimates_keras_tbl_test <- tibble(
observation = as.factor(y_test_vec) %>% fct_recode(victime = "1", Indemne = "0"),
estimate = as.factor(yhat_keras_class_vec_test) %>% fct_recode(victime = "1", Indemne = "0
class_prob = yhat_keras_prob_vec_test
)
#valid
estimates_keras_tbl_validating <- tibble(
observation = as.factor(y_validating_vec) %>% fct_recode(victime = "1", Indemne = "0"),
estimate = as.factor(yhat_keras_class_vec_validating) %>% fct_recode(victime = "1", Indemn
class_prob = yhat_keras_prob_vec_validating
)
options(yardstick.event_first = FALSE)
#confusion table
confusion_train = estimates_keras_tbl_train %>% conf_mat(observation, estimate)
summary(confusion_train, wide = TRUE)
confusion_test = estimates_keras_tbl_test %>% conf_mat(observation, estimate)
summary(confusion_test, wide = TRUE)
confusion_validating = estimates_keras_tbl_validating %>% conf_mat(observation, estimate)
summary(confusion_validating, wide = TRUE)
#
estimates_keras_tbl_train %>% roc_auc(observation, class_prob)
estimates_keras_tbl_train %>% f_meas(observation, estimate, beta = 1,na.rm=T)
estimates_keras_tbl_test %>% roc_auc(observation, class_prob)
estimates_keras_tbl_test %>% f_meas(observation, estimate, beta = 1,na.rm=T)
estimates_keras_tbl_validating %>% roc_auc(observation, class_prob)
estimates_keras_tbl_validating %>% f_meas(observation, estimate, beta = 1,na.rm=T)
# irec(training_base,catv)
## Recodage de training_base$catv
training_base$catv[training_base$catv == "2"] <- "véhicule léger"
training_base$catv[training_base$catv == "1"] <- "deux roues"
training_base$catv[training_base$catv == "4"] <- "autre véhicule"
training_base$catv[training_base$catv == "3"] <- "véhicule utilitaire"
cross_plot(training_base, input="catv", target="grav")
#nb_pers
plotar(data=training_base, input=c('NB_pers'),target="grav", plot_type = "boxplot")
#obstacle
# irec(training_base,obstacle)
## Recodage de training_base$obstacle
training_base$obstacle <- as.character(training_base$obstacle)
training_base$obstacle[training_base$obstacle == "0"] <- "autre obstacle"
training_base$obstacle[training_base$obstacle == "1"] <- "piéton"
training_base$obstacle[training_base$obstacle == "2"] <- "véhicule"
training_base$obstacle[training_base$obstacle == "3"] <- "animal"
training_base$obstacle[training_base$obstacle == "4"] <- "obstacle fixe seul"
training_base$obstacle[training_base$obstacle == "5"] <- "obstacle fixe + mobile"
training_base$obstacle[training_base$obstacle == "9"] <- "autre obstacle"
cross_plot(training_base, input="obstacle", target="grav")
#agg
# irec(training_base,agg)
## Recodage de training_base$agg
training_base$agg <- as.character(training_base$agg)
training_base$agg[training_base$agg == "1"] <- "Hors agglomération"
training_base$agg[training_base$agg == "2"] <- "En agglomération"
cross_plot(training_base, input="agg", target="grav")
#manv
plotar(data=training_base, input="manv", target="grav", plot_type = "histdens")
# irec(training_base,manv)
training_base$manv <- as.character(training_base$manv)
training_base$manv[training_base$manv == "1"] <- "même sens, même file"
training_base$manv[training_base$manv == "2"] <- "en tournant"
#col
training_base$col <- as.character(training_base$col)
training_base$col[training_base$col == "1"] <- "frontale"
training_base$col[training_base$col == "2"] <- "autre collision"
training_base$col[training_base$col == "3"] <- "sans collision"
cross_plot(training_base, input="col", target="grav")
#densite
plotar(data=training_base, input="densite", target="grav", plot_type = "boxplot")
cross_plot(training_base, input="densite", target="grav",auto_binning = T)
#mois
cross_plot(training_base, input="mois", target="grav")
#age
training_base$age = as.character(training_base$age)
training_base$age[training_base$age=="(10,20]"] = "(18,20]"
cross_plot(training_base, input="age", target="grav")
#plan
# irec(training_base,plan)
## Recodage de training_base$plan
training_base$plan <- as.character(training_base$plan)
training_base$plan[training_base$plan == "0"] <- "Non connue"
training_base$plan[training_base$plan == "1"] <- "partie rectiligne"
training_base$plan[training_base$plan == "2"] <- "en courbe à gauche"
training_base$plan[training_base$plan == "3"] <- "en courbe à droite"
training_base$plan[training_base$plan == "4"] <- "en S"
cross_plot(training_base, input="plan", target="grav")
#heure
cross_plot(training_base, input="heure", target="grav")
#importance visualisation
plot_features(explanation) +
labs(title = "LIME Feature Importance Visualization",
subtitle = "Hold Out (Test) Set, First 10 Cases Shown")
Bibliographie