CLUSTER JERÁRQUICO Y DE PARTICIÓN

Camilo Mendez Hilario -

Descripción del caso

Los bancos suelen tener campañas de marketing para sus productos individuales. Therabank es un banco establecido que ofrece préstamos personales como producto. La mayoría de los clientes de Therabank tienen depósitos, lo que constituye un pasivo para el banco y no es rentable. Los préstamos son rentables para el banco. Por tanto, conseguir que más clientes opten por un préstamo personal hace que el negocio sea más rentable. La tarea en cuestión es crear segmentos de clientes para maximizar la efectividad de su campaña de préstamos personales. El banco tiene datos de los clientes que incluyen datos demográficos, cierta información financiera y cómo respondieron estos clientes a una campaña anterior. Las columnas más importantes son: • Age: edad del cliente en años • Experience: La experiencia laboral del cliente en años. • Income: los ingresos anuales estimados del cliente(miles de dólares estadounidenses) • CCAvg: el gasto promedio en tarjetas de crédito por mes(miles de dólares estadounidenses) • Mortgage: el valor de la hipoteca de la casa del cliente(si corresponde) • Family: número de miembros de su hogar

Objetivo

  • crear segmentos de clientes para la campaña de marketing. También identificará cuáles de estos segmentos tienen la mayor propensión a responder a la campaña, información que ayudará en gran medida a optimizar campañas futuras. Se trabajará únicamente con las columnas más importantes mencionadas anteriormente.

Paquetes

library(pacman)
p_load(cluster, aplpack, fpc, foreign, TeachingDemos,
       factoextra, NbClust, ape, corrplot, DataExplorer,
       funModeling, compareGroups, tidyverse, dendextend,
       igraph, FeatureImpCluster, flexclust, LICORS, h2o,
       gghighlight,readr)
## Error in download.file(url, destfile, method, mode = "wb", ...) : 
##   download from 'http://cran.rstudio.com/bin/windows/contrib/4.2/h2o_3.36.1.2.zip' failed

Lectura de Datos

data <- read.csv("Bank_Personal_Loan_Modelling-2.csv",
                    sep = ";", stringsAsFactors = T)
data <- data %>% select(Age, Experience, Income, CCAvg, Mortgage, Family)
head(data)
##   Age Experience Income CCAvg Mortgage Family
## 1  25          1     49   1.6        0      4
## 2  45         19     34   1.5        0      3
## 3  39         15     11   1.0        0      1
## 4  35          9    100   2.7        0      1
## 5  35          8     45   1.0        0      4
## 6  37         13     29   0.4      155      4

Análisis de Datos

df_status(data)
##     variable q_zeros p_zeros q_na p_na q_inf p_inf    type unique
## 1        Age       0    0.00    0    0     0     0 integer     45
## 2 Experience      66    1.32    0    0     0     0 integer     47
## 3     Income       0    0.00    0    0     0     0 integer    162
## 4      CCAvg     106    2.12    0    0     0     0 numeric    108
## 5   Mortgage    3462   69.24    0    0     0     0 integer    347
## 6     Family       0    0.00    0    0     0     0 integer      4

Descripción de las variables numéricas

profiling_num(data)
##     variable      mean    std_dev variation_coef p_01 p_05 p_25 p_50  p_75 p_95
## 1        Age 45.338400  11.463166      0.2528357   25 27.0 35.0 45.0  55.0   63
## 2 Experience 20.104600  11.467954      0.5704144   -1  2.0 10.0 20.0  30.0   38
## 3     Income 73.774200  46.033729      0.6239814   10 18.0 39.0 64.0  98.0  170
## 4      CCAvg  1.937938   1.747659      0.9018137    0  0.1  0.7  1.5   2.5    6
## 5   Mortgage 56.498800 101.713802      1.8002825    0  0.0  0.0  0.0 101.0  272
## 6     Family  2.396400   1.147663      0.4789113    1  1.0  1.0  2.0   3.0    4
##     p_99    skewness kurtosis   iqr    range_98   range_80
## 1  65.00 -0.02933188 1.846886  20.0    [25, 65]   [30, 61]
## 2  41.00 -0.02631679 1.878399  20.0    [-1, 41]    [4, 36]
## 3 193.00  0.84108618 2.954600  59.0   [10, 193]  [22, 145]
## 4   8.00  1.59796376 5.642861   1.8      [0, 8] [0.3, 4.3]
## 5 431.01  2.10337107 7.750841 101.0 [0, 431.01]   [0, 200]
## 6   4.00  0.15517410 1.596617   2.0      [1, 4]     [1, 4]
summary(data)
##       Age          Experience       Income           CCAvg       
##  Min.   :23.00   Min.   :-3.0   Min.   :  8.00   Min.   : 0.000  
##  1st Qu.:35.00   1st Qu.:10.0   1st Qu.: 39.00   1st Qu.: 0.700  
##  Median :45.00   Median :20.0   Median : 64.00   Median : 1.500  
##  Mean   :45.34   Mean   :20.1   Mean   : 73.77   Mean   : 1.938  
##  3rd Qu.:55.00   3rd Qu.:30.0   3rd Qu.: 98.00   3rd Qu.: 2.500  
##  Max.   :67.00   Max.   :43.0   Max.   :224.00   Max.   :10.000  
##     Mortgage         Family     
##  Min.   :  0.0   Min.   :1.000  
##  1st Qu.:  0.0   1st Qu.:1.000  
##  Median :  0.0   Median :2.000  
##  Mean   : 56.5   Mean   :2.396  
##  3rd Qu.:101.0   3rd Qu.:3.000  
##  Max.   :635.0   Max.   :4.000
  • Interpretación:

La presenta data no presenta datos perdidos (NA), por lo que es un buen indicador ya que esta técnica de interdependencia tiene como objetivo análizar a las obseraciones y a travez de técnicas poder agruparlas. Se pudo observar que las medidas de variabilidad de cada variable presenta variaciones entre ellas, el rango de las variables difieren significativamente. Por lo tanto, se procederá a estandarizar las variables para que presenten un valor similar, al calcular las medidas de variabilidad. Esto con la finalidad de que al momento de aplicar medidas de distancia para hallar la matriz de distancia, los valores obtenidos sean los correctos y así poder agrupar bien, ya que estos valores calculados se ven afectados cuando las variables no se encuentran medidas en la misma escala.

Estandarización de los datos

datos.e <- as.data.frame(scale(data))
head(datos.e)
##           Age  Experience     Income      CCAvg   Mortgage     Family
## 1 -1.77423939 -1.66591186 -0.5381750 -0.1933661 -0.5554684  1.3972742
## 2 -0.02952064 -0.09632058 -0.8640230 -0.2505855 -0.5554684  0.5259383
## 3 -0.55293627 -0.44511864 -1.3636566 -0.5366825 -0.5554684 -1.2167334
## 4 -0.90188002 -0.96831574  0.5697084  0.4360473 -0.5554684 -1.2167334
## 5 -0.90188002 -1.05551525 -0.6250678 -0.5366825 -0.5554684  1.3972742
## 6 -0.72740814 -0.61951767 -0.9726390 -0.8799989  0.9684153  1.3972742

Descripción de las variables numéricas estandarizadas

profiling_num(datos.e)
##     variable          mean std_dev variation_coef       p_01       p_05
## 1        Age  6.054575e-18       1   1.651644e+17 -1.7742394 -1.5997675
## 2 Experience -1.197687e-16       1  -8.349429e+15 -1.8403109 -1.5787123
## 3     Income  1.462101e-16       1   6.839471e+15 -1.3853798 -1.2115942
## 4      CCAvg  4.641524e-17       1   2.154465e+16 -1.1088765 -1.0516571
## 5   Mortgage -2.653715e-17       1  -3.768302e+16 -0.5554684 -0.5554684
## 6     Family  1.233144e-16       1   8.109350e+15 -1.2167334 -1.2167334
##         p_25         p_50      p_75     p_95     p_99    skewness kurtosis
## 1 -0.9018800 -0.029520641 0.8428387 1.540726 1.715198 -0.02933188 1.846886
## 2 -0.8811162 -0.009121069 0.8628741 1.560470 1.822069 -0.02631679 1.878399
## 3 -0.7554070 -0.212326921 0.5262619 2.090332 2.589966  0.84108618 2.954600
## 4 -0.7083407 -0.250585500 0.3216085 2.324288 3.468676  1.59796376 5.642861
## 5 -0.5554684 -0.555468371 0.4375139 2.118702 3.682010  2.10337107 7.750841
## 6 -1.2167334 -0.345397546 0.5259383 1.397274 1.397274  0.15517410 1.596617
##         iqr                              range_98
## 1 1.7447187 [-1.77423939036613, 1.71519810789554]
## 2 1.7439903 [-1.84031088604273, 1.82206874748715]
## 3 1.2816689 [-1.38537982780351, 2.58996613479645]
## 4 1.0299492  [-1.1088765154562, 3.46867556497651]
## 5 0.9929822 [-0.555468371374811, 3.6820096413663]
## 6 1.7426718 [-1.21673343533125, 1.39727423152191]
##                                 range_80
## 1  [-1.33805970308342, 1.36625435806938]
## 2  [-1.40431331062251, 1.38607117206693]
## 3  [-1.12470140402646, 1.54725243968826]
## 4 [-0.937218312439975, 1.35155772777638]
## 5 [-0.555468371374811, 1.41083311246134]
## 6  [-1.21673343533125, 1.39727423152191]
summary(datos.e)
##       Age             Experience            Income            CCAvg        
##  Min.   :-1.94871   Min.   :-2.014710   Min.   :-1.4288   Min.   :-1.1089  
##  1st Qu.:-0.90188   1st Qu.:-0.881116   1st Qu.:-0.7554   1st Qu.:-0.7083  
##  Median :-0.02952   Median :-0.009121   Median :-0.2123   Median :-0.2506  
##  Mean   : 0.00000   Mean   : 0.000000   Mean   : 0.0000   Mean   : 0.0000  
##  3rd Qu.: 0.84284   3rd Qu.: 0.862874   3rd Qu.: 0.5263   3rd Qu.: 0.3216  
##  Max.   : 1.88967   Max.   : 1.996468   Max.   : 3.2634   Max.   : 4.6131  
##     Mortgage           Family       
##  Min.   :-0.5555   Min.   :-1.2167  
##  1st Qu.:-0.5555   1st Qu.:-1.2167  
##  Median :-0.5555   Median :-0.3454  
##  Mean   : 0.0000   Mean   : 0.0000  
##  3rd Qu.: 0.4375   3rd Qu.: 0.5259  
##  Max.   : 5.6875   Max.   : 1.3973
  • Interpretación Se observa que todas las variables presentan desviación estandar igual a 1. Las variables presentan un rango que es muy similar y su variacion significativa es mínima. Para este caso aplicaremos cluster de método Jerárquico y método de partición.

