Tratamiento, modelizacion y visualizacion con R

Tomado del archivo de Nestor Montaño - Agosto 2019, R User Group Ecuador

Ejemplo: Data de transacciones bancarias

El Banco del Pacifico requiere mejorar los tiempos de atencion al cliente en ventanilla, para ello ha recolectado esta informacion anonimamente para cada cajero y transaccion realizada.

Le suministran un excel con dos hojas:

  1. Tiene los datos de las transacciones, columnas: Sucursal, Cajero, ID_Transaccion, Transaccion, Tiempo_Servicio_eg, Nivel de satisfaccion, Monto de la transaccion

  2. Otra hoja que indica si en la sucursal se ha puesto o no el nuevo sistema

Importar Datos

# Cargar la libreria a utilizar
library(openxlsx)
# Leer el archivo de excel y asignarlo al objeto data_banco
data_banco <- read.xlsx(xlsxFile = "Data/Data_Banco.xlsx", sheet = "Sucursal")
data_sucursal <- read.xlsx(xlsxFile = "Data/Data_Banco.xlsx", sheet = "Data_Sucursal")
data_cajero <- read.xlsx(xlsxFile = "Data/Data_Banco.xlsx", sheet = "Data_Cajero")

hemos cargado las 3 hojas de nuextro archivo de excel.

Estructura de los datos

¿qué tipo de estructura hemos importado?. Por ejemplo tomamos la data Sucursal

str(data_banco)
'data.frame':   24299 obs. of  7 variables:
 $ Sucursal           : num  62 62 62 62 62 62 62 62 62 62 ...
 $ Cajero             : num  4820 4820 4820 4820 4820 4820 4820 4820 4820 4820 ...
 $ ID_Transaccion     : chr  "2" "2" "2" "2" ...
 $ Transaccion        : chr  "Cobro/Pago (Cta externa)" "Cobro/Pago (Cta externa)" "Cobro/Pago (Cta externa)" "Cobro/Pago (Cta externa)" ...
 $ Tiempo_Servicio_seg: num  311 156 248 99 123 172 140 247 183 91 ...
 $ Satisfaccion       : chr  "Muy Bueno" "Malo" "Regular" "Regular" ...
 $ Monto              : num  2889 1671 3172 1765 1836 ...

Entender los datos

ver las primeras 5 filas

head(data_sucursal, n = 5)
  ID_Sucursal      Sucursal Nuevo_Sistema
1          62 Riocentro Sur            No
2          85        Centro            Si
3         267      Alborada            Si
4         443  Mall del Sol            Si
5         586     Via Daule            No

Listar los nombres de las columnas

names(data_banco)
[1] "Sucursal"            "Cajero"              "ID_Transaccion"     
[4] "Transaccion"         "Tiempo_Servicio_seg" "Satisfaccion"       
[7] "Monto"              
names(data_sucursal)
[1] "ID_Sucursal"   "Sucursal"      "Nuevo_Sistema"

¿Están bien nuestros tipos de datos?

# Ver la estructura del data.frame
str(data_banco)
'data.frame':   24299 obs. of  7 variables:
 $ Sucursal           : num  62 62 62 62 62 62 62 62 62 62 ...
 $ Cajero             : num  4820 4820 4820 4820 4820 4820 4820 4820 4820 4820 ...
 $ ID_Transaccion     : chr  "2" "2" "2" "2" ...
 $ Transaccion        : chr  "Cobro/Pago (Cta externa)" "Cobro/Pago (Cta externa)" "Cobro/Pago (Cta externa)" "Cobro/Pago (Cta externa)" ...
 $ Tiempo_Servicio_seg: num  311 156 248 99 123 172 140 247 183 91 ...
 $ Satisfaccion       : chr  "Muy Bueno" "Malo" "Regular" "Regular" ...
 $ Monto              : num  2889 1671 3172 1765 1836 ...
# Cargar la librería
library(tidyverse)
library(dplyr)

Tibbles (un dataframe mejorado):

Tibble es un objeto del paquete dplyr, entre las mejoras que da es que no imprime todo el objeto en pantalla, sino un resumen del mismo. (más información tipeando ?tibble)

