Clustering jerárquico

Clustering o agrupamiento

En esta clase abordamos un problema canónico de la analítica de datos empresariales: encontrar, evaluar y predecir segmentos o grupos de clientes y productos. En clases anteriores, hemos visto cómo evaluar las relaciones en los datos, comparar grupos y evaluar modelos lineales multivariados. En un proyecto de segmentación real, se usarían esos métodos para asegurarse de que los datos tengan una estructura multivariante adecuada y luego comenzaría el análisis de segmentación.

El objetivo general de la segmentación es encontrar grupos que difieran en aspectos importantes entre ellos, en algunos casos asociados con el interés del producto, la participación en el mercado o la respuesta a los esfuerzos de marketing. Al comprender las diferencias entre los grupos, un comercializador puede tomar mejores decisiones estratégicas sobre oportunidades, definición de productos y posicionamiento, y puede participar en una promoción más efectiva.

Sin embargo, el mayor problema de estos métodos no radica en su aplicación. No es particularmente difícil encontrar grupos dentro de los datos de los consumidores; de hecho, veremos dos formas de hacer esto, todas las cuales “tienen éxito” de acuerdo con un criterio estadístico u otro. Más bien, la dificultad radica en garantizar que el resultado sea significativo para una necesidad empresarial en particular.

El término segmentación o clustering hace referencia a un amplio abanico de técnicas no supervisadas cuya finalidad es encontrar patrones o grupos (clusters) dentro de un conjunto de observaciones. Las particiones se establecen de forma que, las observaciones que están dentro de un mismo grupo, son similares entre ellas y distintas a las observaciones de otros grupos. Se trata de un método no supervisado, ya que el proceso ignora la variable respuesta que indica a que grupo pertenece realmente cada observación (si es que existe tal variable). Esta característica diferencia al clustering de las técnicas supervisadas, que emplean un set de entrenamiento en el que se conoce la verdadera clasificación.

Para resumir, la segmentación es como cortar un ponqué, y cualquier ponqué puede cortarse en un número infinito de formas. Su tarea es considerar la infinidad de datos posibles que podrían recopilarse, la infinidad de agrupaciones posibles de esos datos y la infinidad de necesidades empresariales posibles que podrían abordarse. Su objetivo es encontrar una solución dentro de esos infinitos que represente diferencias reales en los datos y que informe e influya en decisiones reales.

Dada la utilidad del clustering en disciplinas muy distintas (genómica, marketing…), se han desarrollado multitud de variantes y adaptaciones de sus métodos y algoritmos. Pueden diferenciarse tres grupos principales:

  • Partitioning Clustering: Este tipo de algoritmos requieren que el usuario especifique de antemano el número de clusters que se van a crear (K-means, K-medoids, CLARA).

  • Hierarchical Clustering: Este tipo de algoritmos no requieren que el usuario especifique de antemano el número de clusters. (agglomerative clustering, divisive clusterig).

  • Métodos que combinan o modifican los anteriores (hierarchical K-means, fuzzy clustering, model based clustering y density based clustering).

En estas clases abordaremos las dos primeras categorías, segmentación por partición y segmentación jerárquica, las cuales se basan en el uso de distancias.

Distancias

Pero, ¿a qué nos referimos por distancia? Al igual que cuando utilizamos el teorema de pitágoras, las distancias entre los datos corresponde a la diferencia entre cada uno de ellos en diferentes sistemas de coordenadas. Para encontrar la distancia entre dos datos, usamos una función de distancia, la cual proporciona la distancia entre los elementos de un conjunto. Si la distancia es cero, los elementos son equivalentes; de lo contrario, son diferentes entre sí.

Figura 1: concepto de distancia

Si se representan las observaciones en un espacio p dimensional, siendo p el número de variables asociadas a cada observación, cuando más se asemejen dos observaciones más próximas estarán, de ahí que se emplee el término distancia. La característica que hace del clustering un método adaptable a escenarios muy diversos es que puede emplear cualquier tipo de distancia, lo que permite al investigador escoger la más adecuada para el estudio en cuestión. A continuación, se describen algunas de las más utilizadas.

Una función de distancia no es más que una fórmula matemática utilizada por métricas de distancia entre dos vectores “xik” y “xjk”. Existen muchas métricas para medir la distancia entre datos, exploraremos por el momento 4 tipos de distancia:

Distancia euclidiana

La distancia euclídea entre dos puntos p y q se define como la longitud del segmento que une ambos puntos. En coordenadas cartesianas, la distancia euclídea se calcula empleando el teorema de Pitágoras. Por ejemplo, en un espacio de dos dimensiones en el que cada punto está definido por las coordenadas (x,y), la distancia euclídea entre p y q viene dada por la ecuación:

\[\begin{equation} d_{euc}(p,q) = \sqrt{(x_p - x_q)^2 + (y_p - y_q)^2} \end{equation}\]

\[\begin{equation} d_{euc}(p,q) = \sqrt{(p_1 - q_1)^2 + (p_2 - q_2)^2 +...+(p_n - q_n)^2} = \sqrt{\sum_{i=1}^n (p_i - q_i)^2} \end{equation}\]

Una forma de dar mayor peso a aquellas observaciones que están más alejadas es emplear la distancia euclídea al cuadrado. En el caso del clustering, donde se busca agrupar observaciones que minimicen la distancia, esto se traduce en una mayor influencia de aquellas observaciones que están más distantes.

Distancia de Manhattan

La distancia de Manhattan, también conocida como taxicab metric, rectilinear distance o L1 distance, define la distancia entre dos puntos p y q como el sumatorio de las diferencias absolutas entre cada dimensión. Esta medida se ve menos afectada por outliers (es más robusta) que la distancia euclídea debido a que no eleva al cuadrado las diferencias.

\[\begin{equation} d_{man}(p,q) = \sum_{i=1}^n |(p_i - q_i)| \end{equation}\]

Correlación

La correlación es una medida de distancia muy útil cuando la definición de similitud se hace en términos de patrón o forma y no de desplazamiento o magnitud. ¿Qué quiere decir esto? En la imagen del apartado de la distancia euclídea, las dos observaciones tienen exactamente el mismo patrón, la única diferencia es que una de ellas está desplazada 4 unidades por encima de la otra. Si se emplea como medida de similitud 1 menos el valor de la correlación, ambas observaciones se consideran idénticas (su distancia es 0).

\[\begin{equation} d_{cor}(p,q) = 1 - \text{correlacion}(p,q) \end{equation}\]

Simple Matching Coefficient

Cuando las variables con las que se pretende determinar la similitud entre observaciones son de tipo binario, a pesar de que es posible codificarlas de forma numérica como 1 o 0, no tiene sentido aplicar operaciones aritméticas sobre ellas (media, suma…). Por ejemplo, si la variable sexo se codifica como 1 para mujer y 0 para hombre, carece de significado decir que la media de la variable sexo en un determinado set de datos es 0.5. En situaciones como esta, no se pueden emplear medidas de similitud basadas en distancia euclídea, manhattan, correlación…

Dado dos objetos A y B, cada uno con n atributos binarios, el simple matching coefficient (SMC) define la similitud entre ellos como:

\[\begin{equation} SMC= \frac{\text{número coincidencias}}{\text{número total de atributos}} = \frac{M_{00} + M{11}}{M_{00} + M_{01}+ M_{10}+M_{11}} \end{equation}\]

Escala de las variables

Al igual que en otros métodos estadísticos (PCA, ridge regression, lasso…), la escala en la que se miden las variables y la magnitud de su varianza pueden afectar en gran medida a los resultados obtenidos por clustering. Si una variable tiene una escala mucho mayor que el resto, determinará en gran medida el valor de distancia/similitud obtenido al comparar las observaciones, dirigiendo así la agrupación final. Escalar y centrar las variables de forma que todas ellas tengan media 0 y desviación estándar 1 antes de calcular la matriz de distancias asegura que todas las variables tengan el mismo peso cuando se realice el clustering.

Pero antes de entrar a la materia vamos a cargar nuestros datos.

Cargue de datos

El día de hoy trabajaremos con una base de datos de clientes de banco nuevamente:

data1 <- read.csv("Clase 12.csv")
data1 <- na.omit(data1)
str(data1)
## 'data.frame':    8636 obs. of  18 variables:
##  $ CUST_ID                         : chr  "C10001" "C10002" "C10003" "C10005" ...
##  $ BALANCE                         : num  40.9 3202.5 2495.1 817.7 1809.8 ...
##  $ BALANCE_FREQUENCY               : num  0.818 0.909 1 1 1 ...
##  $ PURCHASES                       : num  95.4 0 773.2 16 1333.3 ...
##  $ ONEOFF_PURCHASES                : num  0 0 773 16 0 ...
##  $ INSTALLMENTS_PURCHASES          : num  95.4 0 0 0 1333.3 ...
##  $ CASH_ADVANCE                    : num  0 6443 0 0 0 ...
##  $ PURCHASES_FREQUENCY             : num  0.1667 0 1 0.0833 0.6667 ...
##  $ ONEOFF_PURCHASES_FREQUENCY      : num  0 0 1 0.0833 0 ...
##  $ PURCHASES_INSTALLMENTS_FREQUENCY: num  0.0833 0 0 0 0.5833 ...
##  $ CASH_ADVANCE_FREQUENCY          : num  0 0.25 0 0 0 0 0 0 0 0 ...
##  $ CASH_ADVANCE_TRX                : int  0 4 0 0 0 0 0 0 0 0 ...
##  $ PURCHASES_TRX                   : int  2 0 12 1 8 64 12 5 3 12 ...
##  $ CREDIT_LIMIT                    : num  1000 7000 7500 1200 1800 13500 2300 7000 11000 1200 ...
##  $ PAYMENTS                        : num  202 4103 622 678 1400 ...
##  $ MINIMUM_PAYMENTS                : num  140 1072 627 245 2407 ...
##  $ PRC_FULL_PAYMENT                : num  0 0.222 0 0 0 ...
##  $ TENURE                          : int  12 12 12 12 12 12 12 12 12 12 ...
##  - attr(*, "na.action")= 'omit' Named int [1:314] 4 46 48 55 56 57 64 94 95 98 ...
##   ..- attr(*, "names")= chr [1:314] "4" "46" "48" "55" ...

Como podrán ver, tenemos una base de datos con las diferentes características de un cliente de un banco. Estas características incluyen frecuencia de compras, pagos, avances de tarjetas, entre otros. La base de datos la podrán encontrar en el siguiente enlace: https://www.dropbox.com/s/eic7jp5hb799cpt/Clase%2012.csv?dl=0

Dado que queremos probar nuestras distancias, haremos algunos cálculos usando los métodos vistos en el punto anterior. Para eso usaremos el paquete cluster() y la función daisy():

library(cluster)

dist1 <- daisy(data1[1:100,2:18], metric="euclidean", stand = TRUE)
as.matrix(dist1)[1:5,1:5]
##          1        2        3        5        6
## 1 0.000000 5.261579 5.714838 1.685207 4.255292
## 2 5.261579 0.000000 6.865563 5.041064 6.237479
## 3 5.714838 6.865563 0.000000 5.253074 5.906608
## 5 1.685207 5.041064 5.253074 0.000000 4.190705
## 6 4.255292 6.237479 5.906608 4.190705 0.000000

