Introducción

Adidas AG es una de las corporaciones multinacionales más icónicas y líderes a nivel mundial en el diseño, fabricación y comercialización de calzado, ropa y accesorios deportivos. Fundada en 1949 en Herzogenaurach, Alemania, la compañía cuenta con una presencia global consolidada en más de 160 países, posicionándose como un referente en la industria del sportswear.

El objetivo de este análisis es evaluar el desempeño comercial y la rentabilidad operativa de Adidas mediante la caracterización de sus mercados geográficos (regiones y ciudades), socios comerciales (distribuidores/minoristas) y métodos de venta (online, tienda física, outlet). Al tratarse de un estudio de corte transversal (sin dimensión temporal), el análisis centra su potencia en la segmentación territorial, la eficiencia de canales y la relación entre precio, volumen y rentabilidad, identificando patrones estratégicos para la toma de decisiones directivas.

Análisis exploratorio

El análisis exploratorio de datos (EDA) es el paso inicial para comprender la estructura de la base de datos de Adidas, evaluar la distribución de las variables y validar el comportamiento de las métricas clave antes de profundizar en un enfoque específico.

PASO 1. Instalar y cargar librerías

# Cargar librerías necesarias
library(readxl)
library(dplyr)
library(ggplot2)
library(plotly)
library(knitr)
library(kableExtra)
library(tidyr)
library(tidyverse)
library(scales)

PASO 2. Cargar y explorar la base de datos

# Cargar datos desde el archivo Excel
DatosCaso1 <- read_excel("C:/Users/arosc/OneDrive - PUJ Cali/Quinto Semestre/Analit. de Datos para la Toma/DatosCaso1.xlsx")
 
# Verificar estructura básica y dimensiones
str(DatosCaso1)
## 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" ...
head(DatosCaso1)
distribuidor region estado ciudad producto precio_unidad unidades_vendidas ventas_total utilidad_operativa margen_operativo metodo_venta
Foot Locker Northeast New York New York Men’s Street Footwear 50 1200 60000 30000.0 0.50 In-store
Foot Locker Northeast New York New York Men’s Athletic Footwear 50 1000 50000 15000.0 0.30 In-store
Foot Locker Northeast New York New York Women’s Street Footwear 40 1000 40000 14000.0 0.35 In-store
Foot Locker Northeast New York New York Women’s Athletic Footwear 45 850 38250 13387.5 0.35 In-store
Foot Locker Northeast New York New York Men’s Apparel 60 900 54000 16200.0 0.30 In-store
Foot Locker Northeast New York New York Women’s Apparel 50 1000 50000 12500.0 0.25 In-store
# Valores faltantes y filas duplicadas
colSums(is.na(DatosCaso1))
##       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(DatosCaso1))
## [1] 262

Nota de calidad de datos: la base tiene 9.648 filas y 11 variables, sin valores faltantes. Se detectan 262 filas idénticas en todas sus columnas – vale la pena mencionarlo como un punto a validar con el área comercial antes de sacar conclusiones definitivas.

Indicadores de Centralidad, Dispersión y Resumen Estadístico

resumen_stats <- DatosCaso1 %>%
  select(precio_unidad, unidades_vendidas, ventas_total, utilidad_operativa, margen_operativo) %>%
  summary()
 
resumen_stats
##  precio_unidad    unidades_vendidas  ventas_total   utilidad_operativa
##  Min.   :  7.00   Min.   :   0.0    Min.   :    0   Min.   :    0     
##  1st Qu.: 35.00   1st Qu.: 106.0    1st Qu.: 4065   1st Qu.: 1753     
##  Median : 45.00   Median : 176.0    Median : 7804   Median : 3263     
##  Mean   : 45.22   Mean   : 256.9    Mean   :12455   Mean   : 4895     
##  3rd Qu.: 55.00   3rd Qu.: 350.0    3rd Qu.:15864   3rd Qu.: 6192     
##  Max.   :110.00   Max.   :1275.0    Max.   :82500   Max.   :39000     
##  margen_operativo
##  Min.   :0.100   
##  1st Qu.:0.350   
##  Median :0.410   
##  Mean   :0.423   
##  3rd Qu.:0.490   
##  Max.   :0.800

