Tidyverse es un conjunto de paquetes de R diseñado para simplificar y mejorar el flujo de trabajo en el análisis de datos y la visualización. Fue desarrollado por Hadley Wickham y su equipo con el objetivo de hacer que R sea más accesible y efectivo para científicos de datos, analistas y cualquier persona que trabaje con datos.
Características Clave de Tidyverse
Esquema básico de proceso de ciencia de Datos según Tidyverse
En el contexto de la ciencia de datos en R y el tidyverse, los conceptos clave se dividen en diferentes etapas del proceso de análisis de datos. A continuación, se explica cada uno de estos conceptos:
Import (Importar): Esta etapa se refiere a la importación de datos desde fuentes externas hacia R. Puedes usar paquetes como readr (dentro de tidyverse) para cargar datos desde archivos CSV, Excel, bases de datos u otras fuentes. El objetivo es obtener los datos necesarios para su posterior análisis.
Tidy (Ordenar): Una vez que los datos están en R, es importante organizarlos de manera que sean “limpios” y estén en un formato estructurado y ordenado. El paquete tidyr dentro de tidyverse es utilizado para llevar a cabo esta tarea, lo que implica asegurarse de que cada variable esté en una columna y que cada fila corresponda a una única observación.
Transform (Transformar): En esta etapa, se realizan transformaciones en los datos para prepararlos para su análisis. Esto puede incluir la creación de nuevas variables, el filtrado de datos, la agregación de información y la modificación de formatos. El paquete dplyr es esencial para realizar estas transformaciones de manera eficiente.
Model (Modelar): Aquí es donde se construyen modelos estadísticos o de aprendizaje automático para comprender mejor los datos y hacer predicciones. El paquete tidymodels dentro de tidyverse proporciona herramientas para construir, ajustar y evaluar modelos.
Visualize (Visualizar): La visualización de datos es una parte crucial del proceso de ciencia de datos. El paquete ggplot2 es ampliamente utilizado en tidyverse para crear gráficos y visualizaciones informativas que ayuden a comprender los patrones y las relaciones en los datos.
Communicate (Comunicar): Finalmente, es importante comunicar los resultados y hallazgos de manera efectiva. R Markdown es una herramienta comúnmente utilizada para crear informes y documentos reproducibles que incluyen análisis de datos, visualizaciones y narraciones. Los informes pueden ser compartidos con colegas o stakeholders para tomar decisiones informadas.
Estas etapas representan un flujo de trabajo típico en la ciencia de datos utilizando R y el tidyverse. Es importante notar que el proceso puede ser cíclico, ya que a menudo se requiere volver atrás y ajustar las etapas anteriores a medida que se obtiene una mejor comprensión de los datos y se refina el análisis. El tidyverse proporciona una serie de paquetes que hacen que cada una de estas etapas sea más eficiente y accesible, lo que facilita la creación de flujos de trabajo de ciencia de datos efectivos en R.
Paquetes en Tidyverse
Paquetes Relevantes de tidyverse en el proceso de ciencia de datos
Tidyverse incluye varios paquetes útiles, algunos de los cuales son:
readr: Utilizado para la importación eficiente de datos desde archivos planos.
readxl: Permite importar datos desde archivos Excel.
haven: Facilita la importación y exportación de datos en formatos SPSS, SAS y Stata.
tibble: Ofrece mejoras en la creación y visualización de Data Frames en R, lo que facilita la exploración de datos.
tidyr: Se centra en la organización y transformación de la estructura de datos para que cumplan con los principios de datos ordenados.
dplyr: Utilizado para realizar operaciones de manipulación y transformación de datos, como filtrado, selección, agregación y creación de nuevas variables.
purrr: Útil para programación funcional y trabajar con listas y vectores.
forcats: Ayuda en la manipulación de factores, incluyendo la reordenación y la gestión de niveles de factores.
stringr: Permite la manipulación de cadenas de texto de manera más efectiva.
lubridate: Facilita la manipulación y cálculos de fechas y horas, esencial para el trabajo con series de tiempo y datos temporales.
ggplot2: Un poderoso paquete de visualización que permite crear gráficos y visualizaciones de datos declarativamente
Para cargar todos estos paquetes y usarlos en nuestras tareas de ciencia de datos y estadística, solo debemos ejecutar el siguiente comando:
library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr 1.1.3 ✔ readr 2.1.4
✔ forcats 1.0.0 ✔ stringr 1.5.0
✔ ggplot2 3.4.3 ✔ tibble 3.2.1
✔ lubridate 1.9.3 ✔ tidyr 1.3.0
✔ purrr 1.0.2
── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
✖ dplyr::filter() masks stats::filter()
✖ dplyr::lag() masks stats::lag()
ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
Datos de Costos médicos personales
Para esta guía vamos a trabajar con los datos insurance del paquete liver. Este conjunto de datos es una fuente de información médica y costos facturados por compañías de seguros de salud. Los datos contenidos en esta tabla se originan en el libro “Machine Learning with R” escrito por Brett Lantz. La tabla consiste en 1338 observaciones, lo que equivale a 1338 registros individuales, y comprende un total de 7 variables que capturan información relacionada con seguros médicos y gastos de atención médica. para cargar estos datos en R debemos ejecutar los siguientes comandos:
# install.packages("liver") # Correr solo si no está instalado el paquete liverdata( insurance , package ="liver" )
La descripción de cada una de las variables es la siguiente:
age: Indica la edad del titular del seguro médico, es decir, la persona asegurada. La edad se mide en años.
gender: Registra el género del titular del seguro médico y puede tomar dos valores: “male” (hombre) o “female” (mujer). Esta variable se utiliza para analizar las diferencias de costos de atención médica entre géneros.
bmi: El índice de masa corporal (BMI) proporciona información sobre el peso relativo de una persona en relación con su altura. Representa una medida numérica y no incluye “Body Mass Index” en su nombre.
children: Indica el número de hijos o dependientes que están cubiertos por el seguro médico del titular.
smoker: Es una variable binaria que indica si el titular del seguro es fumador o no. Puede tomar dos valores: “yes” (sí, fumador) o “no” (no fumador).
region: Registra la región geográfica de residencia del titular del seguro médico y se categoriza en cuatro regiones: “northeast” (Noreste), “southeast” (Sureste), “southwest” (Suroeste) y “northwest” (Noroeste).
charge: Representa los costos individuales de atención médica facturados por las compañías de seguros de salud. Esta variable se encuentra en dolares de Estados Unidos (USD).
La descripción de los datos se puede observar en R con el siguiente comando
??insurance
starting httpd help server ... done
Luego entra a la opción live::insurance en el panel de ayuda.
Visión previa de los datos (glimpse)
La función glimpse te proporcionará una descripción concisa de la estructura y el contenido del conjunto de datos “insurance”. La salida incluirá información sobre el número de observaciones y variables, los nombres de las variables, los tipos de datos de las variables y algunos valores de ejemplo. Esta visión general facilita la comprensión y exploración inicial de los datos antes de realizar análisis más detallados.
# Utiliza la función glimpse para obtener una visión general de los datosglimpse(insurance)
Rows: 1,338
Columns: 7
$ age <int> 19, 18, 28, 33, 32, 31, 46, 37, 37, 60, 25, 62, 23, 56, 27, 1…
$ bmi <dbl> 27.900, 33.770, 33.000, 22.705, 28.880, 25.740, 33.440, 27.74…
$ children <int> 0, 1, 3, 0, 0, 0, 1, 3, 2, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0…
$ smoker <fct> yes, no, no, no, no, no, no, no, no, no, no, yes, no, no, yes…
$ gender <fct> female, male, male, male, male, female, female, female, male,…
$ region <fct> southwest, southeast, southeast, northwest, northwest, southe…
$ charge <dbl> 16884.924, 1725.552, 4449.462, 21984.471, 3866.855, 3756.622,…
El operador pipe %>%
pipline: una abstracción de la realidad
El operador %>%, conocido como el operador “pipe” o “pipe operator”, es una característica poderosa en R que se utiliza para encadenar y simplificar secuencias de operaciones en un flujo de trabajo de análisis de datos. El operador %>% es una parte esencial del paquete dplyr dentro del tidyverse y se utiliza comúnmente para mejorar la legibilidad y la eficiencia del código en R. A continuación, se proporciona una explicación detallada de cómo funciona este operador:
Sintaxis del Operador %>%: El operador %>% se utiliza para tomar el resultado de una expresión y pasarlo como argumento a la siguiente expresión, como si estuvieras “encajando” las operaciones una dentro de la otra. La sintaxis básica es la siguiente: Es el resultado que deseas pasar a la siguiente expresión.
Legibilidad mejorada: El operador %>% permite escribir código de manera más legible y comprensible, ya que las operaciones se ejecutan en el orden en que se escriben, de izquierda a derecha.
Reducción de anidamiento: Evita la necesidad de anidar múltiples paréntesis o funciones dentro de otras funciones, lo que simplifica el código y reduce errores de escritura.
Flujo de trabajo modular: Facilita la creación de un flujo de trabajo modular, donde cada operación se realiza de forma independiente, lo que hace que el código sea más mantenible y fácil de depurar.
Aquí hay un ejemplo de cómo usar el operador %>% con el conjunto de datos “insurance” para realizar una serie de operaciones:
resultados <- insurance %>%filter(age >30) %>%# Filtrar personas mayores de 30 años select(gender, charge) %>%# Seleccionar solo las columnas de edad y cargos group_by(gender) %>%# Agrupar por sexosummarize(mean_charges =mean(charge)) # Calcular el promedio de los cargos # Ver los resultados resultados
# A tibble: 2 × 2
gender mean_charges
<fct> <dbl>
1 female 14454.
2 male 15937.
En este ejemplo, estamos realizando una serie de operaciones en el conjunto de datos “insurance” usando el operador %>%. Aquí está cómo funciona:
filter(age > 30): Filtra las filas en las que la edad (columna “age”) es mayor de 30.
select(age, charge): Selecciona solo las columnas de “gender” y “charges” para su posterior procesamiento.
group_by(gender): Agrupa los datos por la columna “gender” para calcular estadísticas específicas para cada grupo de género.
summarize(mean_charges = mean(charge)): Calcula el promedio de los valores en la columna “charges” para cada grupo de edad.
El resultado es un nuevo conjunto de datos llamado “resultados” que contiene las edades y los promedios de los cargos para cada grupo de edad. El uso del operador %>% facilita la escritura de código más limpio y comprensible al secuenciar estas operaciones de manera fluida.
Manipulación de datos (tidyverse)
A continuación se presentan las funciones más utilizadas en la manipulación de tablas de datos o data.frame. Cuadros con información en las que las filas representan observaciones, registros, individuos
Cómo son las tablas en R
Manipulación de Datos con dplyr
Introducción a dplyr
Descripción: En esta sección, aprenderás sobre dplyr, una librería de tidyverse que facilita la manipulación de datos en R. dplyr proporciona una serie de funciones poderosas para realizar operaciones comunes en conjuntos de datos, lo que te permitirá trabajar de manera eficiente con tus datos.
Funciones Clave de dplyr
filter - Filtrar Filas:
Descripción: La función filter te permite seleccionar un subconjunto de filas que cumplan con condiciones específicas. En el ejemplo, estamos filtrando pacientes con un índice de masa corporal (BMI) superior a 50.
# Filtrar pacientes con un BMI superior a 30result_filter <- insurance %>%filter(bmi >50) result_filter
age bmi children smoker gender region charge
1 23 50.38 1 no male southeast 2438.055
2 22 52.58 1 yes male southeast 44501.398
3 18 53.13 0 no male southeast 1163.463
select - Seleccionar Columnas:
Descripción:select permite elegir las columnas específicas que deseas mantener en tu conjunto de datos. En este caso, estamos seleccionando las columnas “age,” “sex,” y “charges.”
# Seleccionar las columnas "age," "gender," y "charges." result_select <- insurance %>%select(age, gender, charge)result_select %>%head()
age gender charge
1 19 female 16884.924
2 18 male 1725.552
3 28 male 4449.462
4 33 male 21984.471
5 32 male 3866.855
6 31 female 3756.622
mutate - Crear o Modificar Columnas:
Descripción: La función mutate se utiliza para crear nuevas columnas o modificar las existentes. En el ejemplo, estamos calculando el costo promedio de seguro y también el costo total de seguro por cada persona cobijada.
# Calcular el costo promedio de seguro por año y el costo total de seguroresult_mutate <- insurance %>%mutate( avg_insurance_cost =mean(charge), insurance_cost_per_person = charge / (children +1) )result_mutate %>%head()
age bmi children smoker gender region charge avg_insurance_cost
1 19 27.900 0 yes female southwest 16884.924 13270.42
2 18 33.770 1 no male southeast 1725.552 13270.42
3 28 33.000 3 no male southeast 4449.462 13270.42
4 33 22.705 0 no male northwest 21984.471 13270.42
5 32 28.880 0 no male northwest 3866.855 13270.42
6 31 25.740 0 no female southeast 3756.622 13270.42
insurance_cost_per_person
1 16884.9240
2 862.7762
3 1112.3655
4 21984.4706
5 3866.8552
6 3756.6216
arrange - Ordenar Filas:
Descripción:arrange se utiliza para ordenar las filas de tu conjunto de datos. En este caso, estamos ordenando los datos por edad en orden ascendente.
# Ordenar los datos por el costo de mayor a menor y luego por edadresult_arrange <- insurance %>%arrange(age , desc(charge) ) result_arrange %>%head()
age bmi children smoker gender region charge
1 18 42.240 0 yes female southeast 38792.69
2 18 38.170 0 yes male southeast 36307.80
3 18 36.850 0 yes female southeast 36149.48
4 18 33.535 0 yes male northeast 34617.84
5 18 31.680 2 yes male southeast 34303.17
6 18 31.730 0 yes male northeast 33732.69
Agregar y Resumir Datos
summarize - Calcular Estadísticas de Resumen:
Descripción: La función summarize te permite calcular estadísticas resumen de tus datos. En este ejemplo, calculamos el promedio de los cargos médicos en la tabla “insurance” y también la suma total de los cargos.
# Calcular el promedio de los cargos médicos y la suma total en la tabla "insurance." result_summarize <- insurance %>%summarize(promedio_cargos =mean(charge),uma_total_cargos =sum(charge) ) result_summarize
Descripción: Con group_by, puedes agrupar tus datos en función de una variable específica. En este caso, estamos agrupando los datos por la columna “region” y calculando el promedio de los cargos médicos y la suma total para cada región.
# Agrupar los datos por región para calcular estadísticas específicas result_group_by <- insurance %>%group_by(region) %>%summarize(promedio_cargos =mean(charge),suma_total_cargos =sum(charge) ) result_group_by
Descripción: La función count te permite contar la cantidad de datos disponibles por las categorías de una o más columnas de la tabla. En este ejemplo, calculamos la cantidad de observaciones según los valores de las columnas género y fumador en la tabla “insurance”.
# Cuenta elementos según las combinaciones de valores en gender y smoker.result_count <- insurance %>%count( gender , smoker ) result_count
gender smoker n
1 female yes 115
2 female no 547
3 male yes 159
4 male no 517
Joins (Uniones) de Tablas con join:
Funciones para combinar tablas “join”
Descripción: Las funciones de join te permiten combinar dos tablas utilizando una o más columnas en común. Vamos a crear una tabla artificial con atributos de regiones de Estados Unidos, con información de su nombre y abreviatura, luego procederemos a unirlas con las funciones join.
# tabla con abreviaciones de regionesus_region <-tibble(region =c("midwest", "west", "northeast", "southeast"),abv =c("MW", "W", "NE", "SE"))# Ejemplo de left_joinleft_join_result <- insurance %>%left_join(us_region, by ="region")# Ejemplo de full_joinfull_join_result <- insurance %>%full_join(us_region, by ="region")# Ejemplo de inner_joininner_join_result <- insurance %>%inner_join(us_region, by ="region")# Ejemplo de anti_joinanti_join_result <- insurance %>%anti_join(us_region, by ="region")
En estos ejemplos:
left_join combina la tabla “insurance” con “us_region” utilizando la columna “region” como clave de unión y conserva todas las filas de “insurance,” incluyendo las que no tienen coincidencias en “us_region.”
full_join combina ambas tablas y conserva todas las filas de ambas tablas, incluyendo las que no tienen coincidencias en la otra tabla. Si no hay coincidencia en “us_region,” se llenarán las columnas correspondientes con valores NA.
inner_join combina ambas tablas y conserva solo las filas que tienen coincidencias en ambas tablas según la columna “region.”
anti_join dará como resultado las filas de “insurance” que no tienen coincidencias en la columna “region” con la tabla “us_region”. Estas filas representarán las regiones que no están presentes en “us_region.”
Estas descripciones detalladas te ayudarán a comprender completamente lo que hace cada función en los ejemplos proporcionados, incluyendo la creación de más variables en las funciones mutate y summarize. Puedes copiar y pegar estos códigos en tu entorno de R para experimentar y practicar con la manipulación de datos utilizando dplyr.
Limpieza de Datos con tidyr
Introducción a tidyr
La librería tidyr se utiliza para reorganizar y limpiar datos desordenados. Comencemos con una introducción básica.
spread - Reorganización de datos de formato largo a ancho
La función spread de tidyr se utiliza para transformar datos de formato largo a ancho. Esto es útil cuando tienes una columna que representa diferentes categorías o variables, y deseas que estas se conviertan en columnas separadas. En el ejemplo vamos a trabajar sobre los datos de conteo agregados del ejemplo de la función count y los vamos a convertir a formato ancho.
# Vamos a tomar esta consulta como formato largoresult_count <- insurance %>%count( gender , smoker ) result_count
gender smoker n
1 female yes 115
2 female no 547
3 male yes 159
4 male no 517
# Ahora lo convertimos a formato anchoresult_spread <-spread(result_count, key = gender, value = n) result_spread
smoker female male
1 yes 115 159
2 no 547 517
gather - Reorganización de datos de formato ancho a largo
La función gather de tidyr se utiliza para transformar datos de formato ancho a largo. Esto es útil cuando tienes múltiples columnas que representan diferentes variables y deseas tener una sola columna para esas variables y una columna correspondiente para los valores.
# Reorganizar datos de formato ancho a largo con gather result_gathered <- result_spread %>%gather( key ="gender", value ="cuenta", -smoker)result_gathered
smoker gender cuenta
1 yes female 115
2 no female 547
3 yes male 159
4 no male 517
separate y unite - Separación y unión de columnas
Las funciones separate y unite de tidyr son útiles para dividir una columna en múltiples columnas o unir varias columnas en una. Esto es común cuando tienes información que se almacena en una sola columna y necesitas dividirla o combinarla para su análisis.
# Separar una columna en varias result_separated <- insurance %>%separate( col = region , into =c("r1", "r2"), sep ="t" )
age bmi children smoker gender r1 r2 charge
1 19 27.900 0 yes female sou hwes 16884.924
2 18 33.770 1 no male sou heas 1725.552
3 28 33.000 3 no male sou heas 4449.462
4 33 22.705 0 no male nor hwes 21984.471
5 32 28.880 0 no male nor hwes 3866.855
6 31 25.740 0 no female sou heas 3756.622
# Unir varias columnas en una result_united <- result_separated %>%unite( col = region , r1, r2, sep ="t" ) result_united %>%head()
age bmi children smoker gender region charge
1 19 27.900 0 yes female southwes 16884.924
2 18 33.770 1 no male southeas 1725.552
3 28 33.000 3 no male southeas 4449.462
4 33 22.705 0 no male northwes 21984.471
5 32 28.880 0 no male northwes 3866.855
6 31 25.740 0 no female southeas 3756.622
distinct - Identificación de valores únicos
La función distinct se utiliza para encontrar valores únicos en un conjunto de datos. Es útil para identificar registros únicos o para filtrar datos duplicados. Esta función puede ser utilizada para la eliminación de duplicados de una tabla, ajustando el parámetro .keep.all = TRUE
# Identificar valores únicos en la columna "region" unique_regions <-distinct(insurance, region) unique_regions %>%head()
region
1 southwest
2 southeast
3 northwest
4 northeast
### eliminando duplicados de todas laa columnasresult_nodup <- insurance %>%distinct( .keep_all =TRUE )print( insurance %>%nrow() )
[1] 1338
print( result_nodup %>%nrow() )
[1] 1337
Estas descripciones más detalladas explican el propósito y uso de cada función en el contexto de la limpieza y manipulación de datos con tidyr, utilizando ejemplos basados en la tabla “insurance.” Si tienes alguna pregunta adicional o necesitas más ejemplos, no dudes en preguntar.