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é?.
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
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.
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.
| 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 |
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)
Convenciones del análisis.
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 |
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)")
| 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)")
| 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)")
| 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)")
| 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 %>%
dplyr::select(precio_unidad, unidades_vendidas, ventas_total, margen_pct) %>%
pivot_longer(everything(), names_to = "variable", values_to = "valor")
centrales <- largo %>%
group_by(variable) %>%
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")
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(~variable, scales = "free", labeller = as_labeller(etiquetas)) +
scale_x_continuous(labels = scales::comma) +
scale_colour_manual(values = c(Media = "#f79b72", Mediana = "#21c1c6", Moda = "#00bf63")) +
labs(title = "Figura 1. Histogramas con media, mediana y moda",
caption = "Fuente: base DatosCaso1.xlsx; cálculos propios.",
x = NULL, y = "Frecuencia", colour = NULL)
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..
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 | 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 | 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")
| 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 | 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?
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")) %>%
ggplot(aes(x = fct_reorder(segmento, pct), y = pct, fill = medida)) +
geom_col(position = "dodge") + coord_flip() +
facet_wrap(~dimension, scales = "free_y", ncol = 1) +
scale_fill_manual(values = c("% de ventas" = "#d4d4d4",
"% de utilidad" = "#21c1c6")) +
labs(title = "Figura 2. Participación en ventas vs. participación en utilidad",
subtitle = "Denominador: total de la base (ventas 120,2 M; utilidad 47,2 M)",
caption = "Fuente: base DatosCaso1.xlsx; cálculos propios.",
x = NULL, y = "% del total", fill = NULL)
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?
ggplot(seg_region, aes(x = fct_reorder(region, margen), y = margen)) +
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(title = "Figura 3. Margen operativo agregado por region",
subtitle = "Línea roja = margen agregado total (39,3 %)",
caption = "Fuente: base DatosCaso1.xlsx; cálculos propios.",
x = NULL, y = "Margen operativo (%)") +
expand_limits(y = 50)
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?
ggplot(filter(datos, ventas_total > 0), aes(metodo_venta, margen_pct, fill = metodo_venta)) +
geom_boxplot(show.legend = FALSE) +
labs(title = "Figura 4. Margen operativo por registro según método de venta",
caption = "Fuente: base DatosCaso1.xlsx; cálculos propios.",
x = NULL, y = "Margen operativo (%)")
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).
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?
datos %>% group_by(region, metodo_venta) %>%
summarise(margen = sum(utilidad_operativa) / sum(ventas_total) * 100, .groups = "drop") %>%
ggplot(aes(metodo_venta, region, fill = margen)) + geom_tile() +
geom_text(aes(label = round(margen, 1)), colour = "white") +
scale_fill_gradient(low = "#f97b72", high = "#21c1c6") +
labs(title = "Figura 5. Margen operativo (%) por region y método de venta",
caption = "Fuente: base DatosCaso1.xlsx; cálculos propios.",
x = NULL, y = NULL, fill = "Margen %")
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.
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.
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")
| 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")
| 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")
| 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?
brecha_prod %>%
select(producto, West = margen_West, Resto = margen_Resto) %>%
pivot_longer(c(West, Resto), names_to = "grupo", values_to = "margen") %>%
ggplot(aes(x = fct_reorder(producto, margen, .fun = min), y = margen, fill = grupo)) +
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" = "#d4d4d4"),
labels = c("West" = "West", "Resto" = "Resto del país")) +
expand_limits(y = 55) +
labs(title = "Figura 6. Margen operativo por producto: West vs. resto del país",
caption = "Fuente: base DatosCaso1.xlsx; cálculos propios. Margen = utilidad total / ventas totales del grupo.",
x = NULL, y = "Margen operativo (%)", fill = NULL)
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")
| 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")
| 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.
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?
ggplot(filter(datos, ventas_total > 0), aes(unidades_vendidas, margen_pct)) +
geom_point(alpha = 0.12, size = 0.8) + geom_smooth(method = "lm", colour = "red", se = FALSE) +
facet_wrap(~region) +
labs(title = "Figura 7. Unidades vendidas vs. margen operativo por region",
caption = "Fuente: base DatosCaso1.xlsx; cálculos propios.",
x = "Unidades vendidas por registro", y = "Margen operativo (%)")
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.
| # | 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 |