Método Jerárquico

Este método es el menos usado, a comparación del método de partición en este no se conoce el número de cluster ni como estará caracterizado cada grupo o cluster. El presente método presenta dos tipos de agrupamiento:

* 1. Aglomerativo: Este método aglomerativo parte que cada observación es un grupo o cluster, es decir se tendra tantos grupos o cluster como observaciones se tenga. A travez de los métodos de enlace se iran agrupando hasta el punto de que todo se forme u solo grupo o cluster. * 2. Divisivo: Este método divisivo es lo contrario al método aglomerativo, es decir, todo partirá de un solo grupo o cluster y estos se iran subdiviendo hasta el punto de que se obtenga tantos grupos o clusters como observaciones se tenga. Cabe mencionar que en este método jerarquico el número de cluster lo determinará el investigador, es decir será a propio juicio de valor, obviamente teniendo en cuenta los intereses y restricciones de la empresa.

Para este caso solo aplicaremos el método jerarquico aglomerativo, ya que a comparación del divisivo presenta menor costo computacional.

CLUSTER JERARQUICO AGLOMERATIVO UTILIZANDO EL PAQUETE AGNES

Calculando la matriz distancia con la distancia Euclidiana

dist.eucl <- dist(datos.e, method = "euclidean") # por defecto la matriz no muestra la diagonal de ceros

Cluster Jerarquico usando los métodos de encale: ward.D, centroid, average, ward.D2, complete

res.hc1 <- hclust(dist.eucl, method = "ward.D" )
res.hc2 <- hclust(dist.eucl, method = "centroid" )
res.hc3 <- hclust(dist.eucl, method = "average" )
res.hc4 <- hclust(dist.eucl, method = "ward.D2" )
res.hc5 <- hclust(dist.eucl, method = "complete" )
res.hc6 <- hclust(dist.eucl, method = "single" )

Agrupando las últimas 20 distancias para una posterior visualización en el gráfico.

distancia1<- data.frame(etapa = 4980:4999,distancia = res.hc1$height[4980:4999]); distancia1
##    etapa distancia
## 1   4980  117.3236
## 2   4981  121.4773
## 3   4982  122.2766
## 4   4983  133.5109
## 5   4984  141.9727
## 6   4985  146.8144
## 7   4986  152.1748
## 8   4987  155.7550
## 9   4988  192.8787
## 10  4989  201.5945
## 11  4990  245.1835
## 12  4991  255.8058
## 13  4992  288.3271
## 14  4993  338.5249
## 15  4994  406.8586
## 16  4995  492.7342
## 17  4996  576.9687
## 18  4997  583.8649
## 19  4998 1446.1377
## 20  4999 2039.0161
distancia2<- data.frame(etapa = 4980:4999,distancia = res.hc2$height[4980:4999]); distancia2
##    etapa distancia
## 1   4980  1.568085
## 2   4981  1.614822
## 3   4982  1.618130
## 4   4983  1.620427
## 5   4984  1.775064
## 6   4985  1.796434
## 7   4986  1.893769
## 8   4987  1.932251
## 9   4988  1.966480
## 10  4989  1.918050
## 11  4990  1.986155
## 12  4991  2.055786
## 13  4992  2.146906
## 14  4993  2.210718
## 15  4994  2.217335
## 16  4995  1.925818
## 17  4996  2.209664
## 18  4997  2.769961
## 19  4998  2.948512
## 20  4999  3.333297
distancia3<- data.frame(etapa = 4980:4999,distancia = res.hc3$height[4980:4999]); distancia3
##    etapa distancia
## 1   4980  2.702842
## 2   4981  2.740897
## 3   4982  2.791115
## 4   4983  2.879129
## 5   4984  2.883634
## 6   4985  2.977287
## 7   4986  2.992512
## 8   4987  3.032872
## 9   4988  3.098596
## 10  4989  3.136732
## 11  4990  3.225909
## 12  4991  3.228281
## 13  4992  3.386554
## 14  4993  3.447360
## 15  4994  3.534511
## 16  4995  3.786671
## 17  4996  4.154100
## 18  4997  4.247230
## 19  4998  4.504771
## 20  4999  5.939496
distancia4<- data.frame(etapa = 4980:4999,distancia = res.hc4$height[4980:4999]); distancia4
##    etapa distancia
## 1   4980  20.81477
## 2   4981  21.19993
## 3   4982  21.37072
## 4   4983  21.60351
## 5   4984  21.63692
## 6   4985  23.28528
## 7   4986  24.29942
## 8   4987  24.77516
## 9   4988  27.59865
## 10  4989  28.62848
## 11  4990  30.44194
## 12  4991  34.18189
## 13  4992  34.73382
## 14  4993  42.61288
## 15  4994  45.13324
## 16  4995  46.23849
## 17  4996  54.45421
## 18  4997  66.46309
## 19  4998 100.05170
## 20  4999 109.37371
distancia5<- data.frame(etapa = 4980:4999,distancia = res.hc5$height[4980:4999]); distancia5
##    etapa distancia
## 1   4980  4.745695
## 2   4981  4.811978
## 3   4982  4.836711
## 4   4983  4.978514
## 5   4984  5.004140
## 6   4985  5.096520
## 7   4986  5.142819
## 8   4987  5.199131
## 9   4988  5.349565
## 10  4989  5.436556
## 11  4990  5.590820
## 12  4991  5.757018
## 13  4992  6.358633
## 14  4993  6.493420
## 15  4994  6.553545
## 16  4995  6.585711
## 17  4996  6.997344
## 18  4997  7.493545
## 19  4998  8.388935
## 20  4999  9.397629
distancia6<- data.frame(etapa = 4980:4999,distancia = res.hc6$height[4980:4999]); distancia6
##    etapa distancia
## 1   4980  1.254026
## 2   4981  1.254598
## 3   4982  1.258367
## 4   4983  1.275299
## 5   4984  1.275816
## 6   4985  1.280365
## 7   4986  1.286669
## 8   4987  1.330017
## 9   4988  1.337010
## 10  4989  1.380714
## 11  4990  1.388559
## 12  4991  1.407739
## 13  4992  1.420690
## 14  4993  1.443346
## 15  4994  1.533397
## 16  4995  1.561649
## 17  4996  1.570931
## 18  4997  1.585873
## 19  4998  1.620427
## 20  4999  1.899287

Graficando las últimas 20 distancias utilizando la distancia euclidean y el método de enlace ward.D

ggplot(distancia1) + aes(x = etapa, y = distancia)  +
  geom_point() + geom_line()  + 
  scale_x_continuous(breaks = seq(49800, 4999)) + 
  geom_vline(xintercept = 4997, col = "red", lty = 3) + 
  geom_vline(xintercept = 4999, col = "blue", lty = 3) + 
  theme_bw()

* Interpretación Las últimas 3 distancias presentan saltos más significativos, por lo tanto se justifica que se trabjará con 3 clusters.

Graficando las últimas 20 distancias utilizando la distancia euclidean y el método de enlace centroid

ggplot(distancia2) + aes(x = etapa, y = distancia)  +
  geom_point() + geom_line()  + 
  scale_x_continuous(breaks = seq(49800, 4999)) + 
  geom_vline(xintercept = 4995, col = "red", lty = 3) + 
  geom_vline(xintercept = 4999, col = "blue", lty = 3) + 
  theme_bw()

  • Interpretación Las últimas 5 distancias presentan saltos más significativos a comparación de las demas distancias, por lo tanto se justifica que se trabajará con 5 clusters.

Graficando las últimas 20 distancias utilizando la distancia euclidean y el método de enlace average

