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