Análisis de tendencias de compra y factores que influyen en el gasto del consumidor

PUNTO 5 (Análisis descriptivo y exploratorio de cada variable de la base de datos

1. VARIABLE: EDAD

# Cargar paquetes necesarios
if (!require("readxl")) install.packages("readxl", dependencies=TRUE)
## Cargando paquete requerido: readxl
## Warning: package 'readxl' was built under R version 4.4.3
if (!require("ggplot2")) install.packages("ggplot2", dependencies=TRUE)
## Cargando paquete requerido: ggplot2
## Warning: package 'ggplot2' was built under R version 4.4.3
if (!require("moments")) install.packages("moments", dependencies=TRUE)
## Cargando paquete requerido: moments
library(readxl)
library(ggplot2)
library(moments)
data <- read_excel("shopping_trends.xlsx")
age_data <- data$Age

Medidas de tendencia central

mean_age <- mean(age_data, na.rm = TRUE)
median_age <- median(age_data, na.rm = TRUE)
mode_age <- as.numeric(names(sort(table(age_data), decreasing = TRUE)[1]))

Medidas de dispersión

sd_age <- sd(age_data, na.rm = TRUE)
var_age <- var(age_data, na.rm = TRUE)
quartiles_age <- quantile(age_data, probs = c(0.25, 0.5, 0.75), na.rm = TRUE)

Medidas de forma

skewness_age <- skewness(age_data, na.rm = TRUE)
kurtosis_age <- kurtosis(age_data, na.rm = TRUE)

Mostrar resultados

cat("📊 Análisis de la variable Age:\n")
## 📊 Análisis de la variable Age:
cat("Media:", mean_age, "\n")
## Media: 44.06846
cat("Mediana:", median_age, "\n")
## Mediana: 44
cat("Moda:", mode_age, "\n")
## Moda: 69
cat("Desviación estándar:", sd_age, "\n")
## Desviación estándar: 15.20759
cat("Varianza:", var_age, "\n")
## Varianza: 231.2708
cat("Cuartiles:", quartiles_age, "\n")
## Cuartiles: 31 44 57
cat("Curtosis:", kurtosis_age, "\n")
## Curtosis: 1.804906

Visualización de los datos

Histograma

ggplot(data, aes(x = Age)) +
  geom_histogram(binwidth = 5, fill = "blue", color = "black", alpha = 0.7) +
  labs(title = "Histograma de la edad de los clientes", x = "Edad", y = "Frecuencia") +
  theme_minimal()

Boxplot para detección de valores atípicos

ggplot(data, aes(y = Age)) +
  geom_boxplot(fill = "lightblue", color = "black") +
  labs(title = "Boxplot de la edad de los clientes", y = "Edad")

Interpretación de la variable Edad (Age)

Media (44.07 años):La edad promedio de los clientes es de aproximadamente 44 años.
Mediana (44 años):La mitad de los clientes tiene una edad menor o igual a 44 años, lo que indica que la distribución de edades es bastante simétrica.

Moda (69 años): La edad más frecuente en la base de datos es 69 años, lo que sugiere la presencia de un grupo considerable de clientes en esa edad.

Desviación estándar (15.21): Indica que las edades de los clientes varían en promedio ±15 años respecto a la media. Esto sugiere una población diversa en términos de edad.

Varianza (231.27):Confirma una dispersión considerable en los datos, con edades que se alejan bastante de la media en algunos casos.

#Cuartiles:

  • El **primer cuartil (Q1 = 31 años): significa que el 25% de los clientes tiene 31 años o menos.

  • La **mediana (Q2 = 44 años) indica que el 50% de los clientes tiene 44 años o menos.

  • El tercer cuartil (Q3 = 57 años) muestra que el 75% de los clientes tiene hasta 57 años.

  • Esto indica que la mayoría de los clientes se encuentra entre los 31 y 57 años.

Conclusión:

  1. La mayoría de los clientes se encuentra entre 31 y 57 años, con una edad promedio de 44 años

  2. Existen algunos clientes mayores (ej. 69 años) que podrían estar sesgando ligeramente la distribución.

  3. Se recomienda revisar los valores extremos para evaluar su impacto en la estrategia de segmentación de clientes.

  4. Es posible que haya distintos patrones de compra según la edad, por lo que sería interesante analizar la relación entre la edad y otras variables como categoría de productos comprados, monto de compra o frecuencia de compra.

2. VARIABLE: GÉNERO (Gender)

gender_counts <- table(data$Gender)
gender_percent <- prop.table(gender_counts) * 100

Mostrar resultados

cat("📊 Distribución de Género:\n")
## 📊 Distribución de Género:
print(gender_counts)
## 
## Female   Male 
##   1248   2652
cat("\n📌 Porcentajes:\n")
## 
## 📌 Porcentajes:
print(round(gender_percent, 2))
## 
## Female   Male 
##     32     68

Gráfico de barras para visualizar la distribución de género

ggplot(data, aes(x = Gender)) +
  geom_bar(fill = "lightblue", color = "black") +
  labs(title = "Distribución de Género en los Clientes", x = "Género", y = "Frecuencia") +
  theme_minimal()

# Interpretación

La variable Gender (Género) es cualitativa nominal, lo que significa que no tiene valores numéricos para calcular medidas de tendencia central (media, mediana, moda) ni dispersión (desviación estándar, varianza).

La base de datos indica que los hombres representan la mayor parte de los clientes (68%), mientras que las mujeres conforman el 32%. Esto puede deberse a factores del mercado, estrategias comerciales o diferencias en hábitos de consumo. Se recomienda explorar cómo este patrón influye en otras variables como categoría de producto, monto gastado y frecuencia de compra para obtener una visión más completa del comportamiento del consumidor.

3. VARIABLE: Item Purchased

item_counts <- table(data$`Item Purchased`)
item_df <- as.data.frame(item_counts)
colnames(item_df) <- c("Item", "Count")
library(dplyr)  # Asegúrate de cargar dplyr antes
## Warning: package 'dplyr' was built under R version 4.4.3
## 
## Adjuntando el paquete: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
item_df <- item_df %>% arrange(desc(Count))
item_df$Percentage <- round((item_df$Count / sum(item_df$Count)) * 100, 2)

Mostrar los productos más comprados

cat("📊 Top 10 productos más comprados:\n")
## 📊 Top 10 productos más comprados:
print(head(item_df, 10))
##          Item Count Percentage
## 1      Blouse   171       4.38
## 2     Jewelry   171       4.38
## 3       Pants   171       4.38
## 4       Shirt   169       4.33
## 5       Dress   166       4.26
## 6     Sweater   164       4.21
## 7      Jacket   163       4.18
## 8        Belt   161       4.13
## 9        Coat   161       4.13
## 10 Sunglasses   161       4.13

Moda (Producto más comprado)

mode_item <- item_df$Item[1]
cat("\ Moda (Producto más comprado):", mode_item, "\n")
##  Moda (Producto más comprado): 3

Gráfico de barras

ggplot(item_df, aes(x = reorder(Item, -Count), y = Count)) +
  geom_bar(stat = "identity", fill = "steelblue", color = "black") +
  labs(title = "Distribución de Productos Comprados", x = "Producto", y = "Frecuencia") +
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

Conclusión

Blusas, joyería y pantalones son los productos más vendidos, cada uno con 171 compras (4.38% del total). Las prendas de vestir dominan la lista de los productos más comprados, lo que indica que la moda es un sector fuerte dentro del comercio minorista analizado.

Los datos sugieren que la ropa y los accesorios son altamente demandados.

4. VARIABLE: Category

library(readxl)    
library(dplyr)     
library(ggplot2)   
df <- read_excel("shopping_trends.xlsx")
category_summary <- df %>%
  group_by(Category) %>%
  summarise(Count = n()) %>%
  mutate(Percentage = (Count / sum(Count)) * 100) %>%
  arrange(desc(Count))
print(category_summary)
## # A tibble: 4 × 3
##   Category    Count Percentage
##   <chr>       <int>      <dbl>
## 1 Clothing     1737      44.5 
## 2 Accessories  1240      31.8 
## 3 Footwear      599      15.4 
## 4 Outerwear     324       8.31

Gráfico de barras para visualizar la distribución de categorías

ggplot(category_summary, aes(x = reorder(Category, -Count), y = Count, fill = Category)) +
  geom_bar(stat = "identity") +
  theme_minimal() +
  labs(title = "Distribución de Categorías de Productos", x = "Categoría", y = "Frecuencia") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  scale_fill_viridis_d()

Conclusión

  1. Predominio de la categoría “Clothing” (44.54%)

La mayoría de los productos adquiridos pertenecen a la categoría ropa (Clothing), lo que sugiere que los clientes tienen una mayor demanda por prendas de vestir en comparación con otros productos.

Este resultado puede estar relacionado con la necesidad frecuente de renovar el guardarropa o con la influencia de tendencias de moda.

  1. “Accessories” en segundo lugar (31.79%)

Los accesorios (Accessories) representan casi un tercio de las compras, lo que indica que los clientes también buscan complementar sus outfits con elementos como joyería, bolsos y gafas. Este dato podría estar relacionado con estrategias de compra impulsiva o con la compra de artículos que complementan otras adquisiciones.

  1. Menor demanda de “Footwear” (15.36%) y “Outerwear” (8.31%)

La categoría calzado (Footwear) tiene una demanda significativamente menor que la ropa y los accesorios. Esto puede deberse a que los zapatos suelen tener una vida útil más larga y no requieren una renovación tan frecuente.

La categoría Outerwear (Abrigos, chaquetas, etc.) es la menos adquirida, lo que podría explicarse por factores estacionales o climáticos, ya que las personas compran menos ropa de abrigo en comparación con otras prendas.

5. VARIABLE: Purchase Amount (USD)

install.packages(c("readxl", "ggplot2", "moments", "dplyr"))
## Warning: packages 'readxl', 'ggplot2', 'moments', 'dplyr' are in use and will
## not be installed
library(readxl)
library(ggplot2)
library(moments) 
library(dplyr)
df <- read_excel("shopping_trends.xlsx")
colnames(df)
##  [1] "Customer ID"              "Age"                     
##  [3] "Gender"                   "Item Purchased"          
##  [5] "Category"                 "Purchase Amount (USD)"   
##  [7] "Location"                 "Size"                    
##  [9] "Color"                    "Season"                  
## [11] "Review Rating"            "Subscription Status"     
## [13] "Payment Method"           "Shipping Type"           
## [15] "Discount Applied"         "Promo Code Used"         
## [17] "Previous Purchases"       "Preferred Payment Method"
## [19] "Frequency of Purchases"

Medidas de tendencia central

media <- mean(df$`Purchase Amount (USD)`, na.rm = TRUE)
mediana <- median(df$`Purchase Amount (USD)`, na.rm = TRUE)
moda <- as.numeric(names(sort(table(df$`Purchase Amount (USD)`), decreasing = TRUE)[1]))

Medidas de dispersión

desv_std <- sd(df$`Purchase Amount (USD)`, na.rm = TRUE)
varianza <- var(df$`Purchase Amount (USD)`, na.rm = TRUE)
cuartiles <- quantile(df$`Purchase Amount (USD)`, probs = c(0.25, 0.50, 0.75), na.rm = TRUE)

Medidas de forma

asimetria <- skewness(df$`Purchase Amount (USD)`, na.rm = TRUE)
curtosis <- kurtosis(df$`Purchase Amount (USD)`, na.rm = TRUE)

Mostrar resultados

cat(" Análisis Descriptivo de 'Purchase Amount (USD)'\n")
##  Análisis Descriptivo de 'Purchase Amount (USD)'
cat("Media:", media, "\n")
## Media: 59.76436
cat("Mediana:", mediana, "\n")
## Mediana: 60
cat("Moda:", moda, "\n")
## Moda: 32
cat("Desviación Estándar:", desv_std, "\n")
## Desviación Estándar: 23.68539
cat("Varianza:", varianza, "\n")
## Varianza: 560.9978
cat("Cuartiles:", cuartiles, "\n")
## Cuartiles: 39 60 81
cat("Asimetría:", asimetria, "\n")
## Asimetría: 0.01269687
cat("Curtosis:", curtosis, "\n")
## Curtosis: 1.763453

📈 Histogramas

ggplot(df, aes(x = `Purchase Amount (USD)`)) +
  geom_histogram(binwidth = 10, fill = "blue", color = "black", alpha = 0.7) +
  labs(title = "Histograma de Purchase Amount (USD)", x = "Monto de Compra (USD)", y = "Frecuencia") +
  theme_minimal()

Boxplot para detección de valores atípicos

ggplot(df, aes(y = `Purchase Amount (USD)`)) +
  geom_boxplot(fill = "red", color = "black", alpha = 0.6) +
  labs(title = "Boxplot de Purchase Amount (USD)", y = "Monto de Compra (USD)") +
  theme_minimal()

Conclusión

6. VARIABLE: Location

location_summary <- df %>%
  group_by(Location) %>%
  summarise(Count = n()) %>%
  mutate(Percentage = (Count / sum(Count)) * 100) %>%
  arrange(desc(Count)) %>%
  head(10)  

Mostrar la tabla de resultados

print(location_summary)
## # A tibble: 10 × 3
##    Location   Count Percentage
##    <chr>      <int>      <dbl>
##  1 Montana       96       2.46
##  2 California    95       2.44
##  3 Idaho         93       2.38
##  4 Illinois      92       2.36
##  5 Alabama       89       2.28
##  6 Minnesota     88       2.26
##  7 Nebraska      87       2.23
##  8 Nevada        87       2.23
##  9 New York      87       2.23
## 10 Delaware      86       2.21
location_summary <- df %>%
  group_by(Location) %>%
  summarise(Count = n()) %>%
  mutate(Percentage = (Count / sum(Count)) * 100) %>%
  arrange(desc(Count)) %>%
  head(15)  
print(location_summary)
## # A tibble: 15 × 3
##    Location     Count Percentage
##    <chr>        <int>      <dbl>
##  1 Montana         96       2.46
##  2 California      95       2.44
##  3 Idaho           93       2.38
##  4 Illinois        92       2.36
##  5 Alabama         89       2.28
##  6 Minnesota       88       2.26
##  7 Nebraska        87       2.23
##  8 Nevada          87       2.23
##  9 New York        87       2.23
## 10 Delaware        86       2.21
## 11 Maryland        86       2.21
## 12 Vermont         85       2.18
## 13 Louisiana       84       2.15
## 14 North Dakota    83       2.13
## 15 Missouri        81       2.08
ggplot(location_summary, aes(x = reorder(Location, -Count), y = Percentage, fill = Location)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = sprintf("%.1f%%", Percentage)), vjust = -0.3, size = 4.5) + # Etiquetas
  theme_minimal() +
  labs(title = "Top 15 Ubicaciones de Compra",
       x = "Ubicación",
       y = "Porcentaje de Compras (%)") +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
  guides(fill = "none")  # Eliminar leyenda de colores

