| year | id | rank | dept1 | dept2 |
|---|---|---|---|---|
| 2021-22 | 1005 | Lecturer | Chemistry | |
| 2021-22 | 1022 | Professor | Physics | Engineering |
| 2021-22 | 1059 | Professor | Physics | |
| 2021-22 | 1079 | Lecturer | Music | |
| 2021-22 | 1086 | Assistant Professor | Music | |
| 2021-22 | 1095 | Adjunct Instructor | Sociology |
Unidad II - Manejo de Datos con R
(Material adaptado de STREAMLINING WITH R de Meghan Hall, 2022)
Estrategias de Análisis y Preparación de Datos
Universidad Peruana de Ciencias Aplicadas
R es un lenguaje de programación (libre!) para trabajar con datos.
Se complementa fácilmente con otras herramientas de manejo de datos (como Excel)
La magia del R es que es reproducible (por otra persona o por ti mismo luego de un tiempo)
Mantiene los datos separados del código (preparación de datos paso a paso)
Necesitamos el lenguaje R
y también el software RStudio
los archivos del proyecto están aquí
los datos importados están por aquí
el código puede ejecutarse aquí
los archivos del proyecto están aquí
los datos importados están por aquí
el código puede
también ir por aquí
El archivo MarketingDirecto.csv contiene datos de un vendedor de marketing directo el cuál vende sus productos sólo a través de correos electrónicos personalizados. El vendedor envía catálogos a los clientes con las características de los productos, y estos ordenan directamente de los catálogos.
El responsable de marketing ha desarrollado registros de clientes para aprender qué hace que algunos clientes gasten más que otros. El conjunto de datos incluye \(n = 1000\) clientes y las siguientes variables:
Edad: Grupo etario del cliente (Adulta/Media/Joven).
Genero: Género del cliente (Masculino/Femenino).
Vivienda: Si el cliente es dueño de su casa (Propia/Alquilada)
Ecivil: Estado civil (Soltero/Casado).
`Ubicacion: Ubicación de un negocio que vende productos similares en términos de distancia (Lejos/Cerca).
Salario: Sueldo anual de los clientes (en dólares)
Hijos: Número de hijos (0-3).
`Historial: Historial del volumen de compra anterior (Bajo/Medio/Alto/NA). NA significa que este cliente aún no ha adquirido ningún producto.
Catalogos: Número de catálogos enviados.
Monto: Gasto en dólares
Puedes usar R a través de paquetes (librerías)
…que contienen funciones
…que son como verbos
meta paquete de R que carga ocho paquetes principales cuando se invoca y también agrupa muchos otros paquetes al momento de la instalación
los paquetes tidyverse comparten una filosofía de diseño, una gramática común y estructuras de datos
faculty
| year | id | rank | dept1 | dept2 |
|---|---|---|---|---|
| 2021-22 | 1005 | Lecturer | Chemistry | |
| 2021-22 | 1022 | Professor | Physics | Engineering |
| 2021-22 | 1059 | Professor | Physics | |
| 2021-22 | 1079 | Lecturer | Music | |
| 2021-22 | 1086 | Assistant Professor | Music | |
| 2021-22 | 1095 | Adjunct Instructor | Sociology |
courses
| semester | course_id | faculty_id | dept | enrollment | level |
|---|---|---|---|---|---|
| 20212202 | 10605 | 1772 | Physics | 7 | UG |
| 20212202 | 10605 | 1772 | Physics | 32 | GR |
| 20212202 | 11426 | 1820 | Political Science | 8 | UG |
| 20212202 | 12048 | 1914 | English | 24 | UG |
| 20212202 | 13269 | 1095 | Sociology | 48 | UG |
| 20212202 | 13517 | 1086 | Music | 17 | UG |
<-
“almacenar como”
Alt + -
%>%
“y entonces”
Cmd + shift + m
Calcular la media del número de alumnos inscritos
# A tibble: 6 × 6
semester course_id faculty_id dept enrollment level
<dbl> <dbl> <dbl> <chr> <dbl> <chr>
1 20212202 10605 1772 Physics 7 UG
2 20212202 10605 1772 Physics 32 GR
3 20212202 11426 1820 Political Science 8 UG
4 20212202 12048 1914 English 24 UG
5 20212202 13269 1095 Sociology 48 UG
6 20212202 13517 1086 Music 17 UG
Error in eval(expr, envir, enclos): objeto 'enrollment' no encontrado
Enfoque 1: Con attach():
No recomendable. ¿Qué pasaría si tuviera otro conjunto de datos con el que está trabajando al mismo tiempo llamado que también tuviera una variable llamada enrollment?
Enfoque 2: Usando $:
Enfoque 4: El enfoque de tidyverse:
# A tibble: 1 × 1
mean_enrollment
<dbl>
1 28.8
Las funciones tidyverse toman un argumento data que les permite localizar cálculos dentro del marco de datos especificado
no enturbia el concepto de lo que hay en el entorno actual: siempre se accede a las variables desde dentro de un marco de datos sin el uso de una función adicional (como with()) o comillas, nunca como un vector
filter mantiene o elimina filas (observaciones)
select mantiene o elimina columnas (variables)
arrange ordena el conjunto de datos por cierta variable(s)
count calcula frecuencias para cierta variable(s)
mutate crea nuevas mariables
group_by/summarize agrega datos (tablas pivote!)
str_* prefijo de funciones para trabajar con texto
function(data, argument(s))
es lo mismo que
data %>%
function(argument(s))
filter mantiene o descarta filas (observaciones)
El operador == evalúa igualdad (comparación)
| year | id | rank | dept1 | dept2 |
|---|---|---|---|---|
| 2021-22 | 1095 | Adjunct Instructor | Sociology | |
| 2021-22 | 1118 | Assistant Professor | Sociology | |
| 2021-22 | 1161 | Assistant Professor | Sociology | |
| 2021-22 | 1191 | Professor | Sociology | |
| 2021-22 | 1216 | Associate Professor | Sociology | American Studies |
| 2021-22 | 1273 | Assistant Professor | Sociology |
El operador | significa “o”
| year | id | rank | dept1 | dept2 |
|---|---|---|---|---|
| 2021-22 | 1022 | Professor | Physics | Engineering |
| 2021-22 | 1059 | Professor | Physics | |
| 2021-22 | 1095 | Adjunct Instructor | Sociology | |
| 2021-22 | 1118 | Assistant Professor | Sociology | |
| 2021-22 | 1161 | Assistant Professor | Sociology | |
| 2021-22 | 1191 | Professor | Sociology |
El operador %in% permite seleccionar múltiples opciones en una lista
| year | id | rank | dept1 | dept2 |
|---|---|---|---|---|
| 2021-22 | 1022 | Professor | Physics | Engineering |
| 2021-22 | 1059 | Professor | Physics | |
| 2021-22 | 1079 | Lecturer | Music | |
| 2021-22 | 1086 | Assistant Professor | Music | |
| 2021-22 | 1095 | Adjunct Instructor | Sociology | |
| 2021-22 | 1118 | Assistant Professor | Sociology |
El operador & combina condiciones
| year | id | rank | dept1 | dept2 |
|---|---|---|---|---|
| 2021-22 | 1022 | Professor | Physics | Engineering |
| 2021-22 | 1059 | Professor | Physics | |
| 2021-22 | 1191 | Professor | Sociology | |
| 2021-22 | 1201 | Professor | Physics | |
| 2021-22 | 1209 | Professor | Music | |
| 2021-22 | 1421 | Professor | Physics | Engineering |
select mantiene o descarta columnas (variables)
puede eliminar columnas con -column
El operador pipe %>% encadena múltiples funciones juntas
arrange ordena el conjunto de datos de acuerdo con cierta variable(s)
Usar desc() para ordenar descendentemente
| semester | course_id | faculty_id | dept | enrollment | level |
|---|---|---|---|---|---|
| 20212201 | 10511 | 1005 | Chemistry | 50 | UG |
| 20212201 | 15934 | 1421 | Physics | 50 | UG |
| 20192002 | 13850 | 1105 | Chemistry | 50 | UG |
| 20181901 | 17773 | 1942 | Music | 50 | UG |
| 20212202 | 13269 | 1095 | Sociology | 48 | UG |
| 20202101 | 16202 | 1816 | Political Science | 48 | UG |
Es posible ordenar de acuerdo con varias variables.
| semester | course_id | faculty_id | dept | enrollment | level |
|---|---|---|---|---|---|
| 20212201 | 10511 | 1005 | Chemistry | 50 | UG |
| 20192002 | 13850 | 1105 | Chemistry | 50 | UG |
| 20202102 | 13850 | 1258 | Chemistry | 39 | UG |
| 20202102 | 16606 | 1393 | Chemistry | 38 | UG |
| 20202101 | 16540 | 1784 | Chemistry | 38 | UG |
| 20181901 | 10511 | 1829 | Chemistry | 36 | UG |
count muestra distribuciones de frecuencias de variables (muy útil para familiarizarse con los datos)
Puede usar sort = TRUE para ordenar los resultados
mutate crea nuevas variables (con un = simple)
| year | id | rank | dept1 | dept2 | new |
|---|---|---|---|---|---|
| 2021-22 | 1005 | Lecturer | Chemistry | hello! | |
| 2021-22 | 1022 | Professor | Physics | Engineering | hello! |
| 2021-22 | 1059 | Professor | Physics | hello! | |
| 2021-22 | 1079 | Lecturer | Music | hello! | |
| 2021-22 | 1086 | Assistant Professor | Music | hello! | |
| 2021-22 | 1095 | Adjunct Instructor | Sociology | hello! |
mucho más útil con una estructura condicional como ifelse(), la cuál tiene tres argumentos:
condición, valor si es verdadero, valor si es falso
el operador ! significa no (negación)
is.na() identifica valores perdidos
con múltiples condiciones, case_when() es mucho más sencillo!
| dept1 | division |
|---|---|
| Chemistry | Sciences |
| Physics | Sciences |
| Physics | Sciences |
| Music | Humanities |
| Music | Humanities |
| Sociology | Social Sciences |
group_by/summarize agrupa datos (tablas pivote!)
group_by() identifica la variable(s) de agrupación y summarize() especifica la agregación.
funciones útiles en summarize:
mean, median, sd, min, max, n
los archivos del proyecto están aquí
los datos importados están por aquí
el código puede
también ir por aquí
Escribiendo en la consola
Piense en ello como un post-it: útil para notas rápidas pero desechable
las acciones se guardan pero el código no
se ejecuta un trozo de código a la vez (Return).
Escribir en un archivo de código
los archivos de script tienen una extensión .R
el código se guarda y se pueden ejecutar secciones de cualquier tamaño (Cmd + Return)
¡haga ~95% de su escritura en un archivo de código en lugar de la consola!
los paquetes deben instalarse en cada computadora que use
los paquetes deben cargarse/adjuntarse con library() al comienzo de cada sesión
puede acceder a los archivos de ayuda escribiendo ??tidyverse o ??mutate en la consola
use read_csv() para importar datos de un archivo csv
el paquete readxl es útil para archivos en Excel
ver los datos con View(faculty) o haciendo clic en el nombre de los datos en el panel Environment
las funciones stringr (todas inician con str_) son útiles para trabajar con datos de texto
| year | id | rank | dept1 | dept2 |
|---|---|---|---|---|
| 2021-22 | 1022 | Professor | Physics | Engineering |
| 2021-22 | 1059 | Professor | Physics | |
| 2021-22 | 1086 | Assistant Professor | Music | |
| 2021-22 | 1118 | Assistant Professor | Sociology | |
| 2021-22 | 1158 | Assistant Professor | Political Science | |
| 2021-22 | 1161 | Assistant Professor | Sociology |
cheat sheet de funciones está aquí
los datos de faculty existentes tienen una fila por profesor, algunos pertenecen a varios departamentos (a veces conocidos como datos wide)
| year | id | rank | dept1 | dept2 |
|---|---|---|---|---|
| 2021-22 | 1005 | Lecturer | Chemistry | |
| 2021-22 | 1022 | Professor | Physics | Engineering |
| 2021-22 | 1059 | Professor | Physics | |
| 2021-22 | 1079 | Lecturer | Music | |
| 2021-22 | 1086 | Assistant Professor | Music | |
| 2021-22 | 1095 | Adjunct Instructor | Sociology |
¿Qué sucede si, en cambio, desea una fila por profesor por departamento? (a veces conocido como datos long)
| year | id | rank | dept_no | dept |
|---|---|---|---|---|
| 2021-22 | 1005 | Lecturer | dept1 | Chemistry |
| 2021-22 | 1022 | Professor | dept1 | Physics |
| 2021-22 | 1022 | Professor | dept2 | Engineering |
| 2021-22 | 1059 | Professor | dept1 | Physics |
| 2021-22 | 1079 | Lecturer | dept1 | Music |
| 2021-22 | 1086 | Assistant Professor | dept1 | Music |
la función pivot_longer alarga los datos
¡y pivot_wider hace lo contrario!
| semester | course_id | faculty_id | dept | enrollment | level |
|---|---|---|---|---|---|
| 20212202 | 10605 | 1772 | Physics | 7 | UG |
| 20212202 | 10605 | 1772 | Physics | 32 | GR |
R tiene muchas funciones útiles para manejar datos relacionales
todo lo que se requiere es tener al menos una variable tipo llave que conecte los conjuntos de datos
left_join es lo más usual, pero hay más
¿Cuál es la inscripción promedio de estudiantes de pregrado (UG) por año y categoría de docente?
faculty
| year | id | rank | dept1 | dept2 |
|---|---|---|---|---|
| 2021-22 | 1005 | Lecturer | Chemistry | |
| 2021-22 | 1022 | Professor | Physics | Engineering |
| 2021-22 | 1059 | Professor | Physics | |
| 2021-22 | 1079 | Lecturer | Music |
courses
| semester | course_id | faculty_id | dept | enrollment | level |
|---|---|---|---|---|---|
| 20212202 | 10605 | 1772 | Physics | 7 | UG |
| 20212202 | 10605 | 1772 | Physics | 32 | GR |
| 20212202 | 11426 | 1820 | Political Science | 8 | UG |
| 20212202 | 12048 | 1914 | English | 24 | UG |
faculty$id es simimlar a courses$faculty_id
¿Cuál es la media de estudiantes inscritos de pregrado (UG) por año y categoría de docente?
| semester | course_id | faculty_id | dept | enrollment | level |
|---|---|---|---|---|---|
| 20212202 | 10605 | 1772 | Physics | 7 | UG |
| 20212202 | 10605 | 1772 | Physics | 32 | GR |
| 20212202 | 11426 | 1820 | Political Science | 8 | UG |
| 20212202 | 12048 | 1914 | English | 24 | UG |
| 20212202 | 13269 | 1095 | Sociology | 48 | UG |
UGyear nuevamenteenrollment por year y faculty_iduse el operador <- para crear un nuevo dataframe courses_UG
filter solo los cursos de pregrado y mutate una nueva variable con el año académico
group_by año y código del profesor; summarize contando el número de inscritos
| year | faculty_id | enr |
|---|---|---|
| 2018-19 | 1059 | 35 |
| 2018-19 | 1086 | 14 |
| 2018-19 | 1102 | 37 |
| 2018-19 | 1203 | 25 |
¿Cuál es la media de estudiantes inscritos de pregrado (UG) por año y categoría de docente?
faculty
| year | id | rank | dept1 | dept2 |
|---|---|---|---|---|
| 2021-22 | 1005 | Lecturer | Chemistry | |
| 2021-22 | 1022 | Professor | Physics | Engineering |
| 2021-22 | 1059 | Professor | Physics | |
| 2021-22 | 1079 | Lecturer | Music | |
| 2021-22 | 1086 | Assistant Professor | Music | |
| 2021-22 | 1095 | Adjunct Instructor | Sociology |
courses_UG
| year | faculty_id | enr |
|---|---|---|
| 2021-22 | 1005 | 50 |
| 2021-22 | 1086 | 17 |
| 2021-22 | 1095 | 48 |
| 2021-22 | 1128 | 32 |
| 2021-22 | 1147 | 32 |
| 2021-22 | 1191 | 7 |
1
2
3
| year | id | rank | dept1 | dept2 | enr |
|---|---|---|---|---|---|
| 2021-22 | 1005 | Lecturer | Chemistry | 50 | |
| 2021-22 | 1022 | Professor | Physics | Engineering | |
| 2021-22 | 1059 | Professor | Physics | ||
| 2021-22 | 1079 | Lecturer | Music | ||
| 2021-22 | 1086 | Assistant Professor | Music | 17 | |
| 2021-22 | 1095 | Adjunct Instructor | Sociology | 48 |
¿Cuál es la media de estudiantes inscritos de pregrado (UG) por año y categoría de docente?
| year | rank | avg_enr |
|---|---|---|
| 2021-22 | Adjunct Instructor | 34.66667 |
| 2021-22 | Assistant Professor | 23.60000 |
| 2021-22 | Associate Professor | 17.25000 |
| 2021-22 | Lecturer | 31.83333 |
| 2021-22 | Professor | 32.16667 |
| 2021-22 | Visiting Researcher |
ggplot2 es el paquete de visualización de datos que se carga con tidyverse
la gramática de los gráficos asigna datos a los atributos estéticos de los puntos geométricos
la codificación de datos en señales visuales o canales (p. ej., longitud, color, posición, tamaño) es la forma en que representamos los cambios y las comparaciones
para combinar líneas en un fragmento de código, use + en lugar de %>%
puede crear una gráfica con mejor presentación con bastante facilidad
faculty %>%
count(rank) %>%
ggplot(aes(x = reorder(rank, -n), y = n)) +
geom_bar(stat = "identity", fill = "#cc0000") +
scale_y_continuous(expand = expansion(mult = c(0, 0.1))) +
geom_text(aes(label = n), vjust = -0.5) +
labs(x = NULL, y = NULL,
title = "Count of faculty by rank, 2018-2021") +
theme_linedraw() +
theme(panel.grid.major.x = element_blank(),
axis.ticks = element_blank())fac_enr %>%
filter(!is.na(avg_enr)) %>%
ggplot(aes(x = year, y = avg_enr, group = rank, color = rank)) +
geom_line() +
geom_point() +
scale_color_brewer(type = "qual", palette = "Dark2") +
labs(x = NULL, y = "Average enrollment",
title = "Average undergraduate enrollment per rank over time") +
theme_linedraw() +
theme(panel.grid.major.x = element_blank(),
axis.ticks = element_blank(),
legend.title = element_blank(),
legend.background = element_rect(fill = NA),
legend.key = element_rect(fill = NA),
legend.position = c(0.85, 0.82))Data Visualization: a practical introduction
creating custom themes
the ggplot2 book
the R graph gallery
con lo que hemos hecho hasta ahora, su archivo .R podría:
y ese archivo haría extremadamente fácil para ti o para otra persona reproducir este análisis con nuevos datos dentro de un tiempo
utilizando RStudio, se pueden crear documentos .Rmd que combinen texto, código y gráficos
muchos formatos de salida: html, pdf, Word, diapositivas
sumamente útil para informes parametrizados: puede crear un informe PDF basado en R y generarlo automáticamente para, por ejemplo, cada departamento
también puedes crear tus propios paquetes!
tu paquete puede contener:
ggplot2 personalizadosse puede almacenar en una unidad compartida para facilitar la colaboración
R Markdown
the official R Markdown website
R Markdown: The Definitive Guide
Paquetes internos
a comprehensive theoretical explainer
R for Data Science: the ultimate guide
R for Excel users: un taller muy útil
STAT 545: libro en linea con análisis de datos reproducibles en R
Portal Web RStudio Education
Portal Web Learn tidyverse