Introducción

Adidas es una multinacional alemana fundada en 1949, dedicada al diseño y la comercialización de calzado, ropa y accesorios deportivos. Este informe analiza sus ventas y su rentabilidad en Estados Unidos a partir de una base de 9.648 registros por distribuidor, región, producto y método de venta (In-store, Online y Outlet), mediante un análisis exploratorio y diagnóstico. El propósito es responder al comité comercial y financiero: ¿dónde conviene concentrar la atención de la empresa y por qué?.

1. Resumen ejecutivo

El comité comercial y financiero de Adidas busca identificar dónde concentrar sus esfuerzos para mejorar la rentabilidad de la empresa.

El análisis de 9.648 registros de ventas en Estados Unidos presenta:

ventas totales de 120,2 millones

utilidad operativa de 47,2 millones

margen del 39,3 %

El analisis permite observar que:

West entre las regiones con mayor venta (30,3 %) pero tiene el menor margen operativo (35,7 %), frente al 40,9 % del resto del país, situación que se concentra principalmente en el producto Women’s Apparel con 7,038 M en ventas y 29,8 % de margen y en el distribuidor West Gear, que representa el 51 % de las ventas de la región canal Online es el más rentable, con un margen del 43,5 %.

Se recomienda revisar los precios, descuentos y costos en West, especialmente en Women’s Apparel y con West Gear, fortalecer el canal Online

2. Datos y preparación

Esta sección sigue el primer paso de la ruta de análisis: definir qué representa cada fila, el alcance de la base, los tipos de variables y las unidades monetarias, y revisar faltantes, duplicados, formatos, coherencia entre variables y valores atípicos, documentando cada decisión.

2.1 Unidad de observación y alcance

datos_raw <- read_excel("DatosCaso1.xlsx", sheet = "Data Sales Adidas")   # el archivo debe estar en la misma carpeta que el .Rmd
glimpse(datos_raw)
## Rows: 9,648
## Columns: 12
## $ distribuidor       <chr> "Foot Locker", "Foot Locker", "Foot Locker", "Foot …
## $ region             <chr> "Northeast", "Northeast", "Northeast", "Northeast",…
## $ estado             <chr> "New York", "New York", "New York", "New York", "Ne…
## $ ciudad             <chr> "New York", "New York", "New York", "New York", "Ne…
## $ producto           <chr> "Men's Street Footwear", "Men's Athletic Footwear",…
## $ precio_unidad      <dbl> 50, 50, 40, 45, 60, 50, 50, 50, 40, 45, 60, 50, 50,…
## $ unidades_vendidas  <dbl> 1200, 1000, 1000, 850, 900, 1000, 1250, 900, 950, 8…
## $ ventas_total       <dbl> 60000, 50000, 40000, 38250, 54000, 50000, 62500, 45…
## $ utilidad_operativa <dbl> 30000.00, 15000.00, 14000.00, 13387.50, 16200.00, 1…
## $ margen_operativo   <dbl> 0.50, 0.30, 0.35, 0.35, 0.30, 0.25, 0.50, 0.30, 0.3…
## $ metodo_venta       <chr> "In-store", "In-store", "In-store", "In-store", "In…
## $ `% margen`         <dbl> 0.50, 0.30, 0.35, 0.35, 0.30, 0.25, 0.50, 0.30, 0.3…
  • Unidad de observación. Cada fila es un registro agregado de venta, definido por la combinación de distribuidor, ubicación (región, estado y ciudad), producto y método de venta, con su precio por unidad, las unidades vendidas, las ventas totales, la utilidad operativa y el margen operativo.

  • Alcance. 9.648 registros del mercado de Estados Unidos: 6 distribuidores, 5 regiones, 50 estados, 52 ciudades, 6 productos y 3 métodos de venta (In-store, Online y Outlet).

  • Unidades monetarias. dólares estadounidenses. margen_operativo está en proporción (0 a 1) y se expresa en porcentaje en el informe.

2.2 Variables y tipos

Variable Tipo Descripción
distribuidor, region, estado, ciudad, producto, metodo_venta Categórica (texto) Dimensiones de segmentación del negocio
precio_unidad Numérica continua Precio por unidad (moneda asumida: USD); rango de 7 a 110
unidades_vendidas Numérica entera Unidades vendidas por registro; rango de 0 a 1.275
ventas_total Numérica continua precio × unidades; rango de 0 a 82.500
utilidad_operativa Numérica continua Utilidad operativa del registro; rango de 0 a 39.000
margen_operativo Numérica continua (proporción) utilidad / ventas; rango de 0,10 a 0,80

2.3 Revisión de calidad y decisiones

datos <- datos_raw

# 1) Faltantes
faltantes <- colSums(is.na(datos))

# 2) Duplicados exactos
n_dup <- sum(duplicated(datos))

# 3) Coherencia interna
inc_ventas <- sum(abs(datos$precio_unidad * datos$unidades_vendidas - datos$ventas_total) > 1)
inc_util   <- sum(abs(datos$ventas_total * datos$margen_operativo - datos$utilidad_operativa) > 1)

# 4) Filas con ventas = 0 (margen no interpretable)
filas_cero <- datos %>% filter(ventas_total == 0)

