1. INTRODUCCIÓN

En esta evaluación se desarrolla un ejercicio de Analítica de Datos aplicada a la gestión operativa de servicios, utilizando R y RStudio.

La base de datos utilizada corresponde a un Centro de Atención al Cliente (Call Center) de una empresa de servicios de televisión satelital, donde se registran indicadores operativos asociados a la atención de llamadas y la calidad del servicio.

Para cada jornada operativa se registran las siguientes variables:

El objetivo de la evaluación es aplicar el proceso de analítica de datos es:

2. Creación y Carga del Dataset

2.1. Carga de las Librerías

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(ggplot2)
library(psych)
## 
## Attaching package: 'psych'
## The following objects are masked from 'package:ggplot2':
## 
##     %+%, alpha
library(party)
## Loading required package: grid
## Loading required package: mvtnorm
## Loading required package: modeltools
## Loading required package: stats4
## Loading required package: strucchange
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
## Loading required package: sandwich
## 
## Attaching package: 'party'
## The following object is masked from 'package:dplyr':
## 
##     where

2.2. Carga y Descripción del Dataset

El archivo data/dataset_callcenter_300.csv es el que contiene la información del servicio, se encuantran registradas las variables críticas del proceso y de calidad.

dataset_callcenter <- read.csv("dataset_callcenter_300.csv")

head(dataset_callcenter)
##   equipo_atencion turno_operacion llamadas_hora tiempo_promedio_atencion
## 1              E3           Tarde            19                     3.35
## 2              E2           Noche            35                     5.61
## 3              E3           Noche            45                     5.92
## 4              E3           Tarde            41                     4.69
## 5              E1           Tarde            30                     4.42
## 6              E3           Tarde            53                     3.87
##   reclamos_clientes interrupciones_sistema satisfaccion_servicio
## 1                 2                      3                  Baja
## 2                 5                      0                  Baja
## 3                 7                      0                  Baja
## 4                 2                      2                 Media
## 5                 6                      0                  Baja
## 6                 6                      2                  Baja
str(dataset_callcenter)
## 'data.frame':    300 obs. of  7 variables:
##  $ equipo_atencion         : chr  "E3" "E2" "E3" "E3" ...
##  $ turno_operacion         : chr  "Tarde" "Noche" "Noche" "Tarde" ...
##  $ llamadas_hora           : int  19 35 45 41 30 53 32 46 39 34 ...
##  $ tiempo_promedio_atencion: num  3.35 5.61 5.92 4.69 4.42 3.87 4.69 3.93 5.45 5.84 ...
##  $ reclamos_clientes       : int  2 5 7 2 6 6 11 5 2 3 ...
##  $ interrupciones_sistema  : int  3 0 0 2 0 2 4 3 3 2 ...
##  $ satisfaccion_servicio   : chr  "Baja" "Baja" "Baja" "Media" ...
dim(dataset_callcenter)
## [1] 300   7
names(dataset_callcenter)
## [1] "equipo_atencion"          "turno_operacion"         
## [3] "llamadas_hora"            "tiempo_promedio_atencion"
## [5] "reclamos_clientes"        "interrupciones_sistema"  
## [7] "satisfaccion_servicio"
summary(dataset_callcenter)
##  equipo_atencion    turno_operacion    llamadas_hora   tiempo_promedio_atencion
##  Length:300         Length:300         Min.   :19.00   Min.   :2.100           
##  Class :character   Class :character   1st Qu.:36.00   1st Qu.:4.900           
##  Mode  :character   Mode  :character   Median :42.00   Median :5.690           
##                                        Mean   :41.57   Mean   :5.699           
##                                        3rd Qu.:47.00   3rd Qu.:6.480           
##                                        Max.   :63.00   Max.   :9.170           
##  reclamos_clientes interrupciones_sistema satisfaccion_servicio
##  Min.   : 0.000    Min.   :0.00           Length:300           
##  1st Qu.: 3.000    1st Qu.:1.00           Class :character     
##  Median : 4.000    Median :2.00           Mode  :character     
##  Mean   : 4.013    Mean   :2.11                                
##  3rd Qu.: 5.000    3rd Qu.:3.00                                
##  Max.   :11.000    Max.   :7.00

3. Análisis Exploratorio de Datos

El análisis exploratorio de Datos constituye una etapa fundamental del proceso, cuyo objetivo es comprender la estructura, distribución y características principales del conjunto de datos.

dataset_callcenter$equipo_atencion <- as.factor(dataset_callcenter$equipo_atencion)
dataset_callcenter$turno_operacion <- as.factor(dataset_callcenter$turno_operacion)
dataset_callcenter$satisfaccion_servicio <- as.factor(dataset_callcenter$satisfaccion_servicio)

