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 univariado de variables categóricas (gráfico de barras):

    library(haven)
    library(sjPlot)
    saber_2014II <- read_spss("saber2014II.sav")
    
    sjp.frq(saber_2014II$JORNADA,title = "Frec. abs.")
    
    #Gráfico de frecuencias 
    a <- sjp.frq(saber_2014II$JORNADA,title = "Pruebas Saber 2014 I", geom.colors = "darkred",
           axisTitle.y = "Frecuencias absolutas" )
    

    plot of chunk unnamed-chunk-5

    Análisis univariado de variables categóricas: gráfico de barras (cont):

    • Se puede rotar el gráfico:
    #Gráfico de frecuencias 
    a <- sjp.frq(saber_2014II$JORNADA,title = "Pruebas Saber 2014 I",
           axisTitle.y = "Frecuencias absolutas", coord.flip = TRUE, 
            labelPos = "inside", sort.frq = "desc")
    

    plot of chunk unnamed-chunk-6

    a$mydf
    

    Análisis univariado de variables categóricas: tablas

    • Podemos extraer del gráfico la información calculada en un dataframe
    a$mydf
    
      var  frq   prz valid cumperc lower.ci upper.ci
    1   1 5550 46.63 46.63   46.63     2692     2874
    2   2 2783 23.38 23.38   70.01     5443     5657
    3   3 1567 13.16 13.16   83.17     1495     1639
    4   4 1060  8.91  8.91   92.08      999     1121
    5   5  943  7.92  7.92  100.00      885     1001
    
    • Es más comodo presentar esta tabla ya editada:
    #Tabla de frecuencias
    sjt.frq(saber_2014II$JORNADA)
    
    sjt.frq(saber_2014II$JORNADA, stringValue = "Valor",
                 stringCount = "Frec.", 
            stringPerc = "Frec. Relat.",
    stringValidPerc = "Porcentaje Valido",
    stringCumPerc = "Frecueencia acumulada", stringMissingValue = "Perdidos",
    showSummary = F)
    

    Se muestra en la siguiente diapositiva la salida

    Análisis univariado de variables categóricas: tablas (cont)

    Append
    • Este archivo se puede exportar a excel o word (basta en file especificar el nombre del archivo), o se puede pegar el código html para realizar una página web:
      • sjt.frq(saber_2014II$JORNADA, file = "salida1.docx")
      • sjt.frq(saber_2014II$JORNADA, file = "salida1.xlsx")
    • Los archivos exportados quedarán en la carpeta donde R se encuentre direccionado (ver getwd() en la consola)
    • Más detalles de esta función: http://www.strengejacke.de/sjPlot/sjt.frq//

    Tablas apiladas (stacked table):

    Oberve en la encuesta multiproposito la pregunta 9 del módulo L: http://formularios.dane.gov.co/Anda_4_1/index.php/catalog/189/download/2877. Se definen las estiquetas de valor y de variable, si se exporta de spss y de stata con las funciones del paquete haven este proceso no hay que realizarlo:

    setwd("/media/josezea/OS/Users/josezea/Documents/Laboral 2015/curso DANE 2015/Bases de datos/FicherosR")
    load("MultoproR.Rdata")
    library(sjmisc)
    inicial <- which(colnames(capL) == "l9a") # Posición inicial 
    final <- which(colnames(capL) == "l9l") # Posicición final
    # table(as.character(as.matrix(capL[,inicial:final])))
    for(j in inicial:final){
    capL[,j] <- set_val_labels(as.numeric(capL[ ,j]), c("mejor", "igual", "peor", "no sabe"))
    }
    capL[,21] <- set_var_labels(capL[,21],"Vías"); capL[,22] <- set_var_labels(capL[,22],"Andenes")
    capL[,23] <- set_var_labels(capL[,23],"Puentes peatonales")
    capL[,24] <- set_var_labels(capL[,24],"Ciclorutas")
    capL[,25] <- set_var_labels(capL[,25],"Parques"); 
    capL[,26] <- set_var_labels(capL[,26],"Colegios")
    capL[,27] <- set_var_labels(capL[,27],"Transmilenio"); 
    capL[,28] <- set_var_labels(capL[,28],"Bibilioteca")
    capL[,29] <- set_var_labels(capL[,29],"Ampliación redes acueducto")
    capL[,30] <- set_var_labels(capL[,30],"Ampliación de redes alcantarillado")
    capL[,31] <- set_var_labels(capL[,31],"Canchas, escenarios deportivos")
    capL[,32] <- set_var_labels(capL[,32],"Supermercados, zonas comerciales")
    

    Tablas apiladas (continuación)

    Se realiza la tabla con el paquete sjPlot:

    library(sjPlot)
    sjt.stackfrq(capL[,inicial:final], title = 'Entre el año 2007 y el momento actual,
      ¿cree que la ciudad ha mejorado, empeorado o se mantiene igual, en cada uno de los
      siguientes equipamientos?')
    
    Append

    Gráfico de una tabla de frecuencias apilada

    library(sjPlot)
    sjp.stackfrq(capL[,inicial:final], title = 'La ciudad del 2007 al 2011 está:')
    

    plot of chunk unnamed-chunk-12

    Otra tabla y gráfico muy similar lo pueden observar en: http://www.strengejacke.de/sjPlot/sjp.likert/

    Análisis univaraiado de variables continuas: histograma

    rm(list = ls())
    setwd("/media/josezea/OS/Users/josezea/Documents/Laboral 2015/curso DANE 2015/Bases de datos/FicherosR")
    load("EMB2011.RData") 
    library(ggplot2)
    
    ggplot(ing_gastos, aes(x=ingreso)) + geom_histogram()
    
    setwd("/media/josezea/OS/Users/josezea/Documents/Laboral 2015/curso DANE 2015/Bases de datos/FicherosR")
    load("EMB2011.RData") 
    g1 <- ggplot(ing_gastos, aes(x=ingreso)) + geom_histogram(binwidth = 1000000)
    g1
    

    plot of chunk unnamed-chunk-15

    Análisis bivariado de variables continuas: histograma y densidad (2)

    setwd("/media/josezea/OS/Users/josezea/Documents/Laboral 2015/curso DANE 2015/Bases de datos/FicherosR")
    load("EMB2011.RData") 
    g1 <- ggplot(ing_gastos, aes(x=ingreso)) 
    g1 + geom_histogram(aes(y = ..density..)) + geom_density() + xlim(0, 10000000) +
    xlab("Ingreso (CO$") +   ylab("Densidad") +   ggtitle("Gráfico 1")
    

    plot of chunk unnamed-chunk-16

    Puede ver más información para personalizar su gráfico buscando ggplot2 histogram en la web.

    Tablas cruzadas - Gráfico

    En las pruebas saber del primer semestre del 2014 gráficar jornada del colegio con la naturaleza del colegio:

    library(haven)
    library(sjPlot)
    saber_2014II <- read_spss("saber2014II.sav")
    
    sjp.xtab(saber_2014II$JORNADA, saber_2014II$NATURALEZA, tableIndex = "row")
    

    plot of chunk unnamed-chunk-19

    Tablas cruzadas - Gráfico (cont.)

    Perfiles fila:

    sjp.xtab(saber_2014II$NATURALEZA, saber_2014II$JORNADA, tableIndex = "row", barPosition = "stack")
    

    plot of chunk unnamed-chunk-20

    Tablas cruzadas

    Se pueden mostrar los perfiles fila, perfiles columnas y porcentajes total e igualmente personalizar al gusto los resutados de la tabla:

    library(sjPlot)
    sjt.xtab(saber_2014II$NATURALEZA, saber_2014II$JORNADA,   showRowPerc = TRUE,
    showCellPerc = TRUE, showColPerc = TRUE)
    
    Append

    Análisis de una variable continua y una variable categórica

    library(haven)
    library(ggplot2)
    setwd("/media/josezea/OS/Users/josezea/Documents/Laboral 2015/curso DANE 2015/Bases de datos/saber2014")
    saber_2014II <- read_spss("saber2014II.sav")
    saber_2014II$JORNADA <- as_factor(saber_2014II$JORNADA) 
    
    g2 <- ggplot(saber_2014II, aes(factor(JORNADA), PROMMATEMATICA))
    g2 + geom_boxplot(aes(fill = factor(JORNADA)))
    

    plot of chunk unnamed-chunk-25

    ggplot(saber_2014II, aes(x=PROMMATEMATICA)) +
      geom_density(aes(group=JORNADA, colour=JORNADA, fill=JORNADA), alpha=0.3)
    

    Análisis de una variable continua y una variable categórica (2)

    • Gráfico Jitter:
    #saber_2014II$NATURALEZA <- as_factor(saber_2014II$NATURALEZA )
    library(ggplot2)
    ggplot(saber_2014II, aes(x=PROMMATEMATICA, y = NATURALEZA)) + geom_point(position = "jitter")
    

    plot of chunk unnamed-chunk-28

    #jitter plot
    ggplot(saber_2014II, aes(x=NATURALEZA, y=PROMMATEMATICA)) + 
      geom_jitter(alpha=I(1/4), aes(color=NATURALEZA )) +
      xlab("Naturaleza") + labs(color = "Naturaleza")      
    

    plot of chunk unnamed-chunk-29

    Diagrama de dispersion

    • Diagrama de dispersión
    sjp.scatter(saber_2014II$PROMMATEMATICA, saber_2014II$PROMINGLES, 
                title = "Relación inglés y matemática")
    

    plot of chunk unnamed-chunk-31

    • Diagrama de dispersión con ajuste
    sjp.scatter(saber_2014II$PROMMATEMATICA, saber_2014II$PROMINGLES, title = "Relación inglés y matemática", showTotalFitLine = T)
    

    plot of chunk unnamed-chunk-32

    Diagrama de dispersion (2)

    • Diagrama de dispersión con regresión local polinomial:
    sjp.scatter(saber_2014II$PROMMATEMATICA, saber_2014II$PROMINGLES, title = "Relación inglés y matemática", showTotalFitLine = TRUE, show.se = FALSE, fitmethod = "loess")
    

    plot of chunk unnamed-chunk-33

    • Diagrama de dispersión desagregado por una variable categórica:
    sjp.scatter(x = saber_2014II$PROMMATEMATICA, y = saber_2014II$PROMINGLES, 
                grp = saber_2014II$NATURALEZA, showGroupFitLine = TRUE)
    

    plot of chunk unnamed-chunk-34

    Diagrama de dispersion (3)

    sjp.scatter(saber_2014II$PROMMATEMATICA, saber_2014II$PROMINGLES, saber_2014II$NATURALEZA, 
                showGroupFitLine = TRUE, fitmethod = "loess", 
                facet.grid = TRUE)
    

    plot of chunk unnamed-chunk-35

    Actividad

    • Los gráficos pueden sustituir las tablas y loas análisis numéricos: a tabla de frecuencias de
      • Lleve a cabo una tabla de frecuencias de la jornada del colegio
      • ¿Hay alguna relación entre el calendario y la jornada del colegio?, realice un perfile fila, y elabore la tabla cruzada (mostrando los perfiles filas y los conteos unicamente). Al final exporte ambos archivos generados.
      • Realice un boxplot y un jiiter para comprar el puntje de matemáticas por jornada
      • Realice un gráfico de densidades que le permita comprar el puntaje de matemáticas por calendario
      • Utilice la encuesta multiproposito y con un gráfico analice como es la relación entre el gasto y el ingreso por estrato socioeconómico.

    Mapas temáticos

    • Preparamos la base de datos para hacer un mapa por cuartiles de los departamentos por desempeño en las pruebas saber:
    library(dplyr)
    cons1 <- saber2014II %>% mutate(PROMGLOBAL = (PROMMATEMATICA + PROMINGLES +
    PROMLECTURACRITICA + PROMSOCIALESYCIUDADANAS +  PROMCIENCIASNATURALES +
    PROMRAZONAMIENTOCUANTITA+ PROMCOMPETENCIASCIUDADAN)/7) %>%
    group_by(DEPARTAMENTO) %>%
    summarize( PROMGLOBALXDPTO = sum(PROMGLOBAL * EVALUADOS) / sum(EVALUADOS)  ) %>%
    arrange(desc(PROMGLOBALXDPTO))  %>% filter(DEPARTAMENTO != "BOGOTA") %>%  
    mutate(ranking =  1: 32 ) %>%
    select(ranking, DEPARTAMENTO, PROMGLOBALXDPTO ) #Ignoraamos Bogotá 
    cortes <- as.numeric(quantile(cons1$PROMGLOBALXDPTO))
    cons1$grupo <- cut(cons1$PROMGLOBALXDPTO, breaks = cortes,  include.lowest = T, right = F,labels=F)
    

    Mapas temáticos (2)

    setwd("/media/josezea/OS/Documents and Settings/josezea/Documents/Laboral 2015/curso DANE 2015/Bases de datos/Mapas")
    library(sp) #Librería espacial
    load("COL_adm1.RData" )
    col_dpto=gadm
    grupo = as.factor(cons1$grupo)  #Variable temática (categórica)
    col_dpto$grupo <- grupo
    spplot(col_dpto, "grupo",col.regions=c("red","yellow", "green", "blue"))
    

    Funciones

    • Las funciones tienen la siguinte estructura:
    # nombrefuncion <- function(parametro1, parametro2, ....)
    # {
    #cuerpo de la funcion ...  
    #return()
    # }
    
    • Por ejemplo, una funonción para calcular el coficiente de variación
    cv <- function(x, porc = T, falt = F ){
    
      if(porc == T) cv <- 100 * sd(x, na.rm = falt) / mean(x, na.rm = falt)
      else cv<- sd(x, na.rm = falt) / mean(x, na.rm = falt)
      return(cv)
    } 
    a <- c(3,7,8,9,11,16,12)
    cv(a) # Por defecto hace el cv como porcentaje
    cv(a, F) 
    cv(porc = F, x = a) #Se puede cambiar el orden
    
    b <- c(3,7,8,9,11,16,12, NA) 
    cv(b)
    cv(b, falt = T) # En este caso falt es el tercer parámetro, se debe expecificar
    

    Funciones (2)

    • Se puede crear funciones que arrojen varios resultados al tiempo, para esto es útil una lista
    • Una lista es una estructura en R que puede contener vectores, matrices, data.frames.
    A <- matrix(1:9, ncol = 3)
    class(A)
    datos <- data.frame(ID = paste("ID", 1:5, sep = "-"), edad = c(45, 32, 17, 23, 35), sexo = c("M", "F", "M", "F", "M"))
    class(datos)
    x <- c(6, 5)
    class(x)
    lista1 <- list <- list(A, datos, x)
    lista1
    lista1[[1]] #Segundo elemento de la lista un matriz
    lista1[[1]][, 3] #Extraigamos el tercer elemento de la lista
    lista2 <- list <- list(nombre1 = A, nombre2 = datos, nombre3 = x)
    lista2$nombre2
    
    • Las funciones que requiere que tengan varios objetos en la salida usualmente arrojan una lista, por ejemplo:
    # La función lm para un modelo lineal
    x <- 1:5; y <- c(3.1, 3.8, 5.5, 10, 9.7 )
    modelo <- lm(y~x)
    names(modelo)
    modelo$coefficients; modelo[[1]]
    

    Funciones (3)

    • Si se quiere una función que calcule todas las descriptivas básicas:
    descriptivas <- function(x, falt = F){
    min <- min(x, na.rm = falt)
    promedio <- mean(x, na.rm = falt)
    mediana <- median(x, na.rm = falt)
    de <- sd(x, na.rm = falt)
    library(moments)
    asimetria <- skewness(x, na.rm = falt)
    curtosis <- kurtosis(x, na.rm = falt)
    p25 <- as.numeric(quantile(x, na.rm = falt, 0.25)) #Con el as.numeric le quito la etiqueta
    p75 <- as.numeric(quantile(x, na.rm = falt, 0.75))
    maximo <-   max(x, na.rm = falt)
    salida <- list(Mínimo = min, Promedio = promedio, Mediana = mediana, 
                   Desv_Est = de, Asimetria = asimetria, Curtosis = curtosis, 
                   P25 = p25, P75 = p75, Maximo = maximo )
    salida
    }
    a <- c(3, 5, 7, 8, 9, 11, 15, 17, 21, 5, 6, 8, 1)
    descriptivas(a)
    descriptivas(a)$Asimetria
    descriptivas(a)[3]
    class(descriptivas(a)[3]); class(descriptivas(a)[[3]])
    
    • Note que puedo extrar los corchetes con corchetes cuadrados, con corchetes simples sigue siendo una lista

    Funciones (4)

    • Podemos utilizar funciones para optimizar procesos, por ejemplo para los graficos con la función sjPlot
    sjt.frq(saber_2014II$JORNADA, stringValue = "Valor",
                 stringCount = "Frec.", 
            stringPerc = "Frec. Relat.",
    stringValidPerc = "Porcentaje Valido",
    stringCumPerc = "Frecueencia acumulada", stringMissingValue = "Perdidos",
    showSummary = F)
    
    t_frecs <- function(x){
    sjt.frq(x, stringValue = "Valor",
                 stringCount = "Frec.", 
            stringPerc = "Frec. Relat.",
    stringValidPerc = "Porcentaje Valido",
    stringCumPerc = "Frecueencia acumulada", stringMissingValue = "Perdidos",
    showSummary = F)
    }
    t_frecs(saber_2014II$JORNADA) 
    

    Funciones (5)

    • La anterior función ya me saca como quiero la tabla pero no me deja modificar los nombres en caso de que quiera cambiar un parámetros.
    • Lo anterior lo solución, colocando en los parámetros por defecto los títulos deseados.
    t_frecs <- function(x){
    sjt.frq(x, stringValue = "Valor",
                 stringCount = "Frec.", 
            stringPerc = "Frec. Relat.",
    stringValidPerc = "Porcentaje Valido",
    stringCumPerc = "Frecueencia acumulada", stringMissingValue = "Perdidos",
    showSummary = F)
    }
    
    t_frecs2 <- function(x, texto_valor = "Valor", texto_conteo = "Frec.", 
            texto_porcen = "Frec. Relat.",
            texto_porc_valido = "Porcentaje Valido", texto_porc_acum = "Frecueencia acumulada", 
            mostrar_resumen = F) {
            sjt.frq(x, stringValue = texto_valor, stringCount = texto_conteo, 
            stringPerc = texto_porcen, stringValidPerc = texto_porc_valido,
            stringCumPerc = texto_porc_acum, stringMissingValue = mostrar_resumen)
    }
    t_frecs2(saber_2014II$JORNADA) 
    

    Actividad

    • Construya una función que por defecto omita faltantes y calcule la tabla de frecuenias absolutas y relativas, a esta última dele la opción que arroje o no en porcentaje los valores.
    • Personalice la tabla de perfil fila y columna.
    • Construya paso a paso su propia función que arroje la misma tabla anterior.
    • Construya un función que aparte de las descritpivas básicas le arroje un diagrama de caja de la variable
    • Construya una función que ingresada dos fechas calcule el año.
    • Construya una función que convierta en factor las variables que tienen etiquetas de las bases exportadas de SPSS

    Uso de factores de expansión en encuestas:

    • Varias de la información disponbile proviene de encuestas probabilísticas las cuales seleccionan una muestra para obtener resultados de una población más grande.

    • Utilizaremos la gran encuesta integrada de hogares para los principales municipios del país, leer la información de:

    • Descargue la encuesa: https://www.dropbox.com/s/uxdslp4sr7jkp07/AREA.zip?dl=0

    • Para diseños muestrales complejos, utilizar el paquete survey

    setwd("/media/josezea/OS/Documents and Settings/josezea/Documents/Laboral 2015/curso DANE 2015/Bases de datos/Marzo_GEIH/AREA")
    dir()
    library(haven)
    Ocupados <-  read_spss("Area - Ocupados.sav")  
    Otros_Ingresos <- read_spss("Area- Otros ingresos.sav")  
    Vivienda_Hogares <- read_spss("Area - Vivienda y Hogares.sav")  
    library(sjPlot)
    Vivienda_Hogares <- select(Vivienda_Hogares, Directorio,Secuencia_p, P4030s1a1, P4000, Area, Dpto,  Fex_c_2011)
    
    • Ojetivo: estimar el ingreso promedio de los hogares en las principales cabeceras urbanas del país con la GEIH.

    Arreglo encuesta

    • Se arregla el problema de codificación:
    for(i in 1:ncol(Vivienda_Hogares)){
    Encoding(attributes(Vivienda_Hogares[[i]])$label) <- "latin1"
    }
    for(i in 1:ncol(Vivienda_Hogares)){
    if(class(Vivienda_Hogares[[i]]) == "labelled") {
    Encoding(names(attributes(Vivienda_Hogares[[i]])$labels)) <- "latin1"
    }
    }
    #view_df(Vivienda_Hogares)
    for(i in 1:ncol(Ocupados)){
    Encoding(attributes(Ocupados[[i]])$label) <- "latin1"
    }
    for(i in 1:ncol(Ocupados)){
    if(class(Ocupados[[i]]) == "labelled") {
    Encoding(names(attributes(Ocupados[[i]])$labels)) <- "latin1"
    }
    }
    for(i in 1:ncol(Otros_Ingresos)){
    Encoding(attributes(Otros_Ingresos[[i]])$label) <- "latin1"
    }
    for(i in 1:ncol(Otros_Ingresos)){
    if( class(Otros_Ingresos[[i]]) == "labelled") {
    Encoding(names(attributes(Otros_Ingresos[[i]])$labels)) <- "latin1"
    }
    }
    

    Reconstrucción del ingreso por hogar

    • Se suman los ingresos no laborales (arriendos,..) de las personas
    • Se combinan las bases de ingresos de ingresos no laborales con los ingresos laborales de las personas
    • Se agregan los ingresos por personas
    library(dplyr)
    # Se seleccionan las variables de ingreso, se puede ver el formulario en:
    #http://formularios.dane.gov.co/Anda_4_1/index.php/catalog/356/data_dictionary#page=F27&tab=data-dictionary
    
    Ing_nolab <- select(Otros_Ingresos, Directorio, Secuencia_p, Orden, P7500s3a1, P7500s2a1,
                 P7500s1a1, P7510s2a1, P7510s6a1, P7510s5a1, P7510s3a1, P7510s1a1, P7510s7a1, 
                 P750s1a1, P750s2a1, P750s3a1)
    Ing_nolab$ing_nolab <- rowSums(Ing_nolab[, 4:15], na.rm = T)
    Ing_lab <- select(Ocupados, Directorio, Secuencia_p, Orden, Inglabo)
    Ingreso <-  merge(Ing_lab, Ing_nolab, all = T)
    Ingreso$ingreso <- rowSums(Ingreso[, c(4, 17)], na.rm = T)
    Ingreso$Directorio <- as.character(Ingreso$Directorio)
    Ingreso$Secuencia_p <- as.character(Ingreso$Secuencia_p)
    
    #Agregar a nivel de hogar
    
    library(dplyr)
    IngresoHog <- Ingreso %>% select(Directorio, Secuencia_p, Orden, ingreso) %>% group_by( Directorio, Secuencia_p) %>% summarize(ingresoXhog = sum(ingreso, na.rm = T)) 
    IngresoHog <- merge(IngresoHog, Vivienda_Hogares)
    sum(IngresoHog$Fex_c_2011)
    
    [1] 6462419
    

    Utilizar los factores de expansión

    library(Hmisc)
    mean(IngresoHog$ingresoXhog, na.rm = T)
    
    wtd.mean(x = IngresoHog$ingresoXhog, weights = IngresoHog$Fex_c_2011, na.rm=TRUE)
    wtd.quantile(x = IngresoHog$ingresoXhog, probs = 0.5, weights = IngresoHog$Fex_c_2011, na.rm=TRUE)
    
    wtd.var(x = IngresoHog$ingresoXhog, weights = IngresoHog$Fex_c_2011, na.rm=TRUE)
    wtd.quantile(x = IngresoHog$ingresoXhog, weights = IngresoHog$Fex_c_2011, na.rm=TRUE)
    wtd.table(x = IngresoHog$P4030s1a1, weights=IngresoHog$Fex_c_2011, type=c('table'))
    #sum(wtd.table(x = IngresoHog$P4030s1a1, weights=IngresoHog$Fex_c_2011, type=c('table')))
    100 * prop.table(wtd.table(x = IngresoHog$P4030s1a1, weights=IngresoHog$Fex_c_2011, type=c('table')))
    

    Utilizar los factores de expansión

    • Se calcula promedio, mediana, la varianza, los percentiles
    library(Hmisc)
    # Suma
    sum(IngresoHog$ingresoXhog *  IngresoHog$Fex_c_2011, na.rm = T)
    
    [1] 2.217694e+13
    
    # Promedio
    mean(IngresoHog$ingresoXhog, na.rm = T) #Cálculo erroneo
    
    [1] 3260782
    
    wtd.mean(x = IngresoHog$ingresoXhog, weights = IngresoHog$Fex_c_2011, na.rm=TRUE)
    
    [1] 3431677
    
    #Mediana
    wtd.quantile(x = IngresoHog$ingresoXhog, probs = 0.5, 
                 weights = IngresoHog$Fex_c_2011, na.rm=TRUE)
    
        50% 
    1950000 
    

    Utilizar los factores de expansión (2)

    # Varianza
    wtd.var(x = IngresoHog$ingresoXhog, weights = IngresoHog$Fex_c_2011, na.rm=TRUE)
    
    [1] 8.633801e+13
    
    #Percentiles
    wtd.quantile(x = IngresoHog$ingresoXhog, weights = IngresoHog$Fex_c_2011, na.rm=TRUE)
    
           0%       25%       50%       75%      100% 
            0    960000   1950000   3668798 500700098 
    
    #Tabla de freciencias
    wtd.table(x = IngresoHog$P4030s1a1, weights=IngresoHog$Fex_c_2011, type=c('table'))
    
             0          1          2          3          4          5 
      12508.28 1199144.24 2566698.83 1900558.11  510561.41  150593.23 
             6          9 
     115265.37    6169.59 
    
    100 * prop.table(wtd.table(x = IngresoHog$P4030s1a1, weights=IngresoHog$Fex_c_2011,
          type=c('table')))
    
              0           1           2           3           4           5 
     0.19358165 18.55829782 39.72296222 29.41357874  7.90159381  2.33062378 
              6           9 
     1.78387966  0.09548233 
    

    Agregaciones usando factores de expansión

    library(dplyr)
    IngresoHog$Area <- as_factor(IngresoHog$Area)
    cons1 <- IngresoHog %>% group_by(Area) %>% summarise( n = sum(Fex_c_2011), 
    prom_ing = wtd.mean(ingresoXhog, weights = Fex_c_2011, na.rm=TRUE) ) %>% 
    arrange(desc(prom_ing))
    
    sum(cons1$n)
    
    • Agregue el ingreso por estrato
    • Agregue el ingreso por área metropolitana y estrato

    Gráficos expandidos

    library(ENmisc)
    wtd.boxplot(IngresoHog$ingresoXhog ~ substr(IngresoHog$Area, 1, 3), weights = IngresoHog$Fex_c_2011,
    ylim = c(0,10000000))
    
    library(ggplot2)
    ggplot(IngresoHog, aes(ingresoXhog, weight = Fex_c_2011)) + geom_histogram() +  xlim(0, 10000000)
    

    Identificación de duplicados

    • Antes de hacer un pegado de lbases de datos y al comienzo de cualquier análisis.
    • Verificar duplicados en el identificado o en la llave primaria
    Append
    a <- c("02","05","06","02","09","11","17","20","20","20")
    
    duplicated(a)
    duplicated(a, fromLast = TRUE)
    duplicated(a) | duplicated(a, fromLast = TRUE)
    
    table(duplicated(a))
    table(duplicated(a, fromLast = TRUE))
    table(duplicated(a) | duplicated(a, fromLast = TRUE))
    

    Identificación de duplicados (2)

    df = structure(list(a = c(1, 2, 3, 4, 5, 6, 7, 8), b = c(2, 4, 6,  8, 10, 12, 13, 14),
    c = structure(c(1L, 2L, 2L, 3L, 4L, 4L, 5L,  5L),
    .Label = c("A", "B", "C", "D", "E"), class = "factor"),
    d = c(1001, 1002, 1002, 1003, 1004, 1004, 1005, 1006)),
    .Names = c("a", "b", "c", "d"), row.names = c(NA, -8L), class = "data.frame")
    
    duplic1 <- duplicated(df[ c("c","d")])
    df1 <- df[!duplic1, ]
    
    duplic2 <- duplicated(df[c("c","d")], fromLast = T )
    df2 <- df[!duplic2, ]
    
    duplic3 <-  duplic1 | duplic3
    df3 <- df[!duplic3, ]
    
    #Comprobamos si hay duplicados en las pruebas saber
    table(duplicated(saber_2014II$AGSB_CODINST))
    
    
    FALSE 
    11903 
    

    Manejo de caracteres (substr y paste)

    #Extraer bcd
    substr("abcdef", 2, 4)
    # Reemplazar la segunda letra por #
    x = c("may", "the", "force", "be", "with", "dyou")
    substr(x, 2, 2) <- "#"
    x
    
    # Extraer cada letra
    substring("ABCDEF", 1:6, 1:6)
    substring("ABCDEF", c(1,4), c(2,6))
    
    # Pegar cada componente del vector (sin separacion)
    paste(1:3, c("!", "?", "+"), sep = "")
    
    # Lo mismo pero colapsando todo e
    paste(1:3, c("!", "?", "+"), sep = "", collapse = "")
    paste(1:3, c("!", "?", "+"), sep = "", collapse = "#")
    paste(1:3, c("!", "?", "+"), sep = " ", collapse = "")
    
    datos <- data.frame(id = 1:20, nomloc = c("Antonio Nariño", "Barrios Unidos",
    "Bosa", "Candelaria", "Chapinero", "Ciudad Bolivar","Engativa", "Fontibón", 
    "Kennedy", "Los Mártires" , "Puente Aranda", "Rafael Uribe", "San Cristobal", "Santa Fe", 
    "Suba", "Sumapaz", "Teusaquillo", "Tunjuelito", "Usaaquén", "Usme"), 
    stringsAsFactors = F)
    datos$id <- ifelse (nchar(datos$id) == 1, paste0("0", datos$id), datos$id) 
    

    Como evitar el problema anterior

    # Importar de un csv (Enfoque malo)
    setwd("/media/josezea/OS/Users/josezea/Documents/Laboral 2015/curso DANE 2015/Bases de datos/saber2014")
    dat <- read.csv("saber2014II.csv", sep = ";", dec=",")
    # head(dat)
    
    # Importar de un csv (Enfoque correcto)
    clases <- c(rep("character", 8), rep("numeric", 8), rep("NULL", 7), "character")
    datos <- read.csv("saber2014II.csv", sep = ";", dec=",", colClasses = clases)
    

    Manejo de caracteres (segunda parte)

    • Contar el númer de caracteres, reemplazar y cambiar de mayúsculas a minúsculas
    # ¿Cuantos caracterés?
    nchar(c("How", "many", "characters?"))
    
    # Cuantos elementos del vector
    length("How many characters?")
    
    
    # Reemplzar un caracter por otro
    gsub("a", "AAA", "This is a boring string")
    
    a <- c("Bogotá ", "Cali  ", "Medellín  ")
    gsub(" ", "", a)
    
    
    # Minúsculas a mayusculas
    tolower(c("aLL ChaRacterS in LoweR caSe", "ABCDE"))
    casefold("aLL ChaRacterS in LoweR caSe")
    
    
    # Mayusculas a minúsculas
    toupper(c("All ChaRacterS in Upper Case", "abcde"))
    #casefold("All ChaRacterS in Upper Case", upper = TRUE)
    

    Patrones de textos

    states = rownames(USArrests)
    
    # Los que empiezan en 'w'
    grep(pattern = "w", x = states, value = TRUE)
    
    # Los que empiezan en 'w' o 'W'
    grep(pattern = "[wW]", x = states, value = TRUE)
    grep(pattern = "w", x = states, value = TRUE, ignore.case = TRUE)
    
    # get states names with 'W'
    grep(pattern = "W", x = toupper(states), value = TRUE)
    
    #Que contenga la palabra pop
    grep("^pop",names(LifeCycleSavings), value = TRUE)
    
    #Que no contenga la palabra pop
    grep("^pop",names(LifeCycleSavings), value = TRUE, invert = T)
    
    # Filtrar columnas
    filtro <- grep("^pop",names(LifeCycleSavings), value = TRUE)
    datos <- LifeCycleSavings[, filtro]
    

    El paquete string

    library(stringr)
    some_text = c("one", "two", "three", NA, "five")
    
    # Número de caracteres
    nchar(some_text)
    str_length(some_text)
    
    # Para factores
    some_factor = factor(c(1, 1, 1, 2, 2, 2), labels = c("good", "bad"))
    some_factor
    
    #No funciona
    #nchar(some_factor)
    
    lorem = "Lorem Ipsum"
    # Función extraer
    str_sub(lorem, start = 1, end = 5)
    substring(lorem, first = 1, last = 5)
    
    resto = c("brasserie", "bistrot", "creperie", "bouchon")
    # Extraer desde el final
    str_sub(resto, start = -4, end = -1)
    
    # Duplicar una palabra
    str_dup("adios", 2)
    

    El paquete string (2)

    # Por defecto deja los espacios a la izquierda
    str_pad("hola", width = 7)
    
    #Se puede hacer que deje los espacos a las derechas
    str_pad("hola", width = 7, side = "right")
    
    #Deja los espacios a ambos lados
    str_pad("adios", width = 7, side = "both")
    
    # left padding with '#'
    str_pad("hashtag", width = 8, pad = "#")
    
    # pad both sides with '-'
    str_pad("hashtag", width = 9, side = "both", pad = "-")
    
    # Texto con espacios
    bad_text = c("This", " example ", "has several ", " whitespaces ")
    
    # Quita espacios en blanco a la izquiera
    str_trim(bad_text, side = "left")
    
    # Quita espacios en blanco a la derecha
    str_trim(bad_text, side = "right")
    
    # Quita espacios a ambos lados
    str_trim(bad_text, side = "both")
    

    El paquete string (3)

    change = c("Be the change", "you want to be")
    
    # Extrae la segunda palabra
    word(change, 2)
    
    # Extrae la última palabra
    word(change, -1)
    

    Más información: