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.
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 !!!
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))
}
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 !