# Cargar las bibliotecas necesarias
#install.packages("ggmap")
library(readxl)
library(dplyr)
library(ggplot2)
library(ggmap)
# Leer los datos desde el archivo Excel
datos <- read_excel("Adisol_Clientes.xlsx")
# Ver las primeras filas de los datos
head(datos)
## # A tibble: 6 × 7
## Cliente Dirección `Departamento cliente` Producto `Precio original ($)`
## <chr> <chr> <chr> <chr> <dbl>
## 1 Adam Bianchi 7116 Rub… Sonsonate ADISOL … 12.3
## 2 Zaria Lindberg 3836 Gol… Santa Ana ADI CRE… 30.0
## 3 Kai Swinburn 4063 Sys… Sonsonate ADIDUR … 67.9
## 4 Coby Newton 4211 Cha… Chalatenango ADIDUR … 104.
## 5 Ryleigh Rodrí… 610 Basi… Morazán ADISOL … 68.2
## 6 Chris Hartwell 326 Sens… San Salvador ADIDUR … 91.4
## # ℹ 2 more variables: Descuento <dbl>, `Precio con descuento` <dbl>
# Resumen estadístico de los precios y descuentos
summary(datos$`Precio con descuento`)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## -2.0 97.0 208.0 453.3 464.1 7525.5
# Análisis de la rentabilidad por producto
rentabilidad <- datos %>%
group_by(`Producto`) %>%
summarise(Ventas_Totales = sum(`Precio con descuento`),
Descuento_Medio = mean(`Descuento`),
Cantidad = n(),
Precio_Promedio = mean(`Precio con descuento`)) %>%
arrange(desc(Ventas_Totales))
# Ver los resultados del análisis de rentabilidad
print(rentabilidad)
## # A tibble: 14 × 5
## Producto Ventas_Totales Descuento_Medio Cantidad Precio_Promedio
## <chr> <dbl> <dbl> <int> <dbl>
## 1 ADIDUR INYECCIÓN 47683. 0.2 89 536.
## 2 ADIDUR LPL 44127. 0.2 78 566.
## 3 ADI 1 PLUS 40242. 0.2 82 491.
## 4 ADIBOND PLUS 37998. 0.2 65 585.
## 5 ADIDUR ANCLAJE 37633. 0.2 75 502.
## 6 ADISOL ROJO 34892. 0.2 87 401.
## 7 ADITECHO 34299. 0.2 77 445.
## 8 ADIPRIMER 33337. 0.2 66 505.
## 9 ADISOL BLANCO 32507. 0.2 80 406.
## 10 ADIBOND AZUL 29685. 0.2 72 412.
## 11 ADI CRETE 28124. 0.2 72 391.
## 12 ADISOL BLANCO AGUA L… 26880. 0.2 68 395.
## 13 ADIDUR GEL 26775. 0.2 69 388.
## 14 ADILATEX 23107. 0.2 73 317.
# Gráfico de barras de ventas totales por producto
ggplot(rentabilidad, aes(x = reorder(Producto, -Ventas_Totales), y = Ventas_Totales, fill = Producto)) +
geom_bar(stat = "identity") +
theme_minimal() +
labs(title = "Ventas Totales por Producto", x = "Producto", y = "Ventas Totales ($)") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
# Gráfico de dispersión para visualizar la relación entre el descuento y el precio promedio
ggplot(rentabilidad, aes(x = Descuento_Medio, y = Precio_Promedio)) +
geom_point(aes(color = Producto), size = 4) +
geom_smooth(method = "lm") +
labs(title = "Relación entre Descuento Medio y Precio Promedio por Producto",
x = "Descuento Medio", y = "Precio Promedio") +
theme_minimal()
## `geom_smooth()` using formula = 'y ~ x'
# Análisis por departamento
ventas_por_departamento <- datos %>%
group_by(`Departamento cliente`) %>%
summarise(Ventas_Totales = sum(`Precio con descuento`),
Cantidad_Ventas = n(),
Clientes_Únicos = n_distinct(Cliente)) %>%
arrange(desc(Ventas_Totales))
# Mostrar resultados
print(ventas_por_departamento)
## # A tibble: 13 × 4
## `Departamento cliente` Ventas_Totales Cantidad_Ventas Clientes_Únicos
## <chr> <dbl> <int> <int>
## 1 San Salvador 62007. 156 153
## 2 Sonsonate 56779. 100 97
## 3 San Vicente 52835. 80 79
## 4 San Miguel 34685. 75 70
## 5 Morazán 34099. 76 74
## 6 La Unión 32583. 70 70
## 7 Cabañas 31733. 72 72
## 8 La Paz 31067. 62 60
## 9 Chalatenango 30513. 79 78
## 10 Santa Ana 30306. 85 84
## 11 Cuscatlán 30215. 68 65
## 12 Usulután 26737. 58 56
## 13 La Libertad 23732. 72 71
# Gráfico de ventas totales por departamento
ggplot(ventas_por_departamento, aes(x = reorder(`Departamento cliente`, -Ventas_Totales), y = Ventas_Totales, fill = `Departamento cliente`)) +
geom_bar(stat = "identity") +
theme_minimal() +
labs(title = "Ventas Totales por Departamento", x = "Departamento", y = "Ventas Totales ($)") +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
# Análisis de concentración de clientes
clientes_por_departamento <- datos %>%
group_by(`Departamento cliente`, `Cliente`) %>%
summarise(Ventas_Totales_Cliente = sum(`Precio con descuento`)) %>%
ungroup() %>%
arrange(`Departamento cliente`, desc(Ventas_Totales_Cliente))
## `summarise()` has grouped output by 'Departamento cliente'. You can override
## using the `.groups` argument.
# Mostrar concentración de clientes top en cada departamento
print(clientes_por_departamento)
## # A tibble: 1,029 × 3
## `Departamento cliente` Cliente Ventas_Totales_Cliente
## <chr> <chr> <dbl>
## 1 Cabañas Jax Robert 3598
## 2 Cabañas Jarod Ralston 3561.
## 3 Cabañas Quinten Toro 1715.
## 4 Cabañas Rolando Hawes 1713.
## 5 Cabañas Mollie Petersson 1664.
## 6 Cabañas Lorelei Jackson 1071.
## 7 Cabañas Skye Boscawen 996.
## 8 Cabañas Rachael Pelletier 791.
## 9 Cabañas Gabriela Durden 736
## 10 Cabañas Randall Moreno 735.
## # ℹ 1,019 more rows
#las variables categóricas son tratadas adecuadamente
datos$Producto <- as.factor(datos$Producto)
datos$`Departamento cliente` <- as.factor(datos$`Departamento cliente`)
# Construir el modelo de regresión para predecir el Precio con descuento
modelo <- lm(`Precio con descuento` ~ Descuento + Producto + `Departamento cliente`, data = datos)
# Resumen del modelo para ver los resultados
summary(modelo)
##
## Call:
## lm(formula = `Precio con descuento` ~ Descuento + Producto +
## `Departamento cliente`, data = datos)
##
## Residuals:
## Min 1Q Median 3Q Max
## -700.4 -344.7 -209.4 39.4 7001.1
##
## Coefficients: (1 not defined because of singularities)
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 473.242 123.357 3.836 0.000132 ***
## Descuento NA NA NA NA
## ProductoADI CRETE -94.656 122.924 -0.770 0.441455
## ProductoADIBOND AZUL -67.251 123.142 -0.546 0.585100
## ProductoADIBOND PLUS 103.498 126.560 0.818 0.413676
## ProductoADIDUR ANCLAJE 25.197 121.244 0.208 0.835409
## ProductoADIDUR GEL -94.470 124.344 -0.760 0.447577
## ProductoADIDUR INYECCIÓN 37.641 116.235 0.324 0.746130
## ProductoADIDUR LPL 86.488 120.125 0.720 0.471703
## ProductoADILATEX -167.070 122.206 -1.367 0.171886
## ProductoADIPRIMER 48.095 125.940 0.382 0.702623
## ProductoADISOL BLANCO -64.845 119.615 -0.542 0.587855
## ProductoADISOL BLANCO AGUA LFG -79.018 125.067 -0.632 0.527658
## ProductoADISOL ROJO -86.636 117.036 -0.740 0.459315
## ProductoADITECHO -35.463 120.351 -0.295 0.768310
## `Departamento cliente`Chalatenango -55.934 123.215 -0.454 0.649960
## `Departamento cliente`Cuscatlán -12.580 128.418 -0.098 0.921983
## `Departamento cliente`La Libertad -126.871 126.543 -1.003 0.316294
## `Departamento cliente`La Paz 55.423 131.171 0.423 0.672730
## `Departamento cliente`La Unión 21.391 127.043 0.168 0.866320
## `Departamento cliente`Morazán 6.095 124.988 0.049 0.961116
## `Departamento cliente`San Miguel 30.099 125.126 0.241 0.809955
## `Departamento cliente`San Salvador -44.582 107.990 -0.413 0.679816
## `Departamento cliente`San Vicente 214.198 123.371 1.736 0.082826 .
## `Departamento cliente`Santa Ana -91.432 121.229 -0.754 0.450898
## `Departamento cliente`Sonsonate 118.423 116.974 1.012 0.311593
## `Departamento cliente`Usulután 13.504 133.765 0.101 0.919608
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 753.7 on 1027 degrees of freedom
## Multiple R-squared: 0.02269, Adjusted R-squared: -0.001096
## F-statistic: 0.9539 on 25 and 1027 DF, p-value: 0.5287
# Graficar los residuales para evaluar la adecuación del modelo
plot(modelo$residuals)
hist(modelo$residuals)
#Interpretación General del Modelo
Formula del Modelo: Precio con descuento ~ Descuento + Producto + Departamento cliente: El modelo intenta predecir el Precio con descuento basado en el Descuento aplicado, el tipo de Producto, y el Departamento cliente.
Residuales: Los residuales muestran una variación considerable, con un mínimo de -700.4 y un máximo de 7001.1. Esto indica una gran dispersión en los errores de predicción, y la presencia de valores extremos o outliers que pueden estar influyendo significativamente en el modelo.
Coeficientes: (Intercepto): El precio base con descuento, cuando todas las otras variables son cero, es de 473.242. Este es significativamente diferente de cero (p < 0.001). Descuento: No se define debido a singularidades, lo que podría indicar problemas de multicolinealidad o que esta variable no varía entre los datos. Productos y Departamentos: La mayoría de los coeficientes para productos y departamentos no son estadísticamente significativos (p > 0.05), con algunas excepciones como ProductoADISOL BLANCO AGUA LFG y Departamento clienteSan Vicente, que muestran p-values que se acercan a ser significativos.
4.Significancia de los Coeficientes: La mayoría de los coeficientes tienen un valor p alto, lo que indica que no son estadísticamente significativos. Esto sugiere que ni el tipo de producto ni el departamento son predictores fuertes del Precio con descuento.
Error Estándar Residual: El error estándar residual es bastante alto (753.7), lo que refleja la alta variabilidad de los residuos.
R-cuadrado y R-cuadrado Ajustado: R-cuadrado es 0.02269, lo que significa que solo aproximadamente el 2.27% de la variabilidad en el Precio con descuento es explicada por el modelo. R-cuadrado ajustado es incluso menor (-0.001096), indicando que el modelo no es adecuado y no mejora significativamente la predicción sobre la media general.
F-statistic y su p-value: El estadístico F es 0.9539 con un p-value de 0.5287, lo cual indica que el modelo en conjunto no es estadísticamente significativo. Esto sugiere que las variables incluidas en el modelo no proporcionan una buena explicación del Precio con descuento.
El modelo actual no parece ser efectivo para predecir el Precio con descuento basado en las variables proporcionadas. Las siguientes acciones podrían mejorar el modelo:
Revisar Datos: Verificar por errores, valores atípicos o inexactitudes en los datos. Explorar Otras Variables: Incluir otras variables que podrían tener un impacto en el Precio con descuento. Revisar Multicolinealidad: El hecho de que el coeficiente para Descuento no se haya definido sugiere que puede haber un problema de multicolinealidad que debe ser investigado. Modelo de Transformación: Considerar transformaciones de los datos o de la respuesta para mejorar la homogeneidad de los residuos y el ajuste del modelo.
Patrón de los Residuos: Aleatoriedad: Idealmente, los residuos deben estar distribuidos aleatoriamente alrededor de la línea horizontal en cero, sin mostrar patrones discernibles. En tu gráfico, la mayoría de los residuos se concentran cerca del cero, lo cual es un buen signo. Outliers: Hay algunos puntos que se desvían significativamente de la mayoría de los residuos, especialmente algunos con valores residuales muy altos (por encima de 2000 y hasta 6000). Estos pueden ser outliers o puntos influyentes que podrían estar afectando la precisión de tu modelo.
Homoscedasticidad: Los residuos deben mostrar varianza constante (homoscedasticidad) en diferentes rangos de valores predichos. Aunque no se muestra directamente la relación con los valores predichos en esta gráfica, no parece haber un patrón claro de cambio en la dispersión de los residuos a lo largo del índice, lo que generalmente es positivo. Sin embargo, los puntos extremos sugieren que podrían existir problemas en ciertos rangos.
Independencia: La independencia de los residuos es otro aspecto importante. Dado que el gráfico muestra los residuos ordenados por índice y no hay patrones obvios de secuencialidad o ciclos, esto puede indicar que los residuos son independientes entre sí, aunque este aspecto es mejor evaluado con pruebas estadísticas específicas o gráficas de autocorrelación.
Investigar Outliers: Dado que hay varios residuos que son considerablemente más altos que otros, sería útil examinar estos puntos para determinar si hay errores en los datos, si son casos atípicos legítimos, o si son influenciados por alguna especificidad no capturada por el modelo. Verificar Modelado: Considera si tu modelo necesita incorporar términos de interacción, transformaciones de variables (como logaritmos si los datos son muy sesgados), o si hay variables omitidas que podrían mejorar el modelo. Pruebas Adicionales: Realizar pruebas de diagnóstico adicionales como la prueba de Breusch-Pagan para la homoscedasticidad o la prueba de Durbin-Watson para la autocorrelación de los residuos.
El modelo parece comportarse adecuadamente en términos de la distribución general de los residuos, pero los outliers destacados necesitan ser investigados más a fondo para mejorar la robustez y precisión del modelo.