Conclusión

Asi pues, el comportamiento de compra varía según la ubicación, pero no hay una concentración excesiva en un solo estado. Esto sugiere que los productos vendidos pueden tener demanda en diversas partes del país sin una dominancia clara de mercados urbanos o rurales.

7. VARIABLE: Size

size_summary <- df %>%
  group_by(Size) %>%
  summarise(Count = n()) %>%
  mutate(Percentage = (Count / sum(Count)) * 100) %>%
  arrange(desc(Count))
print(size_summary)
## # A tibble: 4 × 3
##   Size  Count Percentage
##   <chr> <int>      <dbl>
## 1 M      1755         45
## 2 L      1053         27
## 3 S       663         17
## 4 XL      429         11

Gráfico de barras con etiquetas

ggplot(size_summary, aes(x = reorder(Size, -Count), y = Count, fill = Size)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = paste0(round(Percentage, 1), "%")), vjust = -0.5) +
  labs(title = "Distribución de la variable Size",
       x = "Talla",
       y = "Cantidad de Compras") +
  theme_minimal() +
  theme(legend.position = "none")

Conclusión

La distribución de tallas en las compras muestra que la talla M es la más adquirida, representando un 45% del total, seguida de la talla L con un 27%. La talla S representa un 17%, mientras que la XL es la menos comprada con un 11%. Estos datos sugieren que la mayoría de los clientes prefieren tallas intermedias (M y L), mientras que las tallas más pequeñas y grandes tienen menor demanda. Esto puede ser útil para la gestión del inventario, priorizando la reposición de las tallas más vendidas.

