Manipulación de datos con R

Análisis de encuesta

Author

Edimer David Jaramillo

Bibliotecas R

Code
library(tidyverse) # Manipulación de datos y gráficosos
library(lubridate) # Manipulación de fechas y tiempoo
library(readxl)    # Lectura de archivos de excel (.xls o .xlsx)

Encuesta

Code
mis_nombres <- c(
  "promedio_academico",
  "tiempo_casa_u",
  "distancia_casa_u",
  "abandonar_universidad",
  "medio_transporte",
  "electivas",
  "numero_azar",
  "trabajo",
  "matematicas",
  "pregunta_tiempo",
  "sistema_educativo"
)

encuesta <- read_excel("Encuesta-Respuestas.xlsx") %>% 
  set_names(mis_nombres)

encuesta

Manipulación de datos

Procesos frecuentes


Estructura general

Code
encuesta %>% 
  glimpse()
Rows: 29
Columns: 11
$ promedio_academico    <chr> "4.44", "4.3", "4.0", "4.1", "3.7", "4", "4.0", ~
$ tiempo_casa_u         <chr> "45", "25", "40", "40 minutos", "30min", "40", "~
$ distancia_casa_u      <chr> "13.7", "13.1", "13.4", "12 km", "2.7km", "2.92"~
$ abandonar_universidad <chr> "No", "No", "Sí", "Sí", "Sí", "No", "Sí", "No", ~
$ medio_transporte      <chr> "Transporte público", "Transporte público", "Tra~
$ electivas             <chr> "Sí", "Sí", "No", "No", "Sí", "Sí", "Sí", "Sí", ~
$ numero_azar           <dbl> 5, 2, 3, 5, 7, 5, 7, 2, 6, 5, 3, 0, 3, 4, 8, 1, ~
$ trabajo               <chr> "No", "No", "Sí", "No", "No", "No", "No", "No", ~
$ matematicas           <chr> "5", "4.05", "4", "3.8", "3.5", "4.56", "4.08", ~
$ pregunta_tiempo       <chr> "El tiempo, es algo que se medie y con el cual a~
$ sistema_educativo     <chr> "Me gusta que hoy en dia una gran parte de joven~

Conteo de registros

  • Podemos usar la función count() para contar registros:
Code
encuesta %>% 
  count()
  • También podemos contar registros para una variable específica:
Code
encuesta %>% 
  count(trabajo)
  • Es posible obtener el conteo para más de una variable categórica:
Code
encuesta %>% 
  count(trabajo, abandonar_universidad)
  • ¿Cuál fue el número elegido al azar con mayor frecuencia?
Code
encuesta %>% 
  count(numero_azar)

Reordenar filas

  • Podemos dar orden ascendente a las filas con la función arrange():
Code
encuesta %>% 
  arrange(numero_azar)
  • También es posible dar orden descendente a las filas con la función desc():
Code
encuesta %>% 
  arrange(desc(numero_azar))

Seleccionar columnas

  • Podemos usar la función select() para seleccionar columnas:
Code
encuesta %>% 
  select(trabajo, numero_azar, tiempo_casa_u)

Filtrar filas

  • Podemos filtrar filas a través de la posición con la función slice()
  • Podemos filtar filas con base en una o más condiciones a través de la función filter():
Code
encuesta %>% 
  filter(trabajo == "No")
  • Podemos aplicar más de un filtro:
Code
encuesta %>% 
  filter(trabajo == "No") %>% 
  filter(numero_azar > 5)

Mutar columnas

  • Con la función mutate() podemos editar las variables existentes y crear nuevas variables.
Code
encuesta_final <-
  encuesta %>%
  mutate(
    promedio_academico = as.numeric(promedio_academico),
    tiempo_casa_u = str_extract_all(
      string = tiempo_casa_u,
      pattern = "[0-9]+",
      simplify = TRUE
    ),
    tiempo_casa_u = as.numeric(tiempo_casa_u),
    distancia_casa_u = str_replace_all(distancia_casa_u,
                                       pattern = "km",
                                       replacement = ""),
    distancia_casa_u = str_replace_all(distancia_casa_u,
                                       pattern = ",",
                                       replacement = "."),
    distancia_casa_u = as.numeric(distancia_casa_u),
    matematicas = as.numeric(matematicas),
    velocidad = distancia_casa_u / tiempo_casa_u
  ) 

