---
title: "Examen partiel du 8 mars 2021 - Correction de l'exercice 2"
output:
  pdf_document: default
  html_notebook: default
---

```{r setup, include=FALSE}
chooseCRANmirror(graphics=FALSE, ind=1)
knitr::opts_chunk$set(echo = TRUE)
```

<br>
<br>

```{r}
install.packages("DiscriMiner")
```

```{r}
library(ade4)
library(MASS)
library(DiscriMiner)
```

**Question 1**

```{r}
data("fgl")
?fgl
head(fgl)
donnees = fgl[-10]
```
**Question 2**

La première variable donne des décimales d'un indice de réfraction ; les suivantes donnent toutes des pourcentages, mais ont des ordres de grandeurs différents. Par conséquent il vaut mieux ne pas
utiliser la distance euclidienne simple. On peut utiliser la distance euclidienne normalisée, ou
la distance de Mahalanobis.

**Question 3**

```{r}
dissimilarites = c(2,3) # distance euclidienne normalisée ou de Mahalanobis
strategies = c("single", "complete", "average", "ward.D2")
par(mfrow=c(2,4))
for(d in dissimilarites)
{
  diss = dist.quant(donnees, d)
  for(s in strategies)
  {
    cah = hclust(diss, method=s)
    plot(cah, hang=-1)
  }
}
```

Les deux dendrogrammes obtenus avec la stratégie de Ward sont les seuls qui présentent des branches pas trop 
déséquilibrées. On va choisir la dissimilarité de Mahalanobis avec la stratégie de Ward (dengrogramme en bas à droite), car le dendrogramme montre un saut net du critère pour le passage de 5 à 4 classes, ce qui donnera une partition plus intéressante qu'avec la distance euclidienne normalisée (partition en deux classes assez déséquilibrées)

```{r}
diss = dist.quant(donnees, 3)
cah = hclust(diss, method="ward.D2")
plot(cah,hang=-1)
```


**Question 4**

Le saut maximal du critère semble clairement correspondre au passage de 5 à 4 classes. Vérifions le par le calcul. On calcule d'abord tous les sauts successifs du critère :

```{r}
sauts = diff(cah$height)
length(sauts)
```

Il y a 212 sauts du critère, le dernier correspondant à la dernière étape (passage de 2 à 1 classe).
Déterminons à présent la position du saut maximal :

```{r}
which.max(sauts)
```

212-209=3, donc le saut maximal correspond au passage de 5 à 4 classes. On sélectionne donc la partition
en 5 classes :

```{r}
cl = cutree(cah, k=5)
cl
```

**Question 5**

```{r}
table(cl,fgl[,"type"])
```

La partition ne correpond que partiellement à la répartition en tyep de verre : les classes 1 et 2 obtenues
correspondent à peu près aux trois premiers types de verre WinF, WinNF, Veh, tandis que le type Head se retrouve principalement dans les classes 3 et 4. A part cela, les partitions sont assez différentes.

**Question 6**

Calculer directement l'inertie intra classe sur les données supposerait que l'on travaille avec la distance
euclidienne simple ; or on a dit que ce n'était pas un bon choix. Par conséquent on va normaliser les données
auparavant pour faire en sorte de travailler avec les distances euclidiennes normalisées (car les distances euclidienne normalisée correspondent aux distances euclidiennes simples sur les données normalisées). 
N.B. On pourrait également transformer les données pour que le calcul corresponde aux distances de Mahalanobis.

Pour calculer les inerties intra classes on utilise la fonction withinSS, qui renvoie une matrice ; dont il faut en fait prendre la somme des coefficients diagonaux.
```{r}
donnees_normalisees = scale(donnees)
# inertie intra pour la partition obtenue par la CAH :
sum(diag(withinSS(donnees_normalisees,cl)))
# inertie intra pour la partition induite par le type de verre :
sum(diag(withinSS(donnees_normalisees,fgl[,"type"])))
```

On ne peut pas a priori comparer des inerties intra classe pour des partitions n'ayant pas le même nombre de classes. En effet, plus le nombre de classes augmente, et plus l'inertie intra classe a tendance à diminuer (jusqu'à une inertie intra classe égale à 0 pour la partition finale triviale en n classes). Cependant ici on voit que l'inertie intra classe pour la partition en 4 classes induite par la CAH (=1100) est plus petite que  l'inertie intra classe pour la partition en 6 classes par type de verre (=1413). Ceci signifie que la partition par type de verre n'est clairement pas optimale vis à vis du critère de l'inertie intra classe. En choisissant une partition en 6 classes (question suivante) pour la CAH, on s'attend à avoir une inertie intra classe inférieure à 1100, et donc bien plus petite que celle pour la répartition par type de verre.

**Question 7**

```{r}
# partition en 6 classes induite par la CAH :
cl = cutree(cah, k=6)
# inertie intra pour cette partition :
sum(diag(withinSS(donnees_normalisees,cl)))
# inertie intra pour la partition induite par le type de verre :
sum(diag(withinSS(donnees_normalisees,fgl[,"type"])))
```

Cette fois les valeurs des inerties intra classe sont directement comparables, et comme attendu, la valeur pour la partition induite par la CAH (=972) est bien inférieure à celle induite par le type de verre (=1413). On en conclut que la partition par type de verre n'est pas du tout optimale vis à vis du critère de l'inertie intra classe. Autrement dit, les classes correspondant aux types de verre sont assez mélangées ; on arrive à mieux partitionner les observations en groupes séparés par des méthodes de classification non supervisée. 