8. VARIABLE: Color

Análisis de frecuencia para la variable Color

color_summary <- df %>%
  group_by(Color) %>%
  summarise(Count = n()) %>%
  mutate(Percentage = (Count / sum(Count)) * 100) %>%
  arrange(desc(Count))

Mostrar las 10 opciones más frecuentes

top_colors <- head(color_summary, 10) 
print(top_colors)
## # A tibble: 10 × 3
##    Color  Count Percentage
##    <chr>  <int>      <dbl>
##  1 Olive    177       4.54
##  2 Yellow   174       4.46
##  3 Silver   173       4.44
##  4 Teal     172       4.41
##  5 Green    169       4.33
##  6 Black    167       4.28
##  7 Cyan     166       4.26
##  8 Violet   166       4.26
##  9 Gray     159       4.08
## 10 Maroon   158       4.05

Gráfico de barras de los colores más comprados

ggplot(top_colors, aes(x = reorder(Color, -Count), y = Count, fill = Color)) +
  geom_bar(stat = "identity", show.legend = FALSE) +
  geom_text(aes(label = paste0(round(Percentage, 1), "%")), vjust = -0.5, size = 5) +
  labs(title = "Top 10 Colores Más Comprados", x = "Color", y = "Cantidad de Compras") +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

# Conclusión

