En el contexto actual, la analitica de negocios se ha convertido en una herramienta fundamental para transformar datos en informacion util para la toma de decisiones. En este caso, Adidas cuenta con una base de datos que reune variables comerciales y financieras relacionadas con precio por unidad, unidades vendidas, ventas totales, utilidad operativa, margen operativo, distribuidor, producto, metodo de venta y ubicacion geografica.
El proposito de este informe es realizar un analisis descriptivo y diagnostico de dicha informacion con el fin de comprender el comportamiento de las ventas y la rentabilidad de la compania. A partir de este analisis, se busca identificar patrones relevantes, comparar segmentos y proponer recomendaciones prescriptivas basadas en evidencia.
Realizar un analisis descriptivo y diagnostico del desempeno comercial y financiero de Adidas a partir de la base de datos suministrada, con el fin de generar hallazgos que apoyen la toma de decisiones.
library(readxl)
library(dplyr)
library(ggplot2)
library(janitor)
library(scales)
library(knitr)
Importante: este archivo .Rmd y el
Excel DatosCaso111.xlsx deben estar guardados en la misma
carpeta.
adidas <- read_excel("C:/Users/ASUS/OneDrive - PUJ Cali/Desktop/MASTER FINANZAS JAVERIANA 2026-2027/Analitica de negocios/trabajos R/DatosCaso111.xlsx") %>%
clean_names()
adidas <- adidas %>%
mutate(
distribuidor = as.factor(distribuidor),
region = as.factor(region),
estado = as.factor(estado),
ciudad = as.factor(ciudad),
producto = as.factor(producto),
metodo_venta = as.factor(metodo_venta)
)
str(adidas)
## tibble [9,648 × 11] (S3: tbl_df/tbl/data.frame)
## $ distribuidor : Factor w/ 6 levels "Amazon","Foot Locker",..: 2 2 2 2 2 2 2 2 2 2 ...
## $ region : Factor w/ 5 levels "Midwest","Northeast",..: 2 2 2 2 2 2 2 2 2 2 ...
## $ estado : Factor w/ 50 levels "Alabama","Alaska",..: 32 32 32 32 32 32 32 32 32 32 ...
## $ ciudad : Factor w/ 52 levels "Albany","Albuquerque",..: 36 36 36 36 36 36 36 36 36 36 ...
## $ producto : Factor w/ 6 levels "Men's Apparel",..: 3 2 6 5 1 4 3 2 6 5 ...
## $ 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 : Factor w/ 3 levels "In-store","Online",..: 1 1 1 1 1 1 1 3 3 3 ...
names(adidas)
## [1] "distribuidor" "region" "estado"
## [4] "ciudad" "producto" "precio_unidad"
## [7] "unidades_vendidas" "ventas_total" "utilidad_operativa"
## [10] "margen_operativo" "metodo_venta"
colSums(is.na(adidas))
## distribuidor region estado ciudad
## 0 0 0 0
## producto precio_unidad unidades_vendidas ventas_total
## 0 0 0 0
## utilidad_operativa margen_operativo metodo_venta
## 0 0 0
sum(duplicated(adidas))
## [1] 262
La revision basica anterior permite confirmar la estructura de la base y verificar que las variables esten disponibles para el analisis. Asimismo, se reviso la presencia de valores faltantes y duplicados, con el fin de asegurar una base consistente para el desarrollo del informe.
Con el fin de verificar la consistencia matematica de la informacion, se compararon las ventas totales observadas con las ventas calculadas a partir del precio por unidad y las unidades vendidas. De igual forma, se contrasto la utilidad operativa con la utilidad estimada a partir de las ventas totales y el margen operativo.
validacion_ventas <- adidas %>%
mutate(
ventas_calculadas = precio_unidad * unidades_vendidas,
diferencia_ventas = ventas_total - ventas_calculadas
) %>%
summarise(
minimo = min(diferencia_ventas, na.rm = TRUE),
maximo = max(diferencia_ventas, na.rm = TRUE),
promedio = mean(diferencia_ventas, na.rm = TRUE)
)
validacion_ventas
## # A tibble: 1 × 3
## minimo maximo promedio
## <dbl> <dbl> <dbl>
## 1 0 0 0
validacion_utilidad <- adidas %>%
mutate(
utilidad_calculada = ventas_total * margen_operativo,
diferencia_utilidad = utilidad_operativa - utilidad_calculada
) %>%
summarise(
minimo = min(diferencia_utilidad, na.rm = TRUE),
maximo = max(diferencia_utilidad, na.rm = TRUE),
promedio = mean(diferencia_utilidad, na.rm = TRUE)
)
validacion_utilidad
## # A tibble: 1 × 3
## minimo maximo promedio
## <dbl> <dbl> <dbl>
## 1 0 9.09e-13 9.43e-17
Las diferencias obtenidas permiten evaluar si existe coherencia entre las variables financieras principales. Si los valores minimo, maximo y promedio son cercanos a cero, ello indica que la base mantiene consistencia interna en sus calculos.
A continuacion, se presentan estadisticas descriptivas para las variables numericas mas relevantes del analisis: precio por unidad, unidades vendidas, ventas totales, utilidad operativa y margen operativo.
estadisticas_generales <- data.frame(
Variable = c("Precio por unidad", "Unidades vendidas", "Ventas totales",
"Utilidad operativa", "Margen operativo"),
Minimo = c(min(adidas$precio_unidad, na.rm = TRUE),
min(adidas$unidades_vendidas, na.rm = TRUE),
min(adidas$ventas_total, na.rm = TRUE),
min(adidas$utilidad_operativa, na.rm = TRUE),
min(adidas$margen_operativo, na.rm = TRUE)),
Media = c(mean(adidas$precio_unidad, na.rm = TRUE),
mean(adidas$unidades_vendidas, na.rm = TRUE),
mean(adidas$ventas_total, na.rm = TRUE),
mean(adidas$utilidad_operativa, na.rm = TRUE),
mean(adidas$margen_operativo, na.rm = TRUE)),
Mediana = c(median(adidas$precio_unidad, na.rm = TRUE),
median(adidas$unidades_vendidas, na.rm = TRUE),
median(adidas$ventas_total, na.rm = TRUE),
median(adidas$utilidad_operativa, na.rm = TRUE),
median(adidas$margen_operativo, na.rm = TRUE)),
Maximo = c(max(adidas$precio_unidad, na.rm = TRUE),
max(adidas$unidades_vendidas, na.rm = TRUE),
max(adidas$ventas_total, na.rm = TRUE),
max(adidas$utilidad_operativa, na.rm = TRUE),
max(adidas$margen_operativo, na.rm = TRUE)),
Desv_Estandar = c(sd(adidas$precio_unidad, na.rm = TRUE),
sd(adidas$unidades_vendidas, na.rm = TRUE),
sd(adidas$ventas_total, na.rm = TRUE),
sd(adidas$utilidad_operativa, na.rm = TRUE),
sd(adidas$margen_operativo, na.rm = TRUE))
)
estadisticas_generales[, -1] <- round(estadisticas_generales[, -1], 2)
estadisticas_generales
## Variable Minimo Media Mediana Maximo Desv_Estandar
## 1 Precio por unidad 7.0 45.22 45.00 110.0 14.71
## 2 Unidades vendidas 0.0 256.93 176.00 1275.0 214.25
## 3 Ventas totales 0.0 12455.08 7803.50 82500.0 12716.39
## 4 Utilidad operativa 0.0 4894.79 3262.98 39000.0 4866.46
## 5 Margen operativo 0.1 0.42 0.41 0.8 0.10
Estas medidas permiten caracterizar el centro y la dispersion de cada variable. La comparacion entre media y mediana resulta util para detectar posibles asimetrias, mientras que la desviacion estandar muestra el grado de variabilidad presente en los datos.
ggplot(adidas, aes(x = ventas_total)) +
geom_histogram(bins = 30, fill = "steelblue", color = "white") +
scale_x_continuous(labels = comma) +
labs(title = "Distribucion de las ventas totales",
x = "Ventas totales",
y = "Frecuencia") +
theme_minimal()
ggplot(adidas, aes(y = ventas_total)) +
geom_boxplot(fill = "orange", alpha = 0.7) +
scale_y_continuous(labels = comma) +
labs(title = "Boxplot de ventas totales",
y = "Ventas totales") +
theme_minimal()
ggplot(adidas, aes(x = utilidad_operativa)) +
geom_histogram(bins = 30, fill = "darkgreen", color = "white") +
scale_x_continuous(labels = comma) +
labs(title = "Distribucion de la utilidad operativa",
x = "Utilidad operativa",
y = "Frecuencia") +
theme_minimal()
ggplot(adidas, aes(y = margen_operativo)) +
geom_boxplot(fill = "purple", alpha = 0.7) +
labs(title = "Boxplot del margen operativo",
y = "Margen operativo") +
theme_minimal()
Los graficos anteriores permiten visualizar la forma de la distribucion de las variables, detectar posibles valores atipicos e identificar si existe alta variabilidad en el desempeno comercial y financiero de Adidas.
ventas_region <- adidas %>%
group_by(region) %>%
summarise(ventas = sum(ventas_total, na.rm = TRUE)) %>%
arrange(desc(ventas))
ventas_region
## # A tibble: 5 × 2
## region ventas
## <fct> <dbl>
## 1 West 36436157
## 2 Northeast 25078267
## 3 Southeast 21374436
## 4 South 20603356
## 5 Midwest 16674434
ggplot(ventas_region, aes(x = reorder(region, ventas), y = ventas)) +
geom_col(fill = "royalblue") +
coord_flip() +
scale_y_continuous(labels = comma) +
labs(title = "Ventas totales por region",
x = "Region",
y = "Ventas totales") +
theme_minimal()
ventas_producto <- adidas %>%
group_by(producto) %>%
summarise(ventas = sum(ventas_total, na.rm = TRUE)) %>%
arrange(desc(ventas))
ventas_producto
## # A tibble: 6 × 2
## producto ventas
## <fct> <dbl>
## 1 Men's Street Footwear 27680769
## 2 Women's Apparel 23870985
## 3 Men's Athletic Footwear 20577180
## 4 Women's Street Footwear 17201563
## 5 Men's Apparel 16520632
## 6 Women's Athletic Footwear 14315521
ggplot(ventas_producto, aes(x = reorder(producto, ventas), y = ventas)) +
geom_col(fill = "tomato") +
coord_flip() +
scale_y_continuous(labels = comma) +
labs(title = "Ventas totales por producto",
x = "Producto",
y = "Ventas totales") +
theme_minimal()
ventas_distribuidor <- adidas %>%
group_by(distribuidor) %>%
summarise(ventas = sum(ventas_total, na.rm = TRUE)) %>%
arrange(desc(ventas))
ventas_distribuidor
## # A tibble: 6 × 2
## distribuidor ventas
## <fct> <dbl>
## 1 West Gear 32409558
## 2 Foot Locker 29024945
## 3 Sports Direct 24616622
## 4 Kohl's 13512453
## 5 Walmart 10506085
## 6 Amazon 10096987
ggplot(ventas_distribuidor, aes(x = reorder(distribuidor, ventas), y = ventas)) +
geom_col(fill = "goldenrod") +
coord_flip() +
scale_y_continuous(labels = comma) +
labs(title = "Ventas totales por distribuidor",
x = "Distribuidor",
y = "Ventas totales") +
theme_minimal()
El analisis de ventas por segmento permite identificar cuales regiones, productos y distribuidores concentran una mayor participacion en los ingresos de la compania. Este resultado es clave para reconocer focos comerciales estrategicos.
utilidad_region <- adidas %>%
group_by(region) %>%
summarise(
utilidad = sum(utilidad_operativa, na.rm = TRUE),
margen_promedio = mean(margen_operativo, na.rm = TRUE)
) %>%
arrange(desc(utilidad))
utilidad_region
## # A tibble: 5 × 3
## region utilidad margen_promedio
## <fct> <dbl> <dbl>
## 1 West 13017584. 0.397
## 2 Northeast 9732774. 0.410
## 3 South 9221605. 0.467
## 4 Southeast 8393059. 0.419
## 5 Midwest 6859945. 0.435
ggplot(utilidad_region, aes(x = reorder(region, utilidad), y = utilidad)) +
geom_col(fill = "forestgreen") +
coord_flip() +
scale_y_continuous(labels = comma) +
labs(title = "Utilidad operativa por region",
x = "Region",
y = "Utilidad operativa") +
theme_minimal()
utilidad_producto <- adidas %>%
group_by(producto) %>%
summarise(
utilidad = sum(utilidad_operativa, na.rm = TRUE),
margen_promedio = mean(margen_operativo, na.rm = TRUE)
) %>%
arrange(desc(utilidad))
utilidad_producto
## # A tibble: 6 × 3
## producto utilidad margen_promedio
## <fct> <dbl> <dbl>
## 1 Men's Street Footwear 11629046. 0.446
## 2 Women's Apparel 9685221. 0.441
## 3 Men's Athletic Footwear 7437457. 0.403
## 4 Women's Street Footwear 6494017. 0.410
## 5 Men's Apparel 6381405. 0.413
## 6 Women's Athletic Footwear 5597822. 0.424
ggplot(utilidad_producto, aes(x = reorder(producto, utilidad), y = utilidad)) +
geom_col(fill = "seagreen") +
coord_flip() +
scale_y_continuous(labels = comma) +
labs(title = "Utilidad operativa por producto",
x = "Producto",
y = "Utilidad operativa") +
theme_minimal()
margen_metodo <- adidas %>%
group_by(metodo_venta) %>%
summarise(margen_promedio = mean(margen_operativo, na.rm = TRUE)) %>%
arrange(desc(margen_promedio))
margen_metodo
## # A tibble: 3 × 2
## metodo_venta margen_promedio
## <fct> <dbl>
## 1 Online 0.464
## 2 Outlet 0.395
## 3 In-store 0.356
ggplot(margen_metodo, aes(x = reorder(metodo_venta, margen_promedio), y = margen_promedio)) +
geom_col(fill = "mediumpurple") +
coord_flip() +
labs(title = "Margen promedio por metodo de venta",
x = "Metodo de venta",
y = "Margen promedio") +
theme_minimal()
Este analisis permite diferenciar entre segmentos que venden mas y segmentos que realmente generan mayor valor financiero. En consecuencia, resulta posible identificar no solo volumen comercial, sino tambien eficiencia y rentabilidad.
correlaciones <- adidas %>%
select(precio_unidad, unidades_vendidas, ventas_total, utilidad_operativa, margen_operativo) %>%
cor(use = "complete.obs")
round(correlaciones, 2)
## precio_unidad unidades_vendidas ventas_total
## precio_unidad 1.00 0.27 0.54
## unidades_vendidas 0.27 1.00 0.92
## ventas_total 0.54 0.92 1.00
## utilidad_operativa 0.50 0.87 0.94
## margen_operativo -0.14 -0.31 -0.30
## utilidad_operativa margen_operativo
## precio_unidad 0.50 -0.14
## unidades_vendidas 0.87 -0.31
## ventas_total 0.94 -0.30
## utilidad_operativa 1.00 -0.05
## margen_operativo -0.05 1.00
ggplot(adidas, aes(x = precio_unidad, y = unidades_vendidas)) +
geom_point(alpha = 0.5, color = "steelblue") +
geom_smooth(method = "lm", se = FALSE, color = "red") +
labs(title = "Relacion entre precio por unidad y unidades vendidas",
x = "Precio por unidad",
y = "Unidades vendidas") +
theme_minimal()
ggplot(adidas, aes(x = ventas_total, y = utilidad_operativa)) +
geom_point(alpha = 0.5, color = "darkgreen") +
geom_smooth(method = "lm", se = FALSE, color = "red") +
scale_x_continuous(labels = comma) +
scale_y_continuous(labels = comma) +
labs(title = "Relacion entre ventas totales y utilidad operativa",
x = "Ventas totales",
y = "Utilidad operativa") +
theme_minimal()
La exploracion de estas relaciones permite evaluar si precios mas altos se asocian con cambios en el volumen vendido y si un mayor nivel de ventas se traduce efectivamente en una mayor utilidad operativa.
combo_producto_region <- adidas %>%
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(utilidad))
head(combo_producto_region, 10)
## # A tibble: 10 × 5
## producto region ventas utilidad margen_promedio
## <fct> <fct> <dbl> <dbl> <dbl>
## 1 Men's Street Footwear Northeast 6841324 3030663. 0.461
## 2 Men's Street Footwear West 7389988 2907503. 0.425
## 3 Women's Apparel South 4224937 2199137. 0.539
## 4 Men's Athletic Footwear West 6761339 2154211. 0.367
## 5 Women's Street Footwear West 5748586 2142439. 0.404
## 6 Women's Apparel West 7038046 2096258. 0.345
## 7 Men's Apparel West 4827378 2009555. 0.437
## 8 Men's Street Footwear Southeast 4693836 2003886. 0.453
## 9 Men's Street Footwear Midwest 4707360 1948621. 0.442
## 10 Women's Apparel Northeast 5045208 1917008. 0.416
combo_producto_metodo <- adidas %>%
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(utilidad))
head(combo_producto_metodo, 10)
## # A tibble: 10 × 5
## producto metodo_venta ventas utilidad margen_promedio
## <fct> <fct> <dbl> <dbl> <dbl>
## 1 Men's Street Footwear Online 10365158 4715551. 0.485
## 2 Women's Apparel Online 8966155 4104331. 0.488
## 3 Men's Street Footwear In-store 8885200 3486710 0.384
## 4 Men's Street Footwear Outlet 8430411 3426785. 0.419
## 5 Men's Athletic Footwear Online 7625859 3143928. 0.444
## 6 Women's Apparel Outlet 7879955 2952377. 0.403
## 7 Women's Street Footwear Online 6303273 2634900. 0.451
## 8 Women's Apparel In-store 7024875 2628512. 0.377
## 9 Men's Apparel Online 6334120 2626915. 0.452
## 10 Women's Athletic Footwear Online 5371092 2326915. 0.464
Estas combinaciones permiten identificar segmentos particularmente estrategicos para Adidas, al integrar simultaneamente una perspectiva comercial y una perspectiva de rentabilidad.
A partir del analisis descriptivo y diagnostico realizado, es posible identificar varios hallazgos relevantes. En primer lugar, las ventas y la utilidad operativa no necesariamente se distribuyen de forma homogenea entre regiones, productos y distribuidores, lo que sugiere una alta concentracion del desempeno en ciertos segmentos especificos.
En segundo lugar, el analisis de rentabilidad permite diferenciar entre segmentos con alto volumen comercial y segmentos con mayor eficiencia financiera. Esto resulta especialmente importante, ya que vender mas no siempre implica ser mas rentable.
En tercer lugar, la relacion entre precio por unidad y unidades vendidas aporta evidencia para evaluar posibles efectos de sensibilidad al precio, mientras que la relacion entre ventas totales y utilidad operativa permite verificar si el crecimiento comercial esta acompanado por una generacion efectiva de valor.
Finalmente, el analisis de combinaciones estrategicas evidencia que la interaccion entre producto, region y metodo de venta puede ofrecer una perspectiva mas robusta que el analisis aislado de cada variable.
El analisis realizado demuestra que la informacion comercial y financiera de Adidas permite construir una vision integral del desempeno empresarial. A traves de estadisticas descriptivas, comparaciones por segmentos y visualizaciones, se logro identificar patrones de comportamiento relevantes en ventas y rentabilidad.
Desde una perspectiva prescriptiva, se recomienda priorizar aquellos productos, regiones y metodos de venta que combinen simultaneamente altos niveles de ventas, utilidad operativa y margen promedio. Asimismo, conviene revisar aquellos segmentos que, pese a generar ingresos importantes, presenten rentabilidades relativamente bajas, ya que podrian estar absorbiendo recursos sin aportar proporcionalmente al resultado financiero.
De igual manera, se sugiere fortalecer las estrategias comerciales en las combinaciones producto-region y producto-metodo de venta que evidencien mejor desempeno. Finalmente, este tipo de analisis puede servir como base para futuros ejercicios de analitica predictiva, orientados a estimar demanda, rentabilidad o desempeno comercial futuro.