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
Advertisement
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
Advertisement
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
Advertisement
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
Advertisement
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.