Introducción

El presente informe muestra un desglose detallado del desempeño en ventas de calzado deportivo en los diferentes canales de venta de la Compañia ADIDAS en los Estados Unidos. Los datos incluyen variables clave como el precio por unidad, el volumen de ventas, las ventas totales, la utilidad operativa y el margen operativo, lo que permite evaluar la rentabilidad y eficiencia de cada punto de venta.

A partir de esta información, es posible identificar tendencias en el comportamiento de los consumidores, comparar el rendimiento entre diferentes canales de comercialización, y analizar cómo influyen factores como la región, el método de venta (tienda física u outlet) y las estrategias de precios en los resultados financieros.

Este análisis servirá como base para reconocer fortalezas, detectar áreas de mejora y apoyar la toma de decisiones estratégicas orientadas a optimizar la rentabilidad del negocio en el mercado de calzado deportivo.

Análisis exploratorio

El análisis exploratorio de datos (EDA) es un paso clave para comprender la información de venta de calzado deportivo masculino, para identificar patrones y evaluar la distribución de las variables.

PASO 1. Instalar y cargar librerias

# Cargar librerías necesarias
library(readxl)
library(dplyr)
library(ggplot2)
library(plotly)
library(knitr)
library(kableExtra)
library(tidyr)
library(RecordLinkage)
library(leaflet)
library(htmltools)
library(DT)

Cargar base de datos

library(readxl)
datos<- read_excel("Adidas.xlsx")

Ahora obtenemos los nombres exactos de las variables que tenemos en la base de datos

library(dplyr)
names(datos)
##  [1] "retailer"         "Region"           "State"            "City"            
##  [5] "Product"          "price_per_unit"   "units_sold"       "total_sales"     
##  [9] "operating_profit" "operating_margin" "sales_method"
##Registros totales para tipo de calzado 
length(datos)
## [1] 11
## Se calcula la mediana del precio, unidades vendidas, utilidad operativa y el margen operativo de la linea calzado deportivo y se colocan los datos en una tabla o dataframe

cantidad_ventas= length(datos$retailer)
mediana_precio= median(datos$price_per_unit,na.rm=TRUE)
mediana_unidadesvendidas= median(datos$units_sold,na.rm =TRUE)
mediana_utilidadopeativa= median(datos$operating_profit,na.rm=TRUE)

resultado_med=data.frame(cantidad_ventas,mediana_precio,mediana_unidadesvendidas,mediana_utilidadopeativa)
resultado_med
cantidad_ventas mediana_precio mediana_unidadesvendidas mediana_utilidadopeativa
9648 45 176 3262.98
### Indicadores de centralidad y variabilidad para la variable "precio"

promedio_precio=mean(datos$price_per_unit,na.rm = TRUE)
mediana_precio=median(datos$price_per_unit,na.rm = TRUE)
minimo_precio=min(datos$price_per_unit,na.rm = TRUE)
maximo_precio=max(datos$price_per_unit,na.rm = TRUE)
desvest_precio=sd(datos$price_per_unit,na.rm = TRUE)

indic_precio=data.frame(promedio_precio,mediana_precio,minimo_precio,maximo_precio,desvest_precio)
indic_precio
promedio_precio mediana_precio minimo_precio maximo_precio desvest_precio
45.21663 45 7 110 14.7054
# Valores estadísticos generales
minimo_precio <- 7
maximo_precio <- 110
mediana_precio <- 45
promedio_precio <- 45.21663
desvest_precio <- 14.7054

# Estimación de Q1 y Q3
q1 <- promedio_precio - desvest_precio
q3 <- promedio_precio + desvest_precio

# Crear boxplot interactivo
fig <- plot_ly(
  type = "box",
  q1 = list(q1),
  median = list(mediana_precio),
  q3 = list(q3),
  lowerfence = list(minimo_precio),
  upperfence = list(maximo_precio),
  boxpoints = FALSE,
  name = "Precio Unitario",
  line = list(color = "blue"),
  fillcolor = "lightblue"
)

