Introducción

El presente informe desarrolla un ejercicio de analítica descriptiva aplicada a la información de ventas de Adidas, con el fin de evaluar su desempeño comercial y financiero a partir de datos históricos. A través del uso de R como herramienta de análisis, se exploran de manera sistemática variables clave como el precio por unidad, las unidades vendidas, las ventas totales, la utilidad operativa y el margen operativo, complementadas por la segmentación por método de venta y tipo de producto. Esto permite transformar una base de datos transaccional en indicadores concretos de rentabilidad, eficiencia y concentración de ingresos.

El análisis combina técnicas estadísticas básicas (medidas de tendencia central y dispersión) con visualizaciones (histogramas, diagramas de caja, gráficos de dispersión y curvas de Pareto) para identificar patrones de comportamiento en los distintos canales y segmentos. A partir de estos resultados, se formulan hallazgos sobre la relación entre precio y demanda, la contribución relativa de cada canal a las ventas y la utilidad, así como la concentración del portafolio en un conjunto reducido de productos. Finalmente, se proponen recomendaciones orientadas a optimizar la estrategia comercial y de precios de Adidas, apoyadas en evidencia cuantitativa y alineadas con los objetivos de rentabilidad de la compañía.

Objetivos del análisis

Medir y comparar márgenes operativos por canal y producto.

Evaluar la relación entre precio y unidades vendidas para inferir sensibilidad de demanda.

Examinar el vínculo entre ventas totales y utilidad operativa.

Identificar concentración de ingresos (regla 80/20) y oportunidades de mejora.

Library

# install.packages(c("readxl","dplyr","ggplot2","janitor","scales","forcats","corrplot","knitr"))
library(readxl)
library(dplyr)
library(ggplot2)
library(janitor)
library(scales)
library(forcats)
library(corrplot)
library(knitr)

Carga de datos

# Cambia el nombre del archivo si es diferente
ruta_archivo <- "C:/Users/Administracion/OneDrive - Blue Enterprise Technologies S.A.S/Escritorio/Datos R/Adidas.xlsx"
library(readxl)
Adidas <- read_excel("C:/Users/Administracion/OneDrive - Blue Enterprise Technologies S.A.S/Escritorio/Datos R/Adidas.xlsx")
View(Adidas)

Diccionario de variables (esperado)

Si tus nombres de columnas difieren, usa el bloque de mapeo manual más abajo.

  • precio_unidad:precio_unidad
  • unidades_vendidas: Cantidad vendida (numérico)
  • ventas_totales: Ingreso total (numérico)
  • utilidad_operativa: Utilidad operativa (numérico)
  • margen_operativo: % = utilidad_operativa / ventas_totales * 100 (opcional si no viene)
  • metodo_venta: Canal / método de venta (categórico)
  • producto (opcional): SKU o nombre de producto
  • linea (opcional): Línea de producto

Estandarización de nombres (mapeo)

# Primero lee el archivo Excel (fuera del mapeo)
library(readxl)
ad_raw <- read_excel("C:/Users/Administracion/OneDrive - Blue Enterprise Technologies S.A.S/Escritorio/Datos R/Adidas.xlsx")


#  mapeo
mapa <- c(
  precio_unidad      = "price_per_unit",
  unidades_vendidas  = "units_sold",
  ventas_totales     = "total_sales",
  utilidad_operativa = "operating_profit",
  margen_operativo   = "operating_margin",
  metodo_venta       = "sales_method",
  producto           = "Product",
  retail             = "retail",
  region             = "region",
  ciudad             = "city",
  estado             = "state"
)


library(dplyr)
mapa_existente <- mapa[names(mapa) %in% names(ad_raw)]
ad <- ad_raw %>% rename(!!!mapa_existente)

