Sigue las instrucciones en cada paso del proceso. Es importante que sigas las instrucciones en orden, pues necesitarás el resultado del ejercicio anterior para cada ejercicio subsecuente.

Pon especial atención a los nombres de los tibbles y de las columnas, pues es posible que algo no funcione si no se nombran exactamente como se muestra.

Para cada ejercicio verás el resultado al cuál debes llegar.

1 Importar datos

El primer paso es cargar los paquetes necesarios con library():

library(openxlsx)
library(tidyverse)

Necesitarás importar los datos de Excel data/INNOVACIONES_COMPETENCIA_V2.xlsx. Puedes abrir primero el archivo en Excel para familiarizarte con él. Al importarlos, almacénalos en un objeto al cual llamarás dta.

## # A tibble: 12,752 x 17
##    DESC   PEPSICO.MANUFAC~ PEPSICO.BRAND PEPSICO.SUB.BRA~ PESO.VOL..UNITA~ CANAL
##    <chr>  <chr>            <chr>         <chr>            <chr>            <chr>
##  1 GLOBA~ BIMBO            WATZ          POKLE            35               TOTA~
##  2 GLOBA~ BIMBO            WATZ          POKLE            35               TOTA~
##  3 GLOBA~ BIMBO            WATZ          POKLE            35               TOTA~
##  4 GLOBA~ BIMBO            WATZ          POKLE            35               TOTA~
##  5 GLOBA~ BIMBO            WATZ          POKLE            35               TOTA~
##  6 GLOBA~ BIMBO            WATZ          POKLE            35               TOTA~
##  7 GLOBA~ BIMBO            WATZ          POKLE            35               TOTA~
##  8 GLOBA~ BIMBO            WATZ          POKLE            35               TOTA~
##  9 GLOBA~ BIMBO            WATZ          POKLE            35               TOTA~
## 10 GLOBA~ BIMBO            WATZ          POKLE            35               TOTA~
## # ... with 12,742 more rows, and 11 more variables: MES <chr>, AÑO <dbl>,
## #   TDPS.(DISTRIBUCION.NUMERICA.VENDEN) <dbl>, SOM.VALUE <dbl>,
## #   VENTAS.EN.VALOR.(in.000.PESOS) <dbl>, SOM.VOL <dbl>,
## #   VENTAS.EN.UNIDADES.EQ.(in.000.KILOS) <dbl>, SOM.UNITS <dbl>,
## #   VENTAS.EN.UNIDADES.(in.000) <dbl>, PPU <dbl>, PPK <dbl>

En este conjunto de datos tenemos información sobre ventas, distribución, share of market tanto unitarias, por volumen (kg) y por valor, de distintas variedades de botanas saladas. A nivel submarca, marca y fabricante.

2 Utiliza select() o rename() para renombrar las columnas.

Para seguir buenas prácticas de programación, los nombres deben contener únicamente minúsculas y guiones bajos, además de ser cortos pero informativos. Evita usar acentos y caracteres especiales, ñ sí está permitido. Procura ser consistente con la forma en la que nombras columnas, por ejemplo, si utilizas nombres en español procura que todos sean en español.

Sobreescribe tu tibble original (asignalo al tibble dta).

Para este ejercicio, utiliza los siguientes nombres:

##  [1] "descripcion"  "fabricante"   "marca"        "submarca"     "peso_unit"   
##  [6] "canal"        "mes"          "año"          "distribucion" "som_valor"   
## [11] "ventas_valor" "som_volumen"  "ventas_vol"   "som_unit"     "ventas_unit" 
## [16] "ppu"          "ppk"
## # A tibble: 12,752 x 17
##    descripcion            fabricante marca submarca peso_unit canal  mes     año
##    <chr>                  <chr>      <chr> <chr>    <chr>     <chr>  <chr> <dbl>
##  1 GLOBAL SALTY BIMBO EX~ BIMBO      WATZ  POKLE    35        TOTAL~ ENERO  2017
##  2 GLOBAL SALTY BIMBO EX~ BIMBO      WATZ  POKLE    35        TOTAL~ FEBR~  2017
##  3 GLOBAL SALTY BIMBO EX~ BIMBO      WATZ  POKLE    35        TOTAL~ MARZO  2017
##  4 GLOBAL SALTY BIMBO EX~ BIMBO      WATZ  POKLE    35        TOTAL~ ABRIL  2017
##  5 GLOBAL SALTY BIMBO EX~ BIMBO      WATZ  POKLE    35        TOTAL~ MAYO   2017
##  6 GLOBAL SALTY BIMBO EX~ BIMBO      WATZ  POKLE    35        TOTAL~ JUNIO  2017
##  7 GLOBAL SALTY BIMBO EX~ BIMBO      WATZ  POKLE    35        TOTAL~ JULIO  2017
##  8 GLOBAL SALTY BIMBO EX~ BIMBO      WATZ  POKLE    35        TOTAL~ AGOS~  2017
##  9 GLOBAL SALTY BIMBO EX~ BIMBO      WATZ  POKLE    35        TOTAL~ SEPT~  2017
## 10 GLOBAL SALTY BIMBO EX~ BIMBO      WATZ  POKLE    35        TOTAL~ OCTU~  2017
## # ... with 12,742 more rows, and 9 more variables: distribucion <dbl>,
## #   som_valor <dbl>, ventas_valor <dbl>, som_volumen <dbl>, ventas_vol <dbl>,
## #   som_unit <dbl>, ventas_unit <dbl>, ppu <dbl>, ppk <dbl>

3 Exploración general de los datos.

Siempre es útil darse una general de los datos con los que estamos tratando.

Utilizando distinct(), muestra los valores únicos de cada columna de tipo character. Recuerda que tienes que hacer una operación por cada columna, es decir, NO es muy útil hacer lo siguiente:

dta %>% 
  distinct(descripcion, fabricante, marca, submarca, canal)
## # A tibble: 356 x 5
##    descripcion                       fabricante marca submarca canal            
##    <chr>                             <chr>      <chr> <chr>    <chr>            
##  1 GLOBAL SALTY BIMBO EXTRUDED / PE~ BIMBO      WATZ  POKLE    TOTAL MEXICO     
##  2 GLOBAL SALTY BIMBO EXTRUDED / PE~ BIMBO      WATZ  POKLE    CANAL TRADICIONA~
##  3 GLOBAL SALTY BIMBO EXTRUDED / PE~ BIMBO      WATZ  POKLE    PROXIMIDAD Y MIN~
##  4 GLOBAL SALTY BIMBO EXTRUDED / PE~ BIMBO      WATZ  POKLE    GRANDES CADENAS ~
##  5 GLOBAL SALTY BIMBO EXTRUDED / PE~ BIMBO      WATZ  TORNADO  TOTAL MEXICO     
##  6 GLOBAL SALTY BIMBO EXTRUDED / PE~ BIMBO      WATZ  TORNADO  CANAL TRADICIONA~
##  7 GLOBAL SALTY BIMBO EXTRUDED / PE~ BIMBO      WATZ  TORNADO  PROXIMIDAD Y MIN~
##  8 GLOBAL SALTY BIMBO EXTRUDED / PE~ BIMBO      WATZ  TORNADO  GRANDES CADENAS ~
##  9 GLOBAL SALTY BIMBO EXTRUDED / PE~ BIMBO      WATZ  VOLTIO   TOTAL MEXICO     
## 10 GLOBAL SALTY BIMBO EXTRUDED / PE~ BIMBO      WATZ  VOLTIO   CANAL TRADICIONA~
## # ... with 346 more rows
  • ¿Qué columnas tienen datos faltantes?

  • ¿Qué información nos brinda la columna descripcion que las columnas marcao submarca no?