# Añadir anotaciones para mínimo, máximo, media y mediana
fig <- fig %>%
  add_annotations(x = 1, y = minimo_precio, text = paste("Mínimo:", minimo_precio),
                  showarrow = TRUE, arrowhead = 2, ax = 40, ay = 0) %>%
  add_annotations(x = 1, y = maximo_precio, text = paste("Máximo:", maximo_precio),
                  showarrow = TRUE, arrowhead = 2, ax = 40, ay = 0) %>%
  add_annotations(x = 1, y = mediana_precio, text = paste("Mediana:", mediana_precio),
                  showarrow = TRUE, arrowhead = 2, ax = -40, ay = 0) %>%
  add_annotations(x = 1, y = promedio_precio, text = paste("Media:", round(promedio_precio, 2)),
                  showarrow = TRUE, arrowhead = 2, ax = -40, ay = -30)

# Ajustar layout
fig <- fig %>%
  layout(title = "Boxplot Interactivo con Anotaciones",
         yaxis = list(title = "Precio"),
         xaxis = list(showticklabels = FALSE))

fig

Analisis por retailer ventas totales

# Crear gráfico directamente desde la base original
plot_ly(
  data = datos %>%
    group_by(retailer) %>%
    summarise(Total_Ventas = sum(total_sales, na.rm = TRUE)) %>%
    mutate(
      Ventas_Millones = round(Total_Ventas / 1e6, 2),
      Porcentaje = round((Total_Ventas / sum(Total_Ventas)) * 100, 1),
      Etiqueta = paste(retailer, "<br>", Ventas_Millones, "M", "<br>", Porcentaje, "%")
    ),
  labels = ~retailer,
  values = ~Total_Ventas,
  type = 'pie',
  text = ~Etiqueta,
  textinfo = 'text',
  hoverinfo = 'text',
  marker = list(line = list(color = '#FFFFFF', width = 1))
) %>%
  layout(
    title = 'Participación de Ventas por Retailer',
    showlegend = TRUE
  )

Revisados los datos de ADIDAS, el primer análisis basados en el total de la muestra es la participación en venta por tipo de canal (retailer), donde se evidencia que la mayor participación se concentra en West Gear lidera con 32.4 m, lo que representa 27% del total general, seguido por Foot Locker con 29.0 m (24%), Sports Direct 24.6 m (20%), Kohl’s tiene 13.5 m (11%), Walmart suma 10.5 m (9%), Amazon cierra con 10.0 m (8%). West Gear y Foot Locker concentran más de 50% de las ventas totales, lo que indica fuerte posicionamiento en el mercado.

Seleccionar una muestra del producto mas vendido por canal (retail)

Dada la base datos total y evidenciando la mayor participacion de venta por producto, el analisis se centrara en el producto mas vendido del portafolio : Men’s Street Footwear

El código siguiente carga un archivo de Excel con datos de ventas ADIDAS, les asigna un ID único a cada fila, y luego filtra elproducto Men’s Street Footwear.

# 1. Verificar los nombres de las columnas
colnames(datos)
##  [1] "retailer"         "Region"           "State"            "City"            
##  [5] "Product"          "price_per_unit"   "units_sold"       "total_sales"     
##  [9] "operating_profit" "operating_margin" "sales_method"
# 2. Filtrar por tipo de producto (ajusta el nombre de la columna)
sub_base <- datos %>%
  filter(Product == "Men's Street Footwear")

# Ver resultado
head(sub_base)
retailer Region State City Product price_per_unit units_sold total_sales operating_profit operating_margin sales_method
Foot Locker Northeast New York New York Men’s Street Footwear 50 1200 60000 30000 0.5 In-store
Foot Locker Northeast New York New York Men’s Street Footwear 50 1250 62500 31250 0.5 In-store
Foot Locker Northeast New York New York Men’s Street Footwear 50 1220 61000 30500 0.5 Outlet
Foot Locker Northeast New York New York Men’s Street Footwear 50 1200 60000 30000 0.5 Outlet
Foot Locker Northeast New York New York Men’s Street Footwear 60 1220 73200 36600 0.5 Outlet
Foot Locker Northeast New York New York Men’s Street Footwear 60 1250 75000 37500 0.5 Outlet

venta por canal de elproducto Men’s Street Footwear

ventas_retailer <- sub_base %>%
  group_by(retailer) %>%
  summarise(total_sales = sum(total_sales), .groups = "drop")

ggplot(ventas_retailer, aes(x = reorder(retailer, total_sales), y = total_sales, fill = retailer)) +
  geom_col(show.legend = FALSE) +
  geom_text(aes(label = round(total_sales, 2)), hjust = -0.2) +
  coord_flip() +
  labs(title = "Ventas del producto por retailer",
       x = "retailer", y = "Ventas Totales") +
  theme_minimal()

