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.