K-means Clustering dans R avec exemple

Qu’est-ce que l’analyse cluster ?

L'analyse groupée fait partie du apprentissage non supervisé. Un cluster est un groupe de données partageant des fonctionnalités similaires. Nous pouvons dire que l’analyse de clustering est plus une question de découverte que de prédiction. La machine recherche des similitudes dans les données. Par exemple, vous pouvez utiliser l'analyse cluster pour les tâches suivantes.wing demande:

  • Segmentation client : recherche des similitudes entre les groupes de clients
  • Clustering boursier : Regrouper les actions en fonction des performances
  • Réduire la dimensionnalité d'un ensemble de données en regroupant les observations avec des valeurs similaires

L'analyse de clustering n'est pas trop difficile à mettre en œuvre et est significative et exploitable pour les entreprises.

La différence la plus frappante entre l’apprentissage supervisé et non supervisé réside dans les résultats. L'apprentissage non supervisé crée une nouvelle variable, l'étiquette, tandis que l'apprentissage supervisé prédit un résultat. La machine aide le praticien dans sa quête pour étiqueter les données en fonction de leur étroite relation. C'est à l'analyste d'utiliser les groupes et de leur donner un nom.

Faisons un exemple pour comprendre le concept de clustering. Par souci de simplicité, nous travaillons en deux dimensions. Vous disposez de données sur les dépenses totales des clients et leur âge. Pour améliorer la publicité, l'équipe marketing souhaite envoyer des e-mails plus ciblésmails à leurs clients.

Dans la suitewing graphique, vous tracez les dépenses totales et l’âge des clients.

library(ggplot2)
df <- data.frame(age = c(18, 21, 22, 24, 26, 26, 27, 30, 31, 35, 39, 40, 41, 42, 44, 46, 47, 48, 49, 54),
    spend = c(10, 11, 22, 15, 12, 13, 14, 33, 39, 37, 44, 27, 29, 20, 28, 21, 30, 31, 23, 24)
)
ggplot(df, aes(x = age, y = spend)) +
    geom_point()

L'analyse par grappes

Un motif est visible à ce stade

  1. En bas à gauche, on voit des jeunes avec un pouvoir d'achat plus faible
  2. La moyenne supérieure reflète les personnes ayant un emploi qu'elles peuvent se permettre de dépenser plus
  3. Enfin, des personnes âgées avec un budget moindre.

L'analyse par grappes

Dans la figure ci-dessus, vous regroupez les observations à la main et définissez chacun des trois groupes. Cet exemple est assez simple et très visuel. Si de nouvelles observations sont ajoutées à l’ensemble de données, vous pouvez les étiqueter dans les cercles. Vous définissez le cercle en fonction de notre jugement. Au lieu de cela, vous pouvez utiliser Machine Learning regrouper les données de manière objective.

Dans ce didacticiel, vous apprendrez à utiliser le k-signifie algorithme.

Algorithme K-means

K-mean est sans aucun doute la méthode de clustering la plus populaire. Les chercheurs ont publié l’algorithme il y a plusieurs décennies et de nombreuses améliorations ont été apportées aux k-means.

L'algorithme tente de trouver des groupes en minimisant la distance entre les observations, appelée local optimal solutions. Les distances sont mesurées en fonction des coordonnées des observations. Par exemple, dans un espace à deux dimensions, les coordonnées sont simples et .

Algorithme K-means

L'algorithme fonctionne comme suit :

  • Étape 1 : Choisissez les groupes dans le plan de fonctionnalités au hasard
  • Étape 2 : Minimiser la distance entre le centre du cluster et les différentes observations (centroïde). Il en résulte des groupes avec des observations
  • Étape 3 : Déplacez le centre de gravité initial vers la moyenne des coordonnées au sein d'un groupe.
  • Étape 4 : Réduisez la distance en fonction des nouveaux centroïdes. De nouvelles frontières sont créées. Ainsi, les observations se déplaceront d'un groupe à l'autre
  • Répétez jusqu'à ce qu'aucune observation ne change de groupe

K-means prend généralement la distance euclidienne entre l'entité et l'entité :

Algorithme K-means

