Ejercicio 1

Preparación Ambiente

La preparación del ambiente contempla la carga de la librería tidyverse, junto con la carga de la data alojada en la dirección "https://goo.gl/Wy3GsU", y finalmente una revisión y descripción general del data frame.

# Cargar Librería
library(tidyverse)
## ── Attaching packages ──────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.2.1 ──
## ✔ ggplot2 3.1.0     ✔ purrr   0.2.5
## ✔ tibble  1.4.2     ✔ dplyr   0.7.7
## ✔ tidyr   0.8.2     ✔ stringr 1.3.1
## ✔ readr   1.1.1     ✔ forcats 0.3.0
## ── Conflicts ─────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
# Cargar Data
alumnos <- read_csv("https://goo.gl/Wy3GsU")
## Parsed with column specification:
## cols(
##   dificultad = col_double(),
##   satisfaccion = col_double(),
##   grupo = col_character()
## )
# Visualizar Data
alumnos
## # A tibble: 3,000 x 3
##    dificultad satisfaccion grupo
##         <dbl>        <dbl> <chr>
##  1       39.6         62.8 grp04
##  2       50.7         57.5 grp03
##  3       36.8         67.2 grp04
##  4       69.9         44.5 grp02
##  5       52.6         43.8 grp02
##  6       37           64.8 grp04
##  7       54.8         65.7 grp04
##  8       58.2         52.5 grp03
##  9       56.0         65.9 grp03
## 10       44           67.1 grp04
## # ... with 2,990 more rows
View(alumnos)

# Describir Data
dim(alumnos)
## [1] 3000    3
glimpse(alumnos)
## Observations: 3,000
## Variables: 3
## $ dificultad   <dbl> 39.64, 50.66, 36.79, 69.86, 52.64, 37.00, 54.79, ...
## $ satisfaccion <dbl> 62.78, 57.49, 67.23, 44.47, 43.84, 64.77, 65.74, ...
## $ grupo        <chr> "grp04", "grp03", "grp04", "grp02", "grp02", "grp...

Preguntas

Obtenga un diagrama de puntos entre las variables duración y satisfacción.

ggplot(data = alumnos, aes(x = dificultad, y = satisfaccion)) + 
  geom_point() 

Comente respecto al resultado. Intente realizar una hipótesis respecto a lo que observa.

De la gráfica anterior se aprecia que existe una relación entre el nivel de dificultad percibida por el alumno y su evaluación de satisfacción. Una idea general es que en la medida que aumenta la dificultad del curso menor es el nivel de satisfacción evaluado por los alumnos. Puede existir un argumento psicológico que arrastre esto ya que si el curso se te hizo fácil de entender no debería existir una intención de evaluarlo mal. Sin embargo, cabe destacar que existen alumnos para los cuales a pesar de evaluar el curso con una baja dificultad, igualmente tienen un indicador de satisfacción bajo y esto puede ser porque las expectativas del curso no estuvieron de acuerdo a lo que él esperaba. Para tranquilidad del profesor pareciera ser que son algunos casos especiales y no corresponden a una tendencia en su ramo.

Es interesante notar que existen diversas evaluaciones de satisfacción para un mismo nivel de dificultad, lo que conlleva a evaluar si la variable de agrupación de los alumnos tiene alguna injerencia en las evaluaciones. Otro punto interesante es que la escala de satisfacción no tiene evaluaciones de alumnos sobre los 90 puntos, lo que sería interesante de profundizar para ver si se trata de una problema en los alcances del curso o en la metodologìa utilizada para enseñar.

Al gráfico anterior agregue una línea de tendencia usando la funcion geom_smooth

ggplot(data = alumnos, aes(x = dificultad, y = satisfaccion)) + 
  geom_point() + 
  geom_smooth(colour = 'red')
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'

Ahora suponga que el equipo académico le recomienda considerar el grupo de donde el alumno proviene para así seguir estudiando la evidencia encontrada en el punto anterior. Vuelva a hacer un diagrama de puntos pero ahora diferenciando mediante el color al grupo al que el alumno pertenece.

