Está en la página 1de 17

Propuesta de dos rutina en R

para la construcción de tabla de


distribución de frecuencias
agrupada y elección del número
de clases en un Histograma
Odacir Padilla S. & Andrea Sbrofatti
Universidad del Norte

Resumen.
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=20n=20,n=30n=30,n=50n=50 y n=100n=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”.

1. Introducción
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.

2.Descripción del problema


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.freqdel 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)1+3.32∗log(n)

En esta fórmula, el valor de nn 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<30n<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/3h∗=3.5∗s∗n−1/3

En la cual ss 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/3h∗=2∗IQ∗n−1/3

Donde IQIQ es el rango intercuartilico de la muestra, este método es menos sensible a los
datos atípicos.

3. Metodología
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 μ=20μ=20 y σ=5σ=5 de
tamaños n=20n=20, n=30n=30, n=50n=50 y n=50n=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)

3. Construcción de las Rutinas en R.


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.

1. Rutina Uno

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 A
cumuladas

# 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 = "Frecuenc
ias Relativas Acumuladas",
xlab = "Datos")
lines(TabFreq$MarClas, TabFreq$RelAc, col = "red")
title(main = "Ojiva", col.main = "darkgreen")
}

2. Rutina Dos

DF <- function(y, which = 1, V = TRUE) {


# y vector
library(grDevices) #opcional , paquete para dispositivos gráfico
s 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 Histogra
ma
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$bre
aks)],
H$mids[1:length(H$mids)], H$counts) # matriz con los inte
rvalo, ptos medios y frecuencia
colnames(T1) <- c("Linf", "Lsup", "Marca_c", "frec")
T1 = transform(T1, F_acum = cumsum(frec), Rel. = round(prop.ta
ble(frec),
3))
T1 = transform(T1, Rel_acum = cumsum(Rel.))
T1 = transform(T1, Porc_Acum = Rel_acum * 100) # Tabla distr
ibución de frecuencia

plot(H$breaks, c(0, T1[, 8]), type = "o", col.main = "darkgree


n", main = "Ojiva",
xlab = "Limites", ylab = "Relativa Acum(%)", col = 2) # o
jiva
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, pl


ot = 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 = expre
ssion(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

2. 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=20n=20, n=30n=30, n=50n=50 y n=100n=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=20n=20
DF(n_30,V=FALSE)
Tamaño n=30n=30
DF(n_50,V=FALSE)
Tamaño n=50n=50
DF(n_100,V=FALSE)
Tamaño n=100n=100
Para tamaño de muestras peqeños (n≤50n≤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=100n=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 nn 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

Bibliografía
 Scott, D.W. (1979) On optimal and data-based histograms. Biometrika, 66, 605-
610.
 Sturges, H. (1926) The choice of a class-interval. J. Amer. Statist. Assoc., 21, 65-
66
 Freedman, D. and Diaconis, P. (1981) On this histogram as a density estimator: L2
theory. Zeit. Wahr. ver. Geb., 57, 453-476.
 Hyndman, R.J (1995) The problem with Sturges’ rule for constructing histograms.
 R Core Team (2015). R: A language and environment for statistical computing. R
Foundation for Statistical Computing, Vienna, Austria. URL http://www.R-
project.org/
 Correa, J.C and Gonzalez,N.(2002) Gráficos Estadísticos con R.

También podría gustarte