# 5) Textos con espacios o categorías inconsistentes
cats <- datos %>% summarise(across(c(distribuidor, region, estado, ciudad, producto, metodo_venta),
                                   n_distinct))

list(faltantes = faltantes, duplicados = n_dup,
     incoherencia_ventas = inc_ventas, incoherencia_utilidad = inc_util,
     n_filas_ventas_cero = nrow(filas_cero))
## $faltantes
##       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           % margen 
##                  0                  0                  0                  0 
## 
## $duplicados
## [1] 262
## 
## $incoherencia_ventas
## [1] 0
## 
## $incoherencia_utilidad
## [1] 0
## 
## $n_filas_ventas_cero
## [1] 4
cats
distribuidor region estado ciudad producto metodo_venta
6 5 50 52 6 3
Revisión Hallazgo Decisión
Valores faltantes 0 en todas las variables Ninguna
Formatos y categorías Tipos correctos; sin espacios sobrantes ni categorías repetidas con distinta escritura Ninguna; las variables de texto se convierten a factor
Filas duplicadas exactas 262 filas (2,7 %), con 4,8 % de las ventas Se conservan: sin ID de transacción ni fecha, pueden ser ventas legítimas repetidas; se hace análisis de sensibilidad
Coherencia: precio × unidades = ventas 0 incoherencias Ninguna
Coherencia: ventas × margen = utilidad 0 incoherencias Ninguna
Ventas = 0 (0 unidades) 4 filas (Foot Locker, Omaha, Women’s Athletic Footwear) Se conservan en los totales (aportan 0); se excluyen solo de los promedios de margen
Valores atípicos 799 registros de ventas fuera del rango intercuartílico (8,3 % de las filas y 30,4 % de las ventas) No se eliminan: son ventas reales de alto volumen; se analizan en la sección 3.3
Variable no disponible Fecha No se analiza la evolución temporal
# Sensibilidad: ¿cambia el margen agregado si se eliminan los duplicados?
mg <- function(df) sum(df$utilidad_operativa) / sum(df$ventas_total)
c(con_duplicados = mg(datos), sin_duplicados = mg(distinct(datos)))
## con_duplicados sin_duplicados 
##      0.3929956      0.3953717

El margen agregado pasa de 39,30 % a 39,54 % al excluir duplicados (0,24 pp), por lo que la decisión de conservarlos no altera las conclusiones.

datos <- datos %>%
  mutate(across(c(distribuidor, region, estado, ciudad, producto, metodo_venta), as.factor),
         margen_pct = margen_operativo * 100)
T_v <- sum(datos$ventas_total)
T_u <- sum(datos$utilidad_operativa)
T_n <- sum(datos$unidades_vendidas)

3. Análisis exploratorio

Convenciones del análisis.

  • Unidades: ventas y utilidad operativa en dólares; unidades vendidas en unidades de producto; margen operativo en porcentaje.
  • Segmentos: región, distribuidor, producto, método de venta, estado y ciudad.
  • Denominadores: las participaciones de ventas y de utilidad se calculan sobre el total de la base (ventas 120,2 M; utilidad 47,2 M). El margen de cada segmento es utilidad del segmento / ventas del segmento, nunca el promedio simple de márgenes.

3.1 Indicadores totales

T_v <- sum(datos$ventas_total); T_u <- sum(datos$utilidad_operativa); T_n <- sum(datos$unidades_vendidas)

tibble(Indicador = c("Ventas totales", "Utilidad operativa total", "Unidades vendidas",
                     "Margen operativo agregado (%)", "Promedio simple de márgenes (%)", "Precio medio ponderado por unidad"),
       Valor = c(scales::number(T_v, big.mark = "."), scales::number(T_u, big.mark = "."), scales::number(T_n, big.mark = "."),
                 round(T_u / T_v * 100, 2),
                 round(mean(datos$margen_operativo[datos$ventas_total > 0]) * 100, 2),
                 round(T_v / T_n, 2))) %>% kable()
Indicador Valor
Ventas totales 120.166.650
Utilidad operativa total 47.224.968
Unidades vendidas 2.478.861
Margen operativo agregado (%) 39.3
Promedio simple de márgenes (%) 42.3
Precio medio ponderado por unidad 48.48

Medidas de tendencia central, dispersión y forma

Pregunta: ¿cuál es el valor típico de cada variable, cuánto varía entre registros y qué forma tiene su distribución? Se calculan medidas de tendencia central (media, mediana y moda), de dispersión (varianza, desviación estándar, coeficiente de variación, rango, cuartiles y rango intercuartílico) y de forma (asimetría). Se usa la mediana y el rango intercuartílico junto a la media porque las ventas y la utilidad son muy asimétricas.

# Moda: valor más frecuente
moda <- function(x) { ux <- unique(x); ux[which.max(tabulate(match(x, ux)))] }
# Asimetría (coeficiente de Fisher-Pearson): 0 = simétrica; > 0 = cola a la derecha
asimetria <- function(x) mean((x - mean(x))^3) / (mean((x - mean(x))^2)^1.5)
medidas <- datos %>%
  dplyr::select(precio_unidad, unidades_vendidas, ventas_total, utilidad_operativa, margen_operativo) %>%
  pivot_longer(everything(), names_to = "variable", values_to = "valor") %>%
  group_by(variable) %>%
  summarise(media = mean(valor), mediana = median(valor), moda = moda(round(valor, 2)),
            varianza = var(valor), desv_est = sd(valor), cv = sd(valor) / mean(valor),
            rango = max(valor) - min(valor), q1 = quantile(valor, .25), q3 = quantile(valor, .75),
            iqr = IQR(valor), asimetria = asimetria(valor), .groups = "drop")