3.1. Exploración de Datos

Se realiza un análisis exploratorio del dataset del centro de atención al cliente para identificar patrones iniciales, posibles relaciones entre variables y comportamientos que puedan influir en el nivel de satisfacción del servicio. Esta etapa permitirá orientar el análisis posterior y la construcción del modelo de decisión.

Estadísticos Descriptivos Univariados

describe(dataset_callcenter)
##                          vars   n  mean   sd median trimmed  mad  min   max
## equipo_atencion*            1 300  2.04 0.81   2.00    2.05 1.48  1.0  3.00
## turno_operacion*            2 300  2.00 0.82   2.00    2.00 1.48  1.0  3.00
## llamadas_hora               3 300 41.57 7.87  42.00   41.51 7.41 19.0 63.00
## tiempo_promedio_atencion    4 300  5.70 1.22   5.69    5.69 1.17  2.1  9.17
## reclamos_clientes           5 300  4.01 2.03   4.00    3.96 1.48  0.0 11.00
## interrupciones_sistema      6 300  2.11 1.45   2.00    2.05 1.48  0.0  7.00
## satisfaccion_servicio*      7 300  2.19 0.54   2.00    2.20 0.00  1.0  3.00
##                          range  skew kurtosis   se
## equipo_atencion*          2.00 -0.07    -1.48 0.05
## turno_operacion*          2.00  0.01    -1.50 0.05
## llamadas_hora            44.00  0.04     0.07 0.45
## tiempo_promedio_atencion  7.07  0.05     0.32 0.07
## reclamos_clientes        11.00  0.37     0.50 0.12
## interrupciones_sistema    7.00  0.52    -0.01 0.08
## satisfaccion_servicio*    2.00  0.11    -0.06 0.03

Distribución del Nivel de Calidad

table(dataset_callcenter$satisfaccion_servicio)
## 
##  Alta  Baja Media 
##    21   202    77
prop.table(table(dataset_callcenter$satisfaccion_servicio))
## 
##      Alta      Baja     Media 
## 0.0700000 0.6733333 0.2566667

3.2. Histográmas

ggplot(dataset_callcenter, aes(x = llamadas_hora)) +
  geom_histogram(binwidth = 5, fill = "steelblue", color = "black") +
  labs(title = "Distribución de llamadas atendidas por hora",
       x = "Llamadas por hora",
       y = "Frecuencia")

ggplot(dataset_callcenter, aes(x = tiempo_promedio_atencion)) +
  geom_histogram(binwidth = 0.5, fill = "darkgreen", color = "blue") +
  labs(title = "Distribución del tiempo promedio de atención",
       x = "Tiempo promedio (minutos)",
       y = "Frecuencia")

ggplot(dataset_callcenter, aes(x = reclamos_clientes)) +
  geom_histogram(binwidth = 1, fill = "orange", color = "black") +
  labs(title = "Distribución de reclamos de clientes",
       x = "Número de reclamos",
       y = "Frecuencia")

ggplot(dataset_callcenter, aes(x = interrupciones_sistema)) +
  geom_histogram(binwidth = 1, fill = "white", color = "black") +
  labs(title = "Distribución de interrupciones del sistema",
       x = "Número de interrupciones",
       y = "Frecuencia")

3.3. Boxplots por Variable

ggplot(dataset_callcenter, aes(y = llamadas_hora)) +
  geom_boxplot(fill = "blue") +
  labs(title = "Boxplot de llamadas atendidas por hora", y = "Llamadas por hora")

ggplot(dataset_callcenter, aes(y = tiempo_promedio_atencion)) +
  geom_boxplot(fill = "green") +
  labs(title = "Boxplot del tiempo promedio de atención",
       y = "Tiempo promedio (minutos)")

ggplot(dataset_callcenter, aes(y = tiempo_promedio_atencion)) +
  geom_boxplot(fill = "red") +
  labs(title = "Boxplot del tiempo promedio de atención",
       y = "Tiempo promedio (minutos)")

ggplot(dataset_callcenter, aes(y = reclamos_clientes)) +
  geom_boxplot(fill = "orange") +
  labs(title = "Boxplot de reclamos de clientes",
       y = "Número de reclamos")

ggplot(dataset_callcenter, aes(y = interrupciones_sistema)) +
  geom_boxplot(fill = "lightyellow") +
  labs(title = "Boxplot de interrupciones del sistema",
       y = "Número de interrupciones")

3.4. Calidad por Turno