4 Crea una columna fecha con as.Date().

Tenemos datos en formato mensual. Cuando esto suceda, el primer paso es encontrar las columnas que especifican las fechas y unirlas de manera que tengamos una sola columna, en formato date que proporcione la información temporal.

Es recomendable hacerlo en tres partes:

  • Primero crea una columna que contenga el día, mes, y año como en formato character utilizando paste() dentro de un mutate().
## # A tibble: 12,752 x 18
##    fecha  descripcion      fabricante marca submarca peso_unit canal mes     año
##    <chr>  <chr>            <chr>      <chr> <chr>    <chr>     <chr> <chr> <dbl>
##  1 01 EN~ GLOBAL SALTY BI~ BIMBO      WATZ  POKLE    35        TOTA~ ENERO  2017
##  2 01 FE~ GLOBAL SALTY BI~ BIMBO      WATZ  POKLE    35        TOTA~ FEBR~  2017
##  3 01 MA~ GLOBAL SALTY BI~ BIMBO      WATZ  POKLE    35        TOTA~ MARZO  2017
##  4 01 AB~ GLOBAL SALTY BI~ BIMBO      WATZ  POKLE    35        TOTA~ ABRIL  2017
##  5 01 MA~ GLOBAL SALTY BI~ BIMBO      WATZ  POKLE    35        TOTA~ MAYO   2017
##  6 01 JU~ GLOBAL SALTY BI~ BIMBO      WATZ  POKLE    35        TOTA~ JUNIO  2017
##  7 01 JU~ GLOBAL SALTY BI~ BIMBO      WATZ  POKLE    35        TOTA~ JULIO  2017
##  8 01 AG~ GLOBAL SALTY BI~ BIMBO      WATZ  POKLE    35        TOTA~ AGOS~  2017
##  9 01 SE~ GLOBAL SALTY BI~ BIMBO      WATZ  POKLE    35        TOTA~ SEPT~  2017
## 10 01 OC~ GLOBAL SALTY BI~ BIMBO      WATZ  POKLE    35        TOTA~ OCTU~  2017
## # ... with 12,742 more rows, and 9 more variables: distribucion <dbl>,
## #   som_valor <dbl>, ventas_valor <dbl>, som_volumen <dbl>, ventas_vol <dbl>,
## #   som_unit <dbl>, ventas_unit <dbl>, ppu <dbl>, ppk <dbl>

Aquí se muestra únicamente la columna fecha para que puedas ver mejor:

## # A tibble: 12,752 x 1
##    fecha             
##    <chr>             
##  1 01 ENERO 2017     
##  2 01 FEBRERO 2017   
##  3 01 MARZO 2017     
##  4 01 ABRIL 2017     
##  5 01 MAYO 2017      
##  6 01 JUNIO 2017     
##  7 01 JULIO 2017     
##  8 01 AGOSTO 2017    
##  9 01 SEPTIEMBRE 2017
## 10 01 OCTUBRE 2017   
## # ... with 12,742 more rows
  • Después, sobreescribe esa misma columna conviertiendo el tipo de datos de character a date, asegurándote de proveer el formato correcto por medio del argumento format de la funión as.Date().

No olvides de asegurarte que R entienda que los nombres de los meses están en Español y con nombre completo, es decir, no abreviación.

Deberías ver el siguiente mensaje si usas Windows. Para Mac el mensaje es similar, pero no exactamente igual:

## [1] "LC_COLLATE=Spanish_Spain.1252;LC_CTYPE=Spanish_Spain.1252;LC_MONETARY=Spanish_Spain.1252;LC_NUMERIC=C;LC_TIME=Spanish_Spain.1252"

Y el resultado al cual llegarás:

## # A tibble: 12,752 x 18
##    fecha      descripcion  fabricante marca submarca peso_unit canal mes     año
##    <date>     <chr>        <chr>      <chr> <chr>    <chr>     <chr> <chr> <dbl>
##  1 2017-01-01 GLOBAL SALT~ BIMBO      WATZ  POKLE    35        TOTA~ ENERO  2017
##  2 2017-02-01 GLOBAL SALT~ BIMBO      WATZ  POKLE    35        TOTA~ FEBR~  2017
##  3 2017-03-01 GLOBAL SALT~ BIMBO      WATZ  POKLE    35        TOTA~ MARZO  2017
##  4 2017-04-01 GLOBAL SALT~ BIMBO      WATZ  POKLE    35        TOTA~ ABRIL  2017
##  5 2017-05-01 GLOBAL SALT~ BIMBO      WATZ  POKLE    35        TOTA~ MAYO   2017
##  6 2017-06-01 GLOBAL SALT~ BIMBO      WATZ  POKLE    35        TOTA~ JUNIO  2017
##  7 2017-07-01 GLOBAL SALT~ BIMBO      WATZ  POKLE    35        TOTA~ JULIO  2017
##  8 2017-08-01 GLOBAL SALT~ BIMBO      WATZ  POKLE    35        TOTA~ AGOS~  2017
##  9 2017-09-01 GLOBAL SALT~ BIMBO      WATZ  POKLE    35        TOTA~ SEPT~  2017
## 10 2017-10-01 GLOBAL SALT~ BIMBO      WATZ  POKLE    35        TOTA~ OCTU~  2017
## # ... with 12,742 more rows, and 9 more variables: distribucion <dbl>,
## #   som_valor <dbl>, ventas_valor <dbl>, som_volumen <dbl>, ventas_vol <dbl>,
## #   som_unit <dbl>, ventas_unit <dbl>, ppu <dbl>, ppk <dbl>

Observa que debajo de fecha está el indicador de tipo de datos <date>.

  • Elimina las columnas mes y año, pues ya tenemos esa información en fecha.
## # A tibble: 12,752 x 16
##    fecha      descripcion fabricante marca submarca peso_unit canal distribucion
##    <date>     <chr>       <chr>      <chr> <chr>    <chr>     <chr>        <dbl>
##  1 2017-01-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  2 2017-02-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  3 2017-03-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  4 2017-04-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  5 2017-05-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  6 2017-06-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  7 2017-07-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  8 2017-08-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  9 2017-09-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
## 10 2017-10-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
## # ... with 12,742 more rows, and 8 more variables: som_valor <dbl>,
## #   ventas_valor <dbl>, som_volumen <dbl>, ventas_vol <dbl>, som_unit <dbl>,
## #   ventas_unit <dbl>, ppu <dbl>, ppk <dbl>

Sobreescribe el tibble dta para conservar todos estos cambios.

5 Eliminar datos faltantes.

5.1 PPU y PPK

