Describe mediante un boxplot múltiple los porcentajes de votos a vox, pp, cs, psoe, masmadrid, podemos, otros y abstencion. Interpreta brevemente la gráfica. (Nota: si X es una tabla con múltiples columnas, boxplot(X) representa el diagrama de cajas de cada columna)
Antes de todo vamos a realizar una visualización preliminar con los datos de interés.
dat = read.table("madrid_2021.txt",header=TRUE)
dat2=dat[,3:10]
row.names(dat2)=dat$barrio
summary(dat2)
## pp psoe cs vox
## Min. :15.10 Min. : 3.00 Min. :1.000 Min. : 3.500
## 1st Qu.:27.00 1st Qu.: 9.55 1st Qu.:2.100 1st Qu.: 5.100
## Median :33.10 Median :12.10 Median :2.800 Median : 5.800
## Mean :35.57 Mean :11.52 Mean :2.853 Mean : 6.453
## 3rd Qu.:44.30 3rd Qu.:13.75 3rd Qu.:3.550 3rd Qu.: 7.300
## Max. :66.20 Max. :17.30 Max. :5.400 Max. :12.800
## masmadrid podemos otros abstencion
## Min. : 2.10 Min. : 0.600 Min. :0.50 Min. :12.20
## 1st Qu.:11.00 1st Qu.: 3.650 1st Qu.:1.15 1st Qu.:18.50
## Median :13.30 Median : 5.700 Median :1.30 Median :23.20
## Mean :13.02 Mean : 5.294 Mean :1.31 Mean :23.98
## 3rd Qu.:15.20 3rd Qu.: 6.750 3rd Qu.:1.50 3rd Qu.:29.00
## Max. :22.70 Max. :12.200 Max. :2.40 Max. :46.10
Se ve perfectamente que las variables no tienen el mismo recorrido y sería necesario estandarizar los datos, no obstante, en el enunciado nos piden que trabajemos con los datos sin estandarizar.
bx1 = boxplot(dat2, col=c("dodgerblue1","firebrick2","darkorange1","chartreuse2","paleturquoise1","purple2","salmon1","seashell3"))
#if(length(bx1$out)!= 0){
#out.rows <- sapply(1:length(bx1$out), function(i)
# which(dat2[ ,bx1$group[i]] == bx1$out[i]))
# text(bx1$group, bx1$out, rownames(dat2), pos=4, cex = 0.8)
#}
#esta instrucción es para poner el nombre de los barrios en los valores atípicos pero en este caso no lo he puesto ya que al haber tantos en el boxplot quedan los nombres solapados y no se entiende el gráfico
Al hacer el boxplot podemos observar que el partido que tiene mayor porcentaje de votos es el PP, seguido de las abstenciones, Más Madrid, PSOE, Vox, Podemos, Ciudadanos y finalmente el resto de partidos.
Obten la matriz de correlaciones de las variables vox, pp, cs, psoe, masmadrid, podemos, otros y abstencion. Representa mediante gráficos de dispersión las relaciones entre las variables. Interpreta los resultados.
Para medir el grado de relación entre las variables se calcula la matriz de correlaciones (en este caso da igual si los datos están estandariados o no, puesto que la correlación es independiente de la escala de medida de las variables).
r=cor(dat2)
print(r,digits=3)
## pp psoe cs vox masmadrid podemos otros abstencion
## pp 1.000 -0.877 0.620 0.858 -0.772 -0.910 -0.809 -0.830
## psoe -0.877 1.000 -0.447 -0.842 0.729 0.809 0.785 0.605
## cs 0.620 -0.447 1.000 0.380 -0.118 -0.501 -0.348 -0.835
## vox 0.858 -0.842 0.380 1.000 -0.779 -0.843 -0.693 -0.637
## masmadrid -0.772 0.729 -0.118 -0.779 1.000 0.854 0.707 0.316
## podemos -0.910 0.809 -0.501 -0.843 0.854 1.000 0.706 0.619
## otros -0.809 0.785 -0.348 -0.693 0.707 0.706 1.000 0.566
## abstencion -0.830 0.605 -0.835 -0.637 0.316 0.619 0.566 1.000
pairs(dat2,col="skyblue3")
library(car)
## Loading required package: carData
library(corrplot)
## corrplot 0.90 loaded
corrplot(r,method = "ellipse")
Observando la matriz de correlaciones o el gráfico corrplot se puede ver que existen grandes correlaciones entre las variables. Por ejemplo, entre los votantes de Más Madrid y Podemos hay una correlación de 0.854, lo cual es esperable ya que ambos son partidos de izquierdas y les suele votar la gente que comparte la misma ideología.
Por otro lado, Podemos y PP también presentan una correlación alta (-0.910) pero en este caso es negativa, lo cual significa que presentan una fuerte relación pero en este caso es inversa. Esto tiene sentido puesto que la gente que vota a estos partidos tiene una ideología muy diferente.
Si consideramos que las correlaciones son suficientemente grandes pueden influir en la matriz de distancias y sería conveniente realizar un análisis de componentes primero.
Realiza el dendrograma de los datos sin estandarizar, utilizando la distancia euclídea y el método de “ward.D2”. Según el árbol, obtén la solución con tres clusters. Indica el número de observaciones de cada cluster.
Si suponemos, inicialmente, que las correlaciones entre las variables de interés no son suficientemente elevadas como para realizar un análisis de componentes, realizaremos el análisis de clúster jerárquico con la distancia euclídea.
d =dist(dat2,method ="euclidean",diag =T,upper =T)
fit =hclust(d,method ="ward.D2")
plot(fit)
j3 = cutree(fit, k=3)
rect.hclust(fit, k=3, border="violetred3")
table(grupos=j3)
## grupos
## 1 2 3
## 60 44 27
Al realizar el dendrograma con la distancia euclídea y el método “Ward.D2” y obteniendo la solución de 3 grupos obstenemos 60 barrios agrupados en el clúster 1, 44 barrios para el clúster 2 y 27 barrios para el clúster 3.
scatterplotMatrix(dat2,groups=j3)
Los gráficos de dispersión 2 a 2, también es una manera de visualizar las diferencias entre los tres grupos. Si nos fijamos en la diagonal del gráfico, se muestra una estimación “no-paramétricas” (suave) del histograma de cada componente para cada grupo. Se aprecia claramente la diferencia entre los grupos.
Calcula las medias del porcentaje de votos a cada partido (vox, pp, cs, psoe, masmadrid, podemos, otros y abstencion) para cada cluster. Realiza un gráfico boxplot de los votos al pp para cada cluster. Lo mismo para psoe y abstencion. Asígnale un nombre a cada uno de los tres clusters y proporciona el nombre de los barrios del cluster con una media más alta de votos al PP. Utiliza la función fviz_cluster() del paquete factoextra para visualizar los tres grupos. En el gráfico identifica cada punto con el nombre del barrio.
A la hora de asignar nombre a cada cluster se ha denominado “medio” al clúster 1, ya que puede considerarse que la gente que vive en esos barrios tiene un ingreso medio. El clúster 2 se llamaría “bajo” porque se encuentran los barrios más humildes de clase obrera y el clúster 3 se denominaría “alto” ya que serían los barrios con unos ingresos más altos.
medio=rownames(dat2)[j3==1]
bajo=rownames(dat2)[j3==2]
alto=rownames(dat2)[j3==3]
j3_names=factor(j3,labels=c("Medio_j","Bajo_j","Alto_j")) #otra forma de asignar el nombre a los clusters, la letra j indica que son según el análisis jerárquico ya que más adelante se usará la letra k para indicar que son los resultados del k-means
Las medias del porcentaje de votos a cada partido para cada clúster son:
mu1 =sapply(dat2[j3==1,], mean)
mu2 =sapply(dat2[j3==2,], mean)
mu3 =sapply(dat2[j3==3,], mean)
cbind(medio=mu1,alto=mu3,bajo=mu2)
## medio alto bajo
## pp 35.591667 53.8148148 24.331818
## psoe 12.073333 6.9777778 13.563636
## cs 3.285000 3.4814815 1.879545
## vox 6.226667 9.1000000 5.136364
## masmadrid 14.776667 7.0518519 14.295455
## podemos 5.448333 2.2296296 6.963636
## otros 1.350000 0.8814815 1.518182
## abstencion 21.240000 16.4740741 32.320455
Si realizamos un boxplot de los votos al PP, PSOE y abstenciones para cada clúster podemos observar que en el caso del PP, los barrios que más le votan son los del clúster 3, es decir los barrios más ricos. Los cuales son:
sort(alto)
## [1] "Almagro" "Aravaca" "Atalaya"
## [4] "Castellana" "Castilla" "Castillejos"
## [7] "Ciudad Universitaria" "Corralejos" "Costillares"
## [10] "El Goloso" "El Plantio" "El Viso"
## [13] "Estrella" "Fuentelarreina" "Goya"
## [16] "Hispanoamerica" "Jeronimos" "Lista"
## [19] "Mirasierra" "Nino Jesus" "Nueva Espana"
## [22] "Palomas" "Piovera" "Recoletos"
## [25] "Valdefuentes" "Valdemarin" "Vallehermoso"
#par(mfrow=c(3,1))
boxplot(dat2$pp~j3_names,col=c("khaki1","paleturquoise2","palevioletred1"),horizontal =T,xlab = "Votos al PP",
ylab = "Grupos")
boxplot(dat2$psoe~j3_names,col=c("khaki1","paleturquoise2","palevioletred1"),horizontal =T,xlab = "Votos al PSOE",
ylab = "Grupos")
boxplot(dat2$abstencion~j3_names,col=c("khaki1","paleturquoise2","palevioletred1"),horizontal =T,xlab = "Abstención",
ylab = "Grupos")
#par(mfrow=c(1,1))
Por el contrario en el caso del PSOE, los barrios que más le votan son los del clúster 2 (bajo) y clúster 1 (medio). Mientras que los barrios que presentan mayor porcentaje de abstención son los del clúster 2 (bajo).
Una forma de visualizar el resultado del análisis clúster sería con el siguiente gráfico.
library(factoextra)
## Loading required package: ggplot2
## Welcome! Want to learn more? See two factoextra-related books at https://goo.gl/ve3WBa
fviz_cluster(list(data=dat2,cluster=j3_names))
Otro gráfico interesante es el siguiente:
scatterplot(dat2$pp,dat2$abstencion,
groups = j3_names,
regLine = F, smooth = F,
ellipse = T,
col=c("pink1","darkseagreen1","skyblue1"), cex = 1.2)
Aquí se puede observar que hay tres regiones bien delimitadas para cada grupo con dos variables que he escogido (votos al PP y abstenciones) por tener las medias más altas en porcentaje de votos.
Los puntos azules son los que corresponen al cluster e los barrios con rentas altas y al estar a la derecha significa que votan más al PP y al estar abajo que tiene pocas abstenciones.
Los puntos verdes son los del cluster de los barrios con rentas bajas y al posicionarse en el gráfico arriba a la izquierda quiere decir que tienen más abstenciones frente a votos al PP.
Finalmente los puntos rojos, los del cluster de los barrios con rentas medias se situan en el gráfico en una zona media.
El solapamiento que puede haber entre los grupos no es importante, ya que en este gráfico tan solo están representadas dos variables y existen más que ayudan a diferenciar entre los tres grupos.
Realiza el análisis cluster utilizando el método kmeans. Haz tres clusters (utiliza nstart=25). Se recomienda utilizar una semilla para inicializar el proceso de cálculo de manera que se puedan repetir las resultados. Proporciona el número de observaciones en cada cluster.
Ahora vamos a realizar el análisis cluster pero con el método de k-means. Con este método nos surgen dos problemas, el primero la selección de los centroides iniciales, que en este caso serán aleatorios y fijaremos una semilla para que se puedan repetir los resultados.
Otro problema es la elección del número de k grupos, para ello utilizaremos el siguiente gráfico de sedimentación.
set.seed(123)
fviz_nbclust(dat2, kmeans, method = "wss")
En dicho gráfico podemos observar que se forma un codo en k=3 ó k=4. En este apartado realiaremos el análisis con k=3 y posteriormente realizaremos el análisis con k=4 y k=5.
k3 =kmeans(dat2,centers =3,nstart =25)
k3
## K-means clustering with 3 clusters of sizes 45, 48, 38
##
## Cluster means:
## pp psoe cs vox masmadrid podemos otros abstencion
## 1 24.05111 13.680000 1.904444 5.060000 14.702222 7.077778 1.5066667 32.02889
## 2 34.03958 12.362500 3.189583 6.091667 15.239583 5.729167 1.4125000 21.92083
## 3 51.12895 7.910526 3.552632 8.557895 8.234211 2.631579 0.9473684 17.04737
##
## Clustering vector:
## Palacio Embajadores Cortes
## 2 1 2
## Justicia Universidad Sol
## 2 1 1
## Imperial Acacias Chopera
## 2 2 2
## Legazpi Delicias Palos de Moguer
## 2 2 2
## Atocha Pacifico Adelfas
## 2 2 2
## Estrella Ibiza Jeronimos
## 3 3 3
## Nino Jesus Recoletos Goya
## 3 3 3
## Fuente del Berro Guindalera Lista
## 2 3 3
## Castellana El Viso Prosperidad
## 3 3 3
## Ciudad Jardin Hispanoamerica Nueva Espana
## 2 3 3
## Castilla Bellas Vistas Cuatro Caminos
## 3 1 3
## Castillejos Almenara Valdeacederas
## 3 1 1
## Berruguete Gaztambide Arapiles
## 1 3 2
## Trafalgar Almagro Rios Rosas
## 2 3 3
## Vallehermoso El Pardo Fuentelarreina
## 3 2 3
## Pena Grande El Pilar La Paz
## 2 2 3
## Valverde Mirasierra El Goloso
## 2 3 3
## Casa de Campo Arguelles Ciudad Universitaria
## 2 3 3
## Valdezarza Valdemarin El Plantio
## 2 3 3
## Aravaca Los Carmenes Puerta del Angel
## 3 1 1
## Lucero Aluche Campamento
## 1 2 2
## Cuatro Vientos Las Aguilas Comillas
## 2 2 1
## Opanel San Isidro Vista Alegre
## 1 1 1
## Puerta Bonita Buenavista Abrantes
## 1 2 1
## Orcasitas Orcasur San Fermin
## 1 1 1
## Almendrales Moscardo Zofio
## 1 1 1
## Pradolongo Entrevias San Diego
## 1 1 1
## Palomeras Bajas Palomeras Sureste Portazgo
## 1 1 1
## Numancia Pavones Horcajo
## 1 1 2
## Marroquina Media Legua Fontarron
## 2 2 1
## Vinateros Ventas Pueblo Nuevo
## 2 1 1
## Quintana Concepcion San Pascual
## 2 2 2
## San Juan Bautista Colina Atalaya
## 3 3 3
## Costillares Palomas Piovera
## 3 3 3
## Canillas Pinar del Rey Apostol Santiago
## 2 2 2
## Valdefuentes San Andres San Cristobal
## 3 1 1
## Butarque Los Rosales Los Angeles
## 1 1 1
## VallecasCH Santa Eugenia VallecasEnsanch
## 1 2 2
## VicalvaroCH Ambroz Valderrivas
## 1 2 2
## Canaveral Simancas Hellin
## 2 1 1
## Amposta Arcos Rosas
## 1 1 2
## Rejas Canillejas El Salvador
## 2 2 2
## Alameda de Osuna Aeropuerto BarajasCH
## 3 1 2
## Timon Corralejos
## 2 3
##
## Within cluster sum of squares by cluster:
## [1] 2170.760 2001.534 2189.758
## (between_SS / total_SS = 78.3 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
k3$size #numero de observaciones para cada grupo
## [1] 45 48 38
Con este método el cluster 1 tendría 45 barrios, el cluster 2 tendría 48 barrios y el cluster 3 38 barrios. Más adelante denominaremos cada cluster según las rentas de los barrios como hicimos con los resultados del método jerárquico.
Repite los pasos del apartado 4 y describe la solución obtenida de kmeans. Compara los resultados de los dos métodos: hclust y kmeans.
Las medias para cada cluster serían:
mk3=k3$centers #medias
print(mk3,digits=4)
## pp psoe cs vox masmadrid podemos otros abstencion
## 1 24.05 13.680 1.904 5.060 14.702 7.078 1.5067 32.03
## 2 34.04 12.362 3.190 6.092 15.240 5.729 1.4125 21.92
## 3 51.13 7.911 3.553 8.558 8.234 2.632 0.9474 17.05
A la hora de asignar nombres en este caso el cluster 1 serían los barrios de rentas bajas, el cluster 2 los barrios de clase media y el cluster 3 los barrios de clase alta. (Para diferenciarlos de los grupos obtenidos en el análisis jerárquico, los del k-means los hemos designado con la letra “k” al final).
k3_names = factor(k3$cluster, labels = c("Bajo_k","Medio_k","Alto_k"))
boxplot(dat2$pp~k3_names,col=c("khaki1","paleturquoise2","palevioletred1"),horizontal =T,xlab = "Votos al PP",
ylab = "Grupos")
Los gráficos box-plot del método k-means salen similares a los del método jerárquico. En el caso de votos al PP, el cluster que presenta una media de votos más alta es el de los barrios de clase alta. Estos barrios son:
(sel = which(k3_names =="Alto_k"))
## [1] 16 17 18 19 20 21 23 24 25 26 27 29 30 31 33 34 38 41 42
## [20] 43 45 48 50 51 53 54 56 57 58 97 98 99 100 101 102 106 127 131
dat[sel,"barrio"]
## [1] "Estrella" "Ibiza" "Jeronimos"
## [4] "Nino Jesus" "Recoletos" "Goya"
## [7] "Guindalera" "Lista" "Castellana"
## [10] "El Viso" "Prosperidad" "Hispanoamerica"
## [13] "Nueva Espana" "Castilla" "Cuatro Caminos"
## [16] "Castillejos" "Gaztambide" "Almagro"
## [19] "Rios Rosas" "Vallehermoso" "Fuentelarreina"
## [22] "La Paz" "Mirasierra" "El Goloso"
## [25] "Arguelles" "Ciudad Universitaria" "Valdemarin"
## [28] "El Plantio" "Aravaca" "San Juan Bautista"
## [31] "Colina" "Atalaya" "Costillares"
## [34] "Palomas" "Piovera" "Valdefuentes"
## [37] "Alameda de Osuna" "Corralejos"
boxplot(dat2$psoe~k3_names,col=c("khaki1","paleturquoise2","palevioletred1"),horizontal =T,xlab = "Votos al PSOE",
ylab = "Grupos")
boxplot(dat2$abstencion~k3_names,col=c("khaki1","paleturquoise2","palevioletred1"),horizontal =T,xlab = "Abstención",
ylab = "Grupos")
Por el contrario en el caso del PSOE los barrios que más le votan son los del cluster 1 (los barrios de rentas bajas). Al igual que las abstenciones que la media más alta también la tiene el cluster de los barrios de clase baja.
Si utilizamos la función fviz_cluster para visualizar los clusters el gráfico sería:
fviz_cluster(k3, dat2, ellipse.type = "convex", palette = "rainbow_hcl")
Para comparar los resultados obtenidos con el método jerárquico y el k-means vamos a realizar una tabla para visualizar cuantos barrios se clasifican en el mismo cluster y cuantos se clasificarían en otro.
j3_names = relevel(j3_names,ref="Alto_j")
table(Grupos_J=j3_names,Grupos_K=k3_names)
## Grupos_K
## Grupos_J Bajo_k Medio_k Alto_k
## Alto_j 0 0 27
## Medio_j 4 45 11
## Bajo_j 41 3 0
En la tabla podemos comparar las diferencias de los resultados obtenidos con el método jerárquico y el método k-means. Por un lado, de los 27 barrios que el método jerárquico clasificaba como los de las rentas altas con el método k-means también los clasifica como barrios de renta alta. En el caso de los 44 barrios de renta baja que clasificaba el método jerárquico, el método k-means coincide con 41, pero hay 3 barrios que los clasifica en los de renta media, los cuales son:
(sel1 = which(k3_names =="Medio_k" & j3_names == "Bajo_j"))
## [1] 94 125 129
dat[sel1,"barrio"]
## [1] "Quintana" "Canillejas" "BarajasCH"
Lo cual es esperable ya que estos barrios podrían ser considerados de renta baja o de renta media.
En el caso de los barrios que el método jerárquico clasifica como de renta media hay un poco más de discrepancia. De los 60 barrios que el método jerárquico clasifica en renta media, el método k-means coincide en 45. Sin embargo hay 4 barrios que clasifica como de reta baja, los cuales son:
(sel2 = which(k3_names =="Bajo_k" & j3_names == "Medio_j"))
## [1] 5 86 109 111
dat[sel2,"barrio"]
## [1] "Universidad" "Pavones" "Butarque" "Los Angeles"
Y hay otros 11 barrios que el método k-means los clasificaría como renta alta, los cuales son:
(sel3 = which(k3_names =="Alto_k" & j3_names == "Medio_j"))
## [1] 17 23 27 33 38 42 48 53 97 98 127
dat[sel3,"barrio"]
## [1] "Ibiza" "Guindalera" "Prosperidad"
## [4] "Cuatro Caminos" "Gaztambide" "Rios Rosas"
## [7] "La Paz" "Arguelles" "San Juan Bautista"
## [10] "Colina" "Alameda de Osuna"
Obten la solución de kmeans con 3, 4 y 5 grupos. Representa las tres soluciones utilizando la función fviz_clsuter() e interpreta los resultados.
La solución para k=3 sería la que se ha obtenido en el apartado 5 y 6
#k3 =kmeans(dat2,centers =3,nstart =25)
#k3
#la solución para k=3 ya se ha realizado en los apartados 5 y 6
k4 =kmeans(dat2,centers =4,nstart =25)
k4
## K-means clustering with 4 clusters of sizes 27, 50, 31, 23
##
## Cluster means:
## pp psoe cs vox masmadrid podemos otros abstencion
## 1 42.73333 10.381481 3.514815 7.285185 11.559259 3.966667 1.170370 19.38519
## 2 31.05000 12.840000 2.906000 5.654000 15.820000 6.286000 1.428000 24.01000
## 3 22.25161 13.967742 1.703226 4.935484 14.538710 7.270968 1.564516 33.77742
## 4 54.91304 6.708696 3.513043 9.256522 6.617391 2.030435 0.873913 16.10000
##
## Clustering vector:
## Palacio Embajadores Cortes
## 2 3 2
## Justicia Universidad Sol
## 2 2 2
## Imperial Acacias Chopera
## 2 2 2
## Legazpi Delicias Palos de Moguer
## 2 2 2
## Atocha Pacifico Adelfas
## 2 1 1
## Estrella Ibiza Jeronimos
## 1 1 1
## Nino Jesus Recoletos Goya
## 4 4 4
## Fuente del Berro Guindalera Lista
## 1 1 4
## Castellana El Viso Prosperidad
## 4 4 1
## Ciudad Jardin Hispanoamerica Nueva Espana
## 1 4 4
## Castilla Bellas Vistas Cuatro Caminos
## 4 2 1
## Castillejos Almenara Valdeacederas
## 1 2 3
## Berruguete Gaztambide Arapiles
## 3 1 1
## Trafalgar Almagro Rios Rosas
## 1 4 1
## Vallehermoso El Pardo Fuentelarreina
## 4 1 4
## Pena Grande El Pilar La Paz
## 1 2 1
## Valverde Mirasierra El Goloso
## 1 4 4
## Casa de Campo Arguelles Ciudad Universitaria
## 2 1 1
## Valdezarza Valdemarin El Plantio
## 2 4 4
## Aravaca Los Carmenes Puerta del Angel
## 4 2 3
## Lucero Aluche Campamento
## 2 2 1
## Cuatro Vientos Las Aguilas Comillas
## 2 2 2
## Opanel San Isidro Vista Alegre
## 2 3 3
## Puerta Bonita Buenavista Abrantes
## 3 2 3
## Orcasitas Orcasur San Fermin
## 3 3 3
## Almendrales Moscardo Zofio
## 3 3 3
## Pradolongo Entrevias San Diego
## 3 3 3
## Palomeras Bajas Palomeras Sureste Portazgo
## 3 3 3
## Numancia Pavones Horcajo
## 3 2 2
## Marroquina Media Legua Fontarron
## 2 2 3
## Vinateros Ventas Pueblo Nuevo
## 2 2 2
## Quintana Concepcion San Pascual
## 2 2 1
## San Juan Bautista Colina Atalaya
## 1 1 4
## Costillares Palomas Piovera
## 4 4 4
## Canillas Pinar del Rey Apostol Santiago
## 2 2 2
## Valdefuentes San Andres San Cristobal
## 4 3 3
## Butarque Los Rosales Los Angeles
## 2 3 2
## VallecasCH Santa Eugenia VallecasEnsanch
## 3 2 2
## VicalvaroCH Ambroz Valderrivas
## 3 2 2
## Canaveral Simancas Hellin
## 2 2 3
## Amposta Arcos Rosas
## 3 3 2
## Rejas Canillejas El Salvador
## 2 2 1
## Alameda de Osuna Aeropuerto BarajasCH
## 1 3 2
## Timon Corralejos
## 2 4
##
## Within cluster sum of squares by cluster:
## [1] 655.2844 1857.5234 1335.4484 844.2130
## (between_SS / total_SS = 84.0 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
k5 =kmeans(dat2,centers =5,nstart =25)
k5
## K-means clustering with 5 clusters of sizes 27, 24, 31, 37, 12
##
## Cluster means:
## pp psoe cs vox masmadrid podemos otros abstencion
## 1 47.54444 8.977778 3.662963 8.000000 9.688889 3.159259 1.055556 17.92222
## 2 20.91250 14.291667 1.604167 4.870833 14.675000 7.525000 1.595833 34.54167
## 3 35.95161 12.054839 3.570968 6.174194 15.000000 5.332258 1.367742 20.53226
## 4 28.62432 13.075676 2.381081 5.394595 15.359459 6.608108 1.451351 27.10541
## 5 58.32500 5.558333 3.133333 10.116667 4.908333 1.483333 0.725000 15.75000
##
## Clustering vector:
## Palacio Embajadores Cortes
## 4 2 4
## Justicia Universidad Sol
## 3 4 4
## Imperial Acacias Chopera
## 3 3 4
## Legazpi Delicias Palos de Moguer
## 3 3 4
## Atocha Pacifico Adelfas
## 3 3 3
## Estrella Ibiza Jeronimos
## 1 1 1
## Nino Jesus Recoletos Goya
## 1 5 1
## Fuente del Berro Guindalera Lista
## 3 1 1
## Castellana El Viso Prosperidad
## 5 5 1
## Ciudad Jardin Hispanoamerica Nueva Espana
## 3 5 5
## Castilla Bellas Vistas Cuatro Caminos
## 1 4 1
## Castillejos Almenara Valdeacederas
## 1 4 4
## Berruguete Gaztambide Arapiles
## 4 1 3
## Trafalgar Almagro Rios Rosas
## 3 5 1
## Vallehermoso El Pardo Fuentelarreina
## 1 1 5
## Pena Grande El Pilar La Paz
## 3 3 1
## Valverde Mirasierra El Goloso
## 3 1 1
## Casa de Campo Arguelles Ciudad Universitaria
## 3 1 1
## Valdezarza Valdemarin El Plantio
## 3 5 5
## Aravaca Los Carmenes Puerta del Angel
## 1 4 4
## Lucero Aluche Campamento
## 4 4 3
## Cuatro Vientos Las Aguilas Comillas
## 4 4 4
## Opanel San Isidro Vista Alegre
## 4 2 4
## Puerta Bonita Buenavista Abrantes
## 2 4 4
## Orcasitas Orcasur San Fermin
## 2 2 2
## Almendrales Moscardo Zofio
## 2 2 2
## Pradolongo Entrevias San Diego
## 2 2 2
## Palomeras Bajas Palomeras Sureste Portazgo
## 2 2 2
## Numancia Pavones Horcajo
## 2 4 3
## Marroquina Media Legua Fontarron
## 3 3 4
## Vinateros Ventas Pueblo Nuevo
## 4 4 4
## Quintana Concepcion San Pascual
## 4 3 3
## San Juan Bautista Colina Atalaya
## 1 1 1
## Costillares Palomas Piovera
## 5 5 5
## Canillas Pinar del Rey Apostol Santiago
## 3 4 3
## Valdefuentes San Andres San Cristobal
## 1 2 2
## Butarque Los Rosales Los Angeles
## 4 2 4
## VallecasCH Santa Eugenia VallecasEnsanch
## 2 4 4
## VicalvaroCH Ambroz Valderrivas
## 2 4 3
## Canaveral Simancas Hellin
## 3 4 2
## Amposta Arcos Rosas
## 2 4 3
## Rejas Canillejas El Salvador
## 3 4 3
## Alameda de Osuna Aeropuerto BarajasCH
## 1 2 4
## Timon Corralejos
## 3 1
##
## Within cluster sum of squares by cluster:
## [1] 724.1015 1028.3017 868.3206 896.7400 297.3333
## (between_SS / total_SS = 87.0 %)
##
## Available components:
##
## [1] "cluster" "centers" "totss" "withinss" "tot.withinss"
## [6] "betweenss" "size" "iter" "ifault"
#fviz_cluster(k3, dat2, ellipse.type = "convex", palette = "rainbow_hcl")
#Este gráfico ya se ha realizado en el apartado 6
fviz_cluster(k4, dat2, ellipse.type = "convex", palette = "rainbow_hcl")
fviz_cluster(k5, dat2, ellipse.type = "convex", palette = "rainbow_hcl")
Los barrios que pertenecen a cada cluster según el análisis k-means con k=4 serían:
(sel41 = which(k4$cluster ==1))
## Pacifico Adelfas Estrella
## 14 15 16
## Ibiza Jeronimos Fuente del Berro
## 17 18 22
## Guindalera Prosperidad Ciudad Jardin
## 23 27 28
## Cuatro Caminos Castillejos Gaztambide
## 33 34 38
## Arapiles Trafalgar Rios Rosas
## 39 40 42
## El Pardo Pena Grande La Paz
## 44 46 48
## Valverde Arguelles Ciudad Universitaria
## 49 53 54
## Campamento San Pascual San Juan Bautista
## 63 96 97
## Colina El Salvador Alameda de Osuna
## 98 126 127
(sel42 = which(k4$cluster ==2))
## Palacio Cortes Justicia Universidad
## 1 3 4 5
## Sol Imperial Acacias Chopera
## 6 7 8 9
## Legazpi Delicias Palos de Moguer Atocha
## 10 11 12 13
## Bellas Vistas Almenara El Pilar Casa de Campo
## 32 35 47 52
## Valdezarza Los Carmenes Lucero Aluche
## 55 59 61 62
## Cuatro Vientos Las Aguilas Comillas Opanel
## 64 65 66 67
## Buenavista Pavones Horcajo Marroquina
## 71 86 87 88
## Media Legua Vinateros Ventas Pueblo Nuevo
## 89 91 92 93
## Quintana Concepcion Canillas Pinar del Rey
## 94 95 103 104
## Apostol Santiago Butarque Los Angeles Santa Eugenia
## 105 109 111 113
## VallecasEnsanch Ambroz Valderrivas Canaveral
## 114 116 117 118
## Simancas Rosas Rejas Canillejas
## 119 123 124 125
## BarajasCH Timon
## 129 130
(sel43 = which(k4$cluster ==3))
## Embajadores Valdeacederas Berruguete Puerta del Angel
## 2 36 37 60
## San Isidro Vista Alegre Puerta Bonita Abrantes
## 68 69 70 72
## Orcasitas Orcasur San Fermin Almendrales
## 73 74 75 76
## Moscardo Zofio Pradolongo Entrevias
## 77 78 79 80
## San Diego Palomeras Bajas Palomeras Sureste Portazgo
## 81 82 83 84
## Numancia Fontarron San Andres San Cristobal
## 85 90 107 108
## Los Rosales VallecasCH VicalvaroCH Hellin
## 110 112 115 120
## Amposta Arcos Aeropuerto
## 121 122 128
(sel44 = which(k4$cluster ==4))
## Nino Jesus Recoletos Goya Lista Castellana
## 19 20 21 24 25
## El Viso Hispanoamerica Nueva Espana Castilla Almagro
## 26 29 30 31 41
## Vallehermoso Fuentelarreina Mirasierra El Goloso Valdemarin
## 43 45 50 51 56
## El Plantio Aravaca Atalaya Costillares Palomas
## 57 58 99 100 101
## Piovera Valdefuentes Corralejos
## 102 106 131
Se puede ver que dentro de cada grupo los barrios tienen rentas similares (más adelante en el apartado 8 haremos un plot del mapa de madrid donde se observa que geográficamente están en la misma zona).
Los barrios que pertenecen a cada cluster según el análisis k-means con k=5 serían:
(sel51 = which(k5$cluster ==1))
## Estrella Ibiza Jeronimos
## 16 17 18
## Nino Jesus Goya Guindalera
## 19 21 23
## Lista Prosperidad Castilla
## 24 27 31
## Cuatro Caminos Castillejos Gaztambide
## 33 34 38
## Rios Rosas Vallehermoso El Pardo
## 42 43 44
## La Paz Mirasierra El Goloso
## 48 50 51
## Arguelles Ciudad Universitaria Aravaca
## 53 54 58
## San Juan Bautista Colina Atalaya
## 97 98 99
## Valdefuentes Alameda de Osuna Corralejos
## 106 127 131
(sel52 = which(k5$cluster ==2))
## Embajadores San Isidro Puerta Bonita Orcasitas
## 2 68 70 73
## Orcasur San Fermin Almendrales Moscardo
## 74 75 76 77
## Zofio Pradolongo Entrevias San Diego
## 78 79 80 81
## Palomeras Bajas Palomeras Sureste Portazgo Numancia
## 82 83 84 85
## San Andres San Cristobal Los Rosales VallecasCH
## 107 108 110 112
## VicalvaroCH Hellin Amposta Aeropuerto
## 115 120 121 128
(sel53 = which(k5$cluster ==3))
## Justicia Imperial Acacias Legazpi
## 4 7 8 10
## Delicias Atocha Pacifico Adelfas
## 11 13 14 15
## Fuente del Berro Ciudad Jardin Arapiles Trafalgar
## 22 28 39 40
## Pena Grande El Pilar Valverde Casa de Campo
## 46 47 49 52
## Valdezarza Campamento Horcajo Marroquina
## 55 63 87 88
## Media Legua Concepcion San Pascual Canillas
## 89 95 96 103
## Apostol Santiago Valderrivas Canaveral Rosas
## 105 117 118 123
## Rejas El Salvador Timon
## 124 126 130
(sel54 = which(k5$cluster ==4))
## Palacio Cortes Universidad Sol
## 1 3 5 6
## Chopera Palos de Moguer Bellas Vistas Almenara
## 9 12 32 35
## Valdeacederas Berruguete Los Carmenes Puerta del Angel
## 36 37 59 60
## Lucero Aluche Cuatro Vientos Las Aguilas
## 61 62 64 65
## Comillas Opanel Vista Alegre Buenavista
## 66 67 69 71
## Abrantes Pavones Fontarron Vinateros
## 72 86 90 91
## Ventas Pueblo Nuevo Quintana Pinar del Rey
## 92 93 94 104
## Butarque Los Angeles Santa Eugenia VallecasEnsanch
## 109 111 113 114
## Ambroz Simancas Arcos Canillejas
## 116 119 122 125
## BarajasCH
## 129
(sel55 = which(k5$cluster ==5))
## Recoletos Castellana El Viso Hispanoamerica Nueva Espana
## 20 25 26 29 30
## Almagro Fuentelarreina Valdemarin El Plantio Costillares
## 41 45 56 57 100
## Palomas Piovera
## 101 102
También dentro de cada grupo se ve que los barrios tienen rentas similares.
Resume brevemente las conclusiones del análisis cluster realizado en los apartados anteriores. Completa el análisis con aquello que te parezca interesante.
Aplicando los dos métodos de análisis cluster (jerárquico y k-means) se obtienen soluciones parecidas con muy pocas variaciones. Hay 11 barrios que el método k-means clasifica como de renta alta, pero el método jerárquico los clasifica como renta media, no obstante, son barrios que podrían considerarse de renta media-alta.
De los cuatro barrios que el método jerárquico clasifica como renta media y el k-means como renta baja, pasa similar, pero en este caso se considerarían barrios de clase media-baja; y los tres barrios que el método jerárquico clasifica como renta baja y el k-means como renta media también serían de clase media-baja.
Solo habría que preocuparse si uno de los métodos clasificase un barrio como clase alta y el otro método lo clasificase como clase baja. Pero esto no ocurre.
Para finalizar me gustaría hacer un plot del mapa de los barrios de Madrid coloreados según el cluster al cual pertenece cada barrio pues con la función fviz_cluster no se aprecia donde se sitúan geográficamente cada barrio y creo que sería interesante puesto que los barrios con rentas similares suelen estar lindantes unos de otros y se aprecia claramente la diagonal de la desigualdad de Madrid.
library(sp)
library(rgeos)
## rgeos version: 0.5-8, (SVN revision 679)
## GEOS runtime version: 3.9.1-CAPI-1.14.2
## Please note that rgeos will be retired by the end of 2023,
## plan transition to sf functions using GEOS at your earliest convenience.
## GEOS using OverlayNG
## Linking to sp version: 1.4-5
## Polygon checking: TRUE
library(maptools)
## Checking rgeos availability: TRUE
## Please note that 'maptools' will be retired by the end of 2023,
## plan transition at your earliest convenience;
## some functionality will be moved to 'sp'.
getinfo.shape("200001882.shp") #hemos cargado el archivo shape con el mapa de los barrios
## Shapefile type: Polygon, (5), # of Shapes: 131
barriosMadrid <- readShapePoly("200001882.shp")
## Warning: readShapePoly is deprecated; use rgdal::readOGR or sf::st_read
str(barriosMadrid, max.level = 2)
## Formal class 'SpatialPolygonsDataFrame' [package "sp"] with 5 slots
## ..@ data :'data.frame': 131 obs. of 3 variables:
## .. ..- attr(*, "data_types")= chr [1:3] "N" "C" "C"
## ..@ polygons :List of 131
## ..@ plotOrder : int [1:131] 44 112 51 115 128 52 106 130 54 118 ...
## ..@ bbox : num [1:2, 1:2] 424754 4462566 456033 4499365
## .. ..- attr(*, "dimnames")=List of 2
## ..@ proj4string:Formal class 'CRS' [package "sp"] with 1 slot
## ..$ comment: chr "FALSE"
barriosMadrid@bbox
## min max
## x 424753.5 456033.3
## y 4462566.0 4499365.4
barriosMadrid$DESBDT <- iconv(barriosMadrid$DESBDT, "latin1", "UTF-8")
barriosNamesCodes <- strsplit(sub(" ", "\\.", barriosMadrid$DESBDT), "\\.")
barriosNamesCodes <- do.call(rbind, barriosNamesCodes)
barriosMadrid$BarrioCod <- barriosNamesCodes[, 1]
barriosMadrid$Barrio <- barriosNamesCodes[, 2]
barriosCluster=cbind(barriosNamesCodes,j3,k3$cluster,k4$cluster,k5$cluster) #tabla con los barrios de madrid y en que cluster se clasifican según el analísis jerárquico y k-means para k=3, k=4 y k=5
plot(barriosMadrid, col = j3)
Mapa de los barrios de Madrid según el análisis jerárquico. En verde los barrios de rentas altas, en negro los de ingresos medios y en rosa de renta baja.
En el mapa según la clasificación por el método jerárquico los barrios de clase baja (en rosa) se encuentran en sureste, mientras que los de clase alta (verde) están más hacia el norte, y los barrios de clase media (negro) están más o menos dispersos por el territorio.
plot(barriosMadrid, col = k3$cluster)
Mapa de los barrios de Madrid según el análisis k-means con k=3 En verde los barrios con rentas altas, en rosa los barrios con ingresos medios y en negro los barrios de clase baja.
En el mapa según la clasificación por el método k-means con k=3 los barrios de clase baja (negro) también se encuentran al sureste. Sin embargo, con este método tanto los barrios de clase alta (verde) como los de clase media (rosa) están mayoritariamente por encima de la diagonal de desigualdad, y dentro de esa partición los de clase alta están en el centro mientras que los de clase media en la periferia.
plot(barriosMadrid, col = k4$cluster)
Mapa de los barrios de Madrid según el análisis k-means con k=4 En negro los barrios clasificados en el cluster 1, en rosa los barrios clasificados en el cluster 2, en verde los barrios clasificados en el cluster 3 y en azul oscuro los barrios clasificados en el cluster 4.
En este mapa se puede observar que los barrios del cluster 1 (negro) y el cluster 4 (azul) se encuentran mayoritariamente al noreste. Los grupos del cluster 2 (rosa) estarían más o menos sobre la diagonal de desigualdad y los barrios del cluster 3 (verde) estarían más hacia el sur (excepto el barrio de Aeropuerto y otros dos atípicos que están en el centro).
plot(barriosMadrid, col = k5$cluster)
Mapa de los barrios de Madrid según el análisis k-means con k=5 En negro los barrios clasificados en el cluster 1, en rosa los barrios clasificados en el cluster 2, en verde los barrios clasificados en el cluster 3, en azul oscuro los barrios clasificados en el cluster 4 y en azul cyan los barrios clasificados en el cluster 5.
En este mapa los barrios del cluster 1 (negro) se encontrarían por encima de la diagonal de desigualdad. Los del cluster 2 (rosa) se hallarían más o menos por debajo de la diagonal. Mientras que los clusters 3 (verde), 4 (azul oscuro) y 5 (cyan) se encontrarían sobre la diagonal, aunque los del cluster 5 estarán más céntricos, y los clusters 3 y 4 más periféricos.