knitr::kable(dplyr::select(medidas, variable, media, mediana, moda), digits = 2,
             caption = "Medidas de tendencia central (por registro)")
Medidas de tendencia central (por registro)
variable media mediana moda
margen_operativo 0.42 0.41 0.35
precio_unidad 45.22 45.00 50.00
unidades_vendidas 256.93 176.00 225.00
utilidad_operativa 4894.79 3262.98 2100.00
ventas_total 12455.08 7803.50 10000.00
knitr::kable(dplyr::select(medidas, variable, varianza, desv_est, cv, rango, q1, q3, iqr), digits = 2,
             caption = "Medidas de dispersión (por registro)")
Medidas de dispersión (por registro)
variable varianza desv_est cv rango q1 q3 iqr
margen_operativo 0.01 0.10 0.23 0.7 0.35 0.49 0.14
precio_unidad 216.25 14.71 0.33 103.0 35.00 55.00 20.00
unidades_vendidas 45903.93 214.25 0.83 1275.0 106.00 350.00 244.00
utilidad_operativa 23682475.48 4866.46 0.99 39000.0 1753.44 6192.36 4438.92
ventas_total 161706628.33 12716.39 1.02 82500.0 4065.25 15864.50 11799.25
knitr::kable(dplyr::select(medidas, variable, asimetria), digits = 2,
             caption = "Asimetría (0 = simétrica; mayor que 0 = cola a la derecha)")
Asimetría (0 = simétrica; mayor que 0 = cola a la derecha)
variable asimetria
margen_operativo 0.23
precio_unidad 0.36
unidades_vendidas 1.46
utilidad_operativa 2.33
ventas_total 1.96
# Moda de las variables categóricas (categoría con más registros)
moda_cat <- data.frame(
  variable = c("producto", "region", "metodo_venta", "distribuidor"),
  moda = c(as.character(moda(datos$producto)), as.character(moda(datos$region)),
           as.character(moda(datos$metodo_venta)), as.character(moda(datos$distribuidor))),
  stringsAsFactors = FALSE
)
knitr::kable(moda_cat, caption = "Categoría más frecuente (por número de registros)")
Categoría más frecuente (por número de registros)
variable moda
producto Men’s Street Footwear
region West
metodo_venta Online
distribuidor Foot Locker

Interpretación.

Valor típico (tendencia central). Una venta típica es de unos 7.800 (la mediana), no de 12.455 (la media). La media es más alta porque unos pocos pedidos muy grandes la jalan hacia arriba; por eso la mediana describe mejor un registro común.

La moda (10.000) es el valor que más se repite.

El precio por unidad es distinto: media y mediana casi coinciden (45,2 y 45), así que el precio típico es de unos 45.

El margen por registro ronda el 41 % (mediana 41 %; media 42,3 %). Por número de registros, las categorías más frecuentes son Men’s Athletic Footwear, West, Online y Foot Locker; esto indica cuántos registros hay, no cuánto se vendió.

Variabilidad (dispersión). Las ventas cambian mucho de un registro a otro: van de 0 a 82.500 y su desviación estándar (12.716) es incluso mayor que la media. La mitad central de los registros (rango intercuartílico) está entre 4.065 y 15.865.

El precio es más estable: la mitad central de los registros tiene precios entre 35 y 55, aunque el rango total va de 7 a 110.

El margen se separa unos 10 puntos de su promedio.

Forma (asimetría). En ventas, utilidad y unidades hay muchos registros pequeños y pocos muy grandes (asimetría positiva de 1,96, 2,33 y 1,46), por lo que conviene usar la mediana. El precio (0,36) y el margen (0,23) son casi simétricos, y en ellos el promedio sí es representativo.

Importante: estas medidas son por registro. Para decidir se usa el margen agregado (utilidad total ÷ ventas totales).

Figura 1. Histograma con mediana, media y moda.

etiquetas <- c(precio_unidad = "Precio por unidad", unidades_vendidas = "Unidades vendidas",
               ventas_total = "Ventas por registro", margen_pct = "Margen operativo (%)")

largo <- datos %>%
  mutate(margen_pct = margen_operativo * 100) %>%
  dplyr::select(precio_unidad, unidades_vendidas, ventas_total, margen_pct) %>%
  pivot_longer(everything(), names_to = "indicador", values_to = "valor")

centrales <- largo %>%
  group_by(indicador) %>%
  summarise(Media = mean(valor), Mediana = median(valor), Moda = moda(round(valor, 2)), .groups = "drop") %>%
  pivot_longer(c(Media, Mediana, Moda), names_to = "medida", values_to = "valor")

