Ejercicio, limpiar datasets

Author

Keyra Wagner

Librerías

library(tidyverse)
── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
✔ dplyr     1.2.1     ✔ readr     2.2.0
✔ forcats   1.0.1     ✔ stringr   1.6.0
✔ ggplot2   4.0.3     ✔ tibble    3.3.1
✔ lubridate 1.9.5     ✔ tidyr     1.3.2
✔ purrr     1.2.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
library(stringr)
library(forcats)

Dataset

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

)

ventas_crudas
# A tibble: 11 × 6
   id_venta vendedor region   monto   mes completada
      <dbl> <chr>    <chr>    <dbl> <dbl> <chr>     
 1        1 "ana"    norte    15000     1 SI        
 2        2 "PEDRO"  SUR      22000     1 SI        
 3        3 "María " Norte    18500     1 NO        
 4        4  <NA>    sur         NA     2 SI        
 5        5 "carmen" NORTE    31000     2 <NA>      
 6        6 "ana"    norte    16000     2 SI        
 7        7 "PEDRO"  sur      19500     3 NO        
 8        8 "luis"   Norte  9500000     3 SI        
 9        9 "carmen" sur      21000     3 SI        
10       10 "luis"   norte    17500     3 NO        
11        3 "María " Norte    18500     1 NO        

Diagnóstico Inicial

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", "…
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  
               
colSums(is.na(ventas_crudas))
  id_venta   vendedor     region      monto        mes completada 
         0          1          0          1          0          1 

Identificaciones

-Hay un registro duplicado en id_venta = 3 - Hay un NA en vendedor - Hay un NA en monto - Hay un NA en completada - Existe un posible outlier en monto (9500000).

Limpieza de datos

ventas_limpias <- ventas_crudas %>%

distinct(id_venta, .keep_all = TRUE) %>%

mutate(

vendedor = str_trim(vendedor),

vendedor = str_to_title(vendedor),

region = str_to_lower(region),

vendedor = replace_na(vendedor, "Desconocido")

)
ventas_limpias <- ventas_limpias %>%

group_by(mes) %>%

mutate(
monto = ifelse(
is.na(monto),
median(monto, na.rm = TRUE),
monto
)
) %>%

ungroup()
ventas_limpias <- ventas_limpias %>%

mutate(
completada = replace_na(completada, "NO"),
completada = factor(completada)
)
Q1 <- quantile(ventas_limpias$monto, 0.25)

Q3 <- quantile(ventas_limpias$monto, 0.75)

IQR_valor <- IQR(ventas_limpias$monto)

lim_inf <- Q1 - 1.5 * IQR_valor

lim_sup <- Q3 + 1.5 * IQR_valor

ventas_limpias <- ventas_limpias %>%

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

ventas_limpias
# A tibble: 10 × 7
   id_venta vendedor    region   monto   mes completada es_outlier
      <dbl> <chr>       <chr>    <dbl> <dbl> <fct>      <lgl>     
 1        1 Ana         norte    15000     1 SI         FALSE     
 2        2 Pedro       sur      22000     1 SI         FALSE     
 3        3 María       norte    18500     1 NO         FALSE     
 4        4 Desconocido sur      23500     2 SI         FALSE     
 5        5 Carmen      norte    31000     2 NO         FALSE     
 6        6 Ana         norte    16000     2 SI         FALSE     
 7        7 Pedro       sur      19500     3 NO         FALSE     
 8        8 Luis        norte  9500000     3 SI         TRUE      
 9        9 Carmen      sur      21000     3 SI         FALSE     
10       10 Luis        norte    17500     3 NO         FALSE     

Transformaciónc con dplyr

ventas_limpias <- ventas_limpias %>%

mutate(
comision = if_else(
completada == "SI",
monto * 0.05,
0
)
)
ventas_limpias <- ventas_limpias %>%

mutate(
categoria_venta = case_when(
monto < 15000 ~ "Baja",
monto <= 25000 ~ "Media",
TRUE ~ "Alta"
)
)
ventas_limpias <- ventas_limpias %>%

group_by(region) %>%

mutate(
ranking = 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 <dbl>

Resumen Analítico

resumen <- ventas_limpias %>%

group_by(vendedor) %>%

summarise(

ventas_completadas = sum(completada == "SI"),

monto_total = sum(monto),

promedio_venta = mean(monto),

comision_total = sum(comision)

) %>%

arrange(desc(monto_total))

resumen
# A tibble: 6 × 5
  vendedor    ventas_completadas monto_total promedio_venta comision_total
  <chr>                    <int>       <dbl>          <dbl>          <dbl>
1 Luis                         1     9517500        4758750         475000
2 Carmen                       1       52000          26000           1050
3 Pedro                        1       41500          20750           1100
4 Ana                          2       31000          15500           1550
5 Desconocido                  1       23500          23500           1175
6 María                        0       18500          18500              0