Curso de Análisis de datos con R


Instructor:

José Fernando Zea

  • Msc en EstadÃ?stica

  • Docente Universidad Nacional

  • Estudiante Phd en Estadistica (UNAL)

  • Análisis de datos con R

    cover

    Recodificar variables

    setwd("C:/Users/josezea/Desktop")
    load("EMB2011.RData")
    #table(a$estrato, useNA="always")
    attach(a)
    a$estrator[estrato %in% 1:2] <- "Bajo"   
    a$estrator[estrato %in% 3:4] <- "Medio"  
    a$estrator[estrato %in% 5:6] <- "Alto"
    a$estrator[estrato == 9] <- NA
    #table(a$estrator, useNA="always")
    detach(a)
    

    Carge la Encuesta Multipropósito de Bogotá: https://www.dropbox.com/s/h47ig09optv46rm/EMB2011.RData?dl=0

    setwd("C:/Users/josezea/Desktop")
    load("EMB2011.RData")
    #table(a$estrato, useNA="always")
    a$estrator <- ifelse(a$estrato %in% 1:2, "Bajo", 
                         ifelse(a$estrato %in% 3:4, "Medio",
                                ifelse(a$estrato %in% 5:6, "Alto", NA))) 
    table(a$estrator, useNA="always")
    
    
     Alto  Bajo Medio  <NA> 
      783  6846  7998   205 
    

    Recodificación con dplyr y con el paquete recode

    • Alternativamente con la función mutate:
    a$estrator = NULL
    library(dplyr)
    a <- mutate(a, estrator = ifelse(estrato %in% 1:2, "Bajo", 
                         ifelse(estrato %in% 3:4, "Medio",
                                ifelse(estrato %in% 5:6, "Alto", NA))) ) 
    table(a$estrator, useNA="always")
    
    
     Alto  Bajo Medio  <NA> 
      783  6846  7998   205 
    
    • Recodificación con recode: muy útil cuando son varias niveles en que se quiere recodificar
    library(car)
    estR <- recode(a$estrato, '1="Bajo"; 2="Bajo"; 3="Medio"; 4="Medio";
                   5="Alto"; 6="Alto"; 9=NA') 
    #table(estR)
    
    • Recodifique el ingreso por salario mÃ?nimo del 2011: 0-1 SM, 1-2 SM, 2-3 SM, Más de 3 SM (use ing_gastos) _ Recodifique en quintiles el gasto.

    Añadir casos (Append): pegado de bases por debajo

    • Para añadir casos a una tabla de datos, las variables deben tener el mismo nombre y por ejemplo si una variable que se llame var1 en ambas tablas deben tener las columnas en el mismo formato

    • Si dos columnas que se llamen igual no tienen el mismo tipo la función bind_rows la vuelve caracter para poderlas combinar

    Append

    Ejemplo Append

    X <- data.frame(A=1:10, B=LETTERS[1:10], C=rnorm(10) )
    Y <- data.frame(A=11:15, D=rnorm(5), E=letters[1:5] )
    #rbind(X, Y): no funciona puesto que no hay coincidencia exacta columna a columna
    library(gtools)
    smartbind(X, Y) #smartbind(df1, df2, fill=99)
    
          A    B           C          D    E
    1:1   1    A -1.06755727         NA <NA>
    1:2   2    B  0.09229334         NA <NA>
    1:3   3    C  0.68273441         NA <NA>
    1:4   4    D -1.55232542         NA <NA>
    1:5   5    E  0.88157874         NA <NA>
    1:6   6    F -0.16842192         NA <NA>
    1:7   7    G  0.09034243         NA <NA>
    1:8   8    H  0.36309594         NA <NA>
    1:9   9    I  1.09609962         NA <NA>
    1:10 10    J  0.14595696         NA <NA>
    2:1  11 <NA>          NA  0.3953788    a
    2:2  12 <NA>          NA -2.5099615    b
    2:3  13 <NA>          NA  0.3334682    c
    2:4  14 <NA>          NA  0.5192524    d
    2:5  15 <NA>          NA  0.8193869    e
    
    library(dplyr) #bind_rows(X, Y)
    

    Añadir variables (merge/join): pegado de bases por el lado

    • Muchas encuestas vienen en diferentes módulos por lo cual se hace necesario integrarlas a través de variables comunes a ambas tablas.

    • La tabla que se combina contendrá además de las variables comunes cada una de las variables de las dos tablas.

    • Existen Al menos 5 formas de realizar este procedimiento: producto cartesiano (no es muy usado en el contexto de manejo de bases de datos), inner_join, outer_join, left_join, right_join, entre otros. Se explican los principales.

    Append

    Algunos ejercicios de pegados de bases de datos con el paquete base

    df1 <- data.frame(CustomerId = paste0("ID", c(1:6)), Product = c(rep("TV", 3), rep("Radio", 3)))
    df2 <- data.frame(CustomerId = paste0("ID", c(2, 4, 6)), State = c(rep("Alabama", 2), rep("Ohio", 1)))
    
    #Observar cada uno de los tipos de pegados
    
    #Inner Join: conserva los individuos que estén en ambas variable
    df_inner <- merge(df1, df2)
    
    #Outer Join: Conserva los individuos que esté en al menos de una de las dos variables
    df_outer <- merge(x = df1, y = df2, by = "CustomerId", all = TRUE)
    
    #Left Join: Conserva los individuos que esté en la tabla de la izquierda
    df_left <- merge(x = df1, y = df2, by = "CustomerId", all.x = TRUE)
    
    #Right Join: Conserva los individuos que esté en la tabla de la derecha
    df_right <- merge(x = df1, y = df2, by = "CustomerId", all.y = TRUE)
    
    #Producto cartesiano: poco utilizado en el contexto de manejo de bases de datos
    df_cross <- merge(x = df1, y = df2, by = NULL)
    #Más eficiente computacionalmente con dplyr
    library(dplyr)
    #inner_join(df1, df2)
    #left_join(df1, df2)
    #right_join(df1, df2)
    #Outer Join
    #full_join(df1, df2)
    

    Algunos detalles adicionales del merge/join

    #Si las variables tienen nombres diferentes
    df1 <- data.frame(CustomerId = paste0("ID", c(1:6)), Product = c(rep("TV", 3), rep("Radio", 3)))
    df2 <- data.frame(Id = paste0("ID", c(2, 4, 6)), State = c(rep("Alabama", 2), rep("Ohio", 1)))
    merge(df1, df2, by.x = "CustomerId", by.y = "Id")
    
      CustomerId Product   State
    1        ID2      TV Alabama
    2        ID4   Radio Alabama
    3        ID6   Radio    Ohio
    
    #Se puede unir también por nombres diferentes en las bases y múltiples variables
    d1 <- data_frame( x = letters[1:3],  y = LETTERS[1:3],   a = rnorm(3)  )
    d2 <- data_frame(x2 = letters[3:1],  y2 = LETTERS[3:1], b = rnorm(3)  )
    left_join(d1, d2, by = c("x" = "x2", "y" = "y2"))
    
    Source: local data frame [3 x 4]
    
      x y          a          b
    1 a A  0.3924069  1.3073880
    2 b B  0.3397483 -0.3811417
    3 c C -0.2541935  0.4381216
    
    #merge(d1, d2, by.x = c("x", "y"), by.y = c("x2", "y2"), all.x = T)
    

    Ejercicio con la multiproposito

    Ver el formulario de la encuesta multiproposito:

    http://formularios.dane.gov.co/Anda_4_1/index.php/catalog/189/download/2877 y cargue la siguiente encuesta (Encuesta multiproposito de Bogotá): https://www.dropbox.com/s/h47ig09optv46rm/EMB2011.RData?dl=0

    • Objetivo: conformar una base con estrato, localidad, gasto e ingreso
    • directorio: identificador vivienda
    • directorio_hog: identificador de la vivienda

    • Ojo: a es una tabla de viviendas, ing_gastos es una tabla de hogares, PROBLEMA: no se pueden conectar directamente.

    • Paso 1: primero peguemos la tabla de los nombres de la localidad a la tabla a

    • Paso 2: Usemos una tabla que contenga el identificador de la vivienda y del hogar: pegamos la tabla a con la c(aunque las variables de c no nos importa)

    • Paso3: Pegamos la tabla ac con la tabla ing_gastos

    Ejercicio con la multiproposito (2)

    # Preparación de la base de datos
    setwd("C:/Users/josezea/Desktop")
    load("EMB2011.RData")
    a <- merge(a, localidad)
    
    #localidad$nom_loc <- as.character(localidad$nom_loc)
    #Encoding(localidad$nom_loc) <- "latin1"
    
    ac <- merge(a, c)
    tabla <- merge(ac, ing_gastos)
    library(dplyr)
    tabla <- tabla_inggastos_bogota %>% select(directorio_hog,nom_loc, 
                              estrato, ingreso, gasto)
    
    Error in eval(expr, envir, enclos): object 'tabla_inggastos_bogota' not found
    
    • Calclue el ingreso promedio por tipo de apartamento

    Ejercicio con la gran encuesta integrada de hogares

    _ Supongamos que la GEIH fuera un censo (ignoraremos en este ejercicio los factores de expansión)

    • Ejercicio 1: ¿En bogotá, los ingresos de los hogares que son propietarios de vivienda son mayores en los propietarios de vivienda, en los arrendatatarios?

    • Para responder a esta pregunta realizaremos una serie de pasos sucesivos para obtener la información necesaria.

    • Paso 1 (Preparación de las bases de datos): identificar módulos: Pregunta C9 de Area - Vivienda y Hogares.sav (variable P5090) y variable Inglabo de "Area - Ocupados.sav"

    • Paso 2: identificar por que variables se va a realizar el meerge/join: DIRECTORIO: identificador de la vivienda, IDENTIFICAR DE HOGAR: conformado por el DIRECTORIO y SECUENCIA_P, IDENTIFICADOR DE LA PERSONA: conformado por DIRECTORIO, SECUENCIA_P y ORDEN

    • Paso 3: Unión de la tabla de ocupados y hogares, reconstrucción del ingreso de los hogares y cálculo del promedio del ingreso del hogar por tipo de vivienda

    Paso 1: Preparacion de la base de datos

    Descargar GEIH Marzo de 2015, principales áreas metropolitanas: https://www.dropbox.com/sh/ndradnkiq6uoaor/AADOOLGaJoOQNi7tCfNzv8KVa?dl=0

    setwd("C:/Users/josezea/Documents/Laboral 2015/curso DANE 2015/Bases de datos/Marzo_GEIH/AREA")
    #dir()
    library(haven)
    vivhogares_Areas <- read_spss("Area - Vivienda y Hogares.sav") 
    
    for(i in 1:ncol(vivhogares_Areas)){
    Encoding(attributes(vivhogares_Areas[[i]])$label) <- "latin1"
    }
    
    for(i in 1:ncol(vivhogares_Areas)){
    if( class(vivhogares_Areas[[i]] ) == "labelled" ) {
    Encoding(names(attributes(vivhogares_Areas[[i]])$labels)) <- "latin1"
    }
    }
    
    ocupados_Areas <- read_spss("Area - Ocupados.sav")
    
    for(i in 1:ncol(ocupados_Areas)){
    Encoding(attributes(ocupados_Areas[[i]])$label) <- "latin1"
    }
    
    
    for(i in 1:ncol(ocupados_Areas)){
    if( class(ocupados_Areas[[i]] ) == "labelled" ) {
    Encoding(names(attributes(ocupados_Areas[[i]])$labels)) <- "latin1"
    }
    }
    

    Paso 2 y 3

    #intersect(names(vivhogares_Areas), names(ocupados_Areas))
    
    #Puede pegar directamente con merge
    prueba <- merge(vivhogares_Areas, ocupados_Areas, by = c("Directorio", "Secuencia_p") )
    
    #En dplyr las variables a pegar deben ser de tipo caracter
    
    #typeof(vivhogares_Areas$Secuencia_p)
    
    vivhogares_Areas$Directorio <- as.character(vivhogares_Areas$Directorio)
    ocupados_Areas$Directorio <- as.character(ocupados_Areas$Directorio)
    
    vivhogares_Areas$Secuencia_p <- as.character(vivhogares_Areas$Secuencia_p)
    ocupados_Areas$Secuencia_p <- as.character(ocupados_Areas$Secuencia_p)
    
    
    datos <- vivhogares_Areas %>% right_join(ocupados_Areas, by = c("Directorio", "Secuencia_p")) %>%
    select(Directorio, Secuencia_p, Orden, Area.x, Inglabo)
    names(datos)[4] <- "Area"
    # attributes(datos$Area)
    # table(datos$Area)
    datos <- datos %>% filter(Area == "11") #Se filtra Bogotá
    datos$Area = as_factor(datos$Area)
    #table(datos$Area)
    

    Paso 2 y 3 (cont)

    #Sumar el ingreso por hogar y luego calcular el promedio del ingreso del hogar por tipo de vivienda
    consulta <- datos %>% group_by(Directorio,Secuencia_p) %>% summarize(ingresoXhog = sum(Inglabo, na.rm = T)) %>%
    left_join(vivhogares_Areas, by = c("Directorio","Secuencia_p")) %>% select( ingresoXhog,P5090) %>% 
    group_by(P5090) %>% summarise(prom_inghog = mean(ingresoXhog, na.rm = T))
    consulta$P5090 = as_factor(consulta$P5090)
    consulta
    
    Source: local data frame [6 x 2]
    
                                                             P5090 prom_inghog
    1                                    Propia, totalmente pagada     2273458
    2                                     Propia, la están pagando     2688959
    3                                    En arriendo o subarriendo     1803342
    4                                                 En usufructo     1492023
    5 Posesión sin titulo (ocupante de hecho) ó propiedad colectiv      463000
    6                              Otra, ¿cuál?___________________     1630175
    

    Ejercicio: calcule el ingreso promedio por estrato socieconómico.

    Reestructuración de datos: formato ancho a largo: gather

    • Pasar de una base ancha (wide format) a una larga (long format)
    Append
    • data: conjunto de datos (supermercado)
    • key: llave, será una variable categórica (Trimestre)
    • value: valores, los valores que deseo "reunir" en una columna (Utilidades)
    • : las variables en donde están "dispersos los valores" (Trimestre1, Tirmestre2,..)

    Reestructuración de bases de datos: formato largo a ancho: spread

    • Pasar de una base larga (long format) a una ancha (wide format)
    Append
    • data: conjunto de datos (supermercado)
    • key: llave, variable categórica (Trimestre)
    • value: valores, los valores que deseo colocar en diferentes columnas (cuyos nombres son cada uno de los niveles de la llave) (Utilidades)

    Ejemplos de reestructuración de base ancha a larga

    setwd("C:/Users/josezea/Documents/Laboral 2015/curso DANE 2015/Bases de datos/FicherosR")
    load("supermercado.Rdata")
    library(tidyr)
    supermercado2 <- gather(supermercado, key = Trimestre, value = Utilidades, Trimestre_1:Trimestre_4 )
    
    #Mejor asi y ordenamos al final por Almacen, Año y trimestre para mejor comprensión
    supermercado2 <- supermercado %>% gather(key = Trimestre, value = Utilidades, 
                     Trimestre_1:Trimestre_4) %>% arrange(Almacen, Year, Trimestre)
    
    setwd("C:/Users/josezea/Documents/Laboral 2015/curso DANE 2015/Bases de datos")
    ejemplo1 <- read.table("Ejemplo1.csv", sep = ",",  header = T)
    ejemplo1$Id_personas <- paste0("ID",1:nrow(ejemplo1))
    ejemplo1 <- select(ejemplo1, Id_personas, V_1:  V_7)
    
    ejemplo1_long <- ejemplo1 %>% gather(key = Posicion, value = Marcas, 
                                             V_1:V_7) %>% arrange(Id_personas, Posicion)
    ejemplo1_long <- ejemplo1_long[ejemplo1_long$Marcas !=99, ]
    ejemplo1_long$Marcas<- factor(ejemplo1_long$Marcas, labels = c("Coca-Cola", "Pepsi", 
    "Colombiana Postobon","Sprite", "Quatro", "Manzana", "Naranja Postobon", paste0("Marca",8:16))) 
    #table(ejemplo1_long$Marcas)
    #round(100 * prop.table(table(ejemplo1_long$Marcas)), 1)
    

    Ejemplos de reestructuración de base larga a ancha

    • Suponga que se dispone de la base larga y se quiere saber si desea calcular la correlación entre las ventas trimestrales
    supermercadoA <- supermercado2 %>% spread(key = Trimestre, value = Utilidades)
    cor(supermercadoA[,3:6])
    
                Trimestre_1 Trimestre_2 Trimestre_3 Trimestre_4
    Trimestre_1   1.0000000   0.9969518   0.9966907   0.9971432
    Trimestre_2   0.9969518   1.0000000   0.9987305   0.9972775
    Trimestre_3   0.9966907   0.9987305   1.0000000   0.9967585
    Trimestre_4   0.9971432   0.9972775   0.9967585   1.0000000
    

    Ver: http://www.dane.gov.co/files/investigaciones/poblacion/proyepobla06_20/Hogares_viviendas_1985-2020.xls

    Descargar: https://www.dropbox.com/s/52np816t4wcb1xn/proyeccionesDane.xlsx?dl=0

    setwd("C:/Users/josezea/Documents/Laboral 2015/curso DANE 2015/Bases de datos")
    library(readxl)
    proy <- read_excel("proyeccionesDane.xlsx")
    names(proy)[3:38] <- paste0("A", names(proy)[3:38])
    proy_long <- proy %>% gather(key = Periodo, value = Poblacion, 
            A1985:A2020) %>% arrange(DP, Periodo)
    
    #Suponga que tiene proy_long y la desea volver base ancha
    proyA <- proy_long %>% spread(key = Periodo, value = Poblacion)
    

    Separate y Unite

    • Para separar variables en diferentes columnas o combinar variables a una misma columna:
    supermercado3 <- supermercado2 %>% separate( col = Trimestre, 
                                                 into = c("Intervalo_tiempo", "Trim"),
                                                 sep = "\\_") 
    
    #En sep se coloca el signo con el cual se desea separar las columnas precedido de \\
    
    #Para Unir en una variale en col se coloca el nombre de la columna que se queire construir
    supermercado4 <- supermercado3  %>% unite(col = Trimestre, Intervalo_tiempo, Trim, sep = "_")
    head(supermercado4)
    
      Almacen Year   Trimestre Utilidades
    1       1 2009 Trimestre_1       1034
    2       1 2009 Trimestre_2       1050
    3       1 2009 Trimestre_3       1019
    4       1 2009 Trimestre_4       1002
    5       1 2010 Trimestre_1       1202
    6       1 2010 Trimestre_2       1225
    

    Taller3

    Para los puntos 1 a use la tabla taller3.Rdata: https://www.dropbox.com/s/pahlo97tibelvs6/taller3.Rdata?dl=0

    1. Utilice la base de datos saber2013 y calcule el puntaje promedio global que sacaron los colegios en las pruebas saber. Recodifique las variables como "Aprobó" si el puntaje global del colegio estuvo por encima de 60, "Reprobó si el puntaje globar estuve por debajo de sesenta.
    • ¿Qué porcentajes de colegios se "rajaron" en la prueba. 0
    • De los colegios públicos de Bogotá con más de 10 estudiantes evaluados que portcentaje se "rajaron" en las prueba saber
    1. Utilice las tablas de proy de población y las de las pruebas saber. Recodifique la variable P_2015 (población en el año 2015) de acuerdo a los siguiente: Municipios de menos de 100 000 habitantes, Municipios de 100 000 a 500000 habitantes y Municipios de más de 500000 mil de habitantes.
    2. ¿Cuál fue el promedio y la mediana del puntaje en matemáticas para cada una de las tipologias de municipios que usted recodificó?

    3. Lleve a cabo una reestructuración de base ancha a base larga (gather) para la base de datos resumen_jornada. Responda a las siguientes preguntas:

    • ¿Cuál es el total de evaluados por departamento?
    • ¿Cuantos evaluados tienen Bogotá, Cali y Medellin, cuales son los dos municipios con menos evaluados?

    Taller 3 (cont)

    4) ¿Qu é porcentaje de los mayores de 18 trabaja en Bogotá?, Qu é porcentaje trabaja en cada uno de los estratos socioeconómicos en Bogotá? Descargue la información de: https://www.dropbox.com/s/uxdslp4sr7jkp07/AREA.zip?dl=0

    5) Utilice las proyecciones completas y pase de un formato ancho a un formato largo la información de tal forma que quede la población total, la problación cabecera y la población de resto de cada municipio por aparte. (Utilice gather y cuando sea necesario select e inner_join(pegue por el indentificador del municipio). Descargue la información de: https://www.dropbox.com/s/3s6t2fgic1mb3tu/Proypoblaccompletas.xlsx?dl=0