ggplot(data = alumnos, aes(x = dificultad, y = satisfaccion)) + 
  geom_point(aes(color = grupo))

Al grafico anterior agregue una línea de tendendencia y además utilice el comando facet_wrap para crear graficos de acuerdo al grupo del alumno.

ggplot(data = alumnos, aes(x = dificultad, y = satisfaccion)) + 
  geom_point(aes(color = grupo)) +
  geom_smooth(colour = 'red') + 
  facet_wrap(vars(grupo), nrow = 2, ncol = 3)
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'

Con lo obtenido, ¿Qué sucede con la hipótesis obtenida anteriormente?

Al desarrollar el análisis a lo largo de los grupos se puede apreciar que existe una relación ímplicita entre la dificultad y la satisfacción. A diferencia del análisis anterior en el que se generaba una hipótesis de relación inversa para todos los alumnos (en la que se consideraba que a mayor dificultad se tiene una menor satisfacción) en este caso, en los grupos se aprecia que existe una relación directa entre dificultad y satisfacción. Sin embargo, esta relación subyacente puede estar condicionada según las características de agrupación que se consideran, ya que de la gráfica anterior se aprecian cortes con características que tienden a estar relacionado con la distribución de los grupos.

Más que cambiar la hipótesis, se debe considerar el sesgo de generalización ya que una mirada general de los alumnos conlleva a crear una mirada de relaciones entre dificultad y satisfacción. Sin embargo, en la evaluación por grupos (siempre considerando las variables que generan la agrupación) podría llevar a contradicciones.

Ejercicio 2

Preparación Ambiente

La preparación del ambiente contempla la carga de la librería lubridate, junto con la carga de la data alojada en la dirección "https://goo.gl/3JUCma", y finalmente una revisión y descripción general del data frame.

# Cargar Librería
library(lubridate)
## 
## Attaching package: 'lubridate'
## The following object is masked from 'package:base':
## 
##     date
# Cargar Data
temperatura <- read_csv("https://goo.gl/3JUCma")
## Parsed with column specification:
## cols(
##   anio_mes = col_date(format = ""),
##   mediana = col_double(),
##   inferio = col_double(),
##   superio = col_double(),
##   decada = col_integer()
## )
## Warning in rbind(names(probs), probs_f): number of columns of result is not
## a multiple of vector length (arg 1)
## Warning: 120 parsing failures.
## row # A tibble: 5 x 5 col     row col    expected               actual  file                    expected   <int> <chr>  <chr>                  <chr>   <chr>                   actual 1  1801 decada no trailing characters .00E+03 'https://goo.gl/3JUCma' file 2  1802 decada no trailing characters .00E+03 'https://goo.gl/3JUCma' row 3  1803 decada no trailing characters .00E+03 'https://goo.gl/3JUCma' col 4  1804 decada no trailing characters .00E+03 'https://goo.gl/3JUCma' expected 5  1805 decada no trailing characters .00E+03 'https://goo.gl/3JUCma'
## ... ................. ... ..................................................................... ........ ..................................................................... ...... ..................................................................... .... ..................................................................... ... ..................................................................... ... ..................................................................... ........ .....................................................................
## See problems(...) for more details.
# Visualizar Data
temperatura
## # A tibble: 1,992 x 5
##    anio_mes   mediana inferio superio decada
##    <date>       <dbl>   <dbl>   <dbl>  <int>
##  1 1850-01-01  -0.702  -1.10   -0.299   1850
##  2 1850-02-01  -0.281  -0.673   0.117   1850
##  3 1850-03-01  -0.732  -1.08   -0.382   1850
##  4 1850-04-01  -0.569  -0.904  -0.237   1850
##  5 1850-05-01  -0.326  -0.662   0.005   1850
##  6 1850-06-01  -0.212  -0.515   0.085   1850
##  7 1850-07-01  -0.128  -0.457   0.199   1850
##  8 1850-08-01  -0.232  -0.595   0.132   1850
##  9 1850-09-01  -0.435  -0.808  -0.063   1850
## 10 1850-10-01  -0.452  -0.793  -0.104   1850
## # ... with 1,982 more rows
View(temperatura)

