¿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?
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
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.
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).
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
- Limpieza: uní ventas con la ficha de cada tienda y descarté días cerrados o con venta 0 (no aportan a la previsión de una tienda abierta).Cleaning: joined sales with store metadata and dropped closed or zero-sales days (they don't help forecast an open store).
- Variables: calendario, meses desde que abrió la competencia, semanas en la promoción continua (Promo2), si el mes es de promoción y el perfil histórico de cada tienda.Features: calendar, months since the competitor opened, weeks in the continuous promotion (Promo2), whether it's a promo month, and each store's historical profile.
- Sin fugas: el perfil histórico de cada tienda (medias por día y por promoción) se calcula solo con el periodo de entrenamiento.No leakage: each store's historical profile (means by weekday and promo) is computed from the training window only.
- Modelo:
HistGradientBoostingRegressorsobre log(ventas), la métrica de la competición (RMSPE) y una primera versión que no superaba a la referencia, que mejoré añadiendo el perfil de cada tienda.Model:HistGradientBoostingRegressoron log(sales), the competition metric (RMSPE), and a first version that did not beat the baseline, which I improved by adding each store's profile.
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.