Limpieza y Manipulación con dplyr

Author

Scarlin Lopez S.

Published

June 13, 2026

Code
library(tidyverse)
library(tidyr)

Dataset de práctica

Code
ventas_crudas <- tibble(
  id_venta    = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3),
  vendedor    = c("ana", "PEDRO", "María ", NA, "carmen", "ana", "PEDRO", "luis", "carmen", "luis", "María "),
  region      = c("norte", "SUR", "Norte", "sur", "NORTE", "norte", "sur", "Norte", "sur", "norte", "Norte"),
  monto       = c(15000, 22000, 18500, NA, 31000, 16000, 19500, 9500000, 21000, 17500, 18500),
  mes         = c(1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 1),
  completada  = c("SI", "SI", "NO", "SI", NA, "SI", "NO", "SI", "SI", "NO", "NO")
)

Parte 1 — Diagnóstico inicial:

Code
glimpse(ventas_crudas)
Rows: 11
Columns: 6
$ id_venta   <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3
$ vendedor   <chr> "ana", "PEDRO", "María ", NA, "carmen", "ana", "PEDRO", "lu…
$ region     <chr> "norte", "SUR", "Norte", "sur", "NORTE", "norte", "sur", "N…
$ monto      <dbl> 15000, 22000, 18500, NA, 31000, 16000, 19500, 9500000, 2100…
$ mes        <dbl> 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 1
$ completada <chr> "SI", "SI", "NO", "SI", NA, "SI", "NO", "SI", "SI", "NO", "…
Code
summary(ventas_crudas)
    id_venta           vendedor        region       monto              mes   
 Min.   : 1.000   Length   :11   Length   :11   Min.   :  15000   Min.   :1  
 1st Qu.: 3.000   N.unique : 5   N.unique : 5   1st Qu.:  17750   1st Qu.:1  
 Median : 5.000   N.blank  : 0   N.blank  : 0   Median :  19000   Median :2  
 Mean   : 5.273   Min.nchar: 3   Min.nchar: 3   Mean   : 967900   Mean   :2  
 3rd Qu.: 7.500   Max.nchar: 6   Max.nchar: 5   3rd Qu.:  21750   3rd Qu.:3  
 Max.   :10.000   NAs      : 1                  Max.   :9500000   Max.   :3  
                                                NAs    :1                    
     completada
 Length   :11  
 N.unique : 2  
 N.blank  : 0  
 Min.nchar: 2  
 Max.nchar: 2  
 NAs      : 1  
               
Code
colSums(is.na(ventas_crudas))
  id_venta   vendedor     region      monto        mes completada 
         0          1          0          1          0          1 
Code
sum(duplicated(ventas_crudas$id_venta))
[1] 1
Note

Se encontró 1 registro duplicado correspondiente al id_venta = 3. Además, existen valores faltantes (NA) en las columnas vendedor, monto y completada, con un NA en cada una de ellas, mientras que las demás columnas no presentan valores faltantes. También se observa un posible outlier en la columna monto.

Parte 2 — Limpieza:

Code
ventas_limpias <- ventas_crudas |> distinct(id_venta, .keep_all = TRUE) |>

mutate(vendedor = str_trim(str_to_title(vendedor)), region = str_to_lower(str_trim(region))) |>

mutate(vendedor = replace_na(vendedor, "Desconocido") ) |>

group_by(mes) |> mutate(monto = if_else(is.na(monto), median(monto, na.rm = TRUE),monto )) |> ungroup() |>

  
mutate(completada = replace_na(completada, "NO"), completada = factor(completada, levels = c("SI", "NO")) )


Q1 <- quantile(ventas_limpias$monto, 0.25)
Q3 <- quantile(ventas_limpias$monto, 0.75)
iqr <- IQR(ventas_limpias$monto)

lim_inf <- Q1 - 1.5 * iqr
lim_sup <- Q3 + 1.5 * iqr

ventas_limpias <- ventas_limpias |> mutate( es_outlier = monto < lim_inf | monto > lim_sup)

glimpse(ventas_limpias)
Rows: 10
Columns: 7
$ id_venta   <dbl> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
$ vendedor   <chr> "Ana", "Pedro", "María", "Desconocido", "Carmen", "Ana", "P…
$ region     <chr> "norte", "sur", "norte", "sur", "norte", "norte", "sur", "n…
$ monto      <dbl> 15000, 22000, 18500, 23500, 31000, 16000, 19500, 9500000, 2…
$ mes        <dbl> 1, 1, 1, 2, 2, 2, 3, 3, 3, 3
$ completada <fct> SI, SI, NO, SI, NO, SI, NO, SI, SI, NO
$ es_outlier <lgl> FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALS…
Code
ventas_limpias |> filter(es_outlier)
# A tibble: 1 × 7
  id_venta vendedor region   monto   mes completada es_outlier
     <dbl> <chr>    <chr>    <dbl> <dbl> <fct>      <lgl>     
1        8 Luis     norte  9500000     3 SI         TRUE      
Note

Se eliminaron los registros duplicados, se corrigieron los formatos de texto, se imputaron los valores faltantes y se identificó un outlier en la variable monto mediante el método IQR.

Parte 3 — Transformación con dplyr:

Code
ventas_limpias <- ventas_limpias |> 
  mutate( comision = if_else(completada == "SI", monto * 0.05,0), categoria_venta = case_when( monto < 15000 ~ "Baja", monto <= 25000 ~ "Media", monto > 25000 ~ "Alta")) |>  group_by(region) |> 
  mutate( ranking_region = rank(desc(monto))) |> ungroup()


ventas_limpias
# A tibble: 10 × 10
   id_venta vendedor    region   monto   mes completada es_outlier comision
      <dbl> <chr>       <chr>    <dbl> <dbl> <fct>      <lgl>         <dbl>
 1        1 Ana         norte    15000     1 SI         FALSE           750
 2        2 Pedro       sur      22000     1 SI         FALSE          1100
 3        3 María       norte    18500     1 NO         FALSE             0
 4        4 Desconocido sur      23500     2 SI         FALSE          1175
 5        5 Carmen      norte    31000     2 NO         FALSE             0
 6        6 Ana         norte    16000     2 SI         FALSE           800
 7        7 Pedro       sur      19500     3 NO         FALSE             0
 8        8 Luis        norte  9500000     3 SI         TRUE         475000
 9        9 Carmen      sur      21000     3 SI         FALSE          1050
10       10 Luis        norte    17500     3 NO         FALSE             0
# ℹ 2 more variables: categoria_venta <chr>, ranking_region <dbl>

Parte 4 — Resumen analítico:

Code
resumen_vendedores <- ventas_limpias |>
  group_by(vendedor) |>
  summarise(
    total_ventas_completadas = sum(completada == "SI"),
    monto_total_vendido = sum(monto, na.rm = TRUE),
    monto_promedio_venta = mean(monto, na.rm = TRUE),
    comision_total = sum(comision, na.rm = TRUE),
    .groups = "drop"
  ) |>
  arrange(desc(monto_total_vendido))

resumen_vendedores
# A tibble: 6 × 5
  vendedor    total_ventas_completadas monto_total_vendido monto_promedio_venta
  <chr>                          <int>               <dbl>                <dbl>
1 Luis                               1             9517500              4758750
2 Carmen                             1               52000                26000
3 Pedro                              1               41500                20750
4 Ana                                2               31000                15500
5 Desconocido                        1               23500                23500
6 María                              0               18500                18500
# ℹ 1 more variable: comision_total <dbl>