Apellidos: Jurado Cuesta

Nombre: Xavier

Contexto del problema

Con el objetivo de mejorar los tiempos de atención al cliente en ventanilla de un Banco, se ha recolectado información anónimamente de cada cajero y transacción realizada. Para el estudio, el Banco ha suministrado un archivo de excel con tres hojas:

Nota: Es necesario tener presente los tipos de datos que tenemos en el archivo de excel, para cada una de las hojas. Por ejemplo, en la hoja Sucursal: La variable Sucursal, debe ser considerada como una variable categórica nominal (en R se considera a las variables categóricas como factores); Cajero: La variable Cajero, es una variable categórica nominal; IDTransaccion: La variable IDTransaccion,es una variable categórica nominal; Transaccion: La variable Transaccion, es una variable categórica nominal; TiempoServicioseg: La variable TiempoServicioseg, es una variable numérica; Satisfaccion: La variable Satisfaccion, es una variable categórica ordinal; Monto: La variable Monto, es una variable numérica.

Lectura de los datos

library(readxl)

Sucursal <- read_excel("Data_Banco.xlsx", 
    sheet = "Sucursal")
summary(Sucursal)
##     Sucursal         Cajero     ID_Transaccion     Transaccion       
##  Min.   : 62.0   Min.   :  56   Length:24299       Length:24299      
##  1st Qu.: 85.0   1st Qu.: 472   Class :character   Class :character  
##  Median : 85.0   Median :3678   Mode  :character   Mode  :character  
##  Mean   :208.1   Mean   :2919                                        
##  3rd Qu.:443.0   3rd Qu.:3983                                        
##  Max.   :586.0   Max.   :5286                                        
##  Tiempo_Servicio_seg Satisfaccion           Monto        
##  Min.   :  18.13     Length:24299       Min.   :  53.82  
##  1st Qu.:  75.69     Class :character   1st Qu.:1417.73  
##  Median : 122.45     Mode  :character   Median :2087.43  
##  Mean   : 155.58                        Mean   :1996.16  
##  3rd Qu.: 197.73                        3rd Qu.:2482.09  
##  Max.   :1602.70                        Max.   :6278.02
Data_Sucursal <- read_excel("Data_Banco.xlsx", 
    sheet = "Data_Sucursal")
summary(Data_Sucursal)
##   ID_Sucursal      Sucursal         Nuevo_Sistema     
##  Min.   : 62.0   Length:5           Length:5          
##  1st Qu.: 85.0   Class :character   Class :character  
##  Median :267.0   Mode  :character   Mode  :character  
##  Mean   :288.6                                        
##  3rd Qu.:443.0                                        
##  Max.   :586.0
Data_Cajero <- read_excel("Data_Banco.xlsx", 
    sheet = "Data_Cajero")
summary(Data_Cajero)
##      Cajero            Edad           Sexo           Nivel_Formacion   
##  Min.   :  56.0   Min.   :22.00   Length:27          Length:27         
##  1st Qu.: 414.5   1st Qu.:26.00   Class :character   Class :character  
##  Median :3023.0   Median :30.00   Mode  :character   Mode  :character  
##  Mean   :2794.3   Mean   :32.96                                        
##  3rd Qu.:4388.5   3rd Qu.:38.00                                        
##  Max.   :5286.0   Max.   :55.00                                        
##   Anio Ingreso 
##  Min.   :1984  
##  1st Qu.:2002  
##  Median :2011  
##  Mean   :2008  
##  3rd Qu.:2014  
##  Max.   :2017

Procedemos a verificar el tipo de dato que tenemos en las bases previamente importadas. Y de ser necesario modificar el tipo de dato para los analisis posteriores.

# Para la base Sucursal

is.factor(Sucursal$Sucursal)
## [1] FALSE
Sucursal$Sucursal = as.factor(Sucursal$Sucursal)

is.factor(Sucursal$Cajero)
## [1] FALSE
Sucursal$Cajero = as.factor(Sucursal$Cajero)

is.factor(Sucursal$ID_Transaccion)
## [1] FALSE
Sucursal$ID_Transaccion = as.factor(Sucursal$ID_Transaccion)

is.factor(Sucursal$Transaccion)
## [1] FALSE
Sucursal$Transaccion = as.factor(Sucursal$Transaccion)