Différentes mesures sont disponibles comme la distance de Manhattan ou la distance de Minlowski. Notez que K-mean renvoie des groupes différents à chaque fois que vous exécutez l'algorithme. Rappelons que les premières suppositions initiales sont aléatoires et calculons les distances jusqu'à ce que l'algorithme atteigne une homogénéité au sein des groupes. Autrement dit, la moyenne k est très sensible au premier choix et, à moins que le nombre d'observations et de groupes ne soit petit, il est presque impossible d'obtenir le même regroupement.

Sélectionnez le nombre de clusters

Une autre difficulté rencontrée avec k-mean est le choix du nombre de clusters. Vous pouvez définir une valeur élevée pour , c'est-à-dire un grand nombre de groupes, pour améliorer la stabilité, mais vous pourriez vous retrouver avec sur-ajustement de données. Le surajustement signifie que les performances du modèle diminuent considérablement pour les nouvelles données à venir. La machine a appris le petit details de l’ensemble de données et ont du mal à généraliser le modèle global.

Le nombre de clusters dépend de la nature de l'ensemble de données, du secteur, de l'entreprise, etc. Cependant, il existe une règle empirique pour sélectionner le nombre approprié de clusters :

Sélectionnez le nombre de clusters

avec égal au nombre d’observations dans l’ensemble de données.

De manière générale, il est intéressant de consacrer du temps à la recherche du meilleur rapport qualité-prix pour répondre aux besoins de l'entreprise.

Nous utiliserons l’ensemble de données Prix des ordinateurs personnels pour effectuer notre analyse de clustering. Cet ensemble de données contient 6259 10 observations et 1993 fonctionnalités. L'ensemble de données observe le prix de 1995 à 486 de ordinateurs personnels aux États-Unis. Les variables sont le prix, la vitesse, la RAM, l'écran, le CD entre autres.

Vous procéderez comme suit :

  • Importer des dates
  • Former le modèle
  • Évaluer le modèle

Importer des dates

K signifie ne convient pas aux variables factorielles car il est basé sur la distance et les valeurs discrètes ne renvoient pas de valeurs significatives. Vous pouvez supprimer les trois variables catégorielles de notre ensemble de données. De plus, il n’y a aucune valeur manquante dans cet ensemble de données.

library(dplyr)
PATH <-"https://raw.githubusercontent.com/guru99-edu/R-Programming/master/computers.csv"
df <- read.csv(PATH) %>%
select(-c(X, cd, multi, premium))
glimpse(df)

Sortie

## Observations: 6, 259
## Variables: 7
## $ price < int > 1499, 1795, 1595, 1849, 3295, 3695, 1720, 1995, 2225, 2...
##$ speed < int > 25, 33, 25, 25, 33, 66, 25, 50, 50, 50, 33, 66, 50, 25, ...
##$ hd < int > 80, 85, 170, 170, 340, 340, 170, 85, 210, 210, 170, 210...
##$ ram < int > 4, 2, 4, 8, 16, 16, 4, 2, 8, 4, 8, 8, 4, 8, 8, 4, 2, 4, ...
##$ screen < int > 14, 14, 15, 14, 14, 14, 14, 14, 14, 15, 15, 14, 14, 14, ...
##$ ads < int > 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, ...
## $ trend  <int> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...

À partir des statistiques récapitulatives, vous pouvez voir que les données ont des valeurs élevées. Une bonne pratique avec le calcul de la moyenne k et de la distance consiste à redimensionner les données de sorte que la moyenne soit égale à un et l'écart type soit égal à zéro.

summary(df)

Sortie :

##      price          speed              hd              ram        
##  Min.   : 949   Min.   : 25.00   Min.   :  80.0   Min.   : 2.000  
##  1st Qu.:1794   1st Qu.: 33.00   1st Qu.: 214.0   1st Qu.: 4.000  `
##  Median :2144   Median : 50.00   Median : 340.0   Median : 8.000  
##  Mean   :2220   Mean   : 52.01   Mean   : 416.6   Mean   : 8.287  
##  3rd Qu.:2595   3rd Qu.: 66.00   3rd Qu.: 528.0   3rd Qu.: 8.000  
##  Max.   :5399   Max.   :100.00   Max.   :2100.0   Max.   :32.000  
##      screen           ads            trend      
##  Min.   :14.00   Min.   : 39.0   Min.   : 1.00  
##  1st Qu.:14.00   1st Qu.:162.5   1st Qu.:10.00  
##  Median :14.00   Median :246.0   Median :16.00  
##  Mean   :14.61   Mean   :221.3   Mean   :15.93  
##  3rd Qu.:15.00   3rd Qu.:275.0   3rd Qu.:21.50  
##  Max.   :17.00   Max.   :339.0   Max.   :35.00

