🥬 Análisis de Precios de Verduras en plazaVea 🥦

Eres un analista de datos de una startup de delivery de alimentos saludables. Tu equipo necesita entender la estructura de precios del mercado de verduras en plazaVea (uno de los supermercados más importantes de Perú) para optimizar tu estrategia de precios, identificar oportunidades de compra y comprender la estacionalidad de productos. Deberás extraer, analizar y visualizar los datos de verduras disponibles en su página web para tomar decisiones estratégicas que maximicen el margen de ganancia mientras mantienen precios competitivos.

# Cargar las librerías necesarias
library(rvest)    # Para extraer datos de páginas web
## Warning: package 'rvest' was built under R version 4.4.3
library(httr)     # Para hacer peticiones web
## Warning: package 'httr' was built under R version 4.4.3
library(dplyr)    # Para manipular datos
## Warning: package 'dplyr' was built under R version 4.4.3
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(stringr)  # Para trabajar con texto
## Warning: package 'stringr' was built under R version 4.4.3
# Hacer la petición a la página web
url <- "https://www.plazavea.com.pe/frutas-y-verduras/verduras"
pagina_web <- GET(url)  # Obtenemos la página
contenido <- content(pagina_web, "text")  # Extraemos el contenido

Preguntas a desarrollar:

Pregunta 1: ¿Cuántos productos hay en total?

# Buscamos el texto que contiene el número total de productos
# En el código HTML, esta información aparece en un elemento con clase "value"
total_productos <- contenido %>%
  read_html() %>%  # Convertimos a formato manipulable
  html_nodes(".value") %>%  # Buscamos elementos con clase "value"
  html_text() %>%  # Extraemos el texto
  .[1] %>%  # Tomamos el primer resultado (que es el total)
  as.numeric()  # Convertimos a número

print(paste("Total de productos:", total_productos))
## [1] "Total de productos: 315"

Pregunta 2: ¿Cuáles son las principales subcategorías?

# Para las subcategorías, necesitamos buscar en el menú de navegación lateral
# Según el HTML, están en elementos con clase "dropdown-menu__item__text"
subcategorias <- contenido %>%
  read_html() %>%
  html_nodes(".verduras a") %>%  # Buscamos enlaces dentro de la lista de verduras
  html_text() %>%  # Extraemos el texto
  trimws() %>%  # Eliminamos espacios en blanco
  .[!grepl("^\\s*$", .)]  # Eliminamos elementos vacíos

print("Principales subcategorías de verduras:")
## [1] "Principales subcategorías de verduras:"
print(subcategorias)
##  [1] "Zapallo, Berenjena y Caigua (7)"                   
##  [2] "Cebolla, Ajo, Rocoto y Ají (20)"                   
##  [3] "Brócoli, Coliflor, Alcachofa y Col (12)"           
##  [4] "Apio, Espárrago y Otros Tallos (13)"               
##  [5] "Lechuga, Espinaca y Hojas Verdes (59)"             
##  [6] "Hierbas e Infusiones (17)"                         
##  [7] "Arveja, Vainita, Haba y Otras Legumbres (7)"       
##  [8] "Tomate, Pepino y Pimiento (17)"                    
##  [9] "Papa, Camote, Yuca y Otros Tubérculos (25)"        
## [10] "Zanahoria, Beterraga, Rabanito y Otras Raíces (11)"
## [11] "Verduras Congeladas (44)"                          
## [12] "Hongos, Setas y Germinados (31)"                   
## [13] "Ensaladas y Verduras Picadas (31)"                 
## [14] "Limón (5)"                                         
## [15] "Choclo (12)"                                       
## [16] "Verduras Orientales (5)"

3) ¿Qué subcategorías concentran más oferta?

library(rvest)
library(stringr)
library(dplyr)

doc <- read_html(contenido)

subcategorias_raw <- doc %>%
  html_elements("a") %>%
  html_text2()

subcategorias <- subcategorias_raw %>%
  str_subset("\\(\\d+\\)$") %>%
  str_subset(
    "Zapallo|Cebolla|Brócoli|Apio|Lechuga|Hierbas|Arveja|Tomate|Papa|Zanahoria|Congeladas|Hongos|Ensaladas|Limón|Choclo|Orientales"
  )

tabla_subcategorias <- data.frame(texto = subcategorias) %>%
  mutate(
    subcategoria = str_remove(texto, "\\s*\\(\\d+\\)$"),
    n_productos = as.numeric(str_extract(texto, "\\d+"))
  ) %>%
  arrange(desc(n_productos))

