Introducción

Adidas es una de las marcas más reconocidas a nivel mundial en la industria deportiva, con presencia en más de 160 países y una oferta de producto que abarca calzado, ropa y accesorios tanto para hombre como para mujer. Su desempeño comercial depende de múltiples factores: la región donde se vende, el canal (tienda física, outlet o en línea), el distribuidor a través del cual llega al consumidor y la línea de producto específica.

En este informe se realiza un análisis exploratorio y descriptivo de una base de datos de ventas de Adidas, con el fin de comprender el comportamiento de las ventas y la rentabilidad de la compañía. Aplicaremos técnicas de estadística descriptiva y visualización de datos en R para detectar patrones, valores atípicos y relaciones entre variables, buscando aportar hallazgos que sirvan de base para recomendaciones de negocio.

Análisis exploratorio

El análisis exploratorio de datos (EDA) es un paso clave para comprender la información comercial de Adidas, identificar patrones y evaluar la distribución de las variables.

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)
library(tidyverse)
library(scales)

PASO 2: Cargar la base de datos

# Cargar datos desde el archivo Excel
df <- read_excel("DatosCaso1.xlsx", sheet = "Data Sales Adidas")

# Ver la estructura y las primeras filas de los datos
colnames(df)
##  [1] "distribuidor"       "region"             "estado"            
##  [4] "ciudad"             "producto"           "precio_unidad"     
##  [7] "unidades_vendidas"  "ventas_total"       "utilidad_operativa"
## [10] "margen_operativo"   "metodo_venta"
str(df)
## tibble [9,648 × 11] (S3: tbl_df/tbl/data.frame)
##  $ distribuidor      : chr [1:9648] "Foot Locker" "Foot Locker" "Foot Locker" "Foot Locker" ...
##  $ region            : chr [1:9648] "Northeast" "Northeast" "Northeast" "Northeast" ...
##  $ estado            : chr [1:9648] "New York" "New York" "New York" "New York" ...
##  $ ciudad            : chr [1:9648] "New York" "New York" "New York" "New York" ...
##  $ producto          : chr [1:9648] "Men's Street Footwear" "Men's Athletic Footwear" "Women's Street Footwear" "Women's Athletic Footwear" ...
##  $ precio_unidad     : num [1:9648] 50 50 40 45 60 50 50 50 40 45 ...
##  $ unidades_vendidas : num [1:9648] 1200 1000 1000 850 900 1000 1250 900 950 825 ...
##  $ ventas_total      : num [1:9648] 60000 50000 40000 38250 54000 ...
##  $ utilidad_operativa: num [1:9648] 30000 15000 14000 13388 16200 ...
##  $ margen_operativo  : num [1:9648] 0.5 0.3 0.35 0.35 0.3 0.25 0.5 0.3 0.35 0.35 ...
##  $ metodo_venta      : chr [1:9648] "In-store" "In-store" "In-store" "In-store" ...
head(df)
distribuidor region estado ciudad producto precio_unidad unidades_vendidas ventas_total utilidad_operativa margen_operativo metodo_venta
Foot Locker Northeast New York New York Men’s Street Footwear 50 1200 60000 30000.0 0.50 In-store
Foot Locker Northeast New York New York Men’s Athletic Footwear 50 1000 50000 15000.0 0.30 In-store
Foot Locker Northeast New York New York Women’s Street Footwear 40 1000 40000 14000.0 0.35 In-store
Foot Locker Northeast New York New York Women’s Athletic Footwear 45 850 38250 13387.5 0.35 In-store
Foot Locker Northeast New York New York Men’s Apparel 60 900 54000 16200.0 0.30 In-store
Foot Locker Northeast New York New York Women’s Apparel 50 1000 50000 12500.0 0.25 In-store

La base cuenta con 9648 transacciones y no tiene valores nulos en ninguna columna, así que se trabaja con la información completa.

Paleta de colores

# Paleta pastel usada en todos los gráficos del informe
rosado_pastel <- "#FFB3C6"
morado_pastel <- "#C3AED6"
azul_pastel   <- "#A7C7E7"
verde_pastel  <- "#B5EAD7"