g1 <- ggplot(largo, aes(x = valor)) +
  geom_histogram(bins = 40, fill = "#d4d4d4", colour = "white") +
  geom_vline(data = centrales, aes(xintercept = valor, colour = medida), linewidth = 1) +
  facet_wrap(~indicador, scales = "free", labeller = as_labeller(etiquetas)) +
  scale_x_continuous(labels = scales::comma) +
  scale_colour_manual(values = c(Media = "#f79b72", Mediana = "#21c1c6", Moda = "#00bf63")) +
  labs(x = NULL, y = "Frecuencia", colour = NULL)

interactivo(g1, "Figura 1. Histogramas con media, mediana y moda", tooltip = "all")

Interpretación Figura 1. En ventas y unidades, el promedio (línea roja) queda más a la derecha que la mediana (línea azul): unos pocos pedidos muy grandes lo elevan, por lo que la mediana representa mejor un registro típico (7.804 en ventas, frente a un promedio de 12.455).

En precio, ambas líneas casi coinciden (45), porque su distribución es simétrica.

El margen se concentra alrededor de 41 %, con promedio y mediana muy cercanos.

La moda (línea verde) es el valor exacto más repetido; en ventas es 10.000, pero no coincide con el punto más alto del histograma, así que se usa con cautela..

3.2 Participación y rentabilidad por segmento

Función auxiliar: el margen siempre se calcula como utilidad total / ventas totales del segmento. Los porcentajes de participación usan como denominador el total de la base.

resumen_seg <- function(df, ...) {
  df %>%
    group_by(...) %>%
    summarise(filas = n(),
              ventas = sum(ventas_total),
              utilidad = sum(utilidad_operativa),
              unidades = sum(unidades_vendidas),
              .groups = "drop") %>%
    mutate(part_ventas = ventas / sum(ventas) * 100,
           part_utilidad = utilidad / sum(utilidad) * 100,
           margen = utilidad / ventas * 100,
           precio_medio = ventas / unidades) %>%
    arrange(desc(ventas))
}

seg_region <- resumen_seg(datos, region)
seg_dist   <- resumen_seg(datos, distribuidor)
seg_metodo <- resumen_seg(datos, metodo_venta)
seg_prod   <- resumen_seg(datos, producto)

kable(seg_region, digits = 1, caption = "Region"); kable(seg_dist, digits = 1, caption = "Distribuidor")
Region
region filas ventas utilidad unidades part_ventas part_utilidad margen precio_medio
West 2448 36436157 13017584 686985 30.3 27.6 35.7 53.0
Northeast 2376 25078267 9732774 501279 20.9 20.6 38.8 50.0
Southeast 1224 21374436 8393059 407000 17.8 17.8 39.3 52.5
South 1728 20603356 9221605 492260 17.1 19.5 44.8 41.9
Midwest 1872 16674434 6859945 391337 13.9 14.5 41.1 42.6
Distribuidor
distribuidor filas ventas utilidad unidades part_ventas part_utilidad margen precio_medio
West Gear 2374 32409558 12196891 625262 27.0 25.8 37.6 51.8
Foot Locker 2637 29024945 11317027 604369 24.2 24.0 39.0 48.0
Sports Direct 2032 24616622 10641609 557640 20.5 22.5 43.2 44.1
Kohl’s 1030 13512453 5182260 287375 11.2 11.0 38.4 47.0
Walmart 626 10506085 3902749 206225 8.7 8.3 37.1 50.9
Amazon 949 10096987 3984432 197990 8.4 8.4 39.5 51.0
kable(seg_metodo, digits = 1, caption = "Método de venta"); kable(seg_prod, digits = 1, caption = "Producto")
Método de venta
metodo_venta filas ventas utilidad unidades part_ventas part_utilidad margen precio_medio
Online 4889 44965657 19552538 939093 37.4 41.4 43.5 47.9
Outlet 3019 39536618 14913301 849778 32.9 31.6 37.7 46.5
In-store 1740 35664375 12759129 689990 29.7 27.0 35.8 51.7
Producto
producto filas ventas utilidad unidades part_ventas part_utilidad margen precio_medio
Men’s Street Footwear 1610 27680769 11629046 593320 23.0 24.6 42.0 46.7
Women’s Apparel 1608 23870985 9685221 433827 19.9 20.5 40.6 55.0
Men’s Athletic Footwear 1610 20577180 7437457 435526 17.1 15.7 36.1 47.2
Women’s Street Footwear 1608 17201563 6494017 392269 14.3 13.8 37.8 43.9
Men’s Apparel 1606 16520632 6381405 306683 13.7 13.5 38.6 53.9
Women’s Athletic Footwear 1606 14315521 5597822 317236 11.9 11.9 39.1 45.1

Figura 2. ¿Los segmentos que más venden también aportan proporcionalmente más utilidad?

# Pregunta: ¿los segmentos que más venden también aportan proporcionalmente más utilidad?
g2 <- bind_rows(
  seg_region %>% transmute(dimension = "Region", segmento = as.character(region), part_ventas, part_utilidad),
  seg_metodo %>% transmute(dimension = "Método de venta", segmento = as.character(metodo_venta), part_ventas, part_utilidad),
  seg_prod   %>% transmute(dimension = "Producto", segmento = as.character(producto), part_ventas, part_utilidad)
) %>%
  pivot_longer(c(part_ventas, part_utilidad), names_to = "medida", values_to = "pct") %>%
  mutate(medida = recode(medida, part_ventas = "% de ventas", part_utilidad = "% de utilidad"),
         tooltip = paste0(segmento, "<br>", medida, ": ", round(pct, 1), "%")) %>%
  ggplot(aes(x = pct, y = fct_reorder(segmento, pct), fill = medida, text = tooltip)) +
  geom_col(position = "dodge") +
  facet_wrap(~dimension, scales = "free_y", ncol = 1) +
  scale_fill_manual(values = c("% de ventas" = "#d4d4d4",
                               "% de utilidad" = "#21c1c6")) +
  labs(x = "% del total", y = NULL, fill = NULL)