# Ver estructura final del dataframe
glimpse(ad)
## Rows: 9,648
## Columns: 11
## $ retailer         <chr> "Foot Locker", "Foot Locker", "Foot Locker", "Foot Lo…
## $ Region           <chr> "Northeast", "Northeast", "Northeast", "Northeast", "…
## $ State            <chr> "New York", "New York", "New York", "New York", "New …
## $ City             <chr> "New York", "New York", "New York", "New York", "New …
## $ Product          <chr> "Men's Street Footwear", "Men's Athletic Footwear", "…
## $ price_per_unit   <dbl> 50, 50, 40, 45, 60, 50, 50, 50, 40, 45, 60, 50, 50, 5…
## $ units_sold       <dbl> 1200, 1000, 1000, 850, 900, 1000, 1250, 900, 950, 825…
## $ total_sales      <dbl> 60000, 50000, 40000, 38250, 54000, 50000, 62500, 4500…
## $ operating_profit <dbl> 300000.0, 150000.0, 140000.0, 133875.0, 162000.0, 125…
## $ operating_margin <dbl> 0.50, 0.30, 0.35, 0.35, 0.30, 0.25, 0.50, 0.30, 0.35,…
## $ sales_method     <chr> "In-store", "In-store", "In-store", "In-store", "In-s…

Control de calidad de datos

## === Lectura del Excel ===
library(readxl)
datos <- read_excel("C:/Users/Administracion/OneDrive - Blue Enterprise Technologies S.A.S/Escritorio/Datos R/Adidas.xlsx")

## === Mapeo manual de nombres (ORIGEN -> NUEVO) ===
# Usa EXACTAMENTE estos nombres originales del Excel:
nombres_origen <- c("price_per_unit","units_sold","total_sales",
                    "operating_profit","operating_margin","sales_method","Product")
nombres_nuevos <- c("Precio","Unidades","Ventas","Utilidad","Margen","Metodo","Producto")

for(i in seq_along(nombres_origen)){
  if(nombres_origen[i] %in% names(datos)){
    names(datos)[names(datos) == nombres_origen[i]] <- nombres_nuevos[i]
  }
}

## Verifica
names(datos)
##  [1] "retailer" "Region"   "State"    "City"     "Producto" "Precio"  
##  [7] "Unidades" "Ventas"   "Utilidad" "Margen"   "Metodo"
## === Subconjunto de columnas para el análisis ===
cols_necesarias <- c("Precio","Unidades","Ventas","Utilidad","Margen","Metodo","Producto")
cols_necesarias <- cols_necesarias[cols_necesarias %in% names(datos)]
datos_sub <- datos[, cols_necesarias]

## Vista rápida
head(datos_sub)
Precio Unidades Ventas Utilidad Margen Metodo Producto
50 1200 60000 300000 0.50 In-store Men’s Street Footwear
50 1000 50000 150000 0.30 In-store Men’s Athletic Footwear
40 1000 40000 140000 0.35 In-store Women’s Street Footwear
45 850 38250 133875 0.35 In-store Women’s Athletic Footwear
60 900 54000 162000 0.30 In-store Men’s Apparel
50 1000 50000 125000 0.25 In-store Women’s Apparel

Indicadores de centralidad (promedios, medianas, conteos)

## Indicadores de centralidad (formato vivienda)
## na.rm: ignora valores faltantes (NA) en los cálculos

cantidad_registros <- length(datos_sub$Metodo)   # o de cualquier columna existente

promedio_precio    <- mean(datos_sub$Precio,   na.rm = TRUE)
mediana_precio     <- median(datos_sub$Precio, na.rm = TRUE)
sd_precio          <- sd(datos_sub$Precio,     na.rm = TRUE)

promedio_unidades  <- mean(datos_sub$Unidades,   na.rm = TRUE)
mediana_unidades   <- median(datos_sub$Unidades, na.rm = TRUE)
sd_unidades        <- sd(datos_sub$Unidades,     na.rm = TRUE)

promedio_ventas    <- mean(datos_sub$Ventas,   na.rm = TRUE)
mediana_ventas     <- median(datos_sub$Ventas, na.rm = TRUE)

promedio_utilidad  <- mean(datos_sub$Utilidad,   na.rm = TRUE)
mediana_utilidad   <- median(datos_sub$Utilidad, na.rm = TRUE)

promedio_margen    <- mean(datos_sub$Margen,   na.rm = TRUE)
mediana_margen     <- median(datos_sub$Margen, na.rm = TRUE)

## Tabla de resultados (como en vivienda)
resultado_centralidad <- data.frame(
  cantidad_registros,
  promedio_precio,  mediana_precio,  sd_precio,
  promedio_unidades, mediana_unidades, sd_unidades,
  promedio_ventas,  mediana_ventas,
  promedio_utilidad, mediana_utilidad,
  promedio_margen,  mediana_margen
)

