← Todos los proyectosAll projects
PythonPandasScikit-learnForecastingRetail

Rossmann: qué mueve las ventas de 1.115 tiendasRossmann: what drives sales across 1,115 stores

Dos años y medio de ventas diarias de la cadena de droguerías alemana. Primero respondo a las preguntas de negocio (¿funcionan las promociones?, ¿afecta la competencia?) y después construyo una previsión de ventas a 6 semanas, comparándola con una referencia sencilla. Two and a half years of daily sales from the German drugstore chain. First I answer the business questions (do promotions work? does competition matter?), then I build a 6-week sales forecast and compare it with a simple baseline.

DatosData: Kaggle · Rossmann Store Sales PeriodoPeriod: 2013-01 – 2015-07 CódigoCode: rossmann_sales.py
Pregunta de negocioBusiness question

¿Qué factores explican las ventas de cada tienda y podemos prever las próximas 6 semanas mejor que con la media histórica, para planificar personal y stock? Which factors explain each store's sales, and can we forecast the next 6 weeks better than the historical average, to plan staffing and stock?

01

Las promociones funcionan, y no solo atraen gentePromotions work, and not just by bringing people in

Un día con promoción, una tienda vende de media un 38,8 % más. He separado ese efecto en sus dos partes: entran un 21,2 % más de clientes y cada cliente gasta un 14,5 % más. La promoción hace que se compre más, no solo que venga más gente. On a promotion day, a store sells 38.8% more on average. I split that effect into its two parts: 21.2% more customers come in and each customer spends 14.5% more. Promotions grow the basket, not just foot traffic.

Descomposición del efecto de la promociónBreaking down the promotion effect

Ventas = clientes × ticket medio · días con promoción frente a días sin ellaSales = customers × average ticket · promo days vs non-promo days

Venta media por tienda según el día de la semanaAverage sales per store by weekday

02

Diciembre lo cambia todoDecember changes everything

La venta media diaria en diciembre es un 25,7 % mayor que en el resto del año, con picos muy marcados las semanas antes de Navidad. Esto hay que tenerlo en cuenta al planificar el stock y el personal. Average daily sales in December are 25.7% higher than the rest of the year, with sharp peaks in the weeks before Christmas. Stock and staffing plans need to account for this.

Venta media por tienda y día, por semanaAverage sales per store-day, by week

Uso la media y no el total: 180 tiendas no tienen datos entre julio y diciembre de 2014 y el total daría una caída falsa. Los dientes de sierra son las semanas alternas de promoción.I use the mean rather than the total: 180 stores have no data between July and December 2014, so the total would show a fake drop. The sawtooth pattern is the alternating promotion weeks.

03

Formatos de tienda distintos, estrategias distintasDifferent store formats, different strategies

Las tiendas tipo b (solo 17) venden un 48 % más que las demás con un ticket mucho menor: mucha gente que compra poco, como en estaciones o zonas de paso. Las tipo d son lo contrario: menos clientes con la cesta más grande. A unas les conviene acelerar el paso por caja y a otras subir la venta cruzada. Type b stores (only 17) sell 48% more than the rest with a much smaller ticket: lots of people buying little, like stations or transit areas. Type d stores are the opposite: fewer customers with the biggest baskets. One format benefits from faster checkouts, the other from more cross-selling.

Clientes diarios frente a ticket medio, por tipo de tiendaDaily customers vs average ticket, by store type

El tamaño de la burbuja es la venta media diariaBubble size = average daily sales

Venta media según la distancia al competidor más cercanoAverage sales by distance to nearest competitor

Las tiendas con un competidor a menos de 500 m venden más: es correlación, no causa (la competencia se instala donde hay más gente).Stores with a competitor under 500 m sell more: that's correlation, not causation (competitors open where the footfall is).

04

Previsión a 6 semanas, validada en el tiempoA 6-week forecast, validated over time

Guardé las últimas 6 semanas como "futuro", entrené solo con los datos anteriores y comparé con una referencia razonable: la mediana histórica de cada tienda según el día de la semana y si hay promoción. El modelo reduce el error (RMSPE) del 14,5 % al 13,2 %, un 8,9 % menos. I held out the last 6 weeks as the "future", trained only on earlier data and compared against a sensible baseline: each store's historical median by weekday and promotion. The model cuts the error (RMSPE) from 14.5% to 13.2%, an 8.9% reduction.

Ventas totales diarias de la cadena: real frente a previsto (M€)Total daily chain sales: actual vs forecast (€M)

Periodo de validación: 20 de junio – 31 de julio de 2015 · días abiertosValidation window: 20 June – 31 July 2015 · open days

⚙

Cómo lo construíHow I built it

LimitacionesLimitations

  • El efecto de la promoción es una comparación observacional: si las promociones se programan en días que ya son buenos, el efecto real sería algo menor.The promotion effect is an observational comparison: if promotions are scheduled on days that are already strong, the true effect would be somewhat smaller.
  • Solo 33 tiendas abren en domingo, así que la media del domingo no representa a la cadena.Only 33 stores open on Sundays, so the Sunday average doesn't represent the chain.
  • Una mejora del 8,9 % sobre una referencia fuerte es modesta. Lo siguiente sería añadir festivos regionales, el tiempo y variables de retardo por tienda.An 8.9% improvement over a strong baseline is modest. Next I would add regional holidays, weather and per-store lag features.
Siguiente proyectoNext project Clasificación de dígitos manuscritosHandwritten digit classification →