Observa que existen NAs en las columnas ppu y ppk. Es importante entender el por qué se están dando. Viendo la fuente de datos original, en Excel, entendemos que se deben a que las fórmulas de Excel con la cual se calculan estos valores dan errores y esos errores son interpretados por R como un NA.

Para calcular ppu o precio por unidad, la fórmula es \(\frac{ventas\_valor}{ventas\_unit}\), sin embargo, cuando ventas_unit == 0, sucede que la división no puede efectuarse (pues la división entre 0 está indefinida) y por eso marca el error.

Corrige las fórmulas para evitar que existan estos valores faltantes:

  • Utilizando ifelse(), define la fórmula de manera que si ventas_unit == 0, se ponga un 0 en esa columna, y en caso contrario, se haga la división \(\frac{ventas\_valor}{ventas\_unit}\)

  • Realiza el mismo procedimiento para ppk, es decir, precio por kilo. Recuerda que en nuestro tibble, los kgs están dados por ventas_vol.

## # A tibble: 12,752 x 16
##    fecha        ppu   ppk ventas_valor ventas_vol ventas_unit descripcion       
##    <date>     <dbl> <dbl>        <dbl>      <dbl>       <dbl> <chr>             
##  1 2017-01-01     0     0            0          0           0 GLOBAL SALTY BIMB~
##  2 2017-02-01     0     0            0          0           0 GLOBAL SALTY BIMB~
##  3 2017-03-01     0     0            0          0           0 GLOBAL SALTY BIMB~
##  4 2017-04-01     0     0            0          0           0 GLOBAL SALTY BIMB~
##  5 2017-05-01     0     0            0          0           0 GLOBAL SALTY BIMB~
##  6 2017-06-01     0     0            0          0           0 GLOBAL SALTY BIMB~
##  7 2017-07-01     0     0            0          0           0 GLOBAL SALTY BIMB~
##  8 2017-08-01     0     0            0          0           0 GLOBAL SALTY BIMB~
##  9 2017-09-01     0     0            0          0           0 GLOBAL SALTY BIMB~
## 10 2017-10-01     0     0            0          0           0 GLOBAL SALTY BIMB~
## # ... with 12,742 more rows, and 9 more variables: fabricante <chr>,
## #   marca <chr>, submarca <chr>, peso_unit <chr>, canal <chr>,
## #   distribucion <dbl>, som_valor <dbl>, som_volumen <dbl>, som_unit <dbl>

*Se reordenaron las columnas para que se vean primero las relevantes a este ejercicio. Es sólo para propósitos de visualización, no es necesario que estén en este orden.

5.2 Submarca

Otra columna en la que tenemos datos faltantes es submarca.

Utiliza filter() para ver los renglones donde submarca es NA:

## # A tibble: 3,476 x 16
##    fecha      descripcion fabricante marca submarca peso_unit canal distribucion
##    <date>     <chr>       <chr>      <chr> <chr>    <chr>     <chr>        <dbl>
##  1 2017-01-01 BRAND       PEPSICO    TOST~ <NA>     <NA>      TOTA~           47
##  2 2017-02-01 BRAND       PEPSICO    TOST~ <NA>     <NA>      TOTA~           45
##  3 2017-03-01 BRAND       PEPSICO    TOST~ <NA>     <NA>      TOTA~           46
##  4 2017-04-01 BRAND       PEPSICO    TOST~ <NA>     <NA>      TOTA~           47
##  5 2017-05-01 BRAND       PEPSICO    TOST~ <NA>     <NA>      TOTA~           46
##  6 2017-06-01 BRAND       PEPSICO    TOST~ <NA>     <NA>      TOTA~           44
##  7 2017-07-01 BRAND       PEPSICO    TOST~ <NA>     <NA>      TOTA~           43
##  8 2017-08-01 BRAND       PEPSICO    TOST~ <NA>     <NA>      TOTA~           46
##  9 2017-09-01 BRAND       PEPSICO    TOST~ <NA>     <NA>      TOTA~           46
## 10 2017-10-01 BRAND       PEPSICO    TOST~ <NA>     <NA>      TOTA~           44
## # ... with 3,466 more rows, and 8 more variables: som_valor <dbl>,
## #   ventas_valor <dbl>, som_volumen <dbl>, ventas_vol <dbl>, som_unit <dbl>,
## #   ventas_unit <dbl>, ppu <dbl>, ppk <dbl>

Posteriormente, con los renglones ya filtrados utiliza distinct() para descripcion, fabricante y marca. Cada una por separado.

  • ¿Qué patrón encuentras para los renglones en los cuales submarca es NA?

Con ayuda de ifelse(), modifica la variable submarca de manera que se reemplacen los valores faltantes con "total_marca".

Sobreescribe dta con este último cambio

## # A tibble: 12,752 x 16
##    fecha      descripcion fabricante marca submarca peso_unit canal distribucion
##    <date>     <chr>       <chr>      <chr> <chr>    <chr>     <chr>        <dbl>
##  1 2017-01-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  2 2017-02-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  3 2017-03-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  4 2017-04-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  5 2017-05-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  6 2017-06-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  7 2017-07-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  8 2017-08-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  9 2017-09-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
## 10 2017-10-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
## # ... with 12,742 more rows, and 8 more variables: som_valor <dbl>,
## #   ventas_valor <dbl>, som_volumen <dbl>, ventas_vol <dbl>, som_unit <dbl>,
## #   ventas_unit <dbl>, ppu <dbl>, ppk <dbl>

Veamos los valores unicos de submarca después de estos cambios

dta %>% 
  distinct(submarca) %>% 
  print(n = 31)
## # A tibble: 31 x 1
##    submarca              
##    <chr>                 
##  1 POKLE                 
##  2 TORNADO               
##  3 VOLTIO                
##  4 ZOMBIE                
##  5 FAJITAS               
##  6 ARELOS                
##  7 CRUJITOS              
##  8 CHURRUMAIS            
##  9 DORITOS DINAMITA      
## 10 total_marca           
## 11 CHEESE SHOCK          
## 12 FUEGO                 
## 13 CHURRITOS             
## 14 XL                    
## 15 POP MANTEQUILLA       
## 16 CHILE PIQUIN          
## 17 ELOTE Y LIMON         
## 18 QUESO                 
## 19 SALSA NEGRA           
## 20 LIMBO                 
## 21 SHOCK                 
## 22 TA'KATRIN             
## 23 VOLCANO               
## 24 JALAPENO              
## 25 REGULAR               
## 26 FLAMIN' HOT           
## 27 FLAMAS                
## 28 MEGA CRUNCH COCTELERAS
## 29 ULTRA FLAMIN' HOT     
## 30 OTR. SUBMARCAS        
## 31 DINAMITA CHILE Y LIMON

Observa que ya no existen NAs en esa columna.

6 Eliminar columnas innecesarias

Las columnas que contienen som, abreviación de share of market, serán eliminadas como parte de los primeros pasos, pues siempre es mejor calcularlas desde R, en caso de ser necesarias más adelante.

Utiliza las funciones auxiliares contains() o starts_with() dentro de un select() para eliminar dichas columnas.