# Describir Data
dim(temperatura)
## [1] 1992    5
glimpse(temperatura)
## Observations: 1,992
## Variables: 5
## $ anio_mes <date> 1850-01-01, 1850-02-01, 1850-03-01, 1850-04-01, 1850...
## $ mediana  <dbl> -0.702, -0.281, -0.732, -0.569, -0.326, -0.212, -0.12...
## $ inferio  <dbl> -1.102, -0.673, -1.080, -0.904, -0.662, -0.515, -0.45...
## $ superio  <dbl> -0.299, 0.117, -0.382, -0.237, 0.005, 0.085, 0.199, 0...
## $ decada   <int> 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850, 1850,...

Preguntas

Relice un gráfico de línea considerando las columnas anio_mes y mediana.

ggplot(data = temperatura, aes(x = anio_mes, y = mediana)) + 
  geom_line()

Ahora cargue el paquete lubridate, y usando las funciones year y month sobre la columna anio_mes cree dos variables en la tabla temperatura y nómbrelas como anio y mes.

El paquete lubridate fue cargado en la estructura definida preparación de ambiente.

temperatura <- temperatura %>% 
                  mutate(anio = year(anio_mes), mes = month(anio_mes))
temperatura
## # A tibble: 1,992 x 7
##    anio_mes   mediana inferio superio decada  anio   mes
##    <date>       <dbl>   <dbl>   <dbl>  <int> <dbl> <dbl>
##  1 1850-01-01  -0.702  -1.10   -0.299   1850  1850     1
##  2 1850-02-01  -0.281  -0.673   0.117   1850  1850     2
##  3 1850-03-01  -0.732  -1.08   -0.382   1850  1850     3
##  4 1850-04-01  -0.569  -0.904  -0.237   1850  1850     4
##  5 1850-05-01  -0.326  -0.662   0.005   1850  1850     5
##  6 1850-06-01  -0.212  -0.515   0.085   1850  1850     6
##  7 1850-07-01  -0.128  -0.457   0.199   1850  1850     7
##  8 1850-08-01  -0.232  -0.595   0.132   1850  1850     8
##  9 1850-09-01  -0.435  -0.808  -0.063   1850  1850     9
## 10 1850-10-01  -0.452  -0.793  -0.104   1850  1850    10
## # ... with 1,982 more rows

Revise y considere los ejemplo de geom_raster para usarlo con los datos de anio, mes y mediana y comenta que observas.

ggplot(data = temperatura, aes(as.factor(mes), anio)) +
  geom_raster(aes(fill = mediana))

Se observa, aunque de manera dificultosa que en la medida que ha pasado el tiempo el valor de la mediana de la temperatura ha ido en ascenso, ya que visualmente los valores más cercanos al año 2000, son más claros. Por otro lado, pareciera ser que en los meses de Julio a Septiembre existe un mayor registro de termperaturas (mediana), ya que visualmente son màs claros que los otros meses.

Una mirada más clara es al considerar las decadas registradas para las temperaturas. Acá se aprecia de mejor manera lo antes expuesto.

ggplot(data = temperatura, aes(as.factor(mes), floor(anio/100)*100)) +
  geom_raster(aes(fill = mediana))

Agrupe la tabla temperatura usando la columna anio para obtener el promedio de la columna mediana.

temperatura_ag <- temperatura %>%
                    group_by(anio) %>%
                    summarise(promedio = mean(mediana))
temperatura_ag
## # A tibble: 166 x 2
##     anio promedio
##    <dbl>    <dbl>
##  1  1850   -0.377
##  2  1851   -0.224
##  3  1852   -0.228
##  4  1853   -0.273
##  5  1854   -0.256
##  6  1855   -0.276
##  7  1856   -0.356
##  8  1857   -0.464
##  9  1858   -0.470
## 10  1859   -0.291
## # ... with 156 more rows

