¿Qué es R?

¿Cómo entender R?

  • Hay una sesión de R corriendo. La consola de R es la interfaz entre R y nosotros.
  • En la sesión hay objetos. Todo en R es un objeto: vectores, tablas, funciones, etc.
  • Operamos aplicando funciones a los objetos y creando nuevos objetos.

¿Por qué R?

  • R funciona en casi todas las plataformas (Mac, Windows, Linux e incluso en Playstation 3).
  • R es un lenguaje de programación completo, permite desarrollo de DSLs.
  • R promueve la investigación reproducible.
  • R está actualizado gracias a que tiene una activa comunidad. Solo en CRAN hay más de 13,000 paquetes (funcionalidad adicional de R creadas creada por la comunidad).
  • R se puede combinar con otras herramientas.
  • R tiene capacidades gráficas muy sofisticadas.
  • R es popular (Revolutions blog).

R: primeros pasos

Para comenzar se debe descargar R, esta descarga incluye R básico y un editor de textos para escribir código. Después de descargar R se recomienda descargar RStudio (gratis y libre).

Rstudio es un ambiente de desarrollo integrado para R: incluye una consola, un editor de texto y un conjunto de herramientas para administrar el espacio de trabajo cuando se utiliza R.

Algunos shortcuts útiles en RStudio son:

En el editor

En la consola

Práctica: Empecemos una hora heróica!