Sobreescribe el tibble dta para conservar tus cambios:

## # A tibble: 12,752 x 13
##    fecha      descripcion fabricante marca submarca peso_unit canal distribucion
##    <date>     <chr>       <chr>      <chr> <chr>    <chr>     <chr>        <dbl>
##  1 2017-01-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  2 2017-02-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  3 2017-03-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  4 2017-04-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  5 2017-05-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  6 2017-06-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  7 2017-07-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  8 2017-08-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  9 2017-09-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
## 10 2017-10-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
## # ... with 12,742 more rows, and 5 more variables: ventas_valor <dbl>,
## #   ventas_vol <dbl>, ventas_unit <dbl>, ppu <dbl>, ppk <dbl>

7 Total a nivel submarca

Nota que los datos vienen detallados hasta cierto nivel de granularidad. En este caso la estructura de niveles es como sigue:

  • Canal: Existen 4 canales.
  • Fabricante: Para cada canal, existen 2 fabricantes.
  • Marca: Para cada fabricante, existen 9 o 10 marcas distintas.
  • Submarca: Cada marca tiene de 1 a 7 submarcas distintas.
  • Presentación: Cada submarca tiene entre 1 y 6 presentaciones, expresado en la columna descripcion y peso_unit.

Por lo tanto, los datos están detallados hasta nivel presentación.

Por ahorita, nos interesa eliminar un nivel de granularidad, calcular los totales de las ventas a nivel submarca.

  • Primero, deberás agrupar por las columnas correspondientes a los niveles más altos de granularidad. En este caso fecha, canal, fabricante, marca, submarca. Utiliza group_by() para este caso.
## # A tibble: 12,752 x 13
## # Groups:   fecha, canal, fabricante, marca, submarca [9,492]
##    fecha      descripcion fabricante marca submarca peso_unit canal distribucion
##    <date>     <chr>       <chr>      <chr> <chr>    <chr>     <chr>        <dbl>
##  1 2017-01-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  2 2017-02-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  3 2017-03-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  4 2017-04-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  5 2017-05-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  6 2017-06-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  7 2017-07-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  8 2017-08-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  9 2017-09-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
## 10 2017-10-01 GLOBAL SAL~ BIMBO      WATZ  POKLE    35        TOTA~            0
## # ... with 12,742 more rows, and 5 more variables: ventas_valor <dbl>,
## #   ventas_vol <dbl>, ventas_unit <dbl>, ppu <dbl>, ppk <dbl>
  • Posteriormente, utiliza summarise() para calcular la suma de cada columna de ventas. Asegúrate de nombrar de la misma manera cada columna resumida, i.e, ventas_valor = sum(ventas_valor), etc.

Cuida también que en tu resultado no conserves ningún grupo.

Almacena el resultado en dta_submarca

## # A tibble: 9,492 x 8
##    fecha      canal          fabricante marca   submarca ventas_valor ventas_vol
##    <date>     <chr>          <chr>      <chr>   <chr>           <dbl>      <dbl>
##  1 2017-01-01 CANAL TRADICI~ BIMBO      ARELOS  ARELOS             0         0  
##  2 2017-01-01 CANAL TRADICI~ BIMBO      ARELOS  total_m~           0         0  
##  3 2017-01-01 CANAL TRADICI~ BIMBO      BIG MIX total_m~       55616.      445. 
##  4 2017-01-01 CANAL TRADICI~ BIMBO      TAKIS   FAJITAS            0         0  
##  5 2017-01-01 CANAL TRADICI~ BIMBO      TAKIS   total_m~      207267.     1509. 
##  6 2017-01-01 CANAL TRADICI~ BIMBO      TAKIS   ZOMBIE             0         0  
##  7 2017-01-01 CANAL TRADICI~ BIMBO      TOSTAC~ total_m~       19462.      155. 
##  8 2017-01-01 CANAL TRADICI~ BIMBO      VALENT~ total_m~        4307.       36.2
##  9 2017-01-01 CANAL TRADICI~ BIMBO      WAPAS   total_m~           0         0  
## 10 2017-01-01 CANAL TRADICI~ BIMBO      WATZ    POKLE              0         0  
## # ... with 9,482 more rows, and 1 more variable: ventas_unit <dbl>

Nota que se eliminaron las columnas ppk y ppu. Esto es correcto pues dichos valores no deben resumirse con la función de suma sum, más bien deben calcularse con las ventas ya resumidas. Las calcularemos más adelante.

Por lo general existen múltiples maneras de resolver un problema, siendo preferibles alternativas en las que se escriba menos código.

Una forma alternativa de realizar la operación anterior es:

dta_submarca <- dta %>% 
  group_by(fecha, canal, fabricante, marca, submarca) %>% 
  summarise(across(.cols = c(ventas_valor, ventas_vol, ventas_unit), .fns = sum)) %>% 
  ungroup()

dta_submarca
## # A tibble: 9,492 x 8
##    fecha      canal          fabricante marca   submarca ventas_valor ventas_vol
##    <date>     <chr>          <chr>      <chr>   <chr>           <dbl>      <dbl>
##  1 2017-01-01 CANAL TRADICI~ BIMBO      ARELOS  ARELOS             0         0  
##  2 2017-01-01 CANAL TRADICI~ BIMBO      ARELOS  total_m~           0         0  
##  3 2017-01-01 CANAL TRADICI~ BIMBO      BIG MIX total_m~       55616.      445. 
##  4 2017-01-01 CANAL TRADICI~ BIMBO      TAKIS   FAJITAS            0         0  
##  5 2017-01-01 CANAL TRADICI~ BIMBO      TAKIS   total_m~      207267.     1509. 
##  6 2017-01-01 CANAL TRADICI~ BIMBO      TAKIS   ZOMBIE             0         0  
##  7 2017-01-01 CANAL TRADICI~ BIMBO      TOSTAC~ total_m~       19462.      155. 
##  8 2017-01-01 CANAL TRADICI~ BIMBO      VALENT~ total_m~        4307.       36.2
##  9 2017-01-01 CANAL TRADICI~ BIMBO      WAPAS   total_m~           0         0  
## 10 2017-01-01 CANAL TRADICI~ BIMBO      WATZ    POKLE              0         0  
## # ... with 9,482 more rows, and 1 more variable: ventas_unit <dbl>

Notarás una función auxiliar dentro de summarise():

  • across(): Es una función que puede usarse dentro de mutate() y summarise() y es útil para indicar que una operación se realizará a lo largo de varias columnas. Tiene 2 argumentos principales: .cols y .fns. El primero sirve para indicar las columnas sobre las cuales se operará, el segundo para especificar la(s) función(es) que se les aplicará.

Para el argumento .cols, se nombra cada columna. Para el argumento .fns, se específica la función con la cuál se resumirá, en este caso sum.

La operación anterior puede escribirse de una forma aún más compacta:

dta_submarca <- dta %>% 
  group_by(fecha, canal, fabricante, marca, submarca) %>% 
  summarise(across(.cols = contains("ventas"), .fns = sum),
            .groups = "drop") 

dta_submarca
## # A tibble: 9,492 x 8
##    fecha      canal          fabricante marca   submarca ventas_valor ventas_vol
##    <date>     <chr>          <chr>      <chr>   <chr>           <dbl>      <dbl>
##  1 2017-01-01 CANAL TRADICI~ BIMBO      ARELOS  ARELOS             0         0  
##  2 2017-01-01 CANAL TRADICI~ BIMBO      ARELOS  total_m~           0         0  
##  3 2017-01-01 CANAL TRADICI~ BIMBO      BIG MIX total_m~       55616.      445. 
##  4 2017-01-01 CANAL TRADICI~ BIMBO      TAKIS   FAJITAS            0         0  
##  5 2017-01-01 CANAL TRADICI~ BIMBO      TAKIS   total_m~      207267.     1509. 
##  6 2017-01-01 CANAL TRADICI~ BIMBO      TAKIS   ZOMBIE             0         0  
##  7 2017-01-01 CANAL TRADICI~ BIMBO      TOSTAC~ total_m~       19462.      155. 
##  8 2017-01-01 CANAL TRADICI~ BIMBO      VALENT~ total_m~        4307.       36.2
##  9 2017-01-01 CANAL TRADICI~ BIMBO      WAPAS   total_m~           0         0  
## 10 2017-01-01 CANAL TRADICI~ BIMBO      WATZ    POKLE              0         0  
## # ... with 9,482 more rows, and 1 more variable: ventas_unit <dbl>

Observa el uso de la función contains(). Es útil para especificar varias columnas cuyos nombres comparten un pedazo de texto. En nuestro ejemplo es "ventas". Se utiliza dentro de across().

Nota también el uso del argumento .groups dentro del summarise(). Es equivalente a utilizar %>% ungroup() justo después del summarise(), y sirve para asegurarte que los grupos que creaste con group_by() ya no se conserven después de resumir los datos.

8 Ventas a nivel marca y fabricante.

Siguiendo la idea del ejercicio anterior y utilizando la forma de código más compacta, calcula ahora:

  • Las ventas resumidas a nivel marca. Almacena el resultado en el objeto dta_marca:
## # A tibble: 3,772 x 7
##    fecha      canal        fabricante marca  ventas_valor ventas_vol ventas_unit
##    <date>     <chr>        <chr>      <chr>         <dbl>      <dbl>       <dbl>
##  1 2017-01-01 CANAL TRADI~ BIMBO      ARELOS           0         0            0 
##  2 2017-01-01 CANAL TRADI~ BIMBO      BIG M~       55616.      445.        5390.
##  3 2017-01-01 CANAL TRADI~ BIMBO      TAKIS       207267.     1509.       24343.
##  4 2017-01-01 CANAL TRADI~ BIMBO      TOSTA~       19462.      155.        2372.
##  5 2017-01-01 CANAL TRADI~ BIMBO      VALEN~        4307.       36.2        216.
##  6 2017-01-01 CANAL TRADI~ BIMBO      WAPAS            0         0            0 
##  7 2017-01-01 CANAL TRADI~ BIMBO      WATZ             0         0            0 
##  8 2017-01-01 CANAL TRADI~ PEPSICO    CRUJI~       96898.      538.       11894.
##  9 2017-01-01 CANAL TRADI~ PEPSICO    CHEET~      424027.     3207.       65326.
## 10 2017-01-01 CANAL TRADI~ PEPSICO    CHURR~       74634.      719.       13227.
## # ... with 3,762 more rows
  • Las ventas resumidas a nivel fabricante. Almacena el resultado en el objeto dta_fabricante:
## # A tibble: 416 x 6
##    fecha      canal               fabricante ventas_valor ventas_vol ventas_unit
##    <date>     <chr>               <chr>             <dbl>      <dbl>       <dbl>
##  1 2017-01-01 CANAL TRADICIONAL ~ BIMBO           286652.     2145.       32320.
##  2 2017-01-01 CANAL TRADICIONAL ~ PEPSICO        2229881.    13860.      248827.
##  3 2017-01-01 GRANDES CADENAS DE~ BIMBO             8514.       71.3        657.
##  4 2017-01-01 GRANDES CADENAS DE~ PEPSICO         321397.     2290.       15475.
##  5 2017-01-01 PROXIMIDAD Y MINIS~ BIMBO            47500.      331.        3948.
##  6 2017-01-01 PROXIMIDAD Y MINIS~ PEPSICO         585687.     3225.       35547.
##  7 2017-01-01 TOTAL MEXICO        BIMBO           347082.     2580.       37421.
##  8 2017-01-01 TOTAL MEXICO        PEPSICO        3184156.    19663.      305018.
##  9 2017-02-01 CANAL TRADICIONAL ~ BIMBO           269141.     1982.       29859.
## 10 2017-02-01 CANAL TRADICIONAL ~ PEPSICO        2073636.    12773.      231014 
## # ... with 406 more rows

9 Calcular PPK y PPU de nuevo

Para cada tibble de dta_submarca, dta_marca y dta_fabricante calcula las variables ppk y ppu, como se especificó en la sección 5.1

## # A tibble: 416 x 8
##    fecha      canal   fabricante ventas_valor ventas_vol ventas_unit   ppu   ppk
##    <date>     <chr>   <chr>             <dbl>      <dbl>       <dbl> <dbl> <dbl>
##  1 2017-01-01 CANAL ~ BIMBO           286652.     2145.       32320.  8.87  134.
##  2 2017-01-01 CANAL ~ PEPSICO        2229881.    13860.      248827.  8.96  161.
##  3 2017-01-01 GRANDE~ BIMBO             8514.       71.3        657. 13.0   119.
##  4 2017-01-01 GRANDE~ PEPSICO         321397.     2290.       15475. 20.8   140.
##  5 2017-01-01 PROXIM~ BIMBO            47500.      331.        3948. 12.0   144.
##  6 2017-01-01 PROXIM~ PEPSICO         585687.     3225.       35547. 16.5   182.
##  7 2017-01-01 TOTAL ~ BIMBO           347082.     2580.       37421.  9.28  135.
##  8 2017-01-01 TOTAL ~ PEPSICO        3184156.    19663.      305018. 10.4   162.
##  9 2017-02-01 CANAL ~ BIMBO           269141.     1982.       29859.  9.01  136.
## 10 2017-02-01 CANAL ~ PEPSICO        2073636.    12773.      231014   8.98  162.
## # ... with 406 more rows
## # A tibble: 3,772 x 9
##    fecha      canal   fabricante marca ventas_valor ventas_vol ventas_unit   ppu
##    <date>     <chr>   <chr>      <chr>        <dbl>      <dbl>       <dbl> <dbl>
##  1 2017-01-01 CANAL ~ BIMBO      AREL~           0         0            0   0   
##  2 2017-01-01 CANAL ~ BIMBO      BIG ~       55616.      445.        5390. 10.3 
##  3 2017-01-01 CANAL ~ BIMBO      TAKIS      207267.     1509.       24343.  8.51
##  4 2017-01-01 CANAL ~ BIMBO      TOST~       19462.      155.        2372.  8.21
##  5 2017-01-01 CANAL ~ BIMBO      VALE~        4307.       36.2        216. 20.0 
##  6 2017-01-01 CANAL ~ BIMBO      WAPAS           0         0            0   0   
##  7 2017-01-01 CANAL ~ BIMBO      WATZ            0         0            0   0   
##  8 2017-01-01 CANAL ~ PEPSICO    CRUJ~       96898.      538.       11894.  8.15
##  9 2017-01-01 CANAL ~ PEPSICO    CHEE~      424027.     3207.       65326.  6.49
## 10 2017-01-01 CANAL ~ PEPSICO    CHUR~       74634.      719.       13227.  5.64
## # ... with 3,762 more rows, and 1 more variable: ppk <dbl>
## # A tibble: 9,492 x 10
##    fecha      canal          fabricante marca   submarca ventas_valor ventas_vol
##    <date>     <chr>          <chr>      <chr>   <chr>           <dbl>      <dbl>
##  1 2017-01-01 CANAL TRADICI~ BIMBO      ARELOS  ARELOS             0         0  
##  2 2017-01-01 CANAL TRADICI~ BIMBO      ARELOS  total_m~           0         0  
##  3 2017-01-01 CANAL TRADICI~ BIMBO      BIG MIX total_m~       55616.      445. 
##  4 2017-01-01 CANAL TRADICI~ BIMBO      TAKIS   FAJITAS            0         0  
##  5 2017-01-01 CANAL TRADICI~ BIMBO      TAKIS   total_m~      207267.     1509. 
##  6 2017-01-01 CANAL TRADICI~ BIMBO      TAKIS   ZOMBIE             0         0  
##  7 2017-01-01 CANAL TRADICI~ BIMBO      TOSTAC~ total_m~       19462.      155. 
##  8 2017-01-01 CANAL TRADICI~ BIMBO      VALENT~ total_m~        4307.       36.2
##  9 2017-01-01 CANAL TRADICI~ BIMBO      WAPAS   total_m~           0         0  
## 10 2017-01-01 CANAL TRADICI~ BIMBO      WATZ    POKLE              0         0  
## # ... with 9,482 more rows, and 3 more variables: ventas_unit <dbl>, ppu <dbl>,
## #   ppk <dbl>

10 Limpiar descripcion

Como ya vimos anteriormente, la columna descripcion contiene mucha información. Algunas partes, sin embargo, son redundantes ya que la misma información está contenida en la columna submarca, marca.

10.1 Ver valores únicos de descripción

Corre lo siguiente en tu consola para ver todos los valores únicos de la columna en cuestión, y poder decidir qué funciones aplicar

dta %>% 
  distinct(descripcion) %>% 
  print(n = 99)

10.2 Quitar información irrelevante

Observa que para muchos renglones, se tiene el string “GLOBAL SALTY”, lo cuál no provee información útil

Utilizando alguna de las funciones para operar con strings que se explican en las notas, sobreescribe la columna descripcion quitando el string "GLOBAL SALTY".

Almacena los cambios en dta.

Llegarás a lo siguiente:

## # A tibble: 12,752 x 13
##    fecha      descripcion fabricante marca submarca peso_unit canal distribucion
##    <date>     <chr>       <chr>      <chr> <chr>    <chr>     <chr>        <dbl>
##  1 2017-01-01 BIMBO EXTR~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  2 2017-02-01 BIMBO EXTR~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  3 2017-03-01 BIMBO EXTR~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  4 2017-04-01 BIMBO EXTR~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  5 2017-05-01 BIMBO EXTR~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  6 2017-06-01 BIMBO EXTR~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  7 2017-07-01 BIMBO EXTR~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  8 2017-08-01 BIMBO EXTR~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  9 2017-09-01 BIMBO EXTR~ BIMBO      WATZ  POKLE    35        TOTA~            0
## 10 2017-10-01 BIMBO EXTR~ BIMBO      WATZ  POKLE    35        TOTA~            0
## # ... with 12,742 more rows, and 5 more variables: ventas_valor <dbl>,
## #   ventas_vol <dbl>, ventas_unit <dbl>, ppu <dbl>, ppk <dbl>

Viendo los valores únicos:

dta %>% 
  distinct(descripcion) %>% 
  print(n = 30)
## # A tibble: 72 x 1
##    descripcion                                                                 
##    <chr>                                                                       
##  1 BIMBO EXTRUDED / PELLETS BARCEL BARCEL WATZ POKLE 0 a 70 35                 
##  2 BIMBO EXTRUDED / PELLETS BARCEL BARCEL WATZ TORNADO 0 a 47 35               
##  3 BIMBO EXTRUDED / PELLETS BARCEL BARCEL WATZ VOLTIO 0 a 70 35                
##  4 BIMBO TORTILLA CHIPS TAKIS TAKIS ZOMBIE 0 a 85 56                           
##  5 BIMBO TORTILLA CHIPS TAKIS TAKIS ZOMBIE 0 a 85 62                           
##  6 BIMBO TORTILLA CHIPS TAKIS TAKIS FAJITAS 0 a 85 62                          
##  7 BIMBO EXTRUDED / PELLETS ARELOS 0 a 70 25                                   
##  8 PEPSICO EXTRUDED / PELLETS CRUJITOS 0 a 47 40                               
##  9 PEPSICO EXTRUDED / PELLETS CRUJITOS 0 a 47 43                               
## 10 PEPSICO EXTRUDED / PELLETS CRUJITOS 0 a 47 46                               
## 11 PEPSICO CORN CHIPS CHURRUMAIS 0 a 80 62                                     
## 12 PEPSICO TORTILLA CHIPS DORITOS DORITOS DINAMITA 0 a 85 65                   
## 13 PEPSICO TORTILLA CHIPS DORITOS DORITOS DINAMITA 0 a 85 72                   
## 14 PEPSICO TORTILLA CHIPS DORITOS DORITOS DINAMITA 0 a 85 80                   
## 15 BRAND                                                                       
## 16 EXTRUDED / PELLETS CHEESE / CORN PUFFS / KURKURE WATZ CHEESE SHOCK 0 a 70 55
## 17 BIMBO EXTRUDED / PELLETS CHEESE / CORN PUFFS / KURKURE WATZ FUEGO 0 a 70 55 
## 18 BIMBO CORN CHIPS CHURRITOS STIX FUEGO 0 a 80 79                             
## 19 BIMBO CORN CHIPS CHURRITOS STIX CHURRITOS 0 a 80 79                         
## 20 BIMBO SNACK MIX BIG MIX XL 0 a 70 65                                        
## 21 BIMBO RTE POPCORN SALTED RTE POPCORN POP POP MANTEQUILLA 0 a 80 35          
## 22 BIMBO POTATO CHIP CHIPS CHILE PIQUIN 0 a 70 46                              
## 23 BIMBO POTATO CHIP WAPAS ELOTE Y LIMON 0 a 70 50                             
## 24 BIMBO POTATO CHIP WAPAS FUEGO 0 a 70 42                                     
## 25 BIMBO POTATO CHIP WAPAS FUEGO 71 a 140 75                                   
## 26 BIMBO POTATO CHIP WAPAS QUESO 0 a 70 42                                     
## 27 BIMBO POTATO CHIP WAPAS QUESO 0 a 70 50                                     
## 28 BIMBO POTATO CHIP WAPAS QUESO 141 A 250 200                                 
## 29 BIMBO POTATO CHIP WAPAS QUESO 71 a 140 75                                   
## 30 BIMBO POTATO CHIP WAPAS SALSA NEGRA 0 a 70 42                               
## # ... with 42 more rows

10.3 Quitar información repetida

10.3.1 Fabricante

En la columna descripción tambien tenemos al fabricante (BIMBO o PEPSICO),sin embargo, está información ya la tenemos en la columna fabricante por lo que podemos eliminar esa parte de texto.

Utilizando alguna de las funciones para strings, modifica la columna descripcion de manera que se elimine la parte de texto referente al fabricante. En este caso, sólo es "PEPSICO" o "BIMBO".

Recuerda que puedes utilizar el operador | que representa la operación lógica “o”.

Sobreescribe tu tibble dta para conservar los cambios.d

## # A tibble: 12,752 x 13
##    fecha      descripcion fabricante marca submarca peso_unit canal distribucion
##    <date>     <chr>       <chr>      <chr> <chr>    <chr>     <chr>        <dbl>
##  1 2017-01-01 EXTRUDED /~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  2 2017-02-01 EXTRUDED /~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  3 2017-03-01 EXTRUDED /~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  4 2017-04-01 EXTRUDED /~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  5 2017-05-01 EXTRUDED /~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  6 2017-06-01 EXTRUDED /~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  7 2017-07-01 EXTRUDED /~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  8 2017-08-01 EXTRUDED /~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  9 2017-09-01 EXTRUDED /~ BIMBO      WATZ  POKLE    35        TOTA~            0
## 10 2017-10-01 EXTRUDED /~ BIMBO      WATZ  POKLE    35        TOTA~            0
## # ... with 12,742 more rows, and 5 more variables: ventas_valor <dbl>,
## #   ventas_vol <dbl>, ventas_unit <dbl>, ppu <dbl>, ppk <dbl>

Viendo los valores únicos:

dta %>% 
  distinct(descripcion) %>% 
  print(n = 30)
## # A tibble: 72 x 1
##    descripcion                                                                 
##    <chr>                                                                       
##  1 EXTRUDED / PELLETS BARCEL BARCEL WATZ POKLE 0 a 70 35                       
##  2 EXTRUDED / PELLETS BARCEL BARCEL WATZ TORNADO 0 a 47 35                     
##  3 EXTRUDED / PELLETS BARCEL BARCEL WATZ VOLTIO 0 a 70 35                      
##  4 TORTILLA CHIPS TAKIS TAKIS ZOMBIE 0 a 85 56                                 
##  5 TORTILLA CHIPS TAKIS TAKIS ZOMBIE 0 a 85 62                                 
##  6 TORTILLA CHIPS TAKIS TAKIS FAJITAS 0 a 85 62                                
##  7 EXTRUDED / PELLETS ARELOS 0 a 70 25                                         
##  8 EXTRUDED / PELLETS CRUJITOS 0 a 47 40                                       
##  9 EXTRUDED / PELLETS CRUJITOS 0 a 47 43                                       
## 10 EXTRUDED / PELLETS CRUJITOS 0 a 47 46                                       
## 11 CORN CHIPS CHURRUMAIS 0 a 80 62                                             
## 12 TORTILLA CHIPS DORITOS DORITOS DINAMITA 0 a 85 65                           
## 13 TORTILLA CHIPS DORITOS DORITOS DINAMITA 0 a 85 72                           
## 14 TORTILLA CHIPS DORITOS DORITOS DINAMITA 0 a 85 80                           
## 15 BRAND                                                                       
## 16 EXTRUDED / PELLETS CHEESE / CORN PUFFS / KURKURE WATZ CHEESE SHOCK 0 a 70 55
## 17 EXTRUDED / PELLETS CHEESE / CORN PUFFS / KURKURE WATZ FUEGO 0 a 70 55       
## 18 CORN CHIPS CHURRITOS STIX FUEGO 0 a 80 79                                   
## 19 CORN CHIPS CHURRITOS STIX CHURRITOS 0 a 80 79                               
## 20 SNACK MIX BIG MIX XL 0 a 70 65                                              
## 21 RTE POPCORN SALTED RTE POPCORN POP POP MANTEQUILLA 0 a 80 35                
## 22 POTATO CHIP CHIPS CHILE PIQUIN 0 a 70 46                                    
## 23 POTATO CHIP WAPAS ELOTE Y LIMON 0 a 70 50                                   
## 24 POTATO CHIP WAPAS FUEGO 0 a 70 42                                           
## 25 POTATO CHIP WAPAS FUEGO 71 a 140 75                                         
## 26 POTATO CHIP WAPAS QUESO 0 a 70 42                                           
## 27 POTATO CHIP WAPAS QUESO 0 a 70 50                                           
## 28 POTATO CHIP WAPAS QUESO 141 A 250 200                                       
## 29 POTATO CHIP WAPAS QUESO 71 a 140 75                                         
## 30 POTATO CHIP WAPAS SALSA NEGRA 0 a 70 42                                     
## # ... with 42 more rows

10.3.2 Gramaje

Al final de cada valor de descripcion (de casi todos), viene el número de gramos de la presentación, sin embargo, esa información ya está en la columna peso_unit.

Modifica la columna descripcion quita esa parte de los datos, utilizando str_remove() y un pattern construido con REGEX.

Sobreescribe tu tibble dta para conservar los cambios.

## # A tibble: 12,752 x 13
##    fecha      descripcion fabricante marca submarca peso_unit canal distribucion
##    <date>     <chr>       <chr>      <chr> <chr>    <chr>     <chr>        <dbl>
##  1 2017-01-01 EXTRUDED /~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  2 2017-02-01 EXTRUDED /~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  3 2017-03-01 EXTRUDED /~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  4 2017-04-01 EXTRUDED /~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  5 2017-05-01 EXTRUDED /~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  6 2017-06-01 EXTRUDED /~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  7 2017-07-01 EXTRUDED /~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  8 2017-08-01 EXTRUDED /~ BIMBO      WATZ  POKLE    35        TOTA~            0
##  9 2017-09-01 EXTRUDED /~ BIMBO      WATZ  POKLE    35        TOTA~            0
## 10 2017-10-01 EXTRUDED /~ BIMBO      WATZ  POKLE    35        TOTA~            0
## # ... with 12,742 more rows, and 5 more variables: ventas_valor <dbl>,
## #   ventas_vol <dbl>, ventas_unit <dbl>, ppu <dbl>, ppk <dbl>

Pista: Recuerda que para construir un pattern necesitas especifcar cada parte del texto. En este caso necesitas lo siguiente:

  • Iniciar con un espacio, para quitar los digitos del final con todo y el espacio.

  • Especificar que se tienen uno o dos digitos. Para eso usa "\\d" para indicar dígito y "*" para indicar que pueden ser varios.

  • Indicar que debe ser la última parte del texto, pues existen otros dígitos que no queremos eliminar. Para esto, utiliza el operador "$".

Juntando estas partes en orden, puedes tener un pattern que hace justo lo que necesitas.

Viendo los valores únicos:

dta %>% 
  distinct(descripcion) %>% 
  print(n = 30)
## # A tibble: 52 x 1
##    descripcion                                                              
##    <chr>                                                                    
##  1 EXTRUDED / PELLETS BARCEL BARCEL WATZ POKLE 0 a 70                       
##  2 EXTRUDED / PELLETS BARCEL BARCEL WATZ TORNADO 0 a 47                     
##  3 EXTRUDED / PELLETS BARCEL BARCEL WATZ VOLTIO 0 a 70                      
##  4 TORTILLA CHIPS TAKIS TAKIS ZOMBIE 0 a 85                                 
##  5 TORTILLA CHIPS TAKIS TAKIS FAJITAS 0 a 85                                
##  6 EXTRUDED / PELLETS ARELOS 0 a 70                                         
##  7 EXTRUDED / PELLETS CRUJITOS 0 a 47                                       
##  8 CORN CHIPS CHURRUMAIS 0 a 80                                             
##  9 TORTILLA CHIPS DORITOS DORITOS DINAMITA 0 a 85                           
## 10 BRAND                                                                    
## 11 EXTRUDED / PELLETS CHEESE / CORN PUFFS / KURKURE WATZ CHEESE SHOCK 0 a 70
## 12 EXTRUDED / PELLETS CHEESE / CORN PUFFS / KURKURE WATZ FUEGO 0 a 70       
## 13 CORN CHIPS CHURRITOS STIX FUEGO 0 a 80                                   
## 14 CORN CHIPS CHURRITOS STIX CHURRITOS 0 a 80                               
## 15 SNACK MIX BIG MIX XL 0 a 70                                              
## 16 RTE POPCORN SALTED RTE POPCORN POP POP MANTEQUILLA 0 a 80                
## 17 POTATO CHIP CHIPS CHILE PIQUIN 0 a 70                                    
## 18 POTATO CHIP WAPAS ELOTE Y LIMON 0 a 70                                   
## 19 POTATO CHIP WAPAS FUEGO 0 a 70                                           
## 20 POTATO CHIP WAPAS FUEGO 71 a 140                                         
## 21 POTATO CHIP WAPAS QUESO 0 a 70                                           
## 22 POTATO CHIP WAPAS QUESO 141 A 250                                        
## 23 POTATO CHIP WAPAS QUESO 71 a 140                                         
## 24 POTATO CHIP WAPAS SALSA NEGRA 0 a 70                                     
## 25 EXTRUDED / PELLETS OTHER EXTRUDED / PELLETS VALENTONES FUEGO 48 a 125    
## 26 TORTILLA CHIPS FLAVOURED TORTILLA CHIPS TAKIS LIMBO 0 a 85               
## 27 TORTILLA CHIPS FLAVOURED TORTILLA CHIPS TAKIS SHOCK 0 a 85               
## 28 SALTY TORTILLA CHIPS FLAVOURED TORTILLA CHIPS TAKIS TA'KATRIN 0 a 85     
## 29 SALTY TORTILLA CHIPS FLAVOURED TORTILLA CHIPS TAKIS VOLCANO 0 a 85       
## 30 SALTY TORTILLA CHIPS FLAVOURED TORTILLA CHIPS TOSTACHOS FUEGO 0 a 85     
## # ... with 22 more rows

10.4 Extraer la información más útil.

10.4.1 Rango de gramaje

Al final de los valores de descripcion (de casi todos) tenemos un rango de gramos, que nos ayudará para agrupar las bolsitas por tamaño, sin necesidad de dar su peso unitario exacto.

Con ayuda de str_extract(), crea una nueva columna que se llame rango_gramaje que contenga esta información. Necesitarás crear un pattern que te permita extraer justo los caracteres necesarios.

Sobreescribe dta para conservar los cambios.

Visualizando el resultado con ayuda de distinct():

dta %>% 
  distinct(descripcion, rango_gramaje)
## # A tibble: 52 x 2
##    descripcion                                          rango_gramaje
##    <chr>                                                <chr>        
##  1 EXTRUDED / PELLETS BARCEL BARCEL WATZ POKLE 0 a 70   0 a 70       
##  2 EXTRUDED / PELLETS BARCEL BARCEL WATZ TORNADO 0 a 47 0 a 47       
##  3 EXTRUDED / PELLETS BARCEL BARCEL WATZ VOLTIO 0 a 70  0 a 70       
##  4 TORTILLA CHIPS TAKIS TAKIS ZOMBIE 0 a 85             0 a 85       
##  5 TORTILLA CHIPS TAKIS TAKIS FAJITAS 0 a 85            0 a 85       
##  6 EXTRUDED / PELLETS ARELOS 0 a 70                     0 a 70       
##  7 EXTRUDED / PELLETS CRUJITOS 0 a 47                   0 a 47       
##  8 CORN CHIPS CHURRUMAIS 0 a 80                         0 a 80       
##  9 TORTILLA CHIPS DORITOS DORITOS DINAMITA 0 a 85       0 a 85       
## 10 BRAND                                                <NA>         
## # ... with 42 more rows

Pista: La construcción del pattern es análoga a la del ejercicio anterior. Todos los operadores necesarios ya los conoces:

  • dígitos (uno o más)
  • espacio
  • la letra “a”
  • espacio
  • dígitos (dos o más)

10.4.2 Tipo de botana

Otro elemento importante dentro de la columna descripcion es el tipo de botana.

Puede ser uno de los siguientes valores:

EXTRUDED,CORN CHIPS,TORTILLA CHIPS,RTE POPCORN,POTATO CHIP,SNACK MIX

Crea una nueva columna, llamada tipo_botana, con la ayuda de str_extract(), que extraiga de la columna descripcion alguno de todos los valores posibles.

Recuerda el uso del operador |.

Sobreescribe dta para conservar los cambios.

Visualizando el resultado con ayuda de distinct():

## # A tibble: 52 x 2
##    descripcion                                          tipo_botana   
##    <chr>                                                <chr>         
##  1 EXTRUDED / PELLETS BARCEL BARCEL WATZ POKLE 0 a 70   EXTRUDED      
##  2 EXTRUDED / PELLETS BARCEL BARCEL WATZ TORNADO 0 a 47 EXTRUDED      
##  3 EXTRUDED / PELLETS BARCEL BARCEL WATZ VOLTIO 0 a 70  EXTRUDED      
##  4 TORTILLA CHIPS TAKIS TAKIS ZOMBIE 0 a 85             TORTILLA CHIPS
##  5 TORTILLA CHIPS TAKIS TAKIS FAJITAS 0 a 85            TORTILLA CHIPS
##  6 EXTRUDED / PELLETS ARELOS 0 a 70                     EXTRUDED      
##  7 EXTRUDED / PELLETS CRUJITOS 0 a 47                   EXTRUDED      
##  8 CORN CHIPS CHURRUMAIS 0 a 80                         CORN CHIPS    
##  9 TORTILLA CHIPS DORITOS DORITOS DINAMITA 0 a 85       TORTILLA CHIPS
## 10 BRAND                                                <NA>          
## # ... with 42 more rows