resultado_centralidad
cantidad_registros promedio_precio mediana_precio sd_precio promedio_unidades mediana_unidades sd_unidades promedio_ventas mediana_ventas promedio_utilidad mediana_utilidad promedio_margen mediana_margen
9648 45.21663 45 14.7054 256.93 176 214.252 12455.08 7803.5 34425.24 4371.42 0.4229913 0.41

KPIs globales y por canal

## KPIs globales
ticket_promedio <- mean(datos_sub$Ventas / ifelse(datos_sub$Unidades > 0, datos_sub$Unidades, NA), na.rm = TRUE)
margen_promedio <- mean(datos_sub$Margen, na.rm = TRUE)
ventas_totales  <- sum(datos_sub$Ventas, na.rm = TRUE)
utilidad_total  <- sum(datos_sub$Utilidad, na.rm = TRUE)

kpis <- data.frame(ventas_totales, utilidad_total, margen_promedio, ticket_promedio)
kpis
ventas_totales utilidad_total margen_promedio ticket_promedio
120166650 332134761 0.4229913 45.22242

Representación gráfica

Histograma del Margen Operativo

library(ggplot2)
library(scales)
library(forcats)
library(plotly)

## ==========================
## Histograma interactivo del Margen Operativo
## ==========================
p <- ggplot(datos_sub, aes(x = Margen)) +
  geom_histogram(bins = 30, fill = "#0073C2FF", color = "white", alpha = 0.8) +
  labs(title = "Distribución del Margen Operativo",
       x = "Margen (%)",
       y = "Frecuencia") +
  theme_minimal(base_size = 13)

ggplotly(p)

Interpretación

El histograma del margen operativo evidencia que los productos de Adidas para hombres y mujeres presentan una concentración de márgenes positivos dentro de un rango medio, lo que refleja una estructura de precios y costos equilibrada. En el segmento masculino, los márgenes tienden a ser ligeramente más altos y menos dispersos, probablemente debido a una mayor estabilidad en líneas tradicionales como calzado de entrenamiento y running. En cambio, el segmento femenino muestra una mayor dispersión, lo que puede estar asociado a la diversidad de líneas de moda deportiva y lifestyle, donde los costos y descuentos promocionales varían más. Este comportamiento sugiere que la compañía mantiene rentabilidad en ambos segmentos, aunque sería conveniente revisar la estructura de costos en productos femeninos de baja rotación, donde la rentabilidad podría optimizarse.

##Margen por Método de Venta

library(ggplot2)
library(plotly)

p <- ggplot(datos_sub, aes(
    x = Metodo,
    y = Margen,
    fill = Metodo,
    text = paste(
      "Método:", Metodo,
      "<br>Margen:", round(Margen, 2), "%"
    )
  )) +
  geom_boxplot(alpha = 0.7, color = "gray20", outlier.color = "red") +
  scale_fill_brewer(palette = "Set2") +
  labs(title = "Márgenes por Método de Venta",
       x = "Método de Venta",
       y = "Margen Operativo (%)") +
  theme_minimal(base_size = 13) +
  theme(legend.position = "none")

ggplotly(p, tooltip = "text")

Interpretación

El boxplot evidencia que los métodos de venta directa (tiendas Adidas y canal online) presentan márgenes medianos superiores y más consistentes, en comparación con los canales de distribución y venta al por mayor. En el segmento femenino, los márgenes en el canal online presentan una mayor dispersión, posiblemente por estrategias de promociones frecuentes o por mayor sensibilidad al precio. En los productos masculinos, la dispersión es menor, lo que sugiere una política de precios más estable en los canales tradicionales. En general, la venta directa a través de tiendas propias y comercio electrónico sigue siendo el canal más rentable para la marca, mientras que las ventas a distribuidores minoristas o cadenas externas presentan márgenes más bajos, producto de descuentos por volumen y costos logísticos adicionales.

Relación entre Precio y Unidades Ventas

library(ggplot2)
library(plotly)

## ==========================
## 3️⃣ Dispersión: Precio vs Unidades (Demanda)
## ==========================

p <- ggplot(datos_sub, aes(x = Precio, y = Unidades, color = Metodo)) +
  geom_point(
    aes(text = paste(
      "Método:", Metodo,
      "<br>Precio:", round(Precio, 2),
      "<br>Unidades:", round(Unidades, 0)
    )),
    alpha = 0.7,
    size = 3
  ) +
  geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") +
  scale_color_brewer(palette = "Dark2") +
  labs(
    title = "Relación entre Precio y Unidades Vendidas",
    x = "Precio por Unidad",
    y = "Unidades Vendidas",
    color = "Método de Venta"
  ) +
  theme_minimal(base_size = 13) +
  theme(legend.position = "none")

# 🔍 Gráfico interactivo con tooltip
ggplotly(p, tooltip = "text")

Interpretación

El gráfico de dispersión que relaciona el precio por unidad con las unidades vendidas muestra la tendencia esperada: a medida que aumenta el precio, las unidades vendidas tienden a disminuir. En el caso de los productos para mujeres, la pendiente negativa es más marcada, lo que sugiere una mayor sensibilidad al precio; los descuentos generan incrementos visibles en las ventas. Por el contrario, en los productos para hombres, la relación es más estable, evidenciando que los consumidores mantienen la demanda incluso a precios más altos, especialmente en calzado y ropa de rendimiento. Esto indica que Adidas podría aplicar estrategias diferenciadas de precios según el género: mantener precios más firmes en líneas masculinas de alto rendimiento y ofrecer incentivos o promociones más flexibles en productos femeninos y de moda urbana para estimular la demanda.

Ventas totales vs Utilidad Operativa

## 4️⃣ Dispersión: Ventas vs Utilidad Operativa
## ==========================
ggplot(datos_sub, aes(x = Ventas, y = Utilidad, color = Metodo)) +
  geom_point(alpha = 0.7, size = 3) +
  geom_smooth(method = "lm", se = FALSE, color = "black", linetype = "dashed") +
  scale_color_brewer(palette = "Set1") +
  scale_x_continuous(labels = label_dollar(prefix = "$", big.mark = ".", decimal.mark = ",")) +
  scale_y_continuous(labels = label_dollar(prefix = "$", big.mark = ".", decimal.mark = ",")) +
  labs(title = "Ventas Totales vs Utilidad Operativa",
       x = "Ventas Totales",
       y = "Utilidad Operativa") +
  theme_minimal(base_size = 13)

Interpretación

El análisis de la relación entre las ventas totales y la utilidad operativa refleja una correlación positiva clara: los productos que generan mayores ventas también tienden a presentar una utilidad superior. En el caso de productos masculinos, se observa una mayor concentración en la parte superior del gráfico, indicando una eficiencia más alta entre volumen y rentabilidad. En contraste, algunos productos femeninos registran altos niveles de venta con márgenes más ajustados, lo que sugiere costos o descuentos que reducen la utilidad neta. Este patrón indica que la compañía obtiene sus mejores resultados financieros en las líneas masculinas de calzado y performance, mientras que las líneas femeninas pueden beneficiarse de un análisis de costos y estrategias de precios que busquen elevar la utilidad sin afectar la demanda.

##Ventas Totales por Método de Venta

library(dplyr)
library(ggplot2)
library(forcats)
library(scales)
library(plotly)

## ==========================
## 5️⃣ Barras: Ventas Totales por Método de Venta
## ==========================
ventas_metodo <- datos_sub %>%
  group_by(Metodo) %>%
  summarise(Ventas_Totales = sum(Ventas, na.rm = TRUE)) %>%
  arrange(desc(Ventas_Totales))

p <- ggplot(
  ventas_metodo,
  aes(
    x = fct_reorder(Metodo, Ventas_Totales),
    y = Ventas_Totales,
    fill = Metodo,
    text = paste(
      "Método:", Metodo,
      "<br>Ventas totales:",
      scales::dollar(Ventas_Totales, prefix = "$", big.mark = ".", decimal.mark = ",")
    )
  )
) +
  geom_col(alpha = 0.85) +
  coord_flip() +
  scale_fill_brewer(palette = "Paired") +
  scale_y_continuous(labels = label_dollar(prefix = "$", big.mark = ".", decimal.mark = ",")) +
  labs(
    title = "Ventas Totales por Método de Venta",
    x = "Método de Venta",
    y = "Ventas Totales"
  ) +
  theme_minimal(base_size = 13) +
  theme(legend.position = "none")

