Este es un cuaderno o Notebook de R que incluye un tutorial práctico sobre clustering mediante el paquete Clustering dentro del “Seminario Permanente de Formación en Inteligencia Artificial Aplicada a la Defensa” conjunto entre el Mando de Adiestramiento y Doctrina y el Instituto Andaluz Interuniversitario DaSCI (Universidad de Granada y Universidad de Jaén).
Existen bloques de texto y bloques de código, sombreados en gris, con instrucciones R. Estas instrucciones, si se ejecutan, el resultado de las mismas aparecerá debajo.
El agrupamiento o clustering es un tipo de técnica de aprendizaje no supervisado cuyo objetivo es la formación de subconjuntos de la población donde se maximice la similitud entre instancias pertenencientes a un mismo grupo o cluster y se minimice entre instancias que no pertencen al mismo cluster. El objetivo de este tutorial es proporcionar una guía paso a paso para la realización de un estudio de clustering mediante el empleo del paquete Clustering. Para ello, se seguirán los siguientes pasos:
El primer paso de este tutorial es instalar los paquetes que vamos a usar. Los paquetes son complementos o bibliotecas de terceros que amplian las utilidades de R.
El paquete que vamos a usar se llama Clustering, el cual permite realizar de manera sencilla comparativas entre métodos de clustering para seleccionar a continuación el que nos interese. Actualmente se encuentra en fase alpha, por lo que tiene un funcionalidad limitada, y está en continuo desarrollo. Por esta razón, es recomendable instalar la versión disponible en el repositorio GitHub del mismo. Para instalarlo, ejecutaremos la siguiente orden (elimine el carácter de comentario #):
#install.packages("devtools")
#library(devtools)
#devtools::install_github(repo = "https://github.com/laperez/clustering", build = T, build_vignettes = T)
A continuación, cargue el paquete Clustering:
library(Clustering)
Es importante remarcar que el paquete Clustering posee una interfaz gráfica desde la cual se puede realizar todo este proceso.
En este ejemplo bamos a utilizar el conjunto de datos basketball
disponible en el paquete Clustering. Para cargar este conjunto de datos y poder trabajar con él, se puede ejecutar el siguiente comando:
data("basketball")
datos <- basketball
Sin embargo, en un trabajo real sería necesario cargar los datos desde un fichero, habitualmente en formato csv. Este mismo ejemplo se proporciona en el fichero basketball.csv. Para cargarlo, se ejecutaría el siguente código:
datos <- read.csv("basketball.csv", header = T)
A continuación, podemos realizar un análisis exploratorio inicial de los mismos mediante la función summary
:
head(datos)
# Resumen de datos
summary(datos)
## assists_per_minuteReal heightInteger time_playedReal ageInteger
## Min. :0.0494 Min. :160.0 Min. :10.08 Min. :22.00
## 1st Qu.:0.1098 1st Qu.:185.0 1st Qu.:18.85 1st Qu.:25.00
## Median :0.1584 Median :191.0 Median :25.71 Median :27.00
## Mean :0.1613 Mean :189.9 Mean :25.94 Mean :27.74
## 3rd Qu.:0.2095 3rd Qu.:196.0 3rd Qu.:33.94 3rd Qu.:30.00
## Max. :0.3437 Max. :203.0 Max. :40.71 Max. :37.00
## points_per_minuteReal
## Min. :0.1593
## 1st Qu.:0.3384
## Median :0.4283
## Mean :0.4203
## 3rd Qu.:0.4831
## Max. :0.8291
# Visualización gráfica por pares de variables:
plot(datos)
## Realizar una comparativa de algoritmos mediante el paquete Clustering
El paquete Clustering proporciona el método clustering
que permite la ejecución simultánea de un amplio conjunto de algoritmos disponibles en varios paquetes de R. Para más información sobre los parámetros de esta función y detalles acerca de su implementación, revise la página de ayuda mediante el comando help
:
help("clustering", package = "Clustering")
En la mayoría de métodos de clustering es necesario establecer el número de clusters que se van a encontrar de antemano. Una de los métodos más utilizados para determinar el número óptimo de clusters es mediante la “regla del codo”, que consiste en mostrar en un gráfico la calidad del método con diferentes número de clusters. Para llevarlo a cabo, en primer lugar ejecutaremos el método clustering
con todos los algoritmos disponibles, con un número de cluster mínimo de 3 y máximo de 7. Nota: esta ejecución puede tardar unos minutos en completarse.
Tras la ejecución de este algoritmo, podemos visualizar de manera sencilla en un gráfico una métrica de calidad de las muchas que proporciona este paquete mediante la función plot_clustering
, de modo que podamos aplicar la regla del codo según nuestras necesidades. Por ejemplo, podemos visualizar el comportamiento de los métodos por un métrica interna, es decir, que connectivity
, que hay que minimizar :
plot_clustering(resultado, "connectivity")
Atendiendo a estos resultados, el mejor número de clusters en todos los algoritmos analizados se sitúa en 3, y los mejores resultados los presentan los algoritmo
agnes
y daisy
, los cuales podemos ejecutar en sus respectivos paquetes.
Otra opción que proporciona este paquete es ordenar los métodos en función de un ranking de métricas tanto internas, como externas, y seleccionar el método que convenga. Para ello, ejecutamos el siguiente código:
#Obtener ranking por métricas internas:
rankInternas <- best_ranked_internal_metrics(resultado)
#Obtener ranking por métricas externas:
rankExternas <- best_ranked_external_metrics(resultado)
print(rankInternas)
## Result:
## Algorithm Distance Clusters Dataset Ranking timeInternal
## 1 fuzzy_cm fuzzy_cm 3 dataframe 1 0.0051
## 2 fuzzy_cm fuzzy_cm 4 dataframe 1 0.0048
## 3 fuzzy_cm fuzzy_cm 5 dataframe 1 0.0049
## 4 fuzzy_cm fuzzy_cm 6 dataframe 1 0.0049
## 5 fuzzy_cm fuzzy_cm 7 dataframe 1 0.0051
## 6 fuzzy_gg fuzzy_gg 3 dataframe 1 0.0050
## 7 fuzzy_gg fuzzy_gg 4 dataframe 1 0.0050
## 8 fuzzy_gg fuzzy_gg 5 dataframe 1 0.0055
## 9 fuzzy_gg fuzzy_gg 6 dataframe 1 0.0052
## 10 fuzzy_gg fuzzy_gg 7 dataframe 1 0.0051
## 11 fuzzy_gk fuzzy_gk 3 dataframe 1 0.0060
## 12 fuzzy_gk fuzzy_gk 4 dataframe 1 0.0060
## 13 fuzzy_gk fuzzy_gk 5 dataframe 1 0.0058
## 14 fuzzy_gk fuzzy_gk 6 dataframe 1 0.0060
## 15 fuzzy_gk fuzzy_gk 7 dataframe 1 0.0058
## 16 hclust hclust_euclidean 3 dataframe 1 0.0053
## 17 hclust hclust_euclidean 4 dataframe 1 0.0052
## 18 hclust hclust_euclidean 5 dataframe 1 0.0051
## 19 hclust hclust_euclidean 6 dataframe 1 0.0052
## 20 hclust hclust_euclidean 7 dataframe 1 0.0052
## 21 apclusterK apclusterK_euclidean 3 dataframe 1 0.0051
## 22 apclusterK apclusterK_euclidean 4 dataframe 1 0.0047
## 23 apclusterK apclusterK_euclidean 5 dataframe 1 0.0048
## 24 apclusterK apclusterK_euclidean 6 dataframe 1 0.0047
## 25 apclusterK apclusterK_euclidean 7 dataframe 1 0.0048
## 26 apclusterK apclusterK_manhattan 3 dataframe 1 0.0049
## 27 apclusterK apclusterK_manhattan 4 dataframe 1 0.0049
## 28 apclusterK apclusterK_manhattan 5 dataframe 1 0.0050
## 29 apclusterK apclusterK_manhattan 6 dataframe 1 0.0049
## 30 apclusterK apclusterK_manhattan 7 dataframe 1 0.0050
## 31 apclusterK apclusterK_minkowski 3 dataframe 1 0.0058
## 32 apclusterK apclusterK_minkowski 4 dataframe 1 0.0059
## 33 apclusterK apclusterK_minkowski 5 dataframe 1 0.0060
## 34 apclusterK apclusterK_minkowski 6 dataframe 1 0.0059
## 35 apclusterK apclusterK_minkowski 7 dataframe 1 0.0060
## 36 agnes agnes_euclidean 3 dataframe 1 0.0000
## 37 agnes agnes_euclidean 4 dataframe 1 0.0000
## 38 agnes agnes_euclidean 5 dataframe 1 0.0000
## 39 agnes agnes_euclidean 6 dataframe 1 0.0000
## 40 agnes agnes_euclidean 7 dataframe 1 0.0000
## 41 agnes agnes_manhattan 3 dataframe 1 0.0000
## 42 agnes agnes_manhattan 4 dataframe 1 0.0000
## 43 agnes agnes_manhattan 5 dataframe 1 0.0000
## 44 agnes agnes_manhattan 6 dataframe 1 0.0000
## 45 agnes agnes_manhattan 7 dataframe 1 0.0000
## 46 clara clara_euclidean 3 dataframe 1 0.0050
## 47 clara clara_euclidean 4 dataframe 1 0.0049
## 48 clara clara_euclidean 5 dataframe 1 0.0053
## 49 clara clara_euclidean 6 dataframe 1 0.0048
## 50 clara clara_euclidean 7 dataframe 1 0.0065
## 51 clara clara_manhattan 3 dataframe 1 0.0052
## 52 clara clara_manhattan 4 dataframe 1 0.0050
## 53 clara clara_manhattan 5 dataframe 1 0.0050
## 54 clara clara_manhattan 6 dataframe 1 0.0051
## 55 clara clara_manhattan 7 dataframe 1 0.0050
## 56 daisy daisy_manhattan 3 dataframe 1 0.0050
## 57 daisy daisy_manhattan 4 dataframe 1 0.0054
## 58 daisy daisy_manhattan 5 dataframe 1 0.0051
## 59 daisy daisy_manhattan 6 dataframe 1 0.0050
## 60 daisy daisy_manhattan 7 dataframe 1 0.0052
## 61 daisy daisy_gower 3 dataframe 1 0.0053
## 62 daisy daisy_gower 4 dataframe 1 0.0054
## 63 daisy daisy_gower 5 dataframe 1 0.0055
## 64 daisy daisy_gower 6 dataframe 1 0.0053
## 65 daisy daisy_gower 7 dataframe 1 0.0054
## 66 daisy daisy_euclidean 3 dataframe 1 0.0047
## 67 daisy daisy_euclidean 4 dataframe 1 0.0048
## 68 daisy daisy_euclidean 5 dataframe 1 0.0049
## 69 daisy daisy_euclidean 6 dataframe 1 0.0050
## 70 daisy daisy_euclidean 7 dataframe 1 0.0049
## 71 diana diana_euclidean 3 dataframe 1 0.0093
## 72 diana diana_euclidean 4 dataframe 1 0.0051
## 73 diana diana_euclidean 5 dataframe 1 0.0052
## 74 diana diana_euclidean 6 dataframe 1 0.0059
## 75 diana diana_euclidean 7 dataframe 1 0.0050
## 76 fanny fanny_euclidean 3 dataframe 1 0.0000
## 77 fanny fanny_euclidean 4 dataframe 1 0.0000
## 78 fanny fanny_euclidean 5 dataframe 1 0.0000
## 79 fanny fanny_euclidean 6 dataframe 1 0.0000
## 80 fanny fanny_euclidean 7 dataframe 1 0.0000
## 81 fanny fanny_manhattan 3 dataframe 1 0.0000
## 82 fanny fanny_manhattan 4 dataframe 1 0.0000
## 83 fanny fanny_manhattan 5 dataframe 1 0.0000
## 84 fanny fanny_manhattan 6 dataframe 1 0.0000
## 85 fanny fanny_manhattan 7 dataframe 1 0.0000
## 86 mona mona 3 dataframe 1 0.0000
## 87 mona mona 4 dataframe 1 0.0000
## 88 mona mona 5 dataframe 1 0.0000
## 89 mona mona 6 dataframe 1 0.0000
## 90 mona mona 7 dataframe 1 0.0000
## 91 pam pam_euclidean 3 dataframe 1 0.0051
## 92 pam pam_euclidean 4 dataframe 1 0.0054
## 93 pam pam_euclidean 5 dataframe 1 0.0054
## 94 pam pam_euclidean 6 dataframe 1 0.0051
## 95 pam pam_euclidean 7 dataframe 1 0.0050
## 96 pam pam_manhattan 3 dataframe 1 0.0053
## 97 pam pam_manhattan 4 dataframe 1 0.0052
## 98 pam pam_manhattan 5 dataframe 1 0.0052
## 99 pam pam_manhattan 6 dataframe 1 0.0051
## 100 pam pam_manhattan 7 dataframe 1 0.0058
## 101 gmm gmm_euclidean 3 dataframe 1 0.0050
## 102 gmm gmm_euclidean 4 dataframe 1 0.0049
## 103 gmm gmm_euclidean 5 dataframe 1 0.0049
## 104 gmm gmm_euclidean 6 dataframe 1 0.0049
## 105 gmm gmm_euclidean 7 dataframe 1 0.0050
## 106 gmm gmm_manhattan 3 dataframe 1 0.0050
## 107 gmm gmm_manhattan 4 dataframe 1 0.0075
## 108 gmm gmm_manhattan 5 dataframe 1 0.0089
## 109 gmm gmm_manhattan 6 dataframe 1 0.0051
## 110 gmm gmm_manhattan 7 dataframe 1 0.0056
## 111 kmeans_arma kmeans_arma 3 dataframe 1 0.0049
## 112 kmeans_arma kmeans_arma 4 dataframe 1 0.0047
## 113 kmeans_arma kmeans_arma 5 dataframe 1 0.0047
## 114 kmeans_arma kmeans_arma 6 dataframe 1 0.0047
## 115 kmeans_arma kmeans_arma 7 dataframe 1 0.0049
## 116 kmeans_rcpp kmeans_rcpp 3 dataframe 1 0.0050
## 117 kmeans_rcpp kmeans_rcpp 4 dataframe 1 0.0049
## 118 kmeans_rcpp kmeans_rcpp 5 dataframe 1 0.0049
## 119 kmeans_rcpp kmeans_rcpp 6 dataframe 1 0.0050
## 120 kmeans_rcpp kmeans_rcpp 7 dataframe 1 0.0050
## 121 mini_kmeans mini_kmeans 3 dataframe 1 0.0047
## 122 mini_kmeans mini_kmeans 4 dataframe 1 0.0048
## 123 mini_kmeans mini_kmeans 5 dataframe 1 0.0048
## 124 mini_kmeans mini_kmeans 6 dataframe 1 0.0048
## 125 mini_kmeans mini_kmeans 7 dataframe 1 0.0049
## 126 gama gama_euclidean 3 dataframe 1 0.0000
## 127 gama gama_euclidean 4 dataframe 1 0.0000
## 128 gama gama_euclidean 5 dataframe 1 0.0000
## 129 gama gama_euclidean 6 dataframe 1 0.0000
## 130 gama gama_euclidean 7 dataframe 1 0.0000
## 131 pvclust pvclust_euclidean 3 dataframe 1 0.0000
## 132 pvclust pvclust_euclidean 4 dataframe 1 0.0000
## 133 pvclust pvclust_euclidean 5 dataframe 1 0.0000
## 134 pvclust pvclust_euclidean 6 dataframe 1 0.0000
## 135 pvclust pvclust_euclidean 7 dataframe 1 0.0000
## 136 pvclust pvclust_correlation 3 dataframe 1 0.0063
## 137 pvclust pvclust_correlation 4 dataframe 1 0.0063
## 138 pvclust pvclust_correlation 5 dataframe 1 0.0060
## 139 pvclust pvclust_correlation 6 dataframe 1 0.0000
## 140 pvclust pvclust_correlation 7 dataframe 1 0.0000
## connectivity dunn silhouette
## 1 55.690 0.1577 0.24
## 2 53.690 0.1682 0.27
## 3 55.750 0.1538 0.25
## 4 78.140 0.1741 0.23
## 5 70.760 0.1657 0.21
## 6 85.290 0.1093 0.14
## 7 95.250 0.1009 0.08
## 8 138.400 0.1069 0.06
## 9 176.300 0.1129 0.06
## 10 180.600 0.1069 0.00
## 11 75.650 0.1314 0.13
## 12 90.700 0.1274 0.11
## 13 85.050 0.1252 0.15
## 14 96.830 0.1210 0.10
## 15 145.600 0.1180 0.10
## 16 29.920 0.1465 0.22
## 17 46.450 0.1684 0.19
## 18 51.880 0.1799 0.19
## 19 58.310 0.2149 0.21
## 20 64.030 0.2218 0.21
## 21 49.040 0.1396 0.23
## 22 53.370 0.1413 0.26
## 23 51.690 0.1495 0.25
## 24 62.640 0.1648 0.24
## 25 75.260 0.1540 0.22
## 26 47.210 0.1122 0.24
## 27 57.100 0.1162 0.24
## 28 64.940 0.1490 0.24
## 29 70.810 0.1490 0.23
## 30 80.100 0.1515 0.21
## 31 46.590 0.1260 0.25
## 32 57.400 0.1295 0.26
## 33 56.430 0.1198 0.25
## 34 69.320 0.1322 0.24
## 35 82.430 0.1509 0.21
## 36 0.000 0.0000 0.00
## 37 0.000 0.0000 0.00
## 38 0.000 0.0000 0.00
## 39 0.000 0.0000 0.00
## 40 0.000 0.0000 0.00
## 41 0.000 0.0000 0.00
## 42 0.000 0.0000 0.00
## 43 0.000 0.0000 0.00
## 44 0.000 0.0000 0.00
## 45 0.000 0.0000 0.00
## 46 48.090 0.1413 0.23
## 47 48.760 0.1465 0.25
## 48 56.520 0.1495 0.24
## 49 90.760 0.1474 0.19
## 50 67.350 0.1838 0.24
## 51 39.550 0.1102 0.24
## 52 62.150 0.1122 0.22
## 53 93.700 0.1182 0.15
## 54 74.830 0.1500 0.22
## 55 94.550 0.1182 0.18
## 56 6.025 0.2916 0.20
## 57 9.096 0.2623 0.07
## 58 13.190 0.1695 -0.02
## 59 20.950 0.1722 -0.04
## 60 24.000 0.1722 -0.08
## 61 6.025 0.2454 0.14
## 62 9.204 0.2239 -0.02
## 63 13.400 0.1789 -0.11
## 64 21.080 0.1835 -0.06
## 65 25.360 0.1596 -0.11
## 66 6.358 0.3520 0.27
## 67 9.954 0.1895 0.15
## 68 13.050 0.1895 0.08
## 69 17.060 0.1245 0.00
## 70 20.620 0.1326 -0.09
## 71 42.850 0.1322 0.23
## 72 52.670 0.1165 0.21
## 73 57.760 0.1396 0.22
## 74 60.590 0.1408 0.21
## 75 65.240 0.1560 0.22
## 76 0.000 0.0000 0.00
## 77 0.000 0.0000 0.00
## 78 0.000 0.0000 0.00
## 79 0.000 0.0000 0.00
## 80 0.000 0.0000 0.00
## 81 0.000 0.0000 0.00
## 82 0.000 0.0000 0.00
## 83 0.000 0.0000 0.00
## 84 0.000 0.0000 0.00
## 85 0.000 0.0000 0.00
## 86 0.000 0.0000 0.00
## 87 0.000 0.0000 0.00
## 88 0.000 0.0000 0.00
## 89 0.000 0.0000 0.00
## 90 0.000 0.0000 0.00
## 91 49.040 0.1396 0.23
## 92 52.810 0.1396 0.25
## 93 51.690 0.1495 0.25
## 94 58.150 0.1657 0.23
## 95 70.200 0.1838 0.22
## 96 47.210 0.1122 0.24
## 97 67.410 0.1332 0.22
## 98 64.940 0.1490 0.24
## 99 65.460 0.1490 0.24
## 100 78.500 0.1500 0.22
## 101 47.390 0.1096 0.18
## 102 34.090 0.1646 0.23
## 103 42.080 0.1619 0.25
## 104 51.460 0.1619 0.23
## 105 55.770 0.1657 0.23
## 106 44.730 0.1183 0.19
## 107 35.590 0.1348 0.23
## 108 46.830 0.1322 0.26
## 109 54.870 0.1467 0.25
## 110 69.020 0.1500 0.24
## 111 39.770 0.1235 0.19
## 112 44.210 0.1495 0.23
## 113 49.220 0.1538 0.26
## 114 57.630 0.1619 0.24
## 115 66.320 0.1520 0.23
## 116 46.310 0.1465 0.25
## 117 51.040 0.1741 0.23
## 118 66.850 0.1520 0.19
## 119 74.780 0.1522 0.19
## 120 81.020 0.1522 0.18
## 121 50.590 0.1350 0.23
## 122 50.350 0.1571 0.21
## 123 76.400 0.1216 0.17
## 124 76.530 0.1500 0.17
## 125 94.570 0.1578 0.18
## 126 0.000 0.0000 0.00
## 127 0.000 0.0000 0.00
## 128 0.000 0.0000 0.00
## 129 0.000 0.0000 0.00
## 130 0.000 0.0000 0.00
## 131 0.000 0.0000 0.00
## 132 0.000 0.0000 0.00
## 133 0.000 0.0000 0.00
## 134 0.000 0.0000 0.00
## 135 0.000 0.0000 0.00
## 136 0.000 0.1686 0.00
## 137 0.000 1.1470 0.00
## 138 0.000 0.0000 0.00
## 139 0.000 0.0000 0.00
## 140 0.000 0.0000 0.00
Si necesitan más detalles sobre como realizar otro tipo de tareas, no duden en poner en contacto conmigo a través de correo electrónico en la siguente dirección: agvico@ujaen.es.