Dans ce tutoriel, vous apprendrez
- Qu'est-ce que l'analyse de cluster?
- Algorithme K-means
- Optimal k
Qu'est-ce que l'analyse de cluster?
L'analyse de cluster fait partie de l' apprentissage non supervisé . Un cluster est un groupe de données qui partagent des fonctionnalités similaires. Nous pouvons dire que l'analyse de clustering est plus une question de découverte qu'une prédiction. La machine recherche la similitude des données. Par exemple, vous pouvez utiliser l'analyse de cluster pour l'application suivante:
- Segmentation de la clientèle: recherche la similitude entre les groupes de clients
- Clustering boursier: action du Groupe en fonction des performances
- Réduisez la dimensionnalité d'un jeu de données en regroupant des 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 d'étiqueter les données en fonction de leur proximité. C'est à l'analyste de se servir des groupes et de leur donner un nom.
Faisons un exemple pour comprendre le concept de clustering. Pour plus 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és à ses clients.
Dans le graphique suivant, 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()
Un motif est visible à ce stade
- En bas à gauche, vous pouvez voir des jeunes avec un pouvoir d'achat plus faible
- Le milieu supérieur reflète les personnes ayant un emploi qu'elles peuvent se permettre de dépenser plus
- Enfin, les personnes âgées avec un budget inférieur.
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 pour regrouper les données de manière objective.
Dans ce didacticiel, vous apprendrez à utiliser l' algorithme k-means .
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 des 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ées solutions optimales locales . Les distances sont mesurées en fonction des coordonnées des observations. Par exemple, dans un espace bidimensionnel, les coordonnées sont simples et.
L'algorithme fonctionne comme suit:
- Étape 1: Choisissez des groupes dans le plan de fonctionnalités de manière aléatoire
- Étape 2: Minimisez 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 d'un groupe.
- Étape 4: minimisez la distance en fonction des nouveaux centres de gravité. De nouvelles limites sont créées. Ainsi, les observations passeront 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é:
Différentes mesures sont disponibles comme la distance de Manhattan ou la distance de Minlowski. Notez que K-mean renvoie différents groupes chaque fois que vous exécutez l'algorithme. Rappelez-vous que les premières estimations initiales sont aléatoires et calculez les distances jusqu'à ce que l'algorithme atteigne une homogénéité au sein des groupes. Autrement dit, la k-moyenne 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 la k-moyenne est le choix du nombre de clusters. Vous pouvez définir une valeur élevée de, c'est-à-dire un grand nombre de groupes, pour améliorer la stabilité, mais vous risquez de vous retrouver avec un surajustement des données. Le surajustement signifie que les performances du modèle diminuent considérablement pour les nouvelles données à venir. La machine a appris les petits détails de l'ensemble de données et a du mal à généraliser le modèle global.
Le nombre de grappes dépend de la nature de l'ensemble de données, de l'industrie, de l'entreprise, etc. Cependant, il existe une règle empirique pour sélectionner le nombre approprié 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 passer du temps à rechercher la meilleure valeur pour répondre aux besoins de l'entreprise.
Nous utiliserons l'ensemble de données des prix des ordinateurs personnels pour effectuer notre analyse de regroupement. Cet ensemble de données contient 6259 observations et 10 entités. L'ensemble de données observe le prix de 1993 à 1995 de 486 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 données
- Former le modèle
- Évaluer le modèle
Importer des données
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. En outre, 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)Production
## 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,… ## $ trend1, 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 de grandes valeurs. Une bonne pratique avec le calcul de la moyenne et de la distance k consiste à redimensionner les données de sorte que la moyenne soit égale à un et l'écart type à zéro.
summary(df)
Production:
## 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ée, vous pouvez être sûr que cette observation est bien au-dessus de la moyenne (un score z élevé implique que ce point est éloigné de la moyenne en terme d'écart type. un score de deux indique que la valeur est éloignée de 2 écarts-types de 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 grand package construit 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 à 3. Tracez l'animation.
Vous pouvez interpréter l'animation comme suit:
- Étape 1: R choisit au hasard trois points
- Étape 2: Calculez la distance euclidienne et dessinez les clusters. Vous avez un cluster en vert en bas à gauche, un gros cluster coloré en noir à droite et un rouge entre eux.
- Étape 3: Calculez le centroïde, c'est-à-dire la moyenne des clusters
- Répétez jusqu'à ce qu'aucune donnée ne change de 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 de cluster
- pc_cluster $ totss: La somme totale des carrés
- pc_cluster $ withinss: Dans la somme des carrés. Le nombre de composants renvoyés est égal à «k»
- pc_cluster $ tot.withinss: Somme de withinss
- pc_clusterbetweenss: Somme totale du carré moins Dans la somme du carré
- pc_cluster $ size: nombre d'observations dans chaque cluster
Vous utiliserez la somme de la somme intérieure de carré (c'est-à-dire tot.withinss) pour calculer le nombre optimal de clusters k. Trouver k est en effet une tâche considérable.
Optimal k
Une technique pour choisir le meilleur k est appelée la méthode du coude . Cette méthode utilise l'homogénéité intra-groupe ou l'hétérogénéité intra-groupe pour évaluer la variabilité. En d'autres termes, vous vous intéressez au pourcentage de la variance expliquée par chaque grappe. Vous pouvez vous attendre à ce que la variabilité augmente avec le nombre de grappes, sinon l'hétérogénéité diminue. Notre défi est de trouver le k qui est 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 des carrés des totaux au sein des clusters est le total des interruptions dans la liste renvoyée par kmean ().
Vous pouvez construire le graphique du coude et trouver le k optimal comme suit:
- Étape 1: Construisez une fonction pour calculer le total au sein des clusters somme des carrés
- Étape 2: Exécutez les horaires de l'algorithme
- Étape 3: Créez une trame de données avec les résultats de l'algorithme
- Étape 4: Tracez les résultats
Étape 1) Construisez une fonction pour calculer le total au sein des clusters somme des carrés
Vous créez la fonction qui exécute l'algorithme k-moyenne et stockez le total dans les clusters somme des carrés
kmean_withinss <- function(k) {cluster <- kmeans(rescale_df, k)return (cluster$tot.withinss)}
Explication du code
- function (k): définir 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 des carrés
Vous pouvez tester la fonction avec égal à 2.
Production:
## Try with 2 cluster
kmean_withinss(2)
Production:
## [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 clustermax_k <-20# Run algorithm over a range of kwss <- sapply(2:max_k, kmean_withinss)
Explication du code
- max_k <-20: définir 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éez une trame 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 graphelbow <-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 du magasin d'algorithmes dans wss
Étape 4) Tracez les résultats
Vous tracez le graphique pour visualiser où se trouve le point du coude
# Plot the graph with gglopggplot(elbow, aes(x = X2.max_k, y = wss)) +geom_point() +geom_line() +scale_x_continuous(breaks = seq(1, 20, by = 1))
À partir du graphique, vous pouvez voir que k optimal est 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.
Examiner le 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$clusterpc_cluster_2$centerspc_cluster_2$size
La partie évaluation est subjective et repose sur l'utilisation de l'algorithme. Notre objectif ici est de rassembler des ordinateurs avec des fonctionnalités similaires. Un informaticien peut faire le travail à la main et grouper un ordinateur en fonction de son expertise. Cependant, le processus prendra beaucoup de temps et sera sujet aux erreurs. L'algorithme K-mean peut préparer le champ pour lui / elle en suggérant des clusters.
En tant qu'évaluation préalable, vous pouvez examiner la taille des clusters.
pc_cluster_2$size
Production:
## [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 peut être bon d'avoir une homogénéité entre les clusters, sinon une préparation de données plus fine peut être nécessaire.
Vous obtenez un examen 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 sont le score moyen de chaque cluster pour la colonne intéressée. La normalisation facilite l'interprétation. Les valeurs positives indiquent que le score z pour une grappe donnée 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$centerscenter
Production:
## 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 la bibliothèque conda et le code pour lancer dans le terminal:
conda installer -cr r-rcolorbrewer
Pour créer une carte thermique, vous procédez en trois étapes:
- Construisez un bloc de données avec les valeurs du centre et créez une variable avec le numéro du cluster
- Remodelez les données avec la fonction rassembler () de la bibliothèque tidyr. Vous souhaitez transformer les données de large en longue.
- Créez la palette de couleurs avec la fonction colorRampPalette ()
Étape 1) Construisez un bloc de données
Créons le jeu de données de remodelage
library(tidyr)# create dataset with the cluster numbercluster <- c(1: 7)center_df <- data.frame(cluster, center)# Reshape the datacenter_reshape <- gather(center_df, features, values, price_scal: trend_scal)head(center_reshape)
Production:
## 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 palettehm.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 mapggplot(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()
Résumé
Nous pouvons résumer l'algorithme de la k-moyenne dans le tableau ci-dessous
Paquet |
Objectif |
fonction |
argument |
---|---|---|---|
base |
Train k-moyenne |
kmeans () |
df, k |
Cluster d'accès |
kmeans () $ cluster | ||
Centres de cluster |
kmeans () $ centres | ||
Cluster de taille |
kmeans () $ taille |