Saltar al contenido

Reseña: datos Importación

Esta es la segunda parte de una serie de tres partes sobre el lenguaje de programación R. La Parte 1 mostró cómo importar datos a R, la Parte 2 se centra en la limpieza de datos (cómo escribir el código R que realizará las tareas básicas de limpieza de datos), y la Parte 3 da una mirada en profundidad a la visualización de datos.

Como se examinó en la primera parte, la aplicabilidad de la R en entornos empresariales sigue atrayendo a nuevos usuarios tanto por su creciente popularidad como por su enfoque pragmático del análisis de datos. Hemos visto cómo los datos pueden ser importados a R desde un archivo de texto delimitado. En este post, mostraremos cómo escribir código R que realizará tareas básicas de limpieza de datos usando el paquete tidyr de una manera que es mucho menos propensa a errores que manipular manualmente las celdas en una hoja de cálculo.

Reseña: datos Importación
Reseña: datos Importación

Hablando de hojas de cálculo, una hoja de cálculo legible suele incluir o excluir características que son esenciales para un procesamiento de datos preciso. Al igual que una hoja de cálculo, la R también puede utilizarse para procesar datos y mostrarlos. Sin embargo, R separa en gran medida estas dos preocupaciones. R proporciona comandos y scripts interactivos para el procesamiento de datos. Esos guiones pueden mostrar los datos a medida que se procesan, pero a menudo están orientados al procesamiento de los datos. R y RStudio también incluyen características para producir salida específicamente renderizada para el consumo humano como imágenes, informes y presentaciones.

Para procesar los datos en un guión, es necesario asegurarse de que los datos estén en una forma consistente e inequívoca. Echaremos un vistazo a los paquetes actuales que fueron diseñados específicamente para limpiar y reformatear los datos. Estos proporcionan un pequeño lenguaje que consiste en unas pocas ideas clave que pueden ser utilizadas para realizar la mayoría de las actividades comunes de limpieza de datos.

El mismo archivo separado por comas introducido en la Parte 1 representa los datos a procesar.

“Año”, “Mes”, “Trimestre”, “Saldo”, “Retirada”

“1, 2000, 1, Q1, 10000, NA

“2”,NA, “2”,NA,NA,NA

“3”,NA, “3”,NA,NA,NA

“4”,NA, “4”, “Q2”,6000,4000

“5”,NA, “5”,NA,NA,NA

“6”,NA, “6”,NA,NA,NA

“7”,NA, “7”, “Q3”,NA,NA

“8”,NA, “8”,NA,3000,3000

“9”,NA, “9”,NA,2000,1000

“10”,NA, “10”, “Q4”,NA,NA

“11”,NA, “11”,NA,NA,NA

“12”,NA, “12”,NA,1000,1000

Si realizó los pasos enumerados en la Parte 1, puede volver a ejecutar el comando que fue generado por RStudio cuando importó estos datos. Hay dos argumentos para la llamada a la función, el primero es la ruta al csv. Esta ruta puede variar dependiendo del nombre del archivo y de dónde reside en su sistema. El tipo de barras utilizadas dependen del sistema operativo, y ciertos símbolos (como ~ que indica el directorio principal del usuario) también dependen del sistema operativo. Si está ejecutando R en un entorno que no es Windows, como OSX o Unix, y el csv se guardó en un directorio llamado Desktop en el directorio principal del usuario, el comando aparecerá de la siguiente manera:

df <- read.csv("~/Desktop/test.csv", stringsAsFactors=FALSE)

Los datos se presentan en una forma común a las hojas de cálculo; se desglosan de manera que sean legibles para la gente. Se omiten ciertos valores ya que se asume que se debe usar un valor previamente listado o cero. El procesamiento de un archivo en ese formato produce resultados imprevistos ya que la mayoría de los flujos de trabajo de análisis de datos están diseñados para importaciones de datos con un formato rígido que se ajustan a un conjunto de reglas más estrictas y menos ambiguas.

Limpieza de datos

En este paso, los datos se formatean y reestructuran de manera que se adapten mejor al análisis posterior.

La falta de datos, representada por NA (sí, eso es no disponible ), puede introducir dificultades. Esta designación puede utilizarse para describir datos faltantes, irrelevantes, sin sentido o desconocidos. Para la mayoría de la gente está claro que los valores perdidos en Año, Trimestre y Balance simplemente se excluyen por redundancia. Sin embargo, las NAs que aparecen bajo la columna de retiro indican que se retiraron cero dólares. La funcionalidad en el paquete tidyr reemplaza los valores NA.

df <- df %>%

fill(Year, Quarter, Balance) %>%

replace_na(list(Withdrawal = 0))

Este fragmento de código realiza las siguientes operaciones:

  • Comienza con el marco de datos que contiene los datos importados de la hoja de cálculo; estos datos se almacenan en la variable df.
  • Reemplazar los valores NA en las columnas Año, Trimestre y Balance del marco de datos df utilizando el valor del registro anterior.
  • Reemplaza los valores de NA en la columna de Retirada por cero.
  • Asigne este nuevo conjunto de datos a la variable (df) que contenía el conjunto de datos original tal como se importó; el conjunto de datos original se sobrescribe con los nuevos valores.

Hay un par de operadores R que vale la pena mencionar ya que aparecen en otro código aquí. El operador <- está formado por dos caracteres que se supone que deben parecerse a una flecha. Indica que el valor derivado de la expresión a la derecha de la flecha debe ser asignado a la variable de la izquierda. Este operador es tan poderoso que la expresión anterior podría ser reescrita usando sólo este operador.

tmp1 <- fill(df, Year, Quarter, Balance)