encuesta_final
  • Podemos exportar la base de datos depurada:
Code
write_csv(x = encuesta_final, file = "EncuestaDepurada.csv")

summarise()

  • ¿Cuál es el promedio y la mediana del promedio académico?
Code
encuesta_final %>% 
  summarise(promedio = mean(promedio_academico),
            mediana = median(promedio_academico))
  • ¿Qué implica que sean similares la media y la mediana? ¿Simetría?
Code
encuesta_final %>% 
  ggplot(aes(x = promedio_academico)) +
  geom_density() +
  geom_vline(xintercept = 3.906207, color = "blue") +
  geom_rug()

Resumir datos

Code
encuesta_final %>% 
  group_by(trabajo) %>% 
  summarise(promedio = mean(promedio_academico),
            mediana = median(promedio_academico),
            N = n()) %>% 
  ungroup()
  • ¿Cuál es la velocidad promedio para cada medio de transporte?
Code
encuesta_final %>% 
  group_by(medio_transporte) %>% 
  summarise(prom_velocidad = mean(velocidad),
            min_velocidad = min(velocidad),
            max_velocidad = max(velocidad),
            N = n()) %>% 
  ungroup()
  • ¿Podemos representar el resultado anterior a través de un gráfico?
Code
encuesta_final %>% 
  group_by(medio_transporte) %>% 
  summarise(prom_velocidad = mean(velocidad)) %>% 
  ungroup() %>% 
  ggplot(aes(x = medio_transporte, y = prom_velocidad)) +
  geom_col() +
  labs(x = "Medio de transporte",
       y = "Velocidad (km/minuto)")

  • También podemos comparar la distribución de las velocidades para cada medio de transporte:
Code
encuesta_final %>% 
  ggplot(aes(x = medio_transporte, y = velocidad)) +
  geom_boxplot() +
  labs(x = "Medio de transporte",
       y = "Velocidad (km/minuto)") +
  coord_flip()

  • Podemos agregar un gráfico de violín al boxplot anterior: en este caso no es muy diciente por el número de datos, sin embargo, cuando el volumen de información aumenta es recomendado considerar graficar boxplot y violín juntos.
Code
encuesta_final %>% 
  ggplot(aes(x = medio_transporte, y = velocidad)) +
  geom_violin() +
  geom_boxplot() +
  labs(x = "Medio de transporte",
       y = "Velocidad (km/minuto)")

Pregunta 11

Nube de palabras

Code
library(wordcloud) # Nube de palabras
library(tidytext)  # Tokens 
library(tm)        # Manipulación de texto - StopWordss
library(jcolors)   # Colores

stop_words_spanish <- data.frame(word = stopwords("spanish"))

conteo_p11 <-
  encuesta_final %>%
  select(sistema_educativo) %>%
  unnest_tokens(word, sistema_educativo) %>%
  anti_join(stop_words_spanish) %>%
  count(word, sort = TRUE)

wordcloud(
  words = conteo_p11$word,
  freq = conteo_p11$n,
  max.words = 100,
  random.order = FALSE,
  colors = jcolors("pal3")
)

n-gramas (n = 2)

Code
bigramas_p11 <-
  encuesta_final %>%
  select(sistema_educativo) %>%
  unnest_tokens(bigram, sistema_educativo, token = "ngrams", n = 2) %>% 
  count(bigram)

wordcloud(
  words = bigramas_p11$bigram,
  freq = bigramas_p11$n,
  max.words = 100,
  random.order = FALSE,
  colors = jcolors("pal3")
)

n-gramas (n = 3)

Code
trigramas_p11 <-
  encuesta_final %>%
  select(sistema_educativo) %>%
  unnest_tokens(bigram, sistema_educativo, token = "ngrams", n = 3) %>% 
  count(bigram)

wordcloud(
  words = trigramas_p11$bigram,
  freq = trigramas_p11$n,
  max.words = 100,
  random.order = FALSE,
  colors = jcolors("pal3")
)

Modelo matemático

  • Problema 1: si una persona está interesada en estimar (o predecir) el tiempo que le tomaría llegar a la universidad desde un lugar ubicado a una distancia de 7.83 km, ¿Qué modelo le recomendaría a esta persona?
  • Problema 2: la misma persona del problema 1 ahora nos menciona que se movilizará hasta la universidad en motocicleta, ¿cambia en algo su modelo? ¿Cuántos modelos son posibles?