print(tabla_subcategorias)
##                                                 texto
## 1               Lechuga, Espinaca y Hojas Verdes (59)
## 2                            Verduras Congeladas (44)
## 3                     Hongos, Setas y Germinados (31)
## 4                   Ensaladas y Verduras Picadas (31)
## 5          Papa, Camote, Yuca y Otros Tubérculos (25)
## 6                     Cebolla, Ajo, Rocoto y Ají (20)
## 7                           Hierbas e Infusiones (17)
## 8                      Tomate, Pepino y Pimiento (17)
## 9                 Apio, Espárrago y Otros Tallos (13)
## 10            Brócoli, Coliflor, Alcachofa y Col (12)
## 11                                        Choclo (12)
## 12 Zanahoria, Beterraga, Rabanito y Otras Raíces (11)
## 13                    Zapallo, Berenjena y Caigua (7)
## 14        Arveja, Vainita, Haba y Otras Legumbres (7)
## 15                                          Limón (5)
## 16                            Verduras Orientales (5)
##                                     subcategoria n_productos
## 1               Lechuga, Espinaca y Hojas Verdes          59
## 2                            Verduras Congeladas          44
## 3                     Hongos, Setas y Germinados          31
## 4                   Ensaladas y Verduras Picadas          31
## 5          Papa, Camote, Yuca y Otros Tubérculos          25
## 6                     Cebolla, Ajo, Rocoto y Ají          20
## 7                           Hierbas e Infusiones          17
## 8                      Tomate, Pepino y Pimiento          17
## 9                 Apio, Espárrago y Otros Tallos          13
## 10            Brócoli, Coliflor, Alcachofa y Col          12
## 11                                        Choclo          12
## 12 Zanahoria, Beterraga, Rabanito y Otras Raíces          11
## 13                   Zapallo, Berenjena y Caigua           7
## 14       Arveja, Vainita, Haba y Otras Legumbres           7
## 15                                         Limón           5
## 16                           Verduras Orientales           5
  1. ¿Qué marcas dominan la categoría?
marcas_raw <- doc %>%
  html_elements("a") %>%
  html_text2()

marcas <- marcas_raw %>%
  str_subset("\\(\\d+\\)$") %>%
  str_subset("AGE|ARCOR|AVIKO|BELL'S|BELL'S FRESCOS|BEM BRASIL|EL HUERTO|EL SABOR|FEST|GENÉRICO|GREEN FOOD|GUVA|HUERCASA|LA CHIGUATENA|Lambweston|MANANTIALES|PACCU|PLAZA VEA|PRACTIFOOD|SAN SEN|SOFIT|TODO SANO|VERDE PURO|VIVA|WILLKA")

tabla_marcas <- data.frame(texto = marcas) %>%
  mutate(
    marca = str_remove(texto, "\\s*\\(\\d+\\)$"),
    n_productos = as.numeric(str_extract(texto, "\\d+"))
  ) %>%
  arrange(desc(n_productos))

print(tabla_marcas)
##                  texto          marca n_productos
## 1      PLAZA VEA (125)      PLAZA VEA         125
## 2          BELL'S (51)         BELL'S          51
## 3  BELL'S FRESCOS (33) BELL'S FRESCOS          33
## 4        GENÉRICO (22)       GENÉRICO          22
## 5            VIVA (17)           VIVA          17
## 6      PRACTIFOOD (14)     PRACTIFOOD          14
## 7      VERDE PURO (10)     VERDE PURO          10
## 8      MANANTIALES (6)    MANANTIALES           6
## 9              AGE (5)            AGE           5
## 10      BEM BRASIL (5)     BEM BRASIL           5
## 11           PACCU (5)          PACCU           5
## 12           AVIKO (4)          AVIKO           4
## 13            GUVA (3)           GUVA           3
## 14       EL HUERTO (2)      EL HUERTO           2
## 15            FEST (2)           FEST           2
## 16         SAN SEN (2)        SAN SEN           2
## 17           ARCOR (1)          ARCOR           1
## 18        EL SABOR (1)       EL SABOR           1
## 19      GREEN FOOD (1)     GREEN FOOD           1
## 20        HUERCASA (1)       HUERCASA           1
## 21   LA CHIGUATENA (1)  LA CHIGUATENA           1
## 22      Lambweston (1)     Lambweston           1
## 23           SOFIT (1)          SOFIT           1
## 24       TODO SANO (1)      TODO SANO           1
## 25          WILLKA (1)         WILLKA           1
  1. ¿Qué porcentaje de productos está en marcas propias?
total_productos <- 314

marca_propia <- tabla_marcas %>%
  filter(marca == "PLAZA VEA") %>%
  pull(n_productos)

porcentaje_marca_propia <- round(100 * marca_propia / total_productos, 2)

print(paste("Porcentaje de marca propia:", porcentaje_marca_propia, "%"))
## [1] "Porcentaje de marca propia: 39.81 %"