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.
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
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
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.
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.
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.