Vous redimensionnez les variables avec la fonction scale() de la bibliothèque dplyr. La transformation réduit l'impact des valeurs aberrantes et permet de comparer une seule observation à la moyenne. Si une valeur standardisée (ou score z) est élevé, vous pouvez être sûr que cette observation est bien au-dessus de la moyenne (un score z élevé implique que ce point est loin de la moyenne en termes d'écart type. Un score z de deux indique que la valeur est de 2 standard. écarts par rapport à la moyenne. Notez que le score z suit une distribution gaussienne et est symétrique autour de la moyenne.

rescale_df <- df % > %
mutate(price_scal = scale(price),
    hd_scal = scale(hd),
    ram_scal = scale(ram),
    screen_scal = scale(screen),
    ads_scal = scale(ads),
    trend_scal = scale(trend)) % > %
select(-c(price, speed, hd, ram, screen, ads, trend))

R base a une fonction pour exécuter l'algorithme de moyenne k. La fonction de base de k moyenne est :

kmeans(df, k)
arguments:
-df: dataset used to run the algorithm
-k: Number of clusters

Former le modèle

Dans la figure trois, vous avez détaillé le fonctionnement de l’algorithme. Vous pouvez voir chaque étape graphiquement avec le superbe package créé par Yi Hui (également créateur de Knit pour Rmarkdown). L'animation du package n'est pas disponible dans la bibliothèque conda. Vous pouvez utiliser l'autre méthode pour installer le package avec install.packages("animation"). Vous pouvez vérifier si le package est installé dans notre dossier Anaconda.

install.packages("animation")

Après avoir chargé la bibliothèque, vous ajoutez .ani après kmeans et R tracera toutes les étapes. À des fins d'illustration, vous exécutez uniquement l'algorithme avec les variables redimensionnées hd et ram avec trois clusters.

set.seed(2345)
library(animation)
kmeans.ani(rescale_df[2:3], 3)

Explication du code

  • kmeans.ani(rescale_df[2:3], 3) : sélectionnez les colonnes 2 et 3 de l'ensemble de données rescale_df et exécutez l'algorithme avec k ensembles sur 3. Tracez l'animation.

Former le modèle

Former le modèle

Vous pouvez interpréter l'animation comme suit :

  • Étape 1 : R choisit trois points au hasard
  • Étape 2 : Calculez la distance euclidienne et dessinez les clusters. Vous avez un cluster en vert en bas à gauche, un grand cluster coloré en noir à droite et un rouge entre eux.
  • Étape 3 : Calculer le centroïde, c'est-à-dire la moyenne des clusters
  • Répétez jusqu'à ce qu'aucune donnée ne change le cluster

L'algorithme a convergé après sept itérations. Vous pouvez exécuter l'algorithme k-mean dans notre ensemble de données avec cinq clusters et l'appeler pc_cluster.

pc_cluster <-kmeans(rescale_df, 5)
  • La liste pc_cluster contient sept éléments intéressants :
  • pc_cluster$cluster : Indique le cluster de chaque observation
  • pc_cluster$centers : Les centres du cluster
  • pc_cluster$totss : La somme totale de squares
  • pc_cluster$withinss : Dans la somme des carrés. Le nombre de composants renvoyés est égal à `k`
  • pc_cluster$tot.withinss : somme des intérieurs
  • pc_clusterbetweenss : somme totale des carrés moins dans la somme des carrés
  • pc_cluster$size : nombre d'observations dans chaque cluster