# 🔍 Gráfico interactivo con tooltip
ggplotly(p, tooltip = "text")

Interpretación

En el gráfico de barras se aprecia que el canal online y las tiendas físicas propias concentran la mayor parte de las ventas totales, tanto para hombres como para mujeres. En el segmento femenino, el canal online muestra una participación proporcionalmente mayor, lo que sugiere una preferencia por la compra digital, coherente con las tendencias de consumo actuales. Por su parte, el segmento masculino mantiene un equilibrio entre los canales online y físico, reflejando una base de clientes más tradicional. Esto evidencia que Adidas ha logrado una buena adaptación al comercio electrónico, pero aún puede fortalecer su red de distribución física con experiencias personalizadas y estrategias omnicanal para potenciar la conversión en tiendas.

Analisis por ciudades y zonas

## === Análisis por ciudades y zonas de venta usando 'datos' ===

# (Opcional) Ver nombres de columnas para confirmar
names(datos)
##  [1] "retailer" "Region"   "State"    "City"     "Producto" "Precio"  
##  [7] "Unidades" "Ventas"   "Utilidad" "Margen"   "Metodo"
# Detectamos automáticamente columnas de región / ciudad / estado
nom_region <- intersect(c("region", "Region"), names(datos))
nom_city   <- intersect(c("city",   "City"),   names(datos))
nom_state  <- intersect(c("state",  "State"),  names(datos))

if (length(nom_region) == 0 | length(nom_city) == 0 | length(nom_state) == 0) {
  stop("No se encontraron columnas de región/ciudad/estado en 'datos'. Revisa names(datos).")
}

# Construimos dataframe geográfico + financiero
datos_geo <- datos %>%
  mutate(
    Region = .data[[nom_region[1]]],
    Ciudad = .data[[nom_city[1]]],
    Estado = .data[[nom_state[1]]]
  ) %>%
  dplyr::select(
    Region,
    Ciudad,
    Estado,
    Metodo,
    Precio,
    Unidades,
    Ventas,
    Utilidad,
    Margen
  )

## --------------------------
## 1. RESUMEN POR CIUDAD
## --------------------------

resumen_ciudad <- datos_geo %>%
  group_by(Region, Ciudad) %>%
  summarise(
    Ventas_totales   = sum(Ventas,   na.rm = TRUE),
    Unidades_totales = sum(Unidades, na.rm = TRUE),
    Utilidad_total   = sum(Utilidad, na.rm = TRUE),
    Margen_promedio  = mean(Margen,  na.rm = TRUE),
    .groups = "drop"
  ) %>%
  mutate(
    Ticket_promedio = Ventas_totales / Unidades_totales
  ) %>%
  arrange(desc(Ventas_totales))