Con lo anterior vuelva a obtener un grafico del promedio obtenido anteriormente por año.

ggplot(data = temperatura_ag, aes(x = anio, y = promedio)) + 
  geom_line() + 
  geom_smooth()
## `geom_smooth()` using method = 'loess' and formula 'y ~ x'

Si tuviese que escoger alguna de las dos alternativas de gráficos de líneas para presentarla a alguién que es nuevo en el tema, ¿Cual escogería y por que?

Personalmente escogería este último gráfico para poder explicarlo ya que cotenmpla dos aspectos que me parecen relevantes. En primer lugar permite evaluar, de una manera simple (ya que en la medida que nos movemos hacia la derecha avanzamos en el tiempo), la evolución en el tiempo del valor promedio de la temperatura a lo largo de los años. Y en segundo lugar, permite hacer comparaciones a lo largo de diferentes años de una manera simple ya que todos los puntos están en una escala simple de comparar.

Ejercicio 3

Preparación Ambiente

La preparación del ambiente contempla la carga de la librería tidyverse, junto con la carga de la data alojada en la dirección "https://goo.gl/Tigfaj" y "https://goo.gl/fT3jwT", y finalmente una revisión y descripción general del data frame.

# Cargar Librería
library(tidyverse)

# Cargar Data
miembros <- read_csv("https://goo.gl/Tigfaj")
## Parsed with column specification:
## cols(
##   funcion = col_character(),
##   nombre = col_character(),
##   organizacion = col_character()
## )
movimientos <- read_csv("https://goo.gl/fT3jwT")
## Parsed with column specification:
## cols(
##   nombre = col_character(),
##   fecha = col_character(),
##   hora = col_integer(),
##   minuto = col_integer(),
##   importe = col_double(),
##   comercio = col_character(),
##   actividad_completa = col_character(),
##   actividad = col_character()
## )
# Visualizar Data
miembros
## # A tibble: 83 x 3
##    funcion  nombre                                 organizacion
##    <chr>    <chr>                                  <chr>       
##  1 analista Alberto Recarte Garcia Andrade         banco       
##  2 analista Alejandro Couceiro Ojeda               consultora  
##  3 analista Angel Eugenio Gomez del Pulgar Perales banco       
##  4 analista Angel Rizaldos Gonzalez                banco       
##  5 analista Antonio Camara Eguinoa                 banco       
##  6 analista Antonio Rey de Vinas Sanchez-Majestad  afp         
##  7 analista Antonio Romero Lazaro                  banco       
##  8 analista Arturo Luis Fernandez Alvarez          consultora  
##  9 analista Beltran Gutierrez Moliner              banco       
## 10 analista Candido Ceron Escudero                 banco       
## # ... with 73 more rows
movimientos
## # A tibble: 77,202 x 8
##    nombre  fecha   hora minuto importe comercio actividad_compl… actividad
##    <chr>   <chr>  <int>  <int>   <dbl> <chr>    <chr>            <chr>    
##  1 Albert… 2003-…    12     30   38.7  RCG OFI… CONFECCION TEXT… ROPA     
##  2 Albert… 2003-…    12     32   14.6  MANZANI… HOTELES,MOTELES… HOTEL    
##  3 Albert… 2003-…    19      7   95.6  REST RE… RESTAURANTES RE… RESTAURA…
##  4 Albert… 2003-…    15     31   49.1  ESTACON… GASOLINERAS      COCHE    
##  5 Albert… 2003-…    16      5   13.9  NISA (H… GASOLINERAS      COCHE    
##  6 Albert… 2003-…    15     27   80    HOSTAL … HOTELES,MOTELES… HOTEL    
##  7 Albert… 2003-…    10     20   53.4  E S MON… GASOLINERAS      COCHE    
##  8 Albert… 2003-…    12     58   42    LA CASA… JUGUETES, ARTIC… COMPRA B…
##  9 Albert… 2003-…    15     25  263.   ASADOR … RESTAURANTES RE… RESTAURA…
## 10 Albert… 2003-…    15     28    2.10 AUTOPIS… AUTOPISTAS (TER… COCHE    
## # ... with 77,192 more rows
# Describir Data
dim(miembros)
## [1] 83  3
glimpse(miembros)
## Observations: 83
## Variables: 3
## $ funcion      <chr> "analista", "analista", "analista", "analista", "...
## $ nombre       <chr> "Alberto Recarte Garcia Andrade", "Alejandro Couc...
## $ organizacion <chr> "banco", "consultora", "banco", "banco", "banco",...
dim(movimientos)
## [1] 77202     8
glimpse(movimientos)
## Observations: 77,202
## Variables: 8
## $ nombre             <chr> "Alberto Recarte Garcia Andrade", "Alberto ...
## $ fecha              <chr> "2003-01-03 23:00:00 UTC", "2003-01-03 23:0...
## $ hora               <int> 12, 12, 19, 15, 16, 15, 10, 12, 15, 15, 15,...
## $ minuto             <int> 30, 32, 7, 31, 5, 27, 20, 58, 25, 28, 28, 2...
## $ importe            <dbl> 38.70, 14.60, 95.62, 49.13, 13.94, 80.00, 5...
## $ comercio           <chr> "RCG OFICINA", "MANZANIL AREA", "REST REAL ...
## $ actividad_completa <chr> "CONFECCION TEXTIL EN GENERAL", "HOTELES,MO...
## $ actividad          <chr> "ROPA", "HOTEL", "RESTAURANTE", "COCHE", "C...