Vous utiliserez la somme de la somme intérieure des carrés (c'est-à-dire tot.withinss) pour calculer le nombre optimal de clusters k. Trouver k est en effet une tâche considérable.

K optimal

Une technique pour choisir le meilleur k s'appelle le méthode du coude. Cette méthode utilise l'homogénéité au sein du groupe ou l'hétérogénéité au sein du groupe pour évaluer la variabilité. En d’autres termes, vous vous intéressez au pourcentage de variance expliqué par chaque cluster. Vous pouvez vous attendre à ce que la variabilité augmente avec le nombre de clusters, sinon l'hétérogénéité diminue. Notre défi est de trouver le k qui se situe au-delà des rendements décroissants. L'ajout d'un nouveau cluster n'améliore pas la variabilité des données car il reste très peu d'informations à expliquer.

Dans ce tutoriel, nous trouvons ce point en utilisant la mesure d'hétérogénéité. La somme totale au sein des clusters de squares est le tot.withinss dans la liste renvoyé par kmean().

Vous pouvez construire le graphique du coude et trouver le k optimal comme suit :

  • Étape 1 : Construire une fonction pour calculer la somme totale au sein des clusters de squares
  • Étape 2 : Exécutez les heures de l'algorithme
  • Étape 3 : Créer un bloc de données avec les résultats de l'algorithme
  • Étape 4 : tracez les résultats

Étape 1) Construire une fonction pour calculer le total dans la somme des clusters de squares

Vous créez la fonction qui exécute l'algorithme k-mean et stockez le total dans la somme des clusters de squares

kmean_withinss <- function(k) {
    cluster <- kmeans(rescale_df, k)
    return (cluster$tot.withinss)
}

Explication du code

  • function(k) : définit le nombre d'arguments dans la fonction
  • kmeans(rescale_df, k) : Exécuter l'algorithme k fois
  • return(cluster$tot.withinss) : stocke le total dans les clusters, somme de squares

Vous pouvez tester la fonction avec égal à 2.

Sortie :

## Try with 2 cluster
kmean_withinss(2)

Sortie :

## [1] 27087.07

Étape 2) Exécutez l'algorithme n fois

Vous utiliserez la fonction sapply() pour exécuter l’algorithme sur une plage de k. Cette technique est plus rapide que de créer une boucle et de stocker la valeur.

# Set maximum cluster 
max_k <-20 
# Run algorithm over a range of k 
wss <- sapply(2:max_k, kmean_withinss)

Explication du code

  • max_k <-20 : définissez un nombre maximum de 20
  • sapply(2:max_k, kmean_withinss) : Exécutez la fonction kmean_withinss() sur une plage 2:max_k, soit 2 à 20.

Étape 3) Créer un bloc de données avec les résultats de l'algorithme

Après la création et le test de notre fonction, vous pouvez exécuter l'algorithme k-mean sur une plage de 2 à 20, stocker les valeurs tot.withinss.

# Create a data frame to plot the graph
elbow <-data.frame(2:max_k, wss)

Explication du code

  • data.frame(2:max_k, wss) : crée une trame de données avec la sortie de l'algorithme stocké dans wss

Étape 4) Tracer les résultats

Vous tracez le graphique pour visualiser où se trouve le point du coude

# Plot the graph with gglop
ggplot(elbow, aes(x = X2.max_k, y = wss)) +
    geom_point() +
    geom_line() +
    scale_x_continuous(breaks = seq(1, 20, by = 1))

K optimal

Sur le graphique, vous pouvez voir que le k optimal est de sept, où la courbe commence à avoir un rendement décroissant.

Une fois que vous avez notre k optimal, vous réexécutez l'algorithme avec k égal à 7 et évaluez les clusters.

Examen du cluster

pc_cluster_2 <-kmeans(rescale_df, 7)

Comme mentionné précédemment, vous pouvez accéder aux informations intéressantes restantes dans la liste renvoyée par kmean().

pc_cluster_2$cluster
pc_cluster_2$centers
pc_cluster_2$size

La partie évaluation est subjective et repose sur l'utilisation de l'algorithme. Notre objectif ici est de rassembler des ordinateurs dotés de fonctionnalités similaires. Un informaticien peut faire le travail à la main et regrouper les ordinateurs en fonction de son expertise. Cependant, le processus prendra beaucoup de temps et sera sujet aux erreurs. L'algorithme K-mean peut lui préparer le terrain en lui suggérant des clusters.