ggplot(distancia3) + aes(x = etapa, y = distancia)  +
  geom_point() + geom_line()  + 
  scale_x_continuous(breaks = seq(49800, 4999)) + 
  geom_vline(xintercept = 4998, col = "red", lty = 3) + 
  geom_vline(xintercept = 4999, col = "blue", lty = 3) + 
  theme_bw()

  • Interpretación: Las últimas 2 distancias presentan saltos más significativos a comparación de las demas distancias, por lo tanto se justifica que se trabajará con 2 clusters.

Graficando las últimas 20 distancias utilizando la distancia euclidean yel método de enlace ward.D2

ggplot(distancia4) + aes(x = etapa, y = distancia)  +
  geom_point() + geom_line()  + 
  scale_x_continuous(breaks = seq(49800, 4999)) + 
  geom_vline(xintercept = 4997, col = "red", lty = 3) + 
  geom_vline(xintercept = 4999, col = "blue", lty = 3) + 
  theme_bw()

  • Interpretación Las últimas 3 distancias presentan saltos más significativos, por lo tanto se justifica que se trabjará con 3 clusters.

Graficando las últimas 20 distancias utilizando la distancia euclidean y el método de enlace complete

ggplot(distancia5) + aes(x = etapa, y = distancia)  +
  geom_point() + geom_line()  + 
  scale_x_continuous(breaks = seq(49800, 4999)) + 
  geom_vline(xintercept = 4997, col = "red", lty = 3) + 
  geom_vline(xintercept = 4999, col = "blue", lty = 3) + 
  theme_bw()

* Interpretación Las últimas 3 distancias presentan saltos más significativos, por lo tanto se justifica que se trabjará con 3 clusters.

Graficando las últimas 20 distancias utilizando la distancia euclidean y el método de enlace single

ggplot(distancia6) + aes(x = etapa, y = distancia)  +
  geom_point() + geom_line()  + 
  scale_x_continuous(breaks = seq(49800, 4999)) + 
  geom_vline(xintercept = 4998, col = "red", lty = 3) + 
  geom_vline(xintercept = 4999, col = "blue", lty = 3) + 
  theme_bw()

* Interpretación Las últimas 2 distancias presentan saltos más significativos, por lo tanto se justifica que se trabjará con 3 clusters.

  • Conclusión final de clusters: Para este estudio se utilizo 6 métodos de enlace, de los cuales con 3 de ellos(ward.D, ward.D2 y complete) se concluyo trabajar con 3 clusters y con los 3 restantes (average, centroid, single) indicaron trabajar con 2 clusters, 5 clusters y con 2 clusters, pero por una mayoría se decidió trabajar con 3 clusters.

Se almacenará el número de clusters que pertenece a cada observacón

grupo1 <- cutree(res.hc1, k = 3)  # enlace ward
grupo2 <- cutree(res.hc4, k = 3)  # enlace ward.D2
grupo3 <- cutree(res.hc5, k = 3)  # enlace complete

Graficando los cluster (enlace ward)

fviz_cluster(list(data = datos.e, cluster = grupo3),
             palette = c("#2E9FDF",  "#E7B800", "#FC4E07"),
             ellipse.type = "convex", #Concentration ellipse
             repel = F, # Avoid label overplotting (slow)
             show.clust.cent = FALSE, ggtheme = theme_minimal())

Graficando los cluster (enlace ward.D2)

fviz_cluster(list(data = datos.e, cluster = grupo3),
             palette = c("#2E9FDF",  "#E7B800", "#FC4E07"),
             ellipse.type = "convex", #Concentration ellipse
             repel = F, # Avoid label overplotting (slow)
             show.clust.cent = FALSE, ggtheme = theme_minimal())

Graficando los cluster (enlace complete)

fviz_cluster(list(data = datos.e, cluster = grupo3),
             palette = c("#2E9FDF",  "#E7B800", "#FC4E07"),
             ellipse.type = "convex", #Concentration ellipse
             repel = F, # Avoid label overplotting (slow)
             show.clust.cent = FALSE, ggtheme = theme_minimal())

Dendogramas

Dendograma (método ward.D)

hcd1 <- as.dendrogram(res.hc1)
nodePar1 <- list(lab.cex = 0.2, pch = c(NA, 19), 
                cex = 0.0, col = "blue")
plot(hcd1, ylab = "Height", 
     nodePar = nodePar1, 
     leaflab = "none")

Dendograma (método ward.D2)

hcd2 <- as.dendrogram(res.hc4)
nodePar2 <- list(lab.cex = 0.2, pch = c(NA, 19), 
                cex = 0.0, col = "blue")
plot(hcd2, ylab = "Height", 
     nodePar = nodePar2, 
     leaflab = "none")

Dendograma (método complete)

hcd3 <- as.dendrogram(res.hc5)
nodePar3 <- list(lab.cex = 0.2, pch = c(NA, 19), 
                cex = 0.01, col = "blue")
plot(hcd3, ylab = "Height", 
     nodePar = nodePar3, 
     leaflab = "none")

  • Conclusión gráfica: En primera instancia se logra ver una notoria diferencia entre los gráficos utilizando enlaces ward, ward.D2 con complete. Comparando visualmente los graficos utilizando enlaces ward y ward.D2 se puede notar un ligera diferencia, teniendo en cuenta que no es una desición estadística, esto va más a criterio del investigador. Por lo que a rasgos mínimos el gráfico que utiliza el enlace ward hace que mejor se cumpla los principios de cohesión y separación.

Conparación de dendogramas

Para hallar la similitud entre dendogramas de los diferentes métodos se utiliza el críterio entanglement (enredo) el rango del entanglemet oscila de 0-1, indicando que si este es cercano a cero presenta un enredo mínimo, es decir son parecidos pero si, si el enredo es cercano a 1 presenta un enredo máximo, es decir que son diferentes. Para este estudio no se utilizo esta comparación debido a que el costo algoritmico es elevado (el tiempo de ejecución es elevado, debido a la gran cantidad de observaciones).

Método de Partición

Este método a diferencia del método jerarquico se sabe con cuantos clusters se trabajará. Para el presente estudio se cuenta con diferentes medidas de distancia:Euclidiana, Mahalanobis, Manhattan, Euclidiana al cuadrado, Minkowski, Grover entre otras. Los métodos de agrupamiento o enlace que se cuenta para el agrupamiento de las observaciones son: Lloyod, MacQueen y Hartigan - Wong. Los algoritmos de partición que se aplicarán son: K-means, K-meas++ y K-meas jerarquico. Para la elección del número de cluster se trabajaran con los metodos: Elbow, Metodo Silueta.

Metodos para elegir el número de cluster ## Metodo Silueta

set.seed(2022)  # La semilla lo establece el investigador
fviz_nbclust(datos.e, kmeans, method = "silhouette") +
  labs(subtitle = "Silhouette method")

El metodo silueta indica trabajarcon 3 cluster.

Metodo Elbow

set.seed(2022)
wss <- numeric()
for(h in 1:10){
  b<-kmeans(datos.e,h)
  wss[h]<-b$tot.withinss #scintra
}
wss1 <- data.frame(cluster=c(1:10),wss)

Gráficamos el cluster con la S.C.

ggplot(wss1) + aes(cluster,wss) + geom_line(color="light blue") + 
  geom_point(color="blue") +
  geom_vline(xintercept = 3, linetype = 2, col="red") +
  labs(title = "Método Elbow") + 
  scale_x_continuous(breaks=1:10) +
  theme_dark()

Según el método de Elbow nos quedamos con 3 clusters, ya que en la gráfica el punto de inflexión se encuentra en el tercer punto.

Método k-means

Se toma como punto de partida el número de clusters ya seleccionados en base a los métodos (Elbow - Silueta), estos puntos son elegido de forma aleatoria y se calculara las distancias a las demas observaciones, las observaciones mas cercanas a cada punto se asociarán y formarán clusters, luego una vez formado el grupo, se calcula el centroide y se vuelve a recalcular las las distancias del centroide a las observaciones, estas empezarán a variar de cluster, estas interacciones terminarán cuando toda observación este estable en su cluster correspondiente.

Algoritmo Lloyd

set.seed(2022)
km1 <- kmeans(datos.e, 
             centers=3,                     # Número de Cluster
             iter.max = 100,                # Número de iteraciones máxima
             nstart = 25,                   # Número de puntos iniciales
             algorithm = "Lloyd")   

km1$withinss     # Suma de cuadrados total de cada cluster
## [1] 6369.541 5786.774 5495.819
km1$tot.withinss # Suma de cuadrados Total  (SCTotal)
## [1] 17652.13
km1$totss        # Suma de cuadrados total intra cluster (SCIntra)
## [1] 29994
km1$betweenss    # Suma de cuadrados total inter cluster (SCInter)
## [1] 12341.87
km1$iter         # Número de interacciones
## [1] 12

Visualización de las soluciones usando ACP

fviz_cluster(km1,data=datos.e,ellipse.type = "convex") + 
  theme_classic()

Algoritmo MacQueen

set.seed(2022)
km2 <- kmeans(datos.e, 
             centers=3,                     # Número de Cluster
             iter.max = 100,                # Número de iteraciones máxima
             nstart = 25,                   # Número de puntos iniciales
             algorithm = "MacQueen")      