tmp2 <- replace_na(tmp1, list(Withdrawal = 0))

df <- tmp2

Evitamos las asignaciones de variables extras en el fragmento de código original escondiéndolas. Lo hicimos representando una serie de operaciones en secuencia que pasaban los datos de una etapa del proceso a otra.

El operador de tres caracteres %>% es un operador de “tubería” que sirve como taquigrafía, eliminando la necesidad de las asignaciones de variables adicionales. Envía la salida de la expresión de la izquierda como entrada a la expresión de la derecha. Con este operador en uso, el ejemplo original dicta que el marco de datos referenciado por la variable df se envía como entrada a la función de llenado. A continuación, el marco de datos que fue devuelto desde la llamada a la función de relleno se envía como entrada a la llamada a la función replace_na. Finalmente, este marco de datos devuelto se asigna a la variable df, sobrescribiendo su contenido original.

Este operador de tuberías se utiliza en otros paquetes R para crear un código que requiere menos definiciones de variables y que se puede leer de izquierda a derecha; casi como leer el inglés.

El marco de datos cuando se ve ahora no contiene valores NA.

Integración de datos

Muchas funciones estadísticas están disponibles en el idioma R y utilizan nombres conocidos; estas funciones pueden ejecutarse en la consola. En los siguientes ejemplos, se hace referencia a una columna del marco de datos por su nombre en el marco de datos (df). Se utiliza un $ para separar el nombre del marco de datos y el nombre de la columna. Al principio de la línea aparece el símbolo de indicación>. La llamada a la función introducida por el usuario se muestra en azul al lado del aviso, y la salida del comando se muestra en negro:

> mean(df$Withdrawal)

[1] 750

> min(df$Retirada)

[1] 0

> max(df$Withdrawal)

[1] 4000

Estas funciones particulares se ejecutan con tanta frecuencia en el análisis estadístico que hay una sola función que devuelve todos estos resultados inmediatamente:

> resumen(df$Retirada)

Min. 1er Qu. Media Media 3er Qu. Máximo

0 0 0 750 1000 4000

Por supuesto, en el análisis financiero, es mucho más común calcular sumas, que siguen el mismo patrón de llamada de función que se muestra arriba:

> sum(df$Retirada)

[1] 9000

Si es más fácil visualizar los datos en un gráfico, se puede crear un diagrama de líneas con una llamada a la función de trazado especificando type=”l” para la línea:

plot(df$Withdrawal, type=”l”)

Estos son sólo algunos ejemplos comunes; el lenguaje base R incluye toda la funcionalidad necesaria para manejar la mayoría de la manipulación y el trazado de datos. Sin embargo, ciertos paquetes proveen este tipo de funcionalidad usando una sintaxis mucho más fácil de leer y recordar.

Filtrado y ordenamiento de datos

El paquete dplyr fue escrito para filtrar y ordenar los datos almacenados en los marcos de datos. Basándose en los datos introducidos anteriormente, una lista de meses y sus correspondientes saldos (en los que había una cantidad de retirada mayor que cero) tiene el siguiente aspecto:

Saldo del mes

1 4 6000

2 8 3000

3 9 2000

4 12 1000

La función de filtro limita el número de filas visualizadas, mientras que la función de selección limita las columnas que se visualizan. El resultado anterior puede crearse utilizando la siguiente expresión:

df %>% filter(Withdrawal> 0) %>% select(Month, Balance)

El cambio de la disposición de este informe en orden descendente (por mes) implica simplemente añadir un tubo adicional y llamar a la función de disposición al recorte que se indica arriba:

%>% arrange(desc(Month))

Aunque el operador del tubo no es necesario, hace que sea sencillo añadir un paso de procesamiento adicional al final de una secuencia anterior. Esto permite realizar la manipulación de datos y construir una tubería final que realiza todos los pasos de una manera controlada y predecible, libre de los errores que a menudo ocurren cuando se manipula manualmente una hoja de cálculo.

Datos de agrupación

El paquete dplyr también incluye capacidades para agrupar datos, junto con la posibilidad de crear resúmenes a nivel de grupo y derivar nuevas columnas. Supongamos que quisiéramos producir un informe que enumerara cada trimestre, junto con la cantidad total y promedio de retiro por mes:

Retiros trimestrales PromedioMensualRetiros

1 Cuarto 1 0 0.00

2 Cuarto 2 4000 1333.33

3 Cuarto 3 4000 1333.33

4 Cuarto 4 1000 333,33

El paquete dplyr incluye la función de mutación que se puede utilizar para crear columnas derivadas (en este caso sustituyendo cada Q por la palabra Quarter deletreada). También incluye la función group_by que asigna el nivel utilizado para la integración posterior, y la función de integración que se utiliza para crear la suma, la media u otro cálculo al nivel previamente especificado en la llamada group_by:

df %>% mutate(Quarter=gsub($0027Q$0027, $0027Quarter $0027, Quarter)) %>%

group_by(Quarter) %>%

resumir(Retiros = suma(Retiros), PromedioMensualRetiros=redondo(promedio(Retiros),2))

A diferencia de las hojas de cálculo, estas funciones también pueden utilizarse para realizar una manipulación elaborada de los marcos de datos. De igual manera, R y dplyr pueden escribir este tipo de manipulaciones para que se realicen casi instantáneamente y sin errores.

Para llevar

Ahora deberías tener un mejor manejo de la limpieza y manipulación de datos usando dos paquetes R tidyr y dplyr. Estén atentos a la tercera parte cuando veamos cómo crear gráficos y diagramas estéticamente agradables e informativos usando el paquete ggplot2.