-
Notifications
You must be signed in to change notification settings - Fork 49
/
01-repaso-visualizacion.Rmd
878 lines (676 loc) · 35.8 KB
/
01-repaso-visualizacion.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
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
# Introducción a visualización
> "The simple graph has brought more information to the data analyst’s mind
than any other device." --- John Tukey
### El cuarteto de Ascombe {-}
En 1971 un estadístico llamado Frank Anscombe (fundador del departamento de
Estadística de la Universidad de Yale) publicó cuatro conjuntos de datos, cada
uno consiste de 11 observaciones y tienen las mismas propiedades estadísticas.
Sin embargo, cuando analizamos los datos de manera gráfica en un histograma
encontramos rápidamente que los conjuntos de datos son muy distintos.
<div style= "float:left;top:-10px;width:500px;">
```{r, message=FALSE, echo=FALSE, warning=FALSE}
library(tidyverse)
anscombe_long <- anscombe %>%
mutate(n_obs = 1:n()) %>%
gather(key, value, -n_obs) %>%
separate(key, c("var", "dataset"), 1) %>%
spread(var, value)
ggplot(anscombe_long, aes(x, y)) +
geom_smooth(method = "lm", se = FALSE, size = 0.5) +
geom_point() +
facet_wrap(~dataset)
```
</div>
</br>
</br>
Media de $x$: 9
Varianza muestral de $x$: 11
Media de $y$: 7.50
Varianza muestral de $y$: 4.12
Correlación entre $x$ y $y$: 0.816
Línea de regresión lineal: $y = 3.00 + 0.500x$
<div style="clear:both"></div>
En la gráfica del primer conjunto de datos, se ven datos como los que se
tendrían en una relación lineal simple con un modelo que cumple los supuestos de
normalidad. La segunda gráfica (arriba a la derecha) muestra unos datos que
tienen una asociación pero definitivamente no es lineal. En la tercera gráfica
(abajo a la izquierda) están puntos alineados perfectamente en una línea recta,
excepto por uno de ellos. En la última gráfica podemos ver un ejemplo en el cual
basta tener una observación atípica para que se produzca un coeficiente de
correlación alto aún cuando en realidad no existe una asociación lineal entre
las dos variables.
<div style="clear:both"></div>
<div style= "float:right;padding=10px; top:-10px; width:350px">
```{r datasaurus_gif, eval=FALSE, echo=FALSE}
library(datasauRus)
library(gganimate)
library(animation)
ggplot(datasaurus_dozen, aes(x = x, y = y, frame = dataset)) +
geom_point() +
theme(legend.position = "none") +
transition_states(
dataset,
transition_length = 2,
state_length = 1
) +
enter_fade() +
exit_shrink() +
ease_aes('sine-in-out')
anim_save("imagenes/datasaurus.gif")
```
![](imagenes/datasaurus.gif)
</div>
El cuarteto de Ascombe inspiró una técnica para crear datos que comparten las
propiedades estadísticas al igual que en el cuarteto, pero que producen gráficas
muy distintas ([Matejka,
Fitzmaurice](https://www.autodeskresearch.com/publications/samestats)).
<div style="clear:both"></div>
## Introducción
La visualización de datos no trata de hacer gráficas “bonitas” o “divertidas”,
ni de simplificar lo complejo o ayudar a una persona “que no entiende mucho” a
entender ideas complejas. Más bien, trata de aprovechar nuestra gran capacidad
de procesamiento visual para exhibir de manera clara aspectos importantes de los
datos.
El siguiente ejemplo de [@tufte06], ilustra claramente la diferencia entre estos
dos enfoques. A la izquierda están gráficas (más o menos típicas de Powerpoint)
basadas en la filosofía de simplificar, de intentar no “ahogar” al lector con
datos. El resultado es una colección incoherente, de bajo contenido, que no
tiene mucho qué decir y que es, “indeferente al contenido y la evidencia”.
A la derecha está una variación del rediseño de Tufte en forma de tabla, que en
este caso particular es una manera eficiente de mostrar claramente los patrones
que hay en este conjunto simple de datos.
¿Qué principios son los que soportan la efectividad de esta tabla sobre la
gráfica de la derecha? Veremos que hay dos conjuntos de principios importantes:
unos relacionados con el diseño y otros con la naturaleza del análisis de datos,
independientemente del método de visualización.
![](imagenes/tufte_cancer.jpg)
### Visualización de datos en la estadística {-}
La estadística tradicionalmente se divide en dos partes: una parte de naturaleza
exploratoria, donde jugamos el papel de detectives en búsqueda de los elementos
de evidencia importante, y una parte de naturaleza inferencial, donde nos
convertimos en jueces donde le damos pesos de credibilidad a la evidencia que
presenta el detective. Estas dos partes tienen interacción fuerte en la
práctica, pero por razones históricas se considera “superior” a la parte
inferencial por encima de la exploratoria.
Aunque en el proceso de inferencia las gráficas cada vez son más importantes, la
visualización entra más claramente dentro del análisis exploratorio de datos. Y
como en un principio no es claro como la visualización aporta al proceso de la
inferencia, se le consideró por mucho tiempo como un área de poca importancia
para la estadística: una herramienta que en todo caso sirve para comunicar ideas
simples, de manera deficiente, y a personas poco sofisticadas.
```{r, message=FALSE, echo=FALSE, warning=FALSE}
barley_1931 <- read_csv("data/barley_1931.csv")
barley_1932 <- read_csv("data/barley_1932.csv")
barley_1931$year <- 1931
barley_1932$year <- 1932
barley_tot <- bind_rows(barley_1931, barley_1932) %>%
gather(site, yield, -variety, -year) %>%
mutate(variety = reorder(variety, yield))
barley_plot <- ggplot(barley_tot, aes(x = variety, y = yield,
color = factor(year))) +
facet_wrap(~site) +
geom_point(size = 0.6) +
geom_line(aes(x = as.numeric(variety))) +
coord_flip() +
labs(y = "variety", color = "year", x = "variety")
```
<div style= "float:right;top:-10px;width:500px;padding:2px">
```{r barley_plot, echo=FALSE, fig.width=5, fig.height=5.2}
barley_plot
```
</div>
El peor lado de este punto de vista consiste en restringirse a el análisis
estadístico rutinario @cleveland93: aplicar las recetas y
negarse a ver los datos de distinta manera (¡incluso pensar que esto puede
sesgar los resultados, o que nos podría engañar!). El siguiente ejemplo muestra
un caso grave y real (no simulado) de este análisis estadístico rutinario
(tomado de @cleveland94).
A la derecha mostramos los resultados de un experimento de agricultura. Se
cultivaron diez variedades de cebada en seis sitios de Minnesota, en $1921$ y
$1932$. Este es uno de los primeros ejemplos en el que se aplicaron las ideas de
Fisher en cuanto a diseño de experimentos.
Estos datos fueron reanalizados desde esa época por muchos agrónomos. Hasta muy
recientemente se detectó la anomalía en el comportamiento de los años en el
sitio Morris, el cual es evidente en la gráfica. Investigación posterior ha
mostrado convincentemente que en algún momento alguien volteó las etiquetas de
los años en este sitio.
Este ejemplo muestra, en primer lugar, que la visualización es crucial en el
proceso de análisis de datos: sin ella estamos expuestos a no encontrar aspectos
importantes de los datos (errores) que deben ser discutidos - aún cuando nuestra
receta de análisis no considere estos aspectos. Ninguna receta puede aproximarse
a describir todas las complejidades y detalles en un conjunto de datos de tamaño
razonable (este ejemplo, en realidad, es chico). Sin embargo, la visualización
de datos, por su enfoque menos estructurado, y el hecho de que se apoya en un
medio con un “ancho de banda” mayor al que puede producir un cierto número de
cantidades resumen, es ideal para investigar estos aspectos y detalles.
<div style="clear:both"></div>
### Visualización popular de datos {-}
Publicaciones populares (periódicos, revistas, sitios internet) muchas veces
incluyen visualización de datos como parte de sus artículos o reportajes. En
general siguen el mismo patrón que en la visión tradicionalista de la
estadística: sirven más para divertir que para explicar, tienden a explicar
ideas simples y conjuntos chicos de datos, y se consideran como una “ayuda”
para los “lectores menos sofisticados”. Casi siempre se trata de gráficas
triviales (muchas veces con errores graves) que no aportan mucho a artículos que
tienen un nivel de complejidad mucho mayor (es la filosofía: lo escrito para el
adulto, lo graficado para el niño).
![](imagenes/nyt.png)
## Teoría de visualización de datos
Existe teoría fundamentada acerca de la visualización. Después del trabajo
pionero de Tukey, los principios e indicadores de Tufte se basan en un estudio
de la historia de la graficación y ejercicios de muestreo de la práctica gráfica
a lo largo de varias disciplinas (¿cuáles son las mejores gráficas? ¿por qué?
El trabajo de Cleveland es orientado a la práctica del análisis de datos
(¿cuáles gráficas nos han ayudado a mostrar claramente los resultados del
análisis?), por una parte, y a algunos estudios de percepción visual.
### Principios generales del diseño analítico {-}
Aplicables a una presentación o análisis completos, y como guía para construir
nuevas visualizaciones [@tufte06].
<div class="caja">
**Principio 1.** Muestra comparaciones, contrastes, diferencias.
**Principio 2.** Muestra causalidad, mecanismo, explicación, estructura
sistemática.
**Principio 3.** Muestra datos multivariados, es decir, más de una o dos
variables.
**Principio 4.** Integra palabras, números, imágenes y diagramas.
**Principio 5.** Describe la totalidad de la evidencia. Muestra fuentes usadas
y problemas relevantes.
**Principio 6.** Las presentaciones analíticas, a fin de cuentas, se sostienen o
caen dependiendo de la calidad, relevancia e integridad de su contenido.
</div>
### Técnicas de visualización {-}
Esta categoría incluye técnicas específicas que dependen de la forma de nuestros
datos y el tipo de pregunta que queremos investigar (@tukey77, @cleveland93,
@cleveland94, @tufte06).
<div class="caja">
**Tipos de gráficas:** cuantiles, histogramas, caja y brazos, gráficas de
dispersión, puntos/barras/ líneas, series de tiempo.
**Técnicas para mejorar gráficas:** Transformación de datos, transparencia,
vibración, banking 45, suavizamiento y bandas de confianza.
**Pequeños múltiplos**
**Tablas**
</div>
### Indicadores de calidad gráfica {-}
Aplicables a cualquier gráfica en particular. Estas son guías concretas y
relativamente objetivas para evaluar la calidad de una gráfica [@tufte86].
<div class="caja">
**Integridad Gráfica.** El factor de engaño, es decir, la distorsión gráfica de
las cantidades representadas, debe ser mínimo.
**Chartjunk.** Minimizar el uso de decoración gráfica que interfiera con la
interpretación de los datos: 3D, rejillas, rellenos con patrones.
**Tinta de datos.** Maximizar la proporción de tinta de datos vs. tinta total de
la gráfica. *For non-data- ink, less is more. For data-ink, less is a bore.*
**Densidad de datos.** Las mejores gráficas tienen mayor densidad de datos, que
es la razón entre el tamaño del conjunto de datos y el área de la gráfica. Las
gráficas se pueden encoger mucho. Percepción visual. Algunas tareas son más
fáciles para el ojo humano que otras [@cleveland94].
</div>
### Factor de engaño, chartjunk y pies {-}
<div style= "float:right;position: relative; top: -10px;width:140px">
![](imagenes/pies.jpg)
</div>
El **factor de engaño** es el cociente entre el efecto mostrado en una gráfica y
el efecto correspondiente en los datos. Idealmente, el factor de engaño debe ser
1 (ninguna distorsión).
El **chartjunk** son aquellos elementos gráficos que no corresponden a variación
de datos, o que entorpecen la interpretación de una gráfica.
Estos son los indicadores de calidad más fáciles de entender y aplicar, y
afortunadamente cada vez son menos comunes.
Un diseño popular que califica como chartjunk y además introduce factores de
engaño es el pie de 3D. En la gráfica de la derecha, podemos ver como la
rebanada C se ve más grande que la rebanada A, aunque claramente ese no es el
caso (factor de engaño). La razón es la variación en la perspectiva que no
corresponde a variación en los datos (chartjunk).
Corregimos quitando el efecto 3D. Esto reduce el factor de engaño pero hay
todavía elementos que pueden mejorar la comprensión: se trata de la
decodificiacion que hay que hacer categoría - color - cuantificación. Podemos
agregar las etiquetas como se muestra en la serie de la derecha, pero entonces:
¿por qué no mostrar simplemente la tabla de datos? ¿qué agrega el pie a la
interpretación?
<div style="clear:both"></div>
La deficiencias en el pie se pueden ver claramente al intentar graficar más
categorías ($13$) . En el primer pie no podemos distinguir realmente cuáles son
las categorías grandes y cuáles las chicas, y es muy difícil tener una imagen
mental clara de estos datos. Agregar los porcentajes ayuda, pero entonces, otra
vez, preguntamos cuál es el propósito del pie. La tabla de la izquierda hace
todo el trabajo (una vez que ordenamos las categrías de la más grande a la más
chica). Es posible hacer una gráfica de barras como la de abajo a la izquierda.
<div style= "float:left;top: -10px;width:120px">
![](imagenes/barras_pie.jpg)
</div>
<div style="clear:both"></div>
Hay otros tipos de chartjunk comunes: uno es la textura de barras, por ejemplo.
El efecto es la producción de un efecto moiré que es desagradable y quita la
atención de los datos, como en la gráfica de barras de abajo. Otro común son las
rejillas, como mostramos en las gráficas de la izquierda. Nótese como en estos
casos hay efectos ópticos no planeados que degradan la percepción de los
patrones en los datos.
![](imagenes/barras_moire.jpg)
### Series de tiempo y promedio de 45 {-}
Las series de tiempo son una especie particular de las gráficas de dispersión,
en donde la dimensión horizontal es el tiempo. Buscamos entender cómo varía una
medición dada en el tiempo. Estas gráficas son mas útiles cuando se construyen
usando el principio del promedio de $45$ grados: los patrones de variación en el
tiempo se distinguen mejor (aproximadamente) cuando el promedio de pendiente (en
valor absoluto) en las gráficas está cercano a $45$ grados. El siguiente ejempo,
que muestra la actividad de manchas solares del sol, muestra claramente este
principio:
![](imagenes/series_45.jpg)
Espto también es un principio para decidir la razón de aspecto de cualquier
gráfica de dispersión (y también gráficas de barras). Esta regla supera el
principio de que “las escalas deben comenzar en cero”. En realidad este
último principio cuida contra dos errores en la graficación: no poner atención a
la escala e intentar comparar gráficas que no están dibujadas en la misma
escala. Poniendo atención a estos dos aspectos (incluso llamado a veces la
atención a estos puntos, Stephen Few) no hay necesidad de seguir la regla del $0$.
<div style= "width:400px">
![](imagenes/principio_cero.jpg)
</div>
<div style="clear:both"></div>
### Pequeños múltiplos y densidad gráfica {-}
La densidad de una gráfica es el tamaño del conjunto de datos que se grafica
comparado con el área total de la gráfica. En el siguiente ejemplo, graficamos
en logaritmo-10 de cabezas de ganado en Francia (cerdos, res, ovejas y
caballos). La gráfica de la izquierda es pobre en densidad pues sólo representa
$4$ datos. La manera más fácil de mejorar la densidad es hacer más chica la
gráfica:
<div style= "width=450px">
![](imagenes/france_plot.jpg)
</div>
La razón de este encogimiento es una que tiene qué ver con las oportunidades perdidas de una gráfica grande. Si repetimos este mismo patrón (misma escala, mismos tipos de ganado) para distintos países obtenemos la siguiente gráfica:
<div style= "float:left;top: -10px;width:500px">
![](imagenes/europe_plot.jpg)
</div>
Esta es una gráfica de puntos. Es útil como sustituto de una gráfica de barras,
y es superior en el sentido de que una mayor proporción de la tinta que se usa
es tinta de datos. Otra vez, mayor proporción de tinta de datos representa más
oportunidades que se pueden capitalizar, como muestra la gráfica de punto y
líneas que mostramos al principio (rendimiento en campos de cebada).
### Tinta de datos {-}
Maximizar la proporción de tinta de datos en nuestras gráficas tiene beneficios
inmediatos. La regla es: si hay tinta que no representa variación en los datos,
o la eliminación de esa tinta no representa pérdidas de significado, esa tinta
debe ser eliminada. El ejemplo más claro es el de las rejillas en gráficas y
tablas:
![](imagenes/tinta_datos.jpg)
<div style= "float:left;top: -10px">
![](imagenes/tabla_tinta_datos.jpg)
</div>
¿Por qué usar grises en lugar de negros? La respuesta tiene qué ver con el
principio de tinta de datos: si marcamos las diferencias sutil pero claramente,
tenemos más oportunidades abiertas para hacer énfasis en lo que nos interesa: a
una gráfica o tabla saturada no se le puede hacer más - es difícil agregar
elementos adicionales que ayuden a la comprensión. Si comenzamos marcando con
sutileza, entonces se puede hacer más. Los mapas geográficos son un buen ejemplo
de este principio.
El espacio en blanco es suficientemente bueno para indicar las fronteras en una
tabla, y facilita la lectura:
![](imagenes/tabla_2_tinta_datos.jpg)
### Percepción de escala {-}
Entre la percepción visual y la interpretación de una gráfica están implícitas
tareas visuales específicas que las personas debemos realizar para ver
correctamente la gráfica. En la década de los ochenta, William S. Cleveland y
Robert McGill realizaron algunos experimentos identificando y clasificando estas
tareas para diferentes tipos de gráficos [@cleveland84].
En estos, se le pregunta a la persona que compare dos valores dentro de una
gráfica, por ejemplo, en dos barras en una gráfica de barras, o dos rebanadas de
una gráfica de pie.
![](imagenes/cleveland_tasks.png)
Los resultados de Cleveland y McGill fueron replicados por Heer y Bostock en
$2010$ y los resultados se muestran en las gráficas de la derecha:
<div style= "float:left;top:-10px;width:400px">
![](imagenes/heer-bostock_results.png)
</div>
<div style="clear:both"></div>
### Minard {-}
Concluimos esta sección con una gráfica que, aunque poco común, ejemplifica
los principios de una buena gráfica, y es reconocida como una de las mejores
visualizaciones de la historia.
> Una gráfica excelente, presenta datos interesantes de forma bien
diseñada: es una cuestión de fondo, de diseño, y estadística... [Se] compone de
ideas complejas comunicadas con claridad, precisión y eficiencia. ... [Es] lo
que da al espectador la mayor cantidad de ideas, en el menor tiempo, con
la menor cantidad de tinta, y en el espacio más pequeño. ... Es casi siempre
multivariado. ... Una excelente gráfica debe decir la verdad acerca de los
datos. (Tufte, 1983)
La famosa visualización de Charles Joseph Minard de la marcha de Napoleón sobre
Moscú, ilustra los principios de una buena gráfica. Tufte señala que esta imagen
"bien podría ser el mejor gráfico estadístico jamás dibujado", y sostiene que
"cuenta una historia rica y coherente con sus datos multivariados, mucho más
esclarecedora que un solo número que rebota en el tiempo". Se representan seis
variables: el tamaño del ejército, su ubicación en una superficie bidimensional,
la dirección del movimiento del ejército y la temperatura en varias fechas
durante la retirada de Moscú".
![](imagenes/minard.png)
Hoy en día Minard es reconocido como uno de los principales contribuyentes a la
teoría de análisis de datos y creación de **infografías** con un fundamento
estadístico.
Se grafican $6$ variables: el número de tropas de Napoleón, la distancia, la
temperatura, la latitud y la longitud, la dirección en que viajaban las tropas
y la localización relativa a fechas específicas.
La
gráfica de Minard, como la describe E.J. Marey, parece "desafiar la pluma del
historiador con su brutal elocuencia", la combinación de datos del mapa, y la
serie de tiempo, dibujados en $1869$, "retratan una secuencia de pérdidas
devastadoras que sufrieron las tropas de Napoleón en $1812$". Comienza en la
izquierda, en la frontera de Polonia y Rusia, cerca del río Niemen. La línea
gruesa dorada muestra el tamaño de la Gran Armada ($422,000$) en el momento en que
invadía Rusia en junio de $1812$.
El ancho de esta banda indica el tamaño de la armada en cada punto del mapa. En
septiembre, la armada llegó a Moscú, que ya había sido saqueada y dejada
desértica, con sólo $100,000$ hombres.
El camino del retiro de Napoleón desde Moscú está representado por la línea
oscuara (gris) que está en la parte inferior, que está relacionada a su vez con
la temperatura y las fechas en el diagrama de abajo. Fue un invierno muy frío,
y muchos se congelaron en su salida de Rusia. Como se muestra en el mapa, cruzar
el río Berezina fue un desastre, y el ejército de Napoleón logró regresar a
Polonia con tan sólo $10,000$ hombres.
También se muestran los movimientos de las tropas auxiliaries, que buscaban
proteger por atrás y por la delantera mientras la armada avanzaba hacia Moscú.
La gráfica de Minard cuenta una historia rica y cohesiva, coherente con datos
multivariados y con los hechos históricos, y que puede ser más ilustrativa que
tan sólo representar un número rebotando a lo largo del tiempo.
# Introducción a R y al paquete ggplot2
##### ¿Qué es R? {-}
* R es un lenguaje de programación y un ambiente de cómputo estadístico
* R es software libre (no dice qué puedes o no hacer con el software), de código
abierto (todo el código de R se puede inspeccionar - y se inspecciona).
* Cuando instalamos R, instala la base de R. Mucha de la funcionalidad adicional
está en **paquetes** (conjunto de funciones y datos documentados) que la
comunidad contribuye.
##### ¿Cómo entender R? {-}
* Hay una sesión de R corriendo. La consola de R es la interfaz
entre R y nosotros.
* En la sesión hay objetos. Todo en R es un objeto: vectores, tablas,
funciones, etc.
* Operamos aplicando funciones a los objetos y creando nuevos objetos.
##### ¿Por qué R? {-}
* R funciona en casi todas las plataformas (Mac, Windows, Linux e incluso en Playstation 3).
* R es un lenguaje de programación completo, permite desarrollo de DSLs.
* R promueve la investigación reproducible.
* R está actualizado gracias a que tiene una activa comunidad. Solo en CRAN hay
cerca de $10,000$ paquetes (funcionalidad adicional de R creadas creada por la
comunidad).
* R se puede combinar con otras herramientas.
* R tiene capacidades gráficas muy sofisticadas.
* R es popular ([Revolutions blog](http://blog.revolutionanalytics.com/popularity/)).
## R: primeros pasos
Para comenzar se debe descargar [R](https://cran.r-project.org), esta descarga
incluye R básico y un editor de textos para escribir código. Después de
descargar R se recomienda descargar
[RStudio](https://www.rstudio.com/products/rstudio/download/) (gratis y libre).
Rstudio es un ambiente de desarrollo integrado para R: incluye una consola,
un editor de texto y un conjunto de herramientas para administrar el espacio de
trabajo cuando se utiliza R.
Algunos _shortcuts_ útiles en RStudio son:
**En el editor**
* command/ctrl + enter: enviar código a la consola
* ctrl + 2: mover el cursor a la consola
**En la consola**
* flecha hacia arriba: recuperar comandos pasados
* ctrl + flecha hacia arriba: búsqueda en los comandos
* ctrl + 1: mover el cursor al editor
### R en análisis de datos {-}
El estándar científico para contestar preguntas o tomar decisiones es uno que
se basa en el análisis de datos. Aquí consideramos técnicas cuantitativas:
recolectar, organizar, entender, interpretar y extraer información de
colecciones de datos predominantemente numéricos. Todas estas tareas son partes
del análisis de datos, cuyo proceso podría resumirse con el siguiente diagrama:
![](imagenes/analisis.png)
Es importante la forma en que nos movemos dentro de estos procesos en el
análisis de datos y en este curso buscamos dar herramientas para facilitar
cumplir los siguientes principios:
1. **Reproducibilidad**. Debe ser posible reproducir el análisis en todos sus
pasos, en cualquier momento.
2. **Claridad**. Los pasos del análisis deben estar documentados apropiadamente,
de manera que las decisiones importantes puedan ser entendidas y explicadas
claramente.
Dedicaremos las primeras sesiones a aprender herramientas básicas para poder
movernos agilmente a lo largo de las etapas de análisis utilizando R y nos
enfocaremos en los paquetes que forman parte del
[tidyverse](http://tidyverse.org/).
### Paquetes y el Tidyverse {-}
La mejor manera de usar R para análisis de datos es aprovechando la gran
cantidad de paquetes que aportan funcionalidad adicional. Desde
Rstudio podemos instalar paquetes (Tools - > Install packages o usar la
función `install.packages("nombre_paquete")`). Una vez instalados, podemos
cargarlos a nuestra sesión de R mediante `library`. Por ejemplo, para cargar el
paquete `readr` hacemos:
```{r paquetes, message=FALSE}
# print(read_csv)
# Error in print(read_csv) : object 'read_csv' not found
library(tidyverse)
print(read_csv)
```
`read_csv` es una función que aporta el paquete `readr`, que a su vez está incluido en el
*tidyverse*.
Los paquetes se instalan una sola vez, sin embargo, se deben cargar
(ejecutar `library(tidyverse)`) en cada sesión de R que los ocupemos.
En estas notas utilizaremos la colección de paquetes incluídos en el
[tidyverse](https://www.tidyverse.org/). Estos paquetes de R están
diseñados para ciencia de datos, y para funcionar juntos como parte de un flujo
de trabajo.
La siguiente imagen tomada de [Why the tidyverse](https://rviews.rstudio.com/2017/06/08/what-is-the-tidyverse/) (Joseph
Rickert) indica que paquetes del tidyverse se utilizan para cada
etapa del análisis de datos.
```{r, out.width = "700px"}
knitr::include_graphics("imagenes/tidyverse.png")
```
### Recursos {-}
Existen muchos recursos gratuitos para aprender R, y resolver nuestras dudas,
enlistamos algunos.
* Buscar ayuda: Google, [StackOverflow](http://stackoverflow.com/questions/tagged/r).
* Para aprender más sobre un paquete o una función pueden visitar [Rdocumentation.org](http://www.rdocumentation.org/).
* La referencia principal de estas notas es el libro [R for Data Science](http://r4ds.had.co.nz/)
de Hadley Wickham.
* Para aprender los comandos básicos de R [*Try R*](http://tryr.codeschool.com/)
y [Datacamp](https://www.datacamp.com/) cuentan con excelentes cursos
interactivos.
* Para aprender programación avanzada en R, el libro gratuito
[Advanced R](http://adv-r.had.co.nz) de Hadley Wickham es una buena referencia.
En particular es conveniente leer la [guía de estilo](http://adv-r.had.co.nz/Style.html) (para todos: principiantes, intermedios y avanzados).
* Para mantenerse al tanto de las noticias de la comunidad de R pueden visitar
[R-bloggers](http://www.r-bloggers.com).
* Más del tidyverse: [Why the tidyverse](https://rviews.rstudio.com/2017/06/08/what-is-the-tidyverse/)
* Para aprovechar la funcionalidad de [RStudio](https://github.com/rstudio/cheatsheets/raw/master/rstudio-ide.pdf).
## Visualización con ggplot2
Utilizaremos el paquete `ggplot2`, fue desarrollado por Hadley Wickham y es
una implementación de la gramática de las gráficas [@wilkinson2005].
#### Gráficas de dispersión {-}
```{r}
library(ggplot2) # Cargamos el paquete en nuestra sesión
```
Usaremos el conjunto de datos *mpg* que se incluye en R, puedes encontrar
información de esta base de datos tecleando `?mpg`.
```{r}
data(mpg)
?mpg
glimpse(mpg)
```
Comencemos con nuestra primera gráfica:
```{r, fig.width = 5, fig.height = 4}
ggplot(data = mpg) +
geom_point(mapping = aes(x = displ, y = hwy))
```
En `ggplot2` se inicia una gráfica con la instrucción `ggplot()`, debemos
especificar explicitamente que base de datos usamos, este es el primer argumento
en la función `ggplot()`. Una vez que creamos la base añadimos
*capas*, y dentro de *aes()* escribimos las variables que queremos
graficar y el atributo de la gráfica al que queremos mapearlas.
La función `geom_point()` añade una capa de puntos, hay muchas funciones
*geometrías* incluídas en `ggplot2`: `geom_line()`, `geom_boxplot()`,
`geom_histogram`,... Cada una acepta distintos argumentos para mapear las
variables en los datos a características estéticas de la gráfica. En el ejemplo
de arriba mapeamos `displ` al eje x, `hwy` al eje y, pero `geom_point()` nos
permite representar más variables usando la forma, color y/o tamaño del punto.
Esta flexibilidad nos permite entender o descubrir patrones más interesantes en
los datos.
```{r, fig.width = 5.5, fig.height = 4}
ggplot(mpg) +
geom_point(aes(x = displ, y = hwy, color = class))
```
![](imagenes/manicule2.jpg) Experimenta con los _aesthetics_ color (color),
tamaño (size) y forma (shape).
¿Qué diferencia hay entre las variables categóricas y las continuas?
¿Qué ocurre cuando combinas varios _aesthetics_?
El mapeo de las propiedades estéticas se denomina escalamiento y depende del
tipo de variable, las variables discretas (por ejemplo, genero, escolaridad,
país) se mapean a distintas escalas que las variables continuas (variables
numéricas como edad, estatura, etc.), los *defaults* para algunos atributos son
(los escalamientos se pueden modificar):
aes |Discreta |Continua
----------|--------------|---------
Color (`color`)|Arcoiris de colores |Gradiente de colores
Tamaño (`size`) |Escala discreta de tamaños |Mapeo lineal entre el área y el valor
Forma (`shape`) |Distintas formas |No aplica
Transparencia (`alpha`) | No aplica | Mapeo lineal a la transparencia
Los *_geoms_* controlan el tipo de gráfica
```{r, fig.width = 5, fig.height = 4}
p <- ggplot(mpg, aes(x = displ, y = hwy))
p + geom_line() # en este caso no es una buena gráfica
```
¿Qué problema tiene la siguiente gráfica?
```{r, fig.width = 5, fig.height = 4}
p <- ggplot(mpg, aes(x = cty, y = hwy))
p + geom_point()
p + geom_jitter()
```
![](imagenes/manicule2.jpg) ¿Cómo podemos mejorar la siguiente gráfica?
```{r, fig.width = 5, fig.height = 4}
ggplot(mpg, aes(x = class, y = hwy)) +
geom_point()
```
Intentemos reodenar los niveles de la variable clase
```{r, fig.width = 5, fig.height = 4}
ggplot(mpg, aes(x = reorder(class, hwy), y = hwy)) +
geom_point()
```
Podemos probar otros geoms.
```{r, fig.width = 5, fig.height = 4}
ggplot(mpg, aes(x = reorder(class, hwy), y = hwy)) +
geom_jitter()
ggplot(mpg, aes(x = reorder(class, hwy), y = hwy)) +
geom_boxplot()
```
También podemos usar más de un geom!
```{r, fig.width = 5, fig.height = 3.5}
ggplot(mpg, aes(x = reorder(class, hwy), y = hwy)) +
geom_jitter() +
geom_boxplot()
```
![](imagenes/manicule2.jpg) Lee la ayuda de _reorder_ y repite las gráficas
anteriores ordenando por la mediana de _hwy_.
¿Cómo harías
para graficar los puntos encima de las cajas de boxplot?
#### Paneles {-}
Veamos ahora como hacer páneles de gráficas, la idea es hacer varios múltiplos
de una gráfica donde cada múltiplo representa un subconjunto de los datos, es
una práctica muy útil para explorar relaciones condicionales.
En ggplot podemos usar _facet\_wrap()_ para hacer paneles dividiendo los datos
de acuerdo a las categorías de una sola variable
```{r, fig.width = 5, fig.height = 5}
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_jitter() +
facet_wrap(~ cyl)
```
También podemos hacer una cuadrícula de $2$ dimensiones usando
_facet\_grid(filas~columnas)_
```{r, fig.width = 8, fig.height = 2.5}
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_jitter() +
facet_grid(.~ class)
```
```{r, fig.width = 7, fig.height = 5}
ggplot(mpg, aes(x = displ, y = hwy)) +
geom_jitter() +
facet_grid(drv ~ class)
```
Los páneles pueden ser muy útiles para entender relaciones en nuestros datos. En
la siguiente gráfica es difícil entender si existe una relación entre radiación
solar y ozono.
```{r, fig.width = 4, fig.height = 3}
data(airquality)
ggplot(airquality, aes(x = Solar.R, y = Ozone)) +
geom_point()
```
Veamos que ocurre si realizamos páneles separando por velocidad del viento.
```{r, fig.width = 7, fig.height = 3, message = FALSE, warning = FALSE}
library(Hmisc)
airquality$Wind.cat <- cut2(airquality$Wind, g = 3)
ggplot(airquality, aes(x = Solar.R, y = Ozone)) +
geom_point() +
facet_wrap(~ Wind.cat)
```
Podemos agregar un suavizador (loess) para ver mejor la relación de las
variables en cada panel.
```{r, fig.width = 7, fig.height = 3, warning = FALSE}
ggplot(airquality, aes(x = Solar.R, y = Ozone)) +
geom_point() +
facet_wrap(~ Wind.cat) +
geom_smooth(method = "lm")
```
![](imagenes/manicule2.jpg) Escribe algunas preguntas que puedan contestar con
estos datos.
En ocasiones es necesario realizar transformaciones u obtener subconjuntos de
los datos para poder responder preguntas de nuestro interés.
```{r}
library(dplyr)
library(babynames)
glimpse(babynames)
```
Supongamos que queremos ver la tendencia del nombre "John", para ello debemos
generar un subconjunto de la base de datos. ¿Qué ocurre en la siguiente gráfica?
```{r, fig.width = 5, fig.height = 3}
babynames_John <- filter(babynames, name == "John")
ggplot(babynames_John, aes(x = year, y = prop)) +
geom_point()
```
```{r, fig.width = 5, fig.height = 3.7}
ggplot(babynames_John, aes(x = year, y = prop, color = sex)) +
geom_line()
```
La preparación de los datos es un aspecto muy importante del análisis y suele
ser la fase que lleva más tiempo. Es por ello que el siguiente tema se enfocará
en herramientas para hacer transformaciones de manera eficiente.
![](imagenes/manicule.jpg) Tarea. Explora la base de datos gapminder, estos
datos están incluidos en el paquete del mismo nombre, para acceder a ellos basta
con cargar el paquete:
```{r}
# install.packages("gapminder")
library(gapminder)
gapminder
```
realiza al
menos $3$ gráficas y explica las relaciones que encuentres. Debes usar lo que
revisamos en estas notas: al menos una de las gráficas debe ser de páneles,
realiza una gráfica con datos de México, y (opcional)si lo consideras
interesante, puedes crear una variable categórica utilizando la función `cut2`
del paquete Hmisc.
### Recursos {-}
* El libro *R for Data Science* [@r4ds] tiene un capítulo de visualización.
* Google, [stackoverflow](https://stackoverflow.com/questions/tagged/ggplot2)
tiene un *tag* para ggplot2.
* Documentación con ejemplos en la página de
[ggplot2](http://ggplot2.tidyverse.org/).
* Otro recurso muy útil es el
[acordeón de ggplot](https://github.com/rstudio/cheatsheets/raw/master/data-visualization-2.1.pdf).
* La teoría detrás de ggplot2 se explica en el libro de ggplot2 [@wickham2009],
```{r, echo=FALSE, message=FALSE, eval=FALSE}
library(kableExtra)
cancer <- read_csv("data/cancer_73-98.csv", progress = F)
cancer %>%
mutate_at(vars(c("year_5_se", "year_10_se", "year_15_se", "year_20_se")), function(x) {
cell_spec(x, font_size = spec_font_size(1, begin = 4))
}) %>%
kable(escape = FALSE, "html",
align = c("l", "r", "l", "r", "l", "r", "l", "r", "l"),
col.names = c("", "5 year", "", "10 year", "", "15 year", "", "20 year", ""),
padding = 0, booktabs=T) %>%
row_spec(0, align = "r") %>%
# add_header_above(c(" " = 1, "5 years" = 2, "10 years" = 2, "15 years" = 2, "20 years" = 2)) %>%
column_spec(c(3, 5, 7, 9), color = "#999999") %>%
#collapse_rows() %>%
footnote("Rates derived from SEER 1973-98 databes (both sexes, all ethnic groups).",
general_title = "") %>%
kable_styling(font_size = 11, full_width = F, bootstrap_options = "condensed")
```