Cet exercice fait suite à l’exercice Visualiser des données avec R (1). Il présuppose que vous avez chargé les données et créé les variables de cet exercice précédent, faute de quoi les scripts R ci-dessous ne fonctionneront pas.

De 1 dimension à 0 dimensions: le nombre unique qui résume les données

Réduisons d’abord nos données en un seul point, en réduisant une série de nombres en un seul nombre. Un nombre unique peut, en effet, être considéré comme un point dépourvu de dimension.

Moyenne, écart type, corrélation etc.

summary(langues$germanophones)
# Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
# 0.00000 0.09091 0.78918 0.58595 0.92976 1.00000 
sd(langues$germanophones) # écart-type des germanophones
# 0.3965477
sd(langues$germanophones)/mean(langues$germanophones) # variance des germanophonnes
# 0.6767584
cor.test(langues$germanophones, langues$francophones) # test de corrélation entre la proportion de francophones et de germanophones
# Pearson's product-moment correlation
# 
# data:  langues$germanophones and langues$francophones
# t = -87.391, df = 2768, p-value < 2.2e-16
# alternative hypothesis: true correlation is not equal to 0
# 95 percent confidence interval:
#  -0.866326 -0.846491
# sample estimates:
#        cor 
# -0.8567249

Comme on pouvait s’y attendre, il y a une corrélation négative significative à alpha < 0.00001 entre le proportion de francophones et de germanophones en Suisse.

Test du Chi2

Ce petit exemple se base sur des  données catégorielles fictives que l’on crée dans un premier temps. Ensuite on obtient la p-value du Chi2.

voting <- cbind(
c(rep("Femme",600), rep("Homme",400)),
c(rep("Republican",250),rep("Democrat",300),rep("Independent",50),rep("Republican",200),rep("Democrat",150),rep("Independent",50))
)
colnames(voting) <- c("Genre","Parti")

tbl = table (voting[,1],voting[,2]) # construct contingency table from raw data
tbl
addmargins(tbl)
chisq.test(tbl)
# X-squared = 16.204, df = 2, p-value = 0.000303 -> selon la p value, il est à 99% sur qu'il y un lien entre sexe et parti
ct <- chisq.test(tbl, rescale.p = TRUE)
ct$expected

De n dimensions à 2 dimensions

Lignes et surfaces de régression

orthogonal_regression


Il existe des régressions ordinaires et des régressions orthogonales. Voici quelques régressions ordinaires en 3 dimensions:

# surface simple
splot <- scatterplot3d(langues.scaled$germanophones,langues.scaled$francophones,langues.scaled$italophones,xlab="germanophones",ylab="francophones",zlab="italophones",type="h",color="blue")
regression.plane <- lm(langues.scaled$germanophones ~ langues.scaled$francophones+langues.scaled$italophones)
splot$plane3d(regression.plane)

# scatter3d avec des surfaces de régression
scatter3d(germanophones ~ francophones + italophones, data=langues.scaled[,1:3],surface=F, point.col="black")
scatter3d(germanophones ~ francophones + italophones, data=langues.scaled[,1:3],fit="linear", point.col="black")
scatter3d(germanophones ~ francophones + italophones, data=langues.scaled[,1:3],fit="quadratic", point.col="black")

Analyse en composantes principales

pc2.langues <- prcomp(langues.scaled)

eigen3d1 <- pc2.langues$rotation[1:3,1]
eigen3d2 <- pc2.langues$rotation[1:3,2]
eigen3d3 <- pc2.langues$rotation[1:3,3]
center <- pc2.langues$center

biplot(pc2.langues,expand=3,xlim=c(-0.1,0.1),ylim=c(-0.1,0.1)) # with labels
biplot(pc2.langues,expand=2,xlim=c(-0.05,0.05),ylim=c(-0.05,0.15),xlabs=rep("●", nrow(langues.scaled))) # only dots

# fitting the projection planewith eigenvectors
spheres3d(langues.scaled$germanophones,langues.scaled$francophones,langues.scaled$italophones,radius=0.01,color="blue")
axes3d()
title3d(xlab="germanophones",ylab="francophones",zlab="italophones")
#Render the plane. NB: when you plot a plane using planes3d(a, b, c, d, alpha=0.5), you are effectively saying "Plot a point for every x, y and z that satisfies this equation.": a x + b y + c z + d = 0. Therefore d=-(ax+by+cz), and xyz should be the center of my plot. Moreover, abc are coordinates of the NORMAL to the desired plane, which is the third eigenvector in our case (we want the firts two dimensions). It doesn't totally work with prcomp. There is an imprecision, the eigenvectors are not perfectly orthogonal (if they were the crossproduct would be 0):
a = eigen3d3[1]
b = eigen3d3[2]
c = eigen3d3[2]
d = -(a*center[1]+b*center[2]+c*center[3])
planes3d(a,b,c,d, alpha=0.4)

Clustering ascendant hiérarchique

d <- dist(as.matrix(langues.scaled))
hc <- hclust(d)
library("ggdendro")
ggdendrogram(hc, rotate = FALSE, size = 2)

Combiner le clustering et l’analyse en composantes principales

Utiliser les clusters obtens comme couleurs pour la visualisation finale de l’analyse en composantes principales

groups <- as.data.frame(as.character(cutree(hc,7)))
colnames(groups) <- c("clus7")
pc1 <- pc2.langues$x[,1] # luckily the PCA coordinates results are also in the same order as original data
pc2 <- pc2.langues$x[,2]
langues.groups <- cbind(langues,pc1,pc2,groups)

ggplot(langues.groups, aes(x=pc1, y=pc2)) +
geom_point(aes(size=population_totale^(0.5),color=clus7,alpha=0.8)) +
scale_size_continuous(range = c(1,15),name="population") +
xlab("composante principale 1") +
ylab("composante principale 2") +
ggtitle("Locuteurs dans les communes suisses")
Analyse en compostantes principales pour les langues parlées en Suisse.
Analyse en composantes principales pour les langues parlées en Suisse.

One reply on “Visualiser des données avec R (2): réductions dimensionnelles, clustering, composantes principales”

Comments are closed.