L’ analyse factorielle des correspondances (AFC ou CA pour correspondence analysis en anglais) est une extension de l’analyse en composantes principales pour analyser l’association entre deux variables qualitatives (ou catégorielles).
L’AFC permet de résumer et de visualiser l’information contenue dans le tableau de contingence formé par les deux variables catégorielles. Le tableau de contingence contient les fréquences formées par les deux variables.
L’AFC retourne les coordonnées des éléments des colonnes et des lignes du tableau de contingence. Ces coordonnées permettent de visualiser graphiquement l’association entre les éléments de lignes et de colonnes dans un graphique à deux dimensions.
Ici notre jeu de données concerne notre projet tutoré portant sur les accidents de la route.
Premièrement, nous séléctionnons les bases de données dont nous avons besoin. Ici les deux variables qu’on souhaite analyser ce trouve dans les jeux de données suivants “usagers” et “vehicules”.
m=RPostgres::Postgres()
c=dbConnect(m,dbname="stid1908")
lieux<-dbGetQuery(c,'SELECT * FROM lieux_2014')
usagers<-dbGetQuery(c,'SELECT * FROM usagers_2014')Puis, on fusionne nos différentes bases de données en une seule afin de nous simplifier le travail. Pour cela on utilise la fonction merge(fusion de tables en supprimant les colonnes en double et en regroupant selon la colonne Num_Acc (clé primaire) ~ “jointures Rstudio” )
Ensuite définissons les deux variables choisis :
La variable grav correspond a la gravité de l’accident celle ci se trouve dans la dataframe usagers: Les usagers accidentés sont classés en trois catégories de victimes plus les indemnes qu’on classera ensuite (on a ainsi : 1 - Indemne 2 - Tué 3 - Blessé hospitalisé 4 - Blessé léger )
La deuxième variable est surf qui correspond à l’état de la route,de la surface elle se trouve dans la base de données lieux. (On retrouve ainsi : Etat de la surface 1 - normale 2 - mouillée 3 - flaques 4 - inondée 5 - enneigée 6 - boue 7 - verglacée 8 - corps gras - huile 9 - autre )
Enfin, on se propose de faire une modification sur les deux variables choisis afin de les arranger de la bonne façon.
Acc$grav[Acc$grav==1]<-"Indemne"
Acc$grav[Acc$grav==2]<-"Tué"
Acc$grav[Acc$grav==3]<-"Blessé grave"
Acc$grav[Acc$grav==4]<-"Blessé léger"
Acc$surf[Acc$surf==1]<- "normale"
Acc$surf[Acc$surf==2]<- "mouillée"
Acc$surf[Acc$surf==3]<- "flaques"
Acc$surf[Acc$surf==4]<- "inondée"
Acc$surf[Acc$surf==5]<- "enneigée"
Acc$surf[Acc$surf==6]<- "boue"
Acc$surf[Acc$surf==7]<- "verglacée"
Acc$surf[Acc$surf==8]<- "corps gras -huile"
Acc$surf[Acc$surf==9]<- "autre"On recrée une base de données ne contenant que ces deux variables à l’aide du package dplyr et de la fonction select.
On transforme les variables en variables qualitatives à l’aide de la fonction as.factor que nous avons utilisé dans le TUTO PMBO as.factor.
Afin de commencer cette AFC nous nous proposons de réaliser premierement un tableau de contingence à l’aide du package kableExtra.
Tableau de contingence
Margins computed over dimensions in the following order: 1: 2:| autre | boue | corps gras -huile | enneigée | flaques | inondée | mouillée | normale | verglacée | Total | |
|---|---|---|---|---|---|---|---|---|---|---|
| Blessé grave | 173 | 30 | 61 | 36 | 34 | 18 | 5181 | 20956 | 129 | 26618 |
| Blessé léger | 144 | 18 | 126 | 19 | 59 | 13 | 9434 | 36196 | 127 | 46136 |
| Indemne | 133 | 26 | 67 | 31 | 43 | 25 | 9808 | 41604 | 104 | 51841 |
| Tué | 23 | 3 | 3 | 6 | 4 | 6 | 695 | 2739 | 18 | 3497 |
| Total | 473 | 77 | 257 | 92 | 140 | 62 | 25118 | 101495 | 378 | 128092 |
Nous réalisons ensuite un graphique des contributions.
Graphique des contributions
library(ade4)
n=nrow(X_tab_cont);p=ncol(X_tab_cont)
afc = dudi.coa( X_tab_cont , scannf = F)
kept_axes =afc$nf
contributions=afc$eig/sum(afc$eig)
g=barplot(afc$eig,main="Graphique des contributions",col="seagreen2")
text(g,afc$eig,labels=paste(round(100*contributions,2),"%"),pos=3,xpd=NA)Concernant le graphique des contributions on sait que le nombre total d’axe est la somme du nombre de modalité des 2 variables, dans notre cas, 4+9=13. Or on observe seulement 3 axes dont 2 axes principaux comportant 69%+27%=96% de l’information.
Tableau d’interpretation
library(readr)
nomFic <- read_delim("tableau_interpretation_AFC.csv",
";", escape_double = FALSE, trim_ws = TRUE)
nomFic=nomFic[-6,]
kable(nomFic,"html" )%>% kable_styling(bootstrap_options = "basic")| X1 | poids rel. | CTR inertie | axe 1 | CTR | COS2 | QLT | axe 2 | CTR_1 | COS2_1 | QLT_1 |
|---|---|---|---|---|---|---|---|---|---|---|
| Blessé grave | 20.79 | 2.91 | 1.71 | 60.5 | 1 | 1 | 0.02 | 0 | 0 | 1 |
| Blessé léger | 36.05 | 1.59 | -0.34 | 4.1 | 0.15 | 0.15 | -1.22 | 53.3 | 0.85 | 1 |
| Indemne | 40.46 | 1.41 | -0.73 | 21.5 | 0.59 | 0.59 | 0.94 | 35.8 | 0.41 | 1 |
| Tué | 2.69 | 9.26 | 2.28 | 14 | 0.75 | 0.75 | 2.02 | 11 | 0.25 | 1 |
| NA | poids rel. | CTR inertie | axe 1 | CTR | COS2 | QLT | axe 2 | CTR | COS2 | QLT |
| autre | 0.36 | 124.57 | 11.16 | 44.7 | 1 | 1 | -0.06 | 0 | 0 | 1 |
| boue | 0.06 | 147.89 | 11.2 | 7.3 | 0.93 | 0.93 | 4.75 | 1.3 | 0.07 | 1 |
| corps gras -huile | 0.19 | 172.51 | 2 | 0.8 | 0.05 | 0.05 | -12.98 | 32.8 | 0.95 | 1 |
| enneigée | 0.07 | 238.14 | 13.09 | 11.9 | 0.86 | 0.86 | 8.18 | 4.7 | 0.14 | 1 |
| flaques | 0.11 | 51.05 | 2.97 | 0.9 | 0.33 | 0.33 | -6.5 | 4.5 | 0.67 | 1 |
| inondée | 0.05 | 253.63 | 9.18 | 4 | 0.54 | 0.54 | 13.01 | 8 | 0.46 | 1 |
| mouillée | 19.05 | 1.48 | 0.11 | 0.2 | 0.02 | 0.02 | -1.21 | 28 | 0.98 | 1 |
| normale | 76.97 | 0.17 | -0.13 | 1.2 | 0.2 | 0.2 | 0.39 | 11.8 | 0.8 | 1 |
| verglacée | 0.29 | 100.72 | 9.85 | 27.8 | 0.98 | 0.98 | -1.93 | 1.1 | 0.02 | 1 |
A l’aide d’un vecteur de couleur on crée ainsi deux vecteurs : un vecteur avec des couleurs vertes indiquant les couleurs négatives et un vecteurs avec des couleurs oranges pour les valeurs positives. De plus, en cherchant sur internet on peut trouver un programme permettant de colorier en fonction du résultat les cellules du tableau d’interprétation.
| variable | poids rel. | CTR inertie | axe 1 | CTR | COS2 | QLT | axe 2 | CTR | COS2 | QLT |
|---|---|---|---|---|---|---|---|---|---|---|
| Blessé grave | 20.79 | 2.91 | 1.71 | 60.5 | 1 | 1 | 0.02 | 0 | 0 | 1 |
| Blessé léger | 36.05 | 1.59 | -0.34 | 4.1 | 0.15 | 0.15 | -1.22 | 53.3 | 0.85 | 1 |
| Indemne | 40.46 | 1.41 | -0.73 | 21.5 | 0.59 | 0.59 | 0.94 | 35.8 | 0.41 | 1 |
| Tué | 2.69 | 9.26 | 2.28 | 14 | 0.75 | 0.75 | 2.02 | 11 | 0.25 | 1 |
| variable | poids rel. | CTR inertie | axe 1 | CTR | COS2 | QLT | axe 2 | CTR | COS2 | QLT |
|---|---|---|---|---|---|---|---|---|---|---|
| autre | 0.36 | 124.57 | 11.16 | 44.7 | 1 | 1 | -0.06 | 0 | 0 | 1 |
| boue | 0.06 | 147.89 | 11.2 | 7.3 | 0.93 | 0.93 | 4.75 | 1.3 | 0.07 | 1 |
| corps gras -huile | 0.19 | 172.51 | 2 | 0.8 | 0.05 | 0.05 | -12.98 | 32.8 | 0.95 | 1 |
| enneigée | 0.07 | 238.14 | 13.09 | 11.9 | 0.86 | 0.86 | 8.18 | 4.7 | 0.14 | 1 |
| flaques | 0.11 | 51.05 | 2.97 | 0.9 | 0.33 | 0.33 | -6.5 | 4.5 | 0.67 | 1 |
| inondée | 0.05 | 253.63 | 9.18 | 4 | 0.54 | 0.54 | 13.01 | 8 | 0.46 | 1 |
| mouillée | 19.05 | 1.48 | 0.11 | 0.2 | 0.02 | 0.02 | -1.21 | 28 | 0.98 | 1 |
| normale | 76.97 | 0.17 | -0.13 | 1.2 | 0.2 | 0.2 | 0.39 | 11.8 | 0.8 | 1 |
| verglacée | 0.29 | 100.72 | 9.85 | 27.8 | 0.98 | 0.98 | -1.93 | 1.1 | 0.02 | 1 |
A travers ce tableau d’interprétation on peut voir la proportion de chaque modalité, on observe ainsi qu’environ 41% des accidents de la route se cloturent par des individus qui ressortent indemnes de l’accident. Ou encore que 20% des accidents se produisent sur une route mouillée là ou les accidents ont d’ailleurs le plus de chance de se produire.
A partir de ce tableau on peut réaliser les liens suivants :
- Sur-effectif significatif de personnes tués qui ont eu un accident sur une surface boue et verglacée.
- Sous-effectif significatif de personnes sorti indemnes d’un accident ayant eu un accident sur une surface boueuse ou verglacée.
- Sous-effectifs significatif de personnes ayant eu des blessures légures lors d’un accident sur une surface mouillée.
- Sur-effectifs significatif de personnes ayant eu des blessures légures lors d’un accident sur une surface normale.
Mapping
De même, nous pouvons réaliser un Mapping afin de réprésenter en 2 dimensions les liens sur-effectifs et sous-effectifs.
Pour finir un Mapping récapitulatif de tout les liens.