Histogramas

La mejor manera de representar datos agrupados es mediante unos diagramas de barras especiales conocidos como histogramas.

En ellos se dibuja sobre cada clase una barra cuya área representa su frecuencia. Puedes comprobar que el producto de la base por la altura es igual a la frecuencia de la clase correspondiente.

Uso de histogramas

Si todas las clases tienen la misma amplitud, las alturas de estas barras son las necesarias para que el área de cada barra sea igual a la frecuencia de la clase correspondiente y como las bases son de amplitudes diferentes, esas alturas no son proporcionales a las frecuencias de las clases, por lo que no tiene sentido marcar las frecuencias en el eje vertical.

Son muy usados para representar frecuancas acumuladas de datos agrupados. En este caso, las alturas representan las frecuencias independientemente de la base debido a que éstas deben ir creciendo.

Interpretación

En el eje de abscisas se representan los datos. Aquí marcamos los extremos de las clases y se dibuja una barra sobre cada una de ellas. Esta barra tiene significados diferentes en función del tipo de histograma, pero en general representa la frecuencias de su clase.

Histograma de frecuencias absolutas

La altura de cada barra es la necesaria para que el área de la barra sea igual a la frecuencia absoluta de la clase. Las amplitudes de las clases pueden ser todas iguales o no. En el primer caso, las alturas son proporcionales a las frecuencias. EN el segundo caso, no existe tal proporcionalidad. De todas formas, sea cual sea el caso, conviene indicar de alguna forma la frecuencia que representa cada barra.

Histograma con intervalos de la misma anchura

hist(iris$Petal.Length,
     breaks = nclass.scott(iris$Petal.Length))

Histograma con intervalos de diferente anchura

hist(iris$Petal.Length,
     breaks = c(0, 2.5, 5, 7))

Debe entenderse que el mayor es el segundo intervalo al tener el cuadrado de mayor área, seguido del primero y del tercero.

Histograma de frecuencias relativas

La altura, densidad, de cada barra es la necesaria para que el área sea igual a la frecuencia relativa de la clase. La suma de todas las áreas debe ser 1. De nuevo, conviene indicar de alguna forma la frecuencia que representa cada barra.

Histograma de frecuencias acumuladas

Las alturas de las barras son iguales a las frecuencias acumuladas de las clases, independientente de su amplitud.

Frecuencias nulas

No es conveniente que en un histograma aparezcan clases con frecuencia nula, exceptuando el caso en que represente poblaciones muy diferentes y separadas sin individuos intermedios.

Si aparecen clases vacías, convendría utilizar un número menor de clases, o bien unir las clases vacías con alguna de sus adyacentes. De este último modo romperíamos nuestro modo de trabajo con clases de la misma amplitud.

Representar histogramas en R

Lo hacemos con la función hist, la cual ya conocemos. Su sintaxis es:

hist(x, breaks=..., freq=..., right=..., ...)

hist titula por defecto los histogramas como “histogram of…” despues del vector de datos, puede ser modificado.

Se puede acceder a las variables útiles, usando plot=FALSE para evitar el ploteo.

Función para calcular histogramas de frecuencias absolutas más completos

histAbs = function(x,L){
  h = hist(x, breaks=L, right = FALSE, freq=FALSE,
           #xaxt = "n",
           yaxt = "n",
           col = "lightgray",
           main = "Histograma de frecuencias absolutas",
           ylab = "Frecuencias absolutas",
           xlab = "Intervalos y marcas de clase")
  #axis(1, at=L)
  text(h$mids,h$density/2,labels=h$counts,col="purple")
}

Función axis

  • axis(i, at=...) dibuja el eje correspondiente al valor de \(i\) con marcas de clase en los lugares indicados por el vector definido mediante at. Si \(i = 1\), el de abscisas, si \(i = 2\), el de ordenadas.

Habrás notado que con freq = FALSE en realidad hemos dibujado un histograma de frecuencias relativas, pero al haber omitido el eje de ordenadas, da lo mismo. En cambio, sí que nos ha sido útil para poder añadir, con la función text, la frecuencia absoluta de cada clase sobre el punto medio de su intervalo, los valores h$mids y la media alguna de su barra, correspondiente a h$density gracias a que, con freq = FALSE estas alturas se corresponden con la densidad.

histAbs(iris$Petal.Length, nclass.FD(iris$Petal.Length))
rug(jitter(iris$Petal.Length))

jitter

Otra forma de indicar las frecuencias de las barras es utilizar la función `rug``, la cual permite añadir al histograma una “alfombra” con marcas en todos los valores del vector, donde el grosor de cada marca es proporcional a la frecuencia del valor que representa.

Existe la posibilidad de añadir un poco de ruido a los datos del vector para deshacer posibles empates. Esto lo conseguimos combinando la función rug con jitter.

hist(iris$Petal.Length)
rug(jitter(iris$Petal.Length),0.03)

Función para frecuencias acumuladas

histAbsCum = function(x,L){
  h = hist(x, breaks = L, right = FALSE, plot = FALSE)
  h$density = cumsum(h$density)
  plot(h, freq=FALSE,
       yaxt = "n",
       #xaxt = "n",
       col = "lightgray",
       main = "Histograma de frecuencias \n absolutas acumuladas")
  #axis(1, at = L)
  text(h$mids, h$density/2, labels = cumsum(h$counts), col = "purple")
}
histAbsCum(iris$Petal.Length, nclass.FD(iris$Petal.Length))
rug(jitter(iris$Petal.Length))