Hero
(Available at https://gph.is/2fTItW7, Sep 12, 2018)

Paquetes

La mejor manera de usar R para análisis de datos es aprovechando la gran cantidad de paquetes que aportan funcionalidad adicional.

  1. Instalación de paquetes
install.packages("readr")
  1. Cargar paquetes
library(readr)

Instala los paquetes ggplot2 y dplyr.

            Cárga los paquetes que instalaste.

Lectura de datos

RStudio tiene un menu poin-and-click muy conveniente para leer tablas de datos, permite importar archivos en varios formatos comunes:

  • csv: archivos de texto separados por comas (cualquier hoja de excel se puede exportar como csv).

  • excel

  • SPSS

  • SAS

  • Stata

OJO: Es importante asegurarse de copiar a nuestro script la instrucción que se genera al importar archivos con las herramientas de RStudio.

  1. Leer datos: la siguiente instrucción lee un archivo csv y lo asigna a una variable llamada cohesión social.
cohesion_rezago <- read_csv("data/cohesion_rezago_social.csv")
## Parsed with column specification:
## cols(
##   .default = col_double(),
##   Cve_Ent = col_character(),
##   Ent = col_character(),
##   Cve_Mun = col_character(),
##   Mun = col_character(),
##   Grado_rezago_social = col_character(),
##   Grado_cohesion_social = col_character(),
##   Grado_de_polarizacion = col_character(),
##   Poblacion_cat = col_character()
## )
## See spec(...) for full column specifications.
  1. Ver los datos: la función head() imprime las primeras líneas de los datos.
head(cohesion_rezago)
## # A tibble: 6 x 20
##   Cve_Ent Ent   Cve_Mun Mun   Poblacion Indice_rezago_s… Grado_rezago_so…
##   <chr>   <chr> <chr>   <chr>     <dbl>            <dbl> <chr>           
## 1 01      Agua… 01001   Agua…    797010            -1.56 Muy bajo        
## 2 01      Agua… 01002   Asie…     45492            -1.01 Muy bajo        
## 3 01      Agua… 01003   Calv…     54136            -1.10 Muy bajo        
## 4 01      Agua… 01004   Cosío     15042            -1.13 Muy bajo        
## 5 01      Agua… 01005   Jesú…     99590            -1.30 Muy bajo        
## 6 01      Agua… 01006   Pabe…     41862            -1.34 Muy bajo        
## # ... with 13 more variables: Viviendas_sin_electricidad <dbl>,
## #   Viviendas_sin_drenaje <dbl>, Viviendas_sin_lavadora <dbl>,
## #   Viviendas_sin_refrigerador <dbl>, Viviendas_sin_excusado <dbl>,
## #   Viviendas_sin_agua_entubada <dbl>, Viviendas_piso_tierra <dbl>,
## #   Pob_analfabeta <dbl>, Pob_sin_servicios_salud <dbl>, Gini <dbl>,
## #   Grado_cohesion_social <chr>, Grado_de_polarizacion <chr>,
## #   Poblacion_cat <chr>

Lee los datos de mortalidad que se encuentran en la carpeta data.

Graficación

Utilizaremos el paquete ggplot2 que fue desarrollado por Hadley Wickham.

library(ggplot2)
  1. Gráficas de dispersión
ggplot(data = cohesion_rezago) + 
  geom_point(mapping = aes(x = Viviendas_sin_lavadora, y = Viviendas_sin_refrigerador)) 
## Warning: Removed 2 rows containing missing values (geom_point).

¿Qué pasó?

ggplot(data = cohesion_rezago) + geom_point(mapping = aes(x = Viviendas_sin_lavadora, y = Viviendas_sin_refrigerador))

ggplot(data = cohesion_rezago)

geom_point(aes(x = Viviendas_sin_lavadora, y = Viviendas_sin_refrigerador))

ggplot(data = cohesion_rezago) + 
  geom_point(mapping = aes(x = Viviendas_sin_lavadora, 
      y = Viviendas_sin_refrigerador, color = Grado_de_polarizacion)) 
## Warning: Removed 2 rows containing missing values (geom_point).

Experimenta con los aesthetics color (color), tamaño (size) y forma (shape).

            ¿Qué diferencia hay entre las variables categóricas y las continuas?

            ¿Qué ocurre cuando combinas varios aesthetics?

El mapeo de las propiedades estéticas se denomina escalamiento y depende del tipo de variable, las variables discretas (por ejemplo, genero, escolaridad, país) se mapean a distintas escalas que las variables continuas (variables numéricas como edad, estatura, etc.), los defaults para algunos atributos son (los escalamientos se pueden modificar):

aes Discreta Continua
Color (color) Arcoiris de colores Gradiente de colores
Tamaño (size) Escala discreta de tamaños Mapeo lineal entre el área y el valor
Forma (shape) Distintas formas No aplica
Transparencia (alpha) No aplica Mapeo lineal a la transparencia
  1. Más tipos de gráficas:
ggplot(cohesion_rezago, aes(x = Viviendas_sin_lavadora, 
      y = Viviendas_sin_refrigerador)) + 
    geom_line() 
## Warning: Removed 2 rows containing missing values (geom_path).

No es una buena gráfica!

¿Cómo podemos mejorar la siguiente gráfica?

mortalidad <- read_csv("data/mortalidad.csv")
## Parsed with column specification:
## cols(
##   anio = col_double(),
##   edo = col_character(),
##   tipo = col_character(),
##   sexo = col_character(),
##   tasa = col_double()
## )
ggplot(mortalidad, aes(x = anio, y = tasa)) +
    geom_point()

Color?

ggplot(mortalidad, aes(x = anio, y = tasa, color = sexo)) +
    geom_point()

Podemos probar otros geoms.

ggplot(mortalidad, aes(x = factor(anio), y = tasa, color = sexo)) +
    geom_boxplot() 

¿Cómo esta relacionado el índice de rezago y la población?

Veamos ahora como hacer gráficas de paneles, la idea es hacer varios múltiplos de una gráfica donde cada múltiplo representa un subconjunto de los datos, es una práctica muy útil para explorar relaciones condicionales.

  1. Podemos usar facet_wrap() para hacer paneles dividiendo los datos de acuerdo a las categorías de una sola variable:
ggplot(mortalidad, aes(x = factor(anio), y = tasa, color = sexo)) +
    geom_boxplot() +
    facet_wrap(~ tipo)

Pero… ¿qué queremos ver?

ggplot(mortalidad, aes(x = factor(anio), y = tasa, color = sexo, group = edo)) +
    geom_path(alpha = 0.5) +
    facet_grid(reorder(tipo, tasa) ~ sexo, scales = "free_y")

Y con unas mejoras:

library(dplyr)
mortalidad_2008 <- filter(mortalidad, anio == 2008)
mortalidad_2008_gpd <- group_by(mortalidad_2008, tipo, sexo)
edos_mortalidad_mayor <- top_n(mortalidad_2008_gpd, 1, tasa)
edos_mortalidad_menor <- top_n(mortalidad_2008_gpd, 1, -tasa)


ggplot(data = mortalidad, aes(x = factor(anio), y = tasa, color = sexo, 
    group = edo)) +
    geom_path(alpha = 0.5) +
    geom_text(data = edos_mortalidad_mayor, aes(x = factor(anio), y = tasa, 
        label = edo), size = 2.5, hjust = 1, vjust = 0, color = "black") +
    geom_text(data = edos_mortalidad_menor, aes(x = factor(anio), y = tasa, 
        label = edo), size = 2.5, hjust = 1, vjust = 0, color = "black") +
    facet_grid(tipo ~ sexo, scales = "free_y") +     
    theme(axis.text.x = element_text(angle = 90, hjust = 1))

Manipulación

  1. Filtrar: nos permite obtener un subconjunto de los datos:
filter(cohesion_rezago, Grado_rezago_social == "Muy alto")
## # A tibble: 113 x 20
##    Cve_Ent Ent   Cve_Mun Mun   Poblacion Indice_rezago_s… Grado_rezago_so…
##    <chr>   <chr> <chr>   <chr>     <dbl>            <dbl> <chr>           
##  1 07      Chia… 07007   Amat…      8728             2.14 Muy alto        
##  2 07      Chia… 07022   Chal…     14027             3.09 Muy alto        
##  3 07      Chia… 07023   Cham…     76941             2.37 Muy alto        
##  4 07      Chia… 07026   Chen…     36111             2.17 Muy alto        
##  5 07      Chia… 07031   Chil…    111554             1.92 Muy alto        
##  6 07      Chia… 07056   Mito…     11157             2.51 Muy alto        
##  7 07      Chia… 07066   Pant…     20589             2.23 Muy alto        
##  8 07      Chia… 07082   Sita…     12269             2.84 Muy alto        
##  9 07      Chia… 07111   Zina…     36489             2.11 Muy alto        
## 10 07      Chia… 07112   San …     29016             2.42 Muy alto        
## # ... with 103 more rows, and 13 more variables:
## #   Viviendas_sin_electricidad <dbl>, Viviendas_sin_drenaje <dbl>,
## #   Viviendas_sin_lavadora <dbl>, Viviendas_sin_refrigerador <dbl>,
## #   Viviendas_sin_excusado <dbl>, Viviendas_sin_agua_entubada <dbl>,
## #   Viviendas_piso_tierra <dbl>, Pob_analfabeta <dbl>,
## #   Pob_sin_servicios_salud <dbl>, Gini <dbl>,
## #   Grado_cohesion_social <chr>, Grado_de_polarizacion <chr>,
## #   Poblacion_cat <chr>
x > 1
x >= 1
x < 1
x <= 1
x != 1
x == 1
x %in% c("a", "b")

Selecciona los municipios correspondientes al estado en que naciste.

            Selecciona los municipios correspondientes al estado en que naciste y con grado de rezago social menor a -1.

            Filtra los municipios con población mayor a 1 millón.

  1. Mutar consiste en crear nuevas variables aplicando una función a columnas existentes:
mutate(cohesion_rezago, Pob_miles = Poblacion / 1000) 
## # A tibble: 2,458 x 21
##    Cve_Ent Ent   Cve_Mun Mun   Poblacion Indice_rezago_s… Grado_rezago_so…
##    <chr>   <chr> <chr>   <chr>     <dbl>            <dbl> <chr>           
##  1 01      Agua… 01001   Agua…    797010           -1.56  Muy bajo        
##  2 01      Agua… 01002   Asie…     45492           -1.01  Muy bajo        
##  3 01      Agua… 01003   Calv…     54136           -1.10  Muy bajo        
##  4 01      Agua… 01004   Cosío     15042           -1.13  Muy bajo        
##  5 01      Agua… 01005   Jesú…     99590           -1.30  Muy bajo        
##  6 01      Agua… 01006   Pabe…     41862           -1.34  Muy bajo        
##  7 01      Agua… 01007   Rinc…     49156           -1.26  Muy bajo        
##  8 01      Agua… 01008   San …      8443           -1.10  Muy bajo        
##  9 01      Agua… 01009   Tepe…     19668           -1.04  Muy bajo        
## 10 01      Agua… 01010   El L…     18828           -0.885 Muy bajo        
## # ... with 2,448 more rows, and 14 more variables:
## #   Viviendas_sin_electricidad <dbl>, Viviendas_sin_drenaje <dbl>,
## #   Viviendas_sin_lavadora <dbl>, Viviendas_sin_refrigerador <dbl>,
## #   Viviendas_sin_excusado <dbl>, Viviendas_sin_agua_entubada <dbl>,
## #   Viviendas_piso_tierra <dbl>, Pob_analfabeta <dbl>,
## #   Pob_sin_servicios_salud <dbl>, Gini <dbl>,
## #   Grado_cohesion_social <chr>, Grado_de_polarizacion <chr>,
## #   Poblacion_cat <chr>, Pob_miles <dbl>

Calcula el número de personas en pobreza extrema en cada municipio.

  1. Resumir: Crear valores con la información en las columnas de la base de datos:
summarise(cohesion_rezago, media_pob = mean(Poblacion, na.rm = TRUE))
## # A tibble: 1 x 1
##   media_pob
##       <dbl>
## 1    45740.
summarise(cohesion_rezago, media_pob = mean(Poblacion, na.rm = TRUE), 
    mediana_pob = mean(Poblacion, na.rm = TRUE), 
    min_pob = min(Poblacion, na.rm = TRUE), 
    max_pob = max(Poblacion, na.rm = TRUE))
## # A tibble: 1 x 4
##   media_pob mediana_pob min_pob max_pob
##       <dbl>       <dbl>   <dbl>   <dbl>
## 1    45740.      45740.      93 1815786

¿Cuál es el promedio de analfabetismo municipal?
            ¿Cuántos analfabetas hay en México?
            ¿Cuántos analfabetas hay en tu estado?
            ¿Cuántos municipios clasifican en alto rezago social?

¡Demasiada información!

Aprender algo nuevo es difícil e intimidante, para todos!

scared

scared

Pero el dolor pasa :D

computer
(Available at https://gph.is/1LjlEFE, Sep 13, 2018)

Recursos

Existen muchos recursos gratuitos para aprender R, y resolver nuestras dudas, enlistamos algunos.

Datos