Tema 03 - Datos: tratamiento, limpieza y preparación

Ejercicios del tema

Autor/a
Afiliación

Pedro Albarrán

Dpto. de Fundamentos del Análisis Económico. Universidad de Alicante

Antes de empezar

Estos ejercicios se van haciendo durante las clases del tema: las transparencias indican en qué momento toca cada uno.

Importante

Si no lo has hecho ya, lee Cómo trabajar en cada tema: la carpeta del tema con su subdirectorio data, cómo se crea el documento, qué va en la cabecera (con embed-resources: true), la primera celda y cómo se entrega. Vale para todo el curso.

De este tema, lo que te hace falta:

  • Los datos son retail_data.RData, de la página Datos. Descárgalo en tu subdirectorio data. Dentro vienen las tablas de una cadena de tiendas: ventas, productos, categorias, clientes, empleados, tiendas, promociones_empleado, devoluciones, precios, objetivos y ventas_ancho.
  • Un documento por ejercicio, T03_E<n>_<ID>.qmd: T03_E1_12345678.qmd para la entrega 1, T03_E2_12345678.qmd para el 2, y así. Cada uno carga los datos en su primera celda.
library(tidyverse)
load("data/retail_data.RData")

Entrega 1: la cadena de tiendas

Trabajamos con ventas, el registro de operaciones de una cadena de doce tiendas, y con tiendas, la ficha de cada una.

Apartado a): qué es una fila

  1. ¿Cuántas filas y cuántas columnas tiene ventas? ¿Qué es una fila de esta tabla?

  2. ¿Cuántas ventas distintas hay? ¿Cuántos clientes, productos, tiendas y empleados distintos aparecen? ¿Coincide el número de ventas con el número de filas? ¿Por qué es importante que coincida?

  3. ¿Entre qué fechas van los datos?

  4. ¿Hay valores ausentes en id_empleado? ¿Cuántos? Piensa qué clase de venta puede no tener un empleado asignado.

Apartado b): quedarse con lo que interesa

  1. Crea ventas_min con solo estas columnas: id_venta, fecha, id_tienda, id_producto, cantidad y total.

  2. ¿Cuántas ventas hubo en 2023? De ellas, ¿cuántas se hicieron con algún descuento?

  3. ¿Cuántas ventas de 2023 se hicieron en fin de semana (dia_semana es "sábado" o "domingo")?

Apartado c): columnas nuevas y orden

  1. Añade a ventas una columna ingreso_unitario con el importe medio por unidad vendida (total dividido por cantidad).

  2. ¿Cuáles son las tres ventas de mayor importe de 2023? Muestra id_venta, id_tienda y total.

  3. La misma pregunta, pero ordenando de menor a mayor. ¿Qué argumento cambia?

Apartado d): de datos individuales a datos agregados

  1. Para 2023, calcula de cada tienda: los ingresos totales, el número de ventas y el ticket medio. Ordena de más a menos ingresos.

  2. ¿Qué tienda ingresó más? ¿Es también la que hizo más ventas? ¿Y la del ticket medio más alto?

  3. Vuelve a hacer (1) sin agrupar, para toda la cadena a la vez. ¿Cuántas filas tiene ahora el resultado y cuántas tenía antes? Explica en una frase qué hace group_by() sobre summarize().

Apartado e): porcentajes que suman 100 cuando no deben

  1. Con las ventas de 2023, calcula los ingresos de cada mes y el porcentaje que representan sobre los ingresos totales del año. Ordena de mayor a menor. Comprueba que los doce porcentajes suman 100.

  2. ¿Qué mes fue el mejor del año y cuánto pesó?

  3. Un compañero propone este código para (1). Ejecútalo: ¿qué devuelve? ¿Por qué? ¿Qué hay que cambiar para arreglarlo?

ventas |>
  filter(año == 2023) |>
  group_by(mes) |>
  mutate(pct = total / sum(total) * 100) |>
  summarize(pct_mes = sum(pct))

Apartado f): tu tienda

Este apartado lo resuelve cada uno con datos distintos, así que la respuesta de tu compañero no es la tuya.

  1. Tu tienda es la que tiene el número que resulta de sumar 1 al último dígito de tu DNI (si tu DNI acaba en 3, tu tienda es la 4; si acaba en 9, la 10). Quédate solo con sus ventas de 2023.

  2. ¿En qué mes de 2023 ingresó más tu tienda, y cuánto? ¿Qué porcentaje representa sobre lo que ingresó toda la cadena en ese mismo mes?

  3. Haz ahora la misma pregunta para todas las tiendas a la vez: una tabla con una fila por tienda, su mejor mes y el ingreso de ese mes. Comprueba que la fila de tu tienda coincide con lo que respondiste en (2).

  4. Dibuja la evolución mensual de los ingresos de tu tienda a lo largo de 2023, con los meses en el eje horizontal. ¿Se parece a lo que esperabas después de (2)?

  5. Si tuvieras estos datos en una hoja de cálculo, ¿con qué harías (3)? Escribe en una frase qué herramienta de Excel hace el mismo trabajo que group_by() más summarize().

Entrega 2: el informe trimestral

ventas_ancho es la tabla que llega del departamento de administración: tres tiendas y un trimestre en cada columna.

Apartado a): responder exige girar

  1. Mira la tabla. ¿Qué es una fila? ¿Está en formato ordenado? ¿Por qué no?

  2. ¿En qué trimestre vendió más la cadena entera, y cuánto? Para poder agrupar por trimestre, ¿qué formato necesitas?

  3. Guarda la versión larga en ventas_largo y comprueba cuántas filas tiene y por qué son esas.

