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:

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.

Estudio de las variables

##    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.

Transformaciones realizadas

Reducción de granularidad en la variable insert_date

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.

Selección de los productos de interé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:

  • PRODUCTOS DE LA CESTA DE CARREFOUR:
    • Pan de molde
    • Pan de hamburguesa
    • Atún en aceite de girasol
    • Mermelada
    • Sal marina
    • Harina de trigo
    • Vinagre de vino blanco
    • Copos de avena
    • Espirales vegetales
    • Caldo de pollo
    • Guisantes
    • Champiñones laminados
    • Pimiento
    • Té de limón
    • Café molido
    • Cereales de maíz
    • Albóndigas
    • Chocolate blanco
    • Zumo
    • Lavavajillas a mano
    • Gel de ducha
    • Papel higiénico
    • Compresas
    • Detergente a mano
    • Limpiacristales
    • Lejía
  • PRODUCTOS ADICIONALES
    • Huevos
    • Leche
    • Arroz
    • Lentejas
    • Chuletas
    • Carne picada
    • Yogur

Además, añadiremos una variable binaria (cesta_carrefour) que indica si el producto pertenece o no a la cesta de carrefour.

Imputación de los registros faltantes

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.

Reducción de granularidad de la variable category

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:

  • Pan
  • Latas y conservas
  • Pasta, arroz y legumbres
  • Alimentación general
  • Fruta y verdura
  • Carne y pescado
  • Huevos y lácteos
  • Productos de limpieza
  • Productos de higiene personal

Conjunto final

A falta de la imputación antes mencionada, el conjunto tiene un total de 2.110 obsevaciones y 9 variables.