La distribución de colores en los productos vendidos revela que no hay un color dominante absoluto, pero algunos tonos destacan en preferencia. El color Olive es el más popular, representando el 4.54% de las compras, seguido de Yellow con un 4.46%, y Silver con un 4.44%. Otros colores como Teal (4.41%), Green (4.33%), y Black (4.28%) también tienen una presencia significativa en las elecciones de los clientes. En contraste, colores como Cyan, Violet, Gray, y Maroon rondan entre el 4.08% y el 4.05%. Esto indica una distribución bastante equitativa entre los colores más vendidos, sin una preferencia clara por tonos neutros o vibrantes.

9. VARIABLE: Season

season_summary <- df %>%
  group_by(Season) %>%
  summarise(Count = n()) %>%
  mutate(Percentage = (Count / sum(Count)) * 100) %>%
  arrange(desc(Count))

Mostrar tabla con el análisis

print(season_summary)
## # A tibble: 4 × 3
##   Season Count Percentage
##   <chr>  <int>      <dbl>
## 1 Spring   999       25.6
## 2 Fall     975       25  
## 3 Winter   971       24.9
## 4 Summer   955       24.5

Gráfico de barras con etiquetas de porcentaje

ggplot(season_summary, aes(x = reorder(Season, -Count), y = Percentage, fill = Season)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = paste0(round(Percentage, 1), "%")), vjust = -0.5, size = 5) +
  labs(title = "Distribución de Temporadas en las Compras", x = "Temporada", y = "Porcentaje") +
  theme_minimal() +
  scale_fill_brewer(palette = "Set3")

Conclusión

La variable Season muestra una distribución equilibrada, la primavera (Spring) es la estación con más compras, representando 25.62% del total, con 999 transacciones. Le sigue otoño (Fall) con 975 compras (25.00%), mientras que invierno (Winter) registra 971 compras (24.90%). Finalmente, verano (Summer) es la estación con el menor número de compras, aunque con una diferencia mínima, alcanzando 955 compras (24.49%).

Estos datos indican que las compras se mantienen relativamente constantes en todas las estaciones. Sin embargo, la ligera preferencia por primavera y otoño podría deberse a cambios de temporada que impulsan la compra de ropa y accesorios, promociones especiales o eventos comerciales.

10. VARIABLE: Review Rating

Análisis descriptivo

df <- df %>%
  mutate(`Review Rating` = as.numeric(`Review Rating`))
summary_stats <- df %>%
  summarise(
    Media = mean(`Review Rating`, na.rm = TRUE),
    Mediana = median(`Review Rating`, na.rm = TRUE),
    Moda = as.numeric(names(sort(table(`Review Rating`), decreasing = TRUE)[1])),
    Desviacion_Estandar = sd(`Review Rating`, na.rm = TRUE),
    Varianza = var(`Review Rating`, na.rm = TRUE),
    Asimetria = skewness(`Review Rating`, na.rm = TRUE),
    Curtosis = kurtosis(`Review Rating`, na.rm = TRUE)
  )

