# 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
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]))
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)
skewness_age <- skewness(age_data, na.rm = TRUE)
kurtosis_age <- kurtosis(age_data, na.rm = TRUE)
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
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()
ggplot(data, aes(y = Age)) +
geom_boxplot(fill = "lightblue", color = "black") +
labs(title = "Boxplot de la edad de los clientes", y = "Edad")
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.
La mayoría de los clientes se encuentra entre 31 y 57 años, con una edad promedio de 44 años
Existen algunos clientes mayores (ej. 69 años) que podrían estar sesgando ligeramente la distribución.
Se recomienda revisar los valores extremos para evaluar su impacto en la estrategia de segmentación de clientes.
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.
gender_counts <- table(data$Gender)
gender_percent <- prop.table(gender_counts) * 100
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
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.
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)
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
mode_item <- item_df$Item[1]
cat("\ Moda (Producto más comprado):", mode_item, "\n")
## Moda (Producto más comprado): 3
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))
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.
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
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()
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.
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.
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.
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"
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]))
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)
asimetria <- skewness(df$`Purchase Amount (USD)`, na.rm = TRUE)
curtosis <- kurtosis(df$`Purchase Amount (USD)`, na.rm = TRUE)
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
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()
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()
El gasto promedio de los clientes es aproximadamente 60 USD, con una distribución relativamente equilibrada.
El 50% central de las compras oscila entre 39 y 81 USD, lo que sugiere un rango de gasto común entre los consumidores.
No hay una concentración extrema de valores bajos o altos, ya que la distribución es simétrica y no presenta una curtosis elevada.
La moda de 32 USD indica que es un monto recurrente, lo que puede sugerir una estrategia de precios efectiva en productos dentro de este rango.
location_summary <- df %>%
group_by(Location) %>%
summarise(Count = n()) %>%
mutate(Percentage = (Count / sum(Count)) * 100) %>%
arrange(desc(Count)) %>%
head(10)
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
Distribución uniforme: No hay una gran concentración de compras en una sola ubicación. La diferencia entre los estados con más compras es pequeña (~0.2%).
Presencia de estados con menor población: Estados como Montana e Idaho aparecen en los primeros lugares, lo que sugiere que los clientes pueden estar más activos en compras en línea en estas regiones.
Nueva York fuera del top 5: A pesar de ser un estado con alta población, ocupa el puesto 9 con 2.23% de las compras, lo que podría indicar una preferencia por compras físicas en comparación con otros estados.
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.
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
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")
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.
color_summary <- df %>%
group_by(Color) %>%
summarise(Count = n()) %>%
mutate(Percentage = (Count / sum(Count)) * 100) %>%
arrange(desc(Count))
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
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.
season_summary <- df %>%
group_by(Season) %>%
summarise(Count = n()) %>%
mutate(Percentage = (Count / sum(Count)) * 100) %>%
arrange(desc(Count))
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
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")
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.
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)
)
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
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.
ggplot(df, aes(y = `Review Rating`)) +
geom_boxplot(fill = "lightblue", color = "black") +
labs(title = "Boxplot de Review Rating", y = "Review Rating") +
theme_minimal()
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:
Media (3.75): En promedio, los productos reciben una calificación de 3.75, lo que indica que la mayoría de las valoraciones se encuentran en un rango moderadamente positivo.
Mediana (3.7): La mitad de las calificaciones están por debajo de 3.7, y la otra mitad por encima. Como la mediana es ligeramente menor que la media, sugiere una distribución equilibrada pero con ligeros valores más altos.
Moda (3.4): La calificación más comúnmente otorgada por los clientes es 3.4, lo que significa que muchos productos reciben esta puntuación con mayor frecuencia.
Desviación estándar (0.716): Indica que las calificaciones varían aproximadamente 0.72 puntos respecto a la media. Esto sugiere que la mayoría de las calificaciones están bastante agrupadas alrededor del promedio, sin grandes dispersión.
Varianza (0.513): Refleja la dispersión de los datos en torno a la media. Un valor de 0.51 confirma que las calificaciones no están demasiado dispersas.
Asimetría (0.0045): La distribución de las calificaciones es casi simétrica, ya que el valor de asimetría es cercano a 0. Esto indica que no hay una inclinación significativa hacia calificaciones más altas o más bajas.
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.
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
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()
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
payment_summary <- df %>%
group_by(`Payment Method`) %>%
summarise(Count = n()) %>%
mutate(Percentage = (Count / sum(Count)) * 100) %>%
arrange(desc(Count))
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
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()
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.
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))
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
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.
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)
data <- data.frame(`Discount Applied` = c(rep(0, 2223), rep(1, 1677)))
data <- data %>%
mutate(Discount.Applied = factor(Discount.Applied, levels = c(0, 1), labels = c("No Aplicado", "Aplicado")))
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
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()
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.
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`)
if (length(data_clean) == 0) {
stop("❌ ERROR: No hay datos numéricos válidos en 'Previous Purchases'.")
}
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)
)
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()
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.
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")
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.
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)
Frequency_of_Purchases_summary <- df %>%
group_by(Frequency_of_Purchases) %>%
summarise(Count = n(), .groups = 'drop') %>%
mutate(Percentage = (Count / sum(Count)) * 100) %>%
arrange(desc(Count))
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))
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.