Estudiaremos análisis exploratorio de datos univariados, en particular abordaremos los siguientes temas:
Diagramas de tallo y hoja.
Tablas de frecuencias.
Histogramas
Una de las tareas más frecuentes e importantes en el análisis exploratorio es la descripción y visualización de la variación que existe dentro de un conjunto de datos. Esto es, los valores en un conjunto de datos no son todos iguales y queremos entender como varían: que valores aparecen, dónde se acumulan la mayoría de ellos, si hay valores notables o extraños, etc.
Consideramos las siguientes mediciones de ozono en el aire, producidas por la red automática de monitoreo ambiental (SIMA). Las mediciones son concentración de ozono (en ppb o partes por billón) para las estaciones de Tlalnepantla e Iztapalapa, tomadas a las 2 pm, durante 2014. Una exposición de 110 ppb durante una hora se considera aguda.
library(tidyr)
library(dplyr)
# leemos la base de datos
contaminantes <- read.csv("datos/contaminantes_2014.csv", comment.char = "#",
stringsAsFactors = FALSE)
# creamos una variable hora
contaminantes <- mutate(contaminantes,
hora = substring(contaminantes$date, 12, 13))
# filtramos para obtener las estaciones y contaminantes de interés
ozono <- filter(contaminantes, id_parameter == "O3", hora == 14,
id_station %in% c("TLA", "UIZ"))
head(ozono)
date id_station id_parameter value unit hora
1 01/01/2014 14:00 TLA O3 59 1 14
2 01/01/2014 14:00 UIZ O3 81 1 14
3 02/01/2014 14:00 TLA O3 43 1 14
4 02/01/2014 14:00 UIZ O3 53 1 14
5 03/01/2014 14:00 TLA O3 37 1 14
6 03/01/2014 14:00 UIZ O3 56 1 14
Notemos que hay días sin medición por lo que se registró NA.
table(is.na(ozono$value), ozono$id_station)
TLA UIZ
FALSE 343 352
TRUE 22 13
Ahora separamos los datos por estación.
ozono_station <- spread(ozono, id_station, value)
ozono_station <- select(ozono_station, date, TLA, UIZ)
ozono_station$TLA
[1] 59 95 92 131 77 61 9 65 NA 51 36 69 43 81 101 102 48
[18] 50 62 64 74 68 56 52 37 91 90 117 77 49 44 55 17 67
[35] 51 57 55 75 58 77 67 37 28 65 67 57 69 67 78 83 53
[52] 95 75 30 28 87 NA 42 67 NA 60 96 76 70 102 NA 59 72
[69] 59 42 NA 71 29 71 76 72 38 25 51 NA 37 53 73 55 65
[86] 80 60 62 4 56 54 16 32 72 26 50 54 64 39 69 73 89
[103] 86 107 44 71 44 47 30 60 21 74 95 83 53 59 85 65 59
[120] 40 43 74 34 79 130 69 90 53 67 74 48 40 68 65 77 106
[137] 95 123 76 55 73 61 43 46 62 64 88 112 83 86 78 44 58
[154] 78 50 45 54 81 89 114 53 83 NA 69 29 36 63 49 38 55
[171] 102 84 60 74 74 67 31 53 53 65 NA 68 47 75 69 87 24
[188] 92 34 74 91 55 47 56 62 57 69 64 103 85 32 54 73 72
[205] 58 NA 44 90 72 70 38 39 57 14 51 79 71 72 78 75 67
[222] 74 NA 62 69 18 68 63 64 115 110 86 83 69 65 77 54 24
[239] 33 60 48 89 68 55 106 71 55 57 75 16 38 57 61 105 113
[256] 60 81 74 55 63 33 NA 40 28 88 113 75 68 84 38 44 86
[273] 34 NA 77 21 53 87 91 76 75 48 60 93 33 NA 54 6 61
[290] 96 100 59 96 24 84 57 46 NA 55 38 70 74 82 96 63 NA
[307] 91 74 42 NA 50 24 82 61 76 55 86 43 71 61 47 NA 42
[324] 49 73 87 74 NA 84 46 61 65 39 NA 34 63 56 69 87 103
[341] 74 84 72 39 NA 62 69 48 89 120 59 16 80 62 60 NA 75
[358] 63 75 76 57 66 76 NA 60
ozono_station$UIZ
[1] 81 92 121 101 60 59 21 70 86 42 40 60 53 99 97 124 65
[18] 60 81 71 115 35 73 65 56 93 109 121 95 NA 34 62 17 71
[35] 77 68 81 75 68 91 79 45 28 72 37 59 53 84 90 101 NA
[52] 77 92 23 NA 82 83 83 43 123 72 99 80 70 109 24 80 81
[69] 76 74 68 87 44 97 57 57 75 27 31 51 40 69 88 59 87
[86] 87 63 82 17 60 86 23 25 77 57 52 62 NA 34 81 NA 43
[103] 77 106 73 74 44 53 34 83 39 93 125 104 60 63 106 82 69
[120] 52 58 93 42 94 87 89 101 65 98 97 76 60 44 91 81 105
[137] 104 100 72 68 76 96 39 62 67 74 68 127 118 94 89 63 83
[154] 92 62 63 76 104 98 113 62 89 70 85 25 42 72 62 44 59
[171] 125 102 74 79 92 85 40 68 65 76 NA 64 46 76 83 84 52
[188] 43 30 73 79 73 64 71 50 75 110 77 60 49 29 78 67 73
[205] 83 NA NA 88 86 95 25 36 51 10 46 70 90 77 91 88 73
[222] 76 76 59 106 25 88 70 71 130 99 83 102 66 74 91 99 19
[239] 50 61 51 114 87 67 122 100 86 69 91 19 59 51 74 111 106
[256] 100 112 101 74 62 40 46 60 32 101 109 103 75 53 25 54 87
[273] 44 48 76 22 63 97 63 96 107 78 82 103 43 49 38 17 77
[290] 107 100 70 46 28 98 82 62 62 69 31 83 95 52 69 NA 24
[307] 102 84 60 76 61 26 87 94 61 NA 120 52 83 NA 58 103 47
[324] 47 62 85 58 105 90 35 74 84 49 88 NA 76 NA 96 83 119
[341] 91 116 86 38 81 90 69 60 85 117 99 19 99 92 66 80 88
[358] 91 79 88 54 74 104 52 74
Observemos que los valores faltantes no se concentran de manera grave en ninguna época particular del año.
La representación anterior nos permite ver algunos aspectos de los datos; sin embargo, no es una manera especialmente útil o confiable, pues de la tabla es difícil entender que no estamos viendo. Una mejor manera de disponer los números de estas tablas es:
Ordenamos cada conjunto de menor a mayor.
Agrupamos los números según sus centenas y descenas.
Acomodamos los grupos según las categorías obtenidas en el inciso anterior.
Cuando dos mediciones están en el mismo grupo de centenas/decenas, diremos que están en el mismo tallo. Cada una de las mediciones del tallo forman sus hojas. Finalmente, en un diagrama de tallo y hoja acomodamos los tallos en orden en los renglones, y luego agregamos las hojas a cada tallo según el valor de la posición de unidades de la medición.
stem(ozono_station$TLA)
The decimal point is 1 digit(s) to the right of the |
1 | 446666789
2 | 1144445688899
3 | 001223334444667778888889999
4 | 000222233334444445666777788888999
5 | 00001111233333333444444555555555556666777777778889999999
6 | 00000000011111112222222333333444445555555567777777788888899999999999
7 | 00011111122222223333344444444444445555555556666666777777888899
8 | 00111223333344444556666677777889999
9 | 000111122355556666
10 | 01222335667
11 | 0233457
12 | 03
13 | 01
stem(ozono_station$UIZ)
The decimal point is 1 digit(s) to the right of the |
1 | 0777999
2 | 1233445555567889
3 | 011244455678899
4 | 000022233334444456666778999
5 | 0011112222223333446777888999999
6 | 0000000000111222222222233333344555566777888888999999
7 | 0000001111222233333344444444445555666666666667777777889999
8 | 0001111111222223333333333444455556666677777778888888999
9 | 00001111111222223334445556667777888999999
10 | 000011111222333444455666677999
11 | 0123456789
12 | 011234557
13 | 0
En los diagramas de arriba hemos representado los conjuntos completos de datos, esto es, no hemos perdido ninguna información. Adicionalmente, podemos ver cláramente los máximos y mínimos, así como valores comunes, alrededor de qué valores se agrupan los datos.
Algunas de las preguntas que nos ayudan a contestar los diagramas de tallo y hoja son:
¿Alrededor de que valores se concentra el conjunto de datos?
¿Qué tan dispersos están los datos? ¿Qué rango de valores cubren?
¿Qué tan simétrico es el conjunto de datos?
¿Los datos parecen formar subgrupos? ¿Hay huecos donde no se observan mediciones?
Los diagramas de tallo y hojas están limitados pues, por ejemplo, no son tan efectivos con muchos datos.
La técnica de diagramas de tallo y hoja nos permite visualizar y leer (en principio) todos los aspectos de la variación que existe en un conjunto de datos. Sin embargo, a veces nos interesa suavizar los datos para identificar claramente los patrones de variación en escalas específicas. Por ejemplo, muchas veces no nos interesa (debido a que es pequeña) la variación proveniente de errores en los instrumentos de medición. Normalmente estos errores deben ser de magnitudes chicas en relación al tipo de efectos que nos interesa en nuestra investigación. Consideremos las siguientes mediciones del tiempo en minutos que duró cada una de 272 erupciones sucesivas de un géiser (el Old faithful). Los datos están en el paquete datasets que se distribuye con R:
faithful$eruptions
[1] 3.600 1.800 3.333 2.283 4.533 2.883 4.700 3.600 1.950 4.350 1.833
[12] 3.917 4.200 1.750 4.700 2.167 1.750 4.800 1.600 4.250 1.800 1.750
[23] 3.450 3.067 4.533 3.600 1.967 4.083 3.850 4.433 4.300 4.467 3.367
[34] 4.033 3.833 2.017 1.867 4.833 1.833 4.783 4.350 1.883 4.567 1.750
[45] 4.533 3.317 3.833 2.100 4.633 2.000 4.800 4.716 1.833 4.833 1.733
[56] 4.883 3.717 1.667 4.567 4.317 2.233 4.500 1.750 4.800 1.817 4.400
[67] 4.167 4.700 2.067 4.700 4.033 1.967 4.500 4.000 1.983 5.067 2.017
[78] 4.567 3.883 3.600 4.133 4.333 4.100 2.633 4.067 4.933 3.950 4.517
[89] 2.167 4.000 2.200 4.333 1.867 4.817 1.833 4.300 4.667 3.750 1.867
[100] 4.900 2.483 4.367 2.100 4.500 4.050 1.867 4.700 1.783 4.850 3.683
[111] 4.733 2.300 4.900 4.417 1.700 4.633 2.317 4.600 1.817 4.417 2.617
[122] 4.067 4.250 1.967 4.600 3.767 1.917 4.500 2.267 4.650 1.867 4.167
[133] 2.800 4.333 1.833 4.383 1.883 4.933 2.033 3.733 4.233 2.233 4.533
[144] 4.817 4.333 1.983 4.633 2.017 5.100 1.800 5.033 4.000 2.400 4.600
[155] 3.567 4.000 4.500 4.083 1.800 3.967 2.200 4.150 2.000 3.833 3.500
[166] 4.583 2.367 5.000 1.933 4.617 1.917 2.083 4.583 3.333 4.167 4.333
[177] 4.500 2.417 4.000 4.167 1.883 4.583 4.250 3.767 2.033 4.433 4.083
[188] 1.833 4.417 2.183 4.800 1.833 4.800 4.100 3.966 4.233 3.500 4.366
[199] 2.250 4.667 2.100 4.350 4.133 1.867 4.600 1.783 4.367 3.850 1.933
[210] 4.500 2.383 4.700 1.867 3.833 3.417 4.233 2.400 4.800 2.000 4.150
[221] 1.867 4.267 1.750 4.483 4.000 4.117 4.083 4.267 3.917 4.550 4.083
[232] 2.417 4.183 2.217 4.450 1.883 1.850 4.283 3.950 2.333 4.150 2.350
[243] 4.933 2.900 4.583 3.833 2.083 4.367 2.133 4.350 2.200 4.450 3.567
[254] 4.500 4.150 3.817 3.917 4.450 2.000 4.283 4.767 4.533 1.850 4.250
[265] 1.983 2.250 4.750 4.117 2.150 4.417 1.817 4.467
stem(faithful$eruptions, scale = 2)
The decimal point is 1 digit(s) to the left of the |
16 | 07
17 | 0355555588
18 | 0000222333333355777777778888
19 | 22335777888
20 | 000022233788
21 | 00035778
22 | 0002335578
23 | 023578
24 | 00228
25 |
26 | 23
27 |
28 | 08
29 | 0
30 | 7
31 |
32 |
33 | 2337
34 | 25
35 | 0077
36 | 00008
37 | 23577
38 | 233333558
39 | 2225577
40 | 0000003357788888
41 | 002233555577778
42 | 033355557788
43 | 00233333555577778
44 | 0222233555778
45 | 0000000023333357778888
46 | 00002333577
47 | 00000023578
48 | 000000223358
49 | 00333
50 | 037
51 | 0
En el diagrama anterior notamos que hay dos grupos bien definidos. Otra manera de representar estos datos es mediante un diagrama de dispersión en una dimensión.
En el grupo de la derecha observamos una serie de picos que no parecerían ser resultado de variación en las erupciones. Estos picos pueden confirmarse en el diagrama de tallo y hoja donde vemos claramente una sobreabundancia de hojas igual a cero (las hojas corresponden a la cifra de centésimas). Esto pone en duda la presición sugerida de los datos a tres decimales, y probablemente se deba a efectos de redondeo.
En este caso es posible que no queramos ver ese patrón de variación que ocurre en la escala de centésimas, pues distrae de los aspectos de estos datos que se refieren a los tiempos de erupción. Una manera de hacer esto es creando intervalos de longitud 1/10, contando cuantos puntos caen en cada subintervalo y graficando las frecuencias obtenidas.
minimo <- min(faithful$eruptions) - 0.1
maximo <- max(faithful$eruptions) + 0.1
cortes <- seq(minimo, maximo, by = 1/10)
faithful$intervalo <- cut(faithful$eruptions, breaks = cortes)
head(faithful)
eruptions waiting intervalo
1 3.600 79 (3.5,3.6]
2 1.800 54 (1.7,1.8]
3 3.333 74 (3.3,3.4]
4 2.283 62 (2.2,2.3]
5 4.533 85 (4.5,4.6]
6 2.883 55 (2.8,2.9]
Ahora calculamos las frecuencias (cuántos datos hay en cada intervalo). Nótese que por convención usamos intervalos cerrados por la derecha.
table(faithful$intervalo)
(1.5,1.6] (1.6,1.7] (1.7,1.8] (1.8,1.9] (1.9,2] (2,2.1] (2.1,2.2]
1 2 13 24 15 11 8
(2.2,2.3] (2.3,2.4] (2.4,2.5] (2.5,2.6] (2.6,2.7] (2.7,2.8] (2.8,2.9]
8 7 3 0 2 1 2
(2.9,3] (3,3.1] (3.1,3.2] (3.2,3.3] (3.3,3.4] (3.4,3.5] (3.5,3.6]
0 1 0 0 4 4 6
(3.6,3.7] (3.7,3.8] (3.8,3.9] (3.9,4] (4,4.1] (4.1,4.2] (4.2,4.3]
1 5 9 13 12 14 13
(4.3,4.4] (4.4,4.5] (4.5,4.6] (4.6,4.7] (4.7,4.8] (4.8,4.9] (4.9,5]
16 20 18 13 11 8 4
(5,5.1] (5.1,5.2]
3 0
Podemos hacer una gráfica de barras con estas frecuencias.
hist_erupciones <- hist(faithful$eruptions, breaks = cortes,
col = "gray40", border = NA, main="")
y podemos suavizar más o menos nuestra gráfica cambiando el ancho de los intervalos.
anchos
grafFreq <- function(delta){
minimo <- min(faithful$eruptions) - 0.1
maximo <- max(faithful$eruptions) + 0.1
cortes <- seq(minimo, maximo + delta, by = delta)
hist(faithful$eruptions, breaks = cortes, col = "gray40", border = NA,
main = "", xlim = c(1,6), ylab = "", xlab = "") }
par(mfcol = c(1,6))
grafFreq(0.05)
grafFreq(0.10)
grafFreq(0.15)
grafFreq(0.20)
grafFreq(0.60)
grafFreq(0.90)
El objetivo de cambiar el ancho de los intervalos es poder apreciar la variación de los datos a diferentes escalas. La recomendación general es que es mejor probar con distintos anchos de los intervalos para resaltar distintos aspectos de los datos. En general, intervalos demasiado chicos pueden interferir con nuestra percepción de los patrones más grandes en los datos, mientras que intervalos demasiado grandes pueden contener poca información acerca del conjunto de datos.
Por el momento, una buena idea es comenzar con intervalos muy angostos e irlos incrementando hasta obtener un nivel de suavizado aceptable (dependiendo del objetivo de nuestro análisis) existe teoría y varios métodos para escoger el tamaño de los intervalos (David W. Scott 1992).
Nótese también que al incrementar el tamaño de los intervalos de la partición ignoramos variación a escalas más chicas, pero no del todo. Parte de esa variación a escalas chicas se refleja en la desición del punto inicial de los intervalos: es decir, aunque los intervalos sean de longitud \(\delta\), es posible mover ligeramente la posición de los intervalos por fracciones de \(\delta\) y obtener gráficas diferentes. Más adelante veremos un enfoque que resuelve esta característica de este tipo de gráficas.
Hasta ahora, hemos visto tablas de frecuencias absolutas, es decir, cuentan los datos que caen en cada intervalo. Tabién es posible usar frecuencias relativas, que registran la proporción de datos que cae en cada intervalo.
Para el caso del géiser podemos considerar la siguiente partición.
minimo <- min(faithful$eruptions) - 0.1
maximo <- max(faithful$eruptions) + 0.1
cortes <- seq(minimo, maximo + 0.5, by = 0.5)
cortes
[1] 1.5 2.0 2.5 3.0 3.5 4.0 4.5 5.0 5.5
Construimos la tabla de frecuencias absolutas:
faithful$intervalo <- cut(faithful$eruptions, breaks = cortes)
faithful_frecs <- summarise(group_by(faithful, intervalo),
frec_absoluta = n())
faithful_frecs
Source: local data frame [8 x 2]
intervalo frec_absoluta
1 (1.5,2] 55
2 (2,2.5] 37
3 (2.5,3] 5
4 (3,3.5] 9
5 (3.5,4] 34
6 (4,4.5] 75
7 (4.5,5] 54
8 (5,5.5] 3
Y las frecuencias relativas son:
faithful_frecs$frec_relativa <- faithful_frecs$frec_absoluta /
sum(faithful_frecs$frec_absoluta)
format(faithful_frecs, digits = 2)
intervalo frec_absoluta frec_relativa
1 (1.5,2] 55 0.202
2 (2,2.5] 37 0.136
3 (2.5,3] 5 0.018
4 (3,3.5] 9 0.033
5 (3.5,4] 34 0.125
6 (4,4.5] 75 0.276
7 (4.5,5] 54 0.199
8 (5,5.5] 3 0.011
La tabla de frecuencias de una variable cualitativa se construye como sigue, identificamos las categorías de la variable categórica (posibles valores): \(C_1,C_2,...,C_m\), y contamos el número de datos de cada tipo: \(n_1,n_2,...,n_m\). Esras son las frecuencias absolutas. Las relativas \(f_1,f_2,...,f_m\) se calculan dividiendo \(n_1,n_2,...,n_m\) entre el número de datos en el concunto (\(n_1+n_2+...+n_m\)).
La única decisión que tenemos que tomar es acerca del orden en que enlistamos las categorías \(C_1,C_2,...,C_m\), si la medición es ordinal (es decir, tiene un orden natural), entonces podemos elegir ese orden (ej. escolaridad: kinder, primaria, secundaria, etc.). Si es nominal (ej. nacionalidad: mexicana, canadiense, española, etc.) y no existe ningún otro orden razonable, podemos ordenarlas según los valores \(n_1,n_2,...,n_m\).
Tenemos una colección de 46 monedas para las cuales registramos su año de acuñación. Nuestra colección contiene denominaciones de 50 centavos a 10 pesos.
monedas <- c(rep(1992,3), rep(1993,4), rep(1994,3), 1996, rep(1997,2),
rep(1998,2), rep(1999,4), rep(2000,2), rep(2002,5), rep(2003,5),
rep(2004,4), rep(2005,3), rep(2006,7), rep(2007,2))
Y graficamos la tabla de frecuencias:
par(mfcol = c(1,2))
plot(table(monedas), ylab = 'Frecuencia absoluta')
plot(prop.table(table(monedas)), ylab='Frecuencia relativa')
Otra opción es una gráfica de pie:
pie(table(monedas), main = '¡No usar esta gra ́fica!')
Usando el pie determina, ¿Cómo se compara la cantidad de monedas que tengo para 1996 con la que tengo para 1993?
En 1996 hay la mitad de monedas que en 1993.
En 1996 hay un tercio de monedas que en 1993.
Esta propiedad de los histogramas implica que la suma de las áreas de las barras en un histograma siempre es uno (pues las frecuencias relativas siempre suman uno). Para entender por que hacer este escalamiento, supongamos que nuestros datos \(x_1,...,x_n\) son \(n\) observaciones de una variable aleatoria continua con densidad de probabilidad continua \(f\). Para cualquier intervalo chico \(I\) de longitud \(\Delta\) tenemos que:
\[P(X \in I) = \int_I f(x)dx \approx m(I)\Delta\]
donde \(m(I)\) es el valor promedio de \(f(x)\) en \(I\). Según la interpretación frecuentista de la probabilidad, la frecuencia relativa \(N(I)/n\) de observaciones \(x_1,...,x_n\) que caen en el intervalo \(I\) es, para \(n\) grande, cercano a \(P(X \in I)\). De esta forma, tenemos que:
\[\frac{N(I)}{n\Delta} \approx \frac{P(X \in I)}{\Delta} \approx m(I).\]
De esta manera vemos que si cada barra de la gráfica de barras de frecuencias relativas es escalada por el ancho de su intervalo correspondiente, la nueva altura de las barras aproximan el valor promedio de la densidad \(f\) en cada uno de los intervalos.
Aunque casi nunca sabemos la densidad de donde provienen los datos, esta forma de reescalar los histogramas es conveniente porque nos permite comparar fácilmente histogramas de distintos conjuntos de datos.
Tomamos 1000 observaciones de una variable aleatoria exponencial con parámetro 1, graficamos el histograma correspondiente con ancho de intervalos igual a 0.5, y finalmente superponemos la función de densidad:
set.seed(72)
x_sim <- data.frame(id = 1:1000, x = rexp(1000, rate = 1))
hist(x_sim$x, breaks = seq(0, 9, 0.5), col = "gray", freq = FALSE, main = "")
exp_1 <- function(x){ dexp(x, rate = 1) }
curve(exp_1, add = TRUE, from = 0.05, to = 9,
col = "red", lwd = 2, main = "")
Nuestra convención es que llamaremos histograma a la gráfica de barras de frecuencias relatvias escaladas por los tamaños de los intervalos. Igual que en los diagramas de tallo y hoja o en las gráficas de puntos, en los histogramas buscamos entender alrededor de que valores se agrupan los datos, dispersión, forma (simetría, sesgo, colas largas o cortas), evidencia de subgrupos y casos atípicos.
Los histogramas presentan cierta inestabilidad en cuanto a la forma empírica que representan. Esto se deabe al proceso discreto de su construcción. En el siguiente ejemplo, variamos el punto de inicio de la partición y vemos que en distintos casos las formas representadas pueden ser muy distintas.
set.seed(28)
x_sim <- rnorm(80)
min_x <- min(x_sim)
max_x <- max(x_sim)
par(mfcol=c(1,3))
hist(x_sim, seq(min_x - 0.5, max_x + 0.5, by = 0.4))
hist(x_sim, seq(min_x - 0.2, max_x + 0.7, by = 0.4))
hist(x_sim, seq(min_x - 0.4, max_x + 0.9, by = 0.4))
Cuando hacemos gráficas de barras de frecuencias relativas, no tiene mucho sentido variar el ancho de los intervalos: por ejemplo, dos gráficas de barras con intervalos variables distintos no son comparables. Adicionalmente, las gráficas resultantes no tienen una interpretación de aproximación a la densidad como tienen los histogramas. En los histogramas anchos variables no representan un problema, pues están normalizados por tales anchos. Con los mismos datos del ejemplo anterior podemos hacer unos ejercicios (en estos casos escogemos anchos al azar).
set.seed(2872)
x_sim <- rexp(1000, rate = 1)
par(mfcol = c(2,2))
hist(x_sim, breaks = c(0, runif(20, 0, 9), 9), col = "gray", freq = FALSE,
main ="")
curve(exp_1, add = TRUE, from = 0.05, to = 9,
col = "red", lwd = 2, main = "")
hist(x_sim, breaks = c(0, runif(20, 0, 9), 9), col = "gray", freq = FALSE,
main ="")
curve(exp_1, add = TRUE, from = 0.05, to = 9,
col = "red", lwd = 2, main = "")
hist(x_sim, breaks = c(0, runif(20, 0, 9), 9), col = "gray", freq = FALSE,
main ="")
curve(exp_1, add = TRUE, from = 0.05, to = 9,
col = "red", lwd = 2, main = "")
hist(x_sim, breaks = c(0, runif(20, 0, 9), 9), col = "gray", freq = FALSE,
main ="")
curve(exp_1, add = TRUE, from = 0.05, to = 9,
col = "red", lwd = 2, main = "")