# Convertir el data_banco a un tibble
data_banco <- tbl_df(data_banco)
# Muestra data_banco
data_banco
# A tibble: 24,299 x 7
   Sucursal Cajero ID_Transaccion Transaccion Tiempo_Servicio~ Satisfaccion
      <dbl>  <dbl> <chr>          <chr>                  <dbl> <chr>       
 1       62   4820 2              Cobro/Pago~              311 Muy Bueno   
 2       62   4820 2              Cobro/Pago~              156 Malo        
 3       62   4820 2              Cobro/Pago~              248 Regular     
 4       62   4820 2              Cobro/Pago~               99 Regular     
 5       62   4820 2              Cobro/Pago~              123 Muy Bueno   
 6       62   4820 2              Cobro/Pago~              172 Bueno       
 7       62   4820 2              Cobro/Pago~              140 Regular     
 8       62   4820 2              Cobro/Pago~              247 Bueno       
 9       62   4820 2              Cobro/Pago~              183 Muy Bueno   
10       62   4820 2              Cobro/Pago~               91 Muy Bueno   
# ... with 24,289 more rows, and 1 more variable: Monto <dbl>

Seleccionar columnas: select() Seleccionar las columnas Transaccion, Tiempo_Servicio_seg del data.frame data_banco

# Note que como no se asignó, R evalúa la expresión y presenta el resultado
select(data_banco, Transaccion, Tiempo_Servicio_seg)
# A tibble: 24,299 x 2
   Transaccion              Tiempo_Servicio_seg
   <chr>                                  <dbl>
 1 Cobro/Pago (Cta externa)                 311
 2 Cobro/Pago (Cta externa)                 156
 3 Cobro/Pago (Cta externa)                 248
 4 Cobro/Pago (Cta externa)                  99
 5 Cobro/Pago (Cta externa)                 123
 6 Cobro/Pago (Cta externa)                 172
 7 Cobro/Pago (Cta externa)                 140
 8 Cobro/Pago (Cta externa)                 247
 9 Cobro/Pago (Cta externa)                 183
10 Cobro/Pago (Cta externa)                  91
# ... with 24,289 more rows

Operador Pipe: %>%

El operador Pipe %>% del paquete magrittr permiten que el código sea más legible porque:

  • Permite secuencias estructurantes de operaciones de datos de izquierda a derecha (a diferencia de dentro y fuera),
  • Evitando llamadas a funciones anidadas,
  • Minimiza la necesidad de variables locales y definiciones de funciones
  • Facilita agregar pasos en cualquier lugar de la programación

para acceder rapidamente al operador presionar en el teclado: ctrl + Shift + m

library(magrittr)
data_banco %>% names
[1] "Sucursal"            "Cajero"              "ID_Transaccion"     
[4] "Transaccion"         "Tiempo_Servicio_seg" "Satisfaccion"       
[7] "Monto"              
data_banco %>% head(, n = 5)
# A tibble: 5 x 7
  Sucursal Cajero ID_Transaccion Transaccion Tiempo_Servicio~ Satisfaccion Monto
     <dbl>  <dbl> <chr>          <chr>                  <dbl> <chr>        <dbl>
1       62   4820 2              Cobro/Pago~              311 Muy Bueno    2889.
2       62   4820 2              Cobro/Pago~              156 Malo         1671.
3       62   4820 2              Cobro/Pago~              248 Regular      3172.
4       62   4820 2              Cobro/Pago~               99 Regular      1765.
5       62   4820 2              Cobro/Pago~              123 Muy Bueno    1836.

Seleccionar columnas: select()

Seleccionar las columnas Transaccion, Tiempo_Servicio_seg del data.frame data_banco pero usando %>%, lo que permite programar como si se escribiese “del data_banco, selecciona las columnas Transaccion y Tiempo_Servicio_seg”

# Note que como no se asignó, R evalúa la expresión y presenta el resultado Se
# lee, del data_banco, selecciona las columnas Transaccion y Tiempo_Servicio_seg
# data_banco[ , c('Transaccion', 'Tiempo_Servicio_seg') ] ## Base de R
data_banco %>% select(Transaccion, Tiempo_Servicio_seg)
# A tibble: 24,299 x 2
   Transaccion              Tiempo_Servicio_seg
   <chr>                                  <dbl>
 1 Cobro/Pago (Cta externa)                 311
 2 Cobro/Pago (Cta externa)                 156
 3 Cobro/Pago (Cta externa)                 248
 4 Cobro/Pago (Cta externa)                  99
 5 Cobro/Pago (Cta externa)                 123
 6 Cobro/Pago (Cta externa)                 172
 7 Cobro/Pago (Cta externa)                 140
 8 Cobro/Pago (Cta externa)                 247
 9 Cobro/Pago (Cta externa)                 183