Foot Locker y West Gear juntos concentran más del 50% de las ventas de Men’s Street Footwear. Walmart y Amazon tienen baja participación, indicando menor foco en este segmento.

Venta por ciudad

# Filtrar Top 10 ciudades con mayores ventas del producto seleccionado
ventas_top10 <- sub_base %>%
  group_by(City) %>%
  summarise(total_sales = sum(total_sales), .groups = "drop") %>%
  arrange(desc(total_sales)) %>%
  slice_head(n = 10)

# Crear gráfico ordenado
p <- ggplot(ventas_top10, aes(x = reorder(City, total_sales), y = total_sales, text = paste("Ciudad:", City, "<br>Ventas:", total_sales))) +
  geom_col(fill = "#1f77b4") +
  geom_text(aes(label = round(total_sales, 2)), hjust = -0.2, size = 3) +
  coord_flip() +
  labs(title = "Top 10 ciudades con mayores ventas del producto",
       x = "Ciudad",
       y = "Ventas Totales") +
  theme_minimal()

# Convertir a interactivo con Plotly
ggplotly(p, tooltip = "text")

El grafico muestra el pareto de las ciudades con mayor venta de un total de 50 ciudades que reportaronb venta del producto. El 7% de la veta total del producto Men’s Street Footwear, fue vendido en la ciudad de New York en los diferentes canales de distribucion.

# Calcular promedios
avg_sales <- mean(datos$total_sales, na.rm = TRUE)
avg_margin <- mean(datos$operating_margin, na.rm = TRUE)

# Clasificar retailers por cuadrante
datos <- datos %>%
  mutate(cuadrante = case_when(
    total_sales >= avg_sales & operating_margin >= avg_margin ~ "Líderes",
    total_sales < avg_sales & operating_margin >= avg_margin ~ "Premium",
    total_sales >= avg_sales & operating_margin < avg_margin ~ "Riesgo",
    TRUE ~ "Bajo desempeño"
  ))

# Mostrar interpretación estratégica
interpretacion <- datos %>%
  group_by(cuadrante) %>%
  summarise(retailers = paste(retailer, collapse = ", "))

print("Clasificación estratégica por cuadrante:")
## [1] "Clasificación estratégica por cuadrante:"
print(interpretacion)
## # A tibble: 4 × 2
##   cuadrante      retailers                                                      
##   <chr>          <chr>                                                          
## 1 Bajo desempeño Foot Locker, Foot Locker, Foot Locker, Foot Locker, Foot Locke…
## 2 Líderes        Foot Locker, Foot Locker, Foot Locker, Foot Locker, Foot Locke…
## 3 Premium        Foot Locker, Foot Locker, Foot Locker, Foot Locker, West Gear,…
## 4 Riesgo         Foot Locker, Foot Locker, Foot Locker, Foot Locker, Foot Locke…
# Crear gráfico interactivo con cuadrantes
grafico <- plot_ly(datos, 
                   x = ~total_sales, 
                   y = ~operating_margin, 
                   size = ~total_sales,
                   color = ~cuadrante,
                   colors = c("green", "blue", "orange", "red"), # Colores para cuadrantes
                   text = ~paste("Retailer:", retailer,
                                 "<br>Ventas: $", round(total_sales/1000000, 1), "M",
                                 "<br>Margen:", operating_margin, "%",
                                 "<br>Cuadrante:", cuadrante),
                   hoverinfo = 'text',
                   type = 'scatter',
                   mode = 'markers') %>%
  layout(
    title = "Ventas vs Margen Operativo (Clasificación por Cuadrante)",
    xaxis = list(title = "Ventas Totales (USD)"),
    yaxis = list(title = "Margen Operativo (%)"),
    shapes = list(
      # Línea vertical promedio ventas
      list(type = "line", x0 = avg_sales, x1 = avg_sales, y0 = min(datos$operating_margin), y1 = max(datos$operating_margin),
           line = list(dash = 'dash', width = 1.5, color = 'gray')),
      # Línea horizontal promedio margen
      list(type = "line", x0 = min(datos$total_sales), x1 = max(datos$total_sales), y0 = avg_margin, y1 = avg_margin,
           line = list(dash = 'dash', width = 1.5, color = 'gray'))
    ),
    annotations = list(
      list(x = max(datos$total_sales)*0.9, y = max(datos$operating_margin)*0.95, text = "Líderes", showarrow = FALSE, font = list(size = 14, color = "green")),
      list(x = min(datos$total_sales)*1.2, y = max(datos$operating_margin)*0.95, text = "Premium", showarrow = FALSE, font = list(size = 14, color = "blue")),
      list(x = max(datos$total_sales)*0.9, y = min(datos$operating_margin)*1.05, text = "Riesgo", showarrow = FALSE, font = list(size = 14, color = "orange")),
      list(x = min(datos$total_sales)*1.2, y = min(datos$operating_margin)*1.05, text = "Bajo desempeño", showarrow = FALSE, font = list(size = 14, color = "red"))
    )
  )

