La organización de los datos constituye la primera etapa en el tratamiento y análisis de cualquier estudio estadístico. Las tablas son un modo habitual de organización y presentación de los resultados, si bien con el desarrollo de los medios informáticos ha perdido la relevancia de tiempos anteriores.
Una tabla consiste en una ordenación, asignando a cada valor/valores su frecuencia (número de veces qué aparece) agrupada en clases o categorías mutuamente excluyentes.
Su elaboración require:
Establecer el tipo de variable a tabular.
Conocer el número de observaciones (casos).
Saber cuántas veces se repite cada valor dentro de cada categoría.
Las tablas de frecuencias están compuestas básicamente por los siguientes elementos:
La frecuencia absoluta \(n_i\). Consiste en el número de veces que aparece un determinado valor. La suma de las frecuencias absolutas es igual al número total de datos (\(N = n_1+n_2+n_3+...+n_n\)).
La frecuencia relativa \(f_i = \frac{n_i}{N}\). Es el cociente entre la frecuencia absoluta y el número total de datos. La suma de las frecuencias relativas es igual a 1 (o a 100 en caso de trabajar con porcentajes).
Si además nuestros datos poseen un orden interno, las tablas pueden incluir:
La frecuencia absoluta acumulada \(N_i= \sum^i_j n_i\). Equivale a la suma de las frecuencias absolutas de todos los valores inferiores o iguales al valor considerado.
La frecuencia relativa acumulada \(F_i = \frac{N_j}{N}\). Cociente entre la frecuencia acumulada de un determinado valor y el número total de datos. Al igual que la frecuencia relativa, se puede expresar en tantos por ciento.
La naturaleza de los datos (atributos, variables), es decir, el número de valores distintos y el número de observaciones influyen en el tipo de tabla de frecuencias. Podemos considerar dos tipos de tablas de frecuencia:
Tablas sobre datos no agrupados (variables cualitativas, variables cuantitativas discretas).
Tablas sobre datos agrupados en clases o intervalos (variables cuantitativas continuas).
Son apropiadas para el análisis de variables cualitativas o variables cuantitativas discretas. En el caso de variable cualitativas nominales, las tablas estadísticas suelen incluir cuántos valores diferentes aparecen (su frecuencia absoluta) y qué fracción del total representan (la frecuencia relativa).
Para ilustrar la elaboración de una tabla de frecuencias con datos no
agrupados sobre una variable cualitativa nominal, se creará un vector
con la función sample()
, que generará un conjunto de datos
aleatorios con reemplazo (argumento replace=TRUE
es decir,
se pueden repetir) en forma de caracteres (que corresponden a los
niveles), con un tamaño específico
(size=100
) y una probabilidad de aparición. En este caso,
tenemos 3 niveles o categorías (\(k\)=3) y 100 observaciones (\(n\)=100)
Figura 1: Tabla variable cualitativa nominal
<- sample(c("María", "Pedro","Jaime"), # Caracteres a reproducir
datos1 size = 100, # Número de caracteres
replace = TRUE, # Se pueden repetir
prob=c(0.5,0.3,0.2)) # Probabilidades de aparición
La tabla con las frecuencias absolutas se obtiene
con la función table()
. La función devuelve una tabla
unidimensional con dos filas, una con los niveles de la variable y otra
con su frecuencia absoluta.
table(datos1)
La tabla de frecuencias relativas se calcula
anidando la función prop.table()
a la tabla calculada
previamente, ¡no al vector original!. Su estructura es análoga a la
tabla anterior.
prop.table(table(datos1))
Si convertimos esas tablas en vectores, podemos unirlos en una única
tabla con la función cbind()
, que puede visualizarse con
View()
.
<- table(datos1)
datos1_ni <- prop.table(table(datos1))
datos1_fi <- cbind(datos1_ni, datos1_fi)
tabla1 View(tabla1)
Desafío
Calcula las frecuencias relativas y absolutas de la variable
(atributo) barrio
del dataframe zonas_verdes
.
Recuerda que para llamar a una variable concreta de un dataframe
utilizamos la sintaxis
nombre_dataframe$nombre_variable
.
Las variables cualitativas ordinales, en este caso los resultados de una encuesta en la que se ha preguntado a los clientes de un supermercado si están de acuerdo en el cobro de una tasa por el uso de bolsas de plastico, tienen un orden natural (“escala de tipo Likert). Esto permite acumular observaciones, es decir, contar cuántas hay por debajo de un nivel, mediante el cálculo de las frecuencias acumuladas.
Figura 2: Tabla variable cualitativa ordinal
Como paso previo a la elaboración de la tabla, se crea un vector con los datos de la encuesta.
<- sample(c("1_Totalmente de acuerdo", "2_De acuerdo con matices","3_No estoy seguro","4_En desacuerdo con matices","5_Totalmente en desacuerdo"),
datos2 size = 100,
replace = TRUE,
prob=c(0.22,0.3,0.2,0.15,0.13))
El procedimiento de elaboración de este tipo de tabla es análogo al visto en el apartado anterior. Primero se crean los vectores que corresponden a las frecuencias absolutas y relativas, a las que se añadirán los vectores correspondientes a las frecuencias absolutas acumuladas y relativas acumuladas. Todos estos vectores se unirán finalmente en una única tabla.
table()
.<- table(datos2)
datos2_ni datos2_ni
cumsum()
a la tabla anterior. Estas
frecuencias acumuladas informan de cuántas veces hemos observado un dato
menor o igual que él.<- cumsum(table(datos2))
datos2_Ni datos2_Ni
prop.table()
a la tabla calculada previamente.<- prop.table(table(datos2))
datos2_fi datos2_fi
cumsum
a
prop.table
y a table
. Equivale a la fracción
del total de estudiantes que representa su frecuencia absoluta
acumulada.<- cumsum(prop.table(table(datos2)))
datos2_Fi datos2_Fi
Finalmente, podemos crear una única tabla juntando todos los vectores anteriores
<- cbind(datos2_ni,datos2_fi,datos2_Ni,datos2_Fi)
tabla2 View(tabla2)
Para mejorar la presentación de la tabla tabla2, conviene cambiar los nombres de las variables a otros más legibles.
colnames(tabla2) <- c("ni","fi","Ni","Fi")
View(tabla2)
Desafío
Calcula las frecuencias absolutas acumuladas y relativas acumuladas
de la variable barrio
del dataframe
zonas_verdes
, y crea una tabla denominada
tabla_barrios
añadiendo las frecuencias absoluta y
relativa. Cambia los nombres de las variables de la tabla a
Para tabular una variable cuantitativa sin agrupar los datos se calculan las frecuencias absolutas y absolutas acumuladas, como en las variables ordinales, puesto que podemos ordenarla siguiendo el orden natural de los números reales. Como ejemplo vamos a considerar la temperatura máxima diaria medida en el observatorio de Reinosa durante el mes de julio de 2023.
Figura 3: Tabla variable cuantitativa discreta
Los datos originales se crean como un vector:
<- c(32,31,28,29,33,32,31,30,31,31,27,28,29,30,32,31,31,30,30,29,29,30,30,31,30,31,34,33,33,29,29) datos3
A continuación se procede al cálculo de las diferentes frecuencias:
<- table(datos3) # Frecuencias absolutas
datos3_ni <- cumsum(table(datos3)) # Frecuencias absolutas acumuladas
datos3_Ni <- prop.table(table(datos3)) # Frecuencias relativas
datos3_fi <- cumsum(prop.table(table(datos3))) # Frecuencias relativas acumuladas datos3_Fi
Para crear una columna en la tabla con las etiquetas correspondientes a los valores originales procedemos de esta manera:
<- min(datos3)
datos3_min <- max(datos3)
datos3_max <- min(datos3):max(datos3) Valores_tem
A continuación se crea la tabla
<- cbind(Valores_tem, datos3_ni,datos3_fi,datos3_Ni,datos3_Fi) # Tabla con todas las frecuencias (4 columnas)
tabla3
colnames(tabla3) <- c("ni","fi","Ni","Fi")
View(tabla3)
Una vez realizado el ejemplo, o bien podemos borra todos los objetos que figuran en el Global Environment, o bien grabarlos como un
#rm(list=ls())
#save.image("tablas_frecuencias.RData")
Desafío
Crea una tabla que comprenda todos los elementos con la variable
parques
del dataframe zonas_verdes
.
Cuando el número de observaciones numéricas de una variable es muy elevado (variables cuantitativas discretas) o analizamos una variable cuantitativa continua es habitual agrupar el campo de variación en intervalos de clase. Cada clase o categoría no incluye un único valor sino un conjunto de valores (\(a_i\)).
Cada una de estas clases tiene dos límites de clase \(L_{i1}-L_i\) , el superior (\(L_{i1}\)) y el inferior (\(Li\)).
La diferencia entre ambos límites se conoce como intervalo de clase y cada clase está representada por un único valor o marca de clase \(x_i\)
El proceso para su elaboración es el siguiente:
Decidir el número de intervalos o categorías.
Calcular la amplitud de cada intervalo.
Obtener los extremos de los intervalos.
Establecer las marcas de clase.
Supongamos que el vector datos4
contiene una variable
continua que hemos redondeado en unidades enteras.
<- c(3,15,24,28,33,35,38,42,43,38,36,34,29,25,17,7,34,36,39,44,31,26,20,11,13,22,27,47,39,37,34,32,35,28,38,41,48,15,32,13) datos4
Figura 4: Tabla variable cuantitativa discreta
Podemos decidir el número de clases \(k\) de acuerdo a criterios subjetivos, o recurrir a procedimientos más objetivos para orientar la elección. Las más populares son las siguientes:
Regla de Nordcliffe o de la raíz cuadrada: \(k=\big\lceil \sqrt{n}\big\rceil\).
Regla de Sturges: \(k= \big\lceil 1+\log_{2}(n)\big\rceil.\)
Regla de Scott: Se determina primero la amplitud teórica \(A_S\) de las clases mediante la fórmula \[ A_S= 3.5\cdot \widetilde{s}\cdot n^{-\frac{1}{3}} \] (donde \(\widetilde{s}\) es la desviación típica del conjunto de datos), y entonces se toma \[ k=\left\lceil\frac{\max(x) -\min(x)}{A_S}\right\rceil. \]
Regla de Freedman-Diaconis: Se determina primero la amplitud teórica \(A_{FD}\) de las clases por medio de la fórmula \[ A_{FD}= 2 \cdot (Q_{0.75}-Q_{0.25}) \cdot n^{-\frac{1}{3}} \] (siendo \(Q_{0.75}-Q_{0.25}\) el rango intercuartílico), y entonces se toma de nuevo \[ k= \left\lceil \frac{\max(x) -\min(x)}{A_{FD}}\right\rceil.\]
Las dos primeras sólo dependen del número de casos \(n\), mientras que las dos últimas tienen en cuenta también su dispersión. No hay una regla mejor que las otras, es habitual la repetición del mismo procedimiento con métodos diferentes para poder revelar fenómenos diversos.
En primer lugar, implementaremos estos criterios manualmente; los
tres últimos también están implementadas en R a través de las funciones
nclass.Sturges()
, nclass.scott()
y
nclass.FD()
.
<- length(datos4)
N
<- ceiling(sqrt(N)) # Criterio de Norcliffe (raíz cuadrada)
norcliffe <- ceiling(1+log(N,2)) # Criterio de Sturgess
sturgess
# Criterio de Scott
<- 3.5*sd(datos4)*N^(-1/3) # Amplitud teórica
As <- ceiling(diff(range(datos4))/As)
scott
scott
# Criterio de Freedman-Diaconis
<- 2*(quantile(datos4,0.75, names = FALSE)-quantile(datos4,0.25,names = FALSE))*N^(-1/3)
Afd <- ceiling(diff(range(datos4))/Afd)
diaconis diaconis
nclass.Sturges(datos4)
nclass.scott(datos4)
nclass.FD(datos4)
El número de clases elegido será 6.
<- 6 k
Uno vez calculado el número de intervalos (\(k\)), podemos obtener su amplitud. Ello requiere a su vez calcular el rango (\(R\), que es la diferencia entre el valor más alto y el valor más bajo), y dividirlo posteriormente por el número de clases \(k\).
Figura 5: Cálculo de la amplitud de los intervalos clases
El rango se calcula anidando la función diff()
sobre la
función range()
(esta última proporciona el valor mínimo y
el valor máximo de nuestros datos).
range(datos4)
<- round(diff(range(datos4)) / k)
a a
Para ello necesitamos saber, inicialmente, el valor mínimo de los datos que manejamos.
<- min(datos4)-1/2
L1 L1
Posteriormente, se crearán 7 límites (que corresponden a 6 clases). Se pueden obtener mediante dos procedimientos:
(0:6)
y
posteriormente suma el límite inferior.<- L1 + a*(0:6)
L
L
<- L1 + a
L2 <- L2 + a
L3 <- L3 + a
L4 <- L4 + a
L5 <- L5 + a
L6 <- L6 + a
L7 <- c(L1,L2,L3,L4,L5,L6,L7)
Lbis
# Son los límites de clase Lbis
A partir de los límites de clase, podemos calcular la marca de cada clase (en realidad, el teórico punto medio).
Figura 6: Cálculo de la amplitud de los intervalos clases
Como en el caso anterior, podemos calcularlos a través de dos procedimientos.
(0:5)
y
posteriormente suma la primer marca.<- (L[1]+L[2])/2
X1 <- X1 + a*(0:5)
X X
<- (L[1]+L[2])/2
X1
X1<- X1 + a
X2 <- X2 + a
X3 <- X3 + a
X4 <- X4 + a
X5 <- X5 + a
X6 <- c(X1,X2,X3,X4,X5,X6)
X X
En realidad, hasta este momento, lo único que ha sido definido
realmente es el número de categorías o clases, y las etiquetas de esas
categorias, es decir, la columna encabezada por \(L_{i1}-Li\). En esta última, los límites
pueden aparecer precedidos o seguidos de un corchete []
o
de un paréntesis ())
.
Un corchete al principio (final) indica que el primer (último) número está incluido dentro de ese intervalo. Se considera entonces un intervalo cerrado.
Un paréntesis al principio (final) indica que el primer (último) número está excluido de ese intervalo. Se considera entonces un intervalo abierto.
Ejemplo:
(3,8)
no incluye ni el 3 ni el 8 (pero si 4, 5, 6,
7).
[3,8]
incluye el 3 y el 8, además de los
intermedios.
(3,8]
incluye al 8, pero no al 3 (está abierto por
el 3 y cerrado por el 8).
[3,8)
incluye al 3, pero no al 8 (está cerrado por
el 3 y abierto por el 8).
Figura 7: Intervalos abiertos o cerrados
Para rellenar el resto de columas de nuestra tabla es necesario
contar el número de veces que los valores originales caen dentro de cada
uno de las clases o categorías. Esta tarea la lleva a cabo la función
cut()
. Su sintaxis básica incluye los siguientes
argumentos:
Figura 8: Función cut()
Ejemplos:
<- cut(datos4,
particion breaks = L,
right = FALSE)
<- cut(datos4,
particion_2 breaks = 6,
right = FALSE)
<- cut(datos4,
particion_3 breaks = ceiling(sqrt(length(datos4))),
right = FALSE)
<- cut(datos4,
particion_4 breaks = L,
right = FALSE,
labels = c("Peq", "Norm", "Gran", "XGran", "Gigan","Monst")) # Podemos incluir etiquetas
<- cut(datos4,
particion_5 breaks = c(0,10,20,30,40,50),
right = FALSE,
labels = FALSE)
Se pueden comprobar las etiquetas correspondientes a cada una de esas
categorías, mediante la función levels()
aplicada al vector
particion_1. Igualmente, podemos verificar las marcas de clase.
<- levels(particion) # Etiquetas con los límites de clase
etiquetas
etiquetas
<- X # Etiquetas con las marcas de clase
marcas marcas
Al añadir a nuestra base de datos el vector generado por dicha función resulta en en un dataframe con 2 columnas, la primera con los datos originales y la segunda con la clase o categoría a la que pertenece.
<- cbind(datos4,particion)
datos4 datos4
Una vez obtenidas las etiquetas y las marcas de cada categoría, estamos en condiciones de crear la tabla de frecuencias sobre datos agrupados.
¡ATENCIÓN!: en este caso, las funciones
table()
y prop.table()
etc… no pueden
aplicarse directamente al factor particion; requiere su
transformación en vector.
Repetimos la secuencia de operaciones vista anteriormente.
<- as.vector(table(particion)) # Frecuencias absolutas
datos4_ni <- as.vector(prop.table(table(particion))) # Frecuencias relativas
datos4_fi
<- as.vector(cumsum(datos4_ni)) # Frecuencias absolutas acumuladas
datos4_Ni <- as.vector(cumsum(datos4_fi)) # Frecuencias relativas acumuladas
datos4_Fi
<- data.frame(etiquetas,
tabla4
marcas,
datos4_ni,
datos4_fi,
datos4_Ni,
datos4_Fi) tabla4
También podemos cambiar los nombres de las etiquetas de algunas columnas de nuestra tabla de frecuencias. A continuación se cambiarán los nombres de la 3ª a la 6ª columna.
colnames(tabla4)[3:6] <- c("ni", "fi", "Ni", "Fi")
tabla4
Si quisiéramos recuperar posteriormente esta información, convendría exportar todos los objetos (como imagen del entorno de trabajo)
save.image(file = "tablas_frecuencias.RData")
Desafío
Crea una tabla con la variable superficie
del dataframe
zonas_verdes
, comparando los procedimientos para la
obtención del número de clases.
A continuación, se deben salvar los cálculos realizados y posteriormente, eliminar todos los objetos para comenzar una nueva actividad
save.image("tablas_frecuencias.RData")
rm(list=ls())
De vez en cuando, también es conveniente limpiar la consola de órdenes previas.
cat("\014")
ACTIVIDADES DE EVALUACIÓN CONTINUA
Una vez concluida la explicación teórica, el alumnado procederá a elaborar los siguientes ejercicios