Preguntas

Con la función ymd_hms del paquete lubridate puede parsear (convertir) la columna fecha (que es texto!) a fecha-hora. Luego con la función as.Date puedes tranformar el campo de fecha-hora a fecha.

movimientos <- mutate(movimientos, fecha_new = as.Date(ymd_hms(fecha)))

Con lo anterior agrupe por dias y obtenga el número de operaciones, como también el importe total por día de la tabla movimientos.

movimientos_ag <- movimientos %>% 
                    group_by(fecha_new) %>% 
                    summarise(
                      importe_total = sum(importe),
                      operaciones = n()
                    )
movimientos_ag
## # A tibble: 3,338 x 3
##    fecha_new  importe_total operaciones
##    <date>             <dbl>       <int>
##  1 2002-12-31         2618.          24
##  2 2003-01-01         8320.          32
##  3 2003-01-02         6898.          24
##  4 2003-01-03         2816.          21
##  5 2003-01-04         5607.          36
##  6 2003-01-05          583.           5
##  7 2003-01-06         1467.           8
##  8 2003-01-07         6931.          65
##  9 2003-01-08         2982.          23
## 10 2003-01-09         1618.          17
## # ... with 3,328 more rows

Grafique, de forma separada estas dos variables (por fecha). ¿Qué tipo de geom_ puede ser opción?

Entendiendo que son datos evolutivos por fecha, la mejor opción a mi parecer es un geom_line para evaluar continuidad de las medidas.

Importe Total
ggplot(movimientos_ag, aes(x = fecha_new, y = importe_total)) + 
  geom_line() + 
  geom_smooth()
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'

Operaciones
ggplot(movimientos_ag, aes(x = fecha_new, y = operaciones)) + 
  geom_line() + 
  geom_smooth()
## `geom_smooth()` using method = 'gam' and formula 'y ~ s(x, bs = "cs")'

Ahora bien, se puede considerar una visualización más agregada que permita evaluar los montos medios y el grado de variabilidad presentes por año. Para esto, recomiendo el uso de un geom_boxplot.

Importe Total
ggplot(movimientos_ag, aes(x = as.factor(year(as.Date(fecha_new))), y = importe_total)) + 
  geom_boxplot(color = rainbow(n=11)) + 
  xlab("Año")

Operaciones
ggplot(movimientos_ag, aes(x = as.factor(year(as.Date(fecha_new))), y = operaciones)) + 
  geom_boxplot(color = rainbow(n=11)) + 
  xlab("Año")

