domingo, 6 de julio de 2025

Cluster jerárquico

Creando grupos y tipologías

En ocasiones es necesario crear grupos a partir de algunas características específicas para, por ejemplo, aplicar una política pública. De vez en cuando ontamos con taxonomías que pueden ayudarnos en esta tarea. Pero no siempre sucede esto, o el volumen de datos es tal, que aplicar la taxonomía en forma manual resulta engorroso. El análisis de cluster resulta una herramienta de gran ayuda en estos casos. Nos permite:

  • obtener grupos homogéneos respecto a la(s) varible(s) utilizada(s) para generar la caracterización, y, a la vez
  • grupos heterogéneos en tanto que son distintos entre ellos, de acuerdo con esa(s) variable(s) empleada(s)

Así, en un municipio y tomando en consideración la topografía, los habitantes, y otras característica, habrá parroquias que sean más parecidas entre sí -grupos homogéneos- y, al mismo tiempo, muy diferentes de otras parroquias -grupos heterogéneos.

Procedimiento

  • Seleccionar la muestra

  • Seleccionar las variables

  • Transformar, de ser necesario las variables

  • Seleccionar las medidas que permitirán la creación de grupos homogéneos y heterogéneos

  • Seleccionar y aplicar los criterios de agrupación

  • Seleccionar el número de grupos

La muestra se elige dependiendo de los objetivos del análisis. Ejemplo:

  • encontrar áreas homogéneas en barrio/urbanización/parroquia/municipio: zonas en las que las características de las viviendas sean comunes, para analizar si,
  • las principales características de las personas que habitan esas viviendas también son similares

Un estudio de este tipo de incluir características de la vivienda y datos sociodemográfico de las personas.

Las variables deben ser relevantes. De lo contrario, se obtendrán individuo atípicos. Una serie de variables tiende a revelar una estructura específica. Y suele haber una estructura que se manifiesta en un grupo de variable. Si abundan los casos atípicos, se pierde o no se logra visualizar la estructura.

Si las variables se expresan en escalas diferentes, es necesario homogeneizarlas.

Dependiendo del tipo de variable (intervalo, razón, ordinal, nominal), se eligen las distancias: euclídea, manhathan, entre otras. Y para formar los grupos, existen también diversos procedimientos.

Aplicación

Para crear los clusters, lo primero que necesitamos es crear la distancia. La distancia nos permitirá establecer la similitud y la diferencia entre los elementos del marco de datos. Usemos la data USArrests.

# empleamos la base de datos sobre tasa de crimenes violentos en los 
# Estados Unidos, por cada 100 mil habitantes
head(USArrests)
##            Murder Assault UrbanPop Rape
## Alabama      13.2     236       58 21.2
## Alaska       10.0     263       48 44.5
## Arizona       8.1     294       80 31.0
## Arkansas      8.8     190       50 19.5
## California    9.0     276       91 40.6
## Colorado      7.9     204       78 38.7
#copiamos este marco de dato y colocamos los nombres en castellano
arrestos <-USArrests

names(arrestos)<-c('asesinato', 'asalto', 'pobUrbana', 'violacion')
names(arrestos)
## [1] "asesinato" "asalto"    "pobUrbana" "violacion"

Se crea primero la distancia con la función dist()

# se debe crear primero la distancia. Necesitamos un method para crear
#las distancias. Usaremos el metodo por defecto: distancia euclidea
# el metodo por defecto

arrestosDist <- dist(arrestos)

# creamos ahora la aglomeracion de los elementos. Empleamos tambien el
# metodo por defecto

arrestosHclust <- hclust(arrestosDist)

Tenemos todos los elementos necesarios para crear el cluster. Podemos ahora crear el gráfico, el dendograma

plot(arrestosHclust)

De acuerdo con el gráfico, existen marcadas diferencias entre Florida y North Carolina con North Dakota y Vermont. En forma intuitiva sabemos que estos grupos representan valores opuestos. Adicionalmente, sabemos que los grupos centrales se diferencia entre sí por su proximidad o lejanía de estos dos grupos extremos.

Para facilitar la visualizacion del numero de grupos desedos, podemos emplear la funcion rect.hclust. Vamos a pedir 5 grupos

plot(arrestosHclust)
rect.hclust(arrestosHclust, 5)

Cada grupo es homogéneo en su interior y heterogéneo con respecto al resto de los grupos. Aquí hemos pedido la identificación de 5 grupos. Nótese que Florida y North Carolina tienen características tan particulares, que esas dos observaciones forman un grupo.

Podemos extraer los diferentes grupos, con lo que podríamos elaborar un gráfico distintos, por ejemplo

# Grupos

grupos <-cutree(arrestosHclust, 5)

# podemos obtener el numero de casos en cada cluster
table(grupos)
## grupos
##  1  2  3  4  5 
## 14 14 10  2 10

El primero y segundo grupo contienen 14 observaciones; el tercero y el quinto, 10, en tanto que el grupo 4 contiene dos informaciones.

arrestosHclust
## 
## Call:
## hclust(d = arrestosDist)
## 
## Cluster method   : complete 
## Distance         : euclidean 
## Number of objects: 50
arrestosHclust$merge
##       [,1] [,2]
##  [1,]  -15  -29
##  [2,]  -17  -26
##  [3,]  -14  -16
##  [4,]  -13  -32
##  [5,]  -35  -44
##  [6,]  -36  -46
##  [7,]   -7  -38
##  [8,]  -19  -41
##  [9,]  -49    1
## [10,]  -21  -30
## [11,]  -37    6
## [12,]   -4  -42
## [13,]  -48    8
## [14,]  -34  -45
## [15,]  -22  -28
## [16,]  -27    2
## [17,]   -3  -31
## [18,]   -6  -43
## [19,]  -12    3
## [20,]   -1  -18
## [21,]  -50   11
## [22,]  -20   17
## [23,]   -8   20
## [24,]    5    7
## [25,]  -23    9
## [26,]   16   19
## [27,]  -24  -40
## [28,]    4   15
## [29,]  -47   10
## [30,]  -25   12
## [31,]  -10   18
## [32,]   -2   27
## [33,]   21   29
## [34,]   24   26
## [35,]  -11   25
## [36,]   -5   28
## [37,]   30   31
## [38,]  -39   33
## [39,]   -9  -33
## [40,]   13   14
## [41,]   23   32
## [42,]   22   36
## [43,]   35   40
## [44,]   41   42
## [45,]   37   38
## [46,]   34   43
## [47,]   39   44
## [48,]   45   46
## [49,]   47   48
h.cl<-arrestosHclust$height
h.cl2<-c(0,h.cl[-length(h.cl)])
round(h.cl-h.cl2,3)
##  [1]   2.291   1.543   0.095   2.308   0.401   0.717   0.672   0.510
##  [9]   2.322   0.596   0.969   0.189   0.161   0.270   0.252   0.052
## [17]   0.547   0.605   0.907   0.047   0.176   0.260   1.087   1.288
## [25]   1.173   0.467   1.263   1.199   0.401   2.128   0.199   3.542
## [33]   0.616   2.226   0.143   1.098   4.016   0.113   1.680   2.960
## [41]   7.237   4.868   3.678   7.723   3.769  18.564  15.535  65.750
## [49] 125.011
max(round(h.cl-h.cl2,3))
## [1] 125.011
which.max(round(h.cl-h.cl2,3))
## [1] 49