grafico
# Datos
datos <- data.frame(
  retailer = c("Amazon", "Foot Locker", "Kohl's", "Sports Direct", "Walmart", "West Gear"),
  units_sold = c(54883, 159081, 66844, 124879, 41980, 145653),
  price_per_unit = c(51, 45, 42, 39, 47, 45),
  total_sales = c(2877127, 7538775, 2948898, 5162570, 2095205, 7058194)
)

# Ajustar un modelo lineal
modelo <- lm(units_sold ~ price_per_unit, data = datos)
pendiente <- coef(modelo)[2]
intercepto <- coef(modelo)[1]

# Generar puntos para la línea
linea <- data.frame(
  price_per_unit = seq(min(datos$price_per_unit), max(datos$price_per_unit), length.out = 100)
)
linea$units_sold <- predict(modelo, newdata = linea)

# Gráfico interactivo
grafico_regresion <- plot_ly() %>%
  add_trace(data = datos,
            x = ~price_per_unit,
            y = ~units_sold,
            text = ~paste("Retailer:", retailer,
                          "<br>Precio Unitario:", price_per_unit,
                          "<br>Unidades Vendidas:", units_sold,
                          "<br>Ventas Totales:", total_sales),
            mode = 'markers',
            type = 'scatter',
            color = ~retailer,
            size = ~total_sales,
            marker = list(sizemode = 'area', opacity = 0.7),
            name = "Retailers") %>%
  add_trace(data = linea,
            x = ~price_per_unit,
            y = ~units_sold,
            mode = 'lines',
            line = list(color = 'red', width = 2),
            name = "Tendencia") %>%
  layout(
    title = paste("Relación Precio vs Unidades Vendidas<br> Pendiente =", round(pendiente, 2)),
    xaxis = list(title = "Precio Promedio por Unidad"),
    yaxis = list(title = "Unidades Vendidas")
)

grafico_regresion
  1. Relación inversa clara: La pendiente negativa indica que, en promedio, por cada aumento de 1 unidad monetaria en el precio, se venden aproximadamente 5.159 unidades menos. Esto confirma que la demanda es sensible al precio

  2. Dispersión entre retailers: Hay puntos que se alejan de la línea de tendencia: Foot Locker y West Gear venden mucho más que otros con precios similares, lo que indica fuerte posicionamiento de marca o estrategias de marketing agresivas. Amazon y Walmart tienen precios altos, pero ventas bajas en comparación → posible pérdida de competitividad por precio.

  3. Patrón de demanda: Los precios más bajos (alrededor de 39-42) están asociados con mayores volúmenes vendidos, lo que sugiere que estrategias de precios bajos pueden aumentar ventas significativamente.

  4. Impacto en ingresos y rentabilidad: Reducir precios podría incrementar ventas, pero habría que evaluar si el incremento en volumen compensa la reducción de margen unitario.

Conclusiónes

Los datos muestran que el negocio tiene un margen operativo saludable y solido (45%). Enfocadfos solo en el producto Men’s Street Footwear (42%) pero existe dispersión entre retailers que indica áreas de mejora.

la dispersión entre canales sugiere que un mix de crecimiento en retailers de alto margen (Kohl’s, Foot Locker) y optimización en Walmart puede aumentar la utilidad total sin sacrificar volumen. Para canales de venta (retailers) con precios altos y bajas ventas (Amazon, Walmart), ajustar precios hacia la media (42-45), potenciar marketing, promociones, revisar estructura de costos, descuentos y comisiones podría mejorar su volumen. Para retailers exitosos en volumen con precios bajos (Sports Direct, Foot Locker), mantener precios competitivos parece clave, pero hay riesgo de erosión de margen. La relación es moderada, lo que indica que otros factores (marca, promociones, servicio) también influyen.