Manipulacion y Analisis preliminar de datos

con dplyr y graficos lattice

Jose Antonio Ortega
Universidad de Salamanca

La semana pasada: Lectura y manipulación de fichero px del INE

Cargamos los datos del Padrón de 2015 y los llevamos a una forma larga para manipularlos tanto en la clase de la semana pasada como en la hoja de problemas

# install.packages("pxR") # Si no está ya instalado y nos da error la línea siguiente
library(pxR)
library(dplyr)            # Para tener ya disponible el operador %>% 
library(tidyr)
padron2015 <- read.px("http://www.ine.es/pcaxisdl/t20/e245/p05/a2015/l0/00000004.px") %>% as.data.frame %>% as.tbl
library(tidyr)
padron2015 <- padron2015 %>% mutate(municipios=as.character(municipios)) %>% 
          separate(municipios,c("cod","municipio"),sep="-",
                   extra="merge",fill="left")
padron2015 <- padron2015 %>% mutate(prov=as.numeric(cod)%/%1000,prov=as.factor(prov)) %>% 
 dplyr::rename(pob=value, nacimiento=`país.de.nacimiento`)

Esta semana

  • Creamos un objeto de datos preparado para nuestros objetivos: tidyr + dplyr
  • Estudiamos cómo combinar distintos objetos con las variaciones de join
  • Mostramos como resumir numéricamente una variable
  • Presentamos los principales tipos de gráficos lattice, que comparten la misma filosofía basada en fórmulas.
  • Vemos gráficos para estudiar:
    • Una variable cuantitativa: bwplot, stripplot, densityplot, ecdfplot
    • Comparar variables cuantitativas: dotplot
    • Relaciones entre variables cuantitativas: xyplot
  • Vemos como se pueden combinar manipulaciones de datos para preparar un gráfico.
  • Aplicamos todo lo anterior a ejemplos relevantes: ¿Qué municipios son los que NO aparecen en el Anuario de La Caixa?

join: Juntando bases de datos

Los distintos tipos de join permiten juntar objetos de datos que comparten una o más variables en común.

Lo aplicamos a juntar los datos del padrón con los nombres de las provincias y las CCAA.

Al seleccionar las columnas para el join con select podemos cambiar los nombres de las variables directamente ahorrando un paso:

download.file("http://alarcos.esi.uclm.es/per/fruiz/pobesp/dat/list-pro.xls",
              destfile ="list-pro.xls",mode="wb")
provs=read_excel("list-pro.xls")
provs <- provs %>% mutate(prov=as.numeric(CP),prov=as.factor(prov))
padron2015 <- padron2015 %>%
  left_join(provs %>% select(PROVINCIA,prov,codCA=CA,CCAA=Autonomía),by="prov")

Al hacer el join debemos asegurarnos de que la columna común tenga la misma clase en los dos objetos, en este caso factor.

Selección de variables para su estudio: pasando a forma ordenada

Vamos a estudiar los tamaños de los municipios, y los extranjeros por provincias y CCAA.

Nuestros datos están en un formato largo que pasamos a un formato ordenado con las variables que nos interesen.

munic = padron2015 %>% filter(sexo=="Ambos sexos",!is.na(cod)) %>% 
  spread(nacimiento,pob) %>% dplyr::rename(Habitantes=`Total Población`) %>% select(-sexo)
  • Una fila para cada uno de los 8119 municipios de España
  • Una columna (es decir: una variable) para cada uno de los origenes de la población. La variable Habitantes es la población total del municipio

Estructura de nuestros datos ordenados