Interpretación. El precio promedio por unidad es de $45,2 (mediana $45), con precios entre $7 y $110. Las ventas totales por registro tienen una media de $12.455, pero la mediana ($7.804) es bastante menor, lo que indica una distribución sesgada a la derecha: la mayoría de las transacciones son de tamaño moderado, pero hay un grupo más pequeño de ventas muy grandes que eleva el promedio. El margen operativo promedio es del 42% (mediana 41%), con una dispersión relativamente baja (desviación estándar de 0,10).

Representación gráfica e interpretación diagnóstica

Figura 1. ¿Vender más caro significa vender menos unidades?

cor_precio_unidades <- cor(DatosCaso1$precio_unidad, DatosCaso1$unidades_vendidas, use = "complete.obs")
 
ggplotly(
  ggplot(DatosCaso1, aes(x = precio_unidad, y = unidades_vendidas)) +
    geom_point(color = "#2a78d6", alpha = 0.5, size = 2) +
    geom_smooth(method = "lm", se = FALSE, color = "#52514e", linetype = "dashed", linewidth = 0.8) +
    labs(x = "Precio por unidad ($)", y = "Unidades vendidas") +
    theme_minimal(base_size = 12)
)

Interpretación Figura 1.

La correlación entre precio y unidades vendidas es positiva pero débil (r = 0,27).

No se observa que precios más altos impliquen menor volumen de ventas – de hecho la relación es ligeramente positiva, no negativa.

El precio por sí solo no explica bien el volumen vendido; hay que mirar otras variables (producto, canal, región) para entender qué mueve las unidades vendidas.

Figura 1.1. Las ventas más grandes ocurren en los precios más altos, pero dejan menos margen

DatosCaso1 <- DatosCaso1 %>%
  mutate(rango_precio = cut(precio_unidad, breaks = c(0,25,45,65,85,200),
                             labels = c("Menos de $25","$25 - $45","$45 - $65","$65 - $85","Más de $85")))
 
resumen_precio <- DatosCaso1 %>%
  group_by(rango_precio) %>%
  summarise(venta_promedio = mean(ventas_total, na.rm = TRUE),
            margen_promedio = mean(margen_operativo, na.rm = TRUE))
 
ggplotly(
  ggplot(resumen_precio, aes(x = rango_precio, y = venta_promedio)) +
    geom_col(fill = "#2a78d6", width = 0.6) +
    geom_text(aes(label = paste0(dollar(venta_promedio, accuracy = 1), "\n(margen ", percent(margen_promedio, accuracy = 1), ")")),
              vjust = -0.2, size = 3.3, color = "#0b0b0b") +
    scale_y_continuous(labels = dollar, expand = expansion(mult = c(0, 0.15))) +
    labs(subtitle = "Tamaño promedio de venta y margen operativo según el rango de precio por unidad",
         x = "Rango de precio por unidad", y = "Venta promedio ($)") +
    theme_minimal(base_size = 12)
)

Interpretación Figura 1.1.

A medida que sube el rango de precio, la venta promedio crece con fuerza: de $3.712 (precios menores a $25) a $44.131 (precios sobre $85), más de 10 veces más grande.

El margen operativo baja de forma consistente, de 44% en el rango más bajo a 36% en el más alto.

Los pedidos de mayor precio unitario dejan más ingreso por venta, pero proporcionalmente menos rentabilidad – probablemente por descuentos asociados a compras grandes.

Figura 2. Volumen de ventas vs. rentabilidad por distribuidor

resumen_distribuidor <- DatosCaso1 %>%
  group_by(distribuidor) %>%
  summarise(ventas_totales = sum(ventas_total, na.rm = TRUE),
            margen_promedio = mean(margen_operativo, na.rm = TRUE))
 
margen_prom_general <- mean(DatosCaso1$margen_operativo, na.rm = TRUE)
ventas_prom_general <- mean(resumen_distribuidor$ventas_totales)
 
resumen_distribuidor <- resumen_distribuidor %>%
  mutate(alerta = ifelse(ventas_totales > ventas_prom_general & margen_promedio < margen_prom_general,
                          "Alto volumen, bajo margen", "Dentro de lo esperado"))
 
