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.
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.
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.
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.
hist(iris$Petal.Length,
breaks = nclass.scott(iris$Petal.Length))
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.
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.
Las alturas de las barras son iguales a las frecuencias acumuladas de las clases, independientente de su amplitud.
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.
Lo hacemos con la función hist
, la cual ya conocemos. Su sintaxis es:
hist(x, breaks=..., freq=..., right=..., ...)
cut
. Por tanto se recomienda hacer uso de la primera opción.cut
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.
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")
}
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))
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)
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))