10 Cobro/Pago (Cta externa)                  91
# ... with 24,289 more rows
# Seleccionar la columna Tiempo_Servicio_seg y obtener un boxplot
# boxplot(data_banco$Tiempo_Servicio_seg) ## Base de R
data_banco %>% select(Tiempo_Servicio_seg) %>% boxplot

# Seleccionar la columna Tiempo_Servicio_seg y obtener los fivenumbers de Tukey
data_banco %$% fivenum(Tiempo_Servicio_seg, na.rm = TRUE)
[1]   18.13177   75.69119  122.45229  197.73046 1602.69832

Seleccionar todas las columnas menos Cajero

data_banco %>% select(-Cajero) %>% View

Seleccionar según nombre de la columna/variable.

# Seleccionar todas las columnas cuyo nombre contenga el texto 'Tra'
data_banco %>% select(contains("Tra")) %>% View
# Seleccionar todas las columnas cuyo nombre inicie con 'S'
data_banco %>% select(starts_with("S")) %>% View
# Seleccionar todas las columnas cuyo nombre finalice con 'on'
data_banco %>% select(ends_with("on")) %>% View
# Seleccionar todas las columnas cuyo nombre contenga una 'r' o un 'sa'
data_banco %>% select(matches("r?sa")) %>% View
# Más información sobre expresiones regulares usando: ?base::regex

Filtrar/Seleccionar filas: filter()

Filtrar las filas según las condiciones dadas en filter()

# Filtrar las filas correspondientes a la sucursal 62
data_banco %>% filter(Sucursal == 62) %>% View
# Filtrar las filas correspondientes a la sucursal 62 y hayan durado más de 120
# segundos
data_banco %>% filter(Sucursal == 62 & Tiempo_Servicio_seg > 120) %>% View
# Filtrar las filas correspondientes a la sucursal 62, hayan durado más de 120
# segundos y la evaluación a la satisfacción sea Bueno
data_banco %>% filter(Sucursal == 62 & Tiempo_Servicio_seg > 120 & Satisfaccion == 
    "Muy Bueno") %>% View

Filtrar filas y seleccionar

# Con el data banco
# Filtrar las filas correspondientes a la sucursal 85
# calcular la correlacion entre Tiempo_Servicio_seg y Monto
data_banco %>% # Operador pipe total
  filter( Sucursal== 85 ) %$%  # Operador pipe para seleccion de columnas
  cor(Tiempo_Servicio_seg, as.numeric(Monto))
[1] 0.5339392

Ordenar las filas: arrange()

# Ordenar por la satisfaccion
data_banco %>% arrange(Satisfaccion) %>% View
# Ordenar cada Transaccion y dentro de cada transaccion de mayor a menor por
# tiempo de servicio
data_banco %>% arrange(Transaccion, desc(Tiempo_Servicio_seg)) %>% View

Crear o modificar columnas/variables mutate()

# Crear una nueva columna con el tiempo en minutos
data_banco %>% mutate(Tiempo_Servicio_Min = Tiempo_Servicio_seg/60)
# A tibble: 24,299 x 8
   Sucursal Cajero ID_Transaccion Transaccion Tiempo_Servicio~ Satisfaccion
      <dbl>  <dbl> <chr>          <chr>                  <dbl> <chr>       
 1       62   4820 2              Cobro/Pago~              311 Muy Bueno   
 2       62   4820 2              Cobro/Pago~              156 Malo        
 3       62   4820 2              Cobro/Pago~              248 Regular     
 4       62   4820 2              Cobro/Pago~               99 Regular     
 5       62   4820 2              Cobro/Pago~              123 Muy Bueno   
 6       62   4820 2              Cobro/Pago~              172 Bueno       
 7       62   4820 2              Cobro/Pago~              140 Regular     
 8       62   4820 2              Cobro/Pago~              247 Bueno       
 9       62   4820 2              Cobro/Pago~              183 Muy Bueno   
10       62   4820 2              Cobro/Pago~               91 Muy Bueno   
# ... with 24,289 more rows, and 2 more variables: Monto <dbl>,
#   Tiempo_Servicio_Min <dbl>

Crear una nueva columna con el tiempo en minutos

