Application

Dans cette séance, nous verrons l'application des 2 méthodes (ACP et classification) pour rechercher les différentes façons d'écrire chaque chiffre.

Nous allons utiliser les données pendigits de l'UCI Machine Learning Repository. Ces données représentent le tracé des chiffres de 0 à 9 par plusieurs personnes. Pour chaque tracé, nous n'avons au final que les coordonnées $(X,Y)$ de 8 points et le chiffre tracé.

Voici ci dessous comment importer les données directement.

Comme vous le pouvez le remarquer, les noms des variables ne sont pas renseignés. Celles-ci sont $(x_j, y_j)_{j = 1,\ldots,8}$ et le chiffre. On va donc déjà créer le vecteur correspondant.

On va ensuite renommer les colonnes avec ce vecteur.

Par la suite, nous aurons besoin d'accéder aux $x_j$ uniquement, ou aux $y_j$, voire aux deux. Nous créons donc des vecteurs avec les noms de variables.

Ces données ont l'avantage d'être graphique. Nous allons donc représenter le premier tracé, qui est un $8$.

Nous allons régulièrement utiliser ce code, donc nous allons le stocker dans une fonction nommée dessin(). Dans celle-ci, nous allons mettre en paramètre les $x_j$ et les $y_j$, le chiffre, ainsi qu'un graphique dans lequel nous allons mettre le dessin. Ceci nous sera utile pour faire plusieurs représentations de chiffres.

Ensuite, nous créons une liste de DataFrame, un pour chaque chiffre. La fonction query() permet donc de sélectionner des lignes d'un DataFrame en fonction d'une condition (ici, chiffre égal 0, 1, ..., 9). Pour éviter les problèmes d'index plus tard, nous devons les réinitialiser pour chaque DataFrame, avec la fonction reset_index(), en mettant drop à vrai. Ceci permet d'oublier les numéros de ligne du DataFrame global et que ceux-ci recommencent de 0 pour chaque sous-ensemble.

Nous voulons maintenant représenter chaque premier exemple de chaque chiffre. Pour cela, nous recherchons la première ligne (index = 0) pour chaque sous-ensemble précédemment créé. Et pour simplifier le travail ensuite, nous renvoyons pour chaque chiffre, trois éléments : les $x_j$, les $y_j$ et le chiffre.

Puis, nous créons une figure (en spécifiant la taille). Et pour chaque chiffre, nous ajoutons un graphique à la figure avec la fonction add_subplot(). Celle-ci prend trois paramètres : le nombre de lignes, le nombre de colonnes et le numéro de placement du prochain graphique. Grâce à l'utilisation de la fonction dessin() et de l'objet subxyc, la réalisation est simple.

Le but de ce TP va être de réfléchir à comment répondre à la question suivante :

Existe-t'il plusieurs façons d'écrire chaque chiffre ?

Pour cela, nous allons dérouler les étapes suivantes :

  1. Calculer la moyenne de chaque coordonnée $x_j$ et $y_j$, pour chaque chiffre
  2. Représenter le tracé des chiffres moyens (i.e. en prenant les coordonnées moyennes donc)
    • Améliorer éventuellement la fonction dessin() pour ajouter, si demandé, les numéros des points
  3. Réaliser une ACP sur les données (en comparant avec ou sans standardisation)
  4. Représenter les chiffres sur le plan factoriel
    • sur un seul graphique
    • avec un graphique par chiffre, sur la même figure
  5. Réaliser une classification via HAC et $k$-means pour chaque chiffre
    • créer une fonction prenant en paramètre un nombre de classes à tester et qui réalise les opérations suivantes :
      • calcul de la partition
      • affichage de la répartition des classes (i.e combien d'individus dans chaque classe ?)
      • représentation des classes sur le plan factoriel (un graphique par classe éventuellement)
      • représentation des tracés moyens pour chaque classe afin de mieux comprendre les différences entre les classes
    • A l'aide de cette fonction, choisir un nombre de classes approprié