El presente informe desarrolla un análisis descriptivo y exploratorio de la información comercial y financiera de Adidas. El propósito es comprender el comportamiento de las ventas, las unidades vendidas y la rentabilidad, comparando diferentes regiones, productos, distribuidores y métodos de venta.
El análisis busca identificar patrones, diferencias entre segmentos, relaciones entre variables y posibles valores atípicos que puedan ser relevantes para la toma de decisiones. Las conclusiones se basan en los datos disponibles y se interpretan desde una perspectiva descriptiva y diagnóstica.
La base contiene información sobre distribuidores, regiones, estados, ciudades, productos, precio por unidad, unidades vendidas, ventas totales, utilidad operativa, margen operativo y método de venta.
cat("Número de filas:", nrow(datos), "\n")
## Número de filas: 9648
cat("Número de columnas:", ncol(datos))
## Número de columnas: 11
str(datos)
## 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" ...
faltantes <- data.frame(
variable = names(datos),
faltantes = sapply(datos, function(x) sum(is.na(x)))
)
kable(faltantes, caption = "Valores faltantes por variable")
| variable | faltantes | |
|---|---|---|
| distribuidor | distribuidor | 0 |
| region | region | 0 |
| estado | estado | 0 |
| ciudad | ciudad | 0 |
| producto | producto | 0 |
| precio_unidad | precio_unidad | 0 |
| unidades_vendidas | unidades_vendidas | 0 |
| ventas_total | ventas_total | 0 |
| utilidad_operativa | utilidad_operativa | 0 |
| margen_operativo | margen_operativo | 0 |
| metodo_venta | metodo_venta | 0 |
duplicados <- sum(duplicated(datos))
duplicados
## [1] 262
La base no presenta valores faltantes si el resultado anterior es cero en todas las variables. En cuanto a los registros duplicados exactos, estos deben ser revisados antes de eliminarlos, ya que un duplicado técnico no necesariamente significa que el registro sea incorrecto.
estadisticas <- datos %>%
summarise(
precio_promedio = mean(precio_unidad, na.rm = TRUE),
precio_mediana = median(precio_unidad, na.rm = TRUE),
precio_sd = sd(precio_unidad, na.rm = TRUE),
unidades_promedio = mean(unidades_vendidas, na.rm = TRUE),
unidades_mediana = median(unidades_vendidas, na.rm = TRUE),
unidades_sd = sd(unidades_vendidas, na.rm = TRUE),
ventas_promedio = mean(ventas_total, na.rm = TRUE),
ventas_mediana = median(ventas_total, na.rm = TRUE),
ventas_sd = sd(ventas_total, na.rm = TRUE),
utilidad_promedio = mean(utilidad_operativa, na.rm = TRUE),
utilidad_mediana = median(utilidad_operativa, na.rm = TRUE),
utilidad_sd = sd(utilidad_operativa, na.rm = TRUE),
margen_promedio = mean(margen_operativo, na.rm = TRUE),
margen_mediana = median(margen_operativo, na.rm = TRUE),
margen_sd = sd(margen_operativo, na.rm = TRUE)
)
kable(round(estadisticas, 2), caption = "Estadísticas descriptivas principales")
| precio_promedio | precio_mediana | precio_sd | unidades_promedio | unidades_mediana | unidades_sd | ventas_promedio | ventas_mediana | ventas_sd | utilidad_promedio | utilidad_mediana | utilidad_sd | margen_promedio | margen_mediana | margen_sd |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 45.22 | 45 | 14.71 | 256.93 | 176 | 214.25 | 12455.08 | 7803.5 | 12716.39 | 4894.79 | 3262.98 | 4866.46 | 0.42 | 0.41 | 0.1 |
El precio por unidad presenta una media de 45.22 y una mediana de 45. Las unidades vendidas presentan una media de 256.93 y una mediana de 176, lo que permite observar la diferencia entre el comportamiento promedio y el valor central.
Las ventas totales tienen una media de $12,455.08 y una mediana de $7,803.50. La utilidad operativa presenta una media de $4,894.79.
El margen operativo promedio es de 42.3%, mientras que la desviación estándar es de 9.7%. Esto permite evaluar la dispersión de la rentabilidad entre observaciones.
ventas_region <- datos %>%
group_by(region) %>%
summarise(
ventas = sum(ventas_total, na.rm = TRUE),
unidades = sum(unidades_vendidas, na.rm = TRUE),
utilidad = sum(utilidad_operativa, na.rm = TRUE),
margen_promedio = mean(margen_operativo, na.rm = TRUE)
) %>%
arrange(desc(ventas)) %>%
mutate(participacion = ventas / sum(ventas))
kable(
ventas_region %>%
mutate(
ventas = dollar(ventas, accuracy = 1),
utilidad = dollar(utilidad, accuracy = 1),
participacion = percent(participacion, accuracy = 0.1),
margen_promedio = percent(margen_promedio, accuracy = 0.1)
),
caption = "Desempeño por región"
)
| region | ventas | unidades | utilidad | margen_promedio | participacion |
|---|---|---|---|---|---|
| West | $36,436,157 | 686985 | $13,017,584 | 39.7% | 30.3% |
| Northeast | $25,078,267 | 501279 | $9,732,774 | 41.0% | 20.9% |
| Southeast | $21,374,436 | 407000 | $8,393,059 | 41.9% | 17.8% |
| South | $20,603,356 | 492260 | $9,221,605 | 46.7% | 17.1% |
| Midwest | $16,674,434 | 391337 | $6,859,945 | 43.5% | 13.9% |
ggplot(ventas_region, aes(x = reorder(region, ventas), y = ventas)) +
geom_col() +
coord_flip() +
scale_y_continuous(labels = dollar_format()) +
labs(
title = "Ventas totales por región",
x = "Región",
y = "Ventas totales"
) +
theme_minimal()
La región con mayores ventas es West, con una participación de 30.3% del total. La región con menor participación es Midwest, con 13.9%.
ventas_producto <- datos %>%
group_by(producto) %>%
summarise(
ventas = sum(ventas_total, na.rm = TRUE),
unidades = sum(unidades_vendidas, na.rm = TRUE),
utilidad = sum(utilidad_operativa, na.rm = TRUE),
margen_promedio = mean(margen_operativo, na.rm = TRUE)
) %>%
arrange(desc(ventas)) %>%
mutate(participacion = ventas / sum(ventas))
kable(
ventas_producto %>%
mutate(
ventas = dollar(ventas, accuracy = 1),
utilidad = dollar(utilidad, accuracy = 1),
participacion = percent(participacion, accuracy = 0.1),
margen_promedio = percent(margen_promedio, accuracy = 0.1)
),
caption = "Desempeño por producto"
)
| producto | ventas | unidades | utilidad | margen_promedio | participacion |
|---|---|---|---|---|---|
| Men’s Street Footwear | $27,680,769 | 593320 | $11,629,046 | 44.6% | 23.0% |
| Women’s Apparel | $23,870,985 | 433827 | $9,685,221 | 44.1% | 19.9% |
| Men’s Athletic Footwear | $20,577,180 | 435526 | $7,437,457 | 40.3% | 17.1% |
| Women’s Street Footwear | $17,201,563 | 392269 | $6,494,017 | 41.0% | 14.3% |
| Men’s Apparel | $16,520,632 | 306683 | $6,381,405 | 41.3% | 13.7% |
| Women’s Athletic Footwear | $14,315,521 | 317236 | $5,597,822 | 42.4% | 11.9% |
ggplot(ventas_producto, aes(x = reorder(producto, ventas), y = ventas)) +
geom_col() +
coord_flip() +
scale_y_continuous(labels = dollar_format()) +
labs(
title = "Ventas totales por producto",
x = "Producto",
y = "Ventas totales"
) +
theme_minimal()
El producto con mayor participación en las ventas es Men’s Street Footwear, con 23.0% del total.
ventas_distribuidor <- datos %>%
group_by(distribuidor) %>%
summarise(
ventas = sum(ventas_total, na.rm = TRUE),
unidades = sum(unidades_vendidas, na.rm = TRUE),
utilidad = sum(utilidad_operativa, na.rm = TRUE),
margen_promedio = mean(margen_operativo, na.rm = TRUE)
) %>%
arrange(desc(ventas)) %>%
mutate(participacion = ventas / sum(ventas))
kable(
ventas_distribuidor %>%
mutate(
ventas = dollar(ventas, accuracy = 1),
utilidad = dollar(utilidad, accuracy = 1),
participacion = percent(participacion, accuracy = 0.1),
margen_promedio = percent(margen_promedio, accuracy = 0.1)
),
caption = "Desempeño por distribuidor"
)
| distribuidor | ventas | unidades | utilidad | margen_promedio | participacion |
|---|---|---|---|---|---|
| West Gear | $32,409,558 | 625262 | $12,196,891 | 41.8% | 27.0% |
| Foot Locker | $29,024,945 | 604369 | $11,317,027 | 41.8% | 24.2% |
| Sports Direct | $24,616,622 | 557640 | $10,641,609 | 44.5% | 20.5% |
| Kohl’s | $13,512,453 | 287375 | $5,182,260 | 41.9% | 11.2% |
| Walmart | $10,506,085 | 206225 | $3,902,749 | 40.7% | 8.7% |
| Amazon | $10,096,987 | 197990 | $3,984,432 | 41.8% | 8.4% |
ggplot(ventas_distribuidor, aes(x = reorder(distribuidor, ventas), y = ventas)) +
geom_col() +
coord_flip() +
scale_y_continuous(labels = dollar_format()) +
labs(
title = "Ventas por distribuidor",
x = "Distribuidor",
y = "Ventas totales"
) +
theme_minimal()
El distribuidor con mayor volumen de ventas es West Gear. Sin embargo, el volumen de ventas no debe interpretarse automáticamente como mayor rentabilidad, por lo que también se compara la utilidad y el margen.
ventas_metodo <- datos %>%
group_by(metodo_venta) %>%
summarise(
ventas = sum(ventas_total, na.rm = TRUE),
unidades = sum(unidades_vendidas, na.rm = TRUE),
utilidad = sum(utilidad_operativa, na.rm = TRUE),
margen_promedio = mean(margen_operativo, na.rm = TRUE)
) %>%
arrange(desc(ventas)) %>%
mutate(participacion = ventas / sum(ventas))
kable(
ventas_metodo %>%
mutate(
ventas = dollar(ventas, accuracy = 1),
utilidad = dollar(utilidad, accuracy = 1),
participacion = percent(participacion, accuracy = 0.1),
margen_promedio = percent(margen_promedio, accuracy = 0.1)
),
caption = "Desempeño por método de venta"
)
| metodo_venta | ventas | unidades | utilidad | margen_promedio | participacion |
|---|---|---|---|---|---|
| Online | $44,965,657 | 939093 | $19,552,538 | 46.4% | 37.4% |
| Outlet | $39,536,618 | 849778 | $14,913,301 | 39.5% | 32.9% |
| In-store | $35,664,375 | 689990 | $12,759,129 | 35.6% | 29.7% |
ggplot(ventas_metodo, aes(x = metodo_venta, y = ventas)) +
geom_col() +
scale_y_continuous(labels = dollar_format()) +
labs(
title = "Ventas según método de venta",
x = "Método de venta",
y = "Ventas totales"
) +
theme_minimal()
El método con mayor participación en las ventas es Online, con 37.4% del total.
utilidad_producto <- datos %>%
group_by(producto) %>%
summarise(
utilidad = sum(utilidad_operativa, na.rm = TRUE),
margen_promedio = mean(margen_operativo, na.rm = TRUE)
) %>%
arrange(desc(utilidad))
kable(
utilidad_producto %>%
mutate(
utilidad = dollar(utilidad, accuracy = 1),
margen_promedio = percent(margen_promedio, accuracy = 0.1)
),
caption = "Rentabilidad por producto"
)
| producto | utilidad | margen_promedio |
|---|---|---|
| Men’s Street Footwear | $11,629,046 | 44.6% |
| Women’s Apparel | $9,685,221 | 44.1% |
| Men’s Athletic Footwear | $7,437,457 | 40.3% |
| Women’s Street Footwear | $6,494,017 | 41.0% |
| Men’s Apparel | $6,381,405 | 41.3% |
| Women’s Athletic Footwear | $5,597,822 | 42.4% |
ggplot(utilidad_producto, aes(x = reorder(producto, utilidad), y = utilidad)) +
geom_col() +
coord_flip() +
scale_y_continuous(labels = dollar_format()) +
labs(
title = "Utilidad operativa por producto",
x = "Producto",
y = "Utilidad operativa"
) +
theme_minimal()
ggplot(datos, aes(x = ventas_total, y = utilidad_operativa)) +
geom_point(alpha = 0.35) +
geom_smooth(method = "lm", se = FALSE) +
scale_x_continuous(labels = dollar_format()) +
scale_y_continuous(labels = dollar_format()) +
labs(
title = "Relación entre ventas y utilidad operativa",
x = "Ventas totales",
y = "Utilidad operativa"
) +
theme_minimal()
cor_ventas_utilidad <- cor(
datos$ventas_total,
datos$utilidad_operativa,
use = "complete.obs"
)
cor_ventas_utilidad
## [1] 0.9353717
La correlación entre ventas totales y utilidad operativa es 0.935. Este resultado indica una asociación lineal positiva entre ambas variables en la base analizada. La correlación describe asociación y no demuestra por sí misma una relación causal.
ggplot(datos, aes(x = precio_unidad, y = unidades_vendidas)) +
geom_point(alpha = 0.35) +
geom_smooth(method = "lm", se = FALSE) +
labs(
title = "Relación entre precio por unidad y unidades vendidas",
x = "Precio por unidad",
y = "Unidades vendidas"
) +
theme_minimal()
cor_precio_unidades <- cor(
datos$precio_unidad,
datos$unidades_vendidas,
use = "complete.obs"
)
cor_precio_unidades
## [1] 0.2658685
La correlación entre precio y unidades vendidas es 0.266. En esta base se observa una asociación positiva. Este resultado debe interpretarse con cautela: no permite afirmar que aumentar el precio cause un aumento en las unidades vendidas, ya que pueden existir otras variables que expliquen simultáneamente ambas medidas.
correlaciones <- datos %>%
select(
precio_unidad,
unidades_vendidas,
ventas_total,
utilidad_operativa,
margen_operativo
) %>%
cor(use = "complete.obs")
kable(round(correlaciones, 3), caption = "Matriz de correlaciones")
| precio_unidad | unidades_vendidas | ventas_total | utilidad_operativa | margen_operativo | |
|---|---|---|---|---|---|
| precio_unidad | 1.000 | 0.266 | 0.540 | 0.504 | -0.137 |
| unidades_vendidas | 0.266 | 1.000 | 0.919 | 0.872 | -0.305 |
| ventas_total | 0.540 | 0.919 | 1.000 | 0.935 | -0.302 |
| utilidad_operativa | 0.504 | 0.872 | 0.935 | 1.000 | -0.047 |
| margen_operativo | -0.137 | -0.305 | -0.302 | -0.047 | 1.000 |
Para facilitar la interpretación, las correlaciones deben analizarse por magnitud y signo. Las asociaciones más fuertes con la utilidad operativa permiten identificar qué variables están más relacionadas con el resultado financiero dentro de la base, sin interpretar estas asociaciones como relaciones causales.
ggplot(datos, aes(y = ventas_total)) +
geom_boxplot() +
scale_y_continuous(labels = dollar_format()) +
labs(
title = "Distribución y posibles valores atípicos de las ventas",
y = "Ventas totales"
) +
theme_minimal()
ggplot(datos, aes(y = margen_operativo)) +
geom_boxplot() +
scale_y_continuous(labels = percent_format()) +
labs(
title = "Distribución del margen operativo",
y = "Margen operativo"
) +
theme_minimal()
outliers <- datos %>%
summarise(
precio = sum(precio_unidad < quantile(precio_unidad, .25) -
1.5 * IQR(precio_unidad) |
precio_unidad > quantile(precio_unidad, .75) +
1.5 * IQR(precio_unidad)),
unidades = sum(unidades_vendidas < quantile(unidades_vendidas, .25) -
1.5 * IQR(unidades_vendidas) |
unidades_vendidas > quantile(unidades_vendidas, .75) +
1.5 * IQR(unidades_vendidas)),
ventas = sum(ventas_total < quantile(ventas_total, .25) -
1.5 * IQR(ventas_total) |
ventas_total > quantile(ventas_total, .75) +
1.5 * IQR(ventas_total)),
utilidad = sum(utilidad_operativa < quantile(utilidad_operativa, .25) -
1.5 * IQR(utilidad_operativa) |
utilidad_operativa > quantile(utilidad_operativa, .75) +
1.5 * IQR(utilidad_operativa)),
margen = sum(margen_operativo < quantile(margen_operativo, .25) -
1.5 * IQR(margen_operativo) |
margen_operativo > quantile(margen_operativo, .75) +
1.5 * IQR(margen_operativo))
)
kable(outliers, caption = "Número de observaciones identificadas como atípicas mediante IQR")
| precio | unidades | ventas | utilidad | margen |
|---|---|---|---|---|
| 104 | 508 | 799 | 694 | 63 |
Los valores atípicos no deben eliminarse automáticamente. En un análisis comercial, una observación extrema puede representar una operación real de gran volumen y, por tanto, contener información importante para la toma de decisiones.
producto_region <- datos %>%
group_by(producto, region) %>%
summarise(
ventas = sum(ventas_total, na.rm = TRUE),
utilidad = sum(utilidad_operativa, na.rm = TRUE),
margen_promedio = mean(margen_operativo, na.rm = TRUE),
.groups = "drop"
) %>%
arrange(desc(ventas))
kable(
head(producto_region, 10) %>%
mutate(
ventas = dollar(ventas, accuracy = 1),
utilidad = dollar(utilidad, accuracy = 1),
margen_promedio = percent(margen_promedio, accuracy = 0.1)
),
caption = "Diez principales combinaciones producto-región por ventas"
)
| producto | region | ventas | utilidad | margen_promedio |
|---|---|---|---|---|
| Men’s Street Footwear | West | $7,389,988 | $2,907,503 | 42.5% |
| Women’s Apparel | West | $7,038,046 | $2,096,258 | 34.5% |
| Men’s Street Footwear | Northeast | $6,841,324 | $3,030,663 | 46.1% |
| Men’s Athletic Footwear | West | $6,761,339 | $2,154,211 | 36.7% |
| Women’s Street Footwear | West | $5,748,586 | $2,142,439 | 40.4% |
| Women’s Apparel | Northeast | $5,045,208 | $1,917,008 | 41.6% |
| Men’s Apparel | West | $4,827,378 | $2,009,555 | 43.7% |
| Men’s Street Footwear | Midwest | $4,707,360 | $1,948,621 | 44.2% |
| Men’s Street Footwear | Southeast | $4,693,836 | $2,003,886 | 45.3% |
| Women’s Athletic Footwear | West | $4,670,820 | $1,707,618 | 40.4% |
producto_metodo <- datos %>%
group_by(producto, metodo_venta) %>%
summarise(
ventas = sum(ventas_total, na.rm = TRUE),
utilidad = sum(utilidad_operativa, na.rm = TRUE),
margen_promedio = mean(margen_operativo, na.rm = TRUE),
.groups = "drop"
) %>%
arrange(desc(ventas))
kable(
head(producto_metodo, 10) %>%
mutate(
ventas = dollar(ventas, accuracy = 1),
utilidad = dollar(utilidad, accuracy = 1),
margen_promedio = percent(margen_promedio, accuracy = 0.1)
),
caption = "Diez principales combinaciones producto-método por ventas"
)
| producto | metodo_venta | ventas | utilidad | margen_promedio |
|---|---|---|---|---|
| Men’s Street Footwear | Online | $10,365,158 | $4,715,551 | 48.5% |
| Women’s Apparel | Online | $8,966,155 | $4,104,331 | 48.8% |
| Men’s Street Footwear | In-store | $8,885,200 | $3,486,710 | 38.4% |
| Men’s Street Footwear | Outlet | $8,430,411 | $3,426,785 | 41.9% |
| Women’s Apparel | Outlet | $7,879,955 | $2,952,377 | 40.3% |
| Men’s Athletic Footwear | Online | $7,625,859 | $3,143,928 | 44.4% |
| Women’s Apparel | In-store | $7,024,875 | $2,628,512 | 37.7% |
| Men’s Athletic Footwear | Outlet | $7,016,446 | $2,323,292 | 36.9% |
| Men’s Apparel | Online | $6,334,120 | $2,626,915 | 45.2% |
| Women’s Street Footwear | Online | $6,303,273 | $2,634,900 | 45.1% |
ventas_ciudad <- datos %>%
group_by(ciudad) %>%
summarise(
ventas = sum(ventas_total, na.rm = TRUE),
utilidad = sum(utilidad_operativa, na.rm = TRUE),
unidades = sum(unidades_vendidas, na.rm = TRUE)
) %>%
arrange(desc(ventas))
kable(
head(ventas_ciudad, 10) %>%
mutate(
ventas = dollar(ventas, accuracy = 1),
utilidad = dollar(utilidad, accuracy = 1)
),
caption = "Diez ciudades con mayores ventas"
)
| ciudad | ventas | utilidad | unidades |
|---|---|---|---|
| New York | $5,676,160 | $2,114,664 | 111954 |
| San Francisco | $4,929,220 | $1,581,993 | 86900 |
| Charleston | $4,904,272 | $2,024,086 | 102483 |
| Portland | $4,176,777 | $1,575,861 | 72946 |
| Orlando | $3,946,476 | $1,342,207 | 60295 |
| Miami | $3,874,113 | $1,579,388 | 73135 |
| Los Angeles | $3,651,288 | $1,378,158 | 76384 |
| Houston | $3,629,632 | $1,494,772 | 90322 |
| New Orleans | $3,377,031 | $1,424,390 | 57615 |
| Seattle | $3,222,093 | $927,709 | 46611 |
La base disponible no contiene una variable de fecha, periodo o año que permita ordenar las observaciones temporalmente. Por esta razón, no es metodológicamente apropiado calcular una tasa de crecimiento temporal con la información disponible. En su lugar, el análisis se concentra en participaciones, diferencias entre segmentos, medidas de tendencia central, variabilidad y relaciones entre variables.
A partir del análisis descriptivo se pueden plantear las siguientes líneas de acción:
Estas recomendaciones corresponden a una primera aproximación prescriptiva basada en el análisis descriptivo. No implican causalidad y deberían complementarse con información adicional antes de ejecutar decisiones comerciales.
El análisis exploratorio permite caracterizar el desempeño comercial y financiero de Adidas a partir de sus principales variables cuantitativas y categóricas. La comparación entre regiones, productos, distribuidores y métodos de venta evidencia que el desempeño puede variar considerablemente según el segmento analizado.
Además, la utilización conjunta de medidas de tendencia central, variabilidad, correlaciones y visualizaciones permite obtener una visión más completa que el análisis de una sola métrica. En particular, resulta importante diferenciar entre volumen de ventas y rentabilidad, ya que ambas dimensiones aportan información diferente para la toma de decisiones.
Finalmente, los resultados proporcionan una base para una etapa posterior de analítica prescriptiva, en la cual podrían incorporarse variables temporales, costos adicionales, inventarios y otros factores para evaluar escenarios y decisiones comerciales con mayor profundidad.