km2$withinss     # Suma de cuadrados total de cada cluster
## [1] 6369.541 5786.774 5495.819
km2$tot.withinss # Suma de cuadrados Total  (SCTotal)
## [1] 17652.13
km2$totss        # Suma de cuadrados total intra cluster (SCIntra)
## [1] 29994
km2$betweenss    # Suma de cuadrados total inter cluster (SCInter)
## [1] 12341.87
km2$iter         # Número de interacciones
## [1] 7

Visualización de las soluciones usando ACP

fviz_cluster(km2,data=datos.e,ellipse.type = "convex") + 
  theme_classic()

Algoritmo Hartigan-Wong

set.seed(2022)
km3 <- kmeans(datos.e, 
             centers=3,                     # Número de Cluster
             iter.max = 100,                # Número de iteraciones máxima
             nstart = 25,                   # Número de puntos iniciales
             algorithm = "Hartigan-Wong")      



km3$withinss     # Suma de cuadrados total de cada cluster
## [1] 6369.541 5495.819 5786.774
km3$tot.withinss # Suma de cuadrados Total  (SCTotal)
## [1] 17652.13
km3$totss        # Suma de cuadrados total intra cluster(SCIntra)
## [1] 29994
km3$betweenss    # Suma de cuadrados total inter cluster (SCInter)
## [1] 12341.87
km3$iter         # Número de interacciones
## [1] 4

Visualización de las soluciones usando ACP

fviz_cluster(km3,data=datos.e,ellipse.type = "convex") + 
  theme_classic()

Conclusiones K-meas

Se emplearon 3 algoritmos para el agrupamiento de observaciones, con los 3 algoritmos(Lloyod, MacQueen y Hartigan-Wong) se obtuvo el mismo valor en la Suma de cuadrados total intra cluster, por lo que en primera instancia se hubiece elegido este criterio como discriminador ya que en K-means se busca obtener el menor número de cluster y asu vez obtener el menor valor en Suma de cuadrados total intra cluster. Al notar que presentan el mismo valor, se tomara como discrimiador al número de interacciones. Con el algoritmo Lloyod agrupó las observaciones con 12 interacciones, MacQueen con 7 interacciones y Hartigan-Wong con 4 interacciones por lo que nos quedaremos con el algoritmo Hartigan-Wong.

Método k-meas++

El metodo K-meas++ toma como punto de partida cualquier punto, este elegido de forma al azar, luego se calcula las distancia de ese punto a las demás observaciones, la observación mas alejada al punto inicial será considerado como segundo punto cluster, para escoger un tercer punto cluster se tendrá que calcular que observación esta más alejada a los dos puntos clusters. Una vez obtenidos los puntos cluster que necesitamos, inicia el cálculo de el centroide de cada cluster y con ello calcular las observaciones más cercanas a cada centroide y reubicarlas, hasta llegar a la interacción que no varie ninguna observación de su cluster respectivo.

funcion Kmansapp()

kmeanspp <- function(data, k = 3, 
                     start = "random", 
                     iter.max = 100, 
                     nstart = 10, ...) {
  
  kk <- k
  
  if (length(dim(data)) == 0) {
    data <- matrix(data, ncol = 1)
  } else {
    data <- cbind(data)
  }
  
  num.samples <- nrow(data)
  ndim <- ncol(data)
  
  data.avg <- colMeans(data)
  data.cov <- cov(data)
  
  out <- list()
  out$tot.withinss <- Inf
  for (restart in seq_len(nstart)) {  
    center_ids <- rep(0, length = kk)
    if (start == "random"){
      center_ids[1:2] = sample.int(num.samples, 1)
    } else if (start == "normal") { 
      center_ids[1:2] = which.min(dmvnorm(data, mean = data.avg, 
                                          sigma = data.cov))
    } else {
      center_ids[1:2] = start
    }
    for (ii in 2:kk) { # the plus-plus step in kmeans
      if (ndim == 1){
        dists <- apply(cbind(data[center_ids, ]), 1, 
                       function(center) {rowSums((data - center)^2)})
      } else {
        dists <- apply(data[center_ids, ], 1, 
                       function(center) {rowSums((data - center)^2)})
      }
      probs <- apply(dists, 1, min)
      probs[center_ids] <- 0
      center_ids[ii] <- sample.int(num.samples, 1, prob = probs)
    }
    
    tmp.out <- kmeans(data, centers = data[center_ids, ], iter.max = iter.max, ...)
    tmp.out$inicial.centers <- data[center_ids, ]
    if (tmp.out$tot.withinss < out$tot.withinss){
      out <- tmp.out
    }
  } 
  invisible(out)
}

Algoritmo Lloyd

set.seed(2022)   # La semilla es a criterio del investigador
kmpp1 <- kmeanspp(datos.e, 
                 k=3, 
                 start="random",
                 nstart = 25,
                 iter.max=100,
                 algorithm = "Lloyd")

kmpp1$withinss     # Suma de cuadrados total de cada cluster
## [1] 5786.774 6369.541 5495.819
kmpp1$tot.withinss # Suma de cuadrados Total  (SCTotal)
## [1] 17652.13
kmpp1$totss        # Suma de cuadrados total intra cluster(SCIntra)
## [1] 29994
kmpp1$betweenss    # Suma de cuadrados total inter cluster (SCInter)
## [1] 12341.87
kmpp1$iter         # Número de interacciones
## [1] 12

Visualización de las soluciones usando ACP

fviz_cluster(kmpp1,data=datos.e,ellipse.type = "convex") + 
  theme_classic()

Algoritmo MacQueen

set.seed(2022)
kmpp2 <- kmeanspp(datos.e, 
                 k=3, 
                 start="random",
                 nstart = 25,
                 iter.max=100,
                 algorithm = "MacQueen")

kmpp2$withinss     # Suma de cuadrados total de cada cluster
## [1] 5786.774 6369.541 5495.819
kmpp2$tot.withinss # Suma de cuadrados Total  (SCTotal)
## [1] 17652.13
kmpp2$totss        # Suma de cuadrados total intra cluster(SCIntra)
## [1] 29994
kmpp2$betweenss    # Suma de cuadrados total inter cluster (SCInter)
## [1] 12341.87
kmpp2$iter         # Número de interacciones
## [1] 6

Visualización de las soluciones usando ACP

fviz_cluster(kmpp2,data=datos.e,ellipse.type = "convex") + 
  theme_classic()

Algoritmo Hartigan-Wong

set.seed(2022)
kmpp3 <- kmeanspp(datos.e, 
                 k=3, 
                 start="random",
                 nstart = 25,
                 iter.max=100,
                 algorithm = "Hartigan-Wong")
kmpp3$withinss     # Suma de cuadrados total de cada cluster
## [1] 6369.541 5786.774 5495.819
kmpp3$tot.withinss # Suma de cuadrados Total  (SCTotal)
## [1] 17652.13
kmpp3$totss        # Suma de cuadrados total intra cluster(SCIntra)
## [1] 29994
kmpp3$betweenss    # Suma de cuadrados total inter cluster (SCInter)
## [1] 12341.87
kmpp3$iter         # Número de interacciones
## [1] 3

Visualización de las soluciones usando ACP

fviz_cluster(kmpp3,data=datos.e,ellipse.type = "convex") + 
  theme_classic()

Conclusiones K-meas++

Se emplearon 3 algoritmos para el agrupamiento de observaciones, con los 3 algoritmos(Lloyod, MacQueen y Hartigan-Wong) se obtuvo el mismo valor en la Suma de cuadrados total intra cluster, por lo que en primera instancia se hubiece elegido este criterio como discriminador ya que en K-means se busca obtener el menor número de cluster y asu vez obtener el menor valor en Suma de cuadrados total intra cluster. Al notar que presentan el mismo valor, se tomara como discrimiador al número de interacciones.
Con el algoritmo Lloyod agrupó las observaciones con 12 interacciones, MacQueen con 6 interacciones y Hartigan-Wong con 3 interacciones por lo que nos quedaremos con el algoritmo Hartigan-Wong.

MÉTODO K-MEANS JERARQUICO

Este método consiste en tomar como punto de partida al valor obtenido del promedio de observaciones de cada cluster que se obtuvo al realizar el cluster jerarquico. Se toma como referencia ese valor, ya que con este se espera el menor número de interacciones.

Algoritmo Lloyd

res.hk1<- hkmeans(datos.e,
                 k=3,
                 hc.metric="euclidean",
                 hc.method="ward.D",
                 iter.max=10,
                 km.algorithm = "Lloyd")
res.hk1$withinss     # Suma de cuadrados total de cada cluster
## [1] 5823.447 6328.688 5500.041
res.hk1$tot.withinss # Suma de cuadrados Total  (SCTotal)
## [1] 17652.18
res.hk1$totss        # Suma de cuadrados total intra cluster(SCIntra)
## [1] 29994
res.hk1$betweenss    # Suma de cuadrados total inter cluster (SCInter)
## [1] 12341.82
res.hk1$iter         # Número de interacciones 
## [1] 7

Visualización de las soluciones usando ACP

fviz_cluster(res.hk1,data=datos.e,ellipse.type = "convex") + 
  theme_classic()

Algoritmo MacQueen

