Este informe analiza el desempeño comercial y financiero de ADIDAS desde una perspectiva descriptiva, exploratoria y diagnóstica. Además de responder las preguntas orientadoras del caso, se incorporan preguntas de negocio que permiten profundizar en cinco dimensiones: escala, rentabilidad, concentración, combinaciones estratégicas y relación entre precio, volumen y margen.
La pregunta central es: ¿dónde está el volumen de negocio y, sobre todo, dónde se convierte ese volumen en utilidad?
La base no contiene una variable temporal. Por tanto, no se calculan tasas de crecimiento interperiodo, ya que hacerlo requeriría información que no está disponible.
ruta_excel <- "C:/Users/Usuario/Desktop/ANALÍT. DE DATOS PARA LA TOMA DE DECISONES/DatosCaso1.xlsx"
datos <- read_excel(ruta_excel)
n_filas <- nrow(datos)
n_columnas <- ncol(datos)
diagnostico <- tibble(
indicador = c(
"Filas", "Variables", "Celdas faltantes",
"Duplicados exactos", "Registros con ventas = 0", "Registros con unidades = 0"
),
valor = c(
n_filas, n_columnas, sum(is.na(datos)),
sum(duplicated(datos)),
sum(datos$ventas_total == 0, na.rm = TRUE),
sum(datos$unidades_vendidas == 0, na.rm = TRUE)
)
)
kable(diagnostico, caption = "Diagnóstico básico de la información")
| indicador | valor |
|---|---|
| Filas | 9648 |
| Variables | 11 |
| Celdas faltantes | 0 |
| Duplicados exactos | 262 |
| Registros con ventas = 0 | 4 |
| Registros con unidades = 0 | 4 |
consistencia <- tibble(
prueba = c(
"Ventas = precio × unidades",
"Utilidad = ventas × margen"
),
registros_inconsistentes = c(
sum(abs(datos$precio_unidad * datos$unidades_vendidas - datos$ventas_total) > 1e-8),
sum(abs(datos$ventas_total * datos$margen_operativo - datos$utilidad_operativa) > 1e-8)
)
)
kable(consistencia, caption = "Pruebas de consistencia aritmética")
| prueba | registros_inconsistentes |
|---|---|
| Ventas = precio × unidades | 0 |
| Utilidad = ventas × margen | 0 |
La base contiene 9648 registros y 11 variables. Se detectan 262 duplicados exactos y 4 registros con ventas y unidades iguales a cero. Estas observaciones no deben eliminarse automáticamente: primero debe conocerse su significado dentro del proceso de captura.
total_ventas <- sum(datos$ventas_total, na.rm = TRUE)
total_unidades <- sum(datos$unidades_vendidas, na.rm = TRUE)
total_utilidad <- sum(datos$utilidad_operativa, na.rm = TRUE)
margen_ponderado <- total_utilidad / total_ventas
margen_promedio <- mean(datos$margen_operativo, na.rm = TRUE)
precio_efectivo <- total_ventas / total_unidades
kpis <- tibble(
Indicador = c(
"Ventas totales", "Unidades vendidas", "Utilidad operativa",
"Margen operativo ponderado", "Margen operativo promedio simple",
"Precio efectivo promedio por unidad"
),
Valor = c(
dollar(total_ventas, prefix = "USD ", big.mark = ".", decimal.mark = ",", accuracy = 1),
number(total_unidades, big.mark = ".", decimal.mark = ",", accuracy = 1),
dollar(total_utilidad, prefix = "USD ", big.mark = ".", decimal.mark = ",", accuracy = 1),
percent(margen_ponderado, accuracy = 0.1, decimal.mark = ","),
percent(margen_promedio, accuracy = 0.1, decimal.mark = ","),
dollar(precio_efectivo, prefix = "USD ", accuracy = 0.01)
)
)
kable(kpis, caption = "Indicadores consolidados")
| Indicador | Valor |
|---|---|
| Ventas totales | USD 120.166.650 |
| Unidades vendidas | 2.478.861 |
| Utilidad operativa | USD 47.224.968 |
| Margen operativo ponderado | 39,3% |
| Margen operativo promedio simple | 42,3% |
| Precio efectivo promedio por unidad | USD 48.48 |
El negocio registra aproximadamente USD 120,2 millones en ventas, 2,48 millones de unidades y USD 47,2 millones de utilidad operativa. El margen ponderado por ventas es 39,3%, frente a un margen promedio simple de 42,3%. Para la lectura financiera agregada se prioriza el margen ponderado, porque incorpora el peso económico de cada observación.
producto <- datos %>%
group_by(producto) %>%
summarise(
unidades = sum(unidades_vendidas),
ventas = sum(ventas_total),
utilidad = sum(utilidad_operativa),
margen = utilidad / ventas,
.groups = "drop"
) %>%
mutate(
participacion_ventas = ventas / total_ventas,
participacion_utilidad = utilidad / total_utilidad,
brecha_pp = (participacion_utilidad - participacion_ventas) * 100
) %>%
arrange(desc(ventas))
kable(
producto %>% mutate(
ventas = dollar(ventas, prefix = "USD ", accuracy = 1),
utilidad = dollar(utilidad, prefix = "USD ", accuracy = 1),
margen = percent(margen, accuracy = 0.1),
participacion_ventas = percent(participacion_ventas, accuracy = 0.1),
participacion_utilidad = percent(participacion_utilidad, accuracy = 0.1),
brecha_pp = paste0(number(brecha_pp, accuracy = 0.1), " pp")
) %>% select(producto, unidades, ventas, utilidad, margen,
participacion_ventas, participacion_utilidad, brecha_pp),
caption = "Desempeño por producto"
)
| producto | unidades | ventas | utilidad | margen | participacion_ventas | participacion_utilidad | brecha_pp |
|---|---|---|---|---|---|---|---|
| Men’s Street Footwear | 593320 | USD 27,680,769 | USD 11,629,046 | 42.0% | 23.0% | 24.6% | 1.6 pp |
| Women’s Apparel | 433827 | USD 23,870,985 | USD 9,685,221 | 40.6% | 19.9% | 20.5% | 0.6 pp |
| Men’s Athletic Footwear | 435526 | USD 20,577,180 | USD 7,437,457 | 36.1% | 17.1% | 15.7% | -1.4 pp |
| Women’s Street Footwear | 392269 | USD 17,201,563 | USD 6,494,017 | 37.8% | 14.3% | 13.8% | -0.6 pp |
| Men’s Apparel | 306683 | USD 16,520,632 | USD 6,381,405 | 38.6% | 13.7% | 13.5% | -0.2 pp |
| Women’s Athletic Footwear | 317236 | USD 14,315,521 | USD 5,597,822 | 39.1% | 11.9% | 11.9% | -0.1 pp |
producto_plot <- producto %>%
select(producto, participacion_ventas, participacion_utilidad) %>%
pivot_longer(-producto, names_to = "indicador", values_to = "participacion") %>%
mutate(indicador = recode(
indicador,
participacion_ventas = "Participación en ventas",
participacion_utilidad = "Participación en utilidad"
))
ggplot(producto_plot,
aes(x = reorder(producto, participacion), y = participacion, fill = indicador)) +
geom_col(position = position_dodge(width = 0.72), width = 0.65) +
geom_text(aes(label = percent(participacion, accuracy = 0.1)),
position = position_dodge(width = 0.72), hjust = -0.08, size = 3.2) +
coord_flip() +
scale_fill_manual(values = c("Participación en ventas" = col_blue,
"Participación en utilidad" = col_teal)) +
scale_y_continuous(labels = percent_format(accuracy = 1), expand = expansion(mult = c(0, 0.12))) +
labs(
title = "Aporte de cada producto a ventas y utilidad",
subtitle = "La brecha entre ambas participaciones muestra diferencias en conversión económica",
x = NULL, y = "Participación (%)", fill = NULL, caption = fuente
) +
theme_minimal(base_size = 12) +
theme(legend.position = "bottom", panel.grid.major.y = element_blank())
Hallazgo: Men’s Street Footwear concentra 23,0% de las ventas y 24,6% de la utilidad, mientras Men’s Athletic Footwear aporta 17,1% de las ventas y 15,7% de la utilidad. Por tanto, el desempeño de una categoría no debe juzgarse solo por facturación.
canal <- datos %>%
group_by(metodo_venta) %>%
summarise(
unidades = sum(unidades_vendidas),
ventas = sum(ventas_total),
utilidad = sum(utilidad_operativa),
margen = utilidad / ventas,
.groups = "drop"
) %>%
mutate(
participacion_ventas = ventas / total_ventas,
participacion_utilidad = utilidad / total_utilidad,
brecha_pp = (participacion_utilidad - participacion_ventas) * 100
) %>% arrange(desc(ventas))
kable(canal %>% mutate(
ventas = dollar(ventas, prefix = "USD ", accuracy = 1),
utilidad = dollar(utilidad, prefix = "USD ", accuracy = 1),
margen = percent(margen, accuracy = 0.1),
participacion_ventas = percent(participacion_ventas, accuracy = 0.1),
participacion_utilidad = percent(participacion_utilidad, accuracy = 0.1),
brecha_pp = paste0(number(brecha_pp, accuracy = 0.1), " pp")
), caption = "Desempeño por método de venta")
| metodo_venta | unidades | ventas | utilidad | margen | participacion_ventas | participacion_utilidad | brecha_pp |
|---|---|---|---|---|---|---|---|
| Online | 939093 | USD 44,965,657 | USD 19,552,538 | 43.5% | 37.4% | 41.4% | 4.0 pp |
| Outlet | 849778 | USD 39,536,618 | USD 14,913,301 | 37.7% | 32.9% | 31.6% | -1.3 pp |
| In-store | 689990 | USD 35,664,375 | USD 12,759,129 | 35.8% | 29.7% | 27.0% | -2.7 pp |
ggplot(canal, aes(x = "", y = ventas, fill = metodo_venta)) +
geom_col(width = 1, color = "white") +
coord_polar(theta = "y") +
geom_text(aes(label = percent(ventas / sum(ventas), accuracy = 0.1)),
position = position_stack(vjust = 0.5), color = "white", fontface = "bold", size = 4) +
scale_fill_manual(values = channel_cols) +
labs(
title = "Participación de ventas por canal",
subtitle = "Online concentra el mayor peso del negocio",
fill = NULL, caption = fuente
) +
theme_void(base_size = 12) +
theme(legend.position = "bottom", plot.title = element_text(face = "bold"))
Hallazgo: Online representa 37,4% de las ventas pero 41,4% de la utilidad, con un margen ponderado de 43,5%. La participación de utilidad supera en 4,0 puntos porcentuales su participación de ventas.
Esta visualización responde una pregunta adicional: ¿qué combinaciones de producto y canal reúnen simultáneamente escala y rentabilidad? El tamaño de la burbuja incorpora utilidad, para evitar que un segmento pequeño parezca estratégico solo por tener un margen alto.
producto_canal <- datos %>%
group_by(producto, metodo_venta) %>%
summarise(
unidades = sum(unidades_vendidas),
ventas = sum(ventas_total),
utilidad = sum(utilidad_operativa),
margen = utilidad / ventas,
.groups = "drop"
)
etiquetas <- producto_canal %>% slice_max(utilidad, n = 8)
ggplot(producto_canal,
aes(x = ventas / 1e6, y = margen, size = utilidad / 1e6,
color = metodo_venta)) +
geom_point(alpha = 0.78) +
geom_text(data = etiquetas,
aes(label = paste0(str_sub(producto, 1, 10), " · ", metodo_venta)),
hjust = 0, nudge_x = 0.12, size = 3.0, check_overlap = TRUE, show.legend = FALSE) +
geom_hline(yintercept = margen_ponderado, linetype = "dashed", color = col_gray) +
geom_vline(xintercept = mean(producto_canal$ventas) / 1e6,
linetype = "dotted", color = col_gray) +
scale_color_manual(values = channel_cols) +
scale_y_continuous(labels = percent_format(accuracy = 1)) +
labs(
title = "Matriz estratégica: escala, margen y utilidad",
subtitle = "Arriba del margen global y con mayor tamaño de burbuja se concentran combinaciones de mayor aporte económico",
x = "Ventas del segmento (USD millones)", y = "Margen operativo",
size = "Utilidad (USD M)", color = "Canal", caption = fuente
) +
theme_minimal(base_size = 12) +
theme(legend.position = "right")
Lectura: las combinaciones Online de Men’s Street Footwear y Women’s Apparel aparecen entre las de mayor escala y margen. El valor del gráfico está en identificar segmentos, no únicamente productos aislados.
brecha <- bind_rows(
producto %>% transmute(Dimension = "Producto", Segmento = producto,
Brecha = (participacion_utilidad - participacion_ventas) * 100),
datos %>% group_by(region) %>% summarise(ventas = sum(ventas_total), utilidad = sum(utilidad_operativa), .groups = "drop") %>%
mutate(Dimension = "Región", Segmento = region,
Brecha = (utilidad / total_utilidad - ventas / total_ventas) * 100) %>% select(Dimension, Segmento, Brecha),
canal %>% transmute(Dimension = "Canal", Segmento = metodo_venta,
Brecha = (participacion_utilidad - participacion_ventas) * 100)
) %>%
arrange(Brecha) %>%
mutate(
etiqueta = paste0(ifelse(abs(Brecha) < 0.05, "", ifelse(Brecha > 0, "+", "")), number(Brecha, accuracy = 0.1), " pp"),
hjust_label = ifelse(Brecha >= 0, -0.15, 1.15)
)
ggplot(brecha, aes(x = Brecha, y = reorder(paste(Dimension, Segmento, sep = " · "), Brecha), fill = Dimension)) +
geom_col(width = 0.7) +
geom_vline(xintercept = 0, color = col_navy) +
geom_text(aes(label = etiqueta, hjust = hjust_label), size = 3.0) +
scale_fill_manual(values = c("Producto" = col_blue, "Región" = col_teal, "Canal" = col_orange)) +
labs(
title = "Brecha entre participación en utilidad y participación en ventas",
subtitle = "Brecha positiva = el segmento aporta más utilidad de la que su peso en ventas sugeriría",
x = "Diferencia en puntos porcentuales", y = NULL, fill = "Dimensión", caption = fuente
) +
theme_minimal(base_size = 11) +
theme(legend.position = "bottom", panel.grid.major.y = element_blank())
Hallazgo: Online presenta +4,0 pp y South +2,4 pp, mientras West presenta −2,8 pp. Estas brechas identifican dónde la composición de ventas está generando relativamente más o menos utilidad.
ciudad <- datos %>%
group_by(ciudad) %>%
summarise(ventas = sum(ventas_total), utilidad = sum(utilidad_operativa), .groups = "drop") %>%
arrange(desc(ventas)) %>%
mutate(
participacion = ventas / total_ventas,
acumulado = cumsum(participacion)
)
ciudad_top <- ciudad %>% slice_head(n = 20)
# Se usa una visualización dual simple: barras de participación individual + línea acumulada.
ggplot(ciudad_top, aes(x = reorder(ciudad, -ventas))) +
geom_col(aes(y = participacion), fill = col_blue, width = 0.72) +
geom_line(aes(y = acumulado), group = 1, color = col_orange, linewidth = 1.2) +
geom_point(aes(y = acumulado), color = col_orange, size = 2) +
geom_hline(yintercept = 0.80, linetype = "dashed", color = col_red) +
scale_y_continuous(labels = percent_format(accuracy = 1), limits = c(0, 1)) +
labs(
title = "Pareto de ventas: principales ciudades",
subtitle = paste0("Las 20 principales ciudades concentran ", percent(sum(ciudad_top$participacion), accuracy = 0.1), " de las ventas"),
x = NULL, y = "Participación / acumulado", caption = fuente
) +
theme_minimal(base_size = 11) +
theme(axis.text.x = element_text(angle = 55, hjust = 1, size = 8),
panel.grid.major.x = element_blank())
Hallazgo: las 20 principales ciudades concentran cerca de 58,2% de las ventas, lo que sugiere una actividad geográfica relevante pero no totalmente concentrada. Esto reduce la conveniencia de analizar solo el mercado principal y refuerza la necesidad de segmentar por ciudad.
region_canal <- datos %>%
group_by(region, metodo_venta) %>%
summarise(
ventas = sum(ventas_total),
utilidad = sum(utilidad_operativa),
margen = utilidad / ventas,
.groups = "drop"
)
ggplot(region_canal, aes(x = metodo_venta, y = region, fill = margen)) +
geom_tile(color = "white", linewidth = 0.8) +
geom_text(aes(label = paste0(percent(margen, accuracy = 0.1), "\nUSD ",
number(ventas / 1e6, accuracy = 0.1, decimal.mark = ","), " M")),
size = 3.0, fontface = "bold") +
scale_fill_gradient(low = "#EAF2FB", high = "#0B4F8A", labels = percent_format(accuracy = 1)) +
labs(
title = "Heatmap región × canal: escala y margen",
subtitle = "El color representa el margen; la etiqueta muestra margen y ventas",
x = NULL, y = NULL, fill = "Margen", caption = fuente
) +
theme_minimal(base_size = 11) +
theme(panel.grid = element_blank(), legend.position = "right")
Lectura: el canal cambia de comportamiento según la región. Por ejemplo, Online alcanza 48,6% de margen en Northeast, mientras West presenta márgenes de 32,8% en Outlet y 33,2% en In-store. Esto evidencia que canal y geografía interactúan.
region_producto <- datos %>%
group_by(region, producto) %>%
summarise(
ventas = sum(ventas_total),
utilidad = sum(utilidad_operativa),
unidades = sum(unidades_vendidas),
.groups = "drop"
) %>%
mutate(
precio_efectivo = ventas / unidades,
margen = utilidad / ventas
)
etiquetas_pm <- bind_rows(
region_producto %>% slice_max(unidades, n = 6),
region_producto %>% slice_max(margen, n = 3),
region_producto %>% slice_min(margen, n = 3)
) %>% distinct(region, producto, .keep_all = TRUE)
ggplot(region_producto,
aes(x = precio_efectivo, y = margen, size = unidades, color = producto)) +
geom_point(alpha = 0.7) +
geom_text(data = etiquetas_pm,
aes(label = paste0(str_sub(region, 1, 3), "-", str_sub(producto, 1, 10))),
nudge_x = 0.4, nudge_y = 0.002, size = 2.9, check_overlap = TRUE,
show.legend = FALSE) +
geom_hline(yintercept = margen_ponderado, linetype = "dashed", color = col_gray) +
scale_color_manual(values = product_cols) +
scale_y_continuous(labels = percent_format(accuracy = 1)) +
labs(
title = "Precio × margen × volumen",
subtitle = "Las burbujas muestran que el precio efectivo no explica por sí solo el margen; el volumen también cambia por combinación",
x = "Precio efectivo por unidad (USD)", y = "Margen operativo",
size = "Unidades vendidas", color = "Producto", caption = fuente
) +
theme_minimal(base_size = 11) +
theme(legend.position = "right")
La correlación precio–unidades es 0.266, mientras que la correlación precio–margen es -0.137. Son asociaciones descriptivas y no implican causalidad.
ggplot(datos, aes(x = margen_operativo, y = reorder(producto, margen_operativo, FUN = median), fill = producto)) +
geom_boxplot(alpha = 0.8, show.legend = FALSE, outlier.alpha = 0.25) +
geom_vline(xintercept = margen_ponderado, linetype = "dashed", color = col_navy) +
scale_fill_manual(values = product_cols) +
scale_x_continuous(labels = percent_format(accuracy = 1)) +
labs(
title = "Variabilidad del margen operativo por producto",
subtitle = "La distribución complementa el promedio y permite distinguir consistencia de dispersión",
x = "Margen operativo", y = NULL, caption = fuente
) +
theme_minimal(base_size = 11) +
theme(panel.grid.major.y = element_blank())
distribuidor <- datos %>%
group_by(distribuidor) %>%
summarise(
registros = n(),
ventas = sum(ventas_total),
utilidad = sum(utilidad_operativa),
margen = utilidad / ventas,
participacion_ventas = ventas / total_ventas,
participacion_utilidad = utilidad / total_utilidad,
.groups = "drop"
) %>% arrange(desc(ventas))
kable(distribuidor %>% mutate(
ventas = dollar(ventas, prefix = "USD ", accuracy = 1),
utilidad = dollar(utilidad, prefix = "USD ", accuracy = 1),
margen = percent(margen, accuracy = 0.1),
participacion_ventas = percent(participacion_ventas, accuracy = 0.1),
participacion_utilidad = percent(participacion_utilidad, accuracy = 0.1)
), caption = "Desempeño por distribuidor")
| distribuidor | registros | ventas | utilidad | margen | participacion_ventas | participacion_utilidad |
|---|---|---|---|---|---|---|
| West Gear | 2374 | USD 32,409,558 | USD 12,196,891 | 37.6% | 27.0% | 25.8% |
| Foot Locker | 2637 | USD 29,024,945 | USD 11,317,027 | 39.0% | 24.2% | 24.0% |
| Sports Direct | 2032 | USD 24,616,622 | USD 10,641,609 | 43.2% | 20.5% | 22.5% |
| Kohl’s | 1030 | USD 13,512,453 | USD 5,182,260 | 38.4% | 11.2% | 11.0% |
| Walmart | 626 | USD 10,506,085 | USD 3,902,749 | 37.1% | 8.7% | 8.3% |
| Amazon | 949 | USD 10,096,987 | USD 3,984,432 | 39.5% | 8.4% | 8.4% |
Sports Direct presenta un margen ponderado de aproximadamente 43,2%, por encima de West Gear (37,6%) y Walmart (37,2%). La lectura recomendada es comparar simultáneamente cobertura, escala y rentabilidad, evitando concluir que un distribuidor es “mejor” solo por una métrica.
Las siguientes recomendaciones son propuestas de gestión derivadas de patrones descriptivos; no establecen causalidad.
1. Gestionar segmentos por volumen + margen + utilidad. Utilizar una matriz como la sección 6.1 para identificar combinaciones que ameritan protección, profundización o revisión.
2. Investigar qué explica el diferencial del canal Online. Su mayor participación en utilidad frente a ventas sugiere revisar mix de productos, descuentos, costos de operación y estructura comercial. La base disponible no permite identificar cuál de estos factores explica la diferencia.
3. Descomponer West por producto, ciudad y canal antes de actuar sobre volumen. La brecha de utilidad sugiere revisar dónde se origina el menor margen, en lugar de asumir que todo el mercado West presenta el mismo comportamiento.
4. Identificar y estudiar “bolsillos” de alto margen. Casos como Women’s Apparel–South pueden convertirse en hipótesis para investigar qué combinación de precio, producto y canal está asociada con ese resultado.
5. Incorporar controles de calidad de datos antes de decisiones operativas. Validar duplicados y registros de cero ventas/unidades antes de construir indicadores automatizados.
El principal mensaje del análisis es que ADIDAS no debería evaluar el desempeño únicamente por ventas. Los datos muestran diferencias importantes entre participación de ventas, participación de utilidad y margen según producto, región y canal. El siguiente paso natural es transformar esta lectura descriptiva en un sistema de segmentación que priorice simultáneamente escala, rentabilidad y consistencia.
Para la sustentación de 10 minutos se recomienda concentrarse en cinco gráficos: (1) matriz volumen–margen–utilidad, (2) brecha utilidad–ventas, (3) Pareto de ciudades, (4) heatmap región–canal y (5) precio–margen–volumen, usando la torta de canales como apoyo inicial.
Fuente: elaboración propia a partir de
DatosCaso1.xlsx suministrado para el Caso 1 de Analítica
Descriptiva.