# Crear una nueva columna con el tiempo en minutos
data_banco %>% mutate(Tiempo_Servicio_Min = Tiempo_Servicio_seg/60)
# A tibble: 24,299 x 8
   Sucursal Cajero ID_Transaccion Transaccion Tiempo_Servicio~ Satisfaccion
      <dbl>  <dbl> <chr>          <chr>                  <dbl> <chr>       
 1       62   4820 2              Cobro/Pago~              311 Muy Bueno   
 2       62   4820 2              Cobro/Pago~              156 Malo        
 3       62   4820 2              Cobro/Pago~              248 Regular     
 4       62   4820 2              Cobro/Pago~               99 Regular     
 5       62   4820 2              Cobro/Pago~              123 Muy Bueno   
 6       62   4820 2              Cobro/Pago~              172 Bueno       
 7       62   4820 2              Cobro/Pago~              140 Regular     
 8       62   4820 2              Cobro/Pago~              247 Bueno       
 9       62   4820 2              Cobro/Pago~              183 Muy Bueno   
10       62   4820 2              Cobro/Pago~               91 Muy Bueno   
# ... with 24,289 more rows, and 2 more variables: Monto <dbl>,
#   Tiempo_Servicio_Min <dbl>

Crear una nueva columna con el tiempo en minutos

# Crear una nueva columna con el tiempo en minutos
data_banco <- data_banco %>% mutate(Tiempo_Servicio_Min = Tiempo_Servicio_seg/60)
# Mostrar
data_banco
# A tibble: 24,299 x 8
   Sucursal Cajero ID_Transaccion Transaccion Tiempo_Servicio~ Satisfaccion
      <dbl>  <dbl> <chr>          <chr>                  <dbl> <chr>       
 1       62   4820 2              Cobro/Pago~              311 Muy Bueno   
 2       62   4820 2              Cobro/Pago~              156 Malo        
 3       62   4820 2              Cobro/Pago~              248 Regular     
 4       62   4820 2              Cobro/Pago~               99 Regular     
 5       62   4820 2              Cobro/Pago~              123 Muy Bueno   
 6       62   4820 2              Cobro/Pago~              172 Bueno       
 7       62   4820 2              Cobro/Pago~              140 Regular     
 8       62   4820 2              Cobro/Pago~              247 Bueno       
 9       62   4820 2              Cobro/Pago~              183 Muy Bueno   
10       62   4820 2              Cobro/Pago~               91 Muy Bueno   
# ... with 24,289 more rows, and 2 more variables: Monto <dbl>,
#   Tiempo_Servicio_Min <dbl>

Nuevas columnas transmute()

# Crear una nueva columna con el tiempo en minutos
data_banco %>% transmute(Tiempo_Servicio_Min = Tiempo_Servicio_seg/60)
# A tibble: 24,299 x 1
   Tiempo_Servicio_Min
                 <dbl>
 1                5.18
 2                2.6 
 3                4.13
 4                1.65
 5                2.05
 6                2.87
 7                2.33
 8                4.12
 9                3.05
10                1.52
# ... with 24,289 more rows

Manipulacion(correcion) de datos

Volvemos al ejemplo de nuestra data_banco

Lo primero que necesitamos es corregir los tipos de datos, nótese que

  • Monto tiene una mezcla de “,” y “.”
  • Sucursal y Cajero deberían ser de tipo character
  • Satisfaccion debe ser factor ordenado
data_banco <- data_banco %>% mutate(Monto = str_replace(Monto, pattern = ",", replacement = ".")) %>% 
    mutate(Sucursal = as.character(Sucursal), Cajero = as.character(Cajero), Satisfaccion = parse_factor(Satisfaccion, 
        levels = c("Muy Malo", "Malo", "Regular", "Bueno", "Muy Bueno"), ordered = T), 
        Monto = parse_number(Monto, locale = locale(decimal_mark = ".")))

Con los datos corregidos, podemos empezar a explorar, para ello además de poder seleccionar columnas o filtrar filas, debemos poder calcular medidas estadísticas que nos permitan entender nuestros datos

Medidas de Tendencia Central

# Media mean(data_banco$Tiempo_Servicio_seg, na.rm = TRUE) ## Base R
data_banco %$% mean(Tiempo_Servicio_seg, na.rm = TRUE)
[1] 155.58
# Mediana
data_banco %$% median(Tiempo_Servicio_seg, na.rm = TRUE)
[1] 122.4523
# Media de Huber MASS::huber(data_banco$Tiempo_Servicio_seg)$mu ## Base R
data_banco %$% MASS::huber(Tiempo_Servicio_seg) %>% as.data.frame() %>% select(mu)
        mu
