En un mundo en constante evolución, las tendencias de compra desempeñan un papel crucial al reflejar no solo las preferencias individuales, sino también los cambios culturales y económicos en curso. El estudio de las “Shopping Trends” o tendencias de compra se ha vuelto fundamental para comprender el comportamiento del consumidor, el impacto de la tecnología en los hábitos de compra y las dinámicas comerciales en constante transformación.
Este dataset ofrece información valiosa sobre el comportamiento del consumidor y los patrones de compra. Comprender las preferencias y tendencias de los clientes es fundamental para que las empresas adapten sus productos, estrategias de marketing y experiencia general del cliente.
library(readxl)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ forcats 1.0.0 ✔ readr 2.1.4
## ✔ ggplot2 3.4.4 ✔ stringr 1.5.0
## ✔ lubridate 1.9.3 ✔ tibble 3.2.1
## ✔ purrr 1.0.2 ✔ tidyr 1.3.0
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag() masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(ggplot2)
library(gplots)
##
## Attaching package: 'gplots'
##
## The following object is masked from 'package:stats':
##
## lowess
library(matrixStats)
##
## Attaching package: 'matrixStats'
##
## The following object is masked from 'package:dplyr':
##
## count
library(DescTools)
## Registered S3 method overwritten by 'DescTools':
## method from
## reorder.factor gplots
##
## Attaching package: 'DescTools'
##
## The following object is masked from 'package:gplots':
##
## reorder.factor
setwd("C:/Users/ronaldo/Desktop/Directorio R/Foro/archive (3)")
getwd()
## [1] "C:/Users/ronaldo/Desktop/Directorio R/Foro/archive (3)"
shopping_trends=read.csv("shopping_trends.csv", sep=",", header=TRUE)
head(shopping_trends)
## Customer.ID Age Gender Item.Purchased Category Purchase.Amount..USD.
## 1 1 55 Male Blouse Clothing 53
## 2 2 19 Male Sweater Clothing 64
## 3 3 50 Male Jeans Clothing 73
## 4 4 21 Male Sandals Footwear 90
## 5 5 45 Male Blouse Clothing 49
## 6 6 46 Male Sneakers Footwear 20
## Location Size Color Season Review.Rating Subscription.Status
## 1 Kentucky L Gray Winter 3.1 Yes
## 2 Maine L Maroon Winter 3.1 Yes
## 3 Massachusetts S Maroon Spring 3.1 Yes
## 4 Rhode Island M Maroon Spring 3.5 Yes
## 5 Oregon M Turquoise Spring 2.7 Yes
## 6 Wyoming M White Summer 2.9 Yes
## Payment.Method Shipping.Type Discount.Applied Promo.Code.Used
## 1 Credit Card Express Yes Yes
## 2 Bank Transfer Express Yes Yes
## 3 Cash Free Shipping Yes Yes
## 4 PayPal Next Day Air Yes Yes
## 5 Cash Free Shipping Yes Yes
## 6 Venmo Standard Yes Yes
## Previous.Purchases Preferred.Payment.Method Frequency.of.Purchases
## 1 14 Venmo Fortnightly
## 2 2 Cash Fortnightly
## 3 23 Credit Card Weekly
## 4 49 PayPal Weekly
## 5 31 PayPal Annually
## 6 14 Venmo Weekly
dim(shopping_trends)
## [1] 3900 19
str(shopping_trends)
## 'data.frame': 3900 obs. of 19 variables:
## $ Customer.ID : int 1 2 3 4 5 6 7 8 9 10 ...
## $ Age : int 55 19 50 21 45 46 63 27 26 57 ...
## $ Gender : chr "Male" "Male" "Male" "Male" ...
## $ Item.Purchased : chr "Blouse" "Sweater" "Jeans" "Sandals" ...
## $ Category : chr "Clothing" "Clothing" "Clothing" "Footwear" ...
## $ Purchase.Amount..USD. : int 53 64 73 90 49 20 85 34 97 31 ...
## $ Location : chr "Kentucky" "Maine" "Massachusetts" "Rhode Island" ...
## $ Size : chr "L" "L" "S" "M" ...
## $ Color : chr "Gray" "Maroon" "Maroon" "Maroon" ...
## $ Season : chr "Winter" "Winter" "Spring" "Spring" ...
## $ Review.Rating : num 3.1 3.1 3.1 3.5 2.7 2.9 3.2 3.2 2.6 4.8 ...
## $ Subscription.Status : chr "Yes" "Yes" "Yes" "Yes" ...
## $ Payment.Method : chr "Credit Card" "Bank Transfer" "Cash" "PayPal" ...
## $ Shipping.Type : chr "Express" "Express" "Free Shipping" "Next Day Air" ...
## $ Discount.Applied : chr "Yes" "Yes" "Yes" "Yes" ...
## $ Promo.Code.Used : chr "Yes" "Yes" "Yes" "Yes" ...
## $ Previous.Purchases : int 14 2 23 49 31 14 49 19 8 4 ...
## $ Preferred.Payment.Method: chr "Venmo" "Cash" "Credit Card" "PayPal" ...
## $ Frequency.of.Purchases : chr "Fortnightly" "Fortnightly" "Weekly" "Weekly" ...
summary(shopping_trends)
## Customer.ID Age Gender Item.Purchased
## Min. : 1.0 Min. :18.00 Length:3900 Length:3900
## 1st Qu.: 975.8 1st Qu.:31.00 Class :character Class :character
## Median :1950.5 Median :44.00 Mode :character Mode :character
## Mean :1950.5 Mean :44.07
## 3rd Qu.:2925.2 3rd Qu.:57.00
## Max. :3900.0 Max. :70.00
## Category Purchase.Amount..USD. Location Size
## Length:3900 Min. : 20.00 Length:3900 Length:3900
## Class :character 1st Qu.: 39.00 Class :character Class :character
## Mode :character Median : 60.00 Mode :character Mode :character
## Mean : 59.76
## 3rd Qu.: 81.00
## Max. :100.00
## Color Season Review.Rating Subscription.Status
## Length:3900 Length:3900 Min. :2.50 Length:3900
## Class :character Class :character 1st Qu.:3.10 Class :character
## Mode :character Mode :character Median :3.70 Mode :character
## Mean :3.75
## 3rd Qu.:4.40
## Max. :5.00
## Payment.Method Shipping.Type Discount.Applied Promo.Code.Used
## Length:3900 Length:3900 Length:3900 Length:3900
## Class :character Class :character Class :character Class :character
## Mode :character Mode :character Mode :character Mode :character
##
##
##
## Previous.Purchases Preferred.Payment.Method Frequency.of.Purchases
## Min. : 1.00 Length:3900 Length:3900
## 1st Qu.:13.00 Class :character Class :character
## Median :25.00 Mode :character Mode :character
## Mean :25.35
## 3rd Qu.:38.00
## Max. :50.00
El conjunto de datos presenta una diversidad de clientes en cuanto a edad y género. La estacionalidad, calificaciones, etc… Este análisis destaca áreas clave para futuras investigaciones, como la exploración de categorías específicas de productos y la segmentación geográfica de los clientes.
Podemos ver en el resumen que la edad de los clientes varía entre 18 y 70 años, con una mediana de 44 años y una media de 44.07 años. La distribución es relativamente uniforme, con un rango intercuartílico (IQR) de 26 años.
Las calificaciones de productos oscilan entre 2.5 y 5.0, con una mediana de 3.7 y una media de 3.75. La mayoría de las calificaciones se encuentran en el extremo superior, indicando generalmente una satisfacción positiva del cliente.
Los montos de compra oscilan entre $20 y $100, con una mediana de $60 y una media de $59.76. La distribución sugiere que la mayoría de las transacciones se encuentran en el rango intermedio, con algunos valores extremos.
Conocer que tipo de cosas las personas compran mas siempre es importante para hacer un analisis de ventas, por tanto con este set de datos podemos calcular las frecuencias en base a las categorias
Frecuencia_Absoluta_Cat = table(shopping_trends$Category)
print(Frecuencia_Absoluta_Cat)
##
## Accessories Clothing Footwear Outerwear
## 1240 1737 599 324
Frecuencia_Relativa_Cat = prop.table(Frecuencia_Absoluta_Cat)*100
print(Frecuencia_Relativa_Cat)
##
## Accessories Clothing Footwear Outerwear
## 31.794872 44.538462 15.358974 8.307692
barplot(table(shopping_trends$Category), col= "green", main = "Frecuencia de Compras por Categoría", xlab = "Categoría", ylab = "Frecuencia")
El desglose de compras en diferentes categorías revela patrones interesantes en las preferencias de los clientes. Entre las opciones disponibles, la categoría de “Clothing” es la más popular, con 1,737 compras, seguida de cerca por “Accessories” con 1,240 transacciones. “Footwear” se encuentra en tercer lugar con 599 compras, mientras que “Outerwear” tiene la menor participación con 324 transacciones. Esta distribución sugiere una fuerte inclinación hacia prendas de vestir y accesorios en comparación con calzado y prendas exteriores.
Ajustar las estrategias de precios, promociones y ofertas para satisfacer mejor las expectativas y comportamientos de compra de los clientes puede optimizar la gestión de inventario, personalizar estrategias de marketing y ofrecer experiencias de compra más alineadas con las preferencias de los consumidores.
Calcular la media, mediana y demas datos estadisticos del “Purchase.Amount..USD.” proporciona una visión integral de la distribución de los montos de compra, lo que resulta crucial para comprender y tomar decisiones informadas en el ámbito comercial.
summary(shopping_trends$Purchase.Amount..USD.)
## Min. 1st Qu. Median Mean 3rd Qu. Max.
## 20.00 39.00 60.00 59.76 81.00 100.00
La mediana de $60.00 y la media de $59.76 están cercanas, indicando que la distribución es relativamente simétrica. Esta simetría implica que hay una cantidad sustancial de transacciones que se ubican alrededor del centro de la distribución
hist(shopping_trends$Purchase.Amount..USD.,
col = "skyblue",
border = "darkblue",
main = "Histograma de Monto de Compra",
xlab = "Monto de Compra (USD)",
ylab = "Frecuencia",
breaks = 20)
# Línea para la media
abline(v = mean(shopping_trends$Purchase.Amount..USD.), col = "green", lwd = 2)
# Línea para la mediana
abline(v = median(shopping_trends$Purchase.Amount..USD.), col = "red", lwd = 2)
# Calcular la moda
moda <- mode(shopping_trends$Purchase.Amount..USD.)
# Añadir líneas verticales para la moda
abline(v = moda, col = "blue", lty = 2, lwd = 2)
# Agregar leyendas
legend("topright", legend = c("Media", "Mediana", "Moda"), col = c("green", "red", "blue"), lwd = 2)
# Relaciones
El genero puede ser un valor determinante en las compras. por lo cual puede resultar interesante entener como puede llegar a relacionarse el genero con el monto de las ventas
t.test(Purchase.Amount..USD.~Gender, shopping_trends)
##
## Welch Two Sample t-test
##
## data: Purchase.Amount..USD. by Gender
## t = 0.88214, df = 2479.1, p-value = 0.3778
## alternative hypothesis: true difference in means between group Female and group Male is not equal to 0
## 95 percent confidence interval:
## -0.8719417 2.2979409
## sample estimates:
## mean in group Female mean in group Male
## 60.2492 59.5362
boxplot(Purchase.Amount..USD.~Gender, shopping_trends, horizontal=TRUE, border=c("blue", "pink"))
plotmeans(Purchase.Amount..USD.~Gender, shopping_trends)
t-test indica que no hay evidencia significativa para afirmar que existe una diferencia real en los promedios de compra entre los grupos de género femenino y masculino. El valor p del test es 0.3778, lo que sugiere que no hay suficiente evidencia para rechazar la hipótesis nula de que la verdadera diferencia en los promedios entre los grupos es igual a cero.
Validamos como impacta las estaciones en las ventas
modelo_lineal = lm(shopping_trends$Purchase.Amount..USD.~as.factor(Season), shopping_trends)
summary(modelo_lineal)
##
## Call:
## lm(formula = shopping_trends$Purchase.Amount..USD. ~ as.factor(Season),
## data = shopping_trends)
##
## Residuals:
## Min 1Q Median 3Q Max
## -41.557 -20.738 -0.357 20.595 41.595
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 61.5569 0.7577 81.238 < 2e-16 ***
## as.factor(Season)Spring -2.8192 1.0651 -2.647 0.00816 **
## as.factor(Season)Summer -3.1517 1.0772 -2.926 0.00346 **
## as.factor(Season)Winter -1.1996 1.0727 -1.118 0.26353
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 23.66 on 3896 degrees of freedom
## Multiple R-squared: 0.002876, Adjusted R-squared: 0.002108
## F-statistic: 3.746 on 3 and 3896 DF, p-value: 0.01058
Aunque hay algunas diferencias significativas entre las estaciones, el modelo en su conjunto no parece explicar bien la variabilidad en las compras.
modelo_lineal = lm(log(shopping_trends$Purchase.Amount..USD.)~as.factor(Season), shopping_trends)
summary(modelo_lineal)
##
## Call:
## lm(formula = log(shopping_trends$Purchase.Amount..USD.) ~ as.factor(Season),
## data = shopping_trends)
##
## Residuals:
## Min 1Q Median 3Q Max
## -1.03661 -0.33774 0.08586 0.38650 0.63059
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.03235 0.01440 280.037 < 2e-16 ***
## as.factor(Season)Spring -0.05702 0.02024 -2.817 0.00487 **
## as.factor(Season)Summer -0.05776 0.02047 -2.822 0.00480 **
## as.factor(Season)Winter -0.02175 0.02038 -1.067 0.28602
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.4496 on 3896 degrees of freedom
## Multiple R-squared: 0.002964, Adjusted R-squared: 0.002196
## F-statistic: 3.861 on 3 and 3896 DF, p-value: 0.009025
La transformación logarítmica de la variable de respuesta parece no mejorar significativamente la capacidad del modelo para explicar la variabilidad en los datos, ya que el R cuadrado múltiple y ajustado son muy bajos. Además, los coeficientes para las estaciones no son estadísticamente significativos, lo que sugiere que la estación no tiene un impacto significativo en el logaritmo de la cantidad de compra.
ggplot(shopping_trends, aes(x = as.factor(Season), y = log(Purchase.Amount..USD.))) +
geom_boxplot(fill = "lightgreen", color = "darkgreen") +
labs(title = "Boxplot de la Cantidad de Compra por Estación",
x = "Estación",
y = "Log(Cantidad de Compra en USD)") +
theme_minimal()