str(munic)
## Classes 'tbl_df', 'tbl' and 'data.frame':    8119 obs. of  44 variables:
##  $ cod                        : chr  "01001" "01002" "01049" "01003" ...
##  $ municipio                  : chr  "Alegra-Dulantzi" "Amurrio" "Aana" "Aramaio" ...
##  $ prov                       : Factor w/ 52 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ PROVINCIA                  : chr  "Araba/lava" "Araba/lava" "Araba/lava" "Araba/lava" ...
##  $ codCA                      : chr  "16" "16" "16" "16" ...
##  $ CCAA                       : chr  "Pas Vasco" "Pas Vasco" "Pas Vasco" "Pas Vasco" ...
##  $ Habitantes                 : num  2882 10263 157 1518 244 ...
##  $ Nacidos en Espaa          : num  2600 9488 150 1455 222 ...
##  $ Nacidos en el Extranjero   : num  282 775 7 63 22 43 44 87 119 82 ...
##  $ Total Europa               : num  62 221 0 17 11 20 16 22 25 36 ...
##  $ Total Unin Europea        : num  58 198 0 12 11 17 15 22 23 32 ...
##  $ Alemania                   : num  5 6 0 1 0 0 0 1 2 1 ...
##  $ Bulgaria                   : num  1 0 0 2 0 0 1 0 0 0 ...
##  $ Francia                    : num  10 11 0 1 1 1 3 3 2 13 ...
##  $ Italia                     : num  0 6 0 0 1 1 0 1 1 0 ...
##  $ Polonia                    : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ Portugal                   : num  21 45 0 3 8 5 9 4 1 6 ...
##  $ Reino Unido                : num  4 8 0 0 1 2 1 2 0 2 ...
##  $ Rumana                    : num  11 120 0 4 0 8 1 9 16 9 ...
##  $ Total Europa No Comunitaria: num  4 23 0 5 0 3 1 0 2 4 ...
##  $ Rusia                      : num  0 4 0 1 0 3 0 0 1 2 ...
##  $ Ucrania                    : num  0 10 0 2 0 0 1 0 0 0 ...
##  $ Total Africa               : num  121 273 7 7 1 8 17 38 52 10 ...
##  $ Argelia                    : num  30 88 0 2 1 0 0 5 7 1 ...
##  $ Marruecos                  : num  76 149 7 1 0 2 16 25 39 6 ...
##  $ Nigeria                    : num  5 6 0 0 0 0 0 0 0 0 ...
##  $ Senegal                    : num  1 7 0 0 0 0 0 6 3 0 ...
##  $ Total Amrica              : num  81 262 0 23 10 15 10 19 41 36 ...
##  $ Argentina                  : num  5 15 0 1 0 7 0 0 0 3 ...
##  $ Bolivia                    : num  1 6 0 3 0 0 0 1 0 1 ...
##  $ Brasil                     : num  9 13 0 1 3 0 1 4 6 5 ...
##  $ Colombia                   : num  16 16 0 1 0 1 2 2 0 3 ...
##  $ Cuba                       : num  4 14 0 0 4 1 2 1 0 0 ...
##  $ Chile                      : num  3 2 0 0 1 0 0 0 1 5 ...
##  $ Ecuador                    : num  12 16 0 9 0 6 0 6 8 4 ...
##  $ Paraguay                   : num  4 6 0 0 0 0 2 0 0 0 ...
##  $ Per                       : num  7 143 0 0 0 0 0 1 1 7 ...
##  $ Repblica Dominicana       : num  12 4 0 0 2 0 0 0 21 1 ...
##  $ Uruguay                    : num  1 2 0 0 0 0 0 1 0 0 ...
##  $ Venezuela                  : num  1 11 0 1 0 0 2 0 3 2 ...
##  $ Total Asia                 : num  17 18 0 16 0 0 0 8 1 0 ...
##  $ China                      : num  0 7 0 0 0 0 0 1 0 0 ...
##  $ Pakistn                   : num  16 5 0 16 0 0 0 0 0 0 ...
##  $ Total Oceana              : num  1 1 0 0 0 0 1 0 0 0 ...

Resumen de variable cuantitativa: summary y boxplot bwplot

summary(munic$Habitantes)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##       5     166     549    5743    2428 3142000
  • El boxplot o diagrama de caja es un gráfico resumen de una distribución.
  • Centro de la caja: Mediana
  • Límites de la caja: Cuartiles
  • Límites de los "bigotes": Mínimo y máximo, salvo atípicos (observaciones muy lejanas de las demás, que se muestran individualmente).
  • En nuestro caso necesitamos tomar logaritmos, si no, "no se ve nada".
bwplot(~log(Habitantes),data=munic)

plot of chunk unnamed-chunk-7

Boxplot de variable + factor

  • Permite comparar facilmente las distribuciones de los tamaños de los municipios entre CCAA.

  • bwplot, igual que xyplot, utiliza una fórmula para elegir qué gráfico se hace:

y ~ x | z
  • y - La variable que va al eje y
  • x - La variable que va al eje x
  • z - Si se da, indica hacer un gráfico distinto para cada valor de z.
bwplot(CCAA~log(Habitantes),data=munic)

plot of chunk unnamed-chunk-8

Todos los puntos: stripplot

Si no tenemos suficiente con ver los cuartiles podemos visualizar la distribución completa.

Los gráficos stripplot muestran en una tira los valores que toma la variable para cada categoría

La opción ´jitter=TRUE´ "mueve" los puntos de modo que todos sean visibles.

stripplot(CCAA~log(Habitantes),
          jitter= TRUE,
          pch= ".",
          data=munic)

Población de los municipios por CCAA

plot of chunk unnamed-chunk-10

densityplot

  • Nos proporciona una estimación no paramétrica de la función de densidad.

  • Como un histograma pero con "infinitas" categorías.

  • Podemos hacerlo por CCAA condicionando en la fórmula

  • No hay que dar variable y, porque el eje y tiene ya la densidad.

  • El argumento type lo tienen todos los gráficos lattice y permite especificar qué se representa con un vector:

    • l: líneas
    • p: puntos
    • g: rejilla (grid) ...
densityplot(~log(Habitantes)|CCAA,data=munic,
            type=c("g","l"))

plot of chunk unnamed-chunk-11

Funciones de distribución

Con ecdfplot del paquete latticeExtra

library(latticeExtra)
ecdfplot(~log(Habitantes), groups=CCAA, 
         data = munic %>% filter(codCA<18),
         auto.key=list(columns=2))
  • La función de distribución muestra más claramente lo diferentes que son las distribuciones de los municipios en España por CCAA.

  • ecdf, como otros gráficos, están incluidos en un paquete que aporta más tipos de gráfico con la misma filosofía común a todos los gráficos lattice.

plot of chunk unnamed-chunk-12

Comparación de variables cuantitativas y proporciones

Podemos usar dplyr (group_by y summarise), para construir nuevas variables que resuman la distribución: Ejemplo, inmigrantes por lugar de origen

dotplot y barchart son buenas manera de comparar variables cuantitativas y de mostrar proporciones respectivamente.

Funcionan con fórmulas, o, ALTERNATIVAMENTE, proporcionando una matriz que tenga como nombres de filas (rownames) las etiquetas de las categorias (CCAA en nuestro caso)

origen = munic  %>% group_by(CCAA)  %>% 
    summarize(`Prop Europa`= sum(`Total Europa`) / sum(`Nacidos en el Extranjero`)*100,
              `Prop Africa`= sum(`Total Africa`) / sum(`Nacidos en el Extranjero`)*100,
              `Prop America`= sum(`Total América`) / sum(`Nacidos en el Extranjero`)*100) %>% 
    mutate(`Prop otros`=100-`Prop Europa`-`Prop Africa`-`Prop America`)
rownames(origen)=origen$CCAA  
origen = select(origen,-CCAA) %>% as.matrix

Distribución de inmigrantes por lugar de origen

dotplot(origen, auto.key=TRUE)

plot of chunk unnamed-chunk-15

barchart(origen, auto.key=TRUE)

plot of chunk unnamed-chunk-16

Relaciones entre variables cuantitativas: xyplot

xyplot nos muestra un diagrama de dispersión de una variable frente a otra.

  • La opción "r" en type añade la ecuación de regresión lineal.
  • En este caso añadimos 1 al logaritmo en el eje y puesto que existen municipios sin extranjeros.
  • Para que R calcule la variable transformada antes de hacer el gráfico hay que utilizar la función I de identidad.
xyplot(I(log(`Nacidos en el Extranjero`+1))~log(Habitantes),data=munic,
       type=c("p","g","r"),pch=".")

plot of chunk unnamed-chunk-17

Gráficos condicionados y por grupos.

xyplot(I(log(`Nacidos en el Extranjero`+1))~
       log(Habitantes)|CCAA,data=munic,
       type=c("p","g","r"),pch=".")

plot of chunk unnamed-chunk-18

xyplot(I(log(`Nacidos en el Extranjero`+1))~
     log(Habitantes),groups=CCAA,data=munic,
       type=c("p","g","r"),pch=".")