is.numeric(Sucursal$Tiempo_Servicio_seg)
## [1] TRUE
is.factor(Sucursal$Satisfaccion)
## [1] FALSE
Sucursal$Satisfaccion = as.factor(Sucursal$Satisfaccion)

is.numeric(Sucursal$Monto)
## [1] TRUE
# Para la base Data_Sucursal

is.factor(Data_Sucursal$ID_Sucursal)
## [1] FALSE
Data_Sucursal$ID_Sucursal = as.factor(Data_Sucursal$ID_Sucursal)

is.factor(Data_Sucursal$Sucursal)
## [1] FALSE
Data_Sucursal$Sucursal = as.factor(Data_Sucursal$Sucursal)

is.factor(Data_Sucursal$Nuevo_Sistema)
## [1] FALSE
Data_Sucursal$Nuevo_Sistema = as.factor(Data_Sucursal$Nuevo_Sistema)

# Para la base Data_Cajero

is.factor(Data_Cajero$Cajero)
## [1] FALSE
Data_Cajero$Cajero = as.factor(Data_Cajero$Cajero)

is.numeric(Data_Cajero$Edad)
## [1] TRUE
is.factor(Data_Cajero$Sexo)
## [1] FALSE
Data_Cajero$Sexo = as.factor(Data_Cajero$Sexo)

is.factor(Data_Cajero$Nivel_Formacion)
## [1] FALSE
Data_Cajero$Nivel_Formacion = as.factor(Data_Cajero$Nivel_Formacion)

is.factor(Data_Cajero$`Anio Ingreso`)
## [1] FALSE
Data_Cajero$`Anio Ingreso` = as.factor(Data_Cajero$`Anio Ingreso`)

Presentamos las bases que se usaran corrigiendo los tipos de datos que se menciono previamente.

summary(Sucursal)
##  Sucursal        Cajero      ID_Transaccion                      Transaccion   
##  62 : 2838   3983   : 4280   10: 5407       Cobrar cheque (Cta del Bco): 5407  
##  85 :12044   472    : 2764   2 : 3005       Cobro/Pago (Cta externa)   : 3005  
##  267: 3329   3678   : 1962   3 :15887       Deposito                   :15887  
##  443: 4190   357    : 1832                                                     
##  586: 1898   2503   : 1578                                                     
##              4208   : 1471                                                     
##              (Other):10412                                                     
##  Tiempo_Servicio_seg    Satisfaccion      Monto        
##  Min.   :  18.13     Bueno    :5915   Min.   :  53.82  
##  1st Qu.:  75.69     Malo     :4474   1st Qu.:1417.73  
##  Median : 122.45     Muy Bueno:6262   Median :2087.43  
##  Mean   : 155.58     Muy Malo :3009   Mean   :1996.16  
##  3rd Qu.: 197.73     Regular  :4639   3rd Qu.:2482.09  
##  Max.   :1602.70                      Max.   :6278.02  
## 
summary(Data_Sucursal)
##  ID_Sucursal          Sucursal Nuevo_Sistema
##  62 :1       Alborada     :1   No:2         
##  85 :1       Centro       :1   Si:3         
##  267:1       Mall del Sol :1                
##  443:1       Riocentro Sur:1                
##  586:1       Via Daule    :1
summary(Data_Cajero)
##      Cajero        Edad       Sexo       Nivel_Formacion  Anio Ingreso
##  56     : 1   Min.   :22.00   F:17   Bachiller   : 9     2012   : 3   
##  63     : 1   1st Qu.:26.00   M:10   Tecnologia  : 3     2013   : 3   
##  70     : 1   Median :30.00          Tercer nivel: 4     2016   : 3   
##  87     : 1   Mean   :32.96          Univ Incom. :11     2017   : 3   
##  299    : 1   3rd Qu.:38.00                              2008   : 2   
##  321    : 1   Max.   :55.00                              2010   : 2   
##  (Other):21                                              (Other):11

Una vez verificado que nuetras variables y nuestros datos se encuentran en orden, procedemos con el analisis.

Enunciado del problema:

Determinar el perfil (edad, género, años de servicio, etc.) del mejor cajero que tiene el banco para la sucursal que tiene más transacciones en función del nivel de satisfacción evaluado por el cliente, considerando los tiempos de servicio que dependen del tipo de transacción. Además, de otras características que considere que puedan describir el perfil del cajero.

1.- (40%) Homegenización de los datos (Detección de anomalías).