En esta mirada se aprecia que existe una alta variabilidad de los importes y operaciones a lo largo de los años, con una leve tendencia al alza del promedio. Otro punto interesante, que también se ve en los gráficos anteriores es la baja frecuencia de registros que existen para el 2012.

Obtenga la suma de los importes por actividad de los miembros

importes_p_actividad <- movimientos %>% 
  group_by(actividad) %>% 
  summarise(
    importe_total = sum(importe)
  )

Con la tabla anterior grafíquelos usando geom_col.

ggplot(importes_p_actividad, aes(x = actividad, y = importe_total)) + 
  geom_col() + 
  theme(axis.text.x = element_text(angle = 90, hjust = 1))

Utilicé el comando theme(axis.text.x = element_text(angle = 90, hjust = 1)) en función a una búsqueda para resolver que los nombres del eje x fueran escritos de forma horizontal para una mejor lectura.

Obtenga la suma de los importes por actividad y hora, luego utilice geom_tile para mostrar la información obtenida y comente.

importes_p_actividad_hora <- movimientos %>% 
  group_by(actividad, hora) %>% 
  summarise(
    importe_total = sum(importe)
  )
ggplot(importes_p_actividad_hora, aes(x = hora, y = actividad)) + 
  geom_tile(aes(fill = importe_total))

Del gráfico anterior se aprecia que la actividad de restaurante en el horario de las 15:00 es donde se presenta el mayor importe , lo que hace sentido por ser una actividad de alta demanda por la gente. Este comportamiento, aunque en menor medida se aprecia en los horarios de 10:00 PM a 01:00 AM, aunque es claro que a lo largo de todo el día se tiene registro de importes. Otra actividad interesante es el de la compra de bienes, que a primera vista pueden ser menos frecuentes pero involucran niveles de importe unitario muy elevados. Al parecer el horario de almuerzo es utilizado para la realización de algunos trámites ya que no es tan temprano ni tampoco muy tarde.

Otra mirada contempla el considerar es la relación de los horarios de atención con la concentración de los importes. Por ejemplo, en la actividad de banco no existen importes en los horarios donde habitualmente no hay atención. Al igual que el anterior, las actividades de business y deporte tienen muy marcados horarios de utilización.

¿Que es lo que muestra el siguiente gráfico, y que podría hacer con esta información en el caso que usted sea el dueño?

ggplot(movimientos) +
  geom_point(aes(importe, actividad), alpha = 0.5)  

El gráfico anterior muestra los diversos niveles de importe que se tienen para cada actividad, cada punto representa una transacción realizada por los clientes en diferentes instantes de tiempo. Temas interesantes de evaluar acá sería el determinar si existen actividades en los que los importes son muy variables para identificar que tipo de transacción se realiza y fomentar el consumo de estos, o por otro lado identificar que actividades son rentables en terminos de frecuencia de transacción o importe unitario. Esta segmentación permite desarrollar estrategias de comunicación con los clientes diferenciadas: en el caso de un perfil transaccional, se puede asumir que el cliente generalmente lo hará, por lo que promociones serían un buen plan; por otro lado en temas que son poco frecuentes, pero que el perfil va por un concepto de importe unitario alto, se debe trabajar en un modelo de comunicación orientado al Top of Mind de tal manera que cuando un cliente desee optar por una transacción de alto costo, la tienda en cuestión sea la opción indicada.

Usando la imagen anterior identifique usted 3 casos (puntos/movimientos) que le llamen la atentción y descríbalos: Describiendo la hora, quien realizó la operación, el monto, la actividad, etc, y comente si el dato parece digno de investigar o no.

En general, la revisión de la gráfica anterior permite identificar claramente dos aspectos: valores atípicos extremos, valores atípicos de baja frecuencia' yvalores negativos’. Estos últimos llaman la atención puesto que al hacer referencia a importes, la naturaleza de un valor menor que cero puede implicar una devolución por lo que se hace necesaria una auditoría respecto de los registros.

Valores atípicos extremos