paleta_pastel <- c(rosado_pastel, morado_pastel, azul_pastel, verde_pastel)

Indicadores de centralidad y dispersión

# Resumen estadístico de las variables clave
resumen <- df %>%
  select(precio_unidad, unidades_vendidas, ventas_total, utilidad_operativa, margen_operativo) %>%
  summary()

resumen
##  precio_unidad    unidades_vendidas  ventas_total   utilidad_operativa
##  Min.   :  7.00   Min.   :   0.0    Min.   :    0   Min.   :    0     
##  1st Qu.: 35.00   1st Qu.: 106.0    1st Qu.: 4065   1st Qu.: 1753     
##  Median : 45.00   Median : 176.0    Median : 7804   Median : 3263     
##  Mean   : 45.22   Mean   : 256.9    Mean   :12455   Mean   : 4895     
##  3rd Qu.: 55.00   3rd Qu.: 350.0    3rd Qu.:15864   3rd Qu.: 6192     
##  Max.   :110.00   Max.   :1275.0    Max.   :82500   Max.   :39000     
##  margen_operativo
##  Min.   :0.100   
##  1st Qu.:0.350   
##  Median :0.410   
##  Mean   :0.423   
##  3rd Qu.:0.490   
##  Max.   :0.800
# Coeficiente de variación de cada variable (sd/media) para comparar qué tan dispersa es cada una
cv_tabla <- df %>%
  summarise(across(c(precio_unidad, unidades_vendidas, ventas_total, utilidad_operativa, margen_operativo),
                    list(media = mean, sd = sd))) %>%
  pivot_longer(everything(), names_to = "var_stat", values_to = "valor") %>%
  separate(var_stat, into = c("variable", "estadistico"), sep = "_(?=[^_]+$)") %>%
  pivot_wider(names_from = estadistico, values_from = valor) %>%
  mutate(cv_pct = round(sd / media * 100, 1))

cv_tabla
variable media sd cv_pct
precio_unidad 4.521663e+01 1.470540e+01 32.5
unidades_vendidas 2.569300e+02 2.142520e+02 83.4
ventas_total 1.245508e+04 1.271639e+04 102.1
utilidad_operativa 4.894794e+03 4.866464e+03 99.4
margen_operativo 4.229913e-01 9.719740e-02 23.0
  • El precio por unidad tiene un CV de apenas 32.5%, mientras que ventas totales y unidades vendidas superan 80-100% de CV: hay muchísima más variabilidad en cuánto se vende que en a qué precio se vende. El margen operativo es la variable más estable (CV 23%), lo que sugiere una política de márgenes relativamente consistente en toda la operación.

Desempeño de ventas

Gráfico de barras - Ventas por región

por_region <- df %>%
  group_by(region) %>%
  summarise(ventas = sum(ventas_total), .groups = "drop") %>%
  mutate(pct = round(ventas / sum(ventas) * 100, 1)) %>%
  arrange(desc(ventas))

grafico_region <- por_region %>%
  plot_ly(x = ~reorder(region, ventas), y = ~ventas, type = 'bar',
          marker = list(color = rep(paleta_pastel, length.out = nrow(por_region))),
          text = ~paste0(pct, "%"), textposition = 'outside') %>%
  layout(title = "Figura 1. Ventas totales por región",
         xaxis = list(title = "Región"),
         yaxis = list(title = "Ventas totales (USD)"),
         hovermode = "x")

grafico_region

Interpretación Figura 1.

  • West es la región líder con 30.3% de las ventas totales, casi el doble que Midwest, la región más débil con 13.9%.

  • Entre las cinco regiones no hay una diferencia extrema: Northeast, Southeast y South se mueven en un rango similar (17%-21%), lo que sugiere que la brecha real está entre West (fuerte) y Midwest (débil), más que una polarización generalizada.

  • Esta diferencia amerita revisar qué está funcionando en West (mix de canal, distribuidores, competencia local) para evaluar si es replicable en Midwest.

Gráfico de barras - Ventas por producto