Determine los valores atípicos y perdidos si los hubiera, referente a los tiempos de las transacciones (hoja Sucursal) considerando solo la sucursal con la mayor cantidad de transacciones.

Considerando como máximo un 10% de atípicos y un 20 % de valores perdidos, realice la correspondiente imputación en los datos perdidos y anómalos.

Primero consideremos la posibilidad de que existan valores faltandes en nuestra base de datos. Por lo tanto usando la funsion missing de R en la base de datos "Sucursal"

missing(Sucursal)
## [1] FALSE

Dado que obtuvimos una respuesta negativa por parte del software podemos considerar que no existen valores faltantes dentro de la base de datos "Sucursal".
Ahora, consideremos la variable "tiempo_servicio_seg" para buscar valores atípicos dentro de esta valiable, para ello consideraremos en primera instancia el diagrama de caja para visualización de los datos.

tiempo_servicio <- Sucursal$Tiempo_Servicio_seg
boxplot(tiempo_servicio)

Como podemos observar existen muchos valores atipicos dentro de esta valiable.

library(nortest)
library(normtest)
library(moments)

hist(tiempo_servicio)

#jb.norm.test(tiempo_servicio)

Dado que con el test de Jarque-Bera (por liminaciones computacionales ya que se demoro mucho en cargar no corri tambien con Kolmogorov-smirnov) se rechaza la hipotesis de normalidad con una confiabilidad del 95%.

A continuacion, realizare un contraste cn la variable "Monto" para buscar anomalias por el vecino mas cercano.

monto <- Sucursal$Monto

plot(tiempo_servicio, monto)

Como podemos observar existe una gran consentración de los datos en base al tiempo de servicio y al monto que se retira a excepcion de un punto que se encuentra muy alejado de los demas puntos.

library(FNN)
m1 <- cbind(tiempo_servicio, monto)
knn1 <- get.knn(data =m1, k = 5)
names(knn1)
## [1] "nn.index" "nn.dist"
head(knn1$nn.dist, 10)
##             [,1]      [,2]      [,3]      [,4]      [,5]
##  [1,]  6.7880943  7.641685  7.791913 10.072729 11.998531
##  [2,]  3.7156720  4.230495  6.507576  6.863704  7.705559
##  [3,]  5.3524294  7.730273  9.203842  9.774407 11.156144
##  [4,]  3.6152331  4.491383  4.771680  5.231787  5.424708
##  [5,]  4.3594044  4.487538  5.649504  7.609314  9.334672
##  [6,]  0.3561124  5.930091  5.976086  6.256824  6.373930
##  [7,]  2.1615735  4.094850  4.388829  5.228953  5.436722
##  [8,] 12.7690012 25.620905 39.269021 47.697866 52.266980
##  [9,]  2.7925619  3.715262  4.039170  4.062362  4.788238
## [10,]  1.4494970  2.218468  2.300131  3.246146  3.293327
score1 <- rowMeans(knn1$nn.dist)
which.max(score1)
## [1] 10331

De donde obtenemos un valor atípico en "10331".

2.- (60%) Análisis descriptivo.

Realizar un informe que permita cumplir el objetivo planteado en el enunciado del problema, considerando las tres hojas de excel y considerando solo la sucursal con la mayor cantidad de transacciones. Para este informe considere la base homeginizada.

Consideremos unicamente la sucursal con mas transcacciones así, que si notamos en el inicio es la sucursal "85":

suc <- Sucursal[Sucursal[,1]=='85',]
## Warning: The `i` argument of ``[`()` can't be a matrix as of tibble 3.0.0.
## Convert to a vector.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_warnings()` to see where this warning was generated.
View(suc)

2.1.- Realizar un análisis descriptivo utilizando la información de las tres hojas de excel.

Procedemos a hacer un ACP, así:

library(Rcpp)
library(Amelia)
## ## 
## ## Amelia II: Multiple Imputation
## ## (Version 1.7.6, built: 2019-11-24)
## ## Copyright (C) 2005-2021 James Honaker, Gary King and Matthew Blackwell
## ## Refer to http://gking.harvard.edu/amelia/ for more information
## ##

2.2.- Describa el perfil del cajero con mayor desempeño y complemente el informe descriptivo con recomendaciones para mejorar la satisfacción de los clientes.

Observación: para el desarrollo del examen pueden utilizar cualquier software, sin embargo se recomienda utilizar el software estadístico R (subir un proyecto comprimido con el nombre del estudiante).