En este caso nos enfocamos en identificar el registro con el mayor importe. Este caso corresponde a una transacción realizada por Ildefonso Jose Sanchez Barcoj con un importe de 16922 USD (Supuesto) asociado a compra de bienes, y que fue realizado el 30/12/2009

VAE <- movimientos %>% 
        arrange(desc(importe)) %>% 
        filter(importe == max(importe)) %>% 
        select(nombre, importe, actividad, fecha_new, hora, minuto)
VAE
## # A tibble: 1 x 6
##   nombre                      importe actividad    fecha_new   hora minuto
##   <chr>                         <dbl> <chr>        <date>     <int>  <int>
## 1 Ildefonso Jose Sanchez Bar…  16922. COMPRA BIEN… 2009-12-30     2     40
Valores atípicos baja frecuencia

En este caso nos enfocamos en identificar el registro con la actividad con la menor frecuencia de transacciones.

VABF_Aux <- movimientos %>%
          group_by(actividad) %>% 
            summarise(n = n()) %>% 
              arrange(n) %>% 
                filter(n == min(n)) 

El código anterior permite identificar aquellas actividades que tienen el menor número de transacciones. En este caso las actividades de Agricultura y Funeraria presentan solamente 1 registro. En la siguiente tabla se presentan los casos asociados a estas actividades.

VABF <- merge(VABF_Aux, movimientos, by = c("actividad")) %>% 
          select(nombre, importe, actividad, fecha_new, hora, minuto)
VABF          
##                     nombre importe   actividad  fecha_new hora minuto
## 1 Miguel Blesa de la Parra  183.00 AGRICULTURA 2008-08-10   15     44
## 2     Mariano Perez Claver 4293.27  FUNERARIAS 2006-08-20   10      1
Valores negativos

En este caso nos enfocamos en identificar el registro con un importe negativo.

VN <- movimientos %>% 
        arrange(importe) %>% 
        filter(importe < 0) 
VN
## # A tibble: 656 x 9
##    nombre fecha  hora minuto importe comercio actividad_compl… actividad
##    <chr>  <chr> <int>  <int>   <dbl> <chr>    <chr>            <chr>    
##  1 Ricar… 2007…    14     32 -11930  <NA>     <NA>             <NA>     
##  2 Ildef… 2006…    12     51  -9785. <NA>     <NA>             <NA>     
##  3 Ildef… 2009…     9     26  -8383. <NA>     <NA>             <NA>     
##  4 Matia… 2007…    15     51  -7288. EXECUTI… AGENCIAS DE VIA… VIAJE    
##  5 Maria… 2006…    14     17  -6648  MILLAN … AGENCIAS DE VIA… VIAJE    
##  6 Matia… 2006…    15     33  -5763. <NA>     BRITISH AIRWAYS… AVION    
##  7 Matia… 2006…    15     33  -5763. <NA>     BRITISH AIRWAYS… AVION    
##  8 Franc… 2008…    15     23  -4641. AEROMEX… LINEAS AEREAS    AVION    
##  9 Carme… 2007…    17      7  -3730  EL CORT… EL CORTE INGLES  COMPRA B…
## 10 Maria… 2010…    10     12  -3526  <NA>     <NA>             <NA>     
## # ... with 646 more rows, and 1 more variable: fecha_new <date>

De los resultados anteriores, llama la atención que existen algunos registros en los cuales no se tienen una descripción del comercio y/o la actividad asociada a pesar de tener importes negativos. Estos valores llaman la atención puesto que es díficil poder hacer un seguimiento a qué transacción podría corresponder la devolución.

VN_NA  <-  movimientos %>% 
              arrange(importe) %>% 
              filter(importe < 0) %>% 
              filter(is.na(comercio), is.na(actividad_completa), is.na(actividad)) 
