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.
##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)
# 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)
Si tus nombres de columnas difieren, usa el bloque de mapeo manual más abajo.
precio_unidad:precio_unidadunidades_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 productolinea (opcional): Línea de producto# 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…
## === 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 (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
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 |
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.
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.
## 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.
## === 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"
)
| 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"
)
| 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.
## 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.
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.")
}
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.
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.
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.
Incluye aquí cualquier output adicional o tablas exportadas que quieras adjuntar.