Cómo podemos ver, tenemos una matriz de distancias estandarizada (con el parámetro stand) utilizando la distancia euclidiana(con el parámetro metric. Si usamos la distancia de Manhattan, la función quedaría así:

dist2 <- daisy(data1[1:100,2:18], metric="manhattan", stand = TRUE)
as.matrix(dist2)[1:5,1:5]
##           1        2        3         5        6
## 1  0.000000 15.11620 14.53954  3.439137 11.70701
## 2 15.116197  0.00000 19.89450 13.944010 20.61761
## 3 14.539536 19.89450  0.00000 11.891612 15.01659
## 5  3.439137 13.94401 11.89161  0.000000 10.59095
## 6 11.707010 20.61761 15.01659 10.590953  0.00000

Como podemos ver, las distancias calculadas por el método de Manhattan son mayores (como era de esperarse). Otra función que podemos utilizar para lograr el mismo resultado es dist():

dist3 <- dist(data1[1:100,2:18], method = "manhattan")
as.matrix(dist3)[1:5,1:5]
##           1        2         3         5         6
## 1     0.000 20636.19 11420.726  1750.860  8517.862
## 2 20636.186     0.00 13141.188 18917.675 19753.838
## 3 11420.726 13141.19     0.000  9943.369 11615.749
## 5  1750.860 18917.68  9943.369     0.000  7151.102
## 6  8517.862 19753.84 11615.749  7151.102     0.000

Si comparamos los resultados, vemos que con este método genera resultados pero dichos resultados no están centrados ni estandarizados, haciendo que algunas variables sean más importantes. Recuerden, para solucionar este problema podemos usar la función scale()sobre nuestros datos.

Procedimiento para la segmentación o clustering

Empecemos con un ejemplo. Suponga que fue a una tienda a comprar algunas verduras. Allí verá diferentes tipos de frutas y verduras, adempas de otros productos. Lo único que notará allí es que las verduras se organizarán en un grupo de sus tipos. Como todas las zanahorias se mantendrán en un solo lugar, las papas se mantendrán con sus tipos y así sucesivamente. Si observa aquí, encontrará que están formando un grupo o grupo, donde cada una de las verduras se mantiene dentro de su tipo de grupo formando los grupos. A esto es lo que llamamos análisis de agrupación.

El análisis de agrupación requiere dos etapas: encontrar una solución de agrupación propuesta y evaluar esa solución para las necesidades comerciales de uno. Para cada método, seguimos los siguientes pasos:

  • Transformar los datos si es necesario para un método de agrupamiento en particular; por ejemplo, algunos métodos requieren todos los datos numéricos (por ejemplo, clustering basado en la media) o todos los datos categóricos (por ejemplo, poLCA).

  • Calcule una matriz de distancias si es necesario; algunos métodos requieren una matriz de similitud precalculada para agrupar las observaciones (por ejemplo, clustering jerárquico).

  • Aplicar el método de agrupación en clústeres y guardar su resultado en un objeto. Para algunos métodos, esto requiere especificar el número (K) de grupos deseados (por ejemplo, KMeans).

  • Para algunos métodos, analiza más el objeto para obtener una solución con grupos K (por ejemplo, clustering jerárquico).

  • Examine la solución en el objeto modelo con respecto a los datos subyacentes y considere si responde a realmente a la necesidad planteada.

Como ya hemos argumentado, la parte más difícil de ese proceso es el último paso: establecer si una solución estadística propuesta responde a una necesidad empresarial. En última instancia, una solución de clúster es en gran medida solo un vector de supuestas asignaciones de grupo para cada observación, como “1, 1, 4, 3, 2, 3, 2, 2, 4, 1, 4. . ..”Depende de usted averiguar si eso cuenta una historia significativa para sus datos.

Dado lo anterior, ya podemos hablar sobre nuestros métodos a utilizar. Los métodos basados en la distancia intentan encontrar grupos que minimicen la distancia entre los miembros dentro del grupo, mientras maximizan la distancia de los miembros de otros grupos. El agrupamiento jerárquico hace esto modelando los datos en una estructura de árbol, mientras que kmeans usa centroides de grupo (puntos centrales). Pero, ¿en qué casos los usamos?:

  • Agrupación jerárquica: la ventaja de esta técnica es que resulta muy útil para agrupar diferentes puntos de datos. En otras palabras, la salida del modelo es un árbol y podemos elegir cualquier combinación del árbol para construir clústeres para diferentes números de clústeres. La desventaja de la técnica es que solo puede manejar unos pocos puntos de datos y requiere un tiempo exponencial para la gran cantidad de observaciones. Si esto no fuera una limitación para la técnica, ningún análisis de conglomerados habría fallado.

  • Agrupación de k-medias: La ventaja de esta técnica es que puede manejar un gran número de observaciones y toma menos tiempo en comparación con todas las otras técnicas disponibles. La desventaja de la técnica es que no es posible cambiar el proceso intermedio a puntos de datos del grupo al segundo mejor grupo. Por lo tanto, el método es mucho más rígido en comparación con la agrupación jerárquica.

Clustering jerárquico

Hierarchical clustering es una alternativa a los métodos de partitioning clustering que no requiere que se pre-especifique el número de clusters. Los métodos que engloba el hierarchical clustering se subdividen en dos tipos dependiendo de la estrategia seguida para crear los grupos:

  • Agglomerative clustering (bottom-up): el agrupamiento se inicia en la base del árbol, donde cada observación forma un cluster individual. Los clusters se van combinado a medida que la estructura crece hasta converger en una única “rama” central.

  • Divisive clustering (top-down): es la estrategia opuesta al agglomerative clustering, se inicia con todas las observaciones contenidas en un mismo cluster y se suceden divisiones hasta que cada observación forma un cluster individual.

En ambos casos, los resultados pueden representarse de forma muy intuitiva en una estructura de árbol llamada dendrograma.

Agrupación aglomerativa

La estructura resultante de un agglomerative hierarchical clustering se obtiene mediante un algoritmo sencillo.

El proceso se inicia considerando cada una de las observaciones como un cluster individual, formando así la base del dendrograma (hojas).

Se inicia un proceso iterativo hasta que todas las observaciones pertenecen a un único cluster:

  1. Se calcula la distancia entre cada posible par de los n clusters. El investigador debe determinar el tipo de medida emplea para cuantificar la similitud entre observaciones o grupos (distancia y linkage).

  2. Los dos clusters más similares se fusionan, de forma que quedan n-1 clusters.

  3. Determinar dónde cortar la estructura de árbol generada (dendrograma).

La siguiente imagen muestra cómo se van sucediendo las agrupaciones a medida que avanzan las primeras iteraciones del algoritmo.

Figura 2: agrupamiento aglomerativo

Para que el proceso de agrupamiento pueda llevarse a cabo tal como indica el algoritmo anterior, es necesario definir cómo se cuantifica la similitud entre dos clusters. Es decir, se tiene que extender el concepto de distancia entre pares de observaciones para que sea aplicable a pares de grupos, cada uno formado por varias observaciones. A este proceso se le conoce como linkage. A continuación, se describen los 5 tipos de linkage más empleados y sus definiciones.

  • Complete or Maximum: Se calcula la distancia entre todos los posibles pares formados por una observación del cluster A y una del cluster B. La mayor de todas ellas se selecciona como la distancia entre los dos clusters. Se trata de la medida más conservadora (maximal intercluster dissimilarity).

  • Single or Minimum: Se calcula la distancia entre todos los posibles pares formados por una observación del cluster A y una del cluster B. La menor de todas ellas se selecciona como la distancia entre los dos clusters. Se trata de la medida menos conservadora (minimal intercluster dissimilarity).

  • Average: Se calcula la distancia entre todos los posibles pares formados por una observación del cluster A y una del cluster B. El valor promedio de todas ellas se selecciona como la distancia entre los dos clusters (mean intercluster dissimilarity).

  • Centroid: Se calcula el centroide de cada uno de los clusters y se selecciona la distancia entre ellos como la distancia entre los dos clusters.

Los métodos de linkage complete y average variance suelen ser los preferidos por los analistas debido a que generan dendrogramas más compensados. Sin embargo, no se puede determinar que uno sea mejor que otro, ya que depende del caso de estudio en cuestión. Por ejemplo, en genómica, se emplea con frecuencia el método de centroides. Junto con los resultados de un proceso de hierarchical clustering siempre hay que indicar qué distancia se ha empleado, así como el tipo de linkage, ya que, dependiendo de estos, los resultados pueden variar en gran medida. Vamos a proceder a crear nuestro primer modelo usando el comando hclust():

set.seed(587)
hc1 <- hclust(d = dist1, method = "complete")
hc2 <- hclust(d = dist1, method = "average")

Como podrán ver, con solamente usar una línea somos capaces de crear un árbol completo para realizar el agrupamiento. Podríamos comprobar una de las métricas de bondad de ajuste para una solución de clúster jerárquica. Un método es el coeficiente de correlación cofenética (CPCC), que evalúa qué tan bien un dendrograma coincide con la métrica de distancia real. Valores superiores a 0.75 suelen considerarse como buenos. Usamos cophenetic() para obtener las distancias del dendrograma, y lo comparamos con las métricas dist() con cor:

cor(cophenetic(hc2),dist1)
## [1] 0.9062796

Dado que este número es alto y cercano a 1, podemos afirmar que el árbol realmente refleja las métricas reales

Ahora, para realizar su visualización usaremos un nuevo gráfico llamado dendograma.

Dendograma

Un dendrograma es un tipo de representación gráfica o diagrama de datos en forma de árbol que organiza los datos en subcategorías que se van dividiendo en otros hasta llegar al nivel de detalle deseado (asemejándose a las ramas de un árbol que se van dividiendo en otras sucesivamente).

En la base del dendrograma, cada observación forma una terminación individual conocida como hoja o leaf del árbol. A medida que se asciende por la estructura, pares de hojas se fusionan formando las primeras ramas. Estas uniones (nodos) se corresponden con los pares de observaciones más similares. También ocurre que ramas se fusionan con otras ramas o con hojas. Cuanto más temprana (más próxima a la base del dendrograma) ocurre una fusión, mayor es la similitud. Esto significa que, para cualquier par de observaciones, se puede identificar el punto del árbol en el que las ramas que contienen dichas observaciones se fusionan.

La altura a la que esto ocurre (eje vertical) indica cómo de similares/diferentes son las dos observaciones. Los dendrogramas, por lo tanto, se deben interpretar únicamente en base al eje vertical y no por las posiciones que ocupan las observaciones en el eje horizontal, esto último es simplemente por estética y puede variar de un programa a otro. Para ver nuestro dendograma usaremos el comando más sencillo de gráficos, plot():

plot(hc1)

Al aplicar hierarchical clustering, empleando como medida de similitud la distancia euclídea y linkage complete, se obtiene el anterior dendrograma. Este árbol por si solo no nos dice mucho, solo refleja las agrupaciones que se hicieron. Ahora debemos determinar el punto de corte sobre este árbol.

Nivel de corte en el árbol

Además de representar en un dendrograma la similitud entre observaciones, se tiene que poder identificar el número de clusters creados y qué observaciones forman parte de cada uno. Si se realiza un corte horizontal a una determinada altura del dendrograma, el número de ramas que sobrepasan (en sentido ascendente) dicho corte se corresponde con el número de clusters.

Determinar el número óptimo de clusters es uno de los pasos más complicados a la hora de aplicar métodos de clustering, sobre todo cuando se trata de partitioning clustering, donde el número se tiene que especificar antes de poder ver los resultados. No existe una forma única de averiguar el número adecuado de clusters. Es un proceso bastante subjetivo que depende en gran medida del tipo de clustering empleado y de si se dispone de información previa sobre los datos con los que se está trabajando, por ejemplo, estudios anteriores pueden sugerir o acotar las posibilidades. A pesar de ello, se han desarrollado varias estrategias que ayudan en el proceso.

En esta clase veremos una posible estrategia. Existe una técnica heurística desarrollada por investigadores de la Universidad Nacional de Colombia para hacer este corte. Esta técnica los indices de ward que nos permitan saber el corte. Se determina el nivel en el cual los pesos del árbol generan el mayor cambio (maximizan la distancia externa). Para ello usaremos, por tanto, los pesos del árbol y los graficaremos:

coord <- as.vector(hc1$height)
plot(coord[90:100], type="h")

¿Cómo se utiliza? Se busca el vector donde se lleve a cabo el último salto significativo que exista, y el vector al cual lleguemos será el nivel de corte (contados de atrás hacia adelante). En este caso el corte podría darse en el corte es el nivel 5.

Ahora que hemos realizado este ejercicio, podemos proceder a cortar el árbol. Para eso usaremos la función cutree() indicando la cantidad de clusters a realizar:

branch1 <- cutree(hc1, k=5)
table(branch1)
## branch1
##  1  2  3  4  5 
## 75  6  5 13  1

¿Por qué tenemos un dato solo en la categoría 5? Como podrán apreciar en el árbol, la observación 72 parece ser atípica y toma “tiempo” que se una a los otros grupos.

Revisión de los resultados

Ahora que tenemos los datos, haremos unos gráficos iniciales para revisar los resultados. Empezaremos creando una base de datos simplificada para llevar a cabo la comparación:

data2 <- data1[1:100,]
data2$rama <- as.factor(branch1)

Ahora que ya la tenemos veremos aquellas variables que hacen realmente la diferencia entre los grupos creados:

library(ggplot2)

ggplot(data2, aes(x=BALANCE, y= rama)) + geom_boxplot() + theme_minimal()

ggplot(data2, aes(x=PURCHASES, y= rama)) + geom_boxplot() + theme_minimal()

ggplot(data2, aes(x=CREDIT_LIMIT, y= rama)) + geom_boxplot() + theme_minimal()

ggplot(data2, aes(x=MINIMUM_PAYMENTS, y= rama)) + geom_boxplot() + theme_minimal()

A partir de las comparaciones entre los diferentes grupos podemos realizar una caracterizacion de los grupos que hemos creado. Ahora será su desafío encontrar otas versiones interesantes de divisiones entre los datos.