En este trabajo elaboramos un par de rutina en el programa R que construya una tabla de distribución de frecuencias agrupada y se compara los métodos de Sturges (1926), Scott (1985) y Freedman & Diaconis (1981) propuesto para la decisión sobre el ancho óptimo del intervalo y el número de clase. se generaron histogramas con datos simulados de una distribucción normal de tamaño \(n=20\),\(n=30\),\(n=50\) y \(n=100\) los cuales se incluyen datos atípicos. y probamos las rutina con la variable “thickness” del conjunto de datos “Melanoma” de la biblioteca “MASS”.
Al momento de tratar con datos, el método más útil de organizar, resumir e interpretar de manera más rápida y eficiente estos datos es construyendo tablas de frecuencias, estas forma de presentar la informacion resume la cantidad de veces que una variable toma un valor determinado. Para el caso variables cuantitativas se construye tablas de frecuencias agrupadas por intervalos y aunque es lo más usual, no necesariamente las clases deben tener la misma amplitud (Triola 2000). Existen diferentes fórmulas propuestas para la determinación del número de clases a trabajar dentro de estas están la propuestas por Sturges (1926), por Scott (1985) y Freedman & Diaconis (1981). A menudo encontramos el problema cuando la densidad de la variable de interés es desconocida. Un método popular de estimar la densidad desconocida es utilizando el estimador de Histograma, El histograma es el gráfico estadístico por excelencia. El histograma de un conjunto de datos es un gráfico de barras que representan las frecuencias con que aparecen las mediciones agrupadas en ciertos rangos o intervalos y donde la altura de cada barra representa la frecuencia o cantidad de datos dentro de cada intervalo .La idea de agrupar datos en forma de histogramas se conoce desde 1662 con el trabajo de Graunt. Sin embargo, es hasta 1926 cuando aparecen las primeras reglas sobre su contrucción con la fórmula de Sturges para determinar el número de barras (Correa & Gónzales . 2002) existen otros métodos para seleccionar la cantidad de intervalos, tales como los propuestos por Scott (1985) y Freedman & Diaconis (1981). De acuerdo a Correa & Castrillón (2010). El objetivo del presente trabajo es elaborar una rutina en el programa R que construya una tabla de distribución de frecuencias agrupada y comparar los resultados obtenidos por las reglas de Sturges (1926), Scott (1985) y Freedman & Diaconis (1981) al momento de generar histogramas y su comportamiento con datos atípicos.
Algunos teóricos han intentado determinar un número óptimo de clases, pero estos métodos generalmente hacen suposiciones muy fuertes acerca de la forma de la distribución. A menudo, la decisión sobre el número de clase o el ancho de intervalo en un histograma se hace arbitraria o subjetivamente pero no necesariamente es así. Diversos procedimientos estadísticos que se han propuesto en la decisión sobre el ancho óptimo del intervalo y el número de clase. En la literatura estadística es prevalente el método de Sturges (1926),pero otros métodos tales como el de Scott (1985) y Freedman & Diaconis (1981) son propuesto para el cálculo del número de intervalos. nuestra idea es buscar una respuesta al siguiente interrogante: ¿Cuál de las tres reglas anteriormente mencionadas de selección del número de clases ofrece la forma de distribución más estable y robusta? para ello proponemos un par de rutinas que construya una tabla de distribución de frecuencias agrupada y muestre su histograms, poligono de frecuecia y el gráfico de la “ojiva menor que” . Aunque en R hay funciones para la construcción de tablas de frecuencia, entre ella la función table.freq del paquete agricolae que calcula las frecuencias con los intervalos de clase definidos a partir de un histograma previamente calculado por la función hist. como ejercicio académico elaboramos nuestro propio programa para realizar las comparaciones de estos tres métodos.
Fórmula de Sturges:
Sturges (1926) propuso la siguiente fórmula para el cálculo del número de clases a elegir al construir un Histograma de los datos normales. \[1 +3.32*log(n)\] En esta fórmula, el valor de \(n\) corresponde al número de datos que se representaran en el histograma. De acuerdo a Correa & Castrillón (2010), esta fórmula basa el tamaño de los datos en el rango de los datos y tiene un comportamiento muy pobre si \(n < 30\).
Fórmula de Scott:
Para el caso de densidad normal una regla alternativa para construir histogramas incluyen la regla de Scott (1979) para el ancho de clase. \[h^*=3.5*s*n^{-1/3}\]
En la cual \(s\) corresponde a la desviación estándar muestral de los datos.
Fórmula de Freedman-Diaconis (F-D)
Freedman & Diaconis (1981) propusieron una modificación para datos no normales la fórmula es.
\[h^*=2*IQ*n^{-1/3}\] Donde \(IQ\) es el rango intercuartilico de la muestra, este método es menos sensible a los datos atípicos.
Para poder dar respuesta a la pregunta planteada, se desarrolló una rutina R Core Team (2016), en donde para un conjunto de datos se obtiene la tabla de frecuencias, además de su correspondiente histograma con su correspondiente polígono de frecuencia y ojiva. Presentamos el comportamiento de la rutina, utilizando la variable thickness del conjunto de datos Melanoma de la biblioteca MASS incluida en R Core Team (2016). Con el fin de comparar el comportamiento de los histogramas obtenidos utilizando las tres fórmulas para el cálculo del número de intervalos de clase, creamos vectores aleatorios de distribución normal con \(\mu = 20\) y \(\sigma = 5\) de tamaños \(n = 20\), \(n = 30\), \(n = 50\) y \(n = 50\), y se corrió la rutina calculando los números de intervalos de clase mediante las fórmulas de Sturges (1926), Scott (1979) y Freedman & Diaconis (1981)
Supongamos que me piden elaborar un programa o rutina que construya una tabla de distribución de frecuencias agrupada (usando inicialmente “Sturges” para obtener el número de clases) donde se refleje los límites de clase (inferior y superior), las marcas de clase, la frecuencia absoluta, la frecuencia acumulada, la frecuencia relativa y frecuencia relativa acumulada. Así como su histograma y el polígono de frecuencias (ambos en un mismo plano) y la ojiva.
histograma = function(X, which = 1) {
if (which == 1)
{
k = nclass.Sturges(X)
} #Si which = 1, calcula Histograma y Tabla de Frecuencia con Sturges.
if (which == 2)
{
k = nclass.scott(X)
} #Si which = 2, calcula Histograma y Tabla de Frecuencia con Scott.
if (which == 3)
{
k = nclass.FD(X)
} #Si which = 3, calcula Histograma y Tabla de Frecuencia con Freedman.
Rango = ceiling(max(X) - min(X)) #Cálculo rango
a = round(Rango/k, 1) #Cálculo ancho de clase.
c = abs(round(a * k - Rango, 1))
LimClasInf = numeric(k) #Cálculo límites de clase inferiores
LimClasInf[1] = min(X) - c/2
for (i in 2:k) {
LimClasInf[i] = LimClasInf[i - 1] + a
}
LimClasInf = round(LimClasInf, 2)
LimClasSup = numeric(k) #Cálculo limites de clase superiores
LimClasSup[1] = LimClasInf[1] + a
for (i in 2:k) {
LimClasSup[i] = LimClasSup[i - 1] + a
}
LimClasSup = round(LimClasSup, 2)
MarClas = numeric(k) #Cálculo marcas de clase
for (i in 1:k) {
MarClas[i] = (LimClasInf[i] + LimClasSup[i])/2
}
MarClas = round(MarClas, 2)
Freq = numeric(k)
for (i in 1:k) {
Freq[i] = length(X[X >= LimClasInf[i] & X < LimClasSup[i]])
}
FreqAc = cumsum(Freq) #Cálculo Frecuencias Acumuladas
Rel = round(Freq/sum(Freq), 4) #Cálculo Frecuencias Relativas
RelAc = round(cumsum(Rel), 4) #Cálculo de Frecuencias Relativas Acumuladas
# Tabla de Frecuencias
TabFreq = data.frame(LimClasInf, LimClasSup, MarClas, Freq, FreqAc, Rel,
RelAc)
print(TabFreq)
par(mfrow = c(1, 2))
# Histograma con Polígono de Frecuencias
TabFreq.bar = barplot(TabFreq$Freq, space = 0, font = 2, col.main = "darkgreen",
main = "Histograma y Polígono de Frecuencias", xlab = "Datos", ylab = "Frecuencias",
names.arg = MarClas, col = terrain.colors(8))
lines(x = TabFreq.bar, y = TabFreq$Freq, col = "red")
points(x = TabFreq.bar, y = TabFreq$Freq, col = "red")
# Generando Ojiva
plot(TabFreq$MarClas, TabFreq$RelAc, col = "red", ylab = "Frecuencias Relativas Acumuladas",
xlab = "Datos")
lines(TabFreq$MarClas, TabFreq$RelAc, col = "red")
title(main = "Ojiva", col.main = "darkgreen")
}
DF <- function(y, which = 1, V = TRUE) {
# y vector
library(grDevices) #opcional , paquete para dispositivos gráficos y soporte para colores y fuentes
if (V == TRUE) {
if (which == 1) {
k <- nclass.Sturges(y)
} else if (which == 2) {
k <- nclass.scott(y)
} else {
k <- nclass.FD(y)
}
H = hist(y, k, ylim = c(0, length(y) * 0.5), col = 3, col.main = "darkgreen",
main = "Histograma", xlab = "Intervalo") #objeto Histograma
lines(c(min(H$breaks), H$mids, max(H$breaks)), c(0, H$counts, 0), type = "l",
col = 2)
T1 = cbind(H$breaks[1:length(H$mids)], H$breaks[2:length(H$breaks)],
H$mids[1:length(H$mids)], H$counts) # matriz con los intervalo, ptos medios y frecuencia
colnames(T1) <- c("Linf", "Lsup", "Marca_c", "frec")
T1 = transform(T1, F_acum = cumsum(frec), Rel. = round(prop.table(frec),
3))
T1 = transform(T1, Rel_acum = cumsum(Rel.))
T1 = transform(T1, Porc_Acum = Rel_acum * 100) # Tabla distribución de frecuencia
plot(H$breaks, c(0, T1[, 8]), type = "o", col.main = "darkgreen", main = "Ojiva",
xlab = "Limites", ylab = "Relativa Acum(%)", col = 2) # ojiva
grid(20) # división con linea para la ojiva
print("Tabla Distribución de Frecuencia")
print(T1)
} else {
par(mfrow = c(1, 3))
H1 = hist(y, nclass.Sturges(y), ylim = c(0, 0.15), col = 5, plot = T,
col.main = "darkgreen", main = "Sturges", freq = F)
curve(dnorm(x, 20, 5), add = TRUE, col = 2)
legend("topright", text.col = "red", bty = "n", legend = expression(paste(mu,
"= 20, ", sigma, "= 5,")))
H2 = hist(y, nclass.scott(y), ylim = c(0, 0.15), col = 5, plot = T,
col.main = "darkgreen", main = "Scott", freq = F)
curve(dnorm(x, 20, 5), add = TRUE, col = 2)
H3 = hist(y, nclass.FD(y), ylim = c(0, 0.15), col = 5, plot = T, col.main = "darkgreen",
main = "Freedman- Diaconis", freq = F)
curve(dnorm(x, 20, 5), add = TRUE, col = 2)
}
}
Probamos los código con datos simulados.
set.seed(3211)
X=round(rnorm(200,20,5),1)
histograma(X) # Rutina 1
LimClasInf LimClasSup MarClas Freq FreqAc Rel RelAc
1 5.95 9.05 7.5 2 2 0.010 0.010
2 9.05 12.15 10.6 10 12 0.050 0.060
3 12.15 15.25 13.7 26 38 0.130 0.190
4 15.25 18.35 16.8 44 82 0.220 0.410
5 18.35 21.45 19.9 50 132 0.250 0.660
6 21.45 24.55 23.0 37 169 0.185 0.845
7 24.55 27.65 26.1 19 188 0.095 0.940
8 27.65 30.75 29.2 9 197 0.045 0.985
9 30.75 33.85 32.3 3 200 0.015 1.000
DF(X) # Rutina 2
[1] "Tabla Distribución de Frecuencia"
Linf Lsup Marca_c frec F_acum Rel. Rel_acum Porc_Acum
1 5 10 7.5 4 4 0.020 0.020 2.0
2 10 15 12.5 27 31 0.135 0.155 15.5
3 15 20 17.5 73 104 0.365 0.520 52.0
4 20 25 22.5 71 175 0.355 0.875 87.5
5 25 30 27.5 22 197 0.110 0.985 98.5
6 30 35 32.5 3 200 0.015 1.000 100.0
- Ahora, de su rutina anterior cambie el argumento “breaks” dentro de la función hist por las fórmulas para obtener el número de clases (número de barras) desarrolladas por Scott y Freedman- Diaconis, con el fin de comparar sus resultados. En esta parte para establecer diferencias podría tener en cuenta el tamaño de la muestra (por ejemplo creando un vector aleatorio de distribución normal de media 20 y desviación estándar 5 redondeado a un lugar decimal para n=20, n=30, n= 50 y n=100), por otro lado incluya datos atípicos (por ejemplo uno dentro de cada vector numérico anterior). De todo el análisis previo ¿Cuál de ellos ofrece la forma de distribución más estable? Justifique todo su análisis estadísticamente.
Generamos muestras de tamaños \(n=20\), \(n=30\), \(n= 50\) y \(n=100\) y que tengan la posibilidad de incluir datos atípicos y comparamos con la rutina DF
set.seed(121)
x1=round(rnorm(20,20,5),1)
n_20=round(sample(c(x1,20-3.5*sd(x1),20+3.5*sd(x1)),20,prob = c(rep(0.8,20),0.7,0.6)),1)
x2=round(rnorm(30,20,5),1)
n_30=round(sample(c(x2,20-3.5*sd(x2),20+3.5*sd(x2)),30,prob = c(rep(0.8,30),0.6,0.6)),1)
x3=round(rnorm(50,20,5),1)
n_50=round(sample(c(x3,20-3.5*sd(x3),20+3.5*sd(x3)),50,prob = c(rep(0.8,50),0.8,0.8)),1)
x4=round(rnorm(100,20,5),1)
n_100=round(sample(c(x4,20-3.5*sd(x4),20+3.5*sd(x4)),100,prob = c(rep(0.8,100),0.9,0.9)),1)
DF(n_20,V=FALSE)
Tamaño \(n=20\)
DF(n_30,V=FALSE)
Tamaño \(n=30\)
DF(n_50,V=FALSE)
Tamaño \(n=50\)
DF(n_100,V=FALSE)
Tamaño \(n=100\)
Para tamaño de muestras peqeños (\(n \leq 50\)) y con datos atípicos, los tres metódos tienen comportamiento parecido y tienden dejar clases vacias en especial Sturges y F-D. para \(n=100\) el metódos D-F determina mucho más intervalo y deja varias clases vacias que los otros dos métodos . Sturges y Scott se comprtan bien y en forma similar, debido a que ambos estas diseñado bajo el supuesto de normalidad.
La regla de Sturges probablemente ha sobrevivido tanto tiempo como lo ha hecho porque, para n moderado (menos de 200), da resultados similares a las reglas alternativas anteriores, y produce un histogramas razonables. Sin embargo, no funciona para n grandes . El problema con la regla de Sturges es que su derivación es incorrecta. Es una regla que no deberia tener lugar en los libros de texto de estadística o como un valor predeterminado en paquetes informáticos estadísticos ( Hyndman 1995).
library(MASS)
attach(Melanoma)
Elegimos la opcion de la Fórmula de Scott, ya que el tamaño de \(n\) es grande y hay datos atípicos.
histograma(thickness,2)
## LimClasInf LimClasSup MarClas Freq FreqAc Rel RelAc
## 1 0.1 1.9 1.0 99 99 0.4829 0.4829
## 2 1.9 3.7 2.8 55 154 0.2683 0.7512
## 3 3.7 5.5 4.6 24 178 0.1171 0.8683
## 4 5.5 7.3 6.4 11 189 0.0537 0.9220
## 5 7.3 9.1 8.2 7 196 0.0341 0.9561
## 6 9.1 10.9 10.0 1 197 0.0049 0.9610
## 7 10.9 12.7 11.8 3 200 0.0146 0.9756
## 8 12.7 14.5 13.6 3 203 0.0146 0.9902
## 9 14.5 16.3 15.4 1 204 0.0049 0.9951
## 10 16.3 18.1 17.2 1 205 0.0049 1.0000
DF(thickness,2)
## [1] "Tabla Distribución de Frecuencia"
## Linf Lsup Marca_c frec F_acum Rel. Rel_acum Porc_Acum
## 1 0 2 1 109 109 0.532 0.532 53.2
## 2 2 4 3 51 160 0.249 0.781 78.1
## 3 4 6 5 21 181 0.102 0.883 88.3
## 4 6 8 7 12 193 0.059 0.942 94.2
## 5 8 10 9 4 197 0.020 0.962 96.2
## 6 10 12 11 0 197 0.000 0.962 96.2
## 7 12 14 13 6 203 0.029 0.991 99.1
## 8 14 16 15 1 204 0.005 0.996 99.6
## 9 16 18 17 1 205 0.005 1.001 100.1