Imprimir los resultados

print(summary_stats)
## # A tibble: 1 × 7
##   Media Mediana  Moda Desviacion_Estandar Varianza Asimetria Curtosis
##   <dbl>   <dbl> <dbl>               <dbl>    <dbl>     <dbl>    <dbl>
## 1  3.75     3.7   3.4               0.716    0.513   0.00452     1.82

Visualización: Histograma con curva de densidad

ggplot(df, aes(x = `Review Rating`)) +
  geom_histogram(aes(y = ..density..), bins = 10, fill = "skyblue", color = "black", alpha = 0.7) +
  geom_density(color = "red", size = 1) +
  labs(title = "Distribución de Review Rating",
       x = "Review Rating",
       y = "Densidad") +
  theme_minimal()
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Warning: The dot-dot notation (`..density..`) was deprecated in ggplot2 3.4.0.
## ℹ Please use `after_stat(density)` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Boxplot para detectar outliers

ggplot(df, aes(y = `Review Rating`)) +
  geom_boxplot(fill = "lightblue", color = "black") +
  labs(title = "Boxplot de Review Rating", y = "Review Rating") +
  theme_minimal()

Conclusión

La variable “Review Rating” representa la calificación que los clientes han dado a los productos. A continuación, se interpretan sus estadísticas descriptivas:

En conclusión la mayoría de las calificaciones se concentran en torno al 3.7 - 3.75, con una dispersión baja y una distribución muy equilibrada. Esto sugiere que los clientes suelen otorgar puntuaciones moderadamente favorables sin extremos significativos.

11. VARIABLE: Subscription Status

subscription_summary <- df %>%
  group_by(`Subscription Status`) %>%  # Asegurar que el nombre coincide
  summarise(Count = n()) %>%
  mutate(Percentage = (Count / sum(Count)) * 100)
print(subscription_summary)
## # A tibble: 2 × 3
##   `Subscription Status` Count Percentage
##   <chr>                 <int>      <dbl>
## 1 No                     2847         73
## 2 Yes                    1053         27

Gráfico de barras con etiquetas

ggplot(subscription_summary, aes(x = `Subscription Status`, y = Count, fill = `Subscription Status`)) +
  geom_bar(stat = "identity", width = 0.5) +
  geom_text(aes(label = paste0(round(Percentage, 1), "%")), vjust = -0.5, size = 5) +
  labs(title = "Distribución del Estado de Suscripción",
       x = "Estado de Suscripción",
       y = "Cantidad",
       fill = "Estado") +
  theme_minimal()

Conclusion

El análisis de la variable Subscription Status muestra que la mayoría de los clientes no están suscritos. De los 3,900 clientes analizados, 2,847 (73%) no tienen una suscripción activa, mientras que solo 1,053 (27%) sí están suscritos.

Esta distribución indica que la mayoría de los clientes prefieren realizar compras sin comprometerse con una suscripción. Este comportamiento podría deberse a varios factores, como el desconocimiento de los beneficios de la suscripción, falta de interés en recibir servicios adicionales o una percepción de que la suscripción no ofrece suficiente valor agregado.

Desde una perspectiva estratégica, estos resultados pueden ser una oportunidad para optimizar la oferta de suscripción, mejorando los beneficios o creando campañas de marketing dirigidas a aumentar la tasa de suscripción. Además, sería relevante analizar si los clientes suscritos tienen un mayor gasto promedio que los no suscritos, lo que podría justificar esfuerzos

12. VARIABLE: Payment Method

Análisis de frecuencia

payment_summary <- df %>%
  group_by(`Payment Method`) %>%
  summarise(Count = n()) %>%
  mutate(Percentage = (Count / sum(Count)) * 100) %>%
  arrange(desc(Count))

Mostrar tabla resumen

print(payment_summary)
## # A tibble: 6 × 3
##   `Payment Method` Count Percentage
##   <chr>            <int>      <dbl>
## 1 Credit Card        696       17.8
## 2 Venmo              653       16.7
## 3 Cash               648       16.6
## 4 PayPal             638       16.4
## 5 Debit Card         633       16.2
## 6 Bank Transfer      632       16.2

Gráfico de barras del top 10 métodos de pago

ggplot(payment_summary, aes(x = reorder(`Payment Method`, -Count), y = Percentage, fill = `Payment Method`)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = paste0(round(Percentage, 1), "%")), vjust = -0.5, size = 4) +
  labs(title = "Distribución de Métodos de Pago", x = "Método de Pago", y = "Porcentaje") +
  theme_minimal() +
  theme(legend.position = "none") +
  coord_flip()

Conclusión

El análisis de la variable Payment Method revela que los métodos de pago están distribuidos de manera relativamente equitativa entre las diferentes opciones. El método de pago más utilizado es la tarjeta de crédito, con 696 transacciones, lo que representa un 17.85% del total.

Le sigue Venmo, con 653 transacciones (16.74%), y efectivo, con 648 transacciones (16.62%). Otros métodos de pago populares incluyen PayPal (638 transacciones, 16.36%), tarjeta de débito (633 transacciones, 16.23%) y transferencia bancaria (632 transacciones, 16.21%).

