Este informe presenta un análisis descriptivo, exploratorio y diagnóstico del desempeño comercial y financiero de Adidas a partir de una base de datos con 9,648 registros de ventas, desagregados por distribuidor, región, estado, ciudad, producto y método de venta.
El objetivo es identificar patrones de comportamiento en ventas y rentabilidad que sirvan de insumo para recomendaciones de tipo prescriptivo dirigidas al equipo directivo de la compañía. Las variables analizadas incluyen precio por unidad, unidades vendidas, ventas totales, utilidad operativa y margen operativo.
Nota metodológica: la base de datos no contiene una variable de fecha/periodo, por lo cual no es posible calcular tasas de crecimiento temporal; este análisis se enfoca en comparaciones transversales (cross-sectional) entre segmentos.
## Rows: 9,648
## Columns: 12
## $ distribuidor <fct> Foot Locker, Foot Locker, Foot Locker, Foot Locke…
## $ region <fct> Northeast, Northeast, Northeast, Northeast, North…
## $ estado <fct> New York, New York, New York, New York, New York,…
## $ ciudad <fct> New York, New York, New York, New York, New York,…
## $ producto <fct> Men's Street Footwear, Men's Athletic Footwear, W…
## $ precio_unidad <dbl> 50, 50, 40, 45, 60, 50, 50, 50, 40, 45, 60, 50, 5…
## $ unidades_vendidas <dbl> 1200, 1000, 1000, 850, 900, 1000, 1250, 900, 950,…
## $ ventas_total <dbl> 60000, 50000, 40000, 38250, 54000, 50000, 62500, …
## $ utilidad_operativa <dbl> 30000.00, 15000.00, 14000.00, 13387.50, 16200.00,…
## $ margen_operativo <dbl> 0.50, 0.30, 0.35, 0.35, 0.30, 0.25, 0.50, 0.30, 0…
## $ metodo_venta <fct> In-store, In-store, In-store, In-store, In-store,…
## $ margen_operativo_pct <dbl> 50, 30, 35, 35, 30, 25, 50, 30, 35, 35, 30, 25, 5…
## Número de observaciones: 9648
## Número de variables: 12
## Productos distintos: 6
## Regiones distintas: 5
## Ciudades distintas: 52
## Distribuidores distintos: 6
## Métodos de venta: In-store, Online, Outlet
resumen_gral <- datos %>%
summarise(across(c(precio_unidad, unidades_vendidas, ventas_total,
utilidad_operativa, margen_operativo_pct),
list(Media = ~mean(.x, na.rm = TRUE),
Mediana = ~median(.x, na.rm = TRUE),
Desv_Est = ~sd(.x, na.rm = TRUE),
CV_pct = ~cv(.x),
Min = ~min(.x, na.rm = TRUE),
Q1 = ~quantile(.x, 0.25, na.rm = TRUE),
Q3 = ~quantile(.x, 0.75, na.rm = TRUE),
Max = ~max(.x, na.rm = TRUE)),
.names = "{.col}__{.fn}")) %>%
pivot_longer(everything(), names_to = c("Variable", "Estadístico"), names_sep = "__") %>%
pivot_wider(names_from = Estadístico, values_from = value)
resumen_gral %>%
mutate(across(where(is.numeric), ~round(.x, 2))) %>%
kable(caption = "Estadísticas descriptivas de las variables clave") %>%
kable_styling(bootstrap_options = c("striped","hover","condensed"), full_width = FALSE)| Variable | Media | Mediana | Desv_Est | CV_pct | Min | Q1 | Q3 | Max |
|---|---|---|---|---|---|---|---|---|
| precio_unidad | 45.22 | 45.00 | 14.71 | 32.52 | 7 | 35.00 | 55.00 | 110 |
| unidades_vendidas | 256.93 | 176.00 | 214.25 | 83.39 | 0 | 106.00 | 350.00 | 1275 |
| ventas_total | 12455.08 | 7803.50 | 12716.39 | 102.10 | 0 | 4065.25 | 15864.50 | 82500 |
| utilidad_operativa | 4894.79 | 3262.98 | 4866.46 | 99.42 | 0 | 1753.44 | 6192.36 | 39000 |
| margen_operativo_pct | 42.30 | 41.00 | 9.72 | 22.98 | 10 | 35.00 | 49.00 | 80 |
Interpretación: el coeficiente de variación (CV) permite comparar la dispersión relativa entre variables con distintas escalas. Valores de CV superiores al 40-50% indican alta heterogeneidad en el comportamiento de la variable entre transacciones, lo cual sugiere revisar si dicha variabilidad está asociada a diferencias por región, producto o canal de venta —análisis que se desarrolla en las siguientes secciones.
ventas_region <- datos %>%
group_by(region) %>%
summarise(Ventas_Totales = sum(ventas_total),
Unidades = sum(unidades_vendidas),
Ticket_Promedio = mean(ventas_total)) %>%
arrange(desc(Ventas_Totales))
kable(ventas_region, caption = "Ventas y unidades por región",
format.args = list(big.mark = ",")) %>%
kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE)| region | Ventas_Totales | Unidades | Ticket_Promedio |
|---|---|---|---|
| West | 36,436,157 | 686,985 | 14,884.051 |
| Northeast | 25,078,267 | 501,279 | 10,554.826 |
| Southeast | 21,374,436 | 407,000 | 17,462.775 |
| South | 20,603,356 | 492,260 | 11,923.238 |
| Midwest | 16,674,434 | 391,337 | 8,907.283 |
ggplot(ventas_region, aes(x = fct_reorder(region, Ventas_Totales), y = Ventas_Totales)) +
geom_col(fill = "#000000") +
coord_flip() +
scale_y_continuous(labels = label_dollar(prefix = "$", big.mark = ",")) +
labs(title = "Ventas totales por región", x = "Región", y = "Ventas totales (USD)") +
theme_minimal(base_size = 12)Interpretación: la región líder en ventas totales es West, con $36,436,157, mientras que la de menor desempeño es Midwest. Esta brecha regional es un primer indicio de dónde concentrar esfuerzos comerciales o replicar buenas prácticas.
top_ciudades <- datos %>%
group_by(ciudad) %>%
summarise(Ventas_Totales = sum(ventas_total)) %>%
arrange(desc(Ventas_Totales)) %>%
slice_head(n = 10)
ggplot(top_ciudades, aes(x = fct_reorder(ciudad, Ventas_Totales), y = Ventas_Totales)) +
geom_col(fill = "#E03A3A") +
coord_flip() +
scale_y_continuous(labels = label_dollar(prefix = "$", big.mark = ",")) +
labs(title = "Top 10 ciudades por ventas totales", x = "Ciudad", y = "Ventas totales (USD)") +
theme_minimal(base_size = 12)Interpretación: la ciudad New York concentra el mayor volumen de ventas ($5,676,160). La concentración geográfica observada en el top 10 sugiere posibles focos de inversión en marketing local o expansión hacia ciudades con desempeño aún bajo.
ventas_dist <- datos %>%
group_by(distribuidor) %>%
summarise(Ventas_Totales = sum(ventas_total),
Utilidad = sum(utilidad_operativa),
Margen_Prom = mean(margen_operativo_pct)) %>%
arrange(desc(Ventas_Totales))
kable(ventas_dist, caption = "Ventas, utilidad y margen promedio por distribuidor",
digits = 2, format.args = list(big.mark = ",")) %>%
kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE)| distribuidor | Ventas_Totales | Utilidad | Margen_Prom |
|---|---|---|---|
| West Gear | 32,409,558 | 12,196,891 | 41.79 |
| Foot Locker | 29,024,945 | 11,317,027 | 41.79 |
| Sports Direct | 24,616,622 | 10,641,609 | 44.49 |
| Kohl’s | 13,512,453 | 5,182,260 | 41.93 |
| Walmart | 10,506,085 | 3,902,749 | 40.65 |
| Amazon | 10,096,987 | 3,984,432 | 41.79 |
ggplot(ventas_dist, aes(x = fct_reorder(distribuidor, Ventas_Totales), y = Ventas_Totales)) +
geom_col(fill = "#1F77B4") +
coord_flip() +
scale_y_continuous(labels = label_dollar(prefix = "$", big.mark = ",")) +
labs(title = "Ventas totales por distribuidor", x = "Distribuidor", y = "Ventas totales (USD)") +
theme_minimal(base_size = 12)Interpretación: el distribuidor West Gear es el principal canal en volumen de ventas. Vale la pena contrastar este resultado con su margen promedio (columna Margen_Prom): un distribuidor con altas ventas pero bajo margen podría estar afectando la rentabilidad global de la marca vía descuentos o condiciones comerciales.
ventas_producto <- datos %>%
group_by(producto) %>%
summarise(Ventas_Totales = sum(ventas_total),
Unidades = sum(unidades_vendidas)) %>%
mutate(Participacion_pct = Ventas_Totales / sum(Ventas_Totales) * 100) %>%
arrange(desc(Ventas_Totales))
kable(ventas_producto, caption = "Ventas y participación por línea de producto",
digits = 2, format.args = list(big.mark = ",")) %>%
kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE)| producto | Ventas_Totales | Unidades | Participacion_pct |
|---|---|---|---|
| Men’s Street Footwear | 27,680,769 | 593,320 | 23.04 |
| Women’s Apparel | 23,870,985 | 433,827 | 19.86 |
| Men’s Athletic Footwear | 20,577,180 | 435,526 | 17.12 |
| Women’s Street Footwear | 17,201,563 | 392,269 | 14.31 |
| Men’s Apparel | 16,520,632 | 306,683 | 13.75 |
| Women’s Athletic Footwear | 14,315,521 | 317,236 | 11.91 |
ggplot(ventas_producto, aes(x = "", y = Participacion_pct, fill = producto)) +
geom_col(width = 1) +
coord_polar(theta = "y") +
scale_fill_manual(values = colorRampPalette(paleta)(nrow(ventas_producto))) +
labs(title = "Participación de cada producto en las ventas totales", fill = "Producto") +
theme_void(base_size = 12)Interpretación: la línea Men’s Street Footwear representa el 23% de las ventas totales, siendo el producto más relevante en el portafolio. Los productos con baja participación son candidatos a evaluar si se mantienen, se reposicionan o se retiran del catálogo.
ggplot(datos, aes(x = fct_reorder(region, ventas_total, .fun = median), y = ventas_total)) +
geom_boxplot(fill = "#8C8C8C", outlier.color = "#E03A3A", outlier.alpha = 0.4) +
coord_flip() +
scale_y_continuous(labels = label_dollar(prefix = "$", big.mark = ",")) +
labs(title = "Distribución de ventas totales por región (con atípicos)",
x = "Región", y = "Ventas totales por transacción (USD)") +
theme_minimal(base_size = 12)ggplot(datos, aes(x = fct_reorder(producto, unidades_vendidas, .fun = median), y = unidades_vendidas)) +
geom_boxplot(fill = "#B5B5B5", outlier.color = "#000000", outlier.alpha = 0.4) +
coord_flip() +
labs(title = "Distribución de unidades vendidas por producto",
x = "Producto", y = "Unidades vendidas por transacción") +
theme_minimal(base_size = 12)Interpretación: los boxplots evidencian la presencia de valores atípicos (outliers) por encima del bigote superior en varias regiones y productos, lo que indica transacciones puntuales de venta excepcionalmente altas (posiblemente compras masivas de distribuidores grandes o promociones). La dispersión (ancho de la caja) también difiere entre categorías: mientras algunas regiones/productos muestran ventas homogéneas, otras presentan alta variabilidad, lo que puede reflejar mercados menos estables o más sensibles a factores externos (estacionalidad, promociones, competencia).
ggplot(datos, aes(x = utilidad_operativa)) +
geom_histogram(fill = "#000000", bins = 40, color = "white") +
scale_x_continuous(labels = label_dollar(prefix = "$", big.mark = ",")) +
labs(title = "Distribución de la utilidad operativa", x = "Utilidad operativa (USD)", y = "Frecuencia") +
theme_minimal(base_size = 12)ggplot(datos, aes(x = margen_operativo_pct)) +
geom_histogram(fill = "#E03A3A", bins = 30, color = "white") +
labs(title = "Distribución del margen operativo", x = "Margen operativo (%)", y = "Frecuencia") +
theme_minimal(base_size = 12)margen_media <- mean(datos$margen_operativo_pct)
margen_mediana <- median(datos$margen_operativo_pct)
margen_sd <- sd(datos$margen_operativo_pct)
margen_cv <- cv(datos$margen_operativo_pct)Interpretación: el margen operativo promedio es de 42.3% (mediana 41%), con una desviación estándar de 9.7 puntos porcentuales y un coeficiente de variación de 23%. Un CV moderado indica que, si bien existe una tendencia central clara, hay categorías con rentabilidad sustancialmente distinta a la media, lo cual justifica el análisis por segmento que se presenta a continuación.
margen_producto <- datos %>%
group_by(producto) %>%
summarise(Margen_Promedio = mean(margen_operativo_pct),
Utilidad_Total = sum(utilidad_operativa)) %>%
arrange(desc(Margen_Promedio))
ggplot(margen_producto, aes(x = fct_reorder(producto, Margen_Promedio), y = Margen_Promedio)) +
geom_col(fill = "#2CA02C") +
coord_flip() +
labs(title = "Margen operativo promedio por producto", x = "Producto", y = "Margen operativo promedio (%)") +
theme_minimal(base_size = 12)margen_region <- datos %>%
group_by(region) %>%
summarise(Margen_Promedio = mean(margen_operativo_pct)) %>%
arrange(desc(Margen_Promedio))
margen_metodo <- datos %>%
group_by(metodo_venta) %>%
summarise(Margen_Promedio = mean(margen_operativo_pct),
Ventas_Totales = sum(ventas_total)) %>%
arrange(desc(Margen_Promedio))
kable(margen_region, caption = "Margen operativo promedio por región", digits = 2) %>%
kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE)| region | Margen_Promedio |
|---|---|
| South | 46.69 |
| Midwest | 43.53 |
| Southeast | 41.92 |
| Northeast | 41.05 |
| West | 39.67 |
kable(margen_metodo, caption = "Margen operativo promedio y ventas por método de venta",
digits = 2, format.args = list(big.mark = ",")) %>%
kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE)| metodo_venta | Margen_Promedio | Ventas_Totales |
|---|---|---|
| Online | 46.42 | 44,965,657 |
| Outlet | 39.49 | 39,536,618 |
| In-store | 35.61 | 35,664,375 |
Interpretación: el producto más rentable en términos de margen promedio es Men’s Street Footwear (44.6%), mientras que el método de venta Online presenta el mayor margen promedio entre los canales disponibles. Comparar esta tabla con la de participación en ventas (sección anterior) permite identificar si los productos/canales de mayor volumen son también los más rentables, o si existe una desalineación entre volumen y rentabilidad que deba corregirse.
cor_ventas_utilidad <- cor(datos$ventas_total, datos$utilidad_operativa)
ggplot(datos, aes(x = ventas_total, y = utilidad_operativa, color = metodo_venta)) +
geom_point(alpha = 0.35) +
geom_smooth(method = "lm", se = FALSE, color = "black") +
scale_x_continuous(labels = label_dollar(prefix = "$", big.mark = ",")) +
scale_y_continuous(labels = label_dollar(prefix = "$", big.mark = ",")) +
labs(title = "Relación entre ventas totales y utilidad operativa",
x = "Ventas totales (USD)", y = "Utilidad operativa (USD)", color = "Método de venta") +
theme_minimal(base_size = 12)Interpretación: la correlación entre ventas totales y utilidad operativa es de 0.94, lo que indica una relación fuerte y positiva: a mayor volumen de ventas, mayor utilidad generada, tal como se espera. Sin embargo, la dispersión alrededor de la línea de tendencia muestra que no todas las transacciones con ventas altas logran una utilidad proporcional, lo que refuerza la importancia de gestionar el margen y no solo el volumen.
vars_num <- datos %>% select(precio_unidad, unidades_vendidas, ventas_total,
utilidad_operativa, margen_operativo_pct)
mat_cor <- cor(vars_num)
corrplot(mat_cor, method = "color", type = "upper", addCoef.col = "black",
tl.col = "black", tl.srt = 45, number.cex = 0.8,
col = colorRampPalette(c("#E03A3A","white","#1F77B4"))(200),
title = "Matriz de correlación de variables clave", mar = c(0,0,2,0))Interpretación: la matriz resume las asociaciones
lineales entre las variables numéricas. Se espera una correlación alta
entre unidades_vendidas y ventas_total
(relación casi mecánica), mientras que la relación de
precio_unidad con unidades_vendidas y con
margen_operativo es la que aporta información diagnóstica
más relevante para la estrategia comercial.
cor_precio_unidades <- cor(datos$precio_unidad, datos$unidades_vendidas)
ggplot(datos, aes(x = precio_unidad, y = unidades_vendidas)) +
geom_point(alpha = 0.3, color = "#000000") +
geom_smooth(method = "lm", se = FALSE, color = "#E03A3A") +
labs(title = "Precio por unidad vs. unidades vendidas",
x = "Precio por unidad (USD)", y = "Unidades vendidas") +
theme_minimal(base_size = 12)Interpretación: la correlación entre precio y unidades vendidas es de 0.27. Sorprendentemente la relación es positiva, lo que sugiere que el precio no es la variable dominante en la decisión de compra (posible efecto de marca, calidad percibida o segmento premium).
cor_precio_margen <- cor(datos$precio_unidad, datos$margen_operativo_pct)
ggplot(datos, aes(x = precio_unidad, y = margen_operativo_pct)) +
geom_point(alpha = 0.3, color = "#1F77B4") +
geom_smooth(method = "lm", se = FALSE, color = "black") +
labs(title = "Precio por unidad vs. margen operativo",
x = "Precio por unidad (USD)", y = "Margen operativo (%)") +
theme_minimal(base_size = 12)Interpretación: la correlación entre precio y margen operativo es de -0.14, lo que sugiere que el precio por sí solo no garantiza mayor rentabilidad porcentual; el margen depende también de costos, canal y volumen de descuentos aplicados.
cor_utilidad <- sapply(vars_num %>% select(-utilidad_operativa), function(x) cor(x, datos$utilidad_operativa))
cor_utilidad_df <- data.frame(Variable = names(cor_utilidad), Correlacion_con_Utilidad = round(cor_utilidad,3)) %>%
arrange(desc(abs(Correlacion_con_Utilidad)))
kable(cor_utilidad_df, caption = "Ranking de variables según su asociación con la utilidad operativa") %>%
kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE)| Variable | Correlacion_con_Utilidad | |
|---|---|---|
| ventas_total | ventas_total | 0.935 |
| unidades_vendidas | unidades_vendidas | 0.872 |
| precio_unidad | precio_unidad | 0.504 |
| margen_operativo_pct | margen_operativo_pct | -0.047 |
Interpretación: la variable con mayor asociación con la utilidad operativa es ventas_total (r = 0.935). Esto sugiere que, para maximizar utilidad, la palanca de gestión más directa observada en los datos es esta variable, por encima de otras como el precio unitario de forma aislada.
tabla_prod_region <- datos %>%
group_by(producto, region) %>%
summarise(Ventas_Totales = sum(ventas_total), .groups = "drop")
ggplot(tabla_prod_region, aes(x = region, y = producto, fill = Ventas_Totales)) +
geom_tile(color = "white") +
scale_fill_gradient(low = "#F2F2F2", high = "#000000", labels = label_dollar(prefix="$", big.mark=",")) +
labs(title = "Ventas totales por combinación producto × región",
x = "Región", y = "Producto", fill = "Ventas (USD)") +
theme_minimal(base_size = 11) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))top_combo_region <- tabla_prod_region %>% arrange(desc(Ventas_Totales)) %>% slice_head(n = 5)
kable(top_combo_region, caption = "Top 5 combinaciones producto-región por ventas",
format.args = list(big.mark = ",")) %>%
kable_styling(bootstrap_options = c("striped","hover"), full_width = FALSE)| producto | region | Ventas_Totales |
|---|---|---|
| Men’s Street Footwear | West | 7,389,988 |
| Women’s Apparel | West | 7,038,046 |
| Men’s Street Footwear | Northeast | 6,841,324 |
| Men’s Athletic Footwear | West | 6,761,339 |
| Women’s Street Footwear | West | 5,748,586 |
tabla_prod_metodo <- datos %>%
group_by(producto, metodo_venta) %>%
summarise(Ventas_Totales = sum(ventas_total), .groups = "drop")
ggplot(tabla_prod_metodo, aes(x = metodo_venta, y = producto, fill = Ventas_Totales)) +
geom_tile(color = "white") +
scale_fill_gradient(low = "#F2F2F2", high = "#E03A3A", labels = label_dollar(prefix="$", big.mark=",")) +
labs(title = "Ventas totales por combinación producto × método de venta",
x = "Método de venta", y = "Producto", fill = "Ventas (USD)") +
theme_minimal(base_size = 11)Interpretación: la combinación con mayor volumen de ventas es Men’s Street Footwear en la región West, con $7,389,988. Estas combinaciones “ganadoras” son las que Adidas debería priorizar en inventario, publicidad y negociación con distribuidores, mientras que las celdas más claras de los mapas de calor representan oportunidades de crecimiento aún no explotadas.
ggplot(ventas_producto, aes(area = Ventas_Totales, fill = producto, label = producto)) +
geom_treemap() +
geom_treemap_text(colour = "white", place = "centre", grow = FALSE, reflow = TRUE) +
scale_fill_manual(values = colorRampPalette(paleta)(nrow(ventas_producto))) +
labs(title = "Participación de productos en las ventas totales (treemap)") +
theme(legend.position = "none")Con base en el análisis descriptivo y diagnóstico realizado, se plantean las siguientes recomendaciones para el equipo directivo de Adidas:
Informe generado en R Markdown como parte del Caso 1 — Analítica Descriptiva, curso Analítica de Datos para la Toma de Decisiones, Pontificia Universidad Javeriana de Cali. Profesora: Julieth Stefens Cerón.