Estudiaremos análisis exploratorio de datos univariados, en particular abordaremos los siguientes temas:

Distribución de conjuntos de datos numéricos

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.

Diagramas de tallo y hoja

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:

  1. Ordenamos cada conjunto de menor a mayor.

  2. Agrupamos los números según sus centenas y descenas.

  3. 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.

  1. ¿Que datos están más dispersos?
  1. Tlalpan
  2. Iztaplapa
  3. Están igual
  1. ¿Los datos parecen formar subgrupos?
  1. No
  1. ¿Cuántos días de exposición aguda hubo en Tlalnepantla durante 2014?
  1. Ninguno
  2. 1-5
  3. 6-10
  4. Más de 10

Algunas de las preguntas que nos ayudan a contestar los diagramas de tallo y hoja son:

Patrones de variación

  • ¿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?

  • ¿Hay observaciones atípicas?

Los diagramas de tallo y hojas están limitados pues, por ejemplo, no son tan efectivos con muchos datos.

Tablas de frecuencias

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 
Categorización de una variable numérica. Categorizar una conjunto de datos numéricos consiste en asignar cada dato \(x\) del conjunto a un elemento de una partición de un conjunto que contenga a \(x\). Generalmente los elementos de la partición son intervalos semiabiertos, que comunmente se llaman intervalos de clase.

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.

  1. Para lograr mayor suavizamiento necesito intervalos mas …
  1. anchos

  2. angostos
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)

Suavizamiento de datos y elección de ancho de intervalos

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.

Selección de ancho de los intervalos. No hay una receta simple, lo mejor es experimentar con varios anchos y ver que expresa cada una de las gráficas obtenidas. Otra posible regla es decidir cuál es una pérdida de presición aceptable y escoger consecuentemente el tamaño de los intervalos.

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.

Frecuencias absolutas y relativas

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

Tablas de frecuencias para variables categóricas

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\).

Ejemplo: monedas

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?

  1. En 1996 hay la mitad de monedas que en 1993.

  2. En 1996 hay un tercio de monedas que en 1993.

  3. En 1996 hay un cuarto de monedas que en 1993.

Histogramas

Los histogramas son gráficas de barras que se obtienen a partir de tablas de frecuencias, donde cada barra se escala según la frecuencia relativa entre el ancho del intervalo de clase correspondiente.

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.

Ejemplo: exponencial

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.

Ejemplo: inestabilidad de histogramas

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))

Ejemplo: histograma con anchos de intervalo variables

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 = "")