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)"),
hovermode = "x"
)
grafico_producto
Interpretación Figura 1:
Distribución: La categoría con mayor facturación es Men’s Street Footwear ($27.68M USD), seguida por Women’s Apparel ($23.87M USD).
Patrón relevante: El calzado urbano/casual muestra una clara ventaja en ventas comparado con el calzado deportivo estándar.
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:
ggplotly(
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")
)
Interpretación Figura 2:
Mediana y dispersión: Las ventas en tiendas físicas (In-store) presentan un valor por transacción individual más elevado, pero el canal Online genera la mayor suma total de ventas acumuladas ($44.96M USD).
Atípicos: Existen valores atípicos significativos en el canal tradicional y outlet que responden a pedidos mayoristas de gran volumen.
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")
)
grafico_region
Interpretación Fgura 3:
Región Líder: La región West encabeza la utilidad con $13.02M USD, seguida por Northeast ($9.73M USD).
Oportunidad: La región Midwest registra el menor nivel operativo ($6.86M USD), señalando la necesidad de ajustar las promociones en esa zona.
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)
# Crear el gráfico
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)
Interpretación Figura 4:
Tendencia: Existe una relación positiva fuertemente directa entre las ventas totales y la utilidad operativa.
Coeficiente de correlación: El valor de 0.94 confirma que el incremento en las ventas brutas se traduce de manera sumamente eficiente en mayores utilidades para la empresa.
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.