En guise d'évaluation préalable, vous pouvez examiner la taille des clusters.

pc_cluster_2$size

Sortie :

## [1] 608 1596 1231  580 1003  699  542

Le premier cluster est composé de 608 observations, tandis que le plus petit cluster, le numéro 4, ne compte que 580 ordinateurs. Il pourrait être bon d'avoir une homogénéité entre les clusters, sinon une préparation de données plus fine pourrait être nécessaire.

Vous obtenez un aperçu plus approfondi des données avec le composant central. Les lignes font référence à la numérotation du cluster et les colonnes aux variables utilisées par l'algorithme. Les valeurs correspondent au score moyen de chaque cluster pour la colonne intéressée. La standardisation facilite l'interprétation. Les valeurs positives indiquent que le score z pour un cluster donné est supérieur à la moyenne globale. Par exemple, le cluster 2 a la moyenne de prix la plus élevée parmi tous les clusters.

center <-pc_cluster_2$centers
center

Sortie :

##   price_scal    hd_scal     ram_scal screen_scal   ads_scal trend_scal
## 1 -0.6372457 -0.7097995 -0.691520682  -0.4401632  0.6780366 -0.3379751
## 2 -0.1323863  0.6299541  0.004786730   2.6419582 -0.8894946  1.2673184
## 3  0.8745816  0.2574164  0.513105797  -0.2003237  0.6734261 -0.3300536
## 4  1.0912296 -0.2401936  0.006526723   2.6419582  0.4704301 -0.4132057
## 5 -0.8155183  0.2814882 -0.307621003  -0.3205176 -0.9052979  1.2177279
## 6  0.8830191  2.1019454  2.168706085   0.4492922 -0.9035248  1.2069855
## 7  0.2215678 -0.7132577 -0.318050275  -0.3878782 -1.3206229 -1.5490909

Vous pouvez créer une carte thermique avec ggplot pour nous aider à mettre en évidence la différence entre les catégories.

Les couleurs par défaut de ggplot doivent être modifiées avec la bibliothèque RColorBrewer. Vous pouvez utiliser le conda bibliothèque et le code à lancer dans le terminal :

conda install -cr r-rcolorbrewer

Pour créer une carte thermique, vous procédez en trois étapes :

  • Construisez un data frame avec les valeurs du centre et créez une variable avec le numéro du cluster
  • Remodelez les données avec la fonction recueillir() de la bibliothèque Tidyr. Vous souhaitez transformer des données larges en longues.
  • Créer la palette de couleurs avec colorRampFonction Palette()

Étape 1) Construire un bloc de données

Créons l'ensemble de données de remodelage

library(tidyr)

# create dataset with the cluster number

cluster <- c(1: 7)
center_df <- data.frame(cluster, center)

# Reshape the data

center_reshape <- gather(center_df, features, values, price_scal: trend_scal)
head(center_reshape)

Sortie :

##   cluster   features     values
## 1       1 price_scal -0.6372457
## 2       2 price_scal -0.1323863
## 3       3 price_scal  0.8745816
## 4       4 price_scal  1.0912296
## 5       5 price_scal -0.8155183
## 6       6 price_scal  0.8830191		

Étape 2) Remodeler les données

Le code ci-dessous crée la palette de couleurs que vous utiliserez pour tracer la carte thermique.

library(RColorBrewer)
# Create the palette
hm.palette <-colorRampPalette(rev(brewer.pal(10, 'RdYlGn')),space='Lab')

Étape 3) Visualisez

Vous pouvez tracer le graphique et voir à quoi ressemblent les clusters.

# Plot the heat map
ggplot(data = center_reshape, aes(x = features, y = cluster, fill = values)) +
    scale_y_continuous(breaks = seq(1, 7, by = 1)) +
    geom_tile() +
    coord_equal() +
    scale_fill_gradientn(colours = hm.palette(90)) +
    theme_classic()

Examen du cluster

Résumé

Nous pouvons résumer l'algorithme k-mean dans le tableau ci-dessous

Forfaits Objectif Fonction Argument
base Entraîner k-moyenne kmmoyennes() df, k
Accéder au cluster kmeans()$cluster
Centres de cluster kmeans()$centres
Taille du cluster kmeans()$taille