ggplotly(
  ggplot(resumen_distribuidor, aes(x = ventas_totales, y = margen_promedio, label = distribuidor)) +
    geom_hline(yintercept = margen_prom_general, linetype = "dashed", color = "#c3c2b7") +
    geom_vline(xintercept = ventas_prom_general, linetype = "dashed", color = "#c3c2b7") +
    geom_point(aes(color = alerta), size = 5) +
    geom_text(vjust = -1.2, size = 3.5, color = "#0b0b0b") +
    scale_color_manual(values = c("Dentro de lo esperado" = "#2a78d6", "Alto volumen, bajo margen" = "#d03b3b")) +
    scale_y_continuous(labels = percent) +
    scale_x_continuous(labels = dollar) +
    labs(subtitle = "Líneas punteadas = promedio general",
         x = "Ventas totales ($)", y = "Margen operativo promedio", color = "") +
    theme_minimal(base_size = 12) + theme(legend.position = "top")
)

Interpretación Figura 2.

West Gear ($32,4M) y Foot Locker ($29,0M) concentran el mayor volumen de ventas, con márgenes cercanos al promedio general (42%).

Sports Direct, con menor volumen ($24,6M), logra el margen más alto de todos (44%).

El volumen de un distribuidor no garantiza que sea el más rentable en términos porcentuales para Adidas.

Figura 3. ¿Cómo se reparten los canales de venta en cada región?

mezcla_canales <- DatosCaso1 %>%
  group_by(region, metodo_venta) %>%
  summarise(ventas = sum(ventas_total, na.rm = TRUE), .groups = "drop") %>%
  group_by(region) %>%
  mutate(proporcion = ventas / sum(ventas)) %>%
  ungroup()
 
# Barra de referencia con el total del país, para comparar cada región contra el promedio nacional
mezcla_nacional <- DatosCaso1 %>%
  group_by(metodo_venta) %>%
  summarise(ventas = sum(ventas_total, na.rm = TRUE), .groups = "drop") %>%
  mutate(region = "Total país", proporcion = ventas / sum(ventas))
 
mezcla_canales <- bind_rows(mezcla_nacional, mezcla_canales) %>%
  mutate(region = factor(region, levels = c("Total país", "Northeast", "Southeast", "South", "Midwest", "West")))
 
ggplotly(
  ggplot(mezcla_canales, aes(x = region, y = proporcion, fill = metodo_venta)) +
    geom_col(width = 0.65) +
    geom_text(aes(label = percent(proporcion, accuracy = 1)),
              position = position_stack(vjust = 0.5), color = "white", size = 3.2) +
    scale_fill_manual(values = c("Online" = "#2a78d6", "Outlet" = "#eb6834", "In-store" = "#1baf7a")) +
    scale_y_continuous(labels = percent) +
    labs(subtitle = "La primera barra es el promedio nacional; el resto son las regiones",
         x = "", y = "Participación en ventas", fill = "Método de venta") +
    theme_minimal(base_size = 12) + theme(legend.position = "top")
)

Interpretación Figura 3.

La barra de Total país es la referencia: a nivel nacional, Online representa el 37,4% de las ventas, Outlet el 32,9% e In-store el 29,7% – una mezcla relativamente equilibrada.

Comparando cada región contra esa referencia, las diferencias son grandes: en South, el canal In-store prácticamente no existe (1,6%, muy por debajo del 29,7% nacional), mientras que Outlet domina con 53,7% (muy por encima del 32,9% nacional). En Southeast pasa lo contrario: Online concentra el 56,5% de las ventas, casi 20 puntos por encima del promedio del país.

Ninguna región se parece realmente al promedio nacional – una estrategia de canal única para todo el país no tendría sentido con estos datos, porque cada región ya tiene un canal dominante propio.

Figura 4. ¿Qué canal deja mejor margen, y qué tan predecible es?

ggplotly(
  ggplot(DatosCaso1, aes(x = reorder(metodo_venta, margen_operativo, FUN = median), y = margen_operativo, fill = metodo_venta)) +
    geom_boxplot(outlier.colour = "#d03b3b", outlier.shape = 16, outlier.size = 2) +
    stat_summary(fun = mean, geom = "point", shape = 23, size = 3, fill = "white", color = "black") +
    scale_fill_manual(values = c("Online" = "#2a78d6", "Outlet" = "#eb6834", "In-store" = "#1baf7a")) +
    scale_y_continuous(labels = percent) +
    labs(subtitle = "El diamante blanco es el margen promedio de cada canal; la caja muestra qué tan variable es",
         x = "", y = "Margen operativo", fill = "") +
    theme_minimal(base_size = 12) + theme(legend.position = "none")
)

