15 may 2019

Análisis de cluster jerárquico en R

En la siguiente entrada se muestra un ejemplo de como segmentar un conjunto de observaciones de una base de datos, según un criterio de cercanía de las variables en cuestión.

El siguiente bloque de códigos únicamente cargan una base hipotéticas:

id<-1:13
nombre<-c("Jose","Pedro","Maria","Anna", "Leo","Eva","Alex","Miren",
          "Beatriz","Cristian","Martha","Vero","Adris")

edad<-c(22, 45, 38, 41, 29, 40, 63, 17, 22, 36, 52, 51, 19)

sexo<-c("H","H","M","M", "H","M","H","M","M","H","M","M","M")
sexo<- as.numeric(sexo=="H")
 
ingresosMes<-c(7000, 85000, 26000, 117000, 0, 32000,
               130000, 6500, 8900, 8600, 29000, 80000, 13000)

tarjetasMes<-c(0, 40000, 12000, 50000, 0, 12000,
               80000, 0, 0, 0, 10000, 35000, 0)

HipotecasMes<-c(0, 32000, 0, 41000, 0, 0,
                35000, 0, 0, 0, 0, 3000, 0)

tarjetasMesU<-c(0, 0.85, 1, 0.8, 0, 1, 0.7, 0, 0, 0, 0.4, 0.5, 0)

solicitud<-c("No", "Si", "Si", "No", "No", "Si",
             "Si", "No", "No", "No", "No", "Si", "Si")

solicitud<-solicitud=="Si"
 
BancoLaFuerza<-data.frame(id, nombre, edad, sexo,ingresosMes,tarjetasMes, HipotecasMes, tarjetasMesU, solicitud)

Ahora, se estandarizan las variables que se utilizaran para la categorización, esto así para evitar que la distancia calculada este incidida por la escala de las variables.

> library(foreign) 
> 
> Z<-scale(BancoLaFuerza[ ,-c(1,2,9)])
> row.names(Z)<-nombre

Ahora, obtenemos la matriz de distancias y verificamos como se conforman los grupos:

> cj=hclust(dist(Z)^2, method = "average")
> cj$merge
      [,1] [,2]
 [1,]   -3   -6
 [2,]   -8  -13
 [3,]   -9    2
 [4,]   -1   -5
 [5,]  -10    4
 [6,]  -11  -12
 [7,]    1    6
 [8,]    3    5
 [9,]   -2   -4
[10,]   -7    9
[11,]    7    8
[12,]   10   11

La forma de interpretar la salida anterior es que el primer paso el algoritmo agrupó a la observación 3 con la 6 ([1,]   -3   -6); en el segundo paso agrupó la observación 8 con la 13 ([2,]   -8  -13) y en el tercer paso, agrupó la observación 9, con las dos observaciones que se agruparon en el paso 2 ([3,]   -9    2), y así de forma sucesiva. De esta manera, puede verse que números negativos indican asociación entre observaciones, mientras que los positivos indican asociación de una observación, con algunas observaciones ya agrupadas previamente.

El dendograma es una forma gráfica sencilla de verificar la conformación de grupos:

> plot(cj,main="Dendograma",labels=row.names(Z),hang=-1)

 
Finalmente, para tener la indicación del grupo al que pertenece cada observación:

> g=cutree(cj,k=4)
> g
    Jose    Pedro    Maria     Anna      Leo      Eva     Alex    Miren 
       1        2        3        2        1        3        4        1 
 Beatriz Cristian   Martha     Vero    Adris 
       1        1        3        3        1 

Creando variables por grupos en dplyr (group_by + mutate)

  Simulemos una base de hogares, donde se identifica el hogar, el sexo (1 mujer) y provincia y edad para cada miembro.   # Definir la lista ...