res.hk2<- hkmeans(datos.e,
                 k=3,
                 hc.metric="euclidean",
                 hc.method="ward.D",
                 iter.max=10,
                 km.algorithm = "MacQueen")

res.hk2$withinss     # Suma de cuadrados total de cada cluster
## [1] 5823.447 6328.688 5500.041
res.hk2$tot.withinss # Suma de cuadrados Total  (SCTotal)
## [1] 17652.18
res.hk2$totss        # Suma de cuadrados total intra cluster(SCIntra)
## [1] 29994
res.hk2$betweenss    # Suma de cuadrados total inter cluster (SCInter)
## [1] 12341.82
res.hk2$iter         # Número de interacciones 
## [1] 5

Visualización de las soluciones usando ACP

fviz_cluster(res.hk2,data=datos.e,ellipse.type = "convex") + 
  theme_classic()

Algoritmo Hartigan-Wong

res.hk3<- hkmeans (datos.e,
                 k=3,
                 hc.metric="euclidean",
                 hc.method="ward.D",
                 iter.max=10,
                 km.algorithm = "Hartigan-Wong")


res.hk3$withinss     # Suma de cuadrados total de cada cluster
## [1] 5801.278 6355.036 5495.819
res.hk3$tot.withinss # Suma de cuadrados Total  (SCTotal)
## [1] 17652.13
res.hk3$totss        # Suma de cuadrados total intra cluster(SCIntra)
## [1] 29994
res.hk3$betweenss    # Suma de cuadrados total inter cluster (SCInter)
## [1] 12341.87
res.hk3$iter         # Número de interacciones 
## [1] 2

Visualización de las soluciones usando ACP

fviz_cluster(res.hk3,data=datos.e,ellipse.type = "convex") + 
  theme_classic()

Conclusiones K-means Jerarquico

Se emplearon 3 algoritmos para el agrupamiento de observaciones, con los 3 algoritmos(Lloyod, MacQueen y Hartigan-Wong) se obtuvo el mismo valor en la Suma de cuadrados total intra cluster, por lo que en primera instancia se hubiece elegido este criterio como discriminador ya que en K-means se busca obtener el menor número de cluster y asu vez obtener el menor valor en Suma de cuadrados total intra cluster. Al notar que presentan el mismo valor, se tomara como discrimiador al número de interacciones.

Con el algoritmo Lloyod agrupó las observaciones con 7 interacciones, MacQueen con 5 interacciones y Hartigan-Wong con 2 interacciones por lo que nos quedaremos con el algoritmo Hartigan-Wong.

Conclusiones finales para el Método de Partición

Se empleo 3 algortimos k-means, k-means++ y k-means Jerarquico en cada uno de ellos se opto por el algoritmo de agrupamiento Hartigan-Wong.
De los 3 algortimos se opta por K-means++ esto debido a que a diferencia del k-means este presenta menor de interacciones, sus puntos de partida son eligidos de forma progresiva (solo el primer punto es aleatorio), k-means elige todos sus puntos de cluster de forma aleatoria, lo que no es lo mas adecauado ya que, al ser aleatorio tiene probabilidad de que tengas más interacciones. No se opto por K-means Jerarquico a pesar de que presenta un menor número de interraciones porque su costo algoritmico es mucho mayor sobre k-means y k-means++ porque para elegir sus puntos de partida tiene que realizar un cluster jerarquico y calcular el centroide de cada cluster.

Conclusión Final

Conclusión Final de la Técnica a utilizar
Para el metodo jerarquico y de partición se calculó y se obtuvo la mejor opción, pero ¿Que técnica es la más adecuada para nuestro estudio?

De forma visual se puede corrobar la técnica menos apropiada es cluster jerárquico aglomerativo. Quedandonos con la técnica k-meas++ de distancia euclidiana y de método de enlace Hartigan-Wong.

Caracterizando Clusters

Consiste en analizar los centros de gravedad de cada grupo (promedios)

datos.e %>%
  mutate(grupo=res.hk3$cluster) -> datos.kmas