Interpretación Figura 4.

Online es, a la vez, el canal con más participación en ventas (Figura 3) y el de mejor margen promedio (diamante en 46%) – pero también tiene la caja más ancha: su margen varía bastante más de una venta a otra (entre 21% y 80%).

In-store tiene el promedio más bajo (36%), pero la caja más angosta (entre 30% y 40%): es el canal más consistente, aunque el más modesto en rentabilidad.

Hay un trade-off claro: mejor margen promedio no significa margen más predecible. Online conviene si Adidas puede tolerar más variación de una venta a otra; In-store es la opción más segura, aunque con menor ganancia.

Figura 5. Las 10 ciudades que más venden, ¿son también las más rentables?

margen_prom_general <- mean(DatosCaso1$margen_operativo, na.rm = TRUE)
 
ventas_ciudad <- DatosCaso1 %>%
  group_by(ciudad) %>%
  summarise(ventas = sum(ventas_total, na.rm = TRUE),
            margen = mean(margen_operativo, na.rm = TRUE), .groups = "drop") %>%
  arrange(desc(ventas)) %>%
  slice_head(n = 10) %>%
  mutate(alerta = ifelse(margen < margen_prom_general, "Margen bajo el promedio", "Margen sobre el promedio"))
 
ggplotly(
  ggplot(ventas_ciudad, aes(x = reorder(ciudad, ventas), y = ventas, fill = alerta)) +
    geom_col(width = 0.7) +
    geom_text(aes(label = percent(margen, accuracy = 1)), hjust = -0.15, size = 3.3, color = "#0b0b0b") +
    coord_flip() +
    scale_fill_manual(values = c("Margen sobre el promedio" = "#2a78d6", "Margen bajo el promedio" = "#d03b3b")) +
    scale_y_continuous(labels = dollar, expand = expansion(mult = c(0, 0.12))) +
    labs(subtitle = "El número junto a cada barra es el margen operativo promedio de esa ciudad",
         x = "", y = "Ventas totales ($)", fill = "") +
    theme_minimal(base_size = 12) + theme(legend.position = "top")
)

Interpretación Figura 5.

New York lidera en ventas ($5,68M), pero su margen operativo (40%) está por debajo del promedio general (42%).

San Francisco, la segunda ciudad que más vende ($4,93M), tiene el margen más bajo de todo el top 10 (36%).

En cambio, Charleston y New Orleans – que venden menos que las dos líderes – logran el mejor margen del grupo (44-45%).

Las 10 ciudades líderes siguen repartidas entre varias regiones del país (costa este, costa oeste, sur), pero repartido no es lo mismo que igual de rentable: vender más en una ciudad no garantiza que sea la más rentable para Adidas – el mismo patrón que se ve con los distribuidores en la Figura 2 se repite aquí con las ciudades.

Figura 6. ¿Qué línea de producto vende más, y cuál deja mejor margen?

margen_prom_general <- mean(DatosCaso1$margen_operativo, na.rm = TRUE)
 
ventas_producto <- DatosCaso1 %>%
  group_by(producto) %>%
  summarise(ventas = sum(ventas_total, na.rm = TRUE),
            margen = mean(margen_operativo, na.rm = TRUE), .groups = "drop") %>%
  mutate(participacion = ventas / sum(ventas),
         alerta = ifelse(margen < margen_prom_general, "Margen bajo el promedio", "Margen sobre el promedio"))
 
ggplotly(
  ggplot(ventas_producto, aes(x = reorder(producto, ventas), y = participacion, fill = alerta)) +
    geom_col(width = 0.7) +
    geom_text(aes(label = paste0(percent(participacion, accuracy = 1), " (margen ", percent(margen, accuracy = 1), ")")),
              hjust = -0.05, size = 3.2, color = "#0b0b0b") +
    coord_flip() +
    scale_fill_manual(values = c("Margen sobre el promedio" = "#2a78d6", "Margen bajo el promedio" = "#d03b3b")) +
    scale_y_continuous(labels = percent, expand = expansion(mult = c(0, 0.3))) +
    labs(subtitle = "Barras = participación en ventas totales; etiqueta = participación y margen operativo promedio",
         x = "", y = "Participación en ventas totales", fill = "") +
    theme_minimal(base_size = 12) + theme(legend.position = "top")
)