interactivo(g2, "Figura 2. Participación en ventas vs. participación en utilidad",
            subtitulo = "Denominador: total de la base (ventas 120,2 M; utilidad 47,2 M)")

Interpretación Figura 2. West vende 30,3 % del total pero aporta 27,6 % de la utilidad; South hace lo contrario (17,1 % de ventas, 19,5 % de utilidad). Online genera 37,4 % de ventas y 41,4 % de la utilidad. Vender más no implica ganar proporcionalmente más.

Figura 3. ¿Qué región es más rentable por cada dólar vendido?

# Pregunta: ¿qué region es más rentable por cada dólar vendido?
g3 <- seg_region %>%
  mutate(tooltip = paste0("Region: ", region,
                          "<br>Margen operativo: ", round(margen, 1), "%",
                          "<br>Ventas: ", round(ventas / 1e6, 1), " M",
                          "<br>Utilidad: ", round(utilidad / 1e6, 1), " M",
                          "<br>% de las ventas: ", round(part_ventas, 1), "%")) %>%
  ggplot(aes(x = fct_reorder(region, margen), y = margen, text = tooltip)) +
  geom_col(fill = "#21c1c6") +
  geom_hline(yintercept = T_u / T_v * 100, linetype = "dashed", colour = "#f97b72") +
  geom_text(aes(label = paste0(round(margen, 1), "%")), hjust = -0.1) +
  coord_flip() +
  labs(x = NULL, y = "Margen operativo (%)") +
  expand_limits(y = 50)

interactivo(g3, "Figura 3. Margen operativo agregado por region",
            subtitulo = "Línea punteada = margen agregado total (39,3 %)")

Interpretación Figura 3. West tiene el menor margen entre las cinco regiones (35,7 %), por debajo del margen total (39,3 %), y South el mayor (44,8 %). La comparación es por dólar vendido, no por volumen.

Figura 4. ¿Cuánta variabilidad de margen hay dentro de cada método de venta?

# Pregunta: ¿cuánta variabilidad de margen hay dentro de cada método de venta?
g4 <- ggplot(filter(mutate(datos, margen_pct = margen_operativo * 100), ventas_total > 0), aes(metodo_venta, margen_pct, fill = metodo_venta)) +
  geom_boxplot(show.legend = FALSE) +
  labs(x = NULL, y = "Margen operativo (%)")

interactivo(g4, "Figura 4. Margen operativo por registro según método de venta", tooltip = "all")

Interpretación Figura 4. Online no solo tiene la mediana más alta, también el menor coeficiente de variación del margen (0,19); Outlet es el más disperso (0,23).

4. Diagnóstico y hallazgos

Hallazgo 1. West es la region más grande pero la menos rentable.

seg_region %>% select(region, ventas, part_ventas, part_utilidad, margen) %>% kable(digits = 1)
region ventas part_ventas part_utilidad margen
West 36436157 30.3 27.6 35.7
Northeast 25078267 20.9 20.6 38.8
Southeast 21374436 17.8 17.8 39.3
South 20603356 17.1 19.5 44.8
Midwest 16674434 13.9 14.5 41.1
oeste <- datos %>% filter(region == "West"); resto <- datos %>% filter(region != "West")
c(margen_west = mg(oeste) * 100, margen_resto = mg(resto) * 100,
  brecha_pp = (mg(oeste) - mg(resto)) * 100,
  utilidad_adicional_si_cierra_brecha = sum(oeste$ventas_total) * (mg(resto) - mg(oeste)))
##                         margen_west                        margen_resto 
##                           35.727105                           40.854153 
##                           brecha_pp utilidad_adicional_si_cierra_brecha 
##                           -5.127048                      1868099.248564

Evidencia: West: 36,4 M en ventas, margen 35,7 %. Resto del país: 40,9 %. La brecha es de 5,1 pp; sobre las ventas de West equivale a unos 1,9 M de utilidad operativa

Explicación alternativa 1 – composición (mix): ¿West tiene peor margen porque vende más de lo que es menos rentable? Se descompone la brecha entre efecto composición (producto × método) y efecto tasa (margen dentro de cada celda).

Figura 5. ¿La brecha de margen de West aparece en todos los métodos de venta?

g5 <- datos %>% group_by(region, metodo_venta) %>%
  summarise(margen = sum(utilidad_operativa) / sum(ventas_total) * 100, .groups = "drop") %>%
  mutate(tooltip = paste0("Region: ", region, "<br>Método: ", metodo_venta,
                          "<br>Margen operativo: ", round(margen, 1), "%")) %>%
  ggplot(aes(metodo_venta, region, fill = margen)) +
  geom_tile(aes(text = tooltip)) +
  geom_text(aes(label = round(margen, 1)), colour = "white") +
  scale_fill_gradient(low = "#f97b72", high = "#21c1c6") +
  labs(x = NULL, y = NULL, fill = "Margen %")