plot of chunk unnamed-chunk-19

Estudio exploratorio de datos y de relaciones entre variables

  • Los gráficos que hemos mostrado permiten estudiar la distribución entre variables de una manera sencilla.
  • Todos ellos tienen argumentos comunes y funcionan con fórmulas.
  • Existen opciones para controlar absolutamente todo (leyendas, colores, tamaños, posiciones, ...)

  • Hemos llegado al punto de "poder" representar gráficamente las relaciones entre variables e, implicitamente, estimar regresiones.

  • En el tema siguiente veremos más sobre interpretación de relaciones empíricas. Veremos que las interpretaciones causales son sólo posibles en circunstancias muy determinadas.

  • Pero antes, vamos a terminar de ver manipulaciones de datos, y los tipos de join

Aplicación: Anuario de la Caixa

La semana pasada bajamos los datos del Anuario Económico de la Caixa

Contienen datos municipales, pero para menos municipios que los del INE, que son todos.

¿Qué criterio se utilizó para excluir?

SIMPLE: Hacemos un join por la columna del código INE (cod en munic, Código INE en AE13mun, ambas de tipo chr). Vamos a hacer un join "artificial" con una columna que sencillamente sea TRUE para los municipios en el Anuario de La Caixa

library(readxl)
AE13mun <-  read_excel("AE13_Municipal_Completo.xlsx",na="n.d.")
munic <- munic %>% left_join(AE13mun %>% select(cod=`Código INE`) 
                             %>% mutate(Caixa=TRUE), by="cod") %>% 
         mutate(Caixa=ifelse(is.na(Caixa),FALSE,TRUE))

Ahora podemos explorar con las herramientas que hemos visto cómo son los municipios que están en el Anuario y los que no

¿Es el número de habitantes?

stripplot(Caixa~log(Habitantes),jitter=TRUE,
          pch=".",data=munic)

plot of chunk unnamed-chunk-22

BINGO

munic %>% group_by(Caixa) %>% 
  summarize(min=min(Habitantes),max=max(Habitantes))
Caixa min max
FALSE 5 5253
TRUE 796 3141991
summary(AE13mun$`Población 2012`)
Min. 1st Qu. Median Mean 3rd Qu. Max.
1000 1855 3719 42310 10020 8450000

Es el número de habitantes en 2012: Mayor que 1000

¿Municipios de 8 millones de habitantes?

AE13mun  %>% arrange(desc(`Población  2012`))  %>% select(1:3)
Nombre Municipio o Total Provincial y/o CC.AA. cod Poblacion 2012
Total C.A. ANDALUCA 1 8449985
Total C.A. CATALUA 9 7570908
Total Prov. Madrid 28 6498560
Total C.A. MADRID 13 6498560
Total Prov. Barcelona 08 5552050
Total C.A. COMUNITAT VALENCIANA 10 5129266
  • Están incluidas las sumas de las CCAA y provincias.
  • Para quedarnos con los municipios tendremos que hacer un filter(as.numeric(Código INE)>1000))
  • EJERCICIO: ¿Cuáles son los municipios que crecieron mucho entre 2012 y 2015? (Hay alguno de 5000)
    • SOLUCIÓN: Hay que hacer un nuevo join, posiblemente al revés: meter los datos del padrón en AE13mun

TRABAJOS

  • Un estudio empírico sobre una variable que os interese.
  • Incluye:
    • Seleccionar la variable explicada
    • Pensar cuáles deben de ser las variables explicativas
    • Identificar dónde están disponible los datos
    • Conseguirlos y llevarlos a forma ordenada
    • Estimar los modelos, buscar la especificación adecuada, validarlos
    • Interpretar los resultados
  • Por parejas DE UN MISMO GRUPO DE PRÁCTICAS
  • Datos de sección cruzada (en un momento dado)
  • Mínimo 100 observaciones, mejor 100000.

Unidades posibles:

  • Grupo A: Municipios de una CCAA o de toda España
    • Datos Caixa o INE
  • Grupo B: Regiones en la UE
    • Datos Eurostat. Paquete eurostat.
  • Grupo C: Datos de países
    • Datos Banco Mundial. Paquete WDI u otras fuentes