Interpretación Figura 6.

Men’s Street Footwear es la línea que más vende (23,0% de las ventas totales) y además tiene el mejor margen de todas (45%).

Women’s Apparel es la segunda línea que más vende (19,9%) y también queda por encima del margen promedio (44%).

Men’s Athletic Footwear, aunque es la tercera línea en ventas (17,1%), tiene el margen más bajo de todas (40%).

A diferencia de lo que pasa con distribuidores y ciudades, aquí sí hay coherencia entre volumen y rentabilidad: la línea que más vende (Men’s Street Footwear) es también la más rentable – no toda la base de datos muestra la misma desconexión entre “vender mucho” y “ganar bien”.

Hallazgos relevantes

  • El precio por sí solo no explica el volumen de ventas (r = 0,27); pero al agrupar por rango de precio, las ventas más grandes en dinero sí ocurren en los precios más altos, aunque con menor margen (Figuras 1 y 1.1).

  • Las ventas totales y la utilidad operativa están fuertemente relacionadas (r = 0,94): vender más casi siempre se traduce en más utilidad en dólares, más que el precio (r = 0,50) o incluso las unidades vendidas solas (r = 0,87).

  • El volumen de un distribuidor no garantiza su rentabilidad: Sports Direct vende menos que West Gear o Foot Locker, pero deja el mejor margen (Figura 2).

  • La mezcla de canales varía radicalmente por región: South casi no usa tiendas físicas, mientras que Southeast depende fuertemente de Online (Figura 3).

  • Online deja el mejor margen promedio (46%) pero es el canal menos predecible (varía entre 21% y 80% de una venta a otra); In-store deja menos margen (36%) pero es mucho más consistente (Figura 4).

  • Las ciudades líderes en ventas están repartidas por todo el país, pero no son necesariamente las más rentables: New York y San Francisco venden más que nadie, y sin embargo su margen está por debajo del promedio general (Figura 5).

  • Men’s Street Footwear es, a la vez, la línea de producto que más vende y la más rentable, el único caso en todo el análisis donde volumen y margen van de la mano en vez de compensarse (Figura 6).

Conclusiones y recomendaciones (analítica prescriptiva)

¿Qué tipo de decisiones se podrían tomar de acuerdo con este análisis?

  1. Revisar la política de descuentos en ventas de alto valor: ya que el margen cae de 44% a 36% a medida que sube el precio de la transacción, vale la pena confirmar si esos descuentos a compras grandes están bien calibrados.

  2. Diferenciar la estrategia de canal por región: en lugar de una política nacional única, reforzar Outlet en South y Online en Southeast, que ya son los canales dominantes naturales en cada zona.

  3. Usar a Sports Direct como referencia de rentabilidad: entender qué hace este distribuidor para lograr mejor margen con menor volumen, y evaluar si es replicable con West Gear o Foot Locker.

  4. Revisar las condiciones comerciales en New York y San Francisco: son las ciudades que más venden, pero dejan un margen por debajo del promedio – vale la pena investigar si hay descuentos, costos logísticos o de distribución más altos ahí que estén afectando la rentabilidad, y tomar como referencia a Charleston y New Orleans, que venden menos pero son más rentables.

  5. Priorizar inversión en el canal Online: combina la mayor participación en ventas y el mejor margen operativo; conviene revisar por qué In-store rinde menos en rentabilidad.

  6. Reforzar Men’s Street Footwear e investigar a Men’s Athletic Footwear: la primera línea es un caso ejemplar (lidera en ventas y en margen), mientras que la segunda vende bastante pero deja el margen más bajo – vale la pena entender qué la diferencia de las demás líneas para corregirlo.

  7. Validar la calidad de los datos de origen antes de presentar cifras definitivas: las 262 filas duplicadas detectadas al inicio deberían confirmarse con el equipo de datos.