library(tidyverse)
load("data/retail_data.RData")Tema 03 - Datos: tratamiento, limpieza y preparación
Ejercicios del tema
Antes de empezar
Estos ejercicios se van haciendo durante las clases del tema: las transparencias indican en qué momento toca cada uno.
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 subdirectoriodata. Dentro vienen las tablas de una cadena de tiendas:ventas,productos,categorias,clientes,empleados,tiendas,promociones_empleado,devoluciones,precios,objetivosyventas_ancho. - Un documento por ejercicio,
T03_E<n>_<ID>.qmd:T03_E1_12345678.qmdpara la entrega 1,T03_E2_12345678.qmdpara el 2, y así. Cada uno carga los datos en su primera celda.
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
¿Cuántas filas y cuántas columnas tiene
ventas? ¿Qué es una fila de esta tabla?¿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?
¿Entre qué fechas van los datos?
¿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
Crea
ventas_mincon solo estas columnas:id_venta,fecha,id_tienda,id_producto,cantidadytotal.¿Cuántas ventas hubo en 2023? De ellas, ¿cuántas se hicieron con algún descuento?
¿Cuántas ventas de 2023 se hicieron en fin de semana (
dia_semanaes"sábado"o"domingo")?
Apartado c): columnas nuevas y orden
Añade a
ventasuna columnaingreso_unitariocon el importe medio por unidad vendida (totaldividido porcantidad).¿Cuáles son las tres ventas de mayor importe de 2023? Muestra
id_venta,id_tiendaytotal.La misma pregunta, pero ordenando de menor a mayor. ¿Qué argumento cambia?
Apartado d): de datos individuales a datos agregados
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.
¿Qué tienda ingresó más? ¿Es también la que hizo más ventas? ¿Y la del ticket medio más alto?
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()sobresummarize().
Apartado e): porcentajes que suman 100 cuando no deben
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.
¿Qué mes fue el mejor del año y cuánto pesó?
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.
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.
¿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?
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).
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)?
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ássummarize().
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
Mira la tabla. ¿Qué es una fila? ¿Está en formato ordenado? ¿Por qué no?
¿En qué trimestre vendió más la cadena entera, y cuánto? Para poder agrupar por trimestre, ¿qué formato necesitas?
Guarda la versión larga en
ventas_largoy comprueba cuántas filas tiene y por qué son esas.
Apartado b): la tabla de presentación
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 columnaTotalcon la venta de la cadena en ese trimestre.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
¿Qué tienda creció más del primer al cuarto trimestre, en porcentaje? Calcúlalo y ordena.
¿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
ventasno tiene la región: está entiendas. Calcula los ingresos de 2022 por región, con el número de ventas de cada una, ordenados de mayor a menor.Antes de unir, comprueba que
id_tiendaidentifica una sola fila detiendas. Cuenta las filas antes y después de la unión: ¿coinciden?
Apartado b): noviembre contra el objetivo
ventasguarda el precio del catálogo de hoy, pero el histórico está enprecios, que tiene una fila por producto y periodo de vigencia. Une las ventas de noviembre de 2023 conpreciosporid_productoy cuenta las filas antes y después. ¿Por qué salen más?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?
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?
Un compañero une
objetivosantes de agregar y suma la columnaobjetivojunto 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
¿Cuántas ventas tienen alguna devolución asociada y cuántas no? Hazlo sin añadir ni una columna al resultado.
¿Cuántos empleados de
empleadosno tienen ninguna venta a su nombre? ¿Y cuántos sí? La suma debe dar el total de empleados.¿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
Con
count(), averigua cuál es la clave primaria deprecios, deobjetivosy dedevoluciones. Para cada una: ¿hay filas repetidas si cuentas solo por la primera columna candidata? ¿Y por la clave completa?Simula un error de carga: duplica la categoría 1 en
categoriasconbind_rows()y uneproductoscon esa tabla estropeada. ¿Cuántas filas salen? ¿Cuántos productos hay de la categoría 1? Comprueba que el número cuadra.dplyravisa de la unión many-to-many pero calcula el resultado igual. Añaderelationship = "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
promociones_empleadoguarda el bono de 40 empleados, pero no con el identificador global: usacod_empleado, que es el número del empleado dentro de su tienda. Comprueba concount()quecod_empleadopor sí solo se repite y que la parejacod_tiendamáscod_empleadono.Quédate con la plantilla (
empleadosque sí tienen tienda) y únela con los bonos solo porcod_empleado. ¿Cuántas filas salen? ¿Cuántas deberían salir?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
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.
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.