Histogramas de frecuencias relativas

En estos histogramas, es común superponer una curva que estime la densidad de la distribución de la variable cuantitativa definida por la característica que estamos midiendo.

La densidad de una variable es una curva cuya área comprendida entre el eje de las abscisas y la propia curva sobre un intervalo es igual a la fracción de individuos de la población que caen dentro de ese intervalo.

Para hacernos una idea visual, imaginad que vais aumentando el tamaño de la muestra a la vez que agrupas los datos en un conjunto cada vez mayor de clases. Si el rango de los datos se mantiene constante, la amplitud de las clases del histograma irá menguando. Además, cuando \(n\), el tamaño de la muestra, tiende a infinito, los intervalos tienden a ser puntos y, a su vez, las barras tienden a ser líneas verticales. Pues bien, los extremos superiores de estas líneas serán los que dibujen la densidad de la variable.

Campana de Gauss

Es la densidad más famosa: la Campana de Gauss. ësta se corresponde con una variable que siga una distribución normal.

La forma de la campana depende de dos parámetros: el valor medio, \(\mu\), y su desviación estándar, \(\sigma\).

Dibujando la curva de densidad

Existen muchos métodos con los cuales estimar la densidad de distribución a partir de una muestra.

Una de ellas es mediante la función density de R. Al aplicar a un conjunto de datos, produce una lista que incluye los vectores x e y que contienen la primera y segunda coordenadas, respectivamente, de 512 puntos de la forma \((x,y)\) sobre la curva de densidad estimada.

Aplicando plot o lines a este resultado según toque, obtenemos la representación gráfica de esta curva.

hist(iris$Petal.Length, freq = FALSE)
lines(density(iris$Petal.Length))
rug(jitter(iris$Petal.Length))

Función completa para frecuencias relativas

histRel = function(x, L){
  h = hist(x, breaks=L, right=FALSE, plot=FALSE)
  t = round(1.1*max(max(density(x)[[2]]), h$density),2)
  plot(h, freq=FALSE, col="lightgray",
       main="Histograma de frec. relativas\n y curva de densidad estimada",
       #xaxt = "n",
       yaxt = "n",
       ylim = c(0,t),
       xlab = "Intervalos",
       ylab = "Densidades")
  #axis(1, at = L)
  text(h$mids, h$density/2, labels = round(h$counts/length(x),2), col="blue")
  lines(density(x), col ="purple", lwd=2)
}
histRel(iris$Petal.Length, nclass.FD(iris$Petal.Length))
rug(jitter(iris$Petal.Length))

Histograma de frecuencias relativas acumuladas

En este último tipo de histograma, se suele superponer una curva que estime la función de distribución de la variable definida por la característica que estamos midiendo.

Esta función de distribución, en cada punto nos da la fracción de individuos de la población que caen a la izquierda de este punto: su frecuencia relativa acumulada.

En general, la función de distribución en un valor determinado se obtiene hallando el área de la función de densidad que hay a la izquierda del valor.

histRelCum = function(x, L){
  h = hist(x, breaks=L, right=FALSE, plot=FALSE)
  h$density = cumsum(h$counts)/length(x)
  plot(h, freq=FALSE, col="lightgray",
       main="Histograma de frec. relativas acumuladas\n y curva de densidad estimada",
       #xaxt = "n",
       xlab = "Intervalos",
       ylab = "Densidades")
  #axis(1, at = L)
  text(h$mids, h$density/2, labels = round(h$density,2), col="blue")
  dens.x = density(x)
  dens.x$y = cumsum(dens.x$y)*(dens.x$x[2]-dens.x$x[1])
  lines(dens.x, col ="purple", lwd=2)
}
histRelCum(iris$Petal.Length, nclass.FD(iris$Petal.Length))
rug(jitter(iris$Petal.Length))

Ejercicio con Data Crab

dc = read.table("https://raw.githubusercontent.com/joanby/r-basic/master/data/datacrab.txt",
                header = TRUE,
                stringsAsFactors = TRUE,
                sep = " ")
cw = dc$width

Dibujamos el histograma con hist y luego observamos su información interna.

hist(cw, breaks = nclass.FD(cw), right = FALSE, plot = FALSE)
## $breaks
##  [1] 21 22 23 24 25 26 27 28 29 30 31 32 33 34
## 
## $counts
##  [1]  1  7 15 23 33 29 26 19 11  6  2  0  1
## 
## $density
##  [1] 0.005780347 0.040462428 0.086705202 0.132947977 0.190751445 0.167630058
##  [7] 0.150289017 0.109826590 0.063583815 0.034682081 0.011560694 0.000000000
## [13] 0.005780347
## 
## $mids
##  [1] 21.5 22.5 23.5 24.5 25.5 26.5 27.5 28.5 29.5 30.5 31.5 32.5 33.5
## 
## $xname
## [1] "cw"
## 
## $equidist
## [1] TRUE
## 
## attr(,"class")
## [1] "histogram"
hist(cw, breaks = nclass.FD(cw), right = FALSE, plot = TRUE)

histRel(cw, nclass.FD(cw))
rug(jitter(cw))

str(density(cw))
## List of 7
##  $ x        : num [1:512] 19 19 19.1 19.1 19.1 ...
##  $ y        : num [1:512] 3.90e-05 4.50e-05 5.17e-05 5.94e-05 6.82e-05 ...
##  $ bw       : num 0.671
##  $ n        : int 173
##  $ call     : language density.default(x = cw)
##  $ data.name: chr "cw"
##  $ has.na   : logi FALSE
##  - attr(*, "class")= chr "density"

La curva de densidad que hemos obtenido en este gráfico tiene una forma de campana de Gauss. Para explorar este parecido, vamos a añadir al histograma la gráfcia de la función densidad de una distribución normal de mdida y desviación típica las del conjunto de datos original.

Así, aplicando las instrucciones siguientes, acabamos obteniendo.

histRel(cw, nclass.FD(cw))
curve(dnorm(x, mean(cw), sd(cw)), col="red", add=TRUE, lty = "dashed", lwd=2)
legend("topright", lwd=c(2,2), lty=c(1,4), col=c("purple", "red"), legend = c("Densidad estimada", "Densidad normal"))

Relativo acumulado

histRelCum(cw, nclass.FD(cw))