La distribución uniforme sugiere que los clientes utilizan una variedad de opciones de pago sin una preferencia clara por un método en particular. Esto puede indicar la necesidad de seguir ofreciendo múltiples opciones de pago para satisfacer las preferencias de los consumidores.

13. VARIABLE: Shipping Type

df <- df %>% rename_with(~ gsub("\\s+", "_", .))
shipping_summary <- df %>%
  group_by(Shipping_Type) %>%
  summarise(Count = n()) %>%
  mutate(Percentage = round((Count / sum(Count)) * 100, 2)) %>%
  arrange(desc(Count))

Mostrar la tabla resumen

print(shipping_summary)
## # A tibble: 6 × 3
##   Shipping_Type  Count Percentage
##   <chr>          <int>      <dbl>
## 1 Free Shipping    675       17.3
## 2 Standard         654       16.8
## 3 Store Pickup     650       16.7
## 4 Next Day Air     648       16.6
## 5 Express          646       16.6
## 6 2-Day Shipping   627       16.1

Gráfico de barras de la distribución de Shipping Type

ggplot(shipping_summary, aes(x = reorder(Shipping_Type, -Count), y = Percentage, fill = Shipping_Type)) +
  geom_bar(stat = "identity") +
  geom_text(aes(label = paste0(Percentage, "%")), vjust = -0.5, size = 5) +
  labs(title = "Distribución de Tipos de Envío",
       x = "Tipo de Envío",
       y = "Porcentaje (%)") +
  theme_minimal() +
  theme(legend.position = "none")

# Conclusión

El método más utilizado es “Free Shipping”, con 675 pedidos, representando el 17.31% del total. Le siguen de cerca “Standard” con 654 pedidos (16.77%) y “Store Pickup” con 650 pedidos (16.67%), lo que indica una preferencia considerable por opciones de envío económicas o sin costo.

“Next Day Air” (648 pedidos, 16.62%) y “Express” (646 pedidos, 16.56%) muestran que una proporción similar de clientes prefiere recibir sus productos rápidamente. Finalmente, “2-Day Shipping” es la opción menos frecuente dentro del top, con 627 pedidos (16.08%), aunque sigue representando una parte significativa de las elecciones de los clientes. Estos datos sugieren que los clientes valoran tanto la gratuitad del envío como la rapidez, con una distribución bastante equilibrada entre las opciones.

14. VARIABLE: Discount_Applied

Análisis descriptivo

colnames(data)
##  [1] "Customer ID"              "Age"                     
##  [3] "Gender"                   "Item Purchased"          
##  [5] "Category"                 "Purchase Amount (USD)"   
##  [7] "Location"                 "Size"                    
##  [9] "Color"                    "Season"                  
## [11] "Review Rating"            "Subscription Status"     
## [13] "Payment Method"           "Shipping Type"           
## [15] "Discount Applied"         "Promo Code Used"         
## [17] "Previous Purchases"       "Preferred Payment Method"
## [19] "Frequency of Purchases"
data <- data %>%
  mutate(`Discount Applied` = ifelse(`Discount Applied` == "Yes", 1, 0))
library(dplyr)
library(e1071)
## 
## Adjuntando el paquete: 'e1071'
## The following objects are masked from 'package:moments':
## 
##     kurtosis, moment, skewness
data %>%
  summarise(
    Media = mean(`Discount Applied`, na.rm = TRUE),
    Mediana = median(`Discount Applied`, na.rm = TRUE),
    Moda = as.numeric(names(sort(table(`Discount Applied`), decreasing = TRUE)[1])),
    Desviacion_Estandar = sd(`Discount Applied`, na.rm = TRUE),
    Varianza = var(`Discount Applied`, na.rm = TRUE),
    )
library(ggplot2)
library(dplyr)

Crear un dataset de ejemplo (si no tienes ya los datos cargados)

data <- data.frame(`Discount Applied` = c(rep(0, 2223), rep(1, 1677)))

Convertir la variable en factor con etiquetas correctas

data <- data %>%
  mutate(Discount.Applied = factor(Discount.Applied, levels = c(0, 1), labels = c("No Aplicado", "Aplicado")))

Crear tabla con porcentajes

df <- data %>%
  count(Discount.Applied) %>%
  mutate(Percentage = n / sum(n) * 100)
print(df)
##   Discount.Applied    n Percentage
## 1      No Aplicado 2223         57
## 2         Aplicado 1677         43

Generar gráfico de barras con etiquetas de porcentaje

ggplot(df, aes(x = Discount.Applied, y = Percentage, fill = Discount.Applied)) +
  geom_bar(stat = "identity", width = 0.5) +
  geom_text(aes(label = paste0(round(Percentage, 1), "%")), vjust = -0.5, color = "black", size = 5) +
  scale_fill_manual(values = c("No Aplicado" = "tomato", "Aplicado" = "steelblue")) +
  labs(title = "Distribución de Descuentos Aplicados", x = "Descuento Aplicado", y = "Porcentaje") +
  theme_minimal()

Conclusión

