Introducción

En este análisis, investigamos cómo las interacciones del servicio al cliente influyen en el nivel de compromiso (engagement) de los usuarios en Amazon. Formulamos la hipótesis de que un mayor número de interacciones con el soporte al cliente se correlaciona con un mayor nivel de engagement.

Preguntas de Investigación

1. ¿Existe una relación significativa entre las interacciones con el soporte al cliente y el nivel de engagement de los usuarios?

2. ¿Cuál es la naturaleza de esta relación? ¿Es positiva o negativa?

3. ¿Qué implicaciones tienen estos hallazgos para la estrategia de servicio al cliente de Amazon?

Datos

Utilizamos un conjunto de datos proporcionado por Amazon que incluye información sobre las interacciones con el soporte al cliente y los niveles de engagement de los usuarios.

library(lubridate)
library(dplyr)
library(car)
library(ggplot2)

data_set_amazon <- read.csv("data_set_amazon.csv",
         stringsAsFactors = TRUE)

Preparamos los datos.

Mostraremos los primeros encabezados del dataframe

#Agregar una columa que me indique la edad de los clientes a partir de 
#la columna de "Date.of.Birth"

data_set_amazon$Date.of.Birth <- 
  as.Date(data_set_amazon$Date.of.Birth, format="%Y-%m-%d")
# Calcular la edad y crear una nueva columna 'Age'
data_set_amazon <- data_set_amazon %>%
  mutate(Age = floor(interval(start = Date.of.Birth, 
                              end = Sys.Date()) / years(1)))
# Crear grupos de edades
data_set_amazon <- data_set_amazon %>%
  mutate(Age.Group = cut(Age, 
                         breaks = c(0, 17, 25, 35, 45, 55, 65, 75, 85, Inf), 
                         labels = c("0-17", "18-25", "26-35", "36-45", "46-55", 
                                    "56-65", "66-75","76-85","85+"),
                         right = FALSE))

#Hacemos el Engagement medible.
data_set_amazon <- data_set_amazon %>%
  mutate(Engagement.Score = case_when(
    Engagement.Metrics == "High"   ~ 3,
    Engagement.Metrics == "Medium" ~ 2,
    Engagement.Metrics == "Low"    ~ 1,
    TRUE                           ~ NA_real_  
    # Esto maneja cualquier caso no especificado como NA
  ))

#Ahora vamos a hacer la frecuencia de uso medible.
data_set_amazon <- data_set_amazon  %>%
  mutate(Usage.Frequency_medible = case_when(
    Usage.Frequency == "Frequent"   ~ 3,
    Usage.Frequency == "Regular" ~ 2,
    Usage.Frequency == "Occasional" ~ 1,
    TRUE                           ~ NA_real_  
    # Esto maneja cualquier caso no especificado como NA
  ))
head(data_set_amazon)
##   User.ID             Name                  Email.Address           Username
## 1       1    Ronald Murphy     williamholland@example.com     williamholland
## 2       2      Scott Allen            scott22@example.org            scott22
## 3       3 Jonathan Parrish           brooke16@example.org           brooke16
## 4       4   Megan Williams        elizabeth31@example.net        elizabeth31
## 5       5    Kathryn Brown pattersonalexandra@example.org pattersonalexandra
## 6       6       Sandra Cox             gparks@example.org             gparks
##   Date.of.Birth Gender       Location Membership.Start.Date Membership.End.Date
## 1    1953-06-03   Male Rebeccachester            2024-01-15          2025-01-14
## 2    1978-07-08   Male  Mcphersonview            2024-01-07          2025-01-06
## 3    1994-12-06 Female      Youngfort            2024-04-13          2025-04-13
## 4    1964-12-22 Female   Feliciashire            2024-01-24          2025-01-23
## 5    1961-06-04   Male   Port Deborah            2024-02-14          2025-02-13
## 6    1954-09-19 Female Lake Johnathan            2024-01-15          2025-01-14
##   Subscription.Plan Payment.Information Renewal.Status Usage.Frequency
## 1            Annual          Mastercard         Manual         Regular
## 2           Monthly                Visa         Manual         Regular
## 3           Monthly          Mastercard         Manual         Regular
## 4           Monthly                Amex     Auto-renew         Regular
## 5            Annual                Visa     Auto-renew        Frequent
## 6           Monthly                Amex         Manual      Occasional
##   Purchase.History Favorite.Genres Devices.Used Engagement.Metrics
## 1      Electronics     Documentary     Smart TV             Medium
## 2      Electronics          Horror   Smartphone             Medium
## 3            Books          Comedy     Smart TV                Low
## 4      Electronics     Documentary     Smart TV               High
## 5         Clothing           Drama     Smart TV                Low
## 6            Books          Action       Tablet                Low
##   Feedback.Ratings Customer.Support.Interactions Age Age.Group Engagement.Score
## 1              3.6                             3  71     66-75                2
## 2              3.8                             7  45     46-55                2
## 3              3.3                             8  29     26-35                1
## 4              3.3                             7  59     56-65                3
## 5              4.3                             1  63     56-65                1
## 6              3.8                             2  69     66-75                1
##   Usage.Frequency_medible
## 1                       2
## 2                       2
## 3                       2
## 4                       2
## 5                       3
## 6                       1

