¡Hola!


Les presentamos un documento RMarkdown renderizado a HTML :)


En este ejemplo vamos a ver cómo construir un archivo Rmarkdown que incluya texto, tablas y figuras en el documento.


El documento se divide en 3 partes:


Sintaxis


Los títulos se identifican anteponiendo numerales (#)


Con cada # que que se agrega pasamos a otro nivel de subtítulo


En el texto se pueden señalar palabras en:

  • negrita
  • itálica
  • itálica y negrita
  • tachado
  • resaltado
  • color


También se pueden cambiar el color del fondo y la alineación del texto o incluso agregar emojis 😉


Podemos incluir codigos y links como éste al capítulo sobre Rmarkdown del libro R para Ciencia de Datos en español.


Y muchas más opciones!


Bloques o ‘Chunks’ de código


Los bloques o ‘chunks’ son fragmentos de código incluidos en nuestro documento. Cada bloque comienza con ```{r} y termina con```.

Se agregan:

  • apretando Ctrl+Alt+I

  • haciendo click en Code > Insert Chunk


Dentro de ellos podemos escribir texto anteponiendo un #. Todo lo que este detrás del # no será leido.


Los códigos de bloque se pueden correr:

  • apretando Ctrl+Enter en la línea de código

  • haciendo click sobre la flecha verde en cada bloque


Dentro de los bloques podemos:

1. Indicar que se incluya una imagen

# comando para incluir una imagen
knitr::include_graphics("REINVENTARTEC 2022.png")


2. Realizar operaciones matemáticas

# ejemplo de operación matemática
2 + 2
## [1] 4


3. Configurar condiciones para futuros bloques

# para cambiar algunas opciones por default de los bloques 
knitr::opts_chunk$set(
  
          warning = FALSE, #evita que se muestren "warnings"
          message = FALSE, #evita que se muestren mensajes
          fig.align = 'center' #centra las imágenes
  
              )


4. Realizar análisis de datos!

Analizaremos el set de datos llamado “Datos 2010-2016.csv” (que pueden descargar de este link) pero ahora con R en vez de Python.



Para ver el documento final que incluye tanto el contenido como la salida de cualquier bloque de código de R debemos hacer clic en el botón Knit y listo!



Pasos para analizar datos en Rmarkdown


Paso 1: cargar los paquetes necesarios

Para cargar, manipular y vizualizar los datos debemos tener instalados ciertos paquetes y cargarlos.

La instalación se realiza una única vez y los paquetes se cargan cada vez que se inicia una sesión de R.

En este caso utilizaremos 2 paquetes:

  1. tidyverse (incluye varios paquetes diseñados para la ciencia de datos)
  2. janitor


Carguemos los paquetes:

# Instalación de los paquetes (solo la primera vez)
# Si nunca los instalaron, sacar el # que esta adelante de los siguientes comandos

# install.packages("tidyverse")
# install.packages("janitor")

# Carga de los paquetes
library(tidyverse)
library(janitor)


Paso 2: cargar la base de datos

Se pueden leer bases de datos en formato csv utilizando la función read.csv() y generando un objeto que los contenga.

#Creación de un objeto con los datos
datos <- read.csv(file="Datos 2010-2016.csv",
                  header=T)


Podemos ver la estructura de los datos utilizando la función glimpse().

# Para ver cuáles son las variables y de qué tipo son
glimpse(datos)
## Rows: 58,840
## Columns: 22
## $ AÃ.o                       <int> 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2~
## $ Tipo.de.Institucion        <chr> "Universidad ", "Universidad ", "Universida~
## $ Institucion                <chr> "Pontificia Universidad Catolica Argentina ~
## $ Institucion.New            <chr> "Pontificia Universidad Catolica Argentina ~
## $ Unidad.Academica           <chr> "Facultad de Artes y Ciencias Musicales", "~
## $ Unidad.Academica.New       <chr> "Facultad de Artes y Ciencias Musicales", "~
## $ Carrera                    <chr> "Musica", "Musica", "Musica", "Musica", "Mu~
## $ Titulo                     <chr> "Licenciado en Composicion", "Licenciado en~
## $ Gestion                    <chr> "Privada ", "Privada ", "Privada ", "Privad~
## $ Nivel.de.la.Oferta         <chr> "Grado ", "Grado ", "Grado ", "Pregrado", "~
## $ Total.de.Estudiantes       <chr> "144", "3", "53", "5", "36", "42", "350", "~
## $ Estudiantes.Varones        <chr> "111", "1", "34", "3", "27", "24", "268", "~
## $ Estudiantes.Mujeres        <chr> "33", "2", "19", "2", "9", "18", "82", "32"~
## $ Total.de.Nuevos.Inscriptos <chr> "40", "", "10", "", "10", "", "91", "35", "~
## $ Nuevos.Inscriptos.Varones  <chr> "27", "", "8", "", "7", "", "66", "27", "7"~
## $ Nuevos.Inscriptos.Mujeres  <chr> "13", "", "2", "", "3", "", "25", "8", "24"~
## $ Total.de.Reinscriptos      <chr> "104", "3", "43", "5", "26", "", "259", "12~
## $ Reinscriptos.Varones       <chr> "84", "1", "26", "3", "20", "", "202", "100~
## $ Reinscriptos.Mujeres       <chr> "20", "2", "17", "2", "6", "", "57", "24", ~
## $ Total.de.Egresados         <chr> "11", "2", "15", "", "", "7", "21", "2", "2~
## $ Egresados.Varones          <chr> "11", "1", "10", "", "", "6", "13", "", "9"~
## $ Egresados.Mujeres          <chr> "", "1", "5", "", "", "1", "8", "2", "18", ~


El set de datos tiene 58840 filas (observaciones) y 22 columnas (variables).

Debajo estan los nombres de las variables (detras de cada $), el tipo de variable (numérica o de caracteres) y algunos de los valores que toman.


En este ejemplo vamos a analizar la relación de ingresantes que se autoperciben mujeres o varones en las 10 carreras de postgrado con mayor número de ingresantes por lo que antes de realizar cualquier análisis hay que “limpiar” los datos.


Paso 3: limpieza de datos

Este paso suele ser uno de los más tediosos pero también de los más importantes!


Pero no se preocupen, R lo hace rápido y para este taller ya traemos la solución 😉


Estos son los pasos para obetener la tabla de datos “limpia” de las 10 carreras de postgrado con mayor número de ingresantes para los análisis.

# Generaremos un nuevo objeto con los datos de interés 
# a partir del set original de datos

datos_limpios <- datos %>% 
  
  # renombramos las columnas sin mayúsculas y con "_" entre palabras
  clean_names() %>% 

  # seleccionamos las variables de interés
  select(nivel_de_la_oferta,
         carrera,
         total_de_nuevos_inscriptos,
         nuevos_inscriptos_varones,
         nuevos_inscriptos_mujeres) %>% 
  
  # convertimos a factor el nivel y la carrera
  mutate(across(c(nivel_de_la_oferta,
                  carrera), 
                as.factor)) %>% 
  
  # convertimos a números los inscriptos
  mutate(across(c(total_de_nuevos_inscriptos,
                  nuevos_inscriptos_varones,
                  nuevos_inscriptos_mujeres), 
                as.numeric)) %>% 
  
  # reemplazamos los valores faltantes (NA) por 0
  mutate_if(is.numeric, ~replace_na(., 0)) %>%  
  
  # filtramos las carreras de posgrado
  filter(nivel_de_la_oferta=="Posgrado") %>% 
  
  # eliminamos la columna de "nivel_de_la_oferta"
  select(-nivel_de_la_oferta)%>% 
  
  # agrupamos los datos por carrera
  group_by(carrera)%>% 
  
  # sumamos los valores por carrera
  summarise(across(everything(), sum))%>% 

  # seleccionamos las 10 carreras con más personas inscriptas
  top_n(10,total_de_nuevos_inscriptos) %>% 
  
  # renombramos las variables
  rename("Carrera" = carrera, 
         "Total" = total_de_nuevos_inscriptos, 
         "Varones" = nuevos_inscriptos_varones,
         "Mujeres" = nuevos_inscriptos_mujeres)


Ahora sí pasemos a algo más divertido 😁


Paso 4: analizar los datos


Podemos simplemente visualizar los datos


En una tabla


datos_limpios %>%
  kableExtra::kbl(caption = "Tabla 1. Número  de ingresantes totales y que se autoperciben mujeres o varones en las 10 carreras de postgrado con mayor número  de ingresantes.") %>%
  kableExtra::kable_classic(full_width = F, html_font = "Helvetica", font_size = 12)


Tabla 1. Número de ingresantes totales y que se autoperciben mujeres o varones en las 10 carreras de postgrado con mayor número de ingresantes.
Carrera Total Varones Mujeres
Ciencia Politica 8764 4092 4672
Ciencias de la Educacion 18571 4258 14313
Contabilidad 6163 2695 3468
Derecho y Ciencias Juridicas 33674 15089 18585
Finanzas y Negocios 8190 5514 2676
Formacion Docente de Nivel Superior y Universitario 7476 2701 4775
Gestion y Administracion de Empresas 15937 10054 5883
Medicina 25010 10118 14892
Psicologia 11592 2463 9129
Sociologia 9483 3112 6371


Con un gráfico


datos_limpios %>%
  pivot_longer(!c(Carrera, Total), names_to = "Género", values_to = "N") %>% 
    ggplot(aes(x =reorder(Carrera, N), y =N)) +
      geom_col(aes(fill=Género), stat = "identity")+ 
      scale_fill_viridis_d() +
      scale_x_discrete(labels = label_wrap_gen(width = 27))+
      coord_flip() + 
      labs(x = NULL, y = "Número de personas")+
      theme_minimal()+ 
      theme(legend.text = element_text(size = 12),
            legend.position = "bottom",
            axis.text = element_text(size = 12),
            title = element_text(size = 12, hjust = 0.5))

O también podemos estimar (y visualizar) valores de interés

  datos_limpios %>%
    pivot_longer(!c(Carrera, Total), 
                 names_to = "Género", values_to = "N") %>% 
  group_by(Género)%>% 
  summarise(total = sum(N)) %>% 
  mutate(porcentaje = total/sum(total),
         ymax = cumsum(porcentaje),
         ymin = c(0, head(ymax, n=-1)),
         labelPosition = (ymax + ymin) / 2,
         label = paste0(Género, "\n value: ", total)) %>% 
    ggplot(aes(x=2, y=porcentaje, fill=Género)) +
      geom_bar(stat = "identity") +
      xlim(0.5, 2.5) +
      coord_polar(start = 0, theta = "y") +
      labs(x = "", 
           y = "", 
           title = "Representación de género de las 10 carreras\nde postgrado con más ingresantes\nentre 2010 y 2016",
           fill= NULL) +
      scale_fill_viridis_d() +
      geom_text(aes(label = scales::percent(porcentaje)),
                size = 6, position = position_stack(vjust = 0.5),
                colour = c(rep("white", 1), 1))+
      theme_void() +
      theme(legend.text = element_text(size = 16),
            legend.position = "bottom",
            title = element_text(size = 16))


Esperamos que les haya gustado!


El material para este documento lo pueden encontrar en este repositorio de GitHub