En este material, aprenderemos cómo limpiar, organizar y preparar datos para su análisis en R. Nos enfocaremos en las herramientas más útiles para estas tareas, aplicando técnicas comunes en el manejo de datos.
R ofrece varias funciones para importar datos desde diferentes formatos. Aquí hay algunos ejemplos:
CSV: read.csv()
# Importar un archivo CSV
data <- read.csv("ruta/al/archivo.csv", stringsAsFactors = FALSE)
Excel: read_excel()
(requiere el
paquete readxl
)
library(readxl)
# Importar un archivo Excel
data <- read_excel("ruta/al/archivo.xlsx", sheet = 1)
Texto: read.table()
# Importar un archivo de texto
data <- read.table("ruta/al/archivo.txt", header = TRUE, sep = "\t")
Una vez que los datos han sido importados, es esencial explorarlos para entender su estructura:
Estructura del DataFrame: str()
# Ver la estructura del dataframe
str(data)
Resumen de los Datos: summary()
# Resumen estadístico de los datos
summary(data)
Primeras y Últimas Filas: head()
y
tail()
# Primeras 6 filas del dataframe
head(data)
# Últimas 6 filas del dataframe
tail(data)
Dimensiones del DataFrame:
dim()
# Número de filas y columnas
dim(data)
Es importante identificar si hay datos faltantes en tu base de datos:
Verificar Datos Faltantes:
is.na()
# Detectar valores faltantes en un dataframe
missing_values <- is.na(data)
Revisar si hay Datos Faltantes:
anyNA()
# Verificar si hay algún NA en el dataframe
anyNA(data)
Existen varias estrategias para manejar datos faltantes, dependiendo del contexto:
Eliminar Filas con NA:
na.omit()
# Eliminar filas que contienen NA
data_clean <- na.omit(data)
Imputación Simple: Usando la media para imputar
# Reemplazar NA con la media de la columna
data$columna <- ifelse(is.na(data$columna), mean(data$columna, na.rm = TRUE), data$columna)
Revisar tus datos en busca de valores atípicos o errores:
Visualización de Valores Atípicos:
boxplot()
# Crear un boxplot para detectar outliers
boxplot(data$variable)
Resumen de la Variable:
summary()
# Resumen de la variable para identificar valores extremos
summary(data$variable)
Valores Únicos en una Variable:
unique()
# Ver valores únicos en una columna
unique(data$columna)
Frecuencia de Valores: table()
# Tabla de frecuencias de una columna categórica
table(data$categoria)
Consiste en asegurar que las variables están en un formato uniforme:
Convertir a Factor: as.factor()
# Convertir una columna a factor
data$columna <- as.factor(data$columna)
Manejo de Fechas: lubridate
library(lubridate)
# Convertir una columna a fecha
data$fecha <- ymd(data$fecha)
Selecciona columnas específicas y filtra filas con base en condiciones:
Selección de Columnas: select()
library(dplyr)
# Seleccionar columnas específicas
data_subset <- select(data, columna1, columna2)
Filtrado de Filas: filter()
# Filtrar filas donde una columna cumple una condición
data_filtered <- filter(data, columna1 > 10)
Derivar nuevas variables con base en las existentes:
Mutación de Datos: mutate()
# Crear una nueva columna
data <- mutate(data, nueva_variable = columna1 * columna2)
Condicionales en Mutación:
case_when()
# Crear una variable categórica con condiciones
data <- mutate(data, categoria = case_when(
columna1 > 10 ~ "Alta",
columna1 <= 10 ~ "Baja"
))
Transformar entre formatos largos y anchos:
Convertir a Formato Largo:
pivot_longer()
library(tidyr)
# Convertir de formato ancho a largo
data_long <- pivot_longer(data, cols = starts_with("columna"), names_to = "nombre_variable", values_to = "valor")
Convertir a Formato Ancho:
pivot_wider()
# Convertir de formato largo a ancho
data_wide <- pivot_wider(data_long, names_from = nombre_variable, values_from = valor)
Combina tablas de datos utilizando diferentes tipos de uniones:
Unión Izquierda: left_join()
# Unión de dos tablas con una unión izquierda
combined_data <- left_join(tabla1, tabla2, by = "llave_comun")
Unión Completa: full_join()
# Unión completa de dos tablas
combined_data <- full_join(tabla1, tabla2, by = "llave_comun")
Es fundamental documentar y hacer reproducible el trabajo:
Documentación: Agrega comentarios en el código y usa RMarkdown para generar reportes completos que incluyen código, texto y gráficos.
## Título del Proyecto
### Objetivos
Explicar los objetivos de la limpieza y transformación de datos.
```r
# Código R que realiza la tarea
```
Reproducibilidad: Usa RMarkdown para generar reportes reproducibles, donde el código y el análisis son transparentes y replicables.
Imaginemos que tienes un archivo CSV llamado
ventas_tienda.csv
con la siguiente estructura:
Fecha,Producto,Precio,Cantidad,Ventas Totales,Cliente,ID_Cliente,Edad,Genero,Region
2024-01-01,Producto A,100,,300,Juan Perez,1,34,M,Huila
2024-01-02,Producto B,150,2,,Maria Gomez,2,29,F,Bogota
2024-01-03,Producto A,100,1,100,Miguel Torres,,23,M,Cundinamarca
2024-01-04,Producto C,200,3,600,,4,41,F,Boyaca
Código: Importar los datos y explorarlos
# Importar el archivo CSV
ventas <- read.csv("ventas_tienda.csv", stringsAsFactors = FALSE)
# Exploración inicial
str(ventas)
summary(ventas)
head(ventas)
Notamos que hay valores faltantes en las columnas
Cantidad
, Ventas Totales
, y
ID_Cliente
. Vamos a manejarlos de diferentes maneras:
Código: Identificación y manejo de datos faltantes
# Verificar datos faltantes
missing_values <- anyNA(ventas)
cat("¿Hay valores faltantes?", missing_values, "\n")
# Imputación de cantidad faltante usando la mediana (por simplicidad)
ventas$Cantidad <- ifelse(is.na(ventas$Cantidad), median(ventas$Cantidad, na.rm = TRUE), ventas$Cantidad)
# Calcular 'Ventas Totales' cuando es NA
ventas$Ventas.Totales <- ifelse(is.na(ventas$Ventas.Totales), ventas$Precio * ventas$Cantidad, ventas$Ventas.Totales)
# Eliminar filas sin ID de cliente
ventas <- na.omit(ventas)
Vamos a revisar si hay valores atípicos en el precio y corregir errores comunes como duplicados en los datos:
Código: Limpieza de datos
# Detección de valores atípicos en el precio
boxplot(ventas$Precio, main="Boxplot de Precios")
# Eliminar filas duplicadas
ventas <- ventas[!duplicated(ventas), ]
# Convertir la columna 'Producto' en un factor
ventas$Producto <- as.factor(ventas$Producto)
Vamos a crear una nueva columna que clasifique las ventas en “Alta”, “Media”, o “Baja”, y seleccionaremos solo algunas columnas para nuestro análisis:
Código: Transformación de datos
# Clasificación de ventas
ventas <- ventas %>%
mutate(Categoria_Ventas = case_when(
Ventas.Totales > 500 ~ "Alta",
Ventas.Totales > 200 & Ventas.Totales <= 500 ~ "Media",
TRUE ~ "Baja"
))
# Selección de columnas de interés
ventas_seleccionadas <- select(ventas, Fecha, Producto, Ventas.Totales, Categoria_Ventas, Region)
Supongamos que tenemos otra tabla con información adicional sobre los clientes, y queremos combinarla con nuestra tabla de ventas:
Código: Unión de tablas
# Información adicional de clientes
info_clientes <- data.frame(
ID_Cliente = c(1, 2, 3, 4),
Ingresos = c(3000, 4500, 2200, 3700)
)
# Unión de la tabla de ventas con la tabla de clientes
ventas_completa <- left_join(ventas_seleccionadas, info_clientes, by = "ID_Cliente")
Para asegurar que todo el proceso sea reproducible, puedes documentar tu código en un archivo RMarkdown, generando un reporte en HTML o PDF.
Código: Ejemplo en RMarkdown
# Limpieza y Preparación de Datos de Ventas
En este documento, realizamos la limpieza y preparación de un conjunto de datos de ventas.
## Importación y Exploración de Datos
```r
ventas <- read.csv("ventas_tienda.csv", stringsAsFactors = FALSE)
str(ventas)
summary(ventas)
ventas$Cantidad <- ifelse(is.na(ventas$Cantidad), median(ventas$Cantidad, na.rm = TRUE), ventas$Cantidad)
ventas$Ventas.Totales <- ifelse(is.na(ventas$Ventas.Totales), ventas$Precio * ventas$Cantidad, ventas$Ventas.Totales)
ventas <- na.omit(ventas)
ventas <- ventas %>%
mutate(Categoria_Ventas = case_when(
Ventas.Totales > 500 ~ "Alta",
Ventas.Totales > 200 & Ventas.Totales <= 500 ~ "Media",
TRUE ~ "Baja"
))
info_clientes <- data.frame(
ID_Cliente = c(1, 2, 3, 4),
Ingresos = c(3000, 4500, 2200, 3700)
)
ventas_completa <- left_join(ventas_seleccionadas, info_clientes, by = "ID_Cliente")
```
Este ejemplo práctico muestra cómo limpiar, organizar y preparar datos para un análisis en R, siguiendo los pasos cubiertos en el material de clase. Los estudiantes pueden seguir este ejemplo, replicar el código en sus proyectos, y aplicar estas técnicas a conjuntos de datos más complejos en el futuro.