1 Introduccion

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.

2 Objetivos

2.1 Objetivo general

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.

2.2 Objetivos especificos

  • Describir el comportamiento de las principales variables numericas del caso.
  • Comparar el desempeno de ventas y rentabilidad por region, producto, distribuidor y metodo de venta.
  • Analizar la variabilidad de las ventas, la utilidad operativa y el margen operativo.
  • Explorar la relacion entre variables clave como precio por unidad, unidades vendidas, ventas totales y utilidad operativa.
  • Formular recomendaciones prescriptivas coherentes con la evidencia encontrada.

3 Librerias

library(readxl)
library(dplyr)
library(ggplot2)
library(janitor)
library(scales)
library(knitr)

4 Carga de datos

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.

5 Validacion interna de la base

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.

6 Estadisticas descriptivas generales

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.

7 Distribucion de variables clave

7.1 Distribucion de ventas totales

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()

7.2 Boxplot de ventas totales

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()

7.3 Distribucion de la utilidad operativa

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()

7.4 Boxplot del margen operativo

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.

8 Analisis descriptivo de ventas

8.1 Ventas totales por region

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()

8.2 Ventas totales por producto

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()

8.3 Ventas totales por distribuidor

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.

9 Analisis de rentabilidad

9.1 Utilidad operativa por region

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()

9.2 Utilidad operativa por producto

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()

9.3 Margen promedio por metodo de venta

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.

10 Relacion entre variables clave

10.1 Matriz de correlacion

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

10.2 Relacion entre precio por unidad y unidades vendidas

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()

10.3 Relacion entre ventas totales y utilidad operativa

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.

11 Combinaciones estrategicas

11.1 Producto y region

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

11.2 Producto y metodo de venta

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.

12 Principales hallazgos

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.

13 Conclusiones y recomendaciones

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.