tabla_cal_turno <- table(dataset_callcenter$turno, dataset_callcenter$satisfaccion_servicio)
tabla_cal_turno
##         
##          Alta Baja Media
##   Mañana   12   53    35
##   Noche     3   84    14
##   Tarde     6   65    28
barplot(t(tabla_cal_turno),
        beside = TRUE,
        legend = TRUE,
        main   = "Distribución de calidad por turno",
        xlab   = "Turno",
        ylab   = "Frecuencia")

ggplot(dataset_callcenter, aes(x = turno_operacion, y = llamadas_hora)) +
  geom_boxplot(fill = "skyblue") +
  labs(title = "Llamadas por hora según turno de operación",
       x = "Turno",
       y = "Llamadas por hora")

4. Análisis Multivariado

vars_numericas <- dataset_callcenter %>%
  dplyr::select(llamadas_hora, tiempo_promedio_atencion, reclamos_clientes, interrupciones_sistema)

4.1. Matriz de Correlación

cor(vars_numericas)
##                          llamadas_hora tiempo_promedio_atencion
## llamadas_hora              1.000000000             -0.059048654
## tiempo_promedio_atencion  -0.059048654              1.000000000
## reclamos_clientes          0.001616432              0.035895027
## interrupciones_sistema    -0.072047905             -0.002862391
##                          reclamos_clientes interrupciones_sistema
## llamadas_hora                  0.001616432           -0.072047905
## tiempo_promedio_atencion       0.035895027           -0.002862391
## reclamos_clientes              1.000000000            0.027937375
## interrupciones_sistema         0.027937375            1.000000000

4.2. Gráficos de dispersión

plot(dataset_callcenter$llamadas_hora, dataset_callcenter$reclamos_clientes,
     xlab = "Llamadas por hora",
     ylab = "Número de reclamos",
     main = "Llamadas atendidas vs Reclamos de clientes")

plot(dataset_callcenter$tiempo_promedio_atencion, dataset_callcenter$reclamos_clientes,
     xlab = "Tiempo promedio de atención (minutos)",
     ylab = "Número de reclamos",
     main = "Tiempo de atención vs Reclamos de clientes")

plot(dataset_callcenter$llamadas_hora, dataset_callcenter$interrupciones_sistema,
     xlab = "Llamadas por hora",
     ylab = "Número de interrupciones del sistema",
     main = "Llamadas atendidas vs Interrupciones del sistema")

plot(dataset_callcenter$tiempo_promedio_atencion, dataset_callcenter$interrupciones_sistema,
     xlab = "Tiempo promedio de atención (minutos)",
     ylab = "Número de interrupciones del sistema",
     main = "Tiempo de atención vs Interrupciones del sistema")

5. Modelo de analítica de datos (Árbol de decisión)

Se construye un modelo de árbol de decisión con el objetivo de identificar qué variables operativas influyen en el nivel de satisfacción del servicio. Este modelo permite generar reglas de decisión que facilitan la interpretación de patrones y la toma de decisiones operativas basada en datos.

5.1. Conjunto de entrenamiento y prueba

set.seed(2025)

ind <- sample(2,
              size    = nrow(dataset_callcenter),
              replace = TRUE,
              prob    = c(0.7, 0.3))

trainData <- dataset_callcenter[ind == 1, ]
testData  <- dataset_callcenter[ind == 2, ]

nrow(trainData); nrow(testData)
## [1] 200
## [1] 100

5.2. Entrenamiento

formula_arbol <- satisfaccion_servicio ~ llamadas_hora + tiempo_promedio_atencion +
                                        reclamos_clientes + interrupciones_sistema +
                                        equipo_atencion + turno_operacion

arbol_satisfaccion <- ctree(formula_arbol, data = trainData)

arbol_satisfaccion
## 
##   Conditional inference tree with 9 terminal nodes
## 
## Response:  satisfaccion_servicio 
## Inputs:  llamadas_hora, tiempo_promedio_atencion, reclamos_clientes, interrupciones_sistema, equipo_atencion, turno_operacion 
## Number of observations:  200 
## 
## 1) reclamos_clientes <= 2; criterion = 1, statistic = 45.27
##   2) interrupciones_sistema <= 2; criterion = 1, statistic = 22.956
##     3)*  weights = 24 
##   2) interrupciones_sistema > 2
##     4)*  weights = 17 
## 1) reclamos_clientes > 2
##   5) interrupciones_sistema <= 1; criterion = 1, statistic = 34.67
##     6) reclamos_clientes <= 4; criterion = 0.993, statistic = 16.621
##       7) tiempo_promedio_atencion <= 6.25; criterion = 0.972, statistic = 11.941
##         8)*  weights = 17 
##       7) tiempo_promedio_atencion > 6.25
##         9)*  weights = 10 
##     6) reclamos_clientes > 4
##       10) llamadas_hora <= 45; criterion = 0.994, statistic = 10.904
##         11)*  weights = 21 
##       10) llamadas_hora > 45
##         12)*  weights = 8 
##   5) interrupciones_sistema > 1
##     13) turno_operacion == {Noche, Tarde}; criterion = 0.973, statistic = 10.802
##       14)*  weights = 67 
##     13) turno_operacion == {Mañana}
##       15) tiempo_promedio_atencion <= 5.19; criterion = 0.98, statistic = 8.64
##         16)*  weights = 8 
##       15) tiempo_promedio_atencion > 5.19
##         17)*  weights = 28

