Adidas es una multinacional alemana de artículos deportivos, con presencia en el mercado estadounidense a través de canales propios (tienda física y comercio electrónico) y de grandes retailers asociados (Foot Locker, Walmart, Amazon, entre otros). Este informe analiza su desempeño comercial y financiero específicamente en Estados Unidos, a nivel de retailer, región, estado, producto y canal de venta.
Como equipo de analistas de datos, nuestra tarea es evaluar el desempeño comercial y financiero de las distintas líneas de producto de Adidas, con base en una base de datos de 9.648 transacciones registradas entre 6 retailers, 5 regiones, 50 estados, 52 ciudades, 6 líneas de producto y 3 métodos de venta.
Objetivo general: aplicar técnicas de analítica descriptiva y diagnóstica para interpretar el comportamiento de las ventas y la rentabilidad de Adidas, e identificar patrones que sustenten recomendaciones de negocio (analítica prescriptiva) para la dirección comercial.
Enfoque del análisis. De las preguntas orientadoras propuestas por la cátedra, este informe centra su enfoque en tres bloques, por ser los de mayor valor accionable para un equipo directivo:
Nota metodológica sobre gráficos y estadísticas. A lo largo del informe se usan gráficos de barras para comparar categorías (producto, región, retailer); gráficos de participación/torta para mostrar la composición de las ventas totales; boxplots para analizar dispersión y valores atípicos dentro de cada categoría; gráficos de dispersión para explorar relaciones entre variables numéricas; y matrices de correlación para identificar asociaciones entre variables. No se calculan tasas de crecimiento: la base de datos suministrada no incluye una variable de fecha/periodo, por lo que no es posible construir una serie temporal. Esto se documenta como una limitación del dataset y se retoma como recomendación al final del informe.
PASO 1. Cargar librerías
library(readxl) # Lectura de Excel
library(dplyr) # Manipulación de datos
library(tidyr) # Transformación de datos (pivot, etc.)
library(ggplot2) # Visualizaciones
library(plotly) # Gráficos interactivos
library(knitr) # Tablas e imágenes
library(kableExtra) # Formato de tablas
library(scales) # Formato de ejes ($, %)
library(corrplot) # Matriz de correlación
Paleta de colores institucional del informe (deliberadamente distinta a la paleta por defecto de ggplot2 y a la usada en informes de referencia de compañeros de otros grupos):
pal_producto <- c("#264653", "#2A9D8F", "#E9C46A", "#F4A261", "#E76F51", "#6A4C93")
pal_region <- c("#5C4D7D", "#0B7A75", "#D68C45", "#B33951", "#4A6FA5")
pal_metodo <- c("In-store" = "#118AB2", "Online" = "#EF476F", "Outlet" = "#FFD166")
pal_cuadrante <- c("Alto volumen, alto margen" = "#2A9D8F",
"Alto volumen, margen ajustado" = "#E76F51",
"Bajo volumen, alto margen" = "#6A4C93",
"Bajo volumen, margen ajustado" = "#B0A8B9")
grad_mapa <- c("#FDE9A0", "#F4A261", "#B33951", "#5C1A3A")
PASO 2. Cargar y explorar los datos
datos <- read_excel("DatosCaso1 (1).xlsx")
# Estructura general
str(datos)
## tibble [9,648 × 11] (S3: tbl_df/tbl/data.frame)
## $ distribuidor : chr [1:9648] "Foot Locker" "Foot Locker" "Foot Locker" "Foot Locker" ...
## $ region : chr [1:9648] "Northeast" "Northeast" "Northeast" "Northeast" ...
## $ estado : chr [1:9648] "New York" "New York" "New York" "New York" ...
## $ ciudad : chr [1:9648] "New York" "New York" "New York" "New York" ...
## $ producto : chr [1:9648] "Men's Street Footwear" "Men's Athletic Footwear" "Women's Street Footwear" "Women's Athletic Footwear" ...
## $ precio_unidad : num [1:9648] 50 50 40 45 60 50 50 50 40 45 ...
## $ unidades_vendidas : num [1:9648] 1200 1000 1000 850 900 1000 1250 900 950 825 ...
## $ ventas_total : num [1:9648] 60000 50000 40000 38250 54000 ...
## $ utilidad_operativa: num [1:9648] 30000 15000 14000 13388 16200 ...
## $ margen_operativo : num [1:9648] 0.5 0.3 0.35 0.35 0.3 0.25 0.5 0.3 0.35 0.35 ...
## $ metodo_venta : chr [1:9648] "In-store" "In-store" "In-store" "In-store" ...
glimpse_n <- dim(datos)
glimpse_n # 9648 filas x 11 columnas esperadas
## [1] 9648 11
# Verificación de calidad de datos
colSums(is.na(datos)) # Valores faltantes por columna
## distribuidor region estado ciudad
## 0 0 0 0
## producto precio_unidad unidades_vendidas ventas_total
## 0 0 0 0
## utilidad_operativa margen_operativo metodo_venta
## 0 0 0
sum(duplicated(datos)) # Filas duplicadas
## [1] 262
sum(datos$unidades_vendidas == 0) # Registros con 0 unidades vendidas (posibles atípicos)
## [1] 4
La base no tiene valores nulos ni duplicados. Se
identifican 4 registros con unidades_vendidas = 0 (y por
tanto ventas y utilidad en 0); se conservan en el análisis general
porque representan tiendas/productos sin rotación en ese periodo — un
hallazgo en sí mismo — pero se señalan explícitamente donde puedan
distorsionar promedios.
PASO 3. Estadísticas descriptivas generales
resumen_general <- datos %>%
summarise(across(c(precio_unidad, unidades_vendidas, ventas_total,
utilidad_operativa, margen_operativo),
list(Media = ~mean(.x), Mediana = ~median(.x),
DesvEst = ~sd(.x), Min = ~min(.x), Max = ~max(.x),
Q1 = ~quantile(.x, 0.25), Q3 = ~quantile(.x, 0.75)))) %>%
pivot_longer(everything(), names_to = "variable_stat", values_to = "valor") %>%
separate(variable_stat, into = c("Variable", "Estadistico"), sep = "_(?=[^_]+$)") %>%
pivot_wider(names_from = Estadistico, values_from = valor)
kable(resumen_general, digits = 2, format.args = list(big.mark = ",")) %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Variable | Media | Mediana | DesvEst | Min | Max | Q1 | Q3 |
|---|---|---|---|---|---|---|---|
| precio_unidad | 45.22 | 45.00 | 14.71 | 7.0 | 110.0 | 35.00 | 55.00 |
| unidades_vendidas | 256.93 | 176.00 | 214.25 | 0.0 | 1,275.0 | 106.00 | 350.00 |
| ventas_total | 12,455.08 | 7,803.50 | 12,716.39 | 0.0 | 82,500.0 | 4,065.25 | 15,864.50 |
| utilidad_operativa | 4,894.79 | 3,262.98 | 4,866.46 | 0.0 | 39,000.0 | 1,753.44 | 6,192.36 |
| margen_operativo | 0.42 | 0.41 | 0.10 | 0.1 | 0.8 | 0.35 | 0.49 |
Indicadores clave (KPI) del negocio:
kpis <- datos %>%
summarise(
`Ventas totales (USD)` = sum(ventas_total),
`Utilidad operativa (USD)` = sum(utilidad_operativa),
`Margen global (%)` = sum(utilidad_operativa) / sum(ventas_total) * 100,
`Unidades vendidas` = sum(unidades_vendidas),
`Ticket promedio (USD)` = mean(ventas_total),
`N° transacciones` = n()
)
kable(kpis, digits = 1, format.args = list(big.mark = ",")) %>%
kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
| Ventas totales (USD) | Utilidad operativa (USD) | Margen global (%) | Unidades vendidas | Ticket promedio (USD) | N° transacciones |
|---|---|---|---|---|---|
| 120,166,650 | 47,224,968 | 39.3 | 2,478,861 | 12,455.1 | 9,648 |
Adidas facturó US$120,2 millones en el periodo analizado, con una utilidad operativa de US$47,2 millones (margen global del 39,3%) sobre 2,48 millones de unidades vendidas, en un ticket promedio de US$12.455 por transacción.
Nota: el margen global (39,3%) es utilidad total / ventas totales (un promedio ponderado por el tamaño de cada transacción). Es distinto del margen promedio simple por transacción (42,3%, ver tabla de estadísticas descriptivas más abajo), que le da el mismo peso a una venta pequeña que a una grande. Ambos son correctos; el global es el que corresponde al estado de resultados de la compañía, y el simple describe mejor la transacción “típica”.
ventas_producto <- datos %>%
group_by(producto) %>%
summarise(ventas_total = sum(ventas_total), margen_prom = mean(margen_operativo)) %>%
mutate(participacion = ventas_total / sum(ventas_total)) %>%
arrange(desc(ventas_total))
g_prod <- ggplot(ventas_producto, aes(x = reorder(producto, ventas_total), y = ventas_total,
fill = producto)) +
geom_col(show.legend = FALSE) +
geom_text(aes(label = paste0(dollar(ventas_total, scale = 1e-6, suffix = "M"),
"\n(margen ", percent(margen_prom, accuracy = 1), ")")),
hjust = -0.05, size = 3.2) +
scale_fill_manual(values = pal_producto) +
scale_y_continuous(labels = dollar_format(scale = 1e-6, suffix = "M"),
expand = expansion(mult = c(0, 0.25))) +
coord_flip() +
labs(title = "Figura 1. Ventas totales y margen promedio por línea de producto",
x = NULL, y = "Ventas totales (millones USD)",
caption = "Fuente: elaboración propia con datos Adidas US Sales (n = 9.648)") +
theme_minimal(base_size = 11)
g_prod
Interpretación Figura 1. Men’s Street Footwear lidera las ventas con US$27,7 millones (23% de participación) y el segundo margen más alto (45%). Women’s Apparel es la segunda línea en ventas (US$23,9M, 20%) también con buen margen (44%). En contraste, Women’s Athletic Footwear es la línea de menor venta (US$14,3M, 12%). El calzado de calle (“street”) supera consistentemente al deportivo (“athletic”) tanto en ventas como en margen, lo que sugiere una demanda más fuerte por el segmento lifestyle que por el netamente deportivo.
plot_ly(ventas_producto, labels = ~producto, values = ~ventas_total, type = "pie",
hole = 0.45, marker = list(colors = pal_producto),
textinfo = "label+percent") %>%
layout(title = "Figura 2. Participación de cada producto en las ventas totales",
showlegend = TRUE)
ventas_region <- datos %>%
group_by(region) %>%
summarise(ventas_total = sum(ventas_total), margen_prom = mean(margen_operativo)) %>%
arrange(desc(ventas_total))
g_reg <- ggplot(ventas_region, aes(x = reorder(region, ventas_total), y = ventas_total, fill = region)) +
geom_col(show.legend = FALSE) +
geom_text(aes(label = paste0(dollar(ventas_total, scale = 1e-6, suffix = "M"),
" (", percent(ventas_total / sum(ventas_total), accuracy = 1), ")")),
hjust = -0.05, size = 3.3) +
scale_fill_manual(values = pal_region) +
scale_y_continuous(labels = dollar_format(scale = 1e-6, suffix = "M"),
expand = expansion(mult = c(0, 0.2))) +
coord_flip() +
labs(title = "Figura 3. Ventas totales por región",
x = NULL, y = "Ventas totales (millones USD)",
caption = "Fuente: elaboración propia con datos Adidas US Sales") +
theme_minimal(base_size = 11)
g_reg
Interpretación Figura 3. La región West concentra el 30% de las ventas (US$36,4M), casi el doble que Midwest, la región más rezagada (14%, US$16,7M). Sin embargo, South, con solo 17% de las ventas, exhibe el margen promedio más alto (47%) de todas las regiones — una señal de que el volumen no está correlacionado con la rentabilidad regional y merece atención estratégica (ver sección 2).
# Nota: se usa plotly (ya cargado) en vez de usmap para el mapa coroplético, ya que no
# requiere paquetes adicionales de datos geográficos y usa las abreviaturas nativas de R
# (state.name / state.abb) para mapear cada estado.
ventas_estado <- datos %>%
group_by(estado) %>%
summarise(ventas_total = sum(ventas_total)) %>%
mutate(abrev = state.abb[match(estado, state.name)])
plot_ly(
ventas_estado,
type = "choropleth",
locationmode = "USA-states",
locations = ~abrev,
z = ~ventas_total,
text = ~paste0(estado, "<br>Ventas: $", format(ventas_total, big.mark = ",")),
colorscale = list(list(0, "#FDE9A0"), list(0.33, "#F4A261"),
list(0.66, "#B33951"), list(1, "#5C1A3A")),
marker = list(line = list(color = "white", width = 0.5)),
colorbar = list(title = "Ventas\ntotales")
) %>%
layout(
title = "Figura 4. Ventas totales por estado",
geo = list(scope = "usa", projection = list(type = "albers usa"))
) %>%
config(displayModeBar = FALSE)
Interpretación Figura 4. Los cuatro estados con mayores ventas son New York (US$8,67M), California (US$8,58M), Florida (US$7,82M) y Texas (US$6,61M) — todos estados con grandes centros urbanos, coherente con la concentración poblacional y de retail. Estos 4 estados concentran cerca del 26% de las ventas totales del país, evidenciando una fuerte concentración geográfica que podría orientar decisiones de inventario y marketing localizado.
g_box <- ggplot(datos, aes(x = reorder(producto, ventas_total, median), y = ventas_total, fill = producto)) +
geom_boxplot(outlier.color = "#5C1A3A", outlier.alpha = 0.4, alpha = 0.9, show.legend = FALSE) +
scale_fill_manual(values = pal_producto) +
scale_y_continuous(labels = dollar_format(scale = 1e-3, suffix = "K")) +
coord_flip() +
labs(title = "Figura 5. Distribución y dispersión de ventas por transacción, según producto",
x = NULL, y = "Ventas por transacción (miles USD)",
caption = "Fuente: elaboración propia con datos Adidas US Sales") +
theme_minimal(base_size = 11)
ggplotly(g_box)
Interpretación Figura 5. Todas las líneas muestran alta dispersión y numerosos valores atípicos hacia arriba, es decir, transacciones puntuales de venta muy alta (probablemente pedidos grandes de retailers como Foot Locker o West Gear). Men’s Street Footwear y Men’s Athletic Footwear muestran las colas más largas, reflejando mayor variabilidad transacción a transacción que las líneas de apparel.
g_margen <- ggplot(datos, aes(x = metodo_venta, y = margen_operativo, fill = metodo_venta)) +
geom_boxplot(outlier.alpha = 0.3, show.legend = FALSE) +
stat_summary(fun = mean, geom = "point", shape = 23, size = 3, fill = "white") +
scale_fill_manual(values = pal_metodo) +
scale_y_continuous(labels = percent_format(accuracy = 1)) +
labs(title = "Figura 6. Distribución del margen operativo por método de venta",
subtitle = "El rombo blanco indica la media de cada grupo",
x = "Método de venta", y = "Margen operativo",
caption = "Fuente: elaboración propia con datos Adidas US Sales") +
theme_minimal(base_size = 11)
g_margen
Interpretación Figura 6. El canal Online tiene el margen promedio más alto (46,4%, mediana 47%) y también la mayor dispersión (SD = 8,9 pp), seguido de Outlet (39,5% en promedio) y por último In-store (35,6% en promedio, la distribución más compacta). Esto sugiere que el canal digital no solo es más rentable en promedio, sino que también concentra las oportunidades de mayor margen (rango hasta 80%), mientras que el canal físico opera de forma más predecible pero con techo de rentabilidad más bajo.
datos <- datos %>%
mutate(rango_precio = cut(precio_unidad, breaks = c(0, 25, 45, 65, 85, Inf),
labels = c("Menos de $25", "$25 - $45", "$45 - $65", "$65 - $85", "Más de $85"),
right = TRUE))
resumen_precio <- datos %>%
group_by(rango_precio) %>%
summarise(venta_prom = mean(ventas_total), margen_prom = mean(margen_operativo))
g_precio <- ggplot(resumen_precio, aes(x = rango_precio, y = venta_prom, fill = rango_precio)) +
geom_col(show.legend = FALSE) +
geom_text(aes(label = paste0(dollar(venta_prom), "\n(margen ", percent(margen_prom, accuracy = 1), ")")),
vjust = -0.3, size = 3.2) +
scale_fill_manual(values = colorRampPalette(c("#E9C46A", "#5C1A3A"))(5)) +
scale_y_continuous(labels = dollar_format(), expand = expansion(mult = c(0, 0.18))) +
labs(title = "Figura 7. Venta promedio y margen promedio por rango de precio unitario",
x = "Rango de precio por unidad", y = "Venta promedio por transacción (USD)",
caption = "Fuente: elaboración propia con datos Adidas US Sales") +
theme_minimal(base_size = 11)
g_precio
Interpretación Figura 7. A medida que sube el rango de precio, la venta promedio por transacción crece de forma sostenida (de US$3.712 a US$44.131), mientras que el margen promedio muestra una caída consistente (de 44% a 36%). El dataset no incluye variables de descuento o costo que permitan explicar directamente esta relación; se observa la asociación entre precio y margen, y se sugiere evaluarla en conjunto con la mezcla de canal y de producto en cada rango, dado que ninguna de las dos por sí sola parece explicarla por completo (ver Figura 9). Lo que sí puede afirmarse con los datos disponibles es que “precio más alto” no equivale automáticamente a “mejor negocio” en términos de rentabilidad relativa.
resumen_distrib <- datos %>%
group_by(distribuidor) %>%
summarise(ventas_total = sum(ventas_total), margen_prom = mean(margen_operativo))
med_ventas <- median(resumen_distrib$ventas_total)
med_margen <- median(resumen_distrib$margen_prom)
resumen_distrib <- resumen_distrib %>%
mutate(categoria = case_when(
ventas_total >= med_ventas & margen_prom >= med_margen ~ "Alto volumen, alto margen",
ventas_total >= med_ventas & margen_prom < med_margen ~ "Alto volumen, margen ajustado",
ventas_total < med_ventas & margen_prom >= med_margen ~ "Bajo volumen, alto margen",
TRUE ~ "Bajo volumen, margen ajustado"
))
g_cuad <- ggplot(resumen_distrib, aes(x = ventas_total, y = margen_prom, color = categoria,
label = distribuidor)) +
geom_hline(yintercept = med_margen, linetype = "dashed", color = "grey60") +
geom_vline(xintercept = med_ventas, linetype = "dashed", color = "grey60") +
geom_point(size = 5) +
geom_text(vjust = -1.1, size = 3.4, show.legend = FALSE) +
scale_color_manual(values = pal_cuadrante) +
scale_x_continuous(labels = dollar_format(scale = 1e-6, suffix = "M")) +
scale_y_continuous(labels = percent_format(accuracy = 1)) +
labs(title = "Figura 8. Retailers de Adidas: ventas totales vs. margen operativo promedio",
x = "Ventas totales", y = "Margen operativo promedio", color = "Categoría",
caption = "Fuente: elaboración propia con datos Adidas US Sales") +
theme_minimal(base_size = 11) +
theme(legend.position = "bottom")
g_cuad
Interpretación Figura 8. Sports Direct se destaca claramente con el margen más alto de todos los retailers (44,5%) sin sacrificar volumen (tercer lugar en ventas) — el caso más eficiente del portafolio. En el otro extremo, Walmart es el único retailer con un margen claramente más bajo (40,7%), casi un punto y medio por debajo del resto. Entre medio, West Gear (mayor retailer en ventas, US$32,4M), Foot Locker, Amazon y Kohl’s quedan prácticamente empatados en margen (41,8%-41,9%): la línea de mediana los separa en el gráfico por décimas de punto porcentual, una diferencia que no es operativamente significativa. Es decir, la verdadera brecha de rentabilidad entre distribuidores no está en el volumen (West Gear y Amazon, con ventas muy distintas, tienen el mismo margen), sino en dos casos puntuales: Sports Direct por arriba y Walmart por abajo. La recomendación natural es estudiar qué hace diferente a Sports Direct (mezcla de canal, de producto) para replicarlo, y entender por qué Walmart opera con un margen estructuralmente menor — posiblemente por su mayor poder de negociación como retailer de gran superficie.
vars_num <- datos %>% select(precio_unidad, unidades_vendidas, ventas_total,
utilidad_operativa, margen_operativo)
mat_cor <- cor(vars_num, use = "complete.obs")
corrplot(mat_cor, method = "color", type = "upper", addCoef.col = "black",
col = colorRampPalette(c("#E76F51", "white", "#264653"))(200),
tl.col = "black", tl.srt = 40, number.cex = 0.8,
title = "Figura 9. Matriz de correlación entre variables clave", mar = c(0, 0, 2, 0))
Interpretación Figura 9. Las correlaciones más
fuertes son: ventas_total–unidades_vendidas (r
= 0,92) y ventas_total–utilidad_operativa (r =
0,94), es decir, a mayor volumen, mayor utilidad en términos absolutos —
algo esperable. Más relevante es que el margen operativo
correlaciona negativamente con unidades_vendidas
(r = -0,31), ventas_total (r = -0,30) y
precio_unidad (r = -0,14): las transacciones más grandes y
de mayor precio tienden a tener menor margen relativo,
confirmando el patrón ya visto en la Figura 7.
cor_pu <- round(cor(datos$precio_unidad, datos$unidades_vendidas), 2)
g_pu <- ggplot(datos, aes(x = precio_unidad, y = unidades_vendidas)) +
geom_point(color = "#4A6FA5", alpha = 0.35, size = 1.4) +
geom_smooth(method = "loess", color = "#E76F51", se = TRUE) +
labs(title = paste0("Figura 10. Precio por unidad vs. unidades vendidas (r = ", cor_pu, ")"),
x = "Precio por unidad (USD)", y = "Unidades vendidas",
caption = "Fuente: elaboración propia con datos Adidas US Sales") +
theme_minimal(base_size = 11)
ggplotly(g_pu)
Interpretación Figura 10. La correlación es positiva pero débil (r = 0,27): un precio más alto no implica, por sí solo, menor volumen de unidades vendidas — de hecho la relación es ligeramente positiva, probablemente porque el precio también refleja la categoría de producto (calzado vs. apparel) y no únicamente una estrategia de pricing dentro de una misma línea. Esto sugiere que Adidas tiene margen para ajustar precios sin temer una caída proporcional en volumen, siempre que el análisis se haga por línea de producto.
cor_vu <- round(cor(datos$ventas_total, datos$utilidad_operativa), 2)
g_vu <- ggplot(datos, aes(x = ventas_total, y = utilidad_operativa, color = margen_operativo)) +
geom_point(alpha = 0.5, size = 1.6) +
geom_smooth(method = "lm", color = "#5C1A3A", se = FALSE) +
scale_color_gradientn(colors = grad_mapa, labels = percent_format(accuracy = 1), name = "Margen") +
scale_x_continuous(labels = dollar_format(scale = 1e-3, suffix = "K")) +
scale_y_continuous(labels = dollar_format(scale = 1e-3, suffix = "K")) +
labs(title = paste0("Figura 11. Ventas totales vs. utilidad operativa (r = ", cor_vu, ")"),
x = "Ventas totales (miles USD)", y = "Utilidad operativa (miles USD)",
caption = "Fuente: elaboración propia con datos Adidas US Sales") +
theme_minimal(base_size = 11)
ggplotly(g_vu)
Interpretación Figura 11. La relación es fuerte y positiva (r = 0,94), como es esperable. Lo interesante está en el color (margen): a igual nivel de ventas, los puntos más claros (menor margen) tienden a ubicarse por debajo de la línea de tendencia, y los más oscuros (mayor margen) por encima — es decir, dos transacciones con ventas similares pueden generar utilidades bastante distintas según el margen, reforzando que gestionar el margen es tan importante como crecer en ventas.
bubble_data <- datos %>%
group_by(producto, region) %>%
summarise(ventas_total = sum(ventas_total), margen_prom = mean(margen_operativo),
unidades = sum(unidades_vendidas), .groups = "drop")
g_bubble <- ggplot(bubble_data, aes(x = ventas_total, y = margen_prom, size = unidades,
color = producto, text = paste0(producto, " — ", region))) +
geom_point(alpha = 0.75) +
scale_color_manual(values = pal_producto) +
scale_size_continuous(range = c(3, 16), name = "Unidades vendidas") +
scale_x_continuous(labels = dollar_format(scale = 1e-6, suffix = "M")) +
scale_y_continuous(labels = percent_format(accuracy = 1)) +
labs(title = "Figura 12. Ventas, margen y unidades por producto y región",
subtitle = "Tamaño de burbuja = unidades vendidas",
x = "Ventas totales", y = "Margen operativo promedio", color = "Producto",
caption = "Fuente: elaboración propia con datos Adidas US Sales") +
theme_minimal(base_size = 11)
ggplotly(g_bubble, tooltip = c("text", "size", "y"))
Interpretación Figura 12. Las combinaciones más estratégicas (burbujas grandes, ubicadas arriba y a la derecha) combinan alto volumen de ventas y buen margen — por ejemplo, Men’s Street Footwear en la región West. En contraste, algunas combinaciones de Women’s Athletic Footwear muestran las burbujas con menor margen relativo pese a ventas considerables, marcando oportunidades claras de revisión de pricing o mezcla de canal en esa línea.
part_metodo_region <- datos %>%
group_by(region, metodo_venta) %>%
summarise(ventas_total = sum(ventas_total), .groups = "drop") %>%
group_by(region) %>%
mutate(participacion = ventas_total / sum(ventas_total))
total_pais <- datos %>%
group_by(metodo_venta) %>%
summarise(ventas_total = sum(ventas_total)) %>%
mutate(participacion = ventas_total / sum(ventas_total), region = "Total país")
part_final <- bind_rows(part_metodo_region, total_pais)
part_final$region <- factor(part_final$region,
levels = c("Total país", "Northeast", "Southeast", "South", "Midwest", "West"))
g_stack <- ggplot(part_final, aes(x = region, y = participacion, fill = metodo_venta)) +
geom_col(position = "fill") +
geom_text(aes(label = percent(participacion, accuracy = 1)),
position = position_fill(vjust = 0.5), color = "white", size = 3.3, fontface = "bold") +
scale_fill_manual(values = pal_metodo, name = "Método de venta") +
scale_y_continuous(labels = percent_format()) +
labs(title = "Figura 13. Participación en ventas por método de venta, según región",
x = NULL, y = "Participación en ventas",
caption = "Fuente: elaboración propia con datos Adidas US Sales") +
theme_minimal(base_size = 11) +
theme(legend.position = "top")
g_stack
Interpretación Figura 13. El mix de canales varía drásticamente por región: South depende del canal Outlet en un 54% de sus ventas, mientras que Southeast se apoya principalmente en Online (56%). Northeast es la única región donde el canal In-store es el principal (46%). A nivel país, Online es el canal líder con 37% de participación. Dado que Online es también el canal con mayor margen promedio a nivel general (Figura 6), regiones como South y Northeast —con menor participación de Online (18%-45%)— representan una oportunidad de evaluar el potencial de fortalecer ese canal, aunque el dataset no permite confirmar que un cambio en la mezcla de canal produciría, por sí solo, el mismo nivel de margen observado a nivel nacional.
El enunciado del caso solicita calcular tasas de crecimiento “si
aplica”. En este dataset no aplica: no existe una
variable de fecha, periodo o año que permita construir una serie
temporal (a diferencia de otras versiones del dataset Adidas US Sales,
que sí incluyen Invoice Date). Se documenta esto
explícitamente en vez de omitirlo, y se recomienda a Adidas incorporar
la dimensión temporal en futuros extractos de datos para poder
monitorear crecimiento período a período, estacionalidad y
tendencias.
Informe elaborado por Hernán Perea y Francesca Mendoza — Analítica de Datos para la Toma de Decisiones, Pontificia Universidad Javeriana Cali.