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:
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
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
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)
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.
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
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
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")
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")
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")
vars_numericas <- dataset_callcenter %>%
dplyr::select(llamadas_hora, tiempo_promedio_atencion, reclamos_clientes, interrupciones_sistema)
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
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")
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.
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
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
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
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
plot(arbol_satisfaccion)
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.
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.