5.3. Evaluación del Entrenamiento

pred_train <- predict(arbol_satisfaccion)
tabla_train <- table(Predicho = pred_train, Real = trainData$satisfaccion_servicio)
tabla_train
##         Real
## Predicho Alta Baja Media
##    Alta     0    0     0
##    Baja     1  129    13
##    Media   14    7    36
acc_train <- sum(diag(tabla_train)) / sum(tabla_train)
acc_train
## [1] 0.825

5.4. Evaluación en datos de prueba

pred_test <- predict(arbol_satisfaccion, newdata = testData)
tabla_test <- table(Predicho = pred_test, Real = testData$satisfaccion_servicio)
tabla_test
##         Real
## Predicho Alta Baja Media
##    Alta     0    0     0
##    Baja     0   57     8
##    Media    6    9    20
acc_test <- sum(diag(tabla_test)) / sum(tabla_test)
acc_test
## [1] 0.77

5.5. Gráfico del Árbol de decisión

plot(arbol_satisfaccion)

6. Interpretación de resultados y conclusiones

6.1. Interpretación de Resultados

El análisis exploratorio permitió identificar que el comportamiento y la distribución de las variables operativas del centro de atención, evidencia variaciones en indicadores como llamadas atendidas, tiempos de atención, reclamos e interrupciones del sistema, y de manera directa afectan a la satisfacción del cliente y el número de reclamos.

Los histogramas y boxplots mostraron distribuciones relativamente concentradas y algunas variaciones entre turnos (Mañana, Tarde, Noche) y equipos de atención (E1, E2, E3).

Los gráficos de dispersión y la matriz de correlación sugieren que mayores tiempos de atención y mayores números de interrupciones del sistema tienden a asociarse con un incremento en los reclamos de clientes, lo cual puede afectar negativamente el nivel de satisfacción del servicio.

El modelo de árbol de decisión permitió identificar qué variables como: reclamos de clientes, interrupciones del sistema y tiempo promedio de atención son factores clave para clasificar la satisfacción del servicio (Baja, Media, Alta), es decir, tienen mayor impacto en la satisfacción del servicio.

6.2. Conclusiones

  • El análisis exploratorio permitió identificar que el volumen promedio de llamadas atendidas por hora se concentra alrededor de 40–45 llamadas, mientras que el tiempo promedio de atención se sitúa aproximadamente entre 5 y 6 minutos. Estos valores reflejan un nivel operativo relativamente estable en la mayoría de las jornadas analizadas.

  • Los gráficos de dispersión y la matriz de correlación evidencian que incrementos en el tiempo promedio de atención tienden a asociarse con un mayor número de reclamos de clientes. De igual manera, la presencia de interrupciones del sistema muestra una relación directa con el aumento de incidencias reportadas, lo que indica que la estabilidad tecnológica influye significativamente en la calidad del servicio.

  • El modelo de árbol de decisión indica que las variables con mayor influencia en la clasificación del nivel de satisfacción del cliente son: reclamos de clientes, interrupciones del sistema, y el tiempo promedio de atención. Además, los niveles altos de reclamos e interrupciones se asocian directamente con los niveles bajos de satisfacción, mientras que una menor incidencia y tiempos de atención moderados tienden a relacionarse con niveles medios o altos de satisfacción del servicio.

  • El árbol de decisión logra clasificar adecuadamente los niveles de satisfacción tanto en el conjunto de entrenamiento como en el conjunto de prueba, lo que indica que el modelo tiene una capacidad adecuada de generalización y no presenta evidencias significativas de sobreajuste.

  • Las estrategias para lograr una mejora del servicio deberían enfocarse principalmente en: reducir las interrupciones del sistema, optimizar los tiempos promedio de atención, disminuir la frecuencia de reclamos mediante mejoras en la resolución de consultas.