Para nuestro proyecto, contamos con dos conjuntos de datos distintos. Ambos guardan información sobre productos en venta en los supermercados Mercadona, Dia y Carrefour. Estos son:
datamarket_productos_de_supermercados.csv: ha sido obtenido de la página de DataMarket. Contiene registros diarios de los precios de los productos desde marzo de 2021 hasta la actualidad (se actualiza cada 24 horas). Tiene un total de 10 variables, de las cuales en un principio 8 son de tipo carácter (product_id, name, url, insert_date, supermarket, category, description y reference_unit) y 2, numéricas (price y reference_price).
productos-de-supermercados-sample.csv: ha sido obtenido en Kaggle, aunque la fuente es también DataMarket. Contiene registros desde julio de 2020 a febrero de 2021. En este caso, los registros son cada 12 horas. Contiene las mismas variables que el primero, a excepción de url y product_id.
Hemos decidido utilizar estos ambos datasets ya que así contamos con mayor cantidad de datos históricos. Así, juntamos los dos conjuntos de datos (eliminando antes las variables url y product_id del primer conjunto, que realmente tampoco aportaban información para nuestro estudio). Además, cambiaremos el formato de insert_date para que sea tipo fecha y supermarket, category, description y reference_unit las cambiaremos a tipo factor.
## Length Class Mode
## 10004810 character character
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## "2020-07-16" "2021-07-09" "2021-12-29" "2021-12-26" "2022-06-19" "2022-12-19"
Vemos que Carrefour cuenta con menos datos que los otros dos supermercados.
## Length Class Mode
## 1619 character character
## Length Class Mode
## 2095 character character
## Length Class Mode
## 20 character character
Para decidir qué hacer con los registros con valor nulo en esta variable, en primer lugar comprobamos si pertenecen a alguna categoría o supermercado específicos, pero vemos que hay registros de este tipo en todas las categorías y todos los supermercados. Como nos será imposible trabajar con estos datos y realmente representan el 0.1% del total del conjunto de datos, los eliminaremos.
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.060 1.400 2.250 4.791 3.990 7915.050 12
Llama la atención que el valor máximo de esta variable es igual a 7.915’05; lo cual no tiene sentido, ya que no se venden productos tan caros en los supermercados. Si buscamos cuál es el producto que tiene este precio vemos que se trata del “Carabinero congelado” de Mercadona.
| name | description | price | reference_price | reference_unit | |
|---|---|---|---|---|---|
| 1275398 | Carabinero congelado | Granel | 7915.05 | 79.95 | kg |
| 1297526 | Carabinero congelado | Granel | 7915.05 | 79.95 | kg |
| 1310174 | Carabinero congelado | Granel | 7915.05 | 79.95 | kg |
| 1323850 | Carabinero congelado | Granel | 7915.05 | 79.95 | kg |
| 1340127 | Carabinero congelado | Granel | 7915.05 | 79.95 | kg |
| 1357264 | Carabinero congelado | Granel | 7915.05 | 79.95 | kg |
El precio de referencia sí parece el adecuado. El problema parece que está en que este es un producto de venta a granel, y como precio de venta se ha puesto el precio de la compra de unos 100kg de carabinero, lo cuál no parece muy adecuado pensando que se trata de un producto de venta en supermercados. Vamos a comprobar si este tipo de error ocurre más veces en el datset. Para ello, revisamos si existen más productos con precio superior a los 500€. Hay un total de 7.040 productos con precios superiores a los 500€. Veamos cuáles son los valores del atributo description de estos:
## name description
## Length:7040 Granel :7001
## Class :character : 16
## Mode :character Bandeja: 9
## 1 Ud : 2
## 0,375 G: 0
## (Other): 0
## NA's : 12
Vemos que la gran mayoría de productos con precios altos son de venta a granel. Eliminaremos estos registros. Además, encontramos 9 productos con precio elevado de venta en “Bandeja” y “1 Ud”.
| name | description | price | reference_price | reference_unit | |
|---|---|---|---|---|---|
| 9533544 | Langostino cocido | Bandeja | 985.05 | 9.95 | kg |
| 9548682 | Langostino cocido | Bandeja | 985.05 | 9.95 | kg |
| 9606244 | Langostino cocido | Bandeja | 985.05 | 9.95 | kg |
| 9639070 | Langostino cocido | Bandeja | 985.05 | 9.95 | kg |
| 9798672 | Langostino cocido | Bandeja | 985.05 | 9.95 | kg |
| 9812707 | Langostino cocido | Bandeja | 985.05 | 9.95 | kg |
| 9867383 | Langostino cocido | Bandeja | 985.05 | 9.95 | kg |
| 9969685 | Langostino cocido | Bandeja | 985.05 | 9.95 | kg |
| 9983685 | Langostino cocido | Bandeja | 985.05 | 9.95 | kg |
El producto de venta en “Bandeja” es “Langostino cocido” de Mercadona. Su precio de referencia es 9’95€/kg. Esto supondría que en la bandeja de langostino van aproximadamente 100kg de producto, lo cual debe ser un error. Eliminaremos también estos registros.
| name | description | price | reference_price | reference_unit | |
|---|---|---|---|---|---|
| 9567914 | Lote Navidad jamón ibérico bellota 100% raza ibérica 5 Jotas 6,75 kg | 1 Ud | 589 | 589 | ud |
| 9955325 | Lote Navidad jamón ibérico bellota 100% raza ibérica 5 Jotas 6,75 kg | 1 Ud | 589 | 589 | ud |
El producto que se vende por “1 Ud” es un jamón ibérico de Carrefour, que tiene un precio de 589€ por unidad, lo cual sí que puede ser posible, por lo que mantendremos el registro.
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 0.00 1.85 4.63 15.39 9.95 140000.00
En esta variable también nos encontramos con un valor máximo sorprendentemente alto. Si miramos en el conjunto de datos, los productos que suelen tener precios unitarios elevados son los que se venden en cantidades pequeñas (como especias, azafrán o algunos productos de perfumería). Al estar medidos en unidades mucho más grandes que las de venta, tiene sentido que el precio unitario sea tan alto.
| name | description | price | reference_price | reference_unit | |
|---|---|---|---|---|---|
| 1343 | SAFRINA azafrán en hebras 0,375 gr | 2.29 | 6106.67 | kg | |
| 1346 | POTE azafrán en hebras caja 4 sobres | 3.29 | 8225.00 | kg | |
| 1347 | POTE azafrán molido caja 4 sobres | 2.99 | 7475.00 | kg | |
| 9597 | MAVALA base barrera de manicura para uñas bote 10 ml | 20.90 | 2090.00 | l | |
| 10909 | MAVALA aceite nutritivo para cúticulas 5 ml | 16.75 | 3350.00 | l | |
| 10959 | BELLA AURORA L+ crema antimanchas spf 15 tubo 10 ml | 16.95 | 1695.00 | l |
Conservaremos todos estos registros.
Nuestro conjunto de datos de trabajo cuenta ahora con un total de 9.985.665 registros y 8 variables. Al ser un dataset tan grande, supondría un gran coste computacional trabajar con él. Además, muchos de los datos que tenemos no son necesarios realmente para nuestro estudio. A continuación veremos cuáles son las transformaciones que vamos a realizar para conseguir un conjunto de datos adecuado.
Tal y como hemos visto, los registros que tenemos son de actualización diaria (o cada 12 horas en el caso del segundo dataset). En el momento de hacer un estudio sobre la evolución y comparación de precios en los supermercados, no necesitamos este nivel de detalle diario, pues los precios no suelen variar de manera notable de un día a otro; y en caso de hacerlo, este cambio en el precio se mantendrá durante un periodo más largo de tiempo. Es por esto que hemos decidido reducir la granularidad y trabajar con registros mensuales. Para ello, creamos una nueva variable (month) que indica el mes y el año en que se ha tomado el registro y agrupamos el conjunto de datos según esta nueva variable, el nombre del producto y el supermercado. Para cada grupo, calculamos la media del precio y del precio de referencia.
En este punto hemos eliminado también la variable description, pues no la vamos a utilizar más.
Como en el conjunto de datos tenemos información sobre una cantidad de productos que novamos a ser capaces de analizar, hemos decidio centrar nuestro estudio en unos productos determinados. Estos son los que pertenecen a la cesta de 30 productos por 30€ que ha lanzado Carrefour recientemente y algunos productos adicionales que hemos considerado de interés. Así, crearemos un nuevo conjunto de datos a partir del que teníamos actualmente donde solamente aparezcan estos productos. Los productos que incluirá son:
Además, añadiremos una variable binaria (cesta_carrefour) que indica si el producto pertenece o no a la cesta de carrefour.
En este punto, el caso ideal sería tener registros de todos los productos a lo largo de todos los meses. Sin embargo, esto no ocurre así, pues hay meses para los que no se tienen datos de determinados productos.
Es por esto que deberemos imputar de alguna manera los registros faltantes. Esta imputación se puede ver en el Anexo 2: Imputación de regsitros faltantes.
La categoría de los productos que se especifica en la variable category es muy específica, y esto dificulta los análisis que queremos realizar. Es por esto que vamos a crear una nueva variable (aleternative_category) donde poder agrupar los productos en categorías más generales. Estas categorías serán:
A falta de la imputación antes mencionada, el conjunto tiene un total de 2.110 obsevaciones y 9 variables.