Vemos como se distribuye el publico por su edad.

Top_grupos_edades <- data_set_amazon %>%
  group_by(Age.Group) %>% 
  summarise(Personas = n()) %>%
  arrange(desc(Personas)) %>% 
  mutate(Representacion = Personas / sum(Personas))

# Graficar la densidad de distribución de edades con líneas divisorias
# Calculando la densidad manualmente para todo el rango de edades
densidad_edades <- density(data_set_amazon$Age)
df_densidad_edades <- data.frame(Age = densidad_edades$x, 
                                 Density = densidad_edades$y)

# Agregando una columna de grupo de edad según los rangos
df_densidad_edades$Age.Group <- 
  cut(df_densidad_edades$Age,
      breaks =
        c(0, 25, 35, 45, 55, 65, 75, 85, Inf),
      labels = 
        c("18-25", "26-35", "36-45", "46-55", "56-65", "66-75","76-85", "85+"))

# Graficando con áreas coloreadas
ggplot(df_densidad_edades, aes(x = Age, y = Density)) +
  geom_area(aes(fill = Age.Group), alpha = 1) +
  scale_fill_brewer(palette = "Set2", name = "Rango de Edad") + 
  geom_vline(xintercept = c(25, 35, 45, 55, 65, 75, 85), 
             color = "black", linetype = "dotted") +
  geom_vline(aes(xintercept = mean(data_set_amazon$Age)), 
             color = "blue", linetype = "dashed", size = 0.8) +
  annotate("text", x = mean(data_set_amazon$Age), y = 0, 
           label = sprintf("Promedio: %.2f", mean(data_set_amazon$Age)), 
           vjust = 1, color = "blue", size = 4) +
  scale_x_continuous(breaks = seq(min(18), max(90), by = 4)) +
  labs(title = "Distribución por rangos de edad",
       x = "Edad",
       y = "Densidad") +
  theme_minimal()

Top_grupos_edades
## # A tibble: 8 × 3
##   Age.Group Personas Representacion
##   <fct>        <int>          <dbl>
## 1 26-35          370         0.148 
## 2 76-85          351         0.140 
## 3 36-45          348         0.139 
## 4 56-65          345         0.138 
## 5 46-55          344         0.138 
## 6 66-75          315         0.126 
## 7 85+            217         0.0868
## 8 18-25          210         0.084

Este gráfico muestra la distribución de un conjunto de datos por rangos de edad, representados en diferentes colores. Cada color indica un grupo etario específico, desde los 18 hasta los 85 años y más. La línea punteada vertical señala el promedio de edad, que es de 54.22 años.

Agrupación de Datos y Cálculo del Promedio de Engagement

Agrupamos las interacciones con el soporte al cliente y calculamos el promedio del engagement score para cada nivel de interacción.

En el análisis presentado, se muestra el cálculo del promedio del ‘Engagement Score’ agrupado por el número de interacciones con el soporte al cliente

# Agrupar interacciones con soporte y calcular el promedio de engagement
Interacciones_vs_Engagement <- data_set_amazon %>%
  group_by(Customer.Support.Interactions) %>%
  summarise(Promedio_del_EngagementScore = mean(Engagement.Score, na.rm = TRUE))

# Calcular la correlación entre las interacciones con soporte y el engagement
correlacion <- cor(Interacciones_vs_Engagement$Customer.Support.Interactions,
                   Interacciones_vs_Engagement$Promedio_del_EngagementScore,
                   use = "complete.obs")
data.frame(Interacciones_vs_Engagement)
##    Customer.Support.Interactions Promedio_del_EngagementScore
## 1                              0                     2.012605
## 2                              1                     1.937759
## 3                              2                     1.995671
## 4                              3                     1.972093
## 5                              4                     2.000000
## 6                              5                     1.961207
## 7                              6                     2.018018
## 8                              7                     2.064220
## 9                              8                     2.057778
## 10                             9                     2.069124
## 11                            10                     2.025424
correlacion
## [1] 0.6881478

