forked from joanby/r-basic
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathTema8.Rmd
592 lines (385 loc) · 23.9 KB
/
Tema8.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
---
title: Tema 8 - Estadística descriptiva con datos cuantitativos
author: Juan Gabriel Gomila & María Santos
output:
ioslides_presentation:
widescreen: true
css: JB_style.css
logo: Imgs/LogoCurso.png
fig_height: 4
fig_width: 8
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE, comment = NA)
```
# Descripción de datos cuantitativos
## Datos cuantitativos
Los <l class = "definition">datos cuantitativos</l> son los que expresan cantidades que se representan mediante números. Éstos se suelen clasificar en continuos y discretos.
- Los <l class = "definition">datos continuos</l> son los que, si existiese la posibilidad de medirlos con precisión infinita, en principio podrían tomar todos los valores de un intervalo de la recta real. A modo de ejemplo, el peso, la altura, el tiempo... son datos de este tipo.
- Por su parte, los <l class = "definition">datos discretos</l> son los que pueden tomar un solo conjunto contable de valores. El número de colores de un gato, el número de individuos que conforman una población son algunos ejemplos de este tipo de datos.
Conviene tener en cuenta que esta división es solo teórica. Es decir, en la práctica, todos estos datos son discretos puesto que la precisión infinita no existe. Sin embargo, es necesario de vez en cuando suponer los datos de tipo continuo para así poder utilizar técnicas específicas en su análisis.
## Datos cuantitativos
A la hora de estudiar <l class = "definition">variables cuantitativas</l>, podemos utilizar las frecuencias que hemos visto hasta el momento: absoluta, relativa, acumulada y relativa acumulada. Esto se debe a que podemos ordenar los datos cuantitativos en el orden natural de los números reales.
En este caso, disponemos de muchas otras técnicas descriptivas aparte de las frecuencias, puesto que estamos trabajando con números reales y podemos operar con ellos.
Los datos cuantitativos admiten dos tipos de tratamiento según trabajemos con los <l class = "definition">raw data</l> (datos brutos u originales) o bien los agrupemos en clases o intervalos.
En esta lección trabajaremos sobre la primera situación. En la siguiente, estudiaremos la descripción de datos cuantitativos agrupados.
# Frecuencias
## Frecuencias de datos cuantitativos
El tratamiento de las frecuencias de datos cuantitativos es similar al de los datos ordinales. La cosa cambia ligeramente debido a que no se tienen en cuenta todos los niveles posibles, sino únicamente los observados.
## Ejemplo 1
<div class= "example">
**Ejemplo 1**
Se han pedido las edades a 20 clientes de un museo. Las respuestas obtenidas han sido las siguientes:
</div>
```{r}
edad = c(15,18,25,40,30,29,56,40,13,27,42,23,11,26,25,32,30,40,33,29)
```
<div class= "example">
Recordemos que solamente nos interesan las frecuencias de las edades observadas. Es decir, solamente nos interesan
</div>
```{r}
table(edad)
```
## Ejemplo 1
<div class = example>
Calculemos el resto de frecuencias como ya sabemos
</div>
```{r}
round(prop.table(table(edad)),3)
cumsum(table(edad))
```
## Ejemplo 1
```{r}
round(cumsum(prop.table(table(edad))),3)
```
## Frecuencias de datos cuantitativos
En general, supongamos que tenemos $n$ observaciones de una propiedad que se mide con un número real y obtenemos la variable cuantitativa formada por los datos
$$x_1,\dots, x_n$$
Sean ahora $X_1,\dots,X_k$ los valores distintos que aparecen en esta lista de datos y considerémoslos ordenados
$$X_1<X_2<\cdots<X_k$$
## Frecuencias de datos cuantitativos
Entonces, en esta variable cuantitativa
- La frecuencia absoluta de $X_i$ es el número $n_i$ de elementos que son iguales a $X_i$
- La frecuencia relativa de $X_i$ es $f_i=\frac{n_i}{n}$
- La frecuencia absoluta acumulada de $X_i$ es $N_i=\sum_{j=1}^in_j$
- La frecuencia relativa acumulada de $X_i$ es $F_i=\frac{N_i}{n}$
## Ejemplo 2
<div class = "example">
**Ejemplo 2**
Lanzamos 25 veces un dado de 6 caras y anotamos las puntuaciones obtenidas en cada tirada.
En este caso, $n=25$ y, los distintos valores observados son
$$X_1 = 1,\ X_2 = 2,\ X_3 = 3,\ X_4 = 4,\ X_5 = 5,\ X_6 = 6$$
Nos interesa ahora calcular las frecuencias de este experimento. Además, las organizaremos en un data frame para observarlas de forma más clara y sencilla en una tabla.
</div>
```{r}
set.seed(162017)
dados = sample(1:6,25,replace = TRUE)
dados
set.seed(NULL)
```
## Ejemplo 2
```{r}
table(dados)
round(prop.table(table(dados)),2)
cumsum(table(dados))
```
## Ejemplo 2
```{r}
round(cumsum(prop.table(table(dados))),2)
dados.df = data.frame(Puntuacion = 1:6,
Fr.abs = as.vector(table(dados)),
Fr.rel = as.vector(round(prop.table(table(dados)),2)),
Fr.acu = as.vector(cumsum(table(dados))),
Fr.racu = as.vector(round(cumsum(prop.table(table(dados))),2)))
```
## Ejemplo 2
```{r}
dados.df
```
<l class="important">¡OJO!</l> Para entrar una tabla unidimensional como una variable en un data frame, es conveniente transformarla en vector con `as.vector`. Si no, cada `table` y cada `prop.table` añadirían una columna extra con los nombres de los niveles.
# Medidas de tendencia central
## Medidas de tendencia central
Las <l class="definition">medidas de tendencia central</l> son las que dan un valor representativo a todas las observaciones. Algunas de las más importantes son:
- La <l class="definition">media aritmética</l> o <l class="definition">valor medio</l>
$$\bar{x} = \frac{\sum_{i=1}^nx_i}{n}=\frac{\sum_{j=1}^kn_jX_j}{n}=\sum_{j=1}^kf_jX_j$$
- La <l class="definition">mediana</l>, que representa el valor central en la lista ordenada de observaciones.
- La <l class="definition">moda</l> es el valor (o valores) de máxima frecuencia (absoluta o relativa, el resultado será el mismo).
## La mediana
La definición formal de la mediana es la siguiente. Denotando por $$x_{(1)}\le x_{(2)}\le\dots\le x_{(n)}$$ los datos de la variable cuantitativa ordenados de menor a mayor, la mediana es
- Si $n$ par, la medio de los dos datos centrales $$\frac{x_{(\frac{n}{2})}+x_{(\frac{n}{2}+1)}}{2}$$
- Si $n$ impar, el dato central $x_{(\frac{n+1}{2})}$
## Ejemplo 1
<div class = "example">
Recordemos el ejemplo de las edades.
</div>
```{r}
sort(edad) #Ordenamos los datos por su orden natural
table(edad)
```
<div class = "example">
En este caso, la moda es 40, la mediana es $\frac{29+29}{2}=29$ y la media aritmética es
<div class = "aligncenter">
$\frac{11+13+15+18+23+25+25+26+27+29+29+30+30+32+33+40+40+40+42+56}{20}=29.2$
</div>
</div>
## Ejemplo 2
<div class = "example">
Recordemos el ejemplo de los dados.
</div>
```{r}
dados.df
```
<div class = "example">
En este caso, la moda son dos valores: el 2 y el 3. La mediana es $x_{(13)}=$ 3 y la media aritmética es `r sum(dados)/length(dados)`
</div>
## Medidas de tendencia central en R
Vamos a calcular la media aritmética, mediana y moda de los dos ejemplos anteriores con instrucciones de R.
```{r}
mean(edad) #La media aritmética
mean(dados)
median(edad) #La mediana
```
## Medidas de tendencia central en R
```{r}
median(dados)
as.numeric(names(which(table(edad)==max(table(edad))))) #La moda
as.numeric(names(which(table(dados)==max(table(dados)))))
```
Cuando trabajamos con datos cuantitativos, es conveniente que el resultado lo demos como un número. De ahí que hayamos aplicado la función `as.numeric`.
# Medidas de posición
## Medidas de posición
Las <l class = "definition">medidas de posición</l> estiman qué valores dividen las observaciones en unas determinadas proporciones.
Los valores que determinan estas posiciones son conocidos como los <l class = "definition">cuantiles</l>.
Pensándolo de este modo, la mediana puede interpretarse como una medida de posición, debido a que divide la variable cuantitativa en dos mitades.
## Medidas de posición
Dada una proporción $p\in(0,1)$, el <l class = "definition">cuantil de orden $p$</l> de una variable cuantitativa, $Q_p$, es el valor más pequeño tal que su frecuencia relativa acumulada es mayor o igual a $p$.
Dicho de otro modo, si tenemos un conjunto de observaciones $x_1,\dots,x_n$ y los ordenamos de menor a mayor, entonces $Q_p$ será el número más pequeño que deja a su izquierda (incluyéndose a sí mismo) como mínimo a la fracción $p$ de los datos. Es decir, $p\cdot n$.
Así, ahora es más claro ver que la mediana vendría a ser $Q_{0.5}$, el cuantil de orden 0.5.
## Ejemplo 3
<div class = "example">
**Ejemplo 3**
Consideremos un experimento en el que lanzamos 50 veces un dado de 4 caras y obtenemos los siguientes resultados
</div>
```{r}
set.seed(260798)
dado = sample(1:4, 50, replace = TRUE)
set.seed(NULL)
length(dado)
dado = sort(dado) #Los ordenamos de menor a mayor
dado
```
## Ejemplo 3
```{r}
df.dado = data.frame(Puntuacion = 1:4,
Fr.abs = as.vector(table(dado)),
Fr.rel = as.vector(round(prop.table(table(dado)),2)),
Fr.acu = as.vector(cumsum(table(dado))),
Fr.racu = as.vector(round(cumsum(prop.table(table(dado))),2)))
df.dado
```
<div class = "example">
Si nos piden el cuantil $Q_{0.3}$, sabemos que este es el primer elemento de la lista cuya frecuencia relativa acumulada es mayor o igual a 0.3. Este se corresponde con la puntuación 1.
</div>
## Ejemplo 3
<div class = "example">
También podríamos hallarlo de otro modo: fijándonos en la lista ordenada de puntuaciones, el cuantil $Q_{0.3}$ sería el primer elemento de dicha lista tal que fuera mayor o igual que, como mínimo, el 30% de los datos. Si calculamos el 30% de 50, obtenemos que es 15. Esto lo que nos dice es que el cuantil que buscamos es el número que se encuentrae en la quinceava posición de la lista ordenada.
</div>
```{r}
dado[15]
```
## Cuantiles
Algunos cuantiles tienen nombre propio:
- Los <l class="definition">cuartiles</l> son los cuantiles $Q_{0.25},Q_{0.5}$ y $Q_{0.75}$. Respectivamente, son llamados primer, segundo y tercer cuartil. El primer cuartil, $Q_{0.25}$, será el menor valor que es mayor o igual a una cuarta parte de las observaciones y $Q_{0.75}$, el menor valor que es mayor o igual a tres cuartas partes de los datos observados.
- El cuantil $Q_{0.5}$ es la mediana
- Los <l class="definition">deciles</l> son los cuantiles $Q_p$ con $p$ un múltiplo de 0.1.
- Los <l class="definition">percentiles</l> son son los cuantiles $Q_p$ con $p$ un múltiplo de 0.01.
## Cuantiles
La definición de cuantil anteriormente dada es orientativa. La realidad es que, exceptuando el caso de la mediana, no hay consenso sobre cómo deben calcularse los cuantiles. En verdad, existen diferentes métodos que pueden dar lugar a soluciones distintas.
Al fin y al cabo, nuestro objetivo no es el de encontrar el primer valor de una muestra cuya frecuencia relativa acumulada en la variable sea mayor o igual a $p$, sino estimar el valor de esta cantidad para el total de la población.
Para calcular los cuantiles de orden $p$ de una variable cualitativa $x$ con R, se utiliza la instrucción `quantile(x,p)`, la cual dispone de 9 métodos diferentes que se especifican con el parámetro `type`. El valor por defecto es `type = 7` y no hace falta especificarlo, como veremos en el siguiente ejemplo. Para más información sobre todos los valores posibles de este parámetro, haced click en el enlace a [Wikipedia](https://es.wikipedia.org/wiki/Cuantil)
## Ejemplo 4
```{r}
set.seed(0)
dados2 = sample(1:6,15, replace = TRUE)
dados2
set.seed(NULL)
quantile(dados2,0.25) #Primer cuartil
quantile(dados2,0.8)
```
# Medidas de dispersión
## Medidas de dispersión
Las <l class = "definition">medidas de dispersión</l> evalúan lo dispersos que están los datos. Algunas de las más importantes son:
- El <l class = "definition">rango</l> o <l class = "definition">recorrido</l>, que es la diferencia entre el máximo y el mínimo de las observaciones.
- El <l class = "definition">rango intercuartílico</l>, que es la diferencia entre el tercer y primer cuartil, $Q_{0.75}-Q_{0.25}$.
- La <l class = "definition">varianza</l>, a la que denotaremos por $s^2$, es la media aritmética de las diferencias al cuadrado entre los datos $x_i$ y la media aritmética de las observaciones, $\bar{x}$. $$s^2 = \frac{\sum_{j=1}^n(x_j-\bar{x})^2}{n}=\frac{\sum_{j=1}^kn_j(X_j-\bar{x})^2}{n}=\sum_{j=1}^kf_j(X_j-\bar{x})^2$$.
## Medidas de dispersión
- La <l class = "definition">desviación típica</l> es la raíz cuadrada positiva de la varianza, $s=\sqrt{s^2}$.
- La <l class = "definition">varianza muestral</l> es la corrección de la varianza. La denotamos por $\tilde{s}^2$ y se corresponde con
$$\tilde{s}^2 = \frac{n}{n-1}s^2 = \frac{\sum_{j=1}^n(x_i-\bar{x})^2}{n-1}$$
- La <l class = "definition">desviación típica muestral</l>, que es la raíz cuadrada positiva de la varianza muestral, $\tilde{s} = \sqrt{\tilde{s}^2}$
## Propiedades de la varianza
<l class = "prop"> Propiedades de la varianza.</l>
- $s^2\ge 0$. Esto se debe a que, por definición, es una suma de cuadrados de números reales.
- $s^2 = 0\Longrightarrow x_j-\bar{x}=0\ \forall j= 1,\dots,n$. En consecuencia, si $s^2=0$, entonces todos los datos son iguales.
- $s^2 =\frac{\sum_{j=1}^nx_j^2}{n}-\bar{x}^2$. Es decir, la varianza es la media de los cuadrados de los datos menos el cuadrado de la media aritmética de estos.
## Varianza y varianza muestral
La diferencia entre ambas definiciones viene por la interrelación entre la estadística descriptiva y la inferencial.
Por un lado, es normal medir cómo varían los datos cuantitativos mediante su varianza definida como la media aritmética de las distancias al cuadrado de los datos a su valor medio. No obstante, por otro lado, el conjunto de nuestras observaciones, por lo normal, será una muestra de una población mucho mayor y nos interesará estimar entre otras muchas cosas su variabilidad.
La varianza de una muestra suele dar valores más pequños que la varianza de la población, mientras que la varianza muestral tiende a dar valores alrededor de la varianza de la población.
## Varianza y varianza muestral
Esta corrección, para el caso de una muestra grande no es notable. Dividir $n$ entre $n-1$ en el caso de $n$ ser grande no significa una gran diferencia y aún menos si tenemos en cuenta que lo que tratamos es de estimar la varianza de la población, no de calcularla de forma exacta.
En cambio, si la muestra es relativamente pequeña (digamos $n<30$), entonces la varianza muestral de la muestra aproxima significativamente mejor la varianza de la población que la varianza.
La diferencia entre desviación típica y desviación típica muestral es análoga.
Con `R`, calcularemos la varianza y la desviación típica **muestrales**. Con lo cual, si queremos calcular las que no son muestrales, tendremos que multiplicarlas por $\frac{n-1}{n}$, donde $n$ es el tamaño de la muestra. Lo veremos a continuación.
## Varianza y desviación típica
Nótese que tanto la varianza como la desviación típica dan una información equivalente. Entonces, es comprensible preguntarse por qué se definen ambas medidas si con una basta. Pues bien, las unidades de la varianza (metros, litros, años...), ya sea muestral o no, están al cuadrado, mientras que las de la desviación típica no.
## Medidas de dispersión con R
Medida de dispersión | Instrucción
--------------------|--------------------
Valores mínimo y máximo | `range(x)`
Rango | `diff(range(x))`
Rango intercuartílico | `IQR(x, type = ...)`
Varianza muestral | `var(x)`
Desviación típica muestral | `sd(x)`
Varianza | `var(x)*(length(x)-1)/length(x)`
Desviación típica | `sd(x)*sqrt((length(x)-1)/length(x))`
## Ejemplo 4
```{r}
dados2
diff(range(dados2))
IQR(dados2)
var(dados2)
```
## Ejemplo 4
```{r}
sd(dados2)
n = length(dados2)
var(dados2)*(n-1)/n
sd(dados2)*sqrt((n-1)/n)
```
## Función summary()
La función `summary` aplicada a un vector numérico o a una variable cuantitativa nos devuelve un resumen estadístico con los valores mínimo y máximo del vector, sus tres cuartiles y su media.
Al aplicar esta función a un data frame, esta se aplica a todas sus variables de forma simultánea. De este modo, podemos observar rápidamente si hay diferencias notables entre sus variables numéricas.
## Ejemplo 5
```{r}
cangrejos = read.table("../data/datacrab.txt", header = TRUE) #Cargamos el data frame
cangrejos = cangrejos[-1] #Eliminamos la primera columna
summary(cangrejos) #Aplicamos la función summary
```
## Ejemplo 5
<div class = "example">
Si nos interesase comparar numéricamente los pesos y las anchuras de los cangrejos con 3 colores con los que tienen 5 colores, utilizaríamos las siguientes instrucciones:
</div>
```{r}
summary(subset(cangrejos, color == 3,c("weight","width")))
```
## Ejemplo 5
```{r}
summary(subset(cangrejos, color == 5,c("weight","width")))
```
<div class = "example">
Y deducimos así que los cangrejos con 5 colores pesan ligeramente menos y tienen menos anchura que los que tienen 3 colores.
</div>
## La función by()
La función `by()` se utiliza para aplicar una determinada función a algunas columnas de un data frame segmentándolas según los niveles de un factor.
La sintaxis de esta función es `by(columnas, factor, FUN = función)`.
Con lo cual, haciendo uso de la función `by` y especificando `FUN = summary`, podremos calcular el resumen estadístico anteriormente comentado a subpoblaciones definidas por los niveles de un factor.
## Ejemplo 6
<div class = "example">
**Ejemplo 6**
Para este ejemplo, haremos uso del famoso dataset iris.
Si nos interesase calcular de forma rápida y sencilla las longitudes de sépalos y petalos en función de la especie, necesitaríamos hacer uso de la instrucción mostrada a continuación.
Por motivos de espacio, no se muestran los resultados proporcionados por R.
</div>
```{r, results="hide"}
by(iris[,c(1,3)], iris$Species, FUN = summary)
```
## Función aggregate()
Tanto la función `by` como la función `aggregate` son equivalentes. No obstante, los resultados se muestran de forma diferente en función de cual utilicemos.
En el caso del ejemplo anterior, convenía más hacer uso de la función `by`.
Podéis comprobarlo introduciendo por consola la siguiente instrucción:
```{r, results="hide"}
aggregate(cbind(Sepal.Length,Petal.Length)~Species, data=iris, FUN=summary)
```
## NA
La mayoría de las funciones vistas a lo largo de este tema no funcionan bien con valores `NA`.
Para no tenerlos en cuenta a la hora de aplicar estas funciones, hay que especificar el parámetro `na.rm = TRUE` en el argumento de la función.
## Ejemplo 7
```{r}
dadosNA = c(dados2,NA)
dadosNA
mean(dadosNA)
mean(dadosNA, na.rm = TRUE)
```
# Diagramas de caja
## Diagramas de caja
El conocido <l class = "definition">diagrama de caja</l> o <l class = "definition">box plot</l> es un tipo de gráfico que básicamente, remarca 5 valores estadísticos:
- La mediana, representada por la línea gruesa que divide la caja
- El primer y tercer cuartil, que son los lados inferior y superior, respectivamente. De este modo, la altura de la caja es el rango intercuantílico
- Los extremos, los valores $b_{inf},b_{sup}$, son los <l class = "definition">bigotes</l> (<l class = "definition">whiskers</l>) del gráfico. Si $m$ y $M$ son el mínimo y máximo de la variable cuantitativa, entonces los extremos se calculan del siguiente modo:
$$b_{inf}=\max\{m,Q_{0.25}-1.5(Q_{0.75}-Q_{0.25})\}$$
$$b_{sup}=\min\{M,Q_{0.75}+1.5(Q_{0.75}-Q_{0.25})\}$$
- <l class = "definition">Valores atípicos</l> o <l class = "definition">outliers</l>, que son los que están más allá de los bigotes. Se marcan como puntos aislados.
## Más sobre los bigotes
Por su definición, concluimos que los bigotes marcan el mínimo y máximo de la variable cuantitativa, a no ser que haya datos muy alejados de la caja intercuantílica.
En tal caso, el bigote inferior marca el valor 1.5 veces el rango intercuantílico por debajo de $Q_{0.25}$, mientras que el superior marca el valor 1.5 veces el rango intercuantílico por encima de $Q_{0.75}$
## La función boxplot
La instrucción `boxplot()` dibuja diagramas de caja en R.
```{r}
boxplot(dados2, main = "Un diagrama de caja")
```
## La función boxplot
También podemos dibujar diversos diagramas de caja en un mismo gráfico. De este modo, se pueden comparar con mayor facilidad:
```{r}
boxplot(dado,dados,dados2)
```
## La función boxplot
Además, podemos dibujar el diagrama de caja de todas las variables de un data frame en un solo paso aplicando la instrucción `boxplot(data.frame)`.
La mayoría de veces, dicho gráfico no será del todo satisfactorio. Dibujar diagramas de factores no tiene sentido alguno. Estos gráficos se pueden manipular incluyendo solo las variables de interés, cambiando los nombres...
Veamos un ejemplo:
## Ejemplo 8
```{r, fig.width=10, fig.height=5}
body = read.table("../data/bodyfat.txt", header = TRUE)
boxplot(body)
```
## Ejemplo 8
```{r}
boxplot(body[,7:9], names = c("Pecho", "Abdomen", "Cadera"))
```
## La función boxplot
Agrupar varios diagramas de caja en un solo gráfico tiene por objetivo poder compararlos visualmente, lo cual tiene sentido cuando las variables tienen significados parecidos o cuando comparamos una misma variable de poblaciones distintas.
La mayoría de las veces, querremos comparar diagramas de cajas de una misma variable cuantitativa segmentada por los niveles de un factor.
La sintaxis de la instrucción para dibujar en un único gráfico los diagramas de caja de una variable numérica de un data frame en función de los niveles de un factor del mismo data frame es `boxplot(var.numérica~factor, data = data frame)`
## Ejemplo 9
```{r}
boxplot(circumference~Tree, data = Orange, ylab = "Circunferencia del tronco (mm)",
main = "Boxplot de los naranjos en función del tipo de árbol")
```
## Parámetros de la función boxplot
Todos los parámetros de la función `plot()` que tengan sentido pueden ser utilizados en los argumentos de la función `boxplot()`.
Aparte, la función `boxplot()` dispone de algunos parámetros específicos, de los cuales mencionaremos:
- `notch` igualado a `TRUE` añade una muesca en la mediana de la caja. Si se da el caso en que las muescas de dos diagramas de cajas no se solapan, entonces con alto grado de confianza, concluimos que las medianas de las poblaciones correspondientes son diferentes.
## Ejemplo 10
```{r}
boxplot(Sepal.Width~Species, data = iris, ylab = "Anchura del sétalo (cm)",
notch = TRUE, col = c("cyan","cyan2","cyan4"),
main = "Boxplot de iris")
```
## Ejemplo 10
<div class = "example">
Si quisiéramos marcar de alguna forma en un diagrama de caja, cosa que puede ser muy útil en ocasiones, la media aritmética de la variable correspondiente, podríamos hacerlo mediante la función `points`:
</div>
```{r, fig.height=3.5}
boxplot(Sepal.Width~Species, data = iris, ylab = "Anchura del sétalo (cm)")
medias = aggregate(Sepal.Width~Species, data = iris, FUN = mean)
points(medias, col = "pink", pch = 15)
```
## Ejemplo 10
<div class = "example">
La primera instrucción del chunk anterior genera el diagrama de cajas de las anchuras de los sépalos en función de la especie. Por su parte, la segunda instrucción lo que hace es calcular las medias aritméticas de las anchuras según la especie. Finalmente, la tercera instrucción lo que hace es añadir al diagrama un punto cuadrado a cada caja en la ordenada correspondiente a su media aritmética.
</div>
## La estructura interna de boxplot
Como ya sabemos, podemos estudiar la función interna de algunos objetos con la función `str`.
Dicha función aplicada a un boxplot, nos produce una list. Podéis ver esta list si introducís por consola la siguiente instrucción: `str(boxplot(circumference~Tree, data = Orange))` Destacaremos dos de sus componenetes aquí:
- `stats` nos devuelve los valores $b_{inf},\ Q_{0.25},\ Q_{0.5},\ Q_{0.75},\ b_{sup}$
- `out` nos retorna los valores atípicos. En caso de haber diversos diagramas en un plot, la componente `group` nos indica a qué diagramas pertenecen estos ouliers.