-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathproyecto.Rmd
837 lines (587 loc) · 29.4 KB
/
proyecto.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
---
title: "Banco"
author: "Carlos, Alberto, Juan Ramón"
date: "23/11/2020"
output:
html_document:
df_print: paged
word_document: default
---
# ANÃLISIS EXPLORATORIO VARIABLES
```{r setup, include=FALSE}
library(readr)
library(dplyr)
library(ggplot2)
library(gmodels)
library(Hmisc)
library(moments)
library(gridExtra)
library(vcdExtra)
library(Hmisc)
```
## Importamos nuestro dataset
```{r}
data = read_csv("BankCustomerdata")
```
```{r}
nrow(data)
```
Dividimos el dataset original en el conjunto de **train** y **test**.
```{r}
n = nrow(data)
trainIndex = sample(1:n, size = round(0.8*n), replace=FALSE)
train = data[trainIndex ,]
test = data[-trainIndex ,]
```
```{r}
nrow(train)
```
```{r}
nrow(test)
```
```{r, message=FALSE}
ftable(train$term_deposit)
```
```{r, message=FALSE}
ftable(train$term_deposit)
```
Observamos su estructura y un resumen de las principales variables
```{r}
summary(train)
describe(train)
```
### VARIABLE AGE
La variable age es una variable cuantitativa situada en la escala de proporción. Dicha variable indica la edad del cliente.
```{r}
summary(train$age)
```
De los estadÃsticos básicos podemos ver que se necesita ser menor de edad para contratar el producto.
Observando las medidas de dispersión:
```{r}
var(train$age)
```
```{r}
sd(train$age)
```
```{r}
describe(train$age)
```
Mostramos la distribución de la variable:
```{r, message=FALSE}
ggplot(train, aes(x = age)) +
geom_histogram(fill="skyblue2", colour="white") + geom_density(alpha = .3) +
ggtitle('Edad del cliente')
```
```{r, message=FALSE}
ggplot(train, aes(x = age)) +
geom_density(alpha = .3) +
ggtitle('KDE de la edad del cliente')
```
Encontramos que el grueso de clientes se encuentra entorno a la mediana, de 39 años. Observamos también que cerca de los 62 años se produce un descenso considerable de los clientes.
```{r, message=FALSE}
boxplot(train$age, train = train, col= 'orange')
```
Hay un considerable número de outliers en las edades avanzadas. Pero en principio no se encuentra necesario realizar transformaciones para mejorar la exploración.
```{r, message=FALSE}
ggplot(train, aes(x = age, colour = term_deposit)) +
geom_histogram() + facet_wrap(~term_deposit, ncol = 2) +
ggtitle('Edad del cliente')
```
```{r, message=FALSE}
ggplot(train ,aes(x=age, fill=term_deposit)) + geom_density(alpha = .5) + ggtitle("Edad del cliente")
```
```{r, message=FALSE}
ggplot(train, aes(y = age, x = term_deposit)) + geom_violin(aes(fill=term_deposit))+ggtitle("Edad del cliente")
```
Al comparar las distribuciones de las dos poblaciones, clientes que contratan el producto de los que no, podemos observar que la principal diferencia se encuentra en las edades avanzadas, donde se presenta una mayor densidad de contrataciones. Por lo que esta feature puede ser informativa a la hora de predecir el valor de la variable objetivo.
### VARIABLE BALANCE
La variable balance es una variable cuantitativa situada en la escala de intervalo. Dicha variable indica el saldo del cliente.
```{r}
summary(train$balance)
```
De los estadÃsticos básicos podemos ver que existen valores negativos, probablemente indiquen la deuda del cliente.
Observando las medidas de dispersión:
```{r}
var(train$balance)
```
```{r}
sd(train$balance)
```
```{r}
describe(train$balance)
```
Mostramos la distribución de la variable:
```{r, message=FALSE}
ggplot(train, aes(x = balance)) +
geom_histogram(fill="skyblue2", colour="white") + geom_density(alpha = .3) +
ggtitle('Edad del cliente')
```
```{r, message=FALSE}
ggplot(train, aes(x = balance)) +
geom_density(alpha = .3) +
ggtitle('KDE de la edad del cliente')
```
La distribución de la variable cuenta con una larga cola que hace complicado estudiar la distribución más allá de los valores iniciales. Por ello vamos a realizar una transformación logarÃtmica que suavice el crecimiento al principio y lo acrecente al final.
```{r, message=FALSE}
ggplot(train, aes(x = log10(balance))) +
geom_density(alpha = .3) +
ggtitle('KDE del log de la edad del cliente')
```
Tras la transformación ya comentada no se aprecian caracterÃsticas relevantes no observadas en la distribución original.
```{r, message=FALSE}
boxplot(train$balance, train = train, col= 'orange')
```
Hay gran cantidad de outliers tanto por encima como por abajo del rango intercuartÃlico, pero con mayor incidencia en los clientes adinerados. Un efecto usualmente observable en indicadores económicos.
```{r, message=FALSE}
ggplot(train, aes(x = balance, colour = term_deposit)) +
geom_histogram() + facet_wrap(~term_deposit, ncol = 2) +
ggtitle('Saldo del cliente')
```
```{r, message=FALSE}
ggplot(train ,aes(x=balance, fill=term_deposit)) + geom_density(alpha = .5) + ggtitle("Saldo del cliente")
```
```{r, message=FALSE}
ggplot(train ,aes(x=log10(balance), fill=term_deposit)) + geom_density(alpha = .5) + ggtitle("Log del saldo del cliente")
```
```{r, message=FALSE}
ggplot(train, aes(y = balance, x = term_deposit)) + geom_violin(aes(fill=term_deposit))+ggtitle("Saldo del cliente")
```
Al comparar las distribuciones de las dos poblaciones, no observamos en principio diferencia, pero tras realizar la transformación logarÃtmica si encontramos un leve desplazamiento de la distribución de contrataciones hacia saldos más altos de los clientes que no contratan. Aunque leve, esta variable puede que sea informativa en el futuro modelo.
### VARIABLE JOB
Variable categórica en escala nominal, que muestra la profesión del cliente.
Mostramos la tabla de frecuencias absolutas y relativas:
```{r, message=FALSE}
ftable(train$job)
```
```{r, message=FALSE}
prop.table(ftable(train$job))
```
La categorÃa más frecuente es la de **unemployed**, seguido de **blue-collar** y **management**.
```{r, message=FALSE}
ggplot(train, aes(job)) + geom_bar(aes(y = ..prop.., group = 1 ), fill = 'skyblue2') + ggtitle("Profesión del cliente")
```
La cruzamos con la variable objetivo:
```{r, message=FALSE}
with(train, CrossTable(job, term_deposit, format = 'SPSS'))
```
```{r, message=FALSE}
ggplot(train, aes(x = job, fill = term_deposit)) + geom_bar() + facet_wrap(~term_deposit, nrow = 1) + ggtitle("Contratación de depósito según profesión del cliente")
ggplot(train, aes(x = job, fill = term_deposit)) + geom_bar(aes(y = ..prop.., group = 1 )) + facet_wrap(~term_deposit, nrow = 1) + ggtitle("Contratación depósito resultado campaña anterior")
```
Estudiante es el estado profesional más propenso a contratar el producto, seguido de retired. Pero todas las profesiones parecen ser buenos discriminadores de la probabilidad de contratación. Por lo que esta variable parece que pueda ser una buena variable predictora.
### VARIABLE MARITAL
Variable categórica en escala nominal. Informa del estado civil del cliente.
Mostramos la tabla de frecuencias absolutas y relativas:
```{r, message=FALSE}
ftable(train$marital)
```
```{r, message=FALSE}
prop.table(ftable(train$marital))
```
```{r, message=FALSE}
ggplot(train, aes(marital)) + geom_bar(aes(y = ..prop.., group = 1 ), fill = 'skyblue2') + ggtitle("Estado civil del cliente")
```
El estado civil más numeroso es casado.
La cruzamos con la variable objetivo:
```{r, message=FALSE}
with(train, CrossTable(marital, term_deposit, format = 'SPSS'))
```
```{r, message=FALSE}
ggplot(train, aes(x = marital, fill = term_deposit)) + geom_bar() + facet_wrap(~term_deposit, nrow = 1) + ggtitle("Contratación de depósito según estado civil del cliente")
ggplot(train, aes(x = marital, fill = term_deposit)) + geom_bar(aes(y = ..prop.., group = 1 )) + facet_wrap(~term_deposit, nrow = 1) + ggtitle("Frecuencia de contratación de depósito según estado civil del cliente")
ggplot(train, aes(x = marital, fill = term_deposit)) + geom_bar(aes(y = ..prop.., group = 1 )) + facet_wrap(~term_deposit, nrow = 2) + ggtitle("Frecuencia de estado civil del cliente según contratación")
```
Soltero es el estado civil más propenso a contratar el producto, seguido muy de cerca de los divorciados y bastante alejado se encuentra el grupo de casados. Sin duda esta variable es informativa para un futuro modelo.
### VARIABLE EDUCATION
Variable categórica en escala nominal que informa del nivel educativo del cliente.
Mostramos la tabla de frecuencias absolutas y relativas:
```{r, message=FALSE}
ftable(train$education)
```
```{r, message=FALSE}
prop.table(ftable(train$education))
```
```{r, message=FALSE}
ggplot(train, aes(education)) + geom_bar(aes(y = ..prop.., group = 1 ), fill = 'skyblue2') + ggtitle("Nivel educativo del cliente")
```
Secondary es el nivel educativo más común seguido de lejos por tertiary y primary. Existe un pequeño porcentaje de clientes que no ha contestado la pregunta.
La cruzamos con la variable objetivo:
```{r, message=FALSE}
with(train, CrossTable(education, term_deposit, format = 'SPSS'))
```
```{r, message=FALSE}
ggplot(train, aes(x = education, fill = term_deposit)) + geom_bar() + facet_wrap(~term_deposit, nrow = 1) + ggtitle("Contratación de depósito según el nivel educativo del cliente")
ggplot(train, aes(x = education, fill = term_deposit)) + geom_bar(aes(y = ..prop.., group = 1 )) + facet_wrap(~term_deposit, nrow = 1) + ggtitle("Frecuencia de nivel educativo del cliente por contratación")
ggplot(train, aes(x = education, fill = term_deposit)) + geom_bar(aes(y = ..prop.., group = 2 )) + facet_wrap(~term_deposit, nrow = 2) + ggtitle("Frecuencia de contratación por nivel educativo del cliente")
```
El grupo más propenso a contratar el producto es **secondary**. Pero no hay diferencias tan notables como en otras variables categóricas como job o marital.
El grupo que no hay respondido a esta variable se asemeja a secondary en cuanto a densidad de contrataciones se refiere. Este hecho es recomendable tenerlo en cuenta a la hora de tratar los valores perdidos.
### VARIABLE DEFAULT
Variable categórica en escala binaria. Indica si un cliente tiene mora o no.
Mostramos la tabla de frecuencias absolutas y relativas:
```{r, message=FALSE}
ftable(train$default)
```
```{r, message=FALSE}
prop.table(ftable(train$default))
```
```{r, message=FALSE}
ggplot(train, aes(default)) + geom_bar(aes(y = ..prop.., group = 1 ), fill = 'skyblue2') + ggtitle("Nivel educativo del cliente")
```
Sin duda el grupo más numeroso con gran diferencia es el de aquellos sin deudas.
La cruzamos con la variable objetivo:
```{r, message=FALSE}
with(train, CrossTable(default, term_deposit, format = 'SPSS'))
```
```{r, message=FALSE}
ggplot(train, aes(x = default, fill = term_deposit)) + geom_bar() + facet_wrap(~term_deposit, nrow = 1) + ggtitle("Contratación de depósito según si el cliente tiene mora")
ggplot(train, aes(x = default, fill = term_deposit)) + geom_bar(aes(y = ..prop.., group = 1 )) + facet_wrap(~term_deposit, nrow = 1) + ggtitle("Frecuencia de contratación de depósito según si el cliente tiene mora")
```
Como era de esperar, aquellos con deudas pendientes son menos propensos a contratar el producto, por lo que esta variable parece ser una buena canditrain a ser variable predictora.
# VARIABLE HOUSING
La variable housing es una variable dicotomica que muestra si tiene un préstamo hipotecario.
Tabla de frecuencias absolutas y relativas:
```{r}
table(train$housing)
prop.table(table(train$housing))
```
De manera gráfica:
```{r}
ggplot(train, aes(housing)) + geom_bar(aes(y = ..prop.., group = 1 ), fill = 'skyblue2') + ggtitle("Tenencia de préstamo hipotecario")
```
Se encuentran balanceado los datos y con mayor proporción en tener un préstamo hipotecario
Si evaluamos la variable housing respecto a nuestra variable objetivo (term_deposit)
```{r}
with(train, CrossTable(housing, term_deposit, format = 'SPSS'))
```
Gráficamente:
```{r}
ggplot(train, aes(x = housing, fill = term_deposit)) + geom_bar() + facet_wrap(~term_deposit, nrow = 1) + ggtitle("Contratación depósito según tenencia de hipoteca")
ggplot(train, aes(x = housing, fill = term_deposit)) + geom_bar(aes(y = ..prop.., group = 1 )) + facet_wrap(~term_deposit, nrow = 1) + ggtitle("Contratación depósito según tenencia de hipoteca")
```
Se comprueba que en términos relativos aquellos que contratan el depósito tienen mayor proporción de individuos que no cuenta con préstamo hipotecario. Al contrario ocurre con los que no contratan el depósito siendo en mayor proporción aquellos que sà tiene una hipoteca.
### VARIABLE LOAN
La variable loan es una variable dicotómica que muestra si el cliente tiene un préstamo personal.
Al ser una variable categórica realizamos una tabla de frecuencias absoluta y de frecuencias relativa para ver su composición de forma univariante.
```{r}
table(train$loan)
prop.table(table(train$loan))
```
De manera gráfica
```{r}
ggplot(train, aes(loan)) + geom_bar(aes(y = ..prop.., group = 1 ), fill = 'skyblue2') + ggtitle("Tenencia de préstamo personal")
```
La gran parte de los clientes no tienen un préstamo personal.
Si evaluamos la variable loan respecto a nuestra variable objetivo (term_deposit)
```{r}
with(train, CrossTable(loan, term_deposit, format = 'SPSS'))
```
Gráficamente:
```{r}
ggplot(train, aes(x = loan, fill = term_deposit)) + geom_bar() + facet_wrap(~term_deposit, nrow = 1) + ggtitle("Contratación depósito según tenencia de préstamo")
ggplot(train, aes(x = loan, fill = term_deposit)) + geom_bar(aes(y = ..prop.., group = 1 )) + facet_wrap(~term_deposit, nrow = 1) + ggtitle("Contratación depósito según tenencia de préstamo")
```
Se comprueba que en términos relativos aquellos que contratan el depósito tienen una proporción parecida a las que no lo contratan en cuanto a la tenencia de préstamo personal. Aunque son aquellos que no contratan el préstamo los que tienen mayor proporción de tener un préstamo personal.
### VARIABLE CONTACT
La variable contact es una variable categórica que indica la forma en la que se contactó con el cliente. (A través de teléfono móvil, fijo, desconocido)
Al ser una variable categórica también realizamos una tabla de frecuencias absoluta y de frecuencias relativa para ver su composición de forma univariante.
```{r}
ftable(train$contact)
prop.table(ftable(train$contact))
```
Muestra que un gran porcentaje de los clientes fueron contactados a través del teléfono móvil.
Gráficamente:
```{r}
ggplot(train, aes(contact)) + geom_bar(aes(y = ..prop.., group = 1 ), fill = 'skyblue2') + ggtitle("Forma de contacto con la persona")
```
Si evaluamos la variable contact respecto a nuestra variable objetivo (term_deposit)
```{r}
with(train, CrossTable(contact, term_deposit, format = 'SPSS'))
```
Gráficamente:
```{r}
ggplot(train, aes(x = contact, fill = term_deposit)) + geom_bar() + facet_wrap(~term_deposit, nrow = 1) + ggtitle("Contratación de depósito según forma de contacto")
ggplot(train, aes(x = contact, fill = term_deposit)) + geom_bar(aes(y = ..prop.., group = 1 )) + facet_wrap(~term_deposit, nrow = 1) + ggtitle("Contratación de depósito según forma de contacto")
```
Observamos que la gran mayorÃa de las personas que contrataron el depósito fueron contactadas a través del teléfono móvil.
### VARIABLE MES
La variable mes es una variable categórica que indica en qué mes se produjo el último contacto con el cliente.
Reasignamos los valores de la variable para que aparezcan en orden.
```{r}
meses = factor(train$month, levels = (c("jan", "feb", "mar", "apr", "may", "jun",
"jul", "aug", "sep", "oct", "nov", "dec")))
```
Realizamos una tabla de frecuencias absoluta y de frecuencias relativa para ver su composición de forma univariante.
```{r}
ftable(meses)
prop.table(ftable(meses))
```
Gráficamente:
```{r}
ggplot(train, aes(meses)) + geom_bar(aes(y = ..prop.., group = 1 ), fill = 'skyblue2') + ggtitle("Último mes de contacto con el cliente")
```
Se observa como mayo fue el mes donde más últimos contactos se produjeron con el cliente
Si evaluamos la variable mes respecto a nuestra variable objetivo (term_deposit)
```{r}
with(train, CrossTable(meses, term_deposit, format = 'SPSS'))
```
Gráficamente:
```{r}
ggplot(train, aes(x = meses, fill = term_deposit)) + geom_bar() + facet_wrap(~term_deposit, nrow = 1) + ggtitle("Contratación depósito según mes de último contacto")
ggplot(train, aes(x = meses, fill = term_deposit)) + geom_bar(aes(y = ..prop.., group = 1 )) + facet_wrap(~term_deposit, nrow = 1) + ggtitle("Contratación depósito según mes de último contacto")
```
Se observa como las personas que contrataron el depósito fueron contactadas por última vez con mayor proporción en torno a los meses centrales del año.
#### Relación de las variables categóricas con la variable objetivo
```{r}
mosaic(xtabs(~ term_deposit + loan + contact, data = train), split_vertical = TRUE, shade = TRUE, main = 'Contratación de depósito', sub = 'Según formas de contacto y crédito')
```
### VARIABLE DAY
Es una variable continua que abarca valores entre los 31 dÃas del mes.
```{r}
summary(train$day)
describe(train$day)
```
Encontramos los principales estadÃsticos generales como las medidas de centralidad de la variable
Medidas de dispersión:
```{r}
sd(train$day)
IQR(train$day)
```
Para ver la distribución de la variable gráficamente:
```{r}
ggplot(train, aes(x = day)) +
geom_histogram(fill="skyblue2", colour="white") + geom_density(alpha = .3) +
ggtitle('DÃa del mes de contacto')
ggplot(train, aes(x = day)) +
geom_density(alpha = .3) +
ggtitle('KDE del dÃa de contacto')
```
Podemos diferenciar tres grupos distintos de datos en la variable. PodrÃamos convertirla en una variable categórica con 3 categorÃas.
```{r}
train[,'dia_mes'] = cut(train$day, breaks = c(0, 10, 20, 31), labels = c('InicioMes','MedioMes','FinalMes'))
```
Al convertirla en una variable categórica podemos sacar una tabla con sus frecuencias.
```{r}
ftable(train$dia_mes)
prop.table(ftable(train$dia_mes))
```
Gráficamente:
```{r}
ggplot(train, aes(dia_mes)) + geom_bar(aes(y = ..prop.., group = 1 ), fill = 'skyblue2') + ggtitle("DÃa de último contacto con el cliente")
```
Si evaluamos la variable dÃas respecto a nuestra variable objetivo (term_deposit)
```{r}
with(train, CrossTable(dia_mes, term_deposit, format = 'SPSS'))
```
Gráficamente:
```{r}
ggplot(train, aes(x = dia_mes, fill = term_deposit)) + geom_bar() + facet_wrap(~term_deposit, nrow = 1) + ggtitle("Contratación de depósito según dÃa de contacto")
ggplot(train, aes(x = dia_mes, fill = term_deposit)) + geom_bar(aes(y = ..prop.., group = 1 )) + facet_wrap(~term_deposit, nrow = 1) + ggtitle("Contratación de depósito según dÃa de contacto")
```
No existe un patrón especÃfico para la contratación del depósito dependiendo de cuál fue el último dÃa de contacto con el cliente.
Teniendo mayor proporción de contratación entre los dÃas 10 y 20 del mes (Medio Mes)
### VARIABLE DURATION
Es una variable cuantitativa que muestra la duración en segundos del último contacto mantenido con el cliente.
```{r}
summary(train$duration)
describe(train$duration)
```
Las medidas de centralidad de la variable duración son 177 la mediana y 256 la media.
Lo que nos muestra que la variable tiene cierta asimetrÃa a la derecha al ser la media mayor a la mediana.
```{r}
skewness(train$duration)
kurtosis(train$duration)
```
+
Se comprueba que el coeficiente de asimetrÃa es distinto a 0 y positivo.
Por otro lado la curtosis es diferente de 3 (Normal) y es Leptocúrtica, forma más puntiaguda que la Normal.
En cuanto a las medidas de dispersión.
```{r}
sd(train$duration)
IQR(train$duration)
```
Gráficamente:
```{r}
ggplot(train, aes(x = duration)) +
geom_histogram(fill="skyblue2", colour="white") +
ggtitle('Duracion último contacto')
ggplot(train, aes(x = duration)) +
geom_density() +
ggtitle('KDE de duracion último contacto')
```
Se comprueba como la variable duración cuenta con muchos valores de su distribución en cantidades muy pequeñas y menos valores en cantidades grandes.
PodrÃamos transformar la variable para obtener mayor normalidad en su distribución.
```{r}
boxplot(train$duration, train = train, col= 'orange')
```
Se comprueba la gran cantidad de atÃpicos en valores superiores de esta distribución lo que sugiere una transformación de sus datos.
Respecto a nuestra variable de interés (Term_deposit)
```{r}
ggplot(train, aes(x = duration, colour = term_deposit)) +
geom_histogram() + facet_wrap(~term_deposit, ncol = 2) +
ggtitle('Duración de último contacto con el cliente')
ggplot(train ,aes(x=duration, fill=term_deposit)) + geom_density(alpha = .5) + ggtitle("Duración último contacto con el cliente")
```
```{r}
ggplot(train, aes(y = duration, x = term_deposit)) + geom_violin(aes(fill=term_deposit))+ggtitle("Duración último contacto con el cliente")
```
### VARIABLE CAMAPIGN
Es una variable cuantitativa que muestra el número de contactos en esta campaña hacia un cliente.
```{r}
summary(train$campaign)
describe(train$campaign)
```
Encontramos los valores de los estadÃsticos generales donde el 75% de los clientes recibieron menos de 3 contactos.
Las medidas de centralidad de esta variable es la mediana con 2 contactos por cliente en esta campaña.
```{r}
skewness(train$campaign)
kurtosis(train$campaign)
```
Esta variable también tiene asimetrÃa hacia la derecha como podemos comprobar al ser mayor que 0 el coeficiente de asimetrÃa.
Por otro lado, la curtosis es diferente de 3 (Normal) y es Leptocúrtica, forma más puntiaguda que la Normal.
En cuanto a las medidas de dispersión.
```{r}
sd(train$campaign)
IQR(train$campaign)
```
Gráficamente:
```{r}
ggplot(train, aes(x = campaign)) +
geom_histogram(fill="skyblue2", colour="white") +
ggtitle('Número de contactos al cliente')
boxplot(train$campaign, train = train, col= 'orange')
```
Se comprueba la gran existencia de outliers en la distribución de esta variable. Se deberÃa transformar la variable.
Con respecto a la variable de interés
```{r}
ggplot(train, aes(x = campaign, colour = term_deposit)) +
geom_histogram() + facet_wrap(~term_deposit, ncol = 2) +
ggtitle('Numero de contactos al cliente en esta campaña')
ggplot(train,aes(x=campaign, colour=term_deposit)) + geom_freqpoly(bindwidth = 0.5) + ggtitle("Numero de contactos al cliente en esta campaña")
```
```{r}
ggplot(data = train) + geom_boxplot(aes(x= term_deposit, y=campaign, fill = term_deposit))
```
Con esta representación del diagrama de caja, se comprueba la necesidad de transformar la variable.
### VARIABLE PDAYS
La variable pdays es una variable cuantitativa que muestra los dÃas que han pasado desde que se contactó con él en la anterior campaña
```{r}
summary(train$pdays)
describe(train$pdays)
```
La variable muestra con -1 aquellas personas que no habÃan recibido contacto en ninguna campaña anterior.
Forma de la variable:
```{r}
skewness(train$pdays)
kurtosis(train$pdays)
```
La variable es right skewed es decir tiene asimetrÃa positiva.
También es leptocúrtica, más puntiaguda que una variable con distribución normal.
En cuanto a la dispersión en esta variable:
```{r}
sd(train$pdays)
IQR(train$pdays)
```
El IQR es 0 ya que el 75% de los clientes no habÃan sido contactados en ninguna campaña anterior.
Gráficamente:
```{r}
ggplot(train, aes(x = pdays)) +
geom_histogram(fill="skyblue2", colour="white") +
ggtitle('Número dÃas desde último contacto en campañas anteriores')
boxplot(train$pdays, train = train, col= 'orange')
```
Se comprueba la gran existencia de outliers en la distribución. Se deberÃa transformar la variable.
Respecto a la variable de interés
```{r}
ggplot(train, aes(x = pdays, colour = term_deposit)) +
geom_histogram() + facet_wrap(~term_deposit, ncol = 2) +
ggtitle('Número dÃas desde último contacto en campañas anteriores')
ggplot(train,aes(x=pdays, colour=term_deposit)) + geom_freqpoly(bindwidth = 0.5) + ggtitle("Número dÃas desde último contacto en campañas anteriores")
```
```{r}
ggplot(data = train) + geom_boxplot(aes(x= term_deposit, y=pdays, fill = term_deposit))
```
Se observa que es necesaria la transformación de la variable pdays dada su distribución.
### VARIABLE POUTCOME
La variable poutcome es una variable cualitativa polÃtoma que muestra el resultado de contratación de la última campaña con respecto a cada cliente. Los cuatro valores categóricos son: "failure","other","success" y "unknown"
```{r}
poutcome = factor(train$poutcome, levels = (c("failure","other","success","unknown")))
```
Realizamos una tabla de frecuencias absoluta y de frecuencias relativa para ver su composición de forma univariante.
```{r}
ftable(poutcome)
prop.table(ftable(poutcome))
```
Gráficamente:
```{r}
ggplot(train, aes(poutcome)) + geom_bar(aes(y = ..prop.., group = 1 ), fill = 'skyblue2') + ggtitle("Resultado de la campaña anterior con el cliente")
```
Si evaluamos la variable poutcome con respecto a nuestra variable objetivo (term_deposit)
```{r}
with(train, CrossTable(poutcome, term_deposit, format = 'SPSS'))
```
Gráficamente:
```{r}
ggplot(train, aes(x = poutcome, fill = term_deposit)) + geom_bar() + facet_wrap(~term_deposit, nrow = 1) + ggtitle("Contratación depósito según resultado campaña anterior")
ggplot(train, aes(x = poutcome, fill = term_deposit)) + geom_bar(aes(y = ..prop.., group = 1 )) + facet_wrap(~term_deposit, nrow = 1) + ggtitle("Contratación depósito resultado campaña anterior")
```
Se observa como las personas que adquirieron la oferta de la campaña anterior un número significativo vuelve a contratar la campaña actual siendo un 52.35% que sà adquiere frente a un 47.65 que no adquiere el producto de esta campaña
### VARIABLE Previous
Es una variable continua que indica el número de llamadas realizadas a este cliente antes de esta campaña.
```{r}
summary(train$previous)
describe(train$previous)
```
Encontramos los principales estadÃsticos generales como las medidas de centralidad de la variable
Medidas de dispersión:
```{r}
sd(train$previous)
IQR(train$previous)
```
Para ver la distribución de la variable gráficamente:
**Eliminamos los datos atÃpicos, puesto que hay una instancia con 275 llamadas antes de esta campaña
```{r}
ggplot(train, aes(x = previous)) +
geom_bar(fill="skyblue2", colour="white") + geom_density(alpha = .3) +
ggtitle('Número de llamadas realizadas a este cliente antes de esta campaña')+coord_cartesian(xlim=c(0,10))
ggplot(train, aes(x = previous)) +
geom_density(alpha = .3) +
ggtitle('KDE del número de llamadas realizadas a este cliente antes de esta campaña')+coord_cartesian(xlim=c(0,10))
ggplot(train, aes(x = previous), colour=factor(term_deposit)) +
geom_bar(fill="skyblue2",) + geom_density(alpha = .3) +
ggtitle('Número de llamadas realizadas a este cliente antes de esta campaña')+coord_cartesian(xlim=c(0,10))+
facet_wrap(~term_deposit)
ggplot(train, aes(x = previous), colour=factor(term_deposit)) +
geom_density(fill="skyblue2",) +
ggtitle('Número de llamadas realizadas a este cliente antes de esta campaña')+coord_cartesian(xlim=c(0,10))+
facet_wrap(~term_deposit)
```
Se observa que los clientes que adquieren el depósito han recibido mayor número de llamadas media en anteriores campañas frente a los que no adquieren el producto.
### VARIABLE term_deposit - variable respuesta
La variable term_deposit (variable binaria) indica si el cliente suscribe el depósito ("sÃ","no")
```{r}
prop.table(table(train$term_deposit))
ggplot(train,aes(term_deposit))+geom_bar(fill="green")+ggtitle("Se suscribe el cliente?")
pairs( age ~ duration + campaign + previous, data=train, main="Gráfico - Matriz de dispersión")
library(corrplot)
train %>% select(age,balance,day, duration, campaign, pdays, previous) %>% cor( method ="spearman") %>% corrplot()
```
En el caso de que observamos que el conjunto de train se encuentra tan desbalanceado respecto a la variable objetivo que no permite ajustar el modelo, realizarÃamos un balanceo. Por ello, vamos a aplicar Random Under Sampling para tratar de disminuir la diferencia entre ambas categorÃas.
```{r include = FALSE}
negativeIndex = sample(which(train$term_deposit == 'no'), size = round(0.12*n), replace=FALSE)
negative_train = train[negativeIndex ,]
train <- rbind(negative_train, train[train$term_deposit == 'yes',])
```
## Tratamiento de datos faltantes
Las columnas que presentan datos faltantes son:
1. Job: type of job (categorical: 'admin.','blue-collar','entrepreneur','housemaid','management','retired','self-employed','services','student','technician','unemployed','unknown')
2. Contact: contact communication type (categorical: 'cellular','telephone')
3. Pdays: number of days that passed by after the client was last contacted from a previous campaign (numeric; 999 means client was not previously contacted)
4. Education: (categorical: 'basic.4y','basic.6y','basic.9y','high.school','illiterate','professional.course','university.degree','unknown')
5. Duration: last contact duration, in seconds (numeric). Important note: this attribute highly affects the output target (e.g., if duration=0 then y='no'). Yet, the duration is not known before a call is performed. Also, after the end of the call y is obviously known. Thus, this input should only be included for benchmark purposes and should be discarded if the intention is to have a realistic predictive model.
6. Poutcome: outcome of the previous marketing campaign (categorical: 'failure','nonexistent','success')
Utilizamos la función describe de la librerÃa Hmis para mostrar la información estadÃstica de las variables que presentan datos faltantes.
```{r}
d <- describe(train)
d[c('job','contact','pdays','education','duration','poutcome')]
```