1. Agrupación y construcción de intervalos:

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))

2. Agregando datos:

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

3. Transformación de datos para comparabilidad e integración

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

  1. Construya una variable de la base “Pavimentando con votos” con, al menos, dos condiciones, utilizando R base y dplyr.

  2. Extraiga el valor del distrito con el menor número de esperanza de vida en años de cada provincia.

  3. Explore visualmente la relación entre el PBI per capita y el voto por FP a nivel provincial

  4. Utilice la técnica de escalamiento máximo mínimo para hacer dos variables que usted escoja directamente comparables.