En este informe se analiza el desempeño comercial y financiero de Adidas a partir de una base de datos de ventas que incluye información de precio por unidad, unidades vendidas, ventas totales, utilidad operativa, margen operativo, método de venta, distribuidor y ubicación geográfica (región, estado, ciudad). El objetivo es realizar un análisis descriptivo y exploratorio (EDA) que permita comprender el comportamiento de las ventas y la rentabilidad, identificar patrones relevantes y proponer recomendaciones basadas en evidencia para la toma de decisiones.
Es importante aclarar que la base de datos no contiene una variable de fecha o periodo, por lo que no es posible calcular tasas de crecimiento en este análisis, el enfoque se centra en estadísticas descriptivas, medidas de variabilidad, correlación y comparación entre segmentos.
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)
PASO 2: Cargar la base de datos
IMPORTANTE: el objeto que se crea aquí se llama datos.
Todo el resto del informe hace referencia a ese mismo nombre — si lo
cambias, debes cambiarlo en TODOS los chunks siguientes también.
El archivo DatosCaso1.xlsx debe estar ubicado en la
misma carpeta que este .Rmd (o se debe actualizar la ruta
según corresponda).
library(readxl)
datos <- read_excel("DatosCaso1.xlsx", sheet = "Data Sales Adidas")
# Se asigna un identificador único a cada fila
id <- 1:dim(datos)[1]
datos <- data.frame(id, datos)
head(datos)
| id | distribuidor | region | estado | ciudad | producto | precio_unidad | unidades_vendidas | ventas_total | utilidad_operativa | margen_operativo | metodo_venta |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | Foot Locker | Northeast | New York | New York | Men’s Street Footwear | 50 | 1200 | 60000 | 30000.0 | 0.50 | In-store |
| 2 | Foot Locker | Northeast | New York | New York | Men’s Athletic Footwear | 50 | 1000 | 50000 | 15000.0 | 0.30 | In-store |
| 3 | Foot Locker | Northeast | New York | New York | Women’s Street Footwear | 40 | 1000 | 40000 | 14000.0 | 0.35 | In-store |
| 4 | Foot Locker | Northeast | New York | New York | Women’s Athletic Footwear | 45 | 850 | 38250 | 13387.5 | 0.35 | In-store |
| 5 | Foot Locker | Northeast | New York | New York | Men’s Apparel | 60 | 900 | 54000 | 16200.0 | 0.30 | In-store |
| 6 | Foot Locker | Northeast | New York | New York | Women’s Apparel | 50 | 1000 | 50000 | 12500.0 | 0.25 | In-store |
Ahora obtenemos los nombres exactos de las variables que tenemos en la base de datos:
names(datos)
## [1] "id" "distribuidor" "region"
## [4] "estado" "ciudad" "producto"
## [7] "precio_unidad" "unidades_vendidas" "ventas_total"
## [10] "utilidad_operativa" "margen_operativo" "metodo_venta"
## Estructura de los datos y número total de registros
str(datos)
## 'data.frame': 9648 obs. of 12 variables:
## $ id : int 1 2 3 4 5 6 7 8 9 10 ...
## $ distribuidor : chr "Foot Locker" "Foot Locker" "Foot Locker" "Foot Locker" ...
## $ region : chr "Northeast" "Northeast" "Northeast" "Northeast" ...
## $ estado : chr "New York" "New York" "New York" "New York" ...
## $ ciudad : chr "New York" "New York" "New York" "New York" ...
## $ producto : chr "Men's Street Footwear" "Men's Athletic Footwear" "Women's Street Footwear" "Women's Athletic Footwear" ...
## $ precio_unidad : num 50 50 40 45 60 50 50 50 40 45 ...
## $ unidades_vendidas : num 1200 1000 1000 850 900 1000 1250 900 950 825 ...
## $ ventas_total : num 60000 50000 40000 38250 54000 ...
## $ utilidad_operativa: num 30000 15000 14000 13388 16200 ...
## $ margen_operativo : num 0.5 0.3 0.35 0.35 0.3 0.25 0.5 0.3 0.35 0.35 ...
## $ metodo_venta : chr "In-store" "In-store" "In-store" "In-store" ...
dim(datos)
## [1] 9648 12
No se encuentran valores faltantes en las variables numéricas principales, por lo que se trabaja con la base de datos completa (9648 registros).
colSums(is.na(datos))
## id distribuidor region estado
## 0 0 0 0
## ciudad producto precio_unidad unidades_vendidas
## 0 0 0 0
## ventas_total utilidad_operativa margen_operativo metodo_venta
## 0 0 0 0
Ventas totales, unidades vendidas, utilidad operativa y margen operativo
## Se calculan los indicadores de centralidad y variabilidad para las variables clave del negocio
indicadores <- data.frame(
Variable = c("Ventas totales", "Unidades vendidas", "Utilidad operativa", "Margen operativo"),
Promedio = c(mean(datos$ventas_total, na.rm = TRUE),
mean(datos$unidades_vendidas, na.rm = TRUE),
mean(datos$utilidad_operativa, na.rm = TRUE),
mean(datos$margen_operativo, na.rm = TRUE)),
Mediana = c(median(datos$ventas_total, na.rm = TRUE),
median(datos$unidades_vendidas, na.rm = TRUE),
median(datos$utilidad_operativa, na.rm = TRUE),
median(datos$margen_operativo, na.rm = TRUE)),
Minimo = c(min(datos$ventas_total, na.rm = TRUE),
min(datos$unidades_vendidas, na.rm = TRUE),
min(datos$utilidad_operativa, na.rm = TRUE),
min(datos$margen_operativo, na.rm = TRUE)),
Maximo = c(max(datos$ventas_total, na.rm = TRUE),
max(datos$unidades_vendidas, na.rm = TRUE),
max(datos$utilidad_operativa, na.rm = TRUE),
max(datos$margen_operativo, na.rm = TRUE)),
Desv_estandar = c(sd(datos$ventas_total, na.rm = TRUE),
sd(datos$unidades_vendidas, na.rm = TRUE),
sd(datos$utilidad_operativa, na.rm = TRUE),
sd(datos$margen_operativo, na.rm = TRUE))
)
indicadores
| Variable | Promedio | Mediana | Minimo | Maximo | Desv_estandar |
|---|---|---|---|---|---|
| Ventas totales | 1.245508e+04 | 7803.50 | 0.0 | 82500.0 | 1.271639e+04 |
| Unidades vendidas | 2.569300e+02 | 176.00 | 0.0 | 1275.0 | 2.142520e+02 |
| Utilidad operativa | 4.894794e+03 | 3262.98 | 0.0 | 39000.0 | 4.866464e+03 |
| Margen operativo | 4.229913e-01 | 0.41 | 0.1 | 0.8 | 9.719740e-02 |
Interpretación
Ventas totales: el promedio de ventas por transacción/registro es considerablemente mayor que la mediana, lo que indica una distribución sesgada a la derecha: hay un número reducido de ventas muy altas que elevan el promedio.
Unidades vendidas: ocurre el mismo patrón, con una alta desviación estándar respecto a la mediana, lo que sugiere alta variabilidad entre transacciones pequeñas y grandes pedidos.
Margen operativo: el promedio y la mediana son muy cercanos (~0.41-0.42), lo que indica una distribución más simétrica y estable que las variables de venta.
ventas_producto <- datos %>%
group_by(producto) %>%
summarise(Ventas_totales = sum(ventas_total, na.rm = TRUE)) %>%
arrange(desc(Ventas_totales))
ventas_producto
| producto | Ventas_totales |
|---|---|
| Men’s Street Footwear | 27680769 |
| Women’s Apparel | 23870985 |
| Men’s Athletic Footwear | 20577180 |
| Women’s Street Footwear | 17201563 |
| Men’s Apparel | 16520632 |
| Women’s Athletic Footwear | 14315521 |
ggplotly(
ggplot(ventas_producto, aes(x = reorder(producto, Ventas_totales), y = Ventas_totales)) +
geom_bar(stat = "identity", fill = "steelblue", color = "black", alpha = 0.7) +
coord_flip() +
labs(title = "Figura 1. Ventas totales por línea de producto",
x = "Producto", y = "Ventas totales (USD)") +
theme_minimal()
)
Interpretación Figura 1.
Men’s Street Footwear es la línea con mayores ventas totales, seguida de Women’s Apparel.
Las categorías de calzado (“Footwear”) en conjunto concentran una parte importante de las ventas, especialmente en la línea masculina de calzado urbano.
Women’s Athletic Footwear es la línea con menor participación en ventas totales dentro del portafolio analizado.
ventas_region <- datos %>%
group_by(region) %>%
summarise(Ventas_totales = sum(ventas_total, na.rm = TRUE)) %>%
arrange(desc(Ventas_totales))
ventas_region
| region | Ventas_totales |
|---|---|
| West | 36436157 |
| Northeast | 25078267 |
| Southeast | 21374436 |
| South | 20603356 |
| Midwest | 16674434 |
ggplotly(
ggplot(ventas_region, aes(x = reorder(region, Ventas_totales), y = Ventas_totales)) +
geom_bar(stat = "identity", fill = "darkorange", color = "black", alpha = 0.7) +
coord_flip() +
labs(title = "Figura 2. Ventas totales por región",
x = "Región", y = "Ventas totales (USD)") +
theme_minimal()
)
Interpretación Figura 2.
La región West concentra el mayor volumen de ventas totales, muy por encima de las demás regiones.
La región Midwest presenta el menor nivel de ventas, lo que podría indicar menor penetración de mercado o menor densidad de puntos de venta.
ventas_distribuidor <- datos %>%
group_by(distribuidor) %>%
summarise(Ventas_totales = sum(ventas_total, na.rm = TRUE)) %>%
arrange(desc(Ventas_totales))
ventas_distribuidor
| distribuidor | Ventas_totales |
|---|---|
| West Gear | 32409558 |
| Foot Locker | 29024945 |
| Sports Direct | 24616622 |
| Kohl’s | 13512453 |
| Walmart | 10506085 |
| Amazon | 10096987 |
ggplotly(
ggplot(ventas_distribuidor, aes(x = reorder(distribuidor, Ventas_totales), y = Ventas_totales)) +
geom_bar(stat = "identity", fill = "seagreen", color = "black", alpha = 0.7) +
coord_flip() +
labs(title = "Figura 3. Ventas totales por distribuidor",
x = "Distribuidor", y = "Ventas totales (USD)") +
theme_minimal()
)
Interpretación Figura 3.
West Gear y Foot Locker son los distribuidores con mayor volumen de ventas totales.
Amazon y Walmart presentan el menor volumen de ventas dentro de los canales analizados, lo que podría sugerir oportunidades de crecimiento en canal digital/masivo.
ggplotly(
ggplot(datos, aes(x = utilidad_operativa)) +
geom_histogram(binwidth = 2000, fill = "purple", color = "black", alpha = 0.6) +
labs(title = "Figura 4. Histograma de la utilidad operativa",
x = "Utilidad operativa (USD)", y = "Frecuencia") +
theme_minimal()
)
Interpretación Figura 4.
La mayoría de los registros presenta utilidades operativas relativamente bajas, concentradas por debajo del promedio (4895 USD).
La distribución tiene una cola larga hacia la derecha: existen transacciones con utilidades muy altas (hasta USD 3.9^{4}), pero son poco frecuentes.
margen_producto <- datos %>%
group_by(producto) %>%
summarise(Margen_promedio = mean(margen_operativo, na.rm = TRUE)) %>%
arrange(desc(Margen_promedio))
margen_producto
| producto | Margen_promedio |
|---|---|
| Men’s Street Footwear | 0.4461304 |
| Women’s Apparel | 0.4413184 |
| Women’s Athletic Footwear | 0.4243587 |
| Men’s Apparel | 0.4132254 |
| Women’s Street Footwear | 0.4101990 |
| Men’s Athletic Footwear | 0.4027019 |
ggplotly(
ggplot(margen_producto, aes(x = reorder(producto, Margen_promedio), y = Margen_promedio)) +
geom_bar(stat = "identity", fill = "tomato", color = "black", alpha = 0.7) +
coord_flip() +
labs(title = "Figura 5. Margen operativo promedio por producto",
x = "Producto", y = "Margen operativo promedio") +
theme_minimal()
)
Interpretación Figura 5.
Men’s Street Footwear no solo lidera en ventas totales, sino que también tiene uno de los márgenes operativos promedio más altos, lo que lo convierte en la línea más estratégica del portafolio.
Men’s Athletic Footwear presenta el margen operativo promedio más bajo entre las seis líneas de producto.
margen_metodo <- datos %>%
group_by(metodo_venta) %>%
summarise(Margen_promedio = mean(margen_operativo, na.rm = TRUE),
Ventas_totales = sum(ventas_total, na.rm = TRUE)) %>%
arrange(desc(Margen_promedio))
margen_metodo
| metodo_venta | Margen_promedio | Ventas_totales |
|---|---|---|
| Online | 0.4641522 | 44965657 |
| Outlet | 0.3948758 | 39536618 |
| In-store | 0.3561207 | 35664375 |
ggplotly(
ggplot(datos, aes(x = metodo_venta, y = margen_operativo)) +
geom_boxplot(fill = "lightblue", color = "black", outlier.colour = "red", outlier.shape = 16, outlier.size = 2) +
labs(title = "Figura 6. Boxplot del margen operativo por método de venta",
x = "Método de venta", y = "Margen operativo") +
theme_minimal()
)
Interpretación Figura 6.
El canal Online presenta el margen operativo promedio más alto (0.464), seguido de Outlet e In-store.
Aunque el canal Online es el más rentable en términos de margen, conviene revisar el volumen de ventas de cada canal para evaluar su aporte total al negocio, no solo su rentabilidad relativa.
Se observan algunos valores atípicos (outliers) en el margen operativo dentro de cada canal, marcados en rojo, que podrían corresponder a promociones puntuales o descuentos agresivos.
ggplotly(
ggplot(datos, aes(x = region, y = ventas_total)) +
geom_boxplot(fill = "khaki", color = "black", outlier.colour = "red", outlier.shape = 16, outlier.size = 2) +
labs(title = "Figura 7. Boxplot de ventas totales por región",
x = "Región", y = "Ventas totales (USD)") +
theme_minimal()
)
Interpretación Figura 7.
Todas las regiones presentan una alta cantidad de valores atípicos por encima del bigote superior, lo que confirma que existen transacciones o combinaciones producto-tienda con ventas excepcionalmente altas en todas las zonas del país.
La región West no solo tiene la mediana más alta, sino también la mayor dispersión, coherente con ser la región de mayores ventas totales.
ggplotly(
ggplot(datos, aes(x = precio_unidad, y = unidades_vendidas)) +
geom_point(color = "purple", alpha = 0.5, size = 1.5) +
geom_smooth(method = "loess", color = "grey30", se = TRUE) +
labs(
title = paste("Figura 8. Relación entre precio por unidad y unidades vendidas\nCoef. de correlación: ",
round(cor(datos$precio_unidad, datos$unidades_vendidas, use = "complete.obs"), 2)),
x = "Precio por unidad (USD)",
y = "Unidades vendidas"
) +
theme_minimal() +
theme(plot.title = element_text(size = 12, face = "bold", hjust = 0.5))
)
Interpretación Figura 8.
El coeficiente de correlación entre el precio por unidad y las unidades vendidas es de aproximadamente 0.27, una relación positiva mucho más débil que fuerte.
Esto sugiere que, a diferencia de lo que se esperaría en un mercado sensible al precio, el precio no es el principal determinante del volumen de unidades vendidas; probablemente el producto, la región o el canal de venta influyen más en el volumen.
Es un hallazgo relevante: subir el precio no necesariamente reduce las unidades vendidas de forma proporcional, lo que podría dar espacio para estrategias de precio en ciertas líneas.
ggplotly(
ggplot(datos, aes(x = ventas_total, y = utilidad_operativa)) +
geom_point(color = "seagreen", alpha = 0.5, size = 1.5) +
geom_smooth(method = "lm", color = "black", se = TRUE) +
labs(
title = paste("Figura 9. Relación entre ventas totales y utilidad operativa\nCoef. de correlación: ",
round(cor(datos$ventas_total, datos$utilidad_operativa, use = "complete.obs"), 2)),
x = "Ventas totales (USD)",
y = "Utilidad operativa (USD)"
) +
theme_minimal() +
theme(plot.title = element_text(size = 12, face = "bold", hjust = 0.5))
)
Interpretación Figura 9.
La correlación entre ventas totales y utilidad operativa es muy alta (~0.94), lo que indica una relación fuerte y directa: a mayor venta, mayor utilidad operativa en términos absolutos.
Esto es esperable dado que la utilidad operativa se deriva directamente de las ventas, pero confirma que el crecimiento en ventas es el principal impulsor de la utilidad, más que el margen en sí mismo.
Una correlación alta NO significa causalidad directa automática, pero en este caso es coherente con la definición contable de las variables (la utilidad depende matemáticamente de las ventas y el margen).
tabla_cruzada <- datos %>%
group_by(producto, region) %>%
summarise(Ventas_totales = sum(ventas_total, na.rm = TRUE), .groups = "drop") %>%
arrange(desc(Ventas_totales))
head(tabla_cruzada, 10)
| producto | region | Ventas_totales |
|---|---|---|
| Men’s Street Footwear | West | 7389988 |
| Women’s Apparel | West | 7038046 |
| Men’s Street Footwear | Northeast | 6841324 |
| Men’s Athletic Footwear | West | 6761339 |
| Women’s Street Footwear | West | 5748586 |
| Women’s Apparel | Northeast | 5045208 |
| Men’s Apparel | West | 4827378 |
| Men’s Street Footwear | Midwest | 4707360 |
| Men’s Street Footwear | Southeast | 4693836 |
| Women’s Athletic Footwear | West | 4670820 |
ggplotly(
ggplot(tabla_cruzada, aes(x = region, y = Ventas_totales, fill = producto)) +
geom_bar(stat = "identity", position = "dodge") +
labs(title = "Figura 10. Ventas totales por producto y región",
x = "Región", y = "Ventas totales (USD)", fill = "Producto") +
theme_minimal() +
theme(axis.text.x = element_text(angle = 30, hjust = 1))
)
Interpretación Figura 10.
La combinación Men’s Street Footwear + West es la que genera mayores ventas totales, seguida de Women’s Apparel + West y Men’s Street Footwear + Northeast.
La región West aparece de forma recurrente entre las combinaciones más fuertes para casi todas las líneas de producto, confirmando su relevancia estratégica para Adidas.
tabla_margen_cruzada <- datos %>%
group_by(producto, metodo_venta) %>%
summarise(Margen_promedio = mean(margen_operativo, na.rm = TRUE), .groups = "drop") %>%
arrange(desc(Margen_promedio))
head(tabla_margen_cruzada, 10)
| producto | metodo_venta | Margen_promedio |
|---|---|---|
| Women’s Apparel | Online | 0.4879509 |
| Men’s Street Footwear | Online | 0.4851716 |
| Women’s Athletic Footwear | Online | 0.4644349 |
| Men’s Apparel | Online | 0.4517220 |
| Women’s Street Footwear | Online | 0.4513865 |
| Men’s Athletic Footwear | Online | 0.4442157 |
| Men’s Street Footwear | Outlet | 0.4188889 |
| Women’s Athletic Footwear | Outlet | 0.4065139 |
| Women’s Apparel | Outlet | 0.4030020 |
| Women’s Street Footwear | Outlet | 0.3882107 |
Interpretación
Las combinaciones con mayor margen operativo promedio corresponden, en su mayoría, al canal Online combinado con las líneas Women’s Apparel y Men’s Street Footwear, reforzando que el canal digital es el más rentable independientemente del producto.
participacion <- datos %>%
group_by(producto) %>%
summarise(Ventas_totales = sum(ventas_total, na.rm = TRUE)) %>%
mutate(Participacion_pct = round(Ventas_totales / sum(Ventas_totales) * 100, 1)) %>%
arrange(desc(Participacion_pct))
participacion
| producto | Ventas_totales | Participacion_pct |
|---|---|---|
| Men’s Street Footwear | 27680769 | 23.0 |
| Women’s Apparel | 23870985 | 19.9 |
| Men’s Athletic Footwear | 20577180 | 17.1 |
| Women’s Street Footwear | 17201563 | 14.3 |
| Men’s Apparel | 16520632 | 13.7 |
| Women’s Athletic Footwear | 14315521 | 11.9 |
ggplot(participacion, aes(x = "", y = Participacion_pct, fill = producto)) +
geom_bar(stat = "identity", width = 1, color = "white") +
coord_polar("y", start = 0) +
labs(title = "Figura 11. Participación de cada producto en las ventas totales", fill = "Producto") +
theme_void()
Interpretación Figura 11.
Men’s Street Footwear representa cerca del 23% de las ventas totales, siendo la línea con mayor participación dentro del portafolio.
Las tres primeras líneas de producto (Men’s Street Footwear, Women’s Apparel y Men’s Athletic Footwear) concentran más de la mitad de las ventas totales de la compañía.
Conclusiones
Recomendaciones para ADIDAS