Introduction

Pour ce TP nous allons nous intéresser à la classification de vins italiens issus de plusieurs viticulteurs. Le jeu de données contient 178 vins différents pour lesquels 13 variables quantitatives ont été mesurées. L’objectif de ce TP est, vous l’aurez compris, de faire une classification par K-means de ces vins. Mais avant de vous attaquer à cette tâche, nous allons reprendre le jeu de données des Iris de Fisher afin d’être bien sûr que vous êtes désormais un expert du K-means.

(Ré) Analyse des données d’Iris de Fisher

Les données d’iris sont déjà disponibles dans le logiciel R. Pour les importer, il suffit juste de faire un petit

data(iris)
head(iris)
##   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
## 1          5.1         3.5          1.4         0.2  setosa
## 2          4.9         3.0          1.4         0.2  setosa
## 3          4.7         3.2          1.3         0.2  setosa
## 4          4.6         3.1          1.5         0.2  setosa
## 5          5.0         3.6          1.4         0.2  setosa
## 6          5.4         3.9          1.7         0.4  setosa

Vous vous souvenez que la classification par K-means est non supervisée, on prendra donc bien soin de ne pas utiliser la dernières variable—qui de toute manière n’est pas quantitative, donc, à moins de n’avoir rien compris au K-means, vous n’auriez pas pu l’utiliser !!!

  1. Commencez par faire une analyse descriptive des données.
  2. Lisez la documentation de la fonction kmeans de R. En particulier, assurez vous de bien comprendre le rôle des arguments x, centers, iter.max et nstart.
  3. Faites une classification par K-means sur le jeu de données des iris.
  4. Interprétez les résultats.
  5. Faites varier le nombre de classes et déterminez le nombre de classes “optimal” en visualisant le graphique de l’évolution du pourcentage d’inertie expliquée.
  6. Créez vous même quelques nouvelles observations fictives d’iris. Prédisez alors les variétés de vos iris fictives ! Il serait bien d’écrire une fonction R pour cela.
  7. Puisque nous avons notre fameuse 5ème colonne, pourquoi ne pas tenter de faire une matrice de confusion ? La fonction table pourrait vous être utile. Comparez avec les résultats obtenus en cours.
  8. Pour aller plus loin… Je vous ai écrit un petit bout de code qui n’est rien d’autre que ma programmation du K-means en R. Cependant le code n’est pas complet. Essayez de le compléter.
mykmeans <- function(data, n.class, iter.max = 50){
  ## data : une matrice contenant les donnees
  ## n.class : le nombre de classes
  ## iter.max : le nombre maximal d'iteration
  
  n.obs <- nrow(data)
  data <- as.matrix(data)## conversion en matrice pas en data.frame
  
  ## Initialisation des centroides (piochés aléatoirement dans le jeu de données)
  centroids <- data[sample(n.obs, n.class),]
  
  for (i in 1:iter.max){
    ## Calcul de la distance euclidienne au centroide de la classe
    dist <- matrix(NA, n.obs, n.class)
    for (class in 1:n.class)
      
      dist[,class] <- colSums((t(data) - centroids[class,])^2)## je peux expliquer cette ligne de code horrible au besoin
      
    ## Affectation des classes à chaque observations
    cluster <- 1#### A vous de completer
      
    ## Mise a jour des centroides
    centroids <- 1## a vous de faire
    
    if (test_d_arret_a_mettre)
      break
  }
  
  ## Calcul de l'inertie intra et inter
  within <- 1## a vous de faire
  between <- 1## a vous de faire
  
  if (iter == iter.max)
    warning("On a atteint le nombre maximal d'iterations :-(")
  
  return(list(cluster = cluster, within = within, between = between, iter = iter, centroids = centroids))
}

Application sur le jeu de données des vins

Les données sont disponibles ici. Après avoir fait une analyse descriptive de ces données, vous ferez une classification par kmeans et commenterez vos résultats. Pour conclure votre (petite) analyse nous allons faire de la prédictions sur deux nouveaux vins dont voici les caractéristiques

new.wines <- rbind(wine1 = c(12.37, 1.17, 1.92, 19.6, 78, 2.11, 2.00, 0.27, 1.04, 4.68, 1.12, 3.48, 510),
                  wine2 = c(13.45, 3.70, 2.60, 23.0, 111, 1.70, 0.92, 0.43, 1.46, 10.68, 0.85, 1.56, 695))

A partir de votre classification, dans quelles classes appartiendrait ces deux nouveaux vins ?

Bon travail !