Adidas es una de las empresas líderes del sector deportivo a nivel mundial, destacándose por la comercialización de calzado, ropa y accesorios. En un mercado altamente competitivo, resulta fundamental analizar el comportamiento de las ventas y la rentabilidad para identificar oportunidades de crecimiento y fortalecer la toma de decisiones estratégicas.
En este informe se evalúa el desempeño comercial de la compañía a partir de variables clave como producto, región, método de venta, ventas totales y utilidad operativa. El objetivo es identificar cuáles son los productos, mercados y canales que generan mayor valor para la organización, proporcionando información que sirva de apoyo para la formulación de estrategias orientadas a maximizar las ventas y la rentabilidad de Adidas.
El análisis exploratorio de datos (EDA) nos permite conocer y entender mejor la información de Adidas, revisando los productos, las regiones y los canales de venta para encontrar patrones, tendencias y datos que puedan ser importantes para la marca.
PASO 1. Instalar y cargar librerias
# Cargar librerías necesarias
library(readxl)
library(dplyr)
library(ggplot2)
library(plotly)
library(knitr)
library(kableExtra)
library(tidyr)
PASO 2: Actualizar ruta o codigo del excel Tabla resumen: Ventas y Utilidad por Producto
Se filtra la base de datos teniendo en cuenta sólo apartamentos y el barrio Santa teresita:
El código siguiente carga un archivo de Excel con datos de viviendas, les asigna un ID único a cada fila, y luego filtra los apartamentos que están en el barrio “Santa Teresita”, permitiendo pequeñas diferencias en la escritura del nombre.
library(readxl)
datos<- read_excel("C:/Users/jerly.cortes/Downloads/2026-2/lunes/CORTE 1/CASO 1/DatosCaso1.xlsx")
# Generar una secuencia de números desde 1 hasta el número total de filas
id = 1:dim(datos)[1]
datos = data.frame(id, datos)
# Asignar a datos_sub para conservar el esquema de análisis
datos_sub = datos
head(datos_sub)
| 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
library(dplyr)
names(datos_sub)
## [1] "id" "distribuidor" "region"
## [4] "estado" "ciudad" "producto"
## [7] "precio_unidad" "unidades_vendidas" "ventas_total"
## [10] "utilidad_operativa" "margen_operativo" "metodo_venta"
length(datos_sub$id)
## [1] 9648
Indicadores de centralidad
# Indicadores para la variable Ventas Totales
promedio_ventas = mean(datos_sub$ventas_total, na.rm = TRUE)
mediana_ventas = median(datos_sub$ventas_total, na.rm = TRUE)
minimo_ventas = min(datos_sub$ventas_total, na.rm = TRUE)
maximo_ventas = max(datos_sub$ventas_total, na.rm = TRUE)
desvest_ventas = sd(datos_sub$ventas_total, na.rm = TRUE)
indic_ventas = data.frame(promedio_ventas, mediana_ventas, minimo_ventas, maximo_ventas, desvest_ventas)
indic_ventas
| promedio_ventas | mediana_ventas | minimo_ventas | maximo_ventas | desvest_ventas |
|---|---|---|---|---|
| 12455.08 | 7803.5 | 0 | 82500 | 12716.39 |
# Indicadores para la variable Utilidad Operativa
promedio_utilidad = mean(datos_sub$utilidad_operativa, na.rm = TRUE)
mediana_utilidad = median(datos_sub$utilidad_operativa, na.rm = TRUE)
minimo_utilidad = min(datos_sub$utilidad_operativa, na.rm = TRUE)
maximo_utilidad = max(datos_sub$utilidad_operativa, na.rm = TRUE)
desvest_utilidad = sd(datos_sub$utilidad_operativa, na.rm = TRUE)
indic_utilidad = data.frame(promedio_utilidad, mediana_utilidad, minimo_utilidad, maximo_utilidad, desvest_utilidad)
indic_utilidad
| promedio_utilidad | mediana_utilidad | minimo_utilidad | maximo_utilidad | desvest_utilidad |
|---|---|---|---|---|
| 4894.794 | 3262.98 | 0 | 39000 | 4866.464 |
Producto
Ahora creamos del gráfico de barras interactivo para analizar las ventas acumuladas por categoría de producto:
colnames(datos_sub) # Muestra los nombres de las columnas
## [1] "id" "distribuidor" "region"
## [4] "estado" "ciudad" "producto"
## [7] "precio_unidad" "unidades_vendidas" "ventas_total"
## [10] "utilidad_operativa" "margen_operativo" "metodo_venta"
str(datos_sub) # Muestra la estructura del dataframe
## '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" ...
grafico_producto <- datos_sub %>%
group_by(producto) %>%
summarise(Ventas = sum(ventas_total)/1e6) %>%
plot_ly(x = ~reorder(producto, -Ventas), y = ~Ventas, type = 'bar',
marker = list(color = 'skyblue', line = list(color = 'black', width = 1))) %>%
layout(
title = list(text = "<b>Figura 1. Ventas Totales por Línea de Producto (Millones USD)</b>", font = list(size = 14)),
xaxis = list(title = "Línea de Producto"),
yaxis = list(title = "Ventas Totales (Millones USD)"),
margin = list(b = 150),
annotations = list(
list(
x = 0, y = -0.35,
text = "<b>Fuente:</b> Base de datos de Ventas Adidas (Caso 1)",
showarrow = FALSE,
xref = 'paper', yref = 'paper',
xanchor = 'left', yanchor = 'top',
font = list(size = 10, color = "gray")
)
),
hovermode = "x"
)
grafico_producto
Interpretación Figura 1:
La Figura 1. muestra las ventas totales por producto en millones de dolares.
Punto de partida: La categoría Men’s Street Footwear lidera la facturación total de la compañía con $27.68M USD, seguida por Women’s Apparel con $23.87M USD.
Segmento inferior: La categoría con menor volumen de ventas brutas es Women’s Athletic Footwear con $14.32M USD.
Distribución: El calzado casual/urbano supera significativamente en ventas al calzado especializado deportivo en ambos géneros.
Existe una brecha comercial de $13.36M USD entre la línea más vendida y la menos vendida.
El calzado urbano masculino (Men’s Street Footwear) representa el motor principal de ingresos de Adidas, lo que indica que la marca ha logrado una adopción masiva en la moda de calle (lifestyle / streetwear) por encima del uso puramente atlético.
Método de Venta
Ahora realizamos una representación visual por medio de un boxplot interactivo para evaluar la dispersión de las ventas por cada canal:
g_boxplot <- ggplot(datos_sub, aes(x = metodo_venta, y = ventas_total, fill = metodo_venta)) +
geom_boxplot(color = "black", outlier.colour = "red", outlier.shape = 16, outlier.size = 2) +
scale_fill_manual(values = c("lightblue", "lightgreen", "coral")) +
labs(
title = "Figura 2. Boxplot de Ventas por Método de Venta",
x = "Método de Venta",
y = "Ventas Totales (USD)"
) +
theme_minimal() +
theme(legend.position = "none")
ggplotly(g_boxplot) %>%
layout(
margin = list(b = 150),
annotations = list(
list(
x = 0, y = -0.25,
text = "<b>Fuente:</b> Base de datos de Ventas Adidas (Caso 1)",
showarrow = FALSE,
xref = 'paper', yref = 'paper',
xanchor = 'left', yanchor = 'top',
font = list(size = 10, color = "gray")
)
)
)
Interpretación Figura 2:
En la figuera 2. muestra la Distribución de Ventas por Método de Venta.
Medianas por transacción: Las tiendas físicas (In-store) presentan el valor mediano por venta más alto ($16,875 USD), seguidas por los Outlets ($7,785 USD) y el canal Online ($6,000 USD).
Atípicos y rangos: El canal In-store llega a registrar transacciones máximas de $82,500 USD, mostrando un rango intercuartílico mucho más amplio que los demás canales.
Acumulado total: A pesar de tener transacciones individuales más pequeñas, el canal Online es el que más dinero genera en total ($44.97M USD con 4,889 registros).
Las tiendas físicas funcionan bajo un modelo de compras de mayor volumen por transacción (compras mayoristas o de inventario grande).
El canal digital (Online) opera bajo un modelo de transacciones pequeñas pero de alta frecuencia y masividad, además de ofrecer el margen operativo promedio más alto de la empresa (46.42% vs 35.61% de In-store).
Región
Visualización de la utilidad operativa generada según la región geográfica:
grafico_region <- datos_sub %>%
group_by(region) %>%
summarise(Utilidad = sum(utilidad_operativa)/1e6) %>%
plot_ly(x = ~Utilidad, y = ~reorder(region, Utilidad), type = 'bar', orientation = 'h',
marker = list(color = 'lightgreen', line = list(color = 'black', width = 1))) %>%
layout(
title = list(text = "<b>Figura 3. Utilidad Operativa por Región (Millones USD)</b>", font = list(size = 14)),
xaxis = list(title = "Utilidad Operativa (Millones USD)"),
yaxis = list(title = "Región"),
margin = list(b = 150),
annotations = list(
list(
x = 0, y = -0.25,
text = "<b>Fuente:</b> Base de datos de Ventas Adidas (Caso 1)",
showarrow = FALSE,
xref = 'paper', yref = 'paper',
xanchor = 'left', yanchor = 'top',
font = list(size = 10, color = "gray")
)
)
)
grafico_region
Interpretación Fgura 3:
La figura 3. Muestra la utilidad operativa por Región
Región líder: La región West encabeza la generación de utilidad operativa con $13.02M USD (provenientes de $36.44M USD en ventas).
Región con menor desempeño: La región Midwest aporta la menor utilidad operativa acumulada con solo $6.86M USD.
Zona intermedia: Las regiones Northeast ($9.73M USD), South ($9.22M USD) y Southeast ($8.39M USD) mantienen niveles de utilidad cercanos entre sí.
Existe una concentración geográfica del negocio: la región West genera casi el doble de utilidades que la región Midwest.
Cabe resaltar que aunque Midwest vende menos volumen, su margen operativo promedio es del 43.53%, lo cual indica que la plaza es rentable unitariamente pero le falta volumen de ventas.
Relación Ventas vs. Utilidad Operativa
Exploración bivariada entre las ventas totales y la utilidad operativa obtenida.
# Calcular el coeficiente de correlación
correlacion <- round(cor(datos_sub$ventas_total, datos_sub$utilidad_operativa, use = "complete.obs"), 2)
grafico_dispersion <- ggplot(datos_sub, aes(x = ventas_total, y = utilidad_operativa)) +
geom_point(color = "purple", alpha = 0.5, size = 1.8) +
geom_smooth(method = "lm", color = "black", se = TRUE) +
labs(
title = paste("Figura 4. Relación Ventas Totales vs. Utilidad Operativa - Correlación:", correlacion),
x = "Ventas Totales (USD)",
y = "Utilidad Operativa (USD)"
) +
theme_minimal()
ggplotly(grafico_dispersion) %>%
layout(
margin = list(b = 150),
annotations = list(
list(
x = 0, y = -0.25,
text = "<b>Fuente:</b> Base de datos de Ventas Adidas (Caso 1)",
showarrow = FALSE,
xref = 'paper', yref = 'paper',
xanchor = 'left', yanchor = 'top',
font = list(size = 10, color = "gray")
)
)
)
Interpretación Figura 4:
En la figura 4. se muestra la relación Ventas vs. Utilidad Operativa.
Dirección de los puntos: Todos los puntos morados muestran una trayectoria ascendente continua de izquierda a derecha.
Línea de tendencia: La recta de regresión negra asciende de forma pronunciada y constante. Métrica clave: El coeficiente de correlación de Pearson es de 0.94.
Un coeficiente de \(r = 0.94\) indica una correlación positiva muy fuerte y casi perfecta.
Esto demuestra que la estructura de costos operativos de Adidas es estable y proporcional: por cada incremento en el volumen de ventas brutas, la utilidad operativa crece en una proporción predecible sin que los costos fijos destruyan el beneficio neto.
Liderazgo Urbano: El segmento Street Footwear es el pilar comercial de la marca. Eficiencia Digital: El canal Online aporta la mayor rentabilidad acumulada total gracias a sus reducidos costos operativos fijos. Potencial Geográfico: La región West concentra la mayor contribución a las utilidades globales.
Fortalecer la presencia Digital (E-commerce): Incrementar la inversión publicitaria digital, pues el canal Online es el más rentable. Expansion de la línea Streetwear: Expandir el portafolio de calzado urbano femenino aprovechando el éxito de la línea masculina. Estrategia en la Región Midwest: Reorganizar la fuerza de ventas en la región Midwest para equiparar su rendimiento con la región West.