# Pasando datos.kmas a factor
datos.kmas$grupo <- factor(datos.kmas$grupo); datos.kmas$grupo
##    [1] 1 1 1 1 1 1 2 2 1 3 2 1 3 2 2 2 3 1 3 2 2 2 1 1 3 1 1 3 2 3 2 1 2 1 1 2 2
##   [38] 2 3 1 2 1 1 1 3 2 1 3 2 1 1 2 1 3 1 3 2 2 1 3 2 3 1 1 3 3 2 2 2 2 3 2 3 3
##   [75] 1 1 2 2 2 2 2 2 3 1 2 1 1 2 2 1 3 1 1 2 2 1 3 3 2 2 2 2 2 1 2 1 1 1 1 1 1
##  [112] 2 1 2 1 2 2 2 1 3 2 2 2 1 1 2 1 1 1 1 1 3 1 1 2 2 2 2 2 2 2 1 1 1 2 3 2 2
##  [149] 2 2 3 3 2 2 2 1 1 1 1 2 3 2 1 1 2 1 1 1 2 1 1 2 3 2 3 1 2 1 2 2 2 1 1 3 2
##  [186] 1 2 3 2 2 2 2 2 2 3 1 3 2 1 3 1 1 1 2 2 1 2 1 1 3 2 1 2 3 2 1 1 1 1 2 1 1
##  [223] 1 2 2 1 1 3 2 2 2 1 1 2 1 1 1 2 2 1 2 2 3 3 1 1 1 2 2 1 1 3 2 2 2 2 1 2 1
##  [260] 2 2 1 2 1 1 2 2 3 2 1 2 1 1 1 1 2 1 1 2 3 1 2 1 2 1 1 2 1 3 1 3 1 1 1 1 2
##  [297] 1 2 1 3 1 3 3 3 2 2 2 1 3 2 2 3 1 1 2 1 2 3 1 2 2 3 2 2 3 2 2 3 2 3 2 1 2
##  [334] 2 2 2 1 2 3 1 2 1 3 1 2 2 1 1 3 1 1 3 2 2 3 1 2 1 3 1 1 3 2 1 2 3 2 1 2 1
##  [371] 1 2 2 2 1 1 2 1 2 1 2 2 2 1 2 1 1 1 2 3 2 2 2 2 1 2 2 1 2 1 3 1 3 2 2 3 3
##  [408] 2 2 2 3 2 1 1 2 1 1 2 1 2 2 1 3 3 2 1 1 1 2 1 2 1 3 2 1 2 2 1 3 2 2 2 3 2
##  [445] 2 2 2 2 1 2 2 1 1 2 2 1 2 1 2 3 2 2 3 3 1 2 1 2 1 2 1 2 1 3 3 3 2 2 3 3 2
##  [482] 1 3 1 1 2 3 1 1 2 1 1 2 3 3 1 2 2 1 2 2 2 1 1 1 1 2 2 2 3 2 1 1 1 1 1 2 2
##  [519] 1 1 2 2 1 2 1 2 3 1 2 1 2 1 2 1 2 2 1 3 1 2 1 3 1 2 3 1 1 1 2 2 2 2 1 2 3
##  [556] 1 2 1 1 2 1 2 1 2 1 2 3 1 1 1 3 1 3 2 1 2 1 3 1 2 2 1 1 1 3 1 1 3 1 3 1 1
##  [593] 1 1 2 1 3 3 2 1 2 2 1 2 1 2 1 1 1 1 2 2 2 2 3 3 1 1 2 2 1 1 1 1 1 2 1 1 2
##  [630] 1 1 1 2 2 2 2 3 2 1 2 3 3 2 3 2 1 2 2 2 1 3 1 1 2 3 2 1 1 2 2 3 2 2 2 2 2
##  [667] 2 2 2 2 1 2 2 1 2 1 2 3 2 2 2 3 2 3 3 1 1 2 1 2 2 1 1 1 3 1 2 3 2 2 1 1 1
##  [704] 3 3 2 3 2 1 1 1 2 1 1 2 2 1 2 2 2 2 2 1 2 2 3 2 2 3 2 3 1 1 2 2 1 2 2 1 2
##  [741] 3 2 1 2 3 1 2 2 1 2 3 2 2 2 1 2 2 2 2 2 1 2 1 2 1 2 1 2 1 1 3 1 3 3 2 2 3
##  [778] 2 2 3 1 3 3 3 3 3 2 3 2 1 2 2 3 1 2 2 1 1 1 1 3 2 1 2 2 3 2 3 2 2 1 2 1 2
##  [815] 1 2 2 1 2 2 2 1 2 1 1 1 2 2 1 2 1 2 1 2 3 3 1 1 1 1 1 3 1 2 2 1 2 1 2 1 2
##  [852] 1 1 1 2 2 2 2 1 3 2 2 2 2 1 2 1 2 3 2 1 2 1 1 1 2 1 1 1 2 2 3 3 2 1 1 2 3
##  [889] 3 1 2 3 1 2 1 1 3 2 2 3 1 2 2 1 1 2 1 2 2 3 2 2 1 2 2 3 1 3 1 2 1 1 1 2 2
##  [926] 1 1 2 1 2 1 1 2 2 2 3 2 1 2 2 3 3 2 1 1 2 1 2 1 1 1 2 3 2 3 2 1 2 2 2 3 1
##  [963] 2 1 1 3 2 2 2 1 2 3 1 3 2 2 2 2 2 2 1 1 2 3 2 3 3 2 2 1 1 1 1 3 1 1 1 2 3
## [1000] 2 2 2 2 1 2 1 2 3 3 1 1 2 2 1 3 2 1 1 1 1 2 1 1 3 2 2 1 3 1 1 2 2 1 2 2 1
## [1037] 2 1 3 3 1 2 2 2 2 3 2 2 2 1 3 1 1 2 2 1 1 1 2 1 2 2 3 2 3 1 1 3 1 1 1 1 2
## [1074] 1 1 1 1 3 2 3 2 2 1 1 3 2 2 1 2 2 1 1 1 1 2 2 1 3 2 1 1 1 1 1 3 3 1 2 2 2
## [1111] 2 3 2 1 1 2 3 3 1 1 1 1 1 1 1 3 1 1 1 1 3 2 1 1 1 2 2 3 1 2 1 1 1 3 2 1 1
## [1148] 1 3 3 2 2 2 2 2 1 2 2 1 2 1 1 3 3 3 1 1 3 2 1 1 2 2 1 1 1 1 1 1 1 1 1 1 2
## [1185] 1 1 2 2 1 1 3 1 3 2 1 1 1 2 1 1 1 1 1 2 1 1 3 1 2 2 3 2 1 1 2 1 2 2 2 1 3
## [1222] 1 2 2 2 1 2 1 2 2 1 2 1 2 1 2 1 3 1 2 2 2 1 3 3 2 2 2 1 2 2 1 1 2 1 1 1 2
## [1259] 1 2 2 2 1 1 3 1 2 2 1 1 1 1 2 3 2 1 1 3 1 2 2 1 2 1 2 1 1 1 2 1 2 2 2 2 1
## [1296] 1 1 2 1 2 2 3 1 1 3 1 1 3 2 1 2 1 2 2 1 2 1 2 3 1 1 3 1 2 2 2 1 2 3 1 1 1
## [1333] 1 2 2 3 1 1 2 3 1 1 1 1 2 2 1 2 1 3 1 2 2 2 3 2 1 2 2 3 2 2 1 1 1 2 2 2 2
## [1370] 2 1 2 3 2 2 3 2 1 2 2 2 1 1 2 2 2 1 1 2 1 1 1 2 2 2 3 1 2 3 1 1 3 3 1 2 3
## [1407] 2 2 3 1 2 3 2 2 2 1 1 1 3 1 1 1 1 2 1 2 1 1 1 1 1 3 3 2 2 1 1 1 2 2 1 2 1
## [1444] 1 3 3 1 3 1 2 2 1 2 1 2 2 1 1 2 2 1 2 2 1 1 2 3 2 1 2 2 3 1 2 2 3 2 1 3 1
## [1481] 2 1 2 2 2 1 3 1 1 2 1 1 1 2 2 3 1 2 3 3 2 1 2 1 3 2 2 1 1 2 2 2 2 3 3 2 1
## [1518] 2 1 2 3 3 1 1 1 1 1 2 3 1 2 1 2 2 2 2 1 2 2 1 1 3 2 2 1 2 3 2 2 2 1 3 3 2
## [1555] 1 2 1 2 1 2 1 2 1 2 2 1 2 2 2 2 1 1 2 2 2 2 1 1 1 1 1 2 3 3 1 2 2 2 1 2 2
## [1592] 1 3 2 1 2 1 2 1 3 3 3 1 3 2 2 1 2 1 2 1 2 1 2 2 2 2 2 1 2 1 1 1 3 1 2 3 2
## [1629] 1 3 1 2 1 2 2 2 2 3 1 2 1 2 1 1 2 2 2 1 2 1 1 3 3 1 2 1 3 1 2 3 1 1 2 2 2
## [1666] 1 3 2 2 1 1 1 2 1 3 2 1 1 2 3 2 3 2 2 2 1 2 2 2 2 1 2 2 2 2 3 3 2 3 2 1 1
## [1703] 2 2 3 2 2 2 1 2 1 3 2 2 2 1 3 3 1 3 2 2 1 1 1 2 2 2 2 2 1 1 1 1 1 2 3 1 2
## [1740] 1 2 3 2 2 1 1 2 1 2 2 2 2 3 2 2 1 1 1 1 1 1 2 2 3 2 3 2 1 3 2 2 2 1 1 1 2
## [1777] 2 2 1 1 3 2 1 3 2 3 1 1 1 3 2 2 3 1 2 2 2 3 3 1 2 1 1 2 1 2 2 2 2 1 2 1 3
## [1814] 2 2 2 1 1 2 2 2 1 3 1 3 3 2 3 1 2 3 2 2 1 1 3 1 1 1 1 2 1 3 3 2 1 2 1 1 2
## [1851] 1 1 1 2 2 2 2 1 1 2 3 2 3 2 2 1 3 2 3 2 2 1 1 1 1 1 2 2 2 2 1 1 2 3 3 1 2
## [1888] 1 1 2 3 1 2 2 2 1 1 2 2 2 2 3 1 2 1 1 1 1 2 2 3 2 3 2 2 1 2 2 3 1 2 2 1 2
## [1925] 2 1 1 1 2 1 2 1 2 2 2 3 2 3 1 2 2 1 2 2 2 2 2 2 1 2 1 1 1 2 1 1 1 1 1 2 1
## [1962] 3 3 2 1 1 2 1 2 2 3 1 1 2 1 1 1 1 1 1 3 2 2 1 1 1 1 2 2 2 1 2 2 1 3 1 2 2
## [1999] 2 2 1 3 3 3 1 3 2 2 2 1 2 2 2 1 3 1 1 1 2 1 2 3 1 2 1 2 2 3 1 1 2 2 2 2 2
## [2036] 1 1 1 3 2 1 3 1 2 2 2 3 2 1 1 1 1 1 2 1 2 1 3 1 3 2 3 2 2 2 1 1 3 2 1 2 2
## [2073] 1 2 2 1 3 3 1 1 2 2 1 1 1 2 1 3 1 2 3 1 2 2 2 3 2 1 3 2 1 3 1 3 1 1 2 1 2
## [2110] 3 1 2 1 2 2 2 1 1 1 1 1 1 2 1 1 1 1 1 2 1 2 2 2 1 2 1 2 2 1 2 2 1 2 2 3 2
## [2147] 1 1 2 3 2 1 2 3 1 2 1 1 2 3 1 2 1 1 1 1 1 2 2 2 1 1 1 1 1 3 1 3 3 2 2 1 1
## [2184] 1 3 2 1 2 1 2 1 3 1 1 1 2 3 2 2 2 2 1 2 3 2 2 1 3 2 1 2 1 2 2 2 3 2 3 1 2
## [2221] 2 2 2 2 1 2 3 2 2 2 3 3 2 2 1 3 2 1 2 2 1 1 1 2 2 2 3 2 2 1 3 1 2 2 2 1 2
## [2258] 2 2 1 1 3 2 2 1 2 3 3 1 1 1 2 1 1 1 3 3 1 3 2 1 2 1 2 2 2 2 1 1 2 1 3 2 1
## [2295] 1 2 1 2 2 2 2 1 3 2 3 3 1 2 1 1 1 2 2 2 1 3 3 3 2 3 2 1 2 1 1 2 1 2 3 1 1
## [2332] 2 1 2 1 1 3 3 3 2 1 1 2 2 2 2 2 2 2 2 2 2 1 2 1 2 3 1 2 3 1 1 1 1 2 1 1 1
## [2369] 2 2 1 1 1 3 1 2 2 3 1 3 1 1 3 2 2 3 1 1 2 1 1 3 3 2 3 1 1 2 2 2 3 1 2 1 1
## [2406] 2 1 1 2 2 3 2 2 2 3 1 2 1 1 2 2 1 3 2 1 2 2 1 3 1 1 2 2 1 3 1 2 2 2 2 1 2
## [2443] 1 3 2 2 1 3 2 1 1 3 1 1 2 3 2 1 2 2 1 1 2 1 2 2 1 1 3 1 3 1 2 2 2 2 2 3 3
## [2480] 2 1 2 1 1 2 2 2 2 1 1 3 1 1 1 1 2 2 1 3 2 1 1 3 1 2 1 2 2 1 1 2 2 2 2 1 1
## [2517] 1 2 2 2 2 2 3 3 2 1 1 1 2 1 2 2 2 2 2 2 3 2 3 3 2 3 2 2 2 1 2 1 2 1 1 2 1
## [2554] 1 2 2 1 1 3 1 1 3 2 1 1 1 1 3 2 3 3 1 2 2 1 1 2 2 3 2 3 2 1 1 2 2 3 2 2 2
## [2591] 3 1 2 3 2 3 1 3 2 1 1 2 3 2 1 2 2 2 2 3 1 1 2 3 3 2 2 1 1 1 2 1 2 1 2 2 2
## [2628] 2 1 1 2 2 3 2 1 1 3 2 1 2 1 3 2 2 1 1 3 2 3 1 2 1 1 3 2 2 3 1 1 2 1 2 2 2
## [2665] 3 3 1 2 2 1 2 2 1 2 1 1 2 1 3 2 2 1 2 2 1 1 2 3 2 3 2 3 2 2 1 1 2 2 3 1 1
## [2702] 2 3 2 3 2 3 1 2 1 2 1 1 3 3 1 1 1 2 2 2 3 2 2 2 2 2 3 1 2 2 1 1 2 2 1 2 2
## [2739] 3 1 2 1 1 1 2 2 2 1 1 2 2 2 2 3 1 1 1 2 2 2 1 1 2 2 1 2 2 2 3 3 1 3 3 3 2
## [2776] 3 3 2 2 3 1 2 2 2 1 1 1 3 2 1 2 3 2 3 2 2 2 2 2 2 2 2 3 1 2 3 2 1 2 3 2 1
## [2813] 3 2 2 1 2 3 1 2 3 2 1 1 2 1 1 1 1 1 2 2 3 3 1 1 1 1 3 2 1 3 1 1 2 2 2 1 1
## [2850] 3 3 2 3 1 2 1 3 3 3 3 1 1 2 1 2 2 3 3 2 2 3 2 2 2 2 2 1 2 3 1 2 2 2 1 1 2
## [2887] 2 1 2 2 2 2 2 1 2 2 2 1 3 1 2 2 2 2 3 2 1 2 2 1 3 1 3 1 1 3 2 2 1 1 2 2 2
## [2924] 2 2 2 2 3 3 1 1 1 3 2 3 2 2 2 1 2 1 3 3 2 2 1 3 3 1 1 1 1 3 2 1 2 3 2 2 1
## [2961] 2 2 1 1 1 2 1 1 3 1 2 2 1 3 1 2 1 3 2 2 1 2 2 2 2 2 3 1 3 3 2 1 2 2 3 3 3
## [2998] 2 2 2 3 1 1 2 1 3 3 2 2 1 1 2 3 3 2 1 2 2 2 2 3 3 2 2 2 3 1 2 2 3 2 2 2 3
## [3035] 2 2 1 1 1 3 1 1 2 2 1 2 1 3 2 2 2 2 2 1 3 1 2 1 1 2 3 3 1 2 2 3 2 1 2 2 1
## [3072] 1 2 1 1 1 1 2 1 2 2 3 1 1 1 2 2 2 2 1 2 2 1 1 2 2 3 2 1 2 2 2 2 2 2 1 1 1
## [3109] 1 2 1 1 2 1 1 1 1 1 2 2 1 1 1 1 3 2 2 1 1 1 1 2 1 1 2 1 2 2 3 2 1 2 1 2 1
## [3146] 1 1 1 2 2 3 1 1 1 1 2 2 1 2 2 3 3 1 2 1 3 1 2 3 2 1 1 1 1 2 1 2 1 1 1 1 1
## [3183] 2 1 3 3 1 1 3 1 2 1 2 3 1 2 1 1 1 1 2 1 1 3 2 2 1 2 2 3 1 1 2 1 2 1 1 2 3
## [3220] 1 2 1 2 1 2 2 1 1 1 1 2 2 2 2 1 2 1 1 2 1 2 1 1 2 2 2 1 3 1 2 1 2 2 2 2 1
## [3257] 1 2 1 1 2 2 3 1 2 1 2 2 3 2 3 2 1 3 1 1 3 1 3 1 2 2 3 2 1 1 2 1 2 2 2 2 1
## [3294] 1 1 3 3 2 2 2 2 2 1 2 1 1 2 1 3 2 2 2 3 2 1 2 2 2 1 2 2 3 3 2 2 2 3 3 2 3
## [3331] 1 2 1 1 1 3 2 2 1 3 1 1 1 2 3 1 1 2 2 3 1 3 1 2 1 2 3 3 2 1 3 1 1 2 1 1 3
## [3368] 2 3 1 1 1 3 3 2 1 3 1 1 2 2 3 2 3 3 1 1 2 3 1 1 2 1 1 1 1 2 3 1 2 2 1 2 2
## [3405] 1 2 1 2 1 1 1 2 2 2 2 1 2 1 2 1 2 3 2 2 1 1 1 3 2 1 2 2 2 1 2 1 2 2 3 1 1
## [3442] 2 1 1 2 1 3 2 1 3 1 2 2 1 2 1 3 2 3 1 2 2 2 1 3 2 1 2 1 1 3 2 3 2 2 2 3 3
## [3479] 1 1 2 2 2 3 1 1 1 1 1 3 1 2 1 2 1 1 1 2 1 2 2 2 1 1 1 2 1 2 3 1 1 1 1 1 1
## [3516] 3 2 3 3 1 2 1 2 1 2 2 2 1 1 1 2 1 1 2 1 2 2 2 1 2 1 3 1 1 1 3 2 2 1 1 1 2
## [3553] 2 3 1 1 1 1 2 2 1 1 3 2 1 1 2 2 3 1 2 3 1 3 2 2 2 1 3 1 1 1 2 1 2 1 3 1 2
## [3590] 1 1 2 1 2 1 1 3 2 1 1 1 1 2 2 2 2 1 1 3 3 1 2 3 3 3 3 1 1 1 2 2 2 2 1 2 2
## [3627] 1 1 3 2 3 2 3 2 2 2 1 1 2 3 2 2 2 2 2 3 3 1 1 2 2 3 1 2 2 3 1 2 2 1 1 3 3
## [3664] 1 2 1 2 1 1 1 1 2 1 1 1 2 2 2 2 3 1 3 1 2 2 2 2 1 3 1 2 1 2 2 1 2 1 1 1 2
## [3701] 3 2 3 2 3 1 2 1 1 1 2 1 2 2 2 1 2 2 1 1 2 1 1 2 1 1 1 2 1 1 1 1 1 2 1 3 2
## [3738] 1 2 1 3 2 3 1 2 3 2 1 1 1 2 1 2 1 2 2 1 3 3 1 2 2 2 2 2 1 3 1 1 3 1 1 3 2
## [3775] 2 1 3 2 2 2 3 2 1 2 1 2 2 1 1 2 2 1 2 3 2 2 1 2 2 1 2 1 1 1 3 1 1 3 3 1 2
## [3812] 2 1 2 1 1 2 2 1 2 1 3 3 2 1 1 3 3 1 2 1 3 2 1 2 1 1 1 1 1 2 1 2 3 2 1 1 1
## [3849] 2 1 2 3 1 1 1 3 2 2 3 2 1 2 2 1 2 2 2 1 1 1 1 1 2 2 1 1 1 1 1 1 2 2 1 1 1
## [3886] 1 2 3 1 1 3 2 2 1 1 1 3 2 3 2 2 1 2 2 1 2 2 1 1 1 1 2 1 1 1 1 2 1 2 3 1 1
## [3923] 1 3 3 1 2 2 2 1 3 2 1 1 1 2 1 3 2 2 1 2 1 3 2 3 1 3 3 1 1 1 2 2 1 2 2 1 2
## [3960] 1 2 2 1 2 1 1 1 1 1 1 2 1 3 2 2 2 2 2 1 1 2 2 1 1 1 2 3 2 2 2 2 2 3 1 1 2
## [3997] 2 2 1 2 2 2 2 2 2 2 2 1 3 3 1 2 1 2 2 1 3 1 3 2 3 1 1 3 1 2 3 2 1 1 2 1 2
## [4034] 2 1 3 2 2 2 3 2 2 3 2 1 2 1 3 1 2 2 3 1 1 2 1 3 2 1 2 3 1 1 2 2 3 2 2 2 2
## [4071] 2 1 1 2 2 1 2 1 1 2 1 2 1 1 2 1 2 3 1 1 1 1 3 3 2 1 1 2 1 2 1 2 1 2 1 3 2
## [4108] 2 2 1 2 1 1 1 2 1 3 1 1 1 2 2 3 2 2 2 2 1 2 1 2 2 2 3 1 3 1 1 2 1 2 1 2 2
## [4145] 3 2 2 3 2 1 2 3 1 3 2 2 3 1 2 1 1 1 2 2 1 3 2 3 2 3 1 2 2 1 1 3 1 2 2 1 1
## [4182] 2 2 3 2 1 1 1 1 1 3 1 2 2 2 1 2 2 2 1 1 2 1 2 1 2 2 1 2 1 1 1 2 2 2 2 3 2
## [4219] 2 2 2 2 2 2 2 3 1 3 1 2 2 2 1 3 2 1 3 2 3 2 3 1 2 2 2 3 2 2 3 1 2 1 2 2 2
## [4256] 2 3 1 3 3 2 2 2 2 2 1 1 3 2 2 1 3 2 3 1 2 3 3 2 1 3 1 3 2 3 3 2 2 1 2 2 2
## [4293] 3 2 3 2 1 1 1 1 2 2 2 3 2 1 1 3 3 3 3 1 1 2 1 2 1 2 2 2 3 1 1 2 2 2 1 1 3
## [4330] 2 2 3 2 2 2 1 1 3 2 1 1 1 1 1 3 3 2 2 2 1 2 1 1 2 3 1 1 3 1 1 2 2 1 1 2 1
## [4367] 2 3 1 2 1 2 1 3 1 1 1 3 1 1 1 1 2 1 1 2 3 1 3 2 2 3 2 1 2 2 1 2 2 2 1 2 2
## [4404] 2 1 2 2 1 2 1 3 1 1 1 3 2 2 2 2 3 3 2 3 2 1 3 3 1 2 2 1 1 2 2 1 2 2 2 1 1
## [4441] 1 2 2 1 1 2 2 2 2 1 1 2 2 1 2 2 1 2 2 3 2 2 1 1 2 1 1 2 2 1 3 2 2 1 2 1 2
## [4478] 1 1 3 3 1 1 3 3 1 1 1 1 1 1 1 2 2 3 1 2 2 3 2 2 2 2 2 1 1 3 1 1 2 2 1 2 1
## [4515] 1 1 2 1 2 1 1 2 1 1 2 3 1 1 2 1 1 1 3 2 1 1 2 2 2 2 2 3 2 2 1 2 2 2 2 2 2
## [4552] 1 2 2 1 1 2 1 1 3 1 2 2 3 2 3 3 2 1 2 3 2 1 2 3 2 2 2 1 2 3 1 1 2 1 3 2 1
## [4589] 1 1 2 1 1 3 2 1 1 1 2 2 2 1 2 3 1 2 3 2 1 2 3 1 1 2 2 1 2 1 1 2 2 2 2 2 1
## [4626] 3 2 3 1 3 2 3 2 1 1 1 1 1 1 2 1 1 3 1 2 1 3 2 1 3 2 2 3 3 1 3 2 1 1 3 2 3
## [4663] 2 1 2 1 1 2 1 1 3 3 3 2 3 1 1 1 3 3 3 1 2 2 2 2 2 2 1 2 2 1 2 2 1 2 2 2 3
## [4700] 2 3 1 1 2 2 2 2 2 2 1 1 2 1 1 1 2 2 1 1 3 1 2 1 3 1 1 1 1 2 1 2 1 1 3 2 1
## [4737] 2 2 2 3 3 2 2 2 1 2 1 2 1 1 2 3 3 2 2 3 1 1 2 2 2 2 1 2 2 3 1 1 1 1 1 1 1
## [4774] 2 2 1 2 1 2 1 2 1 3 1 2 1 1 2 1 2 3 2 1 2 2 2 1 1 1 1 1 1 1 2 2 3 2 1 1 1
## [4811] 2 1 3 2 2 2 2 3 1 1 1 1 3 3 1 2 2 3 2 1 1 1 1 2 2 2 2 1 2 1 1 2 3 2 1 3 3
## [4848] 1 2 2 2 2 1 2 3 2 2 1 2 3 2 2 1 2 1 3 1 1 2 2 2 2 1 3 1 2 3 2 1 1 2 2 1 3
## [4885] 2 2 2 1 3 2 2 2 1 1 2 3 1 1 2 2 1 1 1 1 2 2 2 1 3 1 2 3 2 1 2 2 1 1 2 1 1
## [4922] 1 1 1 1 2 1 1 2 2 2 2 2 3 1 2 1 3 2 2 2 1 3 1 2 1 2 1 2 1 2 2 1 2 1 2 1 1
## [4959] 2 2 2 1 3 3 3 1 1 1 2 1 1 2 2 1 2 1 1 1 2 3 3 3 1 2 1 2 1 2 1 1 2 2 1 3 2
## [4996] 1 1 2 2 1
## Levels: 1 2 3
# Agrupamos los datos estandarizados con su respectivo cluster
datos.kmeas.mas <- cbind(datos.e, cluster = datos.kmas$grupo)
head(datos.kmeas.mas)
##           Age  Experience     Income      CCAvg   Mortgage     Family cluster
## 1 -1.77423939 -1.66591186 -0.5381750 -0.1933661 -0.5554684  1.3972742       1
## 2 -0.02952064 -0.09632058 -0.8640230 -0.2505855 -0.5554684  0.5259383       1
## 3 -0.55293627 -0.44511864 -1.3636566 -0.5366825 -0.5554684 -1.2167334       1
## 4 -0.90188002 -0.96831574  0.5697084  0.4360473 -0.5554684 -1.2167334       1
## 5 -0.90188002 -1.05551525 -0.6250678 -0.5366825 -0.5554684  1.3972742       1
## 6 -0.72740814 -0.61951767 -0.9726390 -0.8799989  0.9684153  1.3972742       1
# Número de individuos por cluster