interactivo(g5, "Figura 5. Margen operativo (%) por region y método de venta")

Interpretación Figura 5. West tiene el menor margen en los tres canales (33,2 % In-store, 41,4 % Online, 32,8 % Outlet), lo que apunta a algo estructural de la región (precios, costos, competencia, descuentos) y no a un canal en particular.

Explicación alternativa 2 – precio: West tiene un precio medio ponderado más alto (53,0 vs 46,7 USD). Un precio alto no se traduce en mayor margen, lo que sugiere costos o descuentos más altos. Dato faltante: costo de ventas, descuentos y costos logísticos por región.

Hallazgo 2. El canal Online es el más rentable en todas las regiones

seg_metodo %>% select(metodo_venta, ventas, part_ventas, part_utilidad, margen, precio_medio) %>% kable(digits = 1)
metodo_venta ventas part_ventas part_utilidad margen precio_medio
Online 44965657 37.4 41.4 43.5 47.9
Outlet 39536618 32.9 31.6 37.7 46.5
In-store 35664375 29.7 27.0 35.8 51.7
datos %>% group_by(region, metodo_venta) %>%
  summarise(margen = sum(utilidad_operativa) / sum(ventas_total) * 100, .groups = "drop") %>%
  pivot_wider(names_from = metodo_venta, values_from = margen) %>% kable(digits = 1)
region In-store Online Outlet
Midwest 38.9 44.0 39.2
Northeast 36.7 48.6 36.5
South 39.7 45.1 44.6
Southeast 35.4 42.1 36.4
West 33.2 41.4 32.8

Evidencia: Online: 43,5 % de margen vs 37,7 % Outlet y 35,8 % In-store; es el canal mejor en las cinco regiones. Pese a eso, es el canal con menor ticket mediano (6.000 vs 16.875 de In-store): rentable por unidad vendida pero con registros pequeños.
Implicación: crecer en Online mejora el margen agregado. Hipótesis: menores costos de ocupación y menores descuentos; no se puede confirmar sin datos de costos.

Hallazgo 3. En West, el margen bajo se concentra en Women’s Apparel (profundizado)

Pregunta: West gana menos que el resto del país (35,7 % frente a 40,9 %). ¿En qué productos y con qué distribuidores se concentra esa diferencia? Para cada producto se compara su margen en West con su margen en el resto del país. La “utilidad perdida” es un escenario ilustrativo: ventas del producto en West × (margen del resto − margen de West).

datos %>% filter(region == "West") %>% group_by(producto) %>%
  summarise(ventas = sum(ventas_total), margen = sum(utilidad_operativa) / sum(ventas_total) * 100, .groups = "drop") %>%
  arrange(margen) %>% kable(digits = 1, caption = "West: margen por producto")
West: margen por producto
producto ventas margen
Women’s Apparel 7038046 29.8
Men’s Athletic Footwear 6761339 31.9
Women’s Athletic Footwear 4670820 36.6
Women’s Street Footwear 5748586 37.3
Men’s Street Footwear 7389988 39.3
Men’s Apparel 4827378 41.6
datos %>% filter(region == "West") %>% group_by(distribuidor) %>%
  summarise(ventas = sum(ventas_total), margen = sum(utilidad_operativa) / sum(ventas_total) * 100, .groups = "drop") %>%
  mutate(part_west = ventas / sum(ventas) * 100) %>% arrange(desc(ventas)) %>% kable(digits = 1, caption = "West: margen por distribuidor")
West: margen por distribuidor
distribuidor ventas margen part_west
West Gear 18699980 35.3 51.3
Kohl’s 8551190 37.3 23.5
Foot Locker 5053709 35.4 13.9
Sports Direct 1658670 40.3 4.6
Amazon 1639600 33.2 4.5
Walmart 833008 27.3 2.3
brecha_prod <- datos %>%
  mutate(grupo = if_else(region == "West", "West", "Resto")) %>%
  group_by(producto, grupo) %>%
  summarise(ventas = sum(ventas_total), utilidad = sum(utilidad_operativa), .groups = "drop") %>%
  mutate(margen = utilidad / ventas * 100) %>%
  select(producto, grupo, ventas, margen) %>%
  pivot_wider(names_from = grupo, values_from = c(ventas, margen)) %>%
  mutate(brecha_pp = margen_West - margen_Resto,
         utilidad_perdida_M = ventas_West * (margen_Resto - margen_West) / 100 / 1e6,
         ventas_West_M = ventas_West / 1e6) %>%
  arrange(desc(utilidad_perdida_M))

brecha_prod %>%
  select(producto, ventas_West_M, margen_West, margen_Resto, brecha_pp, utilidad_perdida_M) %>%
  kable(digits = 2, caption = "Brecha de margen West vs. resto del país, por producto")