VN_NA
## # A tibble: 14 x 9
##    nombre fecha  hora minuto importe comercio actividad_compl… actividad
##    <chr>  <chr> <int>  <int>   <dbl> <chr>    <chr>            <chr>    
##  1 Ricar… 2007…    14     32 -11930  <NA>     <NA>             <NA>     
##  2 Ildef… 2006…    12     51  -9785. <NA>     <NA>             <NA>     
##  3 Ildef… 2009…     9     26  -8383. <NA>     <NA>             <NA>     
##  4 Maria… 2010…    10     12  -3526  <NA>     <NA>             <NA>     
##  5 Carlo… 2003…    12      1  -3000  <NA>     <NA>             <NA>     
##  6 Ildef… 2010…    11      6  -1295. <NA>     <NA>             <NA>     
##  7 Carlo… 2004…    10     24   -731  <NA>     <NA>             <NA>     
##  8 Jose … 2004…    10     51   -301. <NA>     <NA>             <NA>     
##  9 Ildef… 2009…    13     12   -300  <NA>     <NA>             <NA>     
## 10 Carlo… 2005…    16      4   -300  <NA>     <NA>             <NA>     
## 11 Juan … 2010…     9     45   -273. <NA>     <NA>             <NA>     
## 12 Ildef… 2007…    11     41   -152  <NA>     <NA>             <NA>     
## 13 Pedro… 2003…    10     49   -150  <NA>     <NA>             <NA>     
## 14 Ildef… 2007…    14     35   -110  <NA>     <NA>             <NA>     
## # ... with 1 more variable: fecha_new <date>

Al revisar este último resultado se puede apreciar que existe una repetición no menor de algunos responsables.

VN_NA_Ag <- VN_NA %>% 
              group_by(nombre) %>% 
              summarise(n = n()) %>% 
              arrange(desc(n)) 
VN_NA_Ag
## # A tibble: 7 x 2
##   nombre                                   n
##   <chr>                                <int>
## 1 Ildefonso Jose Sanchez Barcoj            6
## 2 Carlos Vela Garcia                       3
## 3 Jose Maria Arteta Vico                   1
## 4 Juan Jose Azcona Olondriz                1
## 5 Mariano Perez Claver                     1
## 6 Pedro Bedia Perez                        1
## 7 Ricardo Romero de Tejada y Picatoste     1

Se debería revisar el caso del señor Ildefonso Jose Sanchez Barcoj por tener el mayor número de inconsistencias, sin embargo debemos descartar que la concentración de casos anómalos no tenga relación con el nivel de transacciones que realizar.

T <- movimientos %>% 
      group_by(nombre) %>% 
      summarise(t = n()) %>% 
      arrange(desc(t))
T
## # A tibble: 83 x 2
##    nombre                                    t
##    <chr>                                 <int>
##  1 Antonio Camara Eguinoa                 3358
##  2 Ruben Cruz Orive                       3306
##  3 Miguel Angel Araujo Serrano            2854
##  4 Ildefonso Jose Sanchez Barcoj          2743
##  5 Ramon Espinar Gallego                  2709
##  6 Antonio Romero Lazaro                  2103
##  7 Ricardo Romero de Tejada y Picatoste   2038
##  8 Jose Maria Arteta Vico                 1924
##  9 Antonio Rey de Vinas Sanchez-Majestad  1822
## 10 Pablo Abejas Juarez                    1744
## # ... with 73 more rows

Finalmente, se debe agregar al análisis al señor Carlos Vela Garcia por tener la mayor tasas de inconsistencia según sus transacciones registradas.

R <- merge(T, VN_NA_Ag, by = c("nombre")) %>% 
      mutate(tasa = n/t)
R
##                                 nombre    t n         tasa
## 1                   Carlos Vela Garcia  807 3 0.0037174721
## 2        Ildefonso Jose Sanchez Barcoj 2743 6 0.0021873861
## 3               Jose Maria Arteta Vico 1924 1 0.0005197505
## 4            Juan Jose Azcona Olondriz  817 1 0.0012239902
## 5                 Mariano Perez Claver  971 1 0.0010298661
## 6                    Pedro Bedia Perez  622 1 0.0016077170
## 7 Ricardo Romero de Tejada y Picatoste 2038 1 0.0004906771