Material de Clase: Limpieza, Organización y Preparación de Datos en R

Introducción

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.

1. Importación y Exploración de Datos

1.1 Importación 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")

1.2 Exploración Inicial de Datos

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)

2. Manejo de Datos Faltantes

2.1 Identificación de Datos Faltantes

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)

2.2 Manejo de Datos Faltantes

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)

3. Limpieza de Datos

3.1 Detección y Corrección de Errores

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)

3.2 Normalización de Datos

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)

4. Transformación y Organización de Datos

4.1 Selección y Filtrado de Datos

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)

4.2 Creación de Nuevas Variables

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"
    ))

4.3 Reshape de Datos

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)

5. Unión y Combinación de Datos

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")

6. Documentación y Reproducibilidad

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.

Ejemplo: Limpieza y Preparación de una Base de Datos de Ventas

Paso 1: Importación y Exploración de Datos

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)

Paso 2: Manejo de Datos Faltantes

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)

Paso 3: Limpieza de Datos

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)

Paso 4: Transformación y Organización de Datos

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)

Paso 5: Unión y Combinación de Datos

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")

Paso 6: Documentación y Reproducibilidad

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)

Manejo de Datos Faltantes

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)

Transformación y Organización de Datos

ventas <- ventas %>%
  mutate(Categoria_Ventas = case_when(
    Ventas.Totales > 500 ~ "Alta",
    Ventas.Totales > 200 & Ventas.Totales <= 500 ~ "Media",
    TRUE ~ "Baja"
  ))

Unión y Combinación de Datos

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")

```

Conclusión

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.