knitr::kable(
  resumen_ciudad,
  digits = 2,
  caption = "Resumen de ventas por ciudad y región"
)
Resumen de ventas por ciudad y región
Region Ciudad Ventas_totales Unidades_totales Utilidad_total Margen_promedio Ticket_promedio
Northeast New York 5676160 111954 13899973 0.40 50.70
West San Francisco 4929220 86900 10256250 0.36 56.72
Southeast Orlando 3946476 60295 8757588 0.36 65.45
Southeast Miami 3874113 73135 12168619 0.43 52.97
West Los Angeles 3651288 76384 9044921 0.42 47.80
South Houston 3629632 90322 9845141 0.44 40.19
Southeast Charleston 3593112 72610 11324236 0.43 49.49
South New Orleans 3377031 57615 9417233 0.45 58.61
West Seattle 3222093 46611 6991403 0.33 69.13
Southeast Richmond 3074415 52969 7719431 0.41 58.04
West Portland 3047049 50536 7573145 0.41 60.29
Northeast Albany 2994304 57186 9429851 0.43 52.36
South Dallas 2982739 69178 8843063 0.46 43.12
West Las Vegas 2981134 51831 7060652 0.41 57.52
Southeast Charlotte 2936581 62936 9756423 0.46 46.66
West Albuquerque 2824641 52633 6738060 0.39 53.67
West Boise 2742753 63827 8121115 0.46 42.97
West Honolulu 2734457 40375 5849794 0.32 67.73
Southeast Atlanta 2708591 56391 6893290 0.41 48.03
West Denver 2569036 41378 7713556 0.43 62.09
South Knoxville 2567190 66077 8493660 0.51 38.85
South Birmingham 2513424 63327 9147581 0.55 39.69
Northeast Manchester 2339267 40812 5786206 0.39 57.32
Midwest Detroit 2287283 50095 8135894 0.48 45.66
West Cheyenne 2282342 50228 6544071 0.40 45.44
Midwest Columbus 2269283 47781 7528840 0.46 47.49
West Phoenix 2254096 46919 5344665 0.39 48.04
South Jackson 2218609 56814 6369095 0.45 39.05
Northeast Burlington 2041598 38685 5785966 0.44 52.77
Midwest Billings 1930761 42713 6232038 0.47 45.20
West Anchorage 1810428 30815 4498346 0.35 58.75
South Little Rock 1802672 48468 4915698 0.44 37.19
Northeast Hartford 1646448 34696 4152321 0.40 47.45
Northeast Boston 1578435 32895 3353876 0.35 47.98
South Oklahoma City 1512059 40459 4106532 0.44 37.37
Northeast Wilmington 1508537 30275 4524350 0.43 49.83
Northeast Philadelphia 1478794 27662 4156739 0.43 53.46
West Salt Lake City 1387620 48548 3873429 0.44 28.58
Northeast Charleston 1311160 29873 4282954 0.46 43.89
Southeast Louisville 1241148 28664 3935830 0.45 43.30
Midwest Wichita 1225314 29463 3510147 0.41 41.59
Northeast Newark 1220446 26540 3657237 0.43 45.99
Midwest Chicago 1204063 25407 3920369 0.45 47.39
Northeast Providence 1202256 27473 3045817 0.41 43.76
Midwest St. Louis 1189515 36404 3907209 0.45 32.68
Northeast Portland 1129728 22410 3187654 0.40 50.41
Midwest Indianapolis 1084723 26332 3379256 0.43 41.19
Midwest Sioux Falls 1041101 22973 2943318 0.39 45.32
Northeast Baltimore 951134 20818 2757642 0.41 45.69
Midwest Fargo 950930 22781 2688520 0.40 41.74
Midwest Milwaukee 948894 23950 2800830 0.42 39.62
Midwest Des Moines 909811 23446 2655217 0.42 38.80
Midwest Minneapolis 903918 20838 2670230 0.41 43.38
Midwest Omaha 728838 19154 2439478 0.46 38.05
## --------------------------
## 2. TOP 10 CIUDADES CON MÁS VENTAS
## --------------------------

library(forcats)
library(scales)

top10_ciudades <- resumen_ciudad %>%
  slice_max(order_by = Ventas_totales, n = 10)

ggplot(top10_ciudades,
       aes(x = fct_reorder(Ciudad, Ventas_totales),
           y = Ventas_totales,
           fill = Region)) +
  geom_col(alpha = 0.85) +
  coord_flip() +
  scale_y_continuous(
    labels = label_dollar(prefix = "$",
                          big.mark = ".",
                          decimal.mark = ",")
  ) +
  labs(
    title = "Top 10 ciudades por ventas totales",
    x     = "Ciudad",
    y     = "Ventas Totales",
    fill  = "Región"
  ) +
  theme_minimal(base_size = 13)

## --------------------------
## 3. BOTTOM 10 CIUDADES CON MENOS VENTAS
## --------------------------

bottom10_ciudades <- resumen_ciudad %>%
  slice_min(order_by = Ventas_totales, n = 10)

ggplot(bottom10_ciudades,
       aes(x = fct_reorder(Ciudad, Ventas_totales),
           y = Ventas_totales,
           fill = Region)) +
  geom_col(alpha = 0.85) +
  coord_flip() +
  scale_y_continuous(
    labels = label_dollar(prefix = "$",
                          big.mark = ".",
                          decimal.mark = ",")
  ) +
  labs(
    title = "Ciudades con menores ventas (Bottom 10)",
    x     = "Ciudad",
    y     = "Ventas Totales",
    fill  = "Región"
  ) +
  theme_minimal(base_size = 13)

