Données survey

Nous étudions les réponses aux questionnaires de 237 étudiants de l’Université d’Adélaïde. À l’aide des commandes suivantes, charger le package MASS et les données correspondantes :

library("MASS")
data(survey)

Analyse préliminaire des données

help(survey)
summary(survey)

Quelles sont les variables, leur nature ?

Il ne sera pas possible de faire une ACP sur l’ensemble des données du tableau car certaines variables sont qualitatives.

Vous constaterez que le tableau contient des données manquantes, nous allons les supprimer dans un premier temps :

survey.cc <- survey[complete.cases(survey), ]

Combien d’individu contient le tableau survey.cc ?

Visualisation des données

Nous allons nous intéresser uniquement ici aux variables quantitatives WR.Hnd,NW.Hnd et Height. La variable Sex sera considérée également à titre illustratif.

couleur <- ifelse(survey.cc$Sex=="Male",'blue','red')
X = survey.cc[,c("Wr.Hnd","NW.Hnd","Height")]

Nous visualisons dans un premier temps les données.

library("rgl")
plot3d(X, col = couleur)

Que se passe-t’il si nous mettons toutes les données à la même échelle ?

lims = range(X)
plot3d(X, col = couleur, xlim=lims,ylim=lims,zlim=lims)

Centrer et réduire le tableau de données, enregister le nouveau résultat dans un tableau X.sc et tracer le nuage de points.

Ellipsoïde et ACP

À partir de la matrice de corrélation, pour mieux visualiser, nous pouvons définir un intervalle de confiance à 95% (c’est-à-dire que, sous l’hypothèse de gaussianité des données, moins de 5% des données seront en dehors de l’ellipsoïde). Pour calculer la matrice de corrélation

C = cor(X)
C
##           Wr.Hnd    NW.Hnd    Height
## Wr.Hnd 1.0000000 0.9651297 0.6510316
## NW.Hnd 0.9651297 1.0000000 0.6296482
## Height 0.6510316 0.6296482 1.0000000
plot3d(X.sc, type = "s", col = couleur)
plot3d(ellipse3d(C), col = "grey", add = TRUE)

En faisant tourner la figure, chercher le meilleur plan de visualisation des données.

La figure représentée en gris est un ellipsoïde, son plus grand diamètre correspond au premier axe de l’ACP, le moyen diamètre au second axe et le plus petit au troisième axe. Le meilleur plan obtenu est donc celui engendré par les deux premiers axes de l’ACP.

ACP avec FactoMineR

La fonction permettant de faire une ACP avec FactoMineR est PCA(). La commande suivante permet de réaliser une ACP sur le tableau X.sc.

library('FactoMineR')
X.comp = cbind(X,survey.cc$Sex)
res.pca = PCA(X.comp,quali.sup=4,graph=FALSE)
plot(res.pca,habillage=4)

plot(res.pca,habillage=4,axes=c(2,3))

L’option quali.sup=4 permet d’indiquer que la quatrième colonne est une variable qualitative supplémentaire qui ne sera donc pas prise en compte dans le calcul des axes principaux. La fonction PCA() admet aussi d’autres options (ind.sup, quanti.sup,…). La standardisation est faite automatiquement par défaut, pour réaliser une ACP non normée, il faut utiliser l’option scale.unit=FALSE.

Etude des données manquantes

Nous allons pour le moment observer les données manquantes.

summary(survey[,c("Wr.Hnd","NW.Hnd","Height")])
##      Wr.Hnd          NW.Hnd          Height     
##  Min.   :13.00   Min.   :12.50   Min.   :150.0  
##  1st Qu.:17.50   1st Qu.:17.50   1st Qu.:165.0  
##  Median :18.50   Median :18.50   Median :171.0  
##  Mean   :18.67   Mean   :18.58   Mean   :172.4  
##  3rd Qu.:19.80   3rd Qu.:19.73   3rd Qu.:180.0  
##  Max.   :23.20   Max.   :23.50   Max.   :200.0  
##  NA's   :1       NA's   :1       NA's   :28

Installer le package VIM

library("VIM")
aggr(survey[,c("Wr.Hnd","NW.Hnd","Height")])

A l’aide de la fonction summary(), on observe que les variables Wr.Hnd et NW.Hnd ont une seule donnée manquante. Le graphique de droite donné par la fonction aggr() indique que cette donnée manquante correspond au même individu pour les deux variables. Nous allons donc supprimer cet individu de l’étude, car il apporte peu d’information.

ind = complete.cases(survey[,c("Wr.Hnd","NW.Hnd")])
Ximputed = survey[ind,c("Wr.Hnd","NW.Hnd","Height")]
summary(Ximputed)
##      Wr.Hnd          NW.Hnd          Height     
##  Min.   :13.00   Min.   :12.50   Min.   :150.0  
##  1st Qu.:17.50   1st Qu.:17.50   1st Qu.:165.0  
##  Median :18.50   Median :18.50   Median :171.0  
##  Mean   :18.67   Mean   :18.58   Mean   :172.4  
##  3rd Qu.:19.80   3rd Qu.:19.73   3rd Qu.:180.0  
##  Max.   :23.20   Max.   :23.50   Max.   :200.0  
##                                  NA's   :28

La variable Heightcomprend un nombre plus important de données manquantes. Nous allons les imputer par la méthode des k-plus proches voisins.

Ximputed = kNN(Ximputed)
summary(Ximputed)
##      Wr.Hnd          NW.Hnd          Height      Wr.Hnd_imp     
##  Min.   :13.00   Min.   :12.50   Min.   :150.0   Mode :logical  
##  1st Qu.:17.50   1st Qu.:17.50   1st Qu.:165.0   FALSE:236      
##  Median :18.50   Median :18.50   Median :171.0   NA's :0        
##  Mean   :18.67   Mean   :18.58   Mean   :172.1                  
##  3rd Qu.:19.80   3rd Qu.:19.73   3rd Qu.:179.3                  
##  Max.   :23.20   Max.   :23.50   Max.   :200.0                  
##  NW.Hnd_imp      Height_imp     
##  Mode :logical   Mode :logical  
##  FALSE:236       FALSE:208      
##  NA's :0         TRUE :28       
##                  NA's :0        
##                                 
##