Introducion

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.

Librerias que estaremos utilizando

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

Directorio

Para inicar nuestro analisis asignamos nuestro directorio de trabajo

setwd("C:/Users/ronaldo/Desktop/Directorio R/Foro/archive (3)")
getwd()
## [1] "C:/Users/ronaldo/Desktop/Directorio R/Foro/archive (3)"

Carga DataSet

Explorar Set de datos

Validamos que los datos se hayan importado correctamente

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

Dimensiones de la tabla y su extructura

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 de los datos

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.

Calcular frecuencia

Calcular la frecuencia absoluta y relativa de las categorias

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

Vemos graficamente las frecuencias

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.

Ventas

Calcular el monto de las ventas de

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

histograma para vizualizar la media, mediana y moda graficamente

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

Relacionar el genero con las ventas

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.

Modelo de Regresion

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.

Tratamos de mejorar el modelo

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.

Grafica Cantidad de compra por estacion

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