1 138.0164

Medidas de Posición

# Deciles
quantile(data_banco$Tiempo_Servicio_seg, probs = seq(from = 0.1, to = 1, by = 0.1))
      10%       20%       30%       40%       50%       60%       70%       80% 
  49.6230   67.0000   84.0000  102.0000  122.4523  146.9901  178.8348  220.2469 
      90%      100% 
 298.7826 1602.6983 
# Centil 5% y 95%
quantile(data_banco$Tiempo_Servicio_seg, probs = c(0.05, 0.95))
      5%      95% 
 39.0000 382.9779 

Medidas de Posición - Boxplot

boxplot(data_banco$Tiempo_Servicio_seg, main = "Boxplot para Tiempo de Servicio (seg)", 
    ylab = "Tiempo")

library("ggplot2")
ggplot(data = data_banco, aes(x = "", y = Tiempo_Servicio_seg)) + geom_boxplot()

# Cortar el gráfico (outliers)
q95 <- quantile(data_banco$Tiempo_Servicio_seg, probs = 0.95)
ggplot(data = data_banco, aes(x = "", y = Tiempo_Servicio_seg)) + geom_boxplot() + 
    coord_cartesian(ylim = c(0, q95))

# Gráfico de forma horizontal y titulo
q95 <- quantile(data_banco$Tiempo_Servicio_seg, probs = 0.95)
ggplot(data = data_banco, aes(x = "", y = Tiempo_Servicio_seg)) + geom_boxplot() + 
    coord_flip(ylim = c(20, q95)) + labs(title = "Boxplot para Tiempo de Servicio (seg)", 
    y = "Tiempo")

Medidas de Dispersión

# Varianza
var(data_banco$Tiempo_Servicio_seg, na.rm = TRUE)
[1] 14402.27
# Desviacion
sd(data_banco$Tiempo_Servicio_seg, na.rm = TRUE)
[1] 120.0095
# Mediana de las desviaciones absolutas
mad(data_banco$Tiempo_Servicio_seg, na.rm = TRUE)
[1] 82.35503
# Rango intercuartil
IQR(data_banco$Tiempo_Servicio_seg, na.rm = TRUE)
[1] 122.0393
# Min Max
range(data_banco$Tiempo_Servicio_seg, na.rm = TRUE)
[1]   18.13177 1602.69832
# Rango
diff(range(data_banco$Tiempo_Servicio_seg, na.rm = TRUE))
[1] 1584.567

Manipulacion de datos - Intermedio

Crear resúmenes summarise()

summarise() permite aplicar funciones a nuestro data.frame, en R-base se usa tapply(), otra opcion es ddply() del paquete plyr.

# Obtener la media del tiempo de servicio
data_banco %>% summarise(MEDIA = mean(Tiempo_Servicio_seg, na.rm = TRUE), MEDIA_ACOT = mean(Tiempo_Servicio_seg, 
    na.rm = TRUE, trim = 0.05), CANTIDAD = n())
# A tibble: 1 x 3
  MEDIA MEDIA_ACOT CANTIDAD
  <dbl>      <dbl>    <int>
1  156.       142.    24299

Crear resúmenes para datos agrupados

# Obtener medidas de tendencia central para el tiempo de servicio para cada tipo
# de transaccion
data_banco %>% group_by(Transaccion) %>% summarise_at(vars(Tiempo_Servicio_seg), 
    funs(MEDIA = mean(., na.rm = TRUE), MEDIA_ACOT = mean(., na.rm = TRUE, trim = 0.05), 
        CANTIDAD = n()))
# A tibble: 3 x 4
  Transaccion                 MEDIA MEDIA_ACOT CANTIDAD
  <chr>                       <dbl>      <dbl>    <int>
1 Cobrar cheque (Cta del Bco)  186.       175.     5407
2 Cobro/Pago (Cta externa)     301.       285.     3005
3 Deposito                     118.       112.    15887
# Obtener medidas de tendencia central para el tiempo de servicio para cada
# Transaccion y Nivel de Satisfaccion
data_banco %>% group_by(Transaccion, Satisfaccion) %>% summarise_at(vars(Tiempo_Servicio_seg), 
    funs(MEDIA = mean(., na.rm = TRUE), MEDIA_ACOT = mean(., na.rm = TRUE, trim = 0.05), 
        CANTIDAD = n()))