datos.kmeas.mas %>% group_by(cluster) %>% count()->n.clusters 
n.clusters
## # A tibble: 3 × 2
## # Groups:   cluster [3]
##   cluster     n
##   <fct>   <int>
## 1 1        2003
## 2 2        2159
## 3 3         838
# promedio por cluster
datos.kmeas.mas %>%   
  group_by(cluster) %>%
  summarise_all(list(mean)) -> medias  ;medias
## # A tibble: 3 × 7
##   cluster    Age Experience Income  CCAvg Mortgage  Family
##   <fct>    <dbl>      <dbl>  <dbl>  <dbl>    <dbl>   <dbl>
## 1 1       -0.895     -0.896 -0.297 -0.324   -0.106  0.190 
## 2 2        0.886      0.880 -0.337 -0.333   -0.117 -0.0100
## 3 3       -0.144     -0.126  1.58   1.63     0.554 -0.428
# promedio general por cada cluster
datos.kmeas.mas %>% summarise_if(is.numeric,mean) -> general; general
##            Age    Experience       Income        CCAvg      Mortgage
## 1 6.054575e-18 -1.197687e-16 1.462101e-16 4.641524e-17 -2.653715e-17
##         Family
## 1 1.233144e-16
general <- cbind(cluster="general",general); general
##   cluster          Age    Experience       Income        CCAvg      Mortgage
## 1 general 6.054575e-18 -1.197687e-16 1.462101e-16 4.641524e-17 -2.653715e-17
##         Family
## 1 1.233144e-16
# Unimos las medias individuales y las generales de cada variable con respecto a cada cluster
medias  <- as.data.frame(rbind(medias,general)); medias
##   cluster           Age    Experience        Income         CCAvg      Mortgage
## 1       1 -8.948680e-01 -8.960921e-01 -2.972459e-01 -3.240794e-01 -1.057910e-01
## 2       2  8.859516e-01  8.802817e-01 -3.370014e-01 -3.333615e-01 -1.167618e-01
## 3       3 -1.436144e-01 -1.260808e-01  1.578723e+00  1.633483e+00  5.536852e-01
## 4 general  6.054575e-18 -1.197687e-16  1.462101e-16  4.641524e-17 -2.653715e-17
##          Family
## 1  1.896714e-01
## 2 -1.002000e-02
## 3 -4.275402e-01
## 4  1.233144e-16
# Convirtiendo la data a formato tidy
datos_totales<- pivot_longer(data=medias,
                             -cluster,
                             names_to="variable",
                             values_to = "valor")