por_producto <- df %>%
  group_by(producto) %>%
  summarise(ventas = sum(ventas_total), margen_prom = mean(margen_operativo), .groups = "drop") %>%
  mutate(pct_ventas = round(ventas / sum(ventas) * 100, 1)) %>%
  arrange(desc(ventas))

grafico_producto <- por_producto %>%
  plot_ly(x = ~reorder(producto, ventas), y = ~ventas, type = 'bar',
          marker = list(color = rep(paleta_pastel, length.out = nrow(por_producto))),
          text = ~paste0(pct_ventas, "%"), textposition = 'outside') %>%
  layout(title = "Figura 2. Ventas totales por línea de producto",
         xaxis = list(title = "Producto"),
         yaxis = list(title = "Ventas totales (USD)"),
         hovermode = "x")

grafico_producto
por_producto %>%
  mutate(margen_prom = percent(margen_prom, accuracy = 0.1)) %>%
  kable(caption = "Ventas y margen promedio por producto",
        col.names = c("Producto", "Ventas totales", "Margen promedio", "% de participación")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Ventas y margen promedio por producto
Producto Ventas totales Margen promedio % de participación
Men’s Street Footwear 27680769 44.6% 23.0
Women’s Apparel 23870985 44.1% 19.9
Men’s Athletic Footwear 20577180 40.3% 17.1
Women’s Street Footwear 17201563 41.0% 14.3
Men’s Apparel 16520632 41.3% 13.7
Women’s Athletic Footwear 14315521 42.4% 11.9

Interpretación Figura 2.

  • Men’s Street Footwear es la línea más fuerte, con 23% de las ventas totales.

  • Women’s Athletic Footwear es la de menor participación (11.9%), pero su margen promedio (42.4%) es de los más altos del portafolio: no es un producto de bajo desempeño, es un producto de bajo volumen con buena rentabilidad, es decir, tiene espacio para crecer.

Boxplot - Variabilidad y atípicos en ventas

ggplotly(
  ggplot(df, aes(x = reorder(producto, ventas_total, FUN = median), y = ventas_total, fill = producto)) +
    geom_boxplot(show.legend = FALSE, outlier.colour = morado_pastel, outlier.alpha = 0.6) +
    coord_flip() +
    scale_fill_manual(values = rep(paleta_pastel, length.out = 6)) +
    labs(title = "Figura 3. Boxplot de ventas totales por producto",
         x = "Producto", y = "Ventas totales (USD)") +
    theme_minimal()
)
q1 <- quantile(df$ventas_total, 0.25)
q3 <- quantile(df$ventas_total, 0.75)
lim_sup <- q3 + 1.5 * (q3 - q1)
n_out <- sum(df$ventas_total > lim_sup)

Interpretación Figura 3.

  • El rango intercuartílico es amplio en todos los productos, lo que confirma la alta variabilidad ya vista en el coeficiente de variación.

  • Usando la regla de 1.5×IQR, hay 799 transacciones (8.3% del total) por encima del límite superior (~US$33.6K), marcadas en rojo en el boxplot.

  • Estos valores atípicos probablemente no son errores, sino pedidos grandes de distribuidores o ventas de temporada alta. Antes de tratarlos como “ruido”, valdría la pena analizarlos como un segmento aparte (mayoristas vs. minoristas).

Rentabilidad

Boxplot - Margen operativo por método de venta

por_metodo <- df %>%
  group_by(metodo_venta) %>%
  summarise(ventas = sum(ventas_total), margen_prom = mean(margen_operativo), n = n(), .groups = "drop") %>%
  mutate(pct_ventas = round(ventas / sum(ventas) * 100, 1)) %>%
  arrange(desc(ventas))

ggplotly(
  ggplot(df, aes(x = metodo_venta, y = margen_operativo, fill = metodo_venta)) +
    geom_boxplot(show.legend = FALSE) +
    scale_fill_manual(values = c(rosado_pastel, azul_pastel, verde_pastel)) +
    labs(title = "Figura 4. Margen operativo por método de venta",
         x = "Método de venta", y = "Margen operativo") +
    theme_minimal()
)

Gráfico de torta - Participación de ventas por método

plot_ly(por_metodo, labels = ~metodo_venta, values = ~ventas, type = 'pie',
        textinfo = 'label+percent',
        marker = list(colors = c(morado_pastel, rosado_pastel, verde_pastel))) %>%
  layout(title = "Figura 5. Participación de ventas por método de venta")

Interpretación Figuras 4 y 5.

  • El canal Online no solo vende más (37.4% de las ventas totales), sino que también tiene el margen más alto (46.4% en promedio).

  • In-store es justo lo contrario: el canal con menor margen (35.6%), a pesar de tener un volumen relevante (29.7% de las ventas). Esto sugiere que el costo de operar tienda física (personal, arriendo, descuentos en punto de venta) le está restando rentabilidad a Adidas frente al canal digital.

Tabla - Ventas y margen por distribuidor

por_distribuidor <- df %>%
  group_by(distribuidor) %>%
  summarise(ventas = sum(ventas_total), utilidad = sum(utilidad_operativa), margen_prom = mean(margen_operativo), .groups = "drop") %>%
  arrange(desc(ventas))

por_distribuidor %>%
  mutate(across(c(ventas, utilidad), ~label_dollar(scale = 1e-6, suffix = "M")(.x)),
         margen_prom = percent(margen_prom, accuracy = 0.1)) %>%
  kable(caption = "Ventas, utilidad y margen promedio por distribuidor",
        col.names = c("Distribuidor", "Ventas totales", "Utilidad operativa", "Margen promedio")) %>%
  kable_styling(bootstrap_options = c("striped", "hover"), full_width = FALSE)
Ventas, utilidad y margen promedio por distribuidor
Distribuidor Ventas totales Utilidad operativa Margen promedio
West Gear $32.41M $12.20M 41.8%
Foot Locker $29.02M $11.32M 41.8%
Sports Direct $24.62M $10.64M 44.5%
Kohl’s $13.51M $5.18M 41.9%
Walmart $10.51M $3.90M 40.7%
Amazon $10.10M $3.98M 41.8%
  • West Gear y Foot Locker concentran el mayor volumen, pero Sports Direct, con menos ventas, tiene el margen promedio más alto de todos los distribuidores. Vale la pena revisar qué hace distinto Sports Direct (menos descuentos, mejor mezcla de producto) para ver si es replicable en los distribuidores grandes.

Relación entre variables clave

Gráfico de dispersión - Precio vs. unidades vendidas

coef_precio_unid <- round(cor(df$precio_unidad, df$unidades_vendidas, use = "complete.obs"), 2)

ggplotly(
  ggplot(df, aes(x = precio_unidad, y = unidades_vendidas)) +
    geom_point(color = azul_pastel, alpha = 0.4) +
    geom_smooth(method = "lm", color = morado_pastel, se = TRUE) +
    labs(
      title = paste0("Figura 6. Relación entre precio y unidades vendidas\nCoef. de correlación: ", coef_precio_unid),
      x = "Precio por unidad (USD)", y = "Unidades vendidas"
    ) +
    theme_minimal()
)

Interpretación Figura 6.

  • La correlación entre precio y unidades vendidas es débil y, sorprendentemente, positiva (r = 0.27), no negativa como se esperaría si el cliente fuera muy sensible al precio.

  • Dentro de los rangos de precio que maneja Adidas en esta base, el precio no está frenando el volumen de ventas. Esto abre espacio para pensar en estrategias de precio premium sin sacrificar demasiado volumen.

Gráfico de dispersión - Ventas vs. utilidad operativa

coef_ventas_utilidad <- round(cor(df$ventas_total, df$utilidad_operativa, use = "complete.obs"), 2)

ggplotly(
  ggplot(df, aes(x = ventas_total, y = utilidad_operativa)) +
    geom_point(color = verde_pastel, alpha = 0.4) +
    geom_smooth(method = "lm", color = morado_pastel, se = TRUE) +
    labs(
      title = paste0("Figura 7. Relación entre ventas totales y utilidad operativa\nCoef. de correlación: ", coef_ventas_utilidad),
      x = "Ventas totales (USD)", y = "Utilidad operativa (USD)"
    ) +
    theme_minimal()
)

Interpretación Figura 7.

  • La correlación es muy fuerte (r = 0.94), lo cual tiene sentido: a mayor venta, mayor utilidad en términos absolutos.

  • Un patrón adicional que vale la pena mencionar: el margen operativo cae levemente cuando aumentan las unidades vendidas (r = -0.31), un efecto típico de descuentos por volumen — se vende más, pero a un margen algo menor por unidad.

Tasas de crecimiento

La base de datos no incluye una variable de fecha o periodo, por lo que no es posible calcular tasas de crecimiento en el sentido estricto (variación de un periodo frente a otro), a diferencia de otros ejercicios donde sí contábamos con una columna de fecha. En su lugar, el análisis se enfocó en comparar la participación relativa entre región, producto, canal y distribuidor, que es la forma en que sí se puede leer desempeño con los datos disponibles.

Combinaciones más estratégicas

Mapa de calor - Margen por producto y método de venta

combo <- df %>%
  group_by(producto, metodo_venta) %>%
  summarise(margen_prom = mean(margen_operativo), ventas = sum(ventas_total), .groups = "drop")

ggplotly(
  ggplot(combo, aes(x = metodo_venta, y = producto, fill = margen_prom)) +
    geom_tile(color = "white") +
    geom_text(aes(label = percent(margen_prom, accuracy = 0.1)), size = 3, color = "gray20") +
    scale_fill_gradient(low = rosado_pastel, high = morado_pastel) +
    labs(title = "Figura 8. Margen promedio por producto y método de venta",
         x = "Método de venta", y = "Producto", fill = "Margen") +
    theme_minimal()
)

Interpretación Figura 8.

  • El canal Online es sistemáticamente el de mejor margen para todos los productos, con Women’s Apparel y Men’s Street Footwear a la cabeza dentro de ese canal.

  • La combinación producto + canal más estratégica para Adidas hoy es: línea fuerte en ventas + canal digital. Esto respalda la idea de priorizar inversión en el canal online por encima de expandir puntos de venta físicos.

Hallazgos relevantes

  • West es la región más fuerte (30.3% de las ventas) y Midwest la más débil (13.9%).

  • Men’s Street Footwear lidera en ventas, pero Women’s Athletic Footwear tiene un margen competitivo con bajo volumen: es la línea con más potencial de crecimiento sin sacrificar rentabilidad.

  • El canal Online gana en ventas y en margen al mismo tiempo; In-store es el canal menos rentable.

  • Hay alta variabilidad en las ventas (CV > 100%), con 8.3% de transacciones que se comportan como atípicas — probablemente pedidos grandes de distribuidores, no errores de datos.

  • El precio no muestra una relación negativa fuerte con las unidades vendidas: hay margen de maniobra para estrategias de precio premium sin perder demasiado volumen.

¿Qué tipo de decisiones se podrían tomar de acuerdo al análisis previamente realizado?

  1. Priorizar el canal Online en inversión de marketing y logística: es el canal con mejor combinación de volumen y margen en todas las líneas de producto.
  2. Revisar la estructura de costos de las tiendas físicas (In-store), que muestran el margen más bajo pese a un volumen relevante.
  3. Invertir en el crecimiento de Women’s Athletic Footwear: buen margen, baja participación — campañas dirigidas podrían capturar ventas adicionales sin erosionar rentabilidad.
  4. Replicar en Midwest lo que funciona en West, entendiendo los drivers de la región líder (mix de canal, distribuidores, competencia local).
  5. Revisar la política de descuentos por volumen, dado que el margen cae levemente con mayores unidades vendidas.
  6. Explorar espacio para pricing premium, ya que el precio no está frenando el volumen de ventas en el rango observado.

Nota: estas recomendaciones son hipótesis de negocio basadas en los patrones observados en los datos (analítica descriptiva y diagnóstica), no conclusiones causales. Se sugiere validarlas con pruebas controladas antes de implementarlas a gran escala.