Apartado b): la tabla de presentación

  1. A partir de ventas_largo, prepara la tabla del informe con una fila por trimestre y una columna por tienda, y añade una última columna Total con la venta de la cadena en ese trimestre.

  2. La tabla original tenía una fila por tienda y tú acabas de hacer una con una fila por trimestre. ¿Qué tienen en común las dos y en qué se diferencian de ventas_largo?

Apartado c): crecimiento

  1. ¿Qué tienda creció más del primer al cuarto trimestre, en porcentaje? Calcúlalo y ordena.

  2. ¿Has hecho (1) en formato ancho o en largo? ¿Se puede hacer en el otro? Explica en una frase cuál de los dos formatos te ha resultado más cómodo para esta pregunta concreta y por qué.

Entrega 3: cuando la respuesta está en varias tablas

Ahora hacen falta ventas, tiendas, objetivos, precios, devoluciones y empleados.

Apartado a): la región no vive en la venta

  1. ventas no tiene la región: está en tiendas. Calcula los ingresos de 2022 por región, con el número de ventas de cada una, ordenados de mayor a menor.

  2. Antes de unir, comprueba que id_tienda identifica una sola fila de tiendas. Cuenta las filas antes y después de la unión: ¿coinciden?

Apartado b): noviembre contra el objetivo

  1. ventas guarda el precio del catálogo de hoy, pero el histórico está en precios, que tiene una fila por producto y periodo de vigencia. Une las ventas de noviembre de 2023 con precios por id_producto y cuenta las filas antes y después. ¿Por qué salen más?

  2. Añade la condición que falta (la fecha de la venta dentro del periodo de vigencia) y vuelve a contar. ¿Cuántos precios ausentes quedan?

  3. Calcula la facturación real de noviembre de 2023 de cada tienda a los precios vigentes, únela con su objetivo de ese mes y añade el porcentaje de cumplimiento, de mayor a menor. ¿Cuántas tiendas cumplieron? ¿Cuál fue la peor?

  4. Un compañero une objetivos antes de agregar y suma la columna objetivo junto con la facturación. Explica, sin ejecutarlo, qué le va a pasar al objetivo de una tienda con trece ventas en el mes.

Apartado c): unir sin perder (ni inventar) filas

  1. ¿Cuántas ventas tienen alguna devolución asociada y cuántas no? Hazlo sin añadir ni una columna al resultado.

  2. ¿Cuántos empleados de empleados no tienen ninguna venta a su nombre? ¿Y cuántos sí? La suma debe dar el total de empleados.

  3. ¿Qué habrías obtenido en (1) con un left_join() en lugar de la unión de filtrado? ¿Cuántas filas tendría el resultado y por qué no sirve para contar ventas?

Apartado d): comprobar la clave ANTES de unir

  1. Con count(), averigua cuál es la clave primaria de precios, de objetivos y de devoluciones. Para cada una: ¿hay filas repetidas si cuentas solo por la primera columna candidata? ¿Y por la clave completa?

  2. Simula un error de carga: duplica la categoría 1 en categorias con bind_rows() y une productos con esa tabla estropeada. ¿Cuántas filas salen? ¿Cuántos productos hay de la categoría 1? Comprueba que el número cuadra.

  3. dplyr avisa de la unión many-to-many pero calcula el resultado igual. Añade relationship = "many-to-one" a la unión de (2) y di qué cambia. ¿Por qué es mejor un error que un aviso?

Apartado e): dos columnas, una sola clave

  1. promociones_empleado guarda el bono de 40 empleados, pero no con el identificador global: usa cod_empleado, que es el número del empleado dentro de su tienda. Comprueba con count() que cod_empleado por sí solo se repite y que la pareja cod_tienda más cod_empleado no.

  2. Quédate con la plantilla (empleados que sí tienen tienda) y únela con los bonos solo por cod_empleado. ¿Cuántas filas salen? ¿Cuántas deberían salir?

  3. Repite la unión con las dos columnas de la clave. Calcula el bono medio de la plantilla con las dos uniones, la mala y la buena. Las dos dan un número razonable: explica en dos líneas por qué eso es justamente lo peligroso.

Cómo se entrega

Importante

Cada ejercicio es una entrega, por el formulario de entrega:

  • Entrega 1: la cadena de tiendas. T03_E1_ID.zip
  • Entrega 2: el informe trimestral. T03_E2_ID.zip
  • Entrega 3: la respuesta en varias tablas. T03_E3_ID.zip

Subid en cada una un solo .zip con el .qmd y el .html dentro. El ID es el mismo identificador que escribís en el formulario (ver Cómo trabajar). Por ejemplo, T03_E1_12345678.zip.

Se os dirá en clase cuáles de las tres hay que entregar y cuándo.

Comprobad que el nombre sea exacto, o la entrega se rechazará. Recibiréis un correo de confirmación si la entrega es correcta, o de rechazo si no lo es.

Renderizad con embed-resources: true para que el .html se vea por sí solo. El .qmd tiene que compilar: si no compila, el ejercicio no se corrige.

No se valora que esté perfecto: se valora el progreso y que se vea lo que habéis entendido. Si os quedáis a medias, entregad lo que tengáis.

Advertencia

Las entregas que se hagan en clase se cierran al acabar la sesión, con un margen de 15 minutos desde el final. La hora de envío queda registrada.