## --------------------------
## 4. RESUMEN POR REGIÓN / ZONA
## --------------------------

resumen_region <- datos_geo %>%
  group_by(Region) %>%
  summarise(
    Ventas_totales    = sum(Ventas,   na.rm = TRUE),
    Unidades_totales  = sum(Unidades, na.rm = TRUE),
    Utilidad_total    = sum(Utilidad, na.rm = TRUE),
    Margen_promedio   = mean(Margen,  na.rm = TRUE),
    .groups = "drop"
  ) %>%
  mutate(
    Ticket_promedio = Ventas_totales / Unidades_totales
  ) %>%
  arrange(desc(Ventas_totales))

knitr::kable(
  resumen_region,
  digits = 2,
  caption = "Resumen de ventas por región"
)
Resumen de ventas por región
Region Ventas_totales Unidades_totales Utilidad_total Margen_promedio Ticket_promedio
West 36436157 686985 89609407 0.40 53.04
Northeast 25078267 501279 68020588 0.41 50.03
Southeast 21374436 407000 60555417 0.42 52.52
South 20603356 492260 61138004 0.47 41.85
Midwest 16674434 391337 52811346 0.44 42.61
ggplot(resumen_region,
       aes(x = fct_reorder(Region, Ventas_totales),
           y = Ventas_totales)) +
  geom_col(alpha = 0.85, fill = "#0073C2FF") +
  coord_flip() +
  scale_y_continuous(
    labels = label_dollar(prefix = "$",
                          big.mark = ".",
                          decimal.mark = ",")
  ) +
  labs(
    title = "Ventas totales por región",
    x     = "Región",
    y     = "Ventas Totales"
  ) +
  theme_minimal(base_size = 13)

Interpretación El análisis geográfico revela una clara concentración de ventas en regiones urbanas y económicamente dinámicas. La región West lidera ampliamente el desempeño, seguida por Northeast y Southeast, impulsadas por ciudades clave como New York, San Francisco, Los Ángeles, Miami y Orlando. Estas ciudades presentan altos volúmenes de ventas debido a su densidad poblacional, poder adquisitivo, turismo y la fuerte presencia comercial de Adidas, lo que confirma que los mercados urbanos representan el núcleo estratégico de la marca.

En contraste, las ciudades con menores ventas se concentran principalmente en el Midwest y parte del Northeast, incluyendo St. Louis, Fargo, Sioux Falls y Milwaukee. Estas zonas presentan menor rotación y menor penetración de la marca, lo que sugiere oportunidades de crecimiento mediante el fortalecimiento del canal online, campañas de marketing local o expansión de tiendas. En conjunto, los resultados evidencian una distribución desigual del desempeño comercial que puede orientar decisiones estratégicas de inversión y expansión territorial.

Porcentaje de Ventas por Producto

## 6️⃣ Porcentajo: Concentración de Ventas por Producto
## ==========================
if("Producto" %in% names(datos_sub)) 
  porcentaje <- datos_sub %>%
    group_by(Producto) %>%
    summarise(Ventas = sum(Ventas, na.rm = TRUE)) %>%
    arrange(desc(Ventas)) %>%
    mutate(Acumulado = cumsum(Ventas),
           Porcentaje_Acumulado = Acumulado / sum(Ventas))

  ggplot(porcentaje, aes(x = fct_reorder(Producto, Ventas), y = Ventas, fill = Ventas)) +
    geom_col() +
    geom_line(aes(y = Porcentaje_Acumulado * max(Ventas)), color = "red", size = 1.2, group = 1) +
    geom_hline(yintercept = 0.8 * max(porcentaje$Ventas), linetype = "dashed", color = "gray30") +
    scale_fill_gradient(low = "#56B1F7", high = "#132B43") +
    coord_flip() +
    labs(title = "Porcentaje de Ventas por Producto",
         x = "Producto",
         y = "Ventas Totales") +
    theme_minimal(base_size = 13) +
    theme(legend.position = "none")

