Introducción

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:

  1. Desempeño de ventas: comportamiento de ventas y unidades por producto, región y estado, e identificación de variabilidad/atípicos.
  2. Rentabilidad: distribución del margen operativo por canal de venta y por rango de precio, y caracterización de los retailers según volumen vs. margen.
  3. Relación entre variables clave: correlación entre precio, unidades, ventas, utilidad y margen, y combinaciones producto–región–canal más estratégicas.

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.


Análisis exploratorio de datos (EDA)

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”.


1. Desempeño de ventas

Ventas totales y participación por producto

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.

Participación de ventas por producto

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 por región

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).

Mapa: ventas totales por estado

# 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.

Variabilidad de las ventas por producto (boxplot)

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.


2. Rentabilidad

Margen operativo por método de venta

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.

Ventas y margen por rango de precio

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.

Retailers: volumen de ventas vs. margen operativo

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.


3. Relación entre variables clave

Matriz de correlación

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.

Precio por unidad vs. unidades vendidas

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.

Ventas totales vs. utilidad operativa

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.


4. Combinaciones estratégicas: producto × región × canal

Ventas, margen y volumen por producto y región

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.

Participación del método de venta por región

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.


Nota metodológica: tasas de crecimiento

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.


Principales hallazgos

  • Adidas generó US$120,2 millones en ventas y US$47,2 millones de utilidad operativa (margen global 39,3%) en el periodo analizado.
  • Men’s Street Footwear es la línea más vendida (23% de participación) y una de las más rentables (margen 45%); el calzado “street” supera consistentemente al “athletic”.
  • La región West concentra el 30% de las ventas, pero South —con solo 17%— tiene el margen promedio más alto (47%).
  • Cuatro estados (New York, California, Florida, Texas) concentran cerca del 26% de las ventas totales.
  • El canal Online es el más rentable (margen promedio 46,4%) y el de mayor variabilidad al alza; In-store es el más predecible pero de menor margen (35,6%).
  • A mayor precio unitario, mayor venta promedio pero menor margen relativo (44% a 36% del rango más bajo al más alto).
  • El margen operativo correlaciona negativamente con ventas y unidades (r ≈ -0,30): vender más no garantiza mejor rentabilidad relativa.
  • Sports Direct combina alto volumen y el mejor margen entre retailers (44,5%); West Gear, pese a ser el mayor en ventas, opera con margen apenas por debajo del promedio.
  • El mix de canal varía fuertemente por región (Online domina en Southeast con 56%; Outlet domina en South con 54%), lo que sugiere estrategias de canal diferenciadas por zona.

Conclusiones y recomendaciones para Adidas

  1. Evaluar el potencial de fortalecer el canal Online en regiones de menor participación digital (South, Northeast), dado que este canal presenta consistentemente el margen promedio más alto en el conjunto de datos.
  2. Revisar la estrategia de precios en el segmento de precio alto (>$65), donde el margen relativo es menor pese a mayores ventas por transacción; el dataset no incluye variables de costo o descuento, por lo que se recomienda profundizar este análisis con información adicional antes de intervenir.
  3. Analizar las prácticas comerciales y la mezcla de producto y canal de Sports Direct, el retailer con mejor margen del portafolio, para identificar elementos potencialmente replicables en distribuidores de perfil similar (West Gear, Foot Locker).
  4. Fortalecer la línea Women’s Athletic Footwear, la de menor participación en ventas y con combinaciones producto-región de margen más bajo en la Figura 12.
  5. Aprovechar la concentración geográfica (NY, CA, FL, TX) para campañas y surtido localizado, sin descuidar estados de “cola larga” con potencial de crecimiento.
  6. Incorporar una variable de fecha en la captura de datos para poder calcular tasas de crecimiento, estacionalidad y tendencias en futuros análisis — actualmente es la principal limitación del dataset.

Informe elaborado por Hernán Perea y Francesca Mendoza — Analítica de Datos para la Toma de Decisiones, Pontificia Universidad Javeriana Cali.