# A tibble: 15 x 5
# Groups:   Transaccion [3]
   Transaccion                 Satisfaccion MEDIA MEDIA_ACOT CANTIDAD
   <chr>                       <ord>        <dbl>      <dbl>    <int>
 1 Cobrar cheque (Cta del Bco) Muy Malo      186.       175.      505
 2 Cobrar cheque (Cta del Bco) Malo          183.       174.      840
 3 Cobrar cheque (Cta del Bco) Regular       188.       177.     1046
 4 Cobrar cheque (Cta del Bco) Bueno         185.       174.     1423
 5 Cobrar cheque (Cta del Bco) Muy Bueno     187.       176.     1593
 6 Cobro/Pago (Cta externa)    Muy Malo      272.       260.      238
 7 Cobro/Pago (Cta externa)    Malo          290.       271.      403
 8 Cobro/Pago (Cta externa)    Regular       307.       293.      556
 9 Cobro/Pago (Cta externa)    Bueno         309.       292.      851
10 Cobro/Pago (Cta externa)    Muy Bueno     304.       287.      957
11 Deposito                    Muy Malo      113.       108.     2266
12 Deposito                    Malo          116.       110.     3231
13 Deposito                    Regular       120.       113.     3037
14 Deposito                    Bueno         118.       112.     3641
15 Deposito                    Muy Bueno     119.       114.     3712

Crear resúmenes para datos agrupados y filtrados

Para la Sucursal 62, obtener medidas de tendencia central para el tiempo de servicio para cada Transaccion y Nivel de Satisfaccion

Obtener medidas de tendencia central para el tiempo de servicio para cada Sucursal

data_banco %>% filter( Sucursal== 62) %>% group_by(Transaccion, Satisfaccion) %>% summarise_at( vars(Tiempo_Servicio_seg), funs ( MEDIA= mean(., na.rm=TRUE), MEDIA_ACOT= mean(., na.rm = TRUE, trim = 0.05), CANTIDAD= n() ) )

Tablas de Frecuencia - V. Numérica

library("fdth")
## tabl_frec <- fdt( data_banco$Tiempo_Servicio_seg , breaks='Sturges' ) ## Base R
tabl_frec <- data_banco %$% fdt(Tiempo_Servicio_seg, breaks = "Sturges")
tabl_frec
        Class limits     f   rf rf(%)    cf cf(%)
 [17.95045,117.9989) 11642 0.48 47.91 11642 47.91
 [117.9989,218.0473)  7697 0.32 31.68 19339 79.59
 [218.0473,318.0957)  2910 0.12 11.98 22249 91.56
 [318.0957,418.1442)  1119 0.05  4.61 23368 96.17
 [418.1442,518.1926)   454 0.02  1.87 23822 98.04
  [518.1926,618.241)   241 0.01  0.99 24063 99.03
  [618.241,718.2894)   114 0.00  0.47 24177 99.50
 [718.2894,818.3379)    63 0.00  0.26 24240 99.76
 [818.3379,918.3863)    34 0.00  0.14 24274 99.90
 [918.3863,1018.435)    10 0.00  0.04 24284 99.94
 [1018.435,1118.483)     7 0.00  0.03 24291 99.97
 [1118.483,1218.532)     4 0.00  0.02 24295 99.98
 [ reached 'max' / getOption("max.print") -- omitted 4 rows ]

Histograma

hist(data_banco$Tiempo_Servicio_seg, breaks = "Sturges", main = "Histograma para la variable Tiempo de respuesta")

# Definiendo nosotros mismos los rangos tabl_frec <-
# fdt(data_banco$Tiempo_Servicio_seg, start = 0, end = 500, h = 50, right =
# FALSE) ## BaseR
tabl_frec <- data_banco %$% fdt(Tiempo_Servicio_seg, start = 0, end = 500, h = 50, 
    right = FALSE)
tabl_frec
 Class limits    f   rf rf(%)    cf cf(%)
       [0,50) 2464 0.10 10.14  2464 10.14
     [50,100) 6990 0.29 28.77  9454 38.91
    [100,150) 5378 0.22 22.13 14832 61.04
    [150,200) 3507 0.14 14.43 18339 75.47
    [200,250) 2281 0.09  9.39 20620 84.86
    [250,300) 1280 0.05  5.27 21900 90.13
    [300,350)  816 0.03  3.36 22716 93.49
    [350,400)  515 0.02  2.12 23231 95.60
    [400,450)  311 0.01  1.28 23542 96.88
    [450,500)  213 0.01  0.88 23755 97.76