Brecha de margen West vs. resto del país, por producto
producto ventas_West_M margen_West margen_Resto brecha_pp utilidad_perdida_M
Women’s Apparel 7.04 29.78 45.08 -15.30 1.08
Men’s Athletic Footwear 6.76 31.86 38.24 -6.38 0.43
Men’s Street Footwear 7.39 39.34 42.98 -3.64 0.27
Women’s Athletic Footwear 4.67 36.56 40.34 -3.78 0.18
Women’s Street Footwear 5.75 37.27 38.00 -0.73 0.04
Men’s Apparel 4.83 41.63 37.39 4.24 -0.20
c(suma_brechas_M = sum(brecha_prod$utilidad_perdida_M),
  peso_women_apparel = max(brecha_prod$utilidad_perdida_M) / sum(brecha_prod$utilidad_perdida_M) * 100)
##     suma_brechas_M peso_women_apparel 
##           1.790458          60.139590

Figura 6. ¿En qué productos el margen de West queda más por debajo del resto del país?

g6 <- brecha_prod %>%
  select(producto, West = margen_West, Resto = margen_Resto) %>%
  pivot_longer(c(West, Resto), names_to = "grupo", values_to = "margen") %>%
  mutate(grupo = recode(grupo, Resto = "Resto del país"),
         tooltip = paste0(producto, "<br>", grupo, ": ", round(margen, 1), "%")) %>%
  ggplot(aes(x = fct_reorder(producto, margen, .fun = min), y = margen, fill = grupo, text = tooltip)) +
  geom_col(position = "dodge") +
  geom_text(aes(label = paste0(round(margen, 1), "%")),
            position = position_dodge(width = 0.9), hjust = -0.1, size = 3.2) +
  coord_flip() +
  scale_fill_manual(values = c("West" = "#21c1c6", "Resto del país" = "#d4d4d4")) +
  expand_limits(y = 55) +
  labs(x = NULL, y = "Margen operativo (%)", fill = NULL)


interactivo(g6, "Figura 6. Margen operativo por producto: West vs. resto del país",
            fuente = "Fuente: base DatosCaso1.xlsx; cálculos propios. Margen = utilidad total / ventas totales del grupo.")

Interpretación Figura 6. Women’s Apparel tiene la brecha más grande: 29,8 % en West frente a 45,1 % en el resto del país, 15,3 puntos menos. Le sigue Men’s Athletic Footwear (31,9 % frente a 38,2 %); Men’s Apparel es la excepción y rinde más en West (41,6 % frente a 37,4 %).

Evidencia. Women’s Apparel vende 7,0 M en West (19 % de las ventas de la región). Aplicando la brecha a esas ventas, equivale a unos 1,1 M de utilidad (escenario ilustrativo). Al sumar la brecha de los seis productos se obtienen unos 1,8 M, de los cuales Women’s Apparel explica cerca del 60 %. Men’s Athletic Footwear es un segundo foco menor (≈ 0,4 M).

Se mantiene en todos los métodos de venta. Para comprobar que no es un efecto de un solo canal, se repite la comparación para Women’s Apparel por método de venta, y se revisa el aporte de los distribuidores:

wa <- datos %>% filter(producto == "Women's Apparel") %>%
  mutate(grupo = if_else(region == "West", "West", "Resto"))

wa %>% group_by(metodo_venta, grupo) %>%
  summarise(margen = sum(utilidad_operativa) / sum(ventas_total) * 100, .groups = "drop") %>%
  pivot_wider(names_from = grupo, values_from = margen) %>%
  mutate(brecha_pp = West - Resto) %>%
  kable(digits = 1, caption = "Women's Apparel: margen (%) por método de venta, West vs. resto")
Women’s Apparel: margen (%) por método de venta, West vs. resto
metodo_venta Resto West brecha_pp
In-store 42.0 25.9 -16.2
Online 48.7 37.5 -11.2
Outlet 43.5 26.1 -17.4
wa %>% group_by(distribuidor, grupo) %>%
  summarise(ventas = sum(ventas_total), margen = sum(utilidad_operativa) / sum(ventas_total) * 100, .groups = "drop") %>%
  pivot_wider(names_from = grupo, values_from = c(ventas, margen)) %>%
  mutate(ventas_West_M = ventas_West / 1e6) %>%
  select(distribuidor, ventas_West_M, margen_West, margen_Resto) %>%
  arrange(desc(ventas_West_M)) %>%
  kable(digits = 1, caption = "Women's Apparel: margen (%) por distribuidor, West vs. resto")
Women’s Apparel: margen (%) por distribuidor, West vs. resto
distribuidor ventas_West_M margen_West margen_Resto
West Gear 3.6 26.9 45.2
Kohl’s 1.7 25.6 36.4
Foot Locker 0.9 38.1 42.3
Sports Direct 0.4 47.8 50.7
Amazon 0.3 32.5 44.0
Walmart 0.1 42.4 44.0

En los tres métodos de venta, Women’s Apparel rinde mucho menos en West: In-store 25,9 % frente a 42,0 %, Online 37,5 % frente a 48,7 % y Outlet 26,1 % frente a 43,5 %. El resultado se apoya en 408 registros, así que no es un caso aislado.

Distribuidores. West Gear concentra el 51 % de las ventas de West (18,7 M), pero su margen en West (35,3 %) es casi igual al de toda la región (35,7 %): su peso importa porque cualquier mejora ahí mueve mucho la utilidad regional, no porque sea el único con un problema. En Women’s Apparel, tanto West Gear (26,9 % en West frente a 45,2 % fuera) como Kohl’s (25,6 % frente a 36,4 %) rinden mucho menos en West. Dentro de ese producto, las ciudades más débiles son San Francisco (17,3 %), Las Vegas (22,4 %), Seattle (22,7 %) y Los Angeles (22,7 %).