El análisis de la variable “Discount Applied” muestra que el 57% de las compras (2,223 casos) no tuvieron descuento aplicado, mientras que el 43% (1,677 casos) sí recibieron un descuento. Esto indica que, en la mayoría de las transacciones, los clientes compraron sin beneficiarse de una reducción en el precio. Este patrón sugiere que el uso de descuentos no es predominante en las ventas, lo que podría estar relacionado con la estrategia de precios de la empresa, la percepción de valor de los clientes o la efectividad de las promociones disponibles.

15. VARIABLE: Previous Purchases

library(dplyr)
library(ggplot2)
library(moments)
install.packages("readxl")
## Warning: package 'readxl' is in use and will not be installed
library(readxl)

ruta_archivo <- "C:/Users/AngelyPipe/OneDrive/Escritorio/shopping_trends.xlsx"

shopping_trends <- read_excel(ruta_archivo)

ls()
##  [1] "age_data"             "asimetria"            "category_summary"    
##  [4] "color_summary"        "cuartiles"            "curtosis"            
##  [7] "data"                 "desv_std"             "df"                  
## [10] "gender_counts"        "gender_percent"       "item_counts"         
## [13] "item_df"              "kurtosis_age"         "location_summary"    
## [16] "mean_age"             "media"                "median_age"          
## [19] "mediana"              "moda"                 "mode_age"            
## [22] "mode_item"            "payment_summary"      "quartiles_age"       
## [25] "ruta_archivo"         "sd_age"               "season_summary"      
## [28] "shipping_summary"     "shopping_trends"      "size_summary"        
## [31] "skewness_age"         "subscription_summary" "summary_stats"       
## [34] "top_colors"           "var_age"              "varianza"
head(shopping_trends)
if (!exists("shopping_trends")) {
stop("❌ ERROR: El dataset 'shopping_trends' no está cargado en el entorno de R.")
}
if (!"Previous Purchases" %in% colnames(shopping_trends)) {
  stop("❌ ERROR: La variable 'Previous Purchases' no existe en 'shopping_trends'.")
}
shopping_trends$`Previous Purchases` <- as.numeric(shopping_trends$`Previous Purchases`)
data_clean <- na.omit(shopping_trends$`Previous Purchases`)

Verificar si hay datos válidos

if (length(data_clean) == 0) {
  stop("❌ ERROR: No hay datos numéricos válidos en 'Previous Purchases'.")
}

Calcular estadísticas descriptivas

stats <- data.frame(
  Media = mean(data_clean),
  Mediana = median(data_clean),
  Moda = as.numeric(names(sort(table(data_clean), decreasing = TRUE)[1])),
  Desviacion_Estandar = sd(data_clean),
  Varianza = var(data_clean),
  Minimo = min(data_clean),
  Maximo = max(data_clean),
  Cuartil_25 = quantile(data_clean, 0.25),
  Cuartil_50 = quantile(data_clean, 0.50),
  Cuartil_75 = quantile(data_clean, 0.75),
  Asimetria = skewness(data_clean),
  Curtosis = kurtosis(data_clean)
)

Imprimir estadísticas

print(stats)
##        Media Mediana Moda Desviacion_Estandar Varianza Minimo Maximo Cuartil_25
## 25% 25.35154      25   31            14.44713 208.7194      1     50         13
##     Cuartil_50 Cuartil_75   Asimetria  Curtosis
## 25%         25         38 0.003118755 -1.191128
# Gráfico de histograma
ggplot(shopping_trends, aes(x = `Previous Purchases`)) +
  geom_histogram(binwidth = 1, fill = "steelblue", color = "black", alpha = 0.7) +
  geom_vline(aes(xintercept = mean(`Previous Purchases`, na.rm = TRUE)), 
             color = "red", linetype = "dashed", size = 1) +
  labs(title = "Distribución de Compras Previas",
       x = "Número de Compras Previas",
       y = "Frecuencia") +
  theme_minimal()

Conclusión

El análisis descriptivo de la variable muestra que, en promedio, los clientes han realizado 25.35 compras previas, con una mediana de 25, lo que indica que la mitad de los clientes ha realizado 25 compras o menos. La moda es 31, lo que significa que este es el número de compras más frecuente. La desviación estándar de 14.45 y la varianza de 208.72 sugieren una dispersión considerable en los datos. El número mínimo de compras previas registradas es 1, mientras que el máximo alcanza 50.

En cuanto a los cuartiles, el 25% de los clientes ha hecho 13 compras o menos, el 50% ha realizado hasta 25 compras, y el 75% ha hecho 38 compras o menos. La distribución es casi simétrica con una asimetría de 0.0031, y presenta una curtosis de 1.8098, lo que indica que los datos no tienen valores extremadamente alejados de la media.

16. VARIABLE: Preferred Payment Method

library(dplyr)
library(ggplot2)
data <- shopping_trends  
  payment_stats <- data %>%
    group_by(`Preferred Payment Method`) %>%
    summarise(Count = n()) %>%
    mutate(Percentage = round((Count / sum(Count)) * 100, 2))
 print(payment_stats)