head(datos_totales)
## # A tibble: 6 × 3
##   cluster variable    valor
##   <fct>   <chr>       <dbl>
## 1 1       Age        -0.895
## 2 1       Experience -0.896
## 3 1       Income     -0.297
## 4 1       CCAvg      -0.324
## 5 1       Mortgage   -0.106
## 6 1       Family      0.190

Gráfico de lineas

matplot(t(medias[,-1]),
        main = "Gráfico de promedios de variables por cluster",
        xlab = "Variables",
        ylab = "Promedios",
        type="l",
        col=c("blue","red","green4", "black"),
        xaxt="n")   # Permite eliminar los nombres del eje X
axis(1,at=1:6,
     labels=c("AGE","Experience","Income","CCAvg","Mortgage","Family"))
legend("bottom", c("Cluster 1", "Cluster 2", "Cluster 3","General"), 
       pch=c(19,19,19,19), ncol=4, cex=0.6, 
       col=c("blue","red","green4","black"), bty="n")

Conclusiones génerales

Luego de una serie de comparaciones con diferentes métodos de enlace se determino por optar por el método de distancia euclidiana y de enlace war.D Las conclusiones finales se basan en los métodos ya mencionados.

  • Cluster1: Engloba a aquellos personas que presentan menor edad, a la vez tienen
    menor experiencia laboral como clientes, sus ingresos son por debajo
    del promedio,sus gatos de tarjetas un poco menor al promedio, tienen un
    valor de hipoteca de su hogar (Mortgage) por debajo del promedio y el
    número de personas de su familia son los mas alevados.

  • Cluster2: Engloba a aquellas personas que presentan mayor edad al igual que su
    experiencia laboral, mientras que sus ingresos anuales estan por debajo
    del promedio al igual que el gasto promedio de sus tarjetas, el valor de su hipoteca y el número de miembros de su hogar.

  • Cluster3: Engloba a aquellas personas que están casi por debajo del promedio al
    igual que los años de experiencia laboral, sin embargo estos presentan
    los mayores ingresos anuales al igual que el valor de su hipoteca, pero
    el gasto promedio en tarjetas es menor al promedio y por último, el
    número de miembros de su hogar son relativamente mayores al promedio.

Conclusiones específicas

  • Cluster 1: representa a las personas que tienen el mayor número de integrantes
    en su familia y el mayor valor de la hipoteca de su predio.

  • Cluster 2: representa a las personas que tienen mayor edad y los que tienen
    mayor experiencia laboral.

  • Cluster 3: representa a las personas que tienen mayor ingreso anual y mayor
    gasto promedio alto en tarjetas de crédito por mes.