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:
- Sucursal: tiene información de las transacciones, columnas: Sucursal, Cajero, ID Transacción, Transacción, Tiempo Servicio seg, Nivel de satisfacción, Monto de la transacción.
- Data_Sucursal: información referente a la ubicación y si en la sucursal se ha puesto o no un nuevo sistema.
- Data_Cajero: información referente a datos del cajero.
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
## ##