Atelier fouille de données

Programming, Data Mining, Road Safety · lab

Voir tous les documents en intelligence artificielle et données

DS 1 : Atelier fouille de données

Hiba CHERIF

Classification des accidents de la route en France pour l’année 2020

Référence des données : https://www.data.gouv.fr/fr/datasets/bases-de-donnees-annuelles-des-accidents-corporels-de-la-

circulation-routiere-annees-de-2005-a-2020/

Importation des données :

library(readxl)

carac =read.csv("C:/Users/hibac/OneDrive/Desktop/DS1 HIBA CHERIF/caracteristiques-2020.csv")

lieu =read.csv("C:/Users/hibac/OneDrive/Desktop/DS1 HIBA CHERIF/lieux-2020.csv")

View(lieu)

View(carac)

Sélection des variables à étudier :

carac_1 = carac[c("Num_Acc","an","lum","agg","atm")]

lieu_1 = lieu[c("Num_Acc","catr","surf")]

Description des variables :

Num_Acc

Numéro d'identifiant de l’accident.

an

Année de l'accident.

lum

Lumière : conditions d’éclairage dans lesquelles l'accident s'est produit :

1 – Plein jour

2 – Crépuscule ou aube

3 – Nuit sans éclairage public

4 – Nuit avec éclairage public non allumé

5 – Nuit avec éclairage public allumé

agg

Localisation :

1 – Hors agglomération

Publicité

2 – En agglomération

atm

Conditions atmosphériques :

-1 – Non renseigné

1 – Normale

2 – Pluie légère

3 – Pluie forte

4 – Neige - grêle

5 – Brouillard - fumée

6 – Vent fort - tempête

7 – Temps éblouissant

8 – Temps couvert

9 – Autre

catr

Catégorie de route :

1 – Autoroute

2 – Route nationale

3 – Route Départementale

4 – Voie Communales

5 – Hors réseau public

6 – Parc de stationnement ouvert à la circulation publique

7 – Routes de métropole urbaine

9 – autre

surf

Etat de la surface :

-1 – Non renseigné

1 – Normale

2 – Mouillée

3 – Flaques

Publicité

4 – Inondée

5 – Enneigée

6 – Boue

7 – Verglacée

8 – Corps gras – huile

9 – Autre

View(carac-1) view(lieu_1)

Création d’une seule dataset à partir de « carac-1 » et « lieu_1 »

library(sqldf) #librairie pour utiliser sql

q1 = "Select * FROM carac_1 inner JOIN lieu_1 ON carac_1.Num_Acc = lieu_1.Num_Acc;"

db = sqldf(q1)

db1 = db[-6] #on va supprimer "Num_Acc" parce qu’il est en double

view(db1)

df = db1[-c(1,2)]

View(df) #j’ai éliminer les deux premières colonnes pour faciliter mon acp)

Statistiques descriptives

Centrer et réduire les variables

centrage_reduction <- function(x){

return((x-mean(x))/sqrt(var(x)))}

#produire un tableau des données centrées et réduites (la colonne 8 est de type caracter)

df.cr <- apply(df,2,centrage_reduction)

#vérifier

apply(df.cr,2,mean)

apply(df.cr,2,var)

Matrice de corrélations

• On remarque la lumière a une très faible corrélation avec les autres variables cela veut dire

que le cause des accidents à cause de la lumière est très faible.

• On remarque une corrélation moyenne entre agg (localisation) et catr (catégorie de route).

• On remarque que atm (atmosphère) a une très faible corrélation avec surf et une corrélation

Publicité

fortement négative avec les autres variables.

• Une faible corrélation entre surface et atm .

graphique - croisement deux à deux

> pairs(df)

Cercle des corrélations (variables actives)

df1.acp <- PCA(df.cr, scale.unit=TRUE, ncp=7, graph=TRUE)

fviz_pca_var(df.acp, col.var="contrib",

gradient.cols = c("#00AFBB", "#E7B800", "#FC4E07"),

repel = TRUE,title="Cercle de corrélation des variables axe 1 & 2",

select.var=list(contrib=10)

Summary(df.acp)

Inertie suivant les axes vectoriels

fviz_screeplot(df.acp, addlabels = TRUE, ylim = c(0, 50),

ylab="Pourcentage de variance expliquee", xlab="Dimensions")

Corrélation variables-facteurs

print(df.acp$var$cor[,1:2],digits=2)

Nuage des individus

K-means pour détecter les groupes :

on va créer une fonction qui va nous retourner la somme des variances pour une valeur de k

variance_kmeans = function(k) {

print(paste0("kmeans k:",k))

cluster <- kmeans(df, k, nstart = 50)

return (cluster$tot.withinss)}

choisir le max de k

max_k = 10

On va réaliser le K-means K de 2 clusters à 10 clusters et on applique la fonction qu’on a créer pour

récupérer les variances

res.variance = sapply(2:max_k, variance_kmeans)

res.variance

Publicité

On associe chaque k à sa variance totale

k_and_variance = data.frame(2:max_k, res.variance)

k_and_variance

Visualisation du résultat

x et y sont les libellés des variables dans le "k_and_variance"

ggplot(k_and_variance, aes(x = X2.max_k, y = res.variance)) +geom_point() +geom_line() +

scale_x_continuous(breaks = seq(1, max_k, by = 1))

On va récupérer les coordonnées surs les axes factoriels 1 et 2

data_clustering = as.data.frame(df.acp$ind$coord)

head(data_clustering)

Et on garder nos coordonnées sur dim 1 et 2

data_clustering = data_clustering[c(1,2)]

head(data_clustering)

Clustering

cluster3 <- kmeans(data_clustering,3, nstart = 100)

cluster4 <- kmeans(data_clustering,4, nstart = 100)

cluster5 <- kmeans(data_clustering,5, nstart = 100)

cluster6 <- kmeans(data_clustering,6, nstart = 100)

clusters size

cluster3$size

cluster5$size

cluster6$size

head(data_plot)

plot clusters

p = data_plot %>% ggplot(aes(x=Dim.1,y=Dim.2,color=as.factor(Cluster)))+geom_point()+

ggtitle("Clusters")

p

Il semble que les accidents causés par le groupe en bleu sont les plus énorme que les autre.