En este proyecto analizaremos la data de una primera evaluación de los 108 comités políticos provinciales existentes a la fecha del Partido Morado, nuevo partido político en proceso de inscripción. La evaluación realizada –de la cual resultó la data que aquí se trabajará– buscaba clasificar a cada Comité Político Provincial (en adelante, CPP) en una de cinco categorías según su nivel de avance en la construcción partidaria; específicamente, según el grado de presencia y/o consolidación del Partido en la provincia.
Las categorías en que se clasificaron a los 108 CPP fueron:
Comité INACTIVO [score de 0 a 6 puntos]
Comité NÚCLEO [score de 7 a 13 puntos]
Comité EN CONSTRUCCIÓN [score de 14 a 20 puntos]
Comité EN PROCESO DE CONSOLIDACIÓN [score de 21 a 27 puntos]
Comité CONSOLIDADO [score de 28 a 34 puntos]
Lo que se busca en el presente análisis es ver si con el uso de ciertas técnicas estadísticas aprendidas en el curso de Estadística para el Análisis Político 2 es posible una mejor clasificación de los 108 CPP.
Cargamos la data, la cual puede obtenerse de aquí
link="https://goo.gl/HE3Hm4"
partidomorado=read.csv(link,stringsAsFactors = F)
Para poder ver a qué se refiere cada variable, puede verse este documento modelo, el cual puede obtenerse de aquí
Veo estructura:
str(partidomorado)
## 'data.frame': 108 obs. of 12 variables:
## $ region : chr "AMAZONAS" "ANCASH" "ANCASH" "ANCASH" ...
## $ provincia : chr "UTCUBAMBA" "HUARAZ" "CARHUAZ" "HUAYLAS" ...
## $ score : int 6 17 5 6 19 17 6 0 13 5 ...
## $ firmas : int 0 3 0 0 1 2 0 NA 1 0 ...
## $ militantes : int 1 1 0 1 3 2 0 NA 1 0 ...
## $ reuniones : int 1 3 1 2 2 1 2 NA 2 1 ...
## $ basico : int 0 1 0 1 2 2 0 NA 1 0 ...
## $ intermedio : int 0 1 0 0 1 2 0 NA 1 0 ...
## $ actividades : int 1 1 0 0 2 1 0 NA 1 0 ...
## $ comunica : int 0 4 3 0 4 4 2 NA 4 3 ...
## $ local : int 3 3 1 2 4 3 2 NA 2 1 ...
## $ clasificacion: chr "INACTIVO" "EN CONSTRUCCION" "INACTIVO" "INACTIVO" ...
Formateo:
partidomorado$region=as.factor(partidomorado$region)
partidomorado[,c(3:11)]=lapply(partidomorado[,c(3:11)],as.numeric)
partidomorado$clasificacion=factor(partidomorado$clasificacion,ordered = T,levels = c("NO MEDIDO","INACTIVO","NUCLEO","EN CONSTRUCCION","EN PROCESO DE CONSOLIDACION","CONSOLIDADO"))
str(partidomorado)
## 'data.frame': 108 obs. of 12 variables:
## $ region : Factor w/ 26 levels "AMAZONAS","ANCASH",..: 1 2 2 2 2 2 2 2 2 2 ...
## $ provincia : chr "UTCUBAMBA" "HUARAZ" "CARHUAZ" "HUAYLAS" ...
## $ score : num 6 17 5 6 19 17 6 0 13 5 ...
## $ firmas : num 0 3 0 0 1 2 0 NA 1 0 ...
## $ militantes : num 1 1 0 1 3 2 0 NA 1 0 ...
## $ reuniones : num 1 3 1 2 2 1 2 NA 2 1 ...
## $ basico : num 0 1 0 1 2 2 0 NA 1 0 ...
## $ intermedio : num 0 1 0 0 1 2 0 NA 1 0 ...
## $ actividades : num 1 1 0 0 2 1 0 NA 1 0 ...
## $ comunica : num 0 4 3 0 4 4 2 NA 4 3 ...
## $ local : num 3 3 1 2 4 3 2 NA 2 1 ...
## $ clasificacion: Ord.factor w/ 6 levels "NO MEDIDO"<"INACTIVO"<..: 2 4 2 2 4 4 2 1 3 2 ...
Veo que hay provincias para los cuales no hay data. Es decir, están bajo la categoría NO MEDIDO. Son las siguientes:
partidomorado[partidomorado$clasificacion=="NO MEDIDO",]
## region provincia score firmas militantes
## 8 ANCASH MARISCAL LUZURIAGA 0 NA NA
## 11 APURIMAC ABANCAY 0 NA NA
## 12 APURIMAC ANDAHUAYLAS 0 NA NA
## 14 APURIMAC AYMARAES 0 NA NA
## 56 JUNIN CHUPACA 0 NA NA
## 65 LIMA METROPOLITANA LIMA 0 NA NA
## 75 MADRE DE DIOS TAMBOPATA 0 NA NA
## 78 PASCO OXAPAMPA 0 NA NA
## 98 SAN MARTIN SAN MARTIN 0 NA NA
## 99 SAN MARTIN EL DORADO 0 NA NA
## 100 SAN MARTIN MARISCAL CACERES 0 NA NA
## 101 SAN MARTIN BELLAVISTA 0 NA NA
## 102 SAN MARTIN LAMAS 0 NA NA
## reuniones basico intermedio actividades comunica local clasificacion
## 8 NA NA NA NA NA NA NO MEDIDO
## 11 NA NA NA NA NA NA NO MEDIDO
## 12 NA NA NA NA NA NA NO MEDIDO
## 14 NA NA NA NA NA NA NO MEDIDO
## 56 NA NA NA NA NA NA NO MEDIDO
## 65 NA NA NA NA NA NA NO MEDIDO
## 75 NA NA NA NA NA NA NO MEDIDO
## 78 NA NA NA NA NA NA NO MEDIDO
## 98 NA NA NA NA NA NA NO MEDIDO
## 99 NA NA NA NA NA NA NO MEDIDO
## 100 NA NA NA NA NA NA NO MEDIDO
## 101 NA NA NA NA NA NA NO MEDIDO
## 102 NA NA NA NA NA NA NO MEDIDO
Dato que no hay data para estas 13 provincias, elimino estas filas. Debiera quedarme entonces con 95 CPP:
partidomorado=partidomorado[!partidomorado$clasificacion=="NO MEDIDO",]
dim(partidomorado)
## [1] 95 12
¡Conforme!
Apliquemos la técnica de clusters para ver si es posible tener una mejor clasificación de los datos.
Hago un subconjunto con las variables que necesito:
partidomorado_sub=partidomorado[c(4:11)]
head(partidomorado_sub)
## firmas militantes reuniones basico intermedio actividades comunica local
## 1 0 1 1 0 0 1 0 3
## 2 3 1 3 1 1 1 4 3
## 3 0 0 1 0 0 0 3 1
## 4 0 1 2 1 0 0 0 2
## 5 1 3 2 2 1 2 4 4
## 6 2 2 1 2 2 1 4 3
Hago que los nombres de mis filas en este subconjunto sean los nombres de cada provincia de mi data original:
row.names(partidomorado_sub)=partidomorado$provincia
head(partidomorado_sub,10)
## firmas militantes reuniones basico intermedio actividades
## UTCUBAMBA 0 1 1 0 0 1
## HUARAZ 3 1 3 1 1 1
## CARHUAZ 0 0 1 0 0 0
## HUAYLAS 0 1 2 1 0 0
## RECUAY 1 3 2 2 1 2
## SANTA 2 2 1 2 2 1
## PALLASCA 0 0 2 0 0 0
## YUNGAY 1 1 2 1 1 1
## CASMA 0 0 1 0 0 0
## CHINCHEROS 2 1 2 0 0 0
## comunica local
## UTCUBAMBA 0 3
## HUARAZ 4 3
## CARHUAZ 3 1
## HUAYLAS 0 2
## RECUAY 4 4
## SANTA 4 3
## PALLASCA 2 2
## YUNGAY 4 2
## CASMA 3 1
## CHINCHEROS 3 3
Uso NbClust para que nos diga cuál es el número óptimo de clusters. Uso method=“complete”
library(NbClust)
nb <- NbClust(partidomorado_sub,method="complete")
## *** : The Hubert index is a graphical method of determining the number of clusters.
## In the plot of Hubert index, we seek a significant knee that corresponds to a
## significant increase of the value of the measure i.e the significant peak in Hubert
## index second differences plot.
##
## *** : The D index is a graphical method of determining the number of clusters.
## In the plot of D index, we seek a significant knee (the significant peak in Dindex
## second differences plot) that corresponds to a significant increase of the value of
## the measure.
##
## *******************************************************************
## * Among all indices:
## * 10 proposed 2 as the best number of clusters
## * 2 proposed 3 as the best number of clusters
## * 6 proposed 4 as the best number of clusters
## * 1 proposed 6 as the best number of clusters
## * 1 proposed 12 as the best number of clusters
## * 4 proposed 15 as the best number of clusters
##
## ***** Conclusion *****
##
## * According to the majority rule, the best number of clusters is 2
##
##
## *******************************************************************
Usando method=“complete”, se nos sugiere que el mejor número de clusters es 2.
Aplicamos el algoritmo de método jerárquico y veo el dendograma:
library(factoextra)
## Loading required package: ggplot2
## Warning: package 'ggplot2' was built under R version 3.4.4
## Welcome! Related Books: `Practical Guide To Cluster Analysis in R` at https://goo.gl/13EFCZ
algoritmo="hclust"
cuantosCluster=2
solucionJerarquica1 <- eclust(partidomorado_sub,
FUNcluster = algoritmo,
k = cuantosCluster,
method = "complete",
graph = FALSE)
fviz_dend(solucionJerarquica1, rect = TRUE, show_labels = T)
## Warning in data.frame(xmin = unlist(xleft), ymin = unlist(ybottom), xmax =
## unlist(xright), : row names were found from a short variable and have been
## discarded
Guardamos los resultados de la aglomeración en un data frame:
comitesHC = as.data.frame(solucionJerarquica1$cluster)
colnames(comitesHC)=c("jerarquico")
Hacemos merge:
partidomorado=merge(partidomorado,comitesHC,
by.x="provincia",
by.y=0)
head(partidomorado)
## provincia region score firmas militantes reuniones basico
## 1 ANGARAES HUANCAVELICA 12 0 4 1 1
## 2 AREQUIPA AREQUIPA 22 4 4 2 1
## 3 ASCOPE LA LIBERTAD 4 1 2 0 0
## 4 ATALAYA UCAYALI 10 0 1 2 0
## 5 AZANGARO PUNO 13 0 2 3 0
## 6 BARRANCA LIMA PROVINCIAS 9 4 0 1 1
## intermedio actividades comunica local clasificacion
## 1 1 0 3 2 NUCLEO
## 2 2 2 3 4 EN PROCESO DE CONSOLIDACION
## 3 0 0 0 1 INACTIVO
## 4 0 1 2 4 NUCLEO
## 5 0 1 4 3 NUCLEO
## 6 1 1 0 1 NUCLEO
## jerarquico
## 1 1
## 2 2
## 3 1
## 4 1
## 5 1
## 6 2
Ahora veamos cuántas provincias están en cada cluster:
table(partidomorado$jerarquico)
##
## 1 2
## 66 29
Parece ser que en el cluster 2 están los CPPs que están mejor. Comprobemos si es así:
partidomorado[partidomorado$jerarquico=="2",]
## provincia region score firmas militantes
## 2 AREQUIPA AREQUIPA 22 4 4
## 6 BARRANCA LIMA PROVINCIAS 9 4 0
## 8 CALLAO CALLAO 20 3 4
## 10 CANCHIS CUSCO 18 4 3
## 22 CHINCHA ICA 12 4 4
## 26 COLLAO PUNO 15 4 1
## 27 CONCEPCION JUNIN 14 4 1
## 29 CUSCO CUSCO 28 4 4
## 30 DANIEL ALCIDES CARRION PASCO 15 4 1
## 34 HUAMANGA AYACUCHO 28 4 4
## 41 HUARAL LIMA PROVINCIAS 13 3 0
## 42 HUARAZ ANCASH 17 3 1
## 43 HUAROCHIRI LIMA PROVINCIAS 13 2 2
## 46 ICA ICA 23 4 4
## 49 LA CONVENCION CUSCO 21 4 4
## 53 LEONCIO PRADO HUANUCO 12 3 1
## 54 LORETO LORETO 15 4 2
## 57 MAYNAS LORETO 18 3 3
## 59 MOHO PUNO 15 3 1
## 61 NAZCA ICA 12 4 4
## 63 OYON LIMA PROVINCIAS 13 3 1
## 66 PAITA PIURA 14 4 1
## 68 PASCO PASCO 17 4 1
## 69 PISCO ICA 14 4 4
## 71 PUNO PUNO 23 4 4
## 72 QUISPICANCHI CUSCO 17 4 2
## 76 SAN ROMAN PUNO 22 4 4
## 83 TACNA TACNA 23 4 4
## 92 YAROWILLCA HUANUCO 11 4 1
## reuniones basico intermedio actividades comunica local
## 2 2 1 2 2 3 4
## 6 1 1 1 1 0 1
## 8 2 1 2 1 4 3
## 10 2 1 1 1 3 3
## 22 0 0 0 0 3 1
## 26 2 0 0 1 4 3
## 27 3 0 0 0 4 2
## 29 2 2 4 4 4 4
## 30 2 1 1 0 3 3
## 34 4 2 2 4 4 4
## 41 2 1 1 1 4 1
## 42 3 1 1 1 4 3
## 43 1 1 1 1 4 1
## 46 2 2 3 1 4 3
## 49 2 1 1 2 4 3
## 53 3 0 0 1 2 2
## 54 2 0 0 0 3 4
## 57 3 1 0 1 3 4
## 59 3 0 0 1 4 3
## 61 0 0 0 0 3 1
## 63 1 1 1 1 4 1
## 66 2 1 1 0 3 2
## 68 3 1 2 0 3 3
## 69 0 1 1 0 3 1
## 71 3 1 1 2 4 4
## 72 2 1 1 1 3 3
## 76 3 1 1 1 4 4
## 83 3 2 2 1 4 3
## 92 2 0 0 1 2 1
## clasificacion jerarquico
## 2 EN PROCESO DE CONSOLIDACION 2
## 6 NUCLEO 2
## 8 EN CONSTRUCCION 2
## 10 EN CONSTRUCCION 2
## 22 NUCLEO 2
## 26 EN CONSTRUCCION 2
## 27 EN CONSTRUCCION 2
## 29 CONSOLIDADO 2
## 30 EN CONSTRUCCION 2
## 34 CONSOLIDADO 2
## 41 NUCLEO 2
## 42 EN CONSTRUCCION 2
## 43 NUCLEO 2
## 46 EN PROCESO DE CONSOLIDACION 2
## 49 EN PROCESO DE CONSOLIDACION 2
## 53 NUCLEO 2
## 54 EN CONSTRUCCION 2
## 57 EN CONSTRUCCION 2
## 59 EN CONSTRUCCION 2
## 61 NUCLEO 2
## 63 NUCLEO 2
## 66 EN CONSTRUCCION 2
## 68 EN CONSTRUCCION 2
## 69 EN CONSTRUCCION 2
## 71 EN PROCESO DE CONSOLIDACION 2
## 72 EN CONSTRUCCION 2
## 76 EN PROCESO DE CONSOLIDACION 2
## 83 EN PROCESO DE CONSOLIDACION 2
## 92 NUCLEO 2
En efecto: en este cluster se encuentran las dos provincias clasificadas con la categoría más alta (CONSOLIDADO) y las siete provincias clasificadas con la segunda categoría más alta (EN PROCESO DE CONSOLIDACION).
Veamos qué tan buena ha sido esta aglomeración usando método jerárquico. Calculemos las siluetas:
fviz_silhouette(solucionJerarquica1)
## cluster size ave.sil.width
## 1 1 66 0.34
## 2 2 29 0.23
Accedamos a la info de las siluetas:
siluetas <- solucionJerarquica1$silinfo$widths
Veamos las provincias que están mal agrupadas:
siluetas[siluetas$sil_width<0,]
## cluster neighbor sil_width
## PIURA 1 2 -0.04464900
## HUANCAYO 1 2 -0.06170747
## SANTA 1 2 -0.06981466
## HUAROCHIRI 2 1 -0.03129100
En el caso de Piura, Huancayo y Santa, se trata de provincias clasificadas inicialmente en la categoría EN CONSTRUCCIÓN. En el caso de Huarochirí, se trata de una provincia clasificada inicialmente en la categoría NUCLEO.
Guardemos la información de las provincias mal agrupadas en un data frame llamado malAgrupadasHC:
malAgrupadasHC=as.data.frame(siluetas[siluetas$sil_width<0,])
malAgrupadasHC
## cluster neighbor sil_width
## PIURA 1 2 -0.04464900
## HUANCAYO 1 2 -0.06170747
## SANTA 1 2 -0.06981466
## HUAROCHIRI 2 1 -0.03129100
Usando method=“complete” se nos sugirió clasificar en 2 clusters, con lo cual hay muy pocas provincias en uno de ellos (29, las que están mejor) y bastantes provincias en el otro (66). Esto no nos es tan útil para el trabajo político.
¿Qué tal si usamos method=“kmeans”? ¿Nos sugerirá dividir en 5 clusters, tal y como se hizo originalmente con la data? Probemos:
library(NbClust)
nb2 <- NbClust(partidomorado_sub,method="kmeans")
## *** : The Hubert index is a graphical method of determining the number of clusters.
## In the plot of Hubert index, we seek a significant knee that corresponds to a
## significant increase of the value of the measure i.e the significant peak in Hubert
## index second differences plot.
##
## *** : The D index is a graphical method of determining the number of clusters.
## In the plot of D index, we seek a significant knee (the significant peak in Dindex
## second differences plot) that corresponds to a significant increase of the value of
## the measure.
##
## *******************************************************************
## * Among all indices:
## * 10 proposed 2 as the best number of clusters
## * 1 proposed 3 as the best number of clusters
## * 4 proposed 4 as the best number of clusters
## * 2 proposed 5 as the best number of clusters
## * 1 proposed 6 as the best number of clusters
## * 1 proposed 7 as the best number of clusters
## * 1 proposed 8 as the best number of clusters
## * 4 proposed 15 as the best number of clusters
##
## ***** Conclusion *****
##
## * According to the majority rule, the best number of clusters is 2
##
##
## *******************************************************************
Usando method=“kmeans” también se nos sugiere que solo debiéramos trabajar con 2 clusters.
Dado que ya mencionábamos que la idea original del Partido es clasificar a los CPP en 5 grupos, pues eso permitirá organizar mejor el trabajo político [aplicar diferentes planes de acción para las provincias en cada uno de los 5 grupos] apliquemos el método k-medias dividiendo en 5 clusters:
algoritmo="kmeans"
cuantosClusters=5
solucionKmeans1 <- eclust(partidomorado_sub,
FUNcluster = algoritmo,
k = cuantosClusters,
graph = F)
Saquemos el mapa de provincias:
fviz_cluster(solucionKmeans1, geom="point", ellipse = F)
Ahora, guardemos los clusters:
comitesK = as.data.frame(solucionKmeans1$cluster)
colnames(comitesK)=c("kmedias")
Hacemos merge:
partidomorado=merge(partidomorado,comitesK,
by.x="provincia",
by.y=0)
head(partidomorado)
## provincia region score firmas militantes reuniones basico
## 1 ANGARAES HUANCAVELICA 12 0 4 1 1
## 2 AREQUIPA AREQUIPA 22 4 4 2 1
## 3 ASCOPE LA LIBERTAD 4 1 2 0 0
## 4 ATALAYA UCAYALI 10 0 1 2 0
## 5 AZANGARO PUNO 13 0 2 3 0
## 6 BARRANCA LIMA PROVINCIAS 9 4 0 1 1
## intermedio actividades comunica local clasificacion
## 1 1 0 3 2 NUCLEO
## 2 2 2 3 4 EN PROCESO DE CONSOLIDACION
## 3 0 0 0 1 INACTIVO
## 4 0 1 2 4 NUCLEO
## 5 0 1 4 3 NUCLEO
## 6 1 1 0 1 NUCLEO
## jerarquico kmedias
## 1 1 4
## 2 2 2
## 3 1 1
## 4 1 1
## 5 1 5
## 6 2 3
Veamos cuántas provincias hay por cluster usando el método K-medias:
table(partidomorado$kmedias)
##
## 1 2 3 4 5
## 31 14 23 8 19
Veamos qué provincias están en cada cluster. Empecemos con el cluster 1:
partidomorado[partidomorado$kmedias=="1",]
## provincia region score firmas militantes reuniones basico
## 3 ASCOPE LA LIBERTAD 4 1 2 0 0
## 4 ATALAYA UCAYALI 10 0 1 2 0
## 12 CANGALLO AYACUCHO 9 0 3 1 0
## 14 CARHUAZ ANCASH 5 0 0 1 0
## 15 CASMA ANCASH 5 0 0 1 0
## 16 CASTILLA AREQUIPA 9 0 2 1 0
## 17 CAYLLOMA AREQUIPA 9 0 1 1 0
## 18 CELENDIN CAJAMARCA 6 0 1 1 0
## 20 CHEPEN LA LIBERTAD 7 0 2 1 0
## 24 CHOTA CAJAMARCA 9 0 2 1 1
## 31 ESPINAR CUSCO 6 0 1 1 0
## 33 HUALGAYOC CAJAMARCA 9 0 2 1 1
## 35 HUANCA SANCOS AYACUCHO 7 0 1 1 0
## 37 HUANCAVELICA HUANCAVELICA 8 2 1 0 1
## 39 HUANTA AYACUCHO 9 0 2 1 0
## 45 HUAYLAS ANCASH 6 0 1 2 1
## 50 LA MAR AYACUCHO 8 0 2 0 0
## 55 LUCANAS AYACUCHO 7 0 1 1 0
## 56 MARISCAL NIETO MOQUEGUA 7 0 3 2 0
## 62 OTUZCO LA LIBERTAD 5 0 1 0 0
## 64 PACHITEA HUANUCO 7 0 1 3 0
## 65 PADRE ABAD UCAYALI 6 0 1 2 0
## 67 PALLASCA ANCASH 6 0 0 2 0
## 77 SANCHEZ CARRION LA LIBERTAD 8 0 3 1 0
## 80 SATIPO JUNIN 9 0 1 3 0
## 81 SUCRE AYACUCHO 7 0 1 1 0
## 86 TAYACAJA HUANCAVELICA 7 0 1 2 0
## 88 TUMBES TUMBES 7 0 2 3 0
## 89 UTCUBAMBA AMAZONAS 6 0 1 1 0
## 90 VICTOR FAJARDO AYACUCHO 7 0 1 1 0
## 91 VILCASHUAMAN AYACUCHO 7 0 1 1 0
## intermedio actividades comunica local clasificacion jerarquico kmedias
## 3 0 0 0 1 INACTIVO 1 1
## 4 0 1 2 4 NUCLEO 1 1
## 12 0 0 2 3 NUCLEO 1 1
## 14 0 0 3 1 INACTIVO 1 1
## 15 0 0 3 1 INACTIVO 1 1
## 16 0 0 3 3 NUCLEO 1 1
## 17 0 1 3 3 NUCLEO 1 1
## 18 0 0 2 2 INACTIVO 1 1
## 20 0 1 2 1 NUCLEO 1 1
## 24 0 0 3 2 NUCLEO 1 1
## 31 0 0 1 3 INACTIVO 1 1
## 33 0 0 3 2 NUCLEO 1 1
## 35 0 0 2 3 NUCLEO 1 1
## 37 1 0 2 1 NUCLEO 1 1
## 39 0 1 2 3 NUCLEO 1 1
## 45 0 0 0 2 INACTIVO 1 1
## 50 0 1 2 3 NUCLEO 1 1
## 55 0 0 2 3 NUCLEO 1 1
## 56 0 0 0 2 NUCLEO 1 1
## 62 0 1 2 1 INACTIVO 1 1
## 64 0 0 1 2 NUCLEO 1 1
## 65 0 0 1 2 INACTIVO 1 1
## 67 0 0 2 2 INACTIVO 1 1
## 77 0 1 2 1 NUCLEO 1 1
## 80 0 0 2 3 NUCLEO 1 1
## 81 0 0 2 3 NUCLEO 1 1
## 86 0 0 2 2 NUCLEO 1 1
## 88 0 0 0 2 NUCLEO 1 1
## 89 0 1 0 3 INACTIVO 1 1
## 90 0 0 2 3 NUCLEO 1 1
## 91 0 0 2 3 NUCLEO 1 1
Guardo esto en un data frame y ordeno decrecientemente por la variable score:
clusterK1=partidomorado[partidomorado$kmedias=="1",]
clusterK1[order(-clusterK1$score),]
## provincia region score firmas militantes reuniones basico
## 4 ATALAYA UCAYALI 10 0 1 2 0
## 12 CANGALLO AYACUCHO 9 0 3 1 0
## 16 CASTILLA AREQUIPA 9 0 2 1 0
## 17 CAYLLOMA AREQUIPA 9 0 1 1 0
## 24 CHOTA CAJAMARCA 9 0 2 1 1
## 33 HUALGAYOC CAJAMARCA 9 0 2 1 1
## 39 HUANTA AYACUCHO 9 0 2 1 0
## 80 SATIPO JUNIN 9 0 1 3 0
## 37 HUANCAVELICA HUANCAVELICA 8 2 1 0 1
## 50 LA MAR AYACUCHO 8 0 2 0 0
## 77 SANCHEZ CARRION LA LIBERTAD 8 0 3 1 0
## 20 CHEPEN LA LIBERTAD 7 0 2 1 0
## 35 HUANCA SANCOS AYACUCHO 7 0 1 1 0
## 55 LUCANAS AYACUCHO 7 0 1 1 0
## 56 MARISCAL NIETO MOQUEGUA 7 0 3 2 0
## 64 PACHITEA HUANUCO 7 0 1 3 0
## 81 SUCRE AYACUCHO 7 0 1 1 0
## 86 TAYACAJA HUANCAVELICA 7 0 1 2 0
## 88 TUMBES TUMBES 7 0 2 3 0
## 90 VICTOR FAJARDO AYACUCHO 7 0 1 1 0
## 91 VILCASHUAMAN AYACUCHO 7 0 1 1 0
## 18 CELENDIN CAJAMARCA 6 0 1 1 0
## 31 ESPINAR CUSCO 6 0 1 1 0
## 45 HUAYLAS ANCASH 6 0 1 2 1
## 65 PADRE ABAD UCAYALI 6 0 1 2 0
## 67 PALLASCA ANCASH 6 0 0 2 0
## 89 UTCUBAMBA AMAZONAS 6 0 1 1 0
## 14 CARHUAZ ANCASH 5 0 0 1 0
## 15 CASMA ANCASH 5 0 0 1 0
## 62 OTUZCO LA LIBERTAD 5 0 1 0 0
## 3 ASCOPE LA LIBERTAD 4 1 2 0 0
## intermedio actividades comunica local clasificacion jerarquico kmedias
## 4 0 1 2 4 NUCLEO 1 1
## 12 0 0 2 3 NUCLEO 1 1
## 16 0 0 3 3 NUCLEO 1 1
## 17 0 1 3 3 NUCLEO 1 1
## 24 0 0 3 2 NUCLEO 1 1
## 33 0 0 3 2 NUCLEO 1 1
## 39 0 1 2 3 NUCLEO 1 1
## 80 0 0 2 3 NUCLEO 1 1
## 37 1 0 2 1 NUCLEO 1 1
## 50 0 1 2 3 NUCLEO 1 1
## 77 0 1 2 1 NUCLEO 1 1
## 20 0 1 2 1 NUCLEO 1 1
## 35 0 0 2 3 NUCLEO 1 1
## 55 0 0 2 3 NUCLEO 1 1
## 56 0 0 0 2 NUCLEO 1 1
## 64 0 0 1 2 NUCLEO 1 1
## 81 0 0 2 3 NUCLEO 1 1
## 86 0 0 2 2 NUCLEO 1 1
## 88 0 0 0 2 NUCLEO 1 1
## 90 0 0 2 3 NUCLEO 1 1
## 91 0 0 2 3 NUCLEO 1 1
## 18 0 0 2 2 INACTIVO 1 1
## 31 0 0 1 3 INACTIVO 1 1
## 45 0 0 0 2 INACTIVO 1 1
## 65 0 0 1 2 INACTIVO 1 1
## 67 0 0 2 2 INACTIVO 1 1
## 89 0 1 0 3 INACTIVO 1 1
## 14 0 0 3 1 INACTIVO 1 1
## 15 0 0 3 1 INACTIVO 1 1
## 62 0 1 2 1 INACTIVO 1 1
## 3 0 0 0 1 INACTIVO 1 1
Vemos que en el cluster 1 se encuentran todas las provincias que inicialmente fueron ubicadas en la categoría INACTIVO, así como algunas provincias catalogadas como NUCLEO, pero con puntaje bajo (solo Atalaya tiene un score de 10).
Ahora veamos el cluster 2. Guardaré directamente las provincias de este cluster en un data frame, y ordeno decrecientemente por la variable score:
clusterK2=partidomorado[partidomorado$kmedias=="2",]
clusterK2[order(-clusterK2$score),]
## provincia region score firmas militantes reuniones basico
## 29 CUSCO CUSCO 28 4 4 2 2
## 34 HUAMANGA AYACUCHO 28 4 4 4 2
## 46 ICA ICA 23 4 4 2 2
## 71 PUNO PUNO 23 4 4 3 1
## 83 TACNA TACNA 23 4 4 3 2
## 2 AREQUIPA AREQUIPA 22 4 4 2 1
## 76 SAN ROMAN PUNO 22 4 4 3 1
## 49 LA CONVENCION CUSCO 21 4 4 2 1
## 8 CALLAO CALLAO 20 3 4 2 1
## 10 CANCHIS CUSCO 18 4 3 2 1
## 57 MAYNAS LORETO 18 3 3 3 1
## 69 PISCO ICA 14 4 4 0 1
## 22 CHINCHA ICA 12 4 4 0 0
## 61 NAZCA ICA 12 4 4 0 0
## intermedio actividades comunica local clasificacion
## 29 4 4 4 4 CONSOLIDADO
## 34 2 4 4 4 CONSOLIDADO
## 46 3 1 4 3 EN PROCESO DE CONSOLIDACION
## 71 1 2 4 4 EN PROCESO DE CONSOLIDACION
## 83 2 1 4 3 EN PROCESO DE CONSOLIDACION
## 2 2 2 3 4 EN PROCESO DE CONSOLIDACION
## 76 1 1 4 4 EN PROCESO DE CONSOLIDACION
## 49 1 2 4 3 EN PROCESO DE CONSOLIDACION
## 8 2 1 4 3 EN CONSTRUCCION
## 10 1 1 3 3 EN CONSTRUCCION
## 57 0 1 3 4 EN CONSTRUCCION
## 69 1 0 3 1 EN CONSTRUCCION
## 22 0 0 3 1 NUCLEO
## 61 0 0 3 1 NUCLEO
## jerarquico kmedias
## 29 2 2
## 34 2 2
## 46 2 2
## 71 2 2
## 83 2 2
## 2 2 2
## 76 2 2
## 49 2 2
## 8 2 2
## 10 2 2
## 57 2 2
## 69 2 2
## 22 2 2
## 61 2 2
Vemos que en el cluster 2 se encuentran las nueve provincias con mayor score: las dos únicas provincias catalogadas como CONSOLIDADO (Huamanga y Cusco), las seis provincias catalogadas como EN PROCESO DE CONSOLIDACIÓN (Ica, Puno, Tacna, Arequipa, San Román y La Convención) y la provincia catalogada EN CONSTRUCCIÓN con el score más alto (Callao). Con un score menor, terminan de componer este cluster las provincias de Canchis, Maynas, Pisco (catalogadas como EN CONSTRUCCIÓN); y las provincias de Chincha y Nazca (catalogadas inicialmente como NUCLEO).
Veamos el cluster 3. Guardaré directamente las provincias de este cluster en un data frame, y ordeno decrecientemente por la variable score:
clusterK3=partidomorado[partidomorado$kmedias=="3",]
clusterK3[order(-clusterK3$score),]
## provincia region score firmas militantes
## 38 HUANCAYO JUNIN 18 2 2
## 42 HUARAZ ANCASH 17 3 1
## 68 PASCO PASCO 17 4 1
## 72 QUISPICANCHI CUSCO 17 4 2
## 79 SANTA ANCASH 17 2 2
## 19 CHANCHAMAYO JUNIN 15 2 2
## 26 COLLAO PUNO 15 4 1
## 30 DANIEL ALCIDES CARRION PASCO 15 4 1
## 54 LORETO LORETO 15 4 2
## 59 MOHO PUNO 15 3 1
## 27 CONCEPCION JUNIN 14 4 1
## 66 PAITA PIURA 14 4 1
## 41 HUARAL LIMA PROVINCIAS 13 3 0
## 43 HUAROCHIRI LIMA PROVINCIAS 13 2 2
## 47 ISLAY AREQUIPA 13 2 0
## 63 OYON LIMA PROVINCIAS 13 3 1
## 74 RIOJA SAN MARTIN 13 2 2
## 40 HUANUCO HUANUCO 12 2 1
## 53 LEONCIO PRADO HUANUCO 12 3 1
## 85 TARMA JUNIN 12 2 1
## 23 CHINCHEROS APURIMAC 11 2 1
## 92 YAROWILLCA HUANUCO 11 4 1
## 6 BARRANCA LIMA PROVINCIAS 9 4 0
## reuniones basico intermedio actividades comunica local clasificacion
## 38 3 1 1 2 4 3 EN CONSTRUCCION
## 42 3 1 1 1 4 3 EN CONSTRUCCION
## 68 3 1 2 0 3 3 EN CONSTRUCCION
## 72 2 1 1 1 3 3 EN CONSTRUCCION
## 79 1 2 2 1 4 3 EN CONSTRUCCION
## 19 2 1 1 1 3 3 EN CONSTRUCCION
## 26 2 0 0 1 4 3 EN CONSTRUCCION
## 30 2 1 1 0 3 3 EN CONSTRUCCION
## 54 2 0 0 0 3 4 EN CONSTRUCCION
## 59 3 0 0 1 4 3 EN CONSTRUCCION
## 27 3 0 0 0 4 2 EN CONSTRUCCION
## 66 2 1 1 0 3 2 EN CONSTRUCCION
## 41 2 1 1 1 4 1 NUCLEO
## 43 1 1 1 1 4 1 NUCLEO
## 47 2 1 1 1 3 3 NUCLEO
## 63 1 1 1 1 4 1 NUCLEO
## 74 3 0 0 1 2 3 NUCLEO
## 40 3 0 0 0 3 3 NUCLEO
## 53 3 0 0 1 2 2 NUCLEO
## 85 2 0 0 0 3 4 NUCLEO
## 23 2 0 0 0 3 3 NUCLEO
## 92 2 0 0 1 2 1 NUCLEO
## 6 1 1 1 1 0 1 NUCLEO
## jerarquico kmedias
## 38 1 3
## 42 2 3
## 68 2 3
## 72 2 3
## 79 1 3
## 19 1 3
## 26 2 3
## 30 2 3
## 54 2 3
## 59 2 3
## 27 2 3
## 66 2 3
## 41 2 3
## 43 2 3
## 47 1 3
## 63 2 3
## 74 1 3
## 40 1 3
## 53 2 3
## 85 1 3
## 23 1 3
## 92 2 3
## 6 2 3
Veamos el cluster 4. Guardaré directamente las provincias de este cluster en un data frame, y ordeno decrecientemente por la variable score:
clusterK4=partidomorado[partidomorado$kmedias=="4",]
clusterK4[order(-clusterK4$score),]
## provincia region score firmas militantes reuniones basico
## 28 CORONEL PORTILLO UCAYALI 20 0 4 4 1
## 73 RECUAY ANCASH 19 1 3 2 2
## 70 PIURA PIURA 17 2 3 3 1
## 7 CAJAMARCA CAJAMARCA 16 0 4 2 1
## 87 TRUJILLO LA LIBERTAD 16 0 4 2 0
## 51 LAMBAYEQUE LAMBAYEQUE 13 1 4 3 0
## 1 ANGARAES HUANCAVELICA 12 0 4 1 1
## 48 JAEN CAJAMARCA 12 0 3 1 1
## intermedio actividades comunica local clasificacion jerarquico
## 28 1 2 4 4 EN CONSTRUCCION 1
## 73 1 2 4 4 EN CONSTRUCCION 1
## 70 1 1 3 3 EN CONSTRUCCION 1
## 7 0 1 4 4 EN CONSTRUCCION 1
## 87 0 2 4 4 EN CONSTRUCCION 1
## 51 0 2 0 3 NUCLEO 1
## 1 1 0 3 2 NUCLEO 1
## 48 0 0 3 4 NUCLEO 1
## kmedias
## 28 4
## 73 4
## 70 4
## 7 4
## 87 4
## 51 4
## 1 4
## 48 4
Veamos el cluster 5. Guardaré directamente las provincias de este cluster en un data frame, y ordeno decrecientemente por la variable score:
clusterK5=partidomorado[partidomorado$kmedias=="5",]
clusterK5[order(-clusterK5$score),]
## provincia region score firmas militantes reuniones
## 52 LAMPA PUNO 14 0 2 3
## 5 AZANGARO PUNO 13 0 2 3
## 13 CARABAYA PUNO 13 0 2 3
## 21 CHICLAYO LAMBAYEQUE 13 0 1 3
## 58 MELGAR PUNO 13 0 2 2
## 78 SANDIA PUNO 13 0 2 3
## 94 YUNGAY ANCASH 13 1 1 2
## 95 YUNGUYO PUNO 13 0 2 3
## 60 MORROPON PIURA 12 1 1 3
## 75 SAN ANTONIO DE PUTINA PUNO 12 0 1 3
## 82 SULLANA PIURA 12 1 1 3
## 36 HUANCANE PUNO 11 1 1 2
## 84 TALARA PIURA 11 1 1 2
## 32 FERRENAFE LAMBAYEQUE 10 1 1 3
## 11 CANETE LIMA PROVINCIAS 9 1 0 1
## 25 CHUCUITO PUNO 9 0 1 2
## 93 YAUYOS LIMA PROVINCIAS 9 0 1 1
## 9 CAMANA AREQUIPA 8 1 0 2
## 44 HUAURA LIMA PROVINCIAS 8 0 0 1
## basico intermedio actividades comunica local clasificacion jerarquico
## 52 1 0 1 4 3 EN CONSTRUCCION 1
## 5 0 0 1 4 3 NUCLEO 1
## 13 0 0 1 4 3 NUCLEO 1
## 21 1 1 1 3 3 NUCLEO 1
## 58 0 0 2 4 3 NUCLEO 1
## 78 0 0 1 4 3 NUCLEO 1
## 94 1 1 1 4 2 NUCLEO 1
## 95 0 0 1 4 3 NUCLEO 1
## 60 1 1 0 3 2 NUCLEO 1
## 75 0 0 1 4 3 NUCLEO 1
## 82 1 1 0 3 2 NUCLEO 1
## 36 0 0 1 3 3 NUCLEO 1
## 84 1 1 0 3 2 NUCLEO 1
## 32 0 0 0 3 2 NUCLEO 1
## 11 1 1 0 4 1 NUCLEO 1
## 25 0 0 0 3 3 NUCLEO 1
## 93 1 1 0 4 1 NUCLEO 1
## 9 0 0 0 3 2 NUCLEO 1
## 44 1 1 0 4 1 NUCLEO 1
## kmedias
## 52 5
## 5 5
## 13 5
## 21 5
## 58 5
## 78 5
## 94 5
## 95 5
## 60 5
## 75 5
## 82 5
## 36 5
## 84 5
## 32 5
## 11 5
## 25 5
## 93 5
## 9 5
## 44 5
Veamos ahora, a través de las siluetas, qué provincias quedaron mal agrupadas tras hacer K-medias:
fviz_silhouette(solucionKmeans1)
## cluster size ave.sil.width
## 1 1 31 0.22
## 2 2 14 0.22
## 3 3 23 0.16
## 4 4 8 0.12
## 5 5 19 0.26
siluetasKmeans <- solucionKmeans1$silinfo$widths
siluetasKmeans[siluetasKmeans$sil_width<0,]
## cluster neighbor sil_width
## SATIPO 1 5 -0.015418922
## MAYNAS 2 3 -0.063540008
## CHINCHEROS 3 5 -0.007069707
## HUANCAYO 3 5 -0.015271522
## HUAROCHIRI 3 5 -0.021804114
## HUANUCO 3 5 -0.032945980
## PIURA 4 3 -0.029639487
Guardemos la información de las provincias mal agrupadas en un data frame llamado malAgrupadasK:
malAgrupadasK=as.data.frame(siluetasKmeans[siluetasKmeans$sil_width<0,])
malAgrupadasK
## cluster neighbor sil_width
## SATIPO 1 5 -0.015418922
## MAYNAS 2 3 -0.063540008
## CHINCHEROS 3 5 -0.007069707
## HUANCAYO 3 5 -0.015271522
## HUAROCHIRI 3 5 -0.021804114
## HUANUCO 3 5 -0.032945980
## PIURA 4 3 -0.029639487
Saco distancias:
partidomorado_d=dist(partidomorado_sub)
Genero los puntos para el mapa de similitudes:
partidomorado_r=cmdscale(partidomorado_d,eig = T,k=2)
partidomorado_r$GOF
## [1] 0.622547 0.622547
Ploteo el mapa:
titulo="Mapa de Similitudes entre Comités Políticos Provinciales"
x <- partidomorado_r$points[,1]
y <- partidomorado_r$points[,2]
plot(x, y, main=titulo)
Pongo los nombres de las provincias:
plot(x, y, xlab="Dimension 1", ylab="Dimension 2", main=titulo, type="n")
columnForLabels=dimnames(partidomorado_r[[1]])[[1]]
text(x, y,labels = columnForLabels , cex = 0.6)
¿Podré reducir las variables de la medición original en uno o dos índices? Veamos.
summary(partidomorado_sub)
## firmas militantes reuniones basico
## Min. :0.000 Min. :0.000 Min. :0.000 Min. :0.0000
## 1st Qu.:0.000 1st Qu.:1.000 1st Qu.:1.000 1st Qu.:0.0000
## Median :1.000 Median :1.000 Median :2.000 Median :0.0000
## Mean :1.453 Mean :1.832 Mean :1.895 Mean :0.5263
## 3rd Qu.:3.000 3rd Qu.:3.000 3rd Qu.:3.000 3rd Qu.:1.0000
## Max. :4.000 Max. :4.000 Max. :4.000 Max. :2.0000
## intermedio actividades comunica local
## Min. :0.0000 Min. :0.0000 Min. :0.000 Min. :1.000
## 1st Qu.:0.0000 1st Qu.:0.0000 1st Qu.:2.000 1st Qu.:2.000
## Median :0.0000 Median :1.0000 Median :3.000 Median :3.000
## Mean :0.5053 Mean :0.6842 Mean :2.842 Mean :2.558
## 3rd Qu.:1.0000 3rd Qu.:1.0000 3rd Qu.:4.000 3rd Qu.:3.000
## Max. :4.0000 Max. :4.0000 Max. :4.000 Max. :4.000
Saco matriz de correlación:
cor(partidomorado_sub)
## firmas militantes reuniones basico intermedio
## firmas 1.00000000 0.29421005 0.16332220 0.4349210 0.5420308
## militantes 0.29421005 1.00000000 0.09819305 0.3482715 0.3358323
## reuniones 0.16332220 0.09819305 1.00000000 0.1466701 0.1453900
## basico 0.43492098 0.34827149 0.14667005 1.0000000 0.8388517
## intermedio 0.54203082 0.33583230 0.14539003 0.8388517 1.0000000
## actividades 0.29052215 0.48589483 0.35993046 0.3977820 0.4684746
## comunica 0.29697011 0.20873345 0.26993522 0.4332780 0.3980562
## local 0.06723605 0.38446168 0.48282996 0.1451092 0.1345141
## actividades comunica local
## firmas 0.2905221 0.2969701 0.06723605
## militantes 0.4858948 0.2087335 0.38446168
## reuniones 0.3599305 0.2699352 0.48282996
## basico 0.3977820 0.4332780 0.14510919
## intermedio 0.4684746 0.3980562 0.13451408
## actividades 1.0000000 0.3428221 0.44276288
## comunica 0.3428221 1.0000000 0.24302180
## local 0.4427629 0.2430218 1.00000000
Hago KMO:
library(psych)
## Warning: package 'psych' was built under R version 3.4.4
##
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
##
## %+%, alpha
KMO(cor(partidomorado_sub))
## Kaiser-Meyer-Olkin factor adequacy
## Call: KMO(r = cor(partidomorado_sub))
## Overall MSA = 0.72
## MSA for each item =
## firmas militantes reuniones basico intermedio actividades
## 0.79 0.71 0.63 0.68 0.66 0.81
## comunica local
## 0.90 0.67
Ahoga hago la prueba de esfericidad de Bartlett:
cortest.bartlett(cor(partidomorado_sub),n=nrow(partidomorado_sub))
## $chisq
## [1] 280.4077
##
## $p.value
## [1] 1.843992e-43
##
## $df
## [1] 28
Veo en cuántas dimensiones me sugieren reducir con los eigenvalues:
eigenf= eigen(cor(partidomorado_sub))
eigenf$values
## [1] 3.3770192 1.4426814 0.9126513 0.6781722 0.6022383 0.4713939 0.3754659
## [8] 0.1403778
Sugiere reducir en dos dimensiones. No obstante, lo que se busca es tener una mejor clasificación a la que ya se tiene. Así que nos quedamos con una sola dimensión.
resultadoPr=principal(cor(partidomorado_sub),1,rotate="varimax", scores=T)
print(resultadoPr,digits=3, cut=0.40)
## Principal Components Analysis
## Call: principal(r = cor(partidomorado_sub), nfactors = 1, rotate = "varimax",
## scores = T)
## Standardized loadings (pattern matrix) based upon correlation matrix
## PC1 h2 u2 com
## firmas 0.614 0.376 0.624 1
## militantes 0.608 0.370 0.630 1
## reuniones 0.448 0.201 0.799 1
## basico 0.779 0.608 0.392 1
## intermedio 0.805 0.648 0.352 1
## actividades 0.738 0.545 0.455 1
## comunica 0.615 0.379 0.621 1
## local 0.500 0.250 0.750 1
##
## PC1
## SS loadings 3.377
## Proportion Var 0.422
##
## Mean item complexity = 1
## Test of the hypothesis that 1 component is sufficient.
##
## The root mean square of the residuals (RMSR) is 0.15
##
## Fit based upon off diagonal values = 0.832
Este nuevo índice explica el 42,2% de la varianza de las variables originales.
Guardo los scores de este nueva dimensión:
regresFactors=factor.scores(partidomorado_sub,resultadoPr)$scores
Hago merge:
partidomorado=merge(partidomorado,regresFactors,
by.x = "provincia",
by.y=0)
head(partidomorado)
## provincia region score firmas militantes reuniones basico
## 1 ANGARAES HUANCAVELICA 12 0 4 1 1
## 2 AREQUIPA AREQUIPA 22 4 4 2 1
## 3 ASCOPE LA LIBERTAD 4 1 2 0 0
## 4 ATALAYA UCAYALI 10 0 1 2 0
## 5 AZANGARO PUNO 13 0 2 3 0
## 6 BARRANCA LIMA PROVINCIAS 9 4 0 1 1
## intermedio actividades comunica local clasificacion
## 1 1 0 3 2 NUCLEO
## 2 2 2 3 4 EN PROCESO DE CONSOLIDACION
## 3 0 0 0 1 INACTIVO
## 4 0 1 2 4 NUCLEO
## 5 0 1 4 3 NUCLEO
## 6 1 1 0 1 NUCLEO
## jerarquico kmedias PC1
## 1 1 4 0.116548568
## 2 2 2 1.854028337
## 3 1 1 -1.513387390
## 4 1 1 -0.448792214
## 5 1 5 -0.006575008
## 6 2 3 -0.373031886
Creo un data frame con las provincias ordenadas decrecientemente de acuerdo al nuevo índice:
provinciasOrdenado=partidomorado[order(-partidomorado$PC1),]
row.names(provinciasOrdenado)=NULL
Se desea que el nuevo ordenamiento de las provincias esté hecho de acuerdo al nuevo índice. Pero como de todos modos lo que se desea es tener grupos de provincias similares, se tratará de combinar el ordenamiento que brinda el nuevo índice con lo previamente hecho usando k-medias.
K-medias había puesto el siguiente número de provincias en cada cluster:
table(partidomorado$kmedias)
##
## 1 2 3 4 5
## 31 14 23 8 19
Si ordenamos los clusters decrecientemente de acuerdo al nuevo índice (PC1), vemos que el orden de los clusters es: 2, 4, 3, 5, 1
Así, finalmente se opta por una clasificación de las provincias de las siguiente manera:
Grupo A: Cusco, Huamanga, Ica, Tacna, Arequipa, Puno, Recuay, San Roman, La Convención, Coronel Portillo y Callao
Grupo B: Santa, Huancayo, Canchis, Piura, Huaraz, Pasco, Maynas, Quispicanchi, Cajamarca, Chanchamayo, Trujillo
Grupo C: Daniel Alcides Carrión, Chiclayo, Lampa, Yungay, Huarochiri, Islay, Oyon, Huaral, Pisco, Paita, Moho, Collao, Melgar, Angaraes, Morropon, Sullana, Loreto, Lambayeque, Azangaro, Carabaya, Sandia, Yunguyo, Jaen, Talara
Grupo D: Rioja, Concepcion, San Antonio de Putina, Leoncio Prado, Yauyos, Huancane, Tarma, Cañete, Huanuco, Barranca, Chincha, Nazca, Atalaya, Huaura, Yarowillca, Chota, Hualgayoc, Chincheros, Huancavelica, Caylloma, Huanta, Ferreñafe, Castilla, Chucuito
Grupo E: Cangallo, La Mar, Satipo, Sanchez Carrion, Camana, Chepen, Huaylas, Huanca Sancos, Lucanas, Sucre, Victor Fajardo, Vilcashuaman, Tayacaja, Pachitea, Mariscal Nieto, Utcubamba, Tumbes, Celendin, Espinar, Pallasca, Padre Abad, Otuzco, Carhuaz, Casma, Ascope
De este modo, se soluciona el mal agrupamiento de las provincias cuando se clasificó tanto por jerárquico como por k-medias (Piura, Huancayo, el Santa y Maynas van al Grupo B; Huarochiri va al Grupo C; Chincheros y Huanuco van al Grupo D; y Satipo va al Grupo E) y se mejora la clasificación que antes nos brindaba la variable original score.