Explicaciones alternativas. (1) Mezcla de productos o canales: la comparación se hizo producto por producto, así que no es un efecto de qué se vende. (2) Precio: West cobra más por unidad y aun así gana menos, lo que apunta a costos o descuentos más altos (hipótesis). Dato faltante: costos y descuentos por producto y distribuidor, para saber si el origen es precio, costo o descuento.

Implicación para el negocio: la brecha de West no está repartida de forma pareja, sino concentrada en pocas combinaciones: Women’s Apparel, y con mayor peso en las ciudades y distribuidores señalados. Esto permite una intervención acotada (un piloto) en lugar de actuar sobre toda la región.

Hallazgo 4. Precio, volumen y margen: la relación depende del segmento

datos %>% filter(ventas_total > 0) %>%
  summarise(r_precio_unid = cor(precio_unidad, unidades_vendidas),
            r_precio_margen = cor(precio_unidad, margen_operativo),
            r_unid_margen = cor(unidades_vendidas, margen_operativo),
            r_ventas_util = cor(ventas_total, utilidad_operativa)) %>% kable(digits = 2)
r_precio_unid r_precio_margen r_unid_margen r_ventas_util
0.27 -0.14 -0.31 0.94
datos %>% filter(ventas_total > 0) %>% group_by(region) %>%
  summarise(r_precio_margen = cor(precio_unidad, margen_operativo),
            r_unid_margen = cor(unidades_vendidas, margen_operativo), .groups = "drop") %>% kable(digits = 2)
region r_precio_margen r_unid_margen
Midwest 0.08 -0.35
Northeast -0.03 -0.27
South 0.09 -0.31
Southeast -0.15 -0.32
West -0.24 -0.39

Figura 7. ¿A mayor volumen por registro, menor margen? ¿Se cumple en todas las regiones?

# Pregunta: ¿a mayor volumen, menor margen? ¿Se cumple en todas las regiones?
g7 <- ggplot(filter(mutate(datos, margen_pct = margen_operativo * 100), ventas_total > 0), aes(unidades_vendidas, margen_pct)) +
  geom_point(aes(text = paste0("Region: ", region, "<br>Unidades: ", unidades_vendidas,
                               "<br>Margen: ", round(margen_pct, 1), "%")),
             alpha = 0.12, size = 0.8) +
  geom_smooth(method = "lm", colour = "red", se = FALSE) +
  facet_wrap(~region) +
  labs(x = "Unidades vendidas por registro", y = "Margen operativo (%)")

interactivo(g7, "Figura 7. Unidades vendidas vs. margen operativo por region")

Interpretación Figura 7. Cada punto es un registro de venta y la línea roja muestra la tendencia: en las cinco regiones baja. A más unidades por registro, menor margen.

Evidencia. La utilidad sube casi en línea con las ventas (r = 0,94), pero el margen baja cuando aumenta el volumen (r ≈ −0,31, y entre −0,27 y −0,39 según la región). Los pedidos más grandes tienen un margen de 37,0 %, frente a 45,4 % de los más pequeños. La relación entre precio y margen es débil en total (r ≈ −0,14) y cambia según la región: es ligeramente positiva en Midwest y South (≈ +0,08 y +0,09) y negativa en West (−0,24).

Interpretación (hipótesis). Es coherente con descuentos por volumen, pero una correlación no demuestra causalidad. Falta información sobre descuentos y condiciones comerciales de cada pedido.

Implicación para el negocio. Antes de conceder descuentos por volumen conviene revisar cuánto margen se pierde con ellos, y la relación entre precio y margen no debe extrapolarse del total a cada región.

5. Recomendaciones y límites

# Acción (propuesta) Evidencia Beneficio esperado (escenario) Riesgo / supuesto Responsable Indicador
1 Revisar política de precios, descuentos y costos de Women’s Apparel en West y con West Gear (empezar por San Francisco, Las Vegas, Los Angeles, Seattle) H1, H3: margen 29,8 % vs 45,1 % en el resto Cerrar la mitad de la brecha de Women’s Apparel ≈ 0,5 M de utilidad operativa La brecha puede deberse a costos o mercado y no a descuentos; riesgo de perder volumen Gerencia comercial West + Finanzas Margen operativo de Women’s Apparel en West (meta propuesta: +5 pp en 12 meses)
2 Impulsar el canal Online en regiones con margen Online alto (Northeast 48,6 %, South 45,1 %) H2: Online es el mejor canal en las 5 regiones Cada punto de mix que pase de In-store/Outlet a Online mejora el margen agregado Canibalización de tiendas; ticket Online más bajo Dirección comercial / e-commerce % de ventas Online y margen agregado
3 Documentar y probar en West las prácticas de South (margen 44,8 %) y de distribuidores como Sports Direct (43,2 %) H1, H3 Mejora de margen sin sacrificar volumen Diferencias estructurales (precio medio más bajo en South: 41,9 USD) pueden no ser transferibles Finanzas + Gerencia comercial Margen por región y por distribuidor