## # A tibble: 6 × 3
##   `Preferred Payment Method` Count Percentage
##   <chr>                      <int>      <dbl>
## 1 Bank Transfer                612       15.7
## 2 Cash                         670       17.2
## 3 Credit Card                  671       17.2
## 4 Debit Card                   636       16.3
## 5 PayPal                       677       17.4
## 6 Venmo                        634       16.3
ggplot(payment_stats, aes(x = reorder(`Preferred Payment Method`, -Count), y = Count, fill = `Preferred Payment Method`)) +
    geom_bar(stat = "identity", width = 0.6) +
    geom_text(aes(label = paste0(Percentage, "%")), vjust = -0.5, size = 5) +
    labs(title = "Distribución de Métodos de Pago Preferidos",
         x = "Método de Pago",
         y = "Cantidad de Clientes") +
    theme_minimal() +
    theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
    scale_fill_brewer(palette = "Set3")

Conclusión

El análisis de la variable Preferred Payment Method muestra que los métodos de pago más utilizados por los clientes están relativamente equilibrados.

PayPal es el método más preferido, con 677 transacciones (17.36%), seguido de Credit Card con 671 transacciones (17.21%) y Cash con 670 transacciones (17.18%). Debit Card y Venmo presentan valores similares, con 636 (16.31%) y 634 (16.26%) transacciones, respectivamente. Finalmente, Bank Transfer es el método menos utilizado, con 612 transacciones (15.69%). Estos datos indican que no hay una preferencia dominante, aunque los pagos digitales como PayPal y tarjetas de crédito tienen una ligera ventaja sobre el efectivo y las transferencias bancarias.

17. VARIABLE: Frequency of Purchases.

Cargar librerías necesarias

library(dplyr)
str(df)
## 'data.frame':    2 obs. of  3 variables:
##  $ Discount.Applied: Factor w/ 2 levels "No Aplicado",..: 1 2
##  $ n               : int  2223 1677
##  $ Percentage      : num  57 43
install.packages("readxl")
## Warning: package 'readxl' is in use and will not be installed
library(dplyr)
library(readxl)

ruta_archivo <- "C:/Users/AngelyPipe/OneDrive/Escritorio/shopping_trends.xlsx"

df <- read_excel(ruta_archivo)

if (!"Frequency of Purchases" %in% names(df)) {
  stop("❌ ERROR: La columna 'Frequency of Purchases' no existe en el dataset.")
} else {
  print("✅ Columna encontrada. Valores únicos:")
  print(unique(df$`Frequency of Purchases`))
}
## [1] "✅ Columna encontrada. Valores únicos:"
## [1] "Fortnightly"    "Weekly"         "Annually"       "Quarterly"     
## [5] "Bi-Weekly"      "Monthly"        "Every 3 Months"
niveles_validos <- c("Annually", "Quarterly", "Every 3 Months", 
                      "Monthly", "Bi-Weekly", "Fortnightly", "Weekly")

df <- df %>%
  mutate(`Frequency of Purchases` = ifelse(`Frequency of Purchases` %in% niveles_validos, 
                                           `Frequency of Purchases`, NA),
         Frequency_of_Purchases = factor(`Frequency of Purchases`, 
                                         levels = niveles_validos, 
                                         ordered = TRUE))

head(df)
df$Frequency_of_Purchases <- factor(df$`Frequency of Purchases`, 
levels = c("Annually", "Quarterly", "Every 3 Months", "Monthly","Bi-Weekly", "Fortnightly", "Weekly"), 
ordered = TRUE)

Realizar el análisis y cálculo de frecuencias y porcentajes

Frequency_of_Purchases_summary <- df %>%
group_by(Frequency_of_Purchases) %>%
summarise(Count = n(), .groups = 'drop') %>%
mutate(Percentage = (Count / sum(Count)) * 100) %>%
arrange(desc(Count))

Mostrar el resumen

print(Frequency_of_Purchases_summary)
## # A tibble: 7 × 3
##   Frequency_of_Purchases Count Percentage
##   <ord>                  <int>      <dbl>
## 1 Every 3 Months           584       15.0
## 2 Annually                 572       14.7
## 3 Quarterly                563       14.4
## 4 Monthly                  553       14.2
## 5 Bi-Weekly                547       14.0
## 6 Fortnightly              542       13.9
## 7 Weekly                   539       13.8
ggplot(Frequency_of_Purchases_summary, aes(x = Frequency_of_Purchases, y = Count, fill = Frequency_of_Purchases)) +
  geom_bar(stat = "identity") +  # Usamos 'stat = "identity"' para que el conteo ya calculado sea usado en el gráfico
  theme_minimal() + 
  labs(title = "Distribución de la Frecuencia de Compras",
       x = "Frecuencia de Compras",
       y = "Número de Observaciones") +
  scale_fill_brewer(palette = "Set3") + 
  theme(axis.text.x = element_text(angle = 45, hjust = 1))

Conclusión

La frecuencia de compra esta distribuida de manera bastante equilibrada, sin una categoría claramente dominante. La diferencia de porcentaje entre las categorías es pequeña, lo que puede indicar que las personas en tu muestra no tienen una preferencia extrema por realizar compras muy frecuentes o poco frecuentes, sino que se distribuyen de manera más homogénea a través de todas las categorías.

Este tipo de distribución podría ser útil para tomar decisiones de marketing o segmentación, ya que no hay una única frecuencia de compra que sobresalga. Sin embargo, si se desea aumentar la frecuencia de compra en el futuro, sería interesante explorar qué factores motivan a los consumidores a realizar compras con más o menos regularidad.