ini <- tabl_frec$breaks["start"]
fin <- tabl_frec$breaks["end"]
ancho <- tabl_frec$breaks["h"]
maxim <- max(data_banco$Tiempo_Servicio_seg)
breaks_histog <- c(seq(from = ini, to = fin, by = ancho), maxim)
hist(data_banco$Tiempo_Servicio_seg, breaks_histog)

# Con ggplot2
ggplot(data = data_banco, aes(x = Tiempo_Servicio_seg)) + geom_histogram(aes(y = ..count..)) + 
    labs(title = "Histograma para Tiempo de Servicio (seg)", y = "Cantidad", x = "Tiempo")

# Tablas de Frecuencia - V. Cualitativa

# Table
table(data_banco$Transaccion)

Cobrar cheque (Cta del Bco)    Cobro/Pago (Cta externa) 
                       5407                        3005 
                   Deposito 
                      15887 
table(data_banco$Satisfaccion)

 Muy Malo      Malo   Regular     Bueno Muy Bueno 
     3009      4474      4639      5915      6262 
# Gráfico Vertical
barplot(table(data_banco$Transaccion))

par(las = 2)  # Poner horizontal los labels
par(mar = c(5, 12, 4, 2))  # Aumentar margen
barplot(table(data_banco$Transaccion), horiz = TRUE)

# Gráfico Vertical
barplot(table(data_banco$Satisfaccion))

### Con ggplot2

ggplot(data = data_banco, aes(x = Satisfaccion)) + geom_bar() + labs(title = "Grafico de barra para Nivel de Satisfaccion", 
    y = "Cantidad", x = "Nivel de Satisfaccion")

# Con ggplot2
ggplot(data = data_banco, aes(x = Satisfaccion)) + geom_bar() + coord_flip() + labs(title = "Grafico de barra para Nivel de Satisfaccion", 
    y = "Cantidad", x = "Nivel de Satisfaccion")

Descriptivas - Summary

Obtiene las siguientes estadísticas descriptivas:

  • Variables Numéricas: Min, Max, Cuartiles y Media
  • Variables carácter: El total de datos
  • Variables factor: frecuencias
  • summary()
summary(data_banco$Tiempo_Servicio_seg)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  18.13   75.69  122.45  155.58  197.73 1602.70 
summary(data_banco)
   Sucursal            Cajero          ID_Transaccion     Transaccion       
 Length:24299       Length:24299       Length:24299       Length:24299      
 Class :character   Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character   Mode  :character  
                                                                            
                                                                            
                                                                            
 Tiempo_Servicio_seg    Satisfaccion      Monto         Tiempo_Servicio_Min
 Min.   :  18.13     Muy Malo :3009   Min.   :  53.82   Min.   : 0.3022    
 1st Qu.:  75.69     Malo     :4474   1st Qu.:1417.73   1st Qu.: 1.2615    
 Median : 122.45     Regular  :4639   Median :2087.43   Median : 2.0409    
 Mean   : 155.58     Bueno    :5915   Mean   :1996.16   Mean   : 2.5930    
 3rd Qu.: 197.73     Muy Bueno:6262   3rd Qu.:2482.09   3rd Qu.: 3.2955    
 Max.   :1602.70                      Max.   :6278.02   Max.   :26.7116    

Descriptivas - PrettyR

describe() Puede ser más completo que summary

library(prettyR)
describe(data_banco, num.desc = c("mean", "sd", "median", "min", "max", "valid.n"))
Description of data_banco 

 Numeric 
                       mean     sd  median   min     max valid.n
Tiempo_Servicio_seg  155.58 120.01  122.45 18.13 1602.70   24299
Monto               1996.16 816.15 2087.43 53.82 6278.02   24299
Tiempo_Servicio_Min    2.59   2.00    2.04  0.30   26.71   24299

 Factor 
            
Satisfaccion Muy Bueno   Bueno Regular    Malo Muy Malo
     Count     6262.00 5915.00 4639.00 4474.00  3009.00
     Percent     25.77   24.34   19.09   18.41    12.38
Mode Muy Bueno 
         
Sucursal        85     443    267      62     586
  Count   12044.00 4190.00 3329.0 2838.00 1898.00
  Percent    49.57   17.24   13.7   11.68    7.81
Mode 85 
         
