310 lines
9.8 KiB
Text
310 lines
9.8 KiB
Text
---
|
|
title: "TP3 - Analayse en Composantes Principales (ACP)"
|
|
date : "3MIC - 2024-2025"
|
|
output:
|
|
html_document:
|
|
toc: true
|
|
toc_float: true
|
|
toc_depth : 4
|
|
number_sections: true
|
|
---
|
|
|
|
```{css,echo=F}
|
|
.badCode {
|
|
background-color: #C9DDE4;
|
|
}
|
|
|
|
.corrO { background-color: rgb(255,238,237); }
|
|
.corrS { background-color: pink; color: black; border: 1px solid red; }
|
|
```
|
|
|
|
```{r setup, echo=FALSE, cache=FALSE}
|
|
library(knitr)
|
|
## Global options
|
|
options(max.print="75")
|
|
opts_chunk$set(echo=TRUE,
|
|
cache=FALSE,
|
|
prompt=FALSE,
|
|
tidy=TRUE,
|
|
comment=NA,
|
|
message=FALSE,
|
|
warning=FALSE,
|
|
class.source="badCode")
|
|
opts_knit$set(width=75)
|
|
```
|
|
|
|
```{r,echo=F, error=F,warning=F}
|
|
library(corrplot)
|
|
library(ggplot2)
|
|
library(gridExtra)
|
|
library(FactoMineR)
|
|
library(factoextra)
|
|
library(reshape2)
|
|
```
|
|
|
|
|
|
# Description des données
|
|
|
|
Les données étudiées dans ce TP ont été recueillies à Rennes dans $112$ stations durant l'été 2001. Les 13 variables observées sont :
|
|
|
|
+ maxO3 : Maximum de concentration d'ozone observé sur la journée en $\mu$gr/m3
|
|
+ T9, T12, T15 : Température observée à 9, 12 et 15h
|
|
+ Ne9, Ne12, Ne15 : Nébulosité observée à 9, 12 et 15h
|
|
+ Vx9, Vx12, Vx15 : Composante E-O du vent à 9, 12 et 15h
|
|
+ vent : orientation du vent à 12h
|
|
+ pluie : occurrence ou non de précipitations
|
|
+ maxO3v : Maximum de concentration d'ozone observé la veille
|
|
|
|
On charge les données, on transforme les variables qualitatives *pluie* et *vent*, et on supprime la dernière variable que l'on n'utilisera pas dans ce TP.
|
|
|
|
```{r,eval=F}
|
|
Ozone<-read.table("Ozone.txt",header=T)
|
|
Ozone$pluie<-as.factor(Ozone$pluie)
|
|
Ozone$vent<-as.factor(Ozone$vent)
|
|
Ozone<-Ozone[,-11]
|
|
summary(Ozone)
|
|
```
|
|
|
|
Ainsi on a un jeu de données composé de $n=112$ individus et $p=12$ variables.
|
|
|
|
```{r,eval=F}
|
|
dim(Ozone)
|
|
```
|
|
|
|
|
|
**Question :** Pour vous familiariser avec le jeu de données, quelques statistiques descriptives ont été programmées. Commentez les résultats.
|
|
|
|
|
|
```{r,eval=F}
|
|
ggplot(melt(Ozone[,-c(11,12)]),aes(x=variable,y=value))+geom_boxplot()
|
|
|
|
g1<-ggplot(Ozone,aes(x=maxO3))+geom_density()
|
|
g2<-ggplot(melt(Ozone[,c(2:4)]),aes(x=value,color=variable))+geom_density()
|
|
g3<-ggplot(melt(Ozone[,c(5:7)]),aes(x=value,color=variable))+geom_density()
|
|
g4<-ggplot(melt(Ozone[,c(8:10)]),aes(x=value,color=variable))+geom_density()
|
|
grid.arrange(g1,g2,g3,g4,ncol=2)
|
|
|
|
ggplot(Ozone, aes(x = pluie)) +
|
|
geom_bar(aes(y = (..count..)/sum(..count..)))+ylab("")+ggtitle("Frequences")
|
|
|
|
quan <- as.vector(table(Ozone$vent))/nrow(Ozone)
|
|
df <- data.frame(group = levels(Ozone$vent),value = quan)
|
|
ggplot(df, aes(x="", y=value, fill=group))+
|
|
geom_bar(width = 1, stat = "identity")+ coord_polar("y", start=0)+ theme(legend.position="bottom")
|
|
```
|
|
|
|
**Question :** Représentez graphiquement les corrélations des
|
|
variables quantitatives (vous pourrez utiliser la fonction `corrplot()`).
|
|
Quelles sont les variables linéairement corrélées (ou non) ?
|
|
|
|
```{r}
|
|
# A COMPLETER
|
|
|
|
corrplot(cor(Ozone[,-c(11,12)]),method="number")
|
|
```
|
|
|
|
|
|
# ACP centrée
|
|
|
|
Dans cette section, on décide de faire une analyse en composantes principales (ACP) sur les données centrées. A l'aide de la fonction `scale()`, centrez les données. Vérifiez que les variables sont bien centrées avec `apply(...,2,mean)`.
|
|
|
|
```{r,eval=F}
|
|
OzoneC<-scale(Ozone[,-c(11,12)],scale=FALSE) # A COMPLETER
|
|
apply(OzoneC,2,mean)
|
|
# on voit bien qu'on a des valeurs moyennes extrêment proche de 0
|
|
```
|
|
|
|
|
|
|
|
## A la main
|
|
**Question **: A l'aide de la fonction `diag()`, créez la matrice de poids $W=\frac 1 n I_n$ et la métrique $M=I_p$.
|
|
|
|
```{r,eval=F}
|
|
n = nrow(OzoneC)
|
|
p = ncol(OzoneC)
|
|
W<- diag(1/n,n)
|
|
M<- diag(1,p)
|
|
W
|
|
M
|
|
```
|
|
|
|
|
|
**Question :** Quelle matrice cherche-t-on à diagonaliser dans ce cadre en ACP ?
|
|
Programmez cette matrice (rappelons que la multiplication matricielle est `%*%`) et diagonalisez-la à l'aide de la fonction `eigen()`.
|
|
|
|
```{r,eval=F}
|
|
Gamma<- t(OzoneC)%*%W%*%OzoneC
|
|
A<-eigen(Gamma)
|
|
A
|
|
```
|
|
|
|
|
|
**Question :** Que représentent les valeurs propres (`A$values`) dans ce cas ? Que représente la somme de ces valeurs propres ? Vérifiez numériquement.
|
|
|
|
```{r,eval=F}
|
|
# A COMPLETER
|
|
# Ce sont les inerties des variables projetées sur les vecteurs propres
|
|
# La somme de ces valeurs propres est l'inertie totale
|
|
sum(A$values)
|
|
# on a I = somme des normes de Xi**2/n = somme des Xij**2 * 1/n = moyenne de tout * p
|
|
mean(OzoneC**2)*ncol(OzoneC)#
|
|
```
|
|
|
|
|
|
**Question :** Calculez les pourcentages (cumulés ou non) d'inertie portés par chaque axe. Combien de composantes principales décidez-vous de retenir ? Vous pouvez vous aider des fonctions `sum()` et `cumsum()`.
|
|
|
|
```{r}
|
|
# A COMPLETER
|
|
x =cumsum(A$values)/sum(A$values)
|
|
x
|
|
```
|
|
|
|
**Question :** Que représentent les vecteurs propres (`A$vectors`) ? Construisez la matrice $C$ des composantes principales et vérifiez que la matrice $C$ est de dimension $n\times p$. Que représentent les coordonnées de la première colonne de $C$ ?
|
|
|
|
```{r}
|
|
# A COMPLETER
|
|
# ce sont les meta-vecteurs
|
|
C = OzoneC%*%A$vectors
|
|
dim(C)
|
|
```
|
|
|
|
|
|
## Avec le package FactoMineR
|
|
|
|
Rassurez-vous, nous avons programmé les étapes de l'ACP à des fins pédagogiques. En pratique, on utilise la librairie `FactoMineR`. Et on s'appuie sur la librairie `factoextra` pour les graphiques.
|
|
|
|
On commence par programmer l'ACP centrée (pas réduite, `scale.unit=F`). On peut déclarer à la fonction `PCA` des variables qualitatives et quantitatives supplémentaires, ainsi que des individus supplémentaires. Ces éléments ne sont donc pas utilisés pour calculer l'ACP mais peuvent être exploités par la suite. Ici, on déclare donc les deux variables qualitatives *pluie* et *vent* supplémentaires. On trace ensuite les valeurs propres avec la fonction `fviz_eig()`.
|
|
|
|
```{r,eval=F}
|
|
respca<-PCA(Ozone,quali.sup=c(11,12),scale.unit = F,graph=F)
|
|
respca$eig
|
|
fviz_eig(respca)
|
|
```
|
|
|
|
|
|
### Etude des individus
|
|
|
|
**Question :** Que contient la sortie `respca$ind$coord$` ? Comparez avec les résultats de la partie précédente ? Vérifiez visuellement à l'aide de la commande `fviz_pca_ind(respca)`.
|
|
|
|
```{r,eval=F}
|
|
respca$ind$coord # ce sont les composantes principales de chaque individu
|
|
fviz_pca_ind(respca,geom=c("point"))
|
|
```
|
|
|
|
**Question :** Que représentent les graphiques suivants ? Commentez.
|
|
|
|
```{r,eval=F}
|
|
fviz_pca_ind(respca,col.ind="contrib",geom=c("point"))
|
|
fviz_pca_ind(respca,geom=c("point"),select.ind = list(cos2=0.95))
|
|
fviz_pca_ind(respca,habillage=11,geom=c("point"))
|
|
fviz_pca_ind(respca,habillage=12,geom=c("point"))
|
|
```
|
|
|
|
### Etude des variables
|
|
|
|
**Question :** On représente le graphique des corrélations entre les variables initiales et les méta-variables. Commentez.
|
|
|
|
```{r,eval=F}
|
|
plot(respca,choix="varcor")
|
|
# Il permet de donner un sens aux nouvelles dimensions, par exemple on voit que le vent et la températures sont positivement corrélées à l'axe 1 et 2 et inversement pour la nebulosité
|
|
# donc l'axe 1 pourrait être
|
|
```
|
|
|
|
**Question :** Afin de visualiser les corrélations des variables initiales avec toutes les méta-variables, utilisez la fonction `coorplot()`. Commentez.
|
|
|
|
```{r,eval=F}
|
|
corrplot(respca$var$cor,method="number")
|
|
```
|
|
|
|
# ACP centrée réduite
|
|
|
|
## A la main
|
|
|
|
On fait maintenant une analyse en composantes principales sur les données centrées et réduites.
|
|
|
|
```{r,eval=F}
|
|
s<-sqrt((n-1)*apply(OzoneC,2,var)/n)
|
|
OzoneCR<-OzoneC%*%diag(1/s)
|
|
```
|
|
|
|
**Question :** Comparez `OzoneCR` avec `scale(Ozone[,-c(11,12)])`.
|
|
|
|
```{r}
|
|
# A COMPLETER
|
|
OzoneCR
|
|
tmp = scale(Ozone[,-c(11,12)])
|
|
tmp
|
|
|
|
# ce sont les memes matrices
|
|
```
|
|
|
|
**Question :** Quelle matrice cherche-t-on à diagonaliser dans ce cadre en ACP ?
|
|
Programmez cette matrice et diagonalisez-la à l'aide de la fonction `eigen()`.
|
|
|
|
```{r,eval=F}
|
|
Gamma2<- t(OzoneCR)%*%W%*%OzoneCR # A COMPLETER
|
|
B<-eigen(Gamma2)
|
|
```
|
|
|
|
**Question :** Que représentent les valeurs propres dans ce cas ? Que représente la somme de ces valeurs propres ? Vérifiez numériquement.
|
|
|
|
```{r,eval=F}
|
|
# Ce sont toujours les inerties mais divisées par la variance de chaque variable = 1
|
|
# C'est toujours l'inertie totale mais divisée par la somme des variance ===> 1 *p = p
|
|
# et cela vaut p car
|
|
sum(B$values)
|
|
mean(OzoneCR**2)*ncol(OzoneCR)
|
|
|
|
```
|
|
|
|
**Question :** Comment peut-on obtenir les résultats de cette ACP centrée réduite à partir du tableau de données centrées. Vérifiez numériquement.
|
|
|
|
```{r,eval=F}
|
|
n = nrow(OzoneC)
|
|
v = apply(OzoneC,2,var)*(n-1)/n
|
|
M = diag(1/v)
|
|
M
|
|
Gamma3 = t(OzoneC)%*%W%*%OzoneC
|
|
D = eigen(Gamma3%*%M)
|
|
```
|
|
|
|
|
|
## Avec FactoMineR
|
|
|
|
**Question :**
|
|
On fait une ACP centrée réduite à l'aide de la fonction `PCA()` de la librairie `FactoMineR` en imposant `scale.unit=T` et on trace les valeurs propres à l'aide de `fviz_eig()` de la librairie `factoextra`. Interprétez les résultats.
|
|
|
|
```{r,eval=F}
|
|
respca2<-PCA(Ozone,quali.sup=c(11,12),scale.unit=T,graph=F)
|
|
respca2$eig
|
|
fviz_eig(respca2)
|
|
```
|
|
|
|
**Question :** Représentez le graphe des individus et celui des variables à l'aide des fonctions `fviz_pca_ind()`et `fviz_pca_ind()` dans le premier plan factoriel. Quelles différences remarquez-vous avec l'ACP centrée ?
|
|
|
|
```{r}
|
|
# A COMPLETER
|
|
fviz_pca_ind(respca2,geom=(c("point")))
|
|
fviz_pca_var(respca2,axes=c(1,3))
|
|
fviz_pca_var(respca2,axes=c(2,3))
|
|
```
|
|
|
|
**Question :** Afin de visualiser les corrélations des variables intiales avec toutes les méta-variables, utilisez la fonction `corrplot()`. Commentez.
|
|
|
|
```{r}
|
|
# A COMPLETER
|
|
corrplot(respca2$var$cor,method="number")
|
|
```
|
|
|
|
**Question :** Poursuivez l'exploitation des résultats en regardant d'autres plans factoriels, en exploitant l'information des variables qualitatives *pluie* et *vent*.
|
|
|
|
```{r}
|
|
# A COMPLETER
|
|
fviz_pca_ind(respca2,axes = c(1,3),geom=c("point"))
|
|
fviz_pca_ind(respca2,axes = c(1,4),geom=c("point"))
|
|
fviz_pca_ind(respca2,axes = c(1,5),geom=c("point"))
|
|
fviz_pca_ind(respca2,habillage=11,geom=c("point"))
|
|
fviz_pca_ind(respca2,habillage=12,geom=c("point"))
|
|
```
|
|
|
|
|