Agrupar datos y construir intervalos desde los datos son dos conceptos que se encuntran relacionados. En lo que respecta al primero, lo que hacemos es transformar una variable numérica en una categórica, asignando cortes a los datos. Es un intercambio, en el sentido que perdemos precisión y ganamos “claridad” al momento de presentar la información.
A lo largo del curso ya hemos visto formas de agrupar nuestros datos, principalmente utilizando la función ifelse. Utilicemos la base de datos del artículo “Pavimentando con Votos” para ejemplificar diferentes formas de agrupar nuestros datos:
#Cargamos la data desde Github:
library(rio)
data = import("https://github.com/PoliticayGobiernoPUCP/estadistica_anapol2/blob/master/DATA/pavimentando%20con%20votos.sav?raw=true")
Hagamos algunos cortes a la data “data” con el porcentaje de votos de la oposición (pctopo) de la base de datos:
#Veamos cómo está formateada:
str(data$pctopo)
## num [1:1096] 14.82 14.51 15.08 6.15 47.31 ...
## - attr(*, "label")= chr "Porcentaje de votos de la Oposición"
## - attr(*, "format.spss")= chr "F5.2"
hist(data$pctopo)
Empecemos diferenciando aquellos Municipios en los que la oposición obtuvo más de la mitad del % total de los votos. La forma clásica de hacerlo es utilizando ifelse con lenguaje base:
data$cortes_pctopo = factor(ifelse(data$pctopo>50,1,0))
data$cortes_pctopo = factor(data$cortes_pctopo, levels = c(0:1), labels = c("La mitad o menos","Más de la mitad")) #Asignando nombres a las categorías
table(data$cortes_pctopo)
##
## La mitad o menos Más de la mitad
## 861 228
barplot(table(data$cortes_pctopo))
También hemos visto maneras de implementar la función ifelse a la librería dplyr y la función mutate para crear una variable nueva:
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
data = mutate(data, cortes_pctopo_2 = ifelse(pctopo>50,1,0))
data$cortes_pctopo_2 = factor(data$cortes_pctopo_2, levels = c(0:1), labels = c("La mitad o menos","Más de la mitad"))
table(data$cortes_pctopo_2)
##
## La mitad o menos Más de la mitad
## 861 228
Ahora, al agrupar nuestra data, podemos crear diferentes condicionales para realizar el agrupamiento. Por ejemplo, qué sucede si queremos crear grupos para dividir la data entre los Municipios tomando en cuenta el % de votos de la oposición y si es que había o no prioridad técnica (priorizado):
data$cat_dob = ifelse(data$pctopo > 50 & data$priorizado == 1, 1, #Ojo que son dos condiciones, por eso el &
ifelse(data$pctopo > 50 & data$priorizado == 0,2,
ifelse(data$pctopo <= 50 & data$priorizado == 1,3,
ifelse(data$pctopo <= 50 & data$priorizado == 0,4,0))))
data$cat_dob = factor(data$cat_dob, levels = c(1:4), labels = c("Más del 50% y priorizado",
"Más del 50% y no priorizado",
"La mitad o menos y priorizado",
"La mitad o menos y no priorizado"))
table(data$cat_dob)
##
## Más del 50% y priorizado Más del 50% y no priorizado
## 53 175
## La mitad o menos y priorizado La mitad o menos y no priorizado
## 219 642
barplot(table(data$cat_dob))
Podemos seguir agregando más y más condiciones si ya entendimos la lógica del código. Es bueno, además, darle una mirada a los operadores en R, que se utilizan mucho en los condicionales: https://www.datamentor.io/r-programming/operator/
Si bien hacer esto es relativamente “sencillo”, se puede volver más complejo cuando se asignan cortes más arbitrarios. ¿Qué es alto, medio, bajo y muy bajo? ¿Qué es muy bueno, bueno, malo y muy malo? Esto siempre puede ser contestado, ya que, si lo trasladamos al ámbito de las ciencias sociales, el aumento de una décima podría implicar el traslado de un país de un régimen híbrido a uno democrático. En suma, las consecuencias de esa decisión no son menores. Construir las categorías debe realizarse a partir de un buen balance entre la observación de los datos y la teoría.
En lo relaciondo a la construcción de intervalos, estos se elaboran a partir de los datos. Para elaborarlos, necesitamos conocer el valor mínimo y máximo teórico, y decidir dónde cortar el rango. En R, podemos utilizar la función cut, y asignarle un vector de cortes que incluya al menor y al mayor valor. Ahora trabajemos con la variable de necesidades básicas insatisfechas (nbi):
str(data$nbi)
## num [1:1096] 12.2 33.8 28.5 33.1 27.1 ...
## - attr(*, "label")= chr "Necesidades Básicas Insatisfechas"
## - attr(*, "format.spss")= chr "F5.2"
## - attr(*, "display_width")= int 7
summary(data$nbi)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 5.36 28.35 41.30 42.96 55.48 98.81 30
breaks_nbi = c(0,20,40,60,80,100)
labels_nbi = c("Muy insatisfechas","Insatisfechas","Medianamente satisfechas","Satisfechas","Altamente satisfechas")
data$int_nbi = cut(data$nbi,
breaks = breaks_nbi,
labels = labels_nbi,
oredered_result = T)
table(data$int_nbi)
##
## Muy insatisfechas Insatisfechas Medianamente satisfechas
## 108 401 345
## Satisfechas Altamente satisfechas
## 171 41
barplot(table(data$int_nbi))
Pero podríamos simplemente especificar los cortes y dejar que se asignen los casos en función a la distribución de los datos:
breaks_nbi = 5
labels_nbi = c("Muy insatisfechas","Insatisfechas","Medianamente satisfechas","Satisfechas","Altamente satisfechas")
data$int_nbi = cut(data$nbi,
breaks = breaks_nbi,
labels = labels_nbi,
oredered_result = T)
table(data$int_nbi)
##
## Muy insatisfechas Insatisfechas Medianamente satisfechas
## 178 382 313
## Satisfechas Altamente satisfechas
## 152 41
barplot(table(data$int_nbi))
Ahora, en estadística, hay varias formas de definir cuántos intervalos deben ser construidos siguiendo varias fórmulas: Sturges, Scott, Freedman-Diaconis, entre otras. Todas estas ya se encuentran incorporadas en R.
numBreaks=nclass.Sturges(na.omit(data$nbi))
#
# Otras fórmulas:
## nclass.scott( ) #Scott's
## nclass.FD( ) #Freedman-Diaconis
data$int_nbi = cut(data$nbi,
breaks = numBreaks,
oredered_result = T)
table(data$int_nbi)
##
## (5.27,13.1] (13.1,20.9] (20.9,28.7] (28.7,36.5] (36.5,44.3] (44.3,52.1]
## 31 87 155 161 157 154
## (52.1,59.9] (59.9,67.7] (67.7,75.4] (75.4,83.2] (83.2,91] (91,98.9]
## 108 98 56 31 19 9
barplot(table(data$int_nbi))
Muchas veces, la data con la que nos encontramos se encuentra bastante más desagregada de lo que en realidad necesitamos analizar. En esos casos, lo que nos interesa llevar a cabo es agregar los datos, de tal forma que trabajemos con un menor número de unidades de análisis. Veamos un ejemplo:
Carguemos una base de datos con los resultados de las EG 2016 en segunda vuelta a nivel distrital. La base, además, cuenta con variables como el índice de desarrollo humano, la población, el PBI per capita, entre otras:
data_idh = import("https://github.com/PoliticayGobiernoPUCP/estadistica_anapol2/raw/master/DATA/idh_elec.csv")
Hay diferentes formas de agregar datos, y va a depender mucho de los objetivos de nuestro análisis y la naturaleza de nuestras variables. Por ejemplo, ¿cómo podríamos proceder si quisieramos el IDH a nivel de provincias y no de distritos? Una forma de hacerlo es con la función tapply:
prov_idh = tapply(data_idh$idh, data_idh$prov, mean, na.rm = T)
prov_idh = as.data.frame(prov_idh)
prov_idh
## prov_idh
## ABANCAY 0.3108333
## ACOBAMBA 0.2498375
## ACOMAYO 0.2277000
## AIJA 0.2756200
## ALTO AMAZONAS 0.2279167
## AMBO 0.2811750
## ANDAHUAYLAS 0.2515737
## ANGARAES 0.2486833
## ANTA 0.3122778
## ANTABAMBA 0.2411000
## ANTONIO RAYMONDI 0.2279000
## AREQUIPA 0.5481103
## ASCOPE 0.4865750
## ASUNCION 0.2606000
## ATALAYA 0.2304500
## AYABACA 0.2078900
## AYMARAES 0.2547235
## AZANGARO 0.2438267
## BAGUA 0.3813500
## BARRANCA 0.5291800
## BELLAVISTA 0.3440500
## BOLIVAR 0.2069500
## BOLOGNESI 0.3493733
## BONGARA 0.2938833
## CAJABAMBA 0.2439000
## CAJAMARCA 0.2654000
## CAJATAMBO 0.3205800
## CALCA 0.2856250
## CALLAO 0.6461833
## CAMANA 0.5341250
## CANAS 0.2321125
## CANCHIS 0.3203000
## CANDARAVE 0.3567000
## CANETE 0.5262625
## CANGALLO 0.2233667
## CANTA 0.3855286
## CARABAYA 0.2577700
## CARAVELI 0.4900231
## CARHUAZ 0.2939091
## CARLOS FERMIN FITZCARRALD 0.2236667
## CASMA 0.4291250
## CASTILLA 0.3950857
## CASTROVIRREYNA 0.3104615
## CAYLLOMA 0.3699050
## CELENDIN 0.2087000
## CHACHAPOYAS 0.2882571
## CHANCHAMAYO 0.4362000
## CHEPEN 0.4237000
## CHICLAYO 0.4584300
## CHINCHA 0.4611455
## CHINCHEROS 0.2488375
## CHOTA 0.2509789
## CHUCUITO 0.3015857
## CHUMBIVILCAS 0.1966625
## CHUPACA 0.3893444
## CHURCAMPA 0.2712200
## CONCEPCION 0.3348600
## CONDESUYOS 0.4246000
## CONDORCANQUI 0.1733000
## CONTRALMIRANTE VILLAR 0.4891333
## CONTUMAZA 0.3113750
## CORONEL PORTILLO 0.3730714
## CORONGO 0.3082286
## COTABAMBAS 0.2151833
## CUSCO 0.5158750
## CUTERVO 0.2571933
## DANIEL A. CARRION 0.3189125
## DATEM DEL MARANON 0.2116000
## DOS DE MAYO 0.2587222
## EL COLLAO 0.2890800
## EL DORADO 0.2722400
## ESPINAR 0.3113625
## FERRENAFE 0.3141667
## GENERAL SANCHEZ CERRO 0.4660000
## GRAN CHIMU 0.2392000
## GRAU 0.2158929
## HUACAYBAMBA 0.2426000
## HUALGAYOC 0.2767333
## HUALLAGA 0.2954500
## HUAMALIES 0.2445909
## HUAMANGA 0.2812200
## HUANCA SANCOS 0.2671250
## HUANCABAMBA 0.2004625
## HUANCANE 0.2451875
## HUANCAVELICA 0.2655263
## HUANCAYO 0.3846929
## HUANTA 0.2519750
## HUANUCO 0.3139273
## HUARAL 0.4192000
## HUARAZ 0.3258667
## HUARI 0.2842375
## HUARMEY 0.3919600
## HUAROCHIRI 0.3483281
## HUAURA 0.4132333
## HUAYLAS 0.2739100
## HUAYTARA 0.3205188
## ICA 0.5255000
## ILO 0.7197667
## ISLAY 0.5402333
## JAEN 0.3069083
## JAUJA 0.3789912
## JORGE BASADRE 0.6211000
## JULCAN 0.1649000
## JUNIN 0.3685500
## LA CONVENCION 0.3474500
## LA MAR 0.2196125
## LA UNION 0.2443364
## LAMAS 0.2826727
## LAMBAYEQUE 0.3536583
## LAMPA 0.3197900
## LAURICOCHA 0.3379286
## LEONCIO PRADO 0.3215167
## LIMA 0.6592256
## LORETO 0.2727200
## LUCANAS 0.3190667
## LUYA 0.2862304
## MANU 0.4801500
## MARANON 0.2265333
## MARISCAL CACERES 0.3372400
## MARISCAL LUZURIAGA 0.2469875
## MARISCAL NIETO 0.5918500
## MARISCAL RAMON CASTILLA 0.2765750
## MAYNAS 0.3308154
## MELGAR 0.3098556
## MOHO 0.2391250
## MORROPON 0.3175700
## MOYOBAMBA 0.3580333
## NAZCA 0.5012600
## OCROS 0.3578500
## OTUZCO 0.1998400
## OXAPAMPA 0.3399286
## OYON 0.4184833
## PACASMAYO 0.4745600
## PACHITEA 0.2103750
## PADRE ABAD 0.3494333
## PAITA 0.4223000
## PALLASCA 0.2967364
## PALPA 0.4468800
## PARINACOCHAS 0.2670125
## PARURO 0.2081556
## PASCO 0.4207231
## PATAZ 0.2019846
## PAUCAR DEL SARA SARA 0.3096800
## PAUCARTAMBO 0.1838833
## PICOTA 0.3760900
## PISCO 0.4652625
## PIURA 0.3936556
## POMABAMBA 0.2281500
## PUERTO INCA 0.3034400
## PUNO 0.2905333
## PURUS 0.2862000
## QUISPICANCHI 0.2864167
## RECUAY 0.3170200
## REQUENA 0.2799909
## RIOJA 0.3459111
## RODRIGUEZ DE MENDOZA 0.2995083
## SAN ANTONIO DE PUTINA 0.3133800
## SAN IGNACIO 0.2842000
## SAN MARCOS 0.2304429
## SAN MARTIN 0.4095786
## SAN MIGUEL 0.2803923
## SAN PABLO 0.2254750
## SAN ROMAN 0.3611000
## SANCHEZ CARRION 0.1407625
## SANDIA 0.3057100
## SANTA 0.4530444
## SANTA CRUZ 0.2916091
## SANTIAGO DE CHUCO 0.2613375
## SATIPO 0.3127625
## SECHURA 0.4009833
## SIHUAS 0.2438800
## SUCRE 0.2866909
## SULLANA 0.4271875
## TACNA 0.5051900
## TAHUAMANU 0.5871000
## TALARA 0.4938333
## TAMBOPATA 0.5159750
## TARATA 0.3166000
## TARMA 0.3491778
## TAYACAJA 0.2617500
## TOCACHE 0.3971200
## TRUJILLO 0.4977818
## TUMBES 0.5041167
## UCAYALI 0.3150000
## URUBAMBA 0.4361429
## UTCUBAMBA 0.3395429
## VICTOR FAJARDO 0.2567167
## VILCAS HUAMAN 0.2181125
## VIRU 0.3770333
## YAROWILCA 0.2433250
## YAULI 0.5160400
## YAUYOS 0.3372727
## YUNGAY 0.2510375
## YUNGUYO 0.3044286
## ZARUMILLA 0.4245750
Y si lo queremos a nivel de regiones:
reg_idh = tapply(data_idh$idh, data_idh$depa, mean, na.rm = T)
reg_idh = as.data.frame(reg_idh)
reg_idh
## reg_idh
## AMAZONAS 0.2969310
## ANCASH 0.3064355
## APURIMAC 0.2487463
## AREQUIPA 0.4476486
## AYACUCHO 0.2730820
## CAJAMARCA 0.2649811
## CALLAO 0.6461833
## CUSCO 0.2985287
## HUANCAVELICA 0.2775787
## HUANUCO 0.2759408
## ICA 0.4858698
## JUNIN 0.3827691
## LA LIBERTAD 0.2993048
## LAMBAYEQUE 0.4025658
## LIMA 0.4590117
## LORETO 0.2819118
## MADRE DE DIOS 0.5223455
## MOQUEGUA 0.5418200
## PASCO 0.3714357
## PIURA 0.3459953
## PUNO 0.2867303
## SAN MARTIN 0.3472182
## TACNA 0.4291926
## TUMBES 0.4761846
## UCAYALI 0.3245200
Podemos hacerlo con dos variables a la vez: veamos promedios agregados de IDH y PBI per capita:
reg_idh = tapply(data_idh$idh, data_idh$depa, mean, na.rm = T)
reg_pbi = tapply(data_idh$percapitaf, data_idh$depa, mean, na.rm = T)
group = as.data.frame(cbind(reg_idh, reg_pbi)) #Cuidado cuando hay casos perdidos y usan cbind!!
group
## reg_idh reg_pbi
## AMAZONAS 0.2969310 381.8274
## ANCASH 0.3064355 313.9512
## APURIMAC 0.2487463 230.5375
## AREQUIPA 0.4476486 572.4587
## AYACUCHO 0.2730820 271.7333
## CAJAMARCA 0.2649811 278.7559
## CALLAO 0.6461833 1022.0667
## CUSCO 0.2985287 334.3417
## HUANCAVELICA 0.2775787 320.6266
## HUANUCO 0.2759408 314.8711
## ICA 0.4858698 580.4093
## JUNIN 0.3827691 416.9398
## LA LIBERTAD 0.2993048 320.5506
## LAMBAYEQUE 0.4025658 435.9605
## LIMA 0.4590117 613.1936
## LORETO 0.2819118 317.7608
## MADRE DE DIOS 0.5223455 930.2273
## MOQUEGUA 0.5418200 792.2850
## PASCO 0.3714357 391.0036
## PIURA 0.3459953 399.0453
## PUNO 0.2867303 255.0872
## SAN MARTIN 0.3472182 449.6195
## TACNA 0.4291926 508.4704
## TUMBES 0.4761846 620.5000
## UCAYALI 0.3245200 365.8733
Y con eso, ya podemos mirar nuestros datos a nivel regional. Repasemos Estadística 1:
plot(group$reg_idh, group$reg_pbi)
Hay, sin embargo, varias formas de agregar nuestros datos; más aún cuando lo hacemos sobre la media. Veamos la función aggregate:
aggregate(data_idh[,c(8)], by = list(data_idh[,4]), mean) #idh
## Group.1 x
## 1 AMAZONAS 0.2969310
## 2 ANCASH 0.3064355
## 3 APURIMAC 0.2487463
## 4 AREQUIPA 0.4476486
## 5 AYACUCHO 0.2730820
## 6 CAJAMARCA 0.2649811
## 7 CALLAO 0.6461833
## 8 CUSCO 0.2985287
## 9 HUANCAVELICA 0.2775787
## 10 HUANUCO 0.2759408
## 11 ICA 0.4858698
## 12 JUNIN 0.3827691
## 13 LA LIBERTAD 0.2993048
## 14 LAMBAYEQUE 0.4025658
## 15 LIMA 0.4590117
## 16 LORETO 0.2819118
## 17 MADRE DE DIOS 0.5223455
## 18 MOQUEGUA 0.5418200
## 19 PASCO 0.3714357
## 20 PIURA 0.3459953
## 21 PUNO 0.2867303
## 22 SAN MARTIN 0.3472182
## 23 TACNA 0.4291926
## 24 TUMBES 0.4761846
## 25 UCAYALI 0.3245200
aggregate(data_idh[,c(8,12)], by = list(data_idh[,4]), mean) #idh y pbi per capita
## Group.1 idh percapitaf
## 1 AMAZONAS 0.2969310 381.8274
## 2 ANCASH 0.3064355 313.9512
## 3 APURIMAC 0.2487463 230.5375
## 4 AREQUIPA 0.4476486 572.4587
## 5 AYACUCHO 0.2730820 271.7333
## 6 CAJAMARCA 0.2649811 278.7559
## 7 CALLAO 0.6461833 1022.0667
## 8 CUSCO 0.2985287 334.3417
## 9 HUANCAVELICA 0.2775787 320.6266
## 10 HUANUCO 0.2759408 314.8711
## 11 ICA 0.4858698 580.4093
## 12 JUNIN 0.3827691 416.9398
## 13 LA LIBERTAD 0.2993048 320.5506
## 14 LAMBAYEQUE 0.4025658 435.9605
## 15 LIMA 0.4590117 613.1936
## 16 LORETO 0.2819118 317.7608
## 17 MADRE DE DIOS 0.5223455 930.2273
## 18 MOQUEGUA 0.5418200 792.2850
## 19 PASCO 0.3714357 391.0036
## 20 PIURA 0.3459953 399.0453
## 21 PUNO 0.2867303 255.0872
## 22 SAN MARTIN 0.3472182 449.6195
## 23 TACNA 0.4291926 508.4704
## 24 TUMBES 0.4761846 620.5000
## 25 UCAYALI 0.3245200 365.8733
Lo mismo podemos hacer utilizando las funciones de dplyr:
data_idh %>%
group_by(depa) %>%
summarize(mean_idh = mean(idh, na.rm = TRUE))
## # A tibble: 25 x 2
## depa mean_idh
## <chr> <dbl>
## 1 AMAZONAS 0.297
## 2 ANCASH 0.306
## 3 APURIMAC 0.249
## 4 AREQUIPA 0.448
## 5 AYACUCHO 0.273
## 6 CAJAMARCA 0.265
## 7 CALLAO 0.646
## 8 CUSCO 0.299
## 9 HUANCAVELICA 0.278
## 10 HUANUCO 0.276
## # ... with 15 more rows
Y aquí podemos solicitar más medidas para agregar nuestra data:
data_idh %>%
group_by(depa) %>%
summarize(mean_idh = mean(idh, na.rm = TRUE), #media
min_idh_reg = min(idh, na.rm = TRUE), #idh mínimo de la región
max_idh_reg = max(idh, na.rm = TRUE), #idh máximo de la región
median_idh = median(idh, na.rm = TRUE)) #mediana
## # A tibble: 25 x 5
## depa mean_idh min_idh_reg max_idh_reg median_idh
## <chr> <dbl> <dbl> <dbl> <dbl>
## 1 AMAZONAS 0.297 0.149 0.547 0.295
## 2 ANCASH 0.306 0.115 0.607 0.300
## 3 APURIMAC 0.249 0.101 0.546 0.232
## 4 AREQUIPA 0.448 0.147 0.736 0.476
## 5 AYACUCHO 0.273 0.112 0.498 0.257
## 6 CAJAMARCA 0.265 0.124 0.534 0.259
## 7 CALLAO 0.646 0.532 0.764 0.644
## 8 CUSCO 0.299 0.135 0.682 0.28
## 9 HUANCAVELICA 0.278 0.139 0.585 0.258
## 10 HUANUCO 0.276 0.164 0.544 0.258
## # ... with 15 more rows
Ahora, esta base nos da información sobre la cantidad de votos por PPK y KF en cada distrito. Si nos solicitaran explorar visualmente la asociación entre el PBI per capita y el porcentaje de votos por PPK a nivel de departamentos, ¿cuál sería la forma de agregar los datos? Aquí el promedio no es útil. Necesitamos sumar los valores de cada caso. Dplyr es muy útil para ello:
pob_reg=data_idh %>%
group_by(depa) %>%
summarise(pob_reg = sum(pobla, na.rm = T))
pob_reg
## # A tibble: 25 x 2
## depa pob_reg
## <chr> <int>
## 1 AMAZONAS 417508
## 2 ANCASH 1129391
## 3 APURIMAC 451881
## 4 AREQUIPA 1245251
## 5 AYACUCHO 666029
## 6 CAJAMARCA 1513892
## 7 CALLAO 969170
## 8 CUSCO 1292175
## 9 HUANCAVELICA 483580
## 10 HUANUCO 840984
## # ... with 15 more rows
ppk_reg=data_idh %>%
group_by(depa) %>%
summarise(ppk_reg = sum(PPK, na.rm = T)) #para los conteos
ppk_reg
## # A tibble: 25 x 2
## depa ppk_reg
## <chr> <int>
## 1 AMAZONAS 78899
## 2 ANCASH 290878
## 3 APURIMAC 94183
## 4 AREQUIPA 566908
## 5 AYACUCHO 129186
## 6 CAJAMARCA 334586
## 7 CALLAO 296562
## 8 CUSCO 416788
## 9 HUANCAVELICA 95167
## 10 HUANUCO 164708
## # ... with 15 more rows
Ahora necesitamos juntar la información. El código que hemos venido utilizando es cbind para unir ambos objetos. Sin embargo, hay una función denominada merge, que permite juntar dos objetos en base a un vector que sirve como variable de identificación de casos. Veremos más detalles de la función en las siguientes clases pero, por ahora, veamos su forma más básica:
total = merge(pob_reg, ppk_reg, by = "depa")
Sacamos la proporción de voto por PPK:
total$prop_ppk = (total$ppk_reg/total$pob_reg)*100
Ahora agregamos el IDH por departamento:
idh_reg = data_idh %>%
group_by(depa) %>%
summarize(mean_idh = mean(idh, na.rm = TRUE))
total = merge(total,idh_reg, by = "depa")
Exploremos visualmente la asociación entre IDH y proporción de voto por PPK: ¿Qué opinan?
plot(total$prop_ppk, total$mean_idh)
Finalmente, otra forma súper útil de agregar datos, es cuando cada caso de nuestra base de datos es de interés. Es decir, cuando queremos agruparlos en función al número de ocurrencias. Por ejemplo, si queremos mostrar el número de distritos de cada región, podría utilizar esto:
dis_reg = data_idh %>%
group_by(depa) %>%
summarise(count = n())
dis_reg
## # A tibble: 25 x 2
## depa count
## <chr> <int>
## 1 AMAZONAS 84
## 2 ANCASH 166
## 3 APURIMAC 80
## 4 AREQUIPA 109
## 5 AYACUCHO 111
## 6 CAJAMARCA 127
## 7 CALLAO 6
## 8 CUSCO 108
## 9 HUANCAVELICA 94
## 10 HUANUCO 76
## # ... with 15 more rows
sum(dis_reg$count) #verificamos
## [1] 1834
Podemos tener data limpia y bien formateada, pero, en algunos caso, puede hacer falta hacer una columna comparable a otra o aplicar alguna técnica a ambas. Esto no puede hacerse de manera directa, ya que nuestras variables se encuentran en diferentes escalas de medición. Empecemos por el reescalamiento de variables:
Vamos a llamar a la base del proyecto de “Estados de bienestar comparativo en el siglo XXI”, en donde el compilado del conjunto de datos se encuentra a cargo de David Brady, Evelyne Huber y John D. Stephens. Los datos cubren las ganancias y la distribución de ingresos, el gasto social y las instituciones del estado de bienestar, la fuerza laboral y las instituciones del mercado laboral, datos demográficos, datos macroeconómicos, gasto en investigación y desarrollo, regulación del mercado de productos y políticas.
Variables como la participación de votantes y la distribución partidista de votos, escaños y participación en el gabinete. Están disponibles para 22 países postindustriales y se remontan a 1960 cuando es posible.
Más sobre la base y los indicadores por acá: https://www.lisdatacenter.org/news-and-events/comparativewelfare- states-dataset-2020/ (la última versión del 2020 aún no se encuentra disponible, por lo que se está trabajando con la versión del 2014)
datat = import("https://github.com/Alexanderbenit7/Test/blob/master/welfare%20states%20data.xlsx?raw=true")
Opción 1: escalamiento máximo-mínimo: valores oscilando entre 0 y 1
Vamos a practicar ejercicios de reescalamiento de datos utilizando la estrategia máximo-mínimo, con el objetivo de que nuestra variable oscile entre 0 y 1. Utilizamremos la variable “distribución de escaños en el parlamento ocupados por mujeres en la elección más frecuente” (fempar). El código se elabora de la siguiente forma:
minV=min(datat$fempar, na.rm=TRUE)
maxV=max(datat$fempar, na.rm=TRUE)
datat$fempar_mM=as.vector(scale(datat$fempar,
center =minV,
scale = maxV-minV ))
summary(datat$fempar)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.00 5.00 10.50 14.33 21.30 47.30 105
summary(datat$fempar_mM)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.0000 0.1057 0.2220 0.3030 0.4503 1.0000 105
Ahora, haremos lo mismo para la variable “distribución de escaños en el parlamento ocupados por partidos de derecha” (rtmaj):
minV=min(datat$rtmaj, na.rm=TRUE)
maxV=max(datat$rtmaj, na.rm=TRUE)
datat$rtmaj_mM=as.vector(scale(datat$rtmaj,
center =minV,
scale = maxV-minV ))
summary(datat$rtmaj)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.00 0.00 2.40 34.99 67.10 158.20 105
summary(datat$rtmaj_mM)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.00000 0.00000 0.01517 0.22115 0.42415 1.00000 105
Ahora, ambas variables son directamente comparables. Si las incluyeramos en un modelo de regresión lineal, por ejemplo, no sería necesario estandarizar los coeficientes para evaluar cuál tiene mayores impactos sobre la variable dependiente.
Opción 2: distancia como ratio en función al valor de referencia
reference=mean(datat$fempar,na.rm = TRUE)
datat$fempar_Ref1=as.vector(scale(datat$fempar,
center =F,
scale = reference ))
summary(datat$fempar_Ref1)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.0000 0.3489 0.7326 1.0000 1.4862 3.3003 105
reference=mean(datat$rtmaj,na.rm = TRUE)
datat$rtmaj_Ref1=as.vector(scale(datat$rtmaj,
center =F,
scale = reference))
summary(datat$rtmaj_Ref1)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.0000 0.0000 0.0686 1.0000 1.9179 4.5218 105
Opción 3: distancia estandarizada sobre el valor de referencia
reference=mean(datat$fempar,na.rm = TRUE)
datat$fempar_Ref2 = as.vector(scale(datat$fempar,
center =reference, #Ya lo creamos
scale = reference ))
summary(datat$fempar_Ref2)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## -1.0000 -0.6511 -0.2674 0.0000 0.4862 2.3003 105
reference=mean(datat$rtmaj,na.rm = TRUE)
datat$rtmaj_Ref2 = as.vector(scale(datat$rtmaj,
center =reference, #Ya lo creamos
scale = reference ))
summary(datat$rtmaj_Ref2)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## -1.0000 -1.0000 -0.9314 0.0000 0.9179 3.5218 105
Más que entrar en detalle en cada técnica de escalamiento de datos, la idea es que puede tomarse como un último paso en el trabajo con nuestros datos antes de entrar al análisis más “estadístico” propiamente hablabndo.
Ejercicios
Construya una variable de la base “Pavimentando con votos” con, al menos, dos condiciones, utilizando R base y dplyr.
Extraiga el valor del distrito con el menor número de esperanza de vida en años de cada provincia.
Explore visualmente la relación entre el PBI per capita y el voto por FP a nivel provincial
Utilice la técnica de escalamiento máximo mínimo para hacer dos variables que usted escoja directamente comparables.