Cajero       3983     472    3678     357    2503    4208    3732    2958
  Count   4280.00 2764.00 1962.00 1832.00 1578.00 1471.00 1339.00 1327.00
  Percent   17.61   11.37    8.07    7.54    6.49    6.05    5.51    5.46
         
Cajero       4796    4820    5286     56   5211   2556    70    299   4837
  Count   1084.00 1067.00 1049.00 832.00 675.00 667.00 656.0 597.00 550.00
  Percent    4.46    4.39    4.32   3.42   2.78   2.74   2.7   2.46   2.26
         
Cajero      2623  4424    63  2230  3023  5174  3327  4353   87  321
  Count   182.00 94.00 81.00 53.00 51.00 47.00 37.00 14.00 7.00 3.00
  Percent   0.75  0.39  0.33  0.22  0.21  0.19  0.15  0.06 0.03 0.01
Mode 3983 
              
ID_Transaccion        3      10       2
       Count   15887.00 5407.00 3005.00
       Percent    65.38   22.25   12.37
Mode 3 
           
Transaccion Deposito Cobrar cheque (Cta del Bco) Cobro/Pago (Cta externa)
    Count   15887.00                     5407.00                  3005.00
    Percent    65.38                       22.25                    12.37
Mode Deposito 
Q25 <- function(x, na.rm = TRUE) {
    quantile(as.numeric(x), 0.25, na.rm = na.rm, names = FALSE)
}
Q75 <- function(x, na.rm = TRUE) {
    quantile(as.numeric(x), 0.75, na.rm = na.rm, names = FALSE)
}
describe(data_banco, num.desc = c("mean", "median", "sd", "min", "max", "Q25", "Q75", 
    "valid.n"))
Description of data_banco 

 Numeric 
                       mean  median     sd   min     max     Q25     Q75
Tiempo_Servicio_seg  155.58  122.45 120.01 18.13 1602.70   75.69  197.73
Monto               1996.16 2087.43 816.15 53.82 6278.02 1417.73 2482.09
Tiempo_Servicio_Min    2.59    2.04   2.00  0.30   26.71    1.26    3.30
                    valid.n
Tiempo_Servicio_seg   24299
Monto                 24299
Tiempo_Servicio_Min   24299

 Factor 
            
Satisfaccion Muy Bueno   Bueno Regular    Malo Muy Malo
     Count     6262.00 5915.00 4639.00 4474.00  3009.00
     Percent     25.77   24.34   19.09   18.41    12.38
Mode Muy Bueno 
         
Sucursal        85     443    267      62     586
  Count   12044.00 4190.00 3329.0 2838.00 1898.00
  Percent    49.57   17.24   13.7   11.68    7.81
Mode 85 
         
Cajero       3983     472    3678     357    2503    4208    3732    2958
  Count   4280.00 2764.00 1962.00 1832.00 1578.00 1471.00 1339.00 1327.00
  Percent   17.61   11.37    8.07    7.54    6.49    6.05    5.51    5.46
         
Cajero       4796    4820    5286     56   5211   2556    70    299   4837
  Count   1084.00 1067.00 1049.00 832.00 675.00 667.00 656.0 597.00 550.00
  Percent    4.46    4.39    4.32   3.42   2.78   2.74   2.7   2.46   2.26
         
Cajero      2623  4424    63  2230  3023  5174  3327  4353   87  321
  Count   182.00 94.00 81.00 53.00 51.00 47.00 37.00 14.00 7.00 3.00
  Percent   0.75  0.39  0.33  0.22  0.21  0.19  0.15  0.06 0.03 0.01
Mode 3983 
              
ID_Transaccion        3      10       2
       Count   15887.00 5407.00 3005.00
       Percent    65.38   22.25   12.37
Mode 3 
           
Transaccion Deposito Cobrar cheque (Cta del Bco) Cobro/Pago (Cta externa)
    Count   15887.00                     5407.00                  3005.00
    Percent    65.38                       22.25                    12.37
Mode Deposito 
# Sólo columnas numéricas
describe(data_banco[, sapply(data_banco, is.numeric)], num.desc = c("mean", "sd", 
    "median", "min", "max", "valid.n"))
Description of data_banco[, sapply(data_banco, is.numeric)] 

 Numeric 
                       mean     sd  median   min     max valid.n
Tiempo_Servicio_seg  155.58 120.01  122.45 18.13 1602.70   24299
Monto               1996.16 816.15 2087.43 53.82 6278.02   24299
Tiempo_Servicio_Min    2.59   2.00    2.04  0.30   26.71   24299