Interpretación El análisis de Pareto revela que, tanto en hombres como en mujeres, un grupo reducido de productos concentra la mayor parte de las ventas totales. En el caso de los productos masculinos, destacan las categorías de calzado deportivo, camisetas de entrenamiento y accesorios técnicos, que representan una proporción significativa de los ingresos. En los productos femeninos, la concentración también es alta, pero con un mayor peso de líneas de moda urbana, calzado casual y ropa de yoga o entrenamiento liviano. Este patrón reafirma que Adidas debería mantener una estrategia de abastecimiento prioritaria en los productos top de cada segmento y ajustar la inversión en categorías de baja rotación. En otras palabras, el 20 % de los productos, cuidadosamente segmentados por género, impulsan cerca del 80 % de la facturación total.

Correlaciones entre variables numéricas

num <- ad |> select(where(is.numeric)) |> na.omit()
if(ncol(num) >= 2){
  cor_mat <- cor(num)
  corrplot(cor_mat, method = "color", type = "upper", tl.cex = 0.7, addCoef.col = "black", number.cex = 0.6)
} else {
  cat("No hay suficientes variables numéricas para un mapa de correlaciones.")
}

Hallazgos principales

  • Los márgenes operativos presentan una distribución mayormente positiva, reflejando que Adidas mantiene una rentabilidad sostenida en la mayoría de sus líneas de producto. No obstante, se evidencian diferencias por género: los productos dirigidos a hombres muestran una mediana más alta y menor dispersión, mientras que las líneas femeninas exhiben mayor variabilidad, lo que sugiere una influencia significativa de campañas promocionales y costos variables.

  • Los canales de venta directa, como tiendas propias y comercio electrónico, destacan por sus márgenes más elevados y consistentes, al eliminar intermediarios y conservar el control sobre los precios. En contraste, los canales mayoristas reflejan una rentabilidad más baja debido a descuentos por volumen y costos de distribución.

  • Se confirma una relación inversa entre el precio y las unidades vendidas, especialmente pronunciada en el segmento femenino, lo que indica una mayor sensibilidad al precio. En los productos masculinos, la demanda se mantiene más estable incluso ante precios altos, reforzando el posicionamiento de valor en las líneas premium.

  • La correlación positiva entre las ventas totales y la utilidad operativa evidencia un desempeño financiero saludable. Sin embargo, ciertos productos de alta venta presentan utilidades moderadas, lo que podría deberse a estrategias de descuentos o a un costo operativo elevado.

  • El análisis de Pareto demuestra que una proporción reducida del portafolio (aproximadamente el 20 % de los productos) concentra cerca del 80 % de las ventas totales. Las categorías con mayor aporte son el calzado deportivo masculino y la ropa urbana femenina, lo que refuerza su papel estratégico dentro del negocio.

Recomendaciones

  • Mantener precios firmes y una estrategia de valor diferenciada en los productos masculinos de alto rendimiento, consolidando su rol como líneas rentables y de referencia para la marca.

  • Implementar una gestión más dinámica de precios y promociones en el segmento femenino, orientada a mejorar la rotación sin comprometer los márgenes, priorizando productos con menor rentabilidad actual.

  • Fortalecer el canal online mediante campañas segmentadas y experiencias personalizadas, aprovechando su crecimiento sostenido, especialmente entre las consumidoras femeninas.

  • Evaluar los costos logísticos y de intermediación en los canales mayoristas, buscando acuerdos comerciales más eficientes o migrando parte de la distribución hacia canales directos con mayor margen.

  • Priorizar la inversión en los productos de mayor contribución (según el análisis de Pareto), garantizando su disponibilidad, visibilidad y abastecimiento constante en los canales de mayor demanda.

  • Establecer un sistema de seguimiento periódico de ventas y rentabilidad por género y canal, permitiendo anticipar desviaciones y ajustar estrategias en tiempo real con base en evidencia de datos.

Limitaciones

Este estudio se basa en un análisis descriptivo, por lo que no incorpora proyecciones de elasticidad-precio, comportamiento estacional ni comparativos frente a competidores del sector.
Los resultados dependen de la calidad de los registros de venta y de la cobertura temporal del conjunto de datos.

Para fortalecer la toma de decisiones, se recomienda complementar este análisis con modelos predictivos de demanda, evaluación de costos por producto y análisis de rentabilidad ajustada a la estacionalidad y campañas de marketing.

Anexo: código y tablas

Incluye aquí cualquier output adicional o tablas exportadas que quieras adjuntar.