Este análisis muestra el promedio del ‘Engagement Score’ según el número de interacciones con el soporte al cliente. Además, la correlación calculada de 0.688 indica que existe una relación positiva moderada entre más interacciones y un mayor ‘Engagement Score’.

Visualización de la Distribución por Rangos de Edad

Para comprender mejor los datos, visualizamos la distribución de los usuarios por rangos de edad y su promedio de engagement.

#Obtenemos los promedios del engagement por grupo de edad
Engagement_por_edad <- data_set_amazon %>%
  group_by(Age.Group) %>%
  mutate(Promedio_del_EngagementScore = mean(Engagement.Score)) 

dfEngagement_por_edad<-Engagement_por_edad %>% select(Age.Group, Promedio_del_EngagementScore)%>% group_by(Age.Group)%>% summarise(Promedio_del_EngagementScore = mean(Promedio_del_EngagementScore))

ggplot(Engagement_por_edad, aes(x =Age, y =Promedio_del_EngagementScore )) +
  geom_area(aes(fill =Age.Group ), alpha = 1) +
  scale_fill_brewer(palette = "Set2", name = "Rango de Edad") + 
  scale_x_continuous(breaks = seq(min(18), max(90), by = 4)) +
  labs(title = "Distribución por rangos de edad para el Engagement",
       x = "Edad",
       y = "Promedio del Engagement") +
  theme_minimal()

dfEngagement_por_edad
## # A tibble: 8 × 2
##   Age.Group Promedio_del_EngagementScore
##   <fct>                            <dbl>
## 1 18-25                             2   
## 2 26-35                             2.06
## 3 36-45                             2.05
## 4 46-55                             1.98
## 5 56-65                             2.04
## 6 66-75                             1.95
## 7 76-85                             1.97
## 8 85+                               2.02

Modelo Lineal

Para investigar más a fondo la relación entre las interacciones con el soporte y el engagement, construimos un modelo lineal.

# Crear el modelo lineal
Modelo_Engagement_Support <- lm(Promedio_del_EngagementScore ~ Customer.Support.Interactions, 
                                data = Interacciones_vs_Engagement)
# Visualización adicional con scatterplot para mejor interpretación
car::scatterplot(data = Interacciones_vs_Engagement,
                 Promedio_del_EngagementScore ~ Customer.Support.Interactions,
                 smooth = FALSE,
                 pch = 19,
                 col = "blue",
                 xlab = "Interacciones con Soporte al Cliente",
                 ylab = "Promedio del Engagement Score",
                 main = "Scatterplot de Interacciones vs Engagement")

# Resumen del modelo
summary(Modelo_Engagement_Support)
## 
## Call:
## lm(formula = Promedio_del_EngagementScore ~ Customer.Support.Interactions, 
##     data = Interacciones_vs_Engagement)
## 
## Residuals:
##       Min        1Q    Median        3Q       Max 
## -0.049148 -0.024934 -0.001229  0.021974  0.046712 
## 
## Coefficients:
##                               Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                   1.965893   0.018489 106.326 2.92e-15 ***
## Customer.Support.Interactions 0.008892   0.003125   2.845   0.0192 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.03278 on 9 degrees of freedom
## Multiple R-squared:  0.4735, Adjusted R-squared:  0.4151 
## F-statistic: 8.096 on 1 and 9 DF,  p-value: 0.01924

Coeficientes del Modelo:

Hipótesis nula (H0): No existe relación significativa entre las interacciones con el soporte al cliente y el engagement de los usuarios.

Hipótesis alternativa (H1): Existe una relación significativa entre las interacciones con el soporte al cliente y el engagement de los usuarios.

Conclusiones

Nuestros hallazgos indican que existe una relación positiva moderada y significativa entre el número de interacciones con el soporte al cliente y el nivel de engagement de los usuarios. El coeficiente de 0.008892 sugiere que por cada interacción adicional con el soporte al cliente, el engagement score promedio aumenta en aproximadamente 0.0089 puntos.

El modelo explica aproximadamente el 41.51% de la variabilidad en el engagement score (R-cuadrado ajustado), lo que sugiere que aunque las interacciones con el soporte son un factor importante, hay otros factores que también influyen en el engagement.

Dado que el valor p asociado con las interacciones con el soporte al cliente es menor que 0.05, rechazamos la hipótesis nula en favor de la hipótesis alternativa, concluyendo que las interacciones con el soporte al cliente tienen un impacto significativo en el engagement de los usuarios.