💡 Materiales para la actividad:

Datos.

Scripts.

INTRODUCCIÓN

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:

Componentes de una tabla de frecuencias

Las tablas de frecuencias están compuestas básicamente por los siguientes elementos:

  • La frecuencia absoluta \(n_i\). Consiste en contar 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 (variables cualitativas ordinales), 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.

Tipos de tablas de frecuencia

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:

TABLAS DE FRECUENCIA CON DATOS NO AGRUPADOS

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).

Variable cualitativa nominal.

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=TRUEes 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
Figura 1: Tabla variable cualitativa nominal
datos1 <- sample(c("María", "Pedro","Jaime"),       # Caracteres a reproducir 
                 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 (\(n_i\)) 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)
## datos1
## Jaime María Pedro 
##    15    55    30

La tabla de frecuencias relativas (\(f_i\)) 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))
## datos1
## Jaime María Pedro 
##  0.15  0.55  0.30

ATENCIÓN:

En caso de trabajar con un dataframe compuesto por diferentes variables (atributos) y no por vectores, en la función table() sustituye el nombre del vector por el de la variable, por ejemplo, table(df$var1)

Si convertimos esas tablas en vectores, podemos unirlos con la función cbind(), que puede visualizarse con View().

datos1_ni <- table(datos1)
datos1_fi <- prop.table(table(datos1))
tabla1 <- cbind(datos1_ni, datos1_fi)          
View(tabla1)

📝 ACTIVIDAD DE EVALUACIÓN CONTINUA TABLAS DE FRECUENCIA 1

  1. Carga el dataframe zonas_verdes.

  2. Calcula las frecuencias relativas y absolutas de la variable (atributo) barrio. Recuerda que para llamar a una variable concreta de un dataframe utilizamos la sintaxis nombre_dataframe$nombre_variable.

barrios_ni <- table(zonas_verdes$barrio)
barrios_fi <- prop.table(table(zonas_verdes$barrio))
  1. Crea una única tabla con ellas, denominada tabla_barrio.
tabla_barrios <- cbind(barrios_ni, barrios_fi) 
tabla_barrios
  1. Por último, responde a las siguientes preguntas.

Preguna 1: ¿Cuál es el barrio que posee más zonas verdes? ¿Cúal es su frecuencia relativa?

Preguna 2: ¿Cuál es el barrio que posee menos zonas verdes? ¿Cúal es su frecuencia relativa?

  1. Carga el dataframe alumnos_uc.

  2. Calcula las frecuencias relativas y absolutas de la variable grupo_sanguineo.

gs_ni <- table(alumnos_uc$grupo_sanguineo)
gs_fi <- prop.table(table(alumnos_uc$grupo_sanguineo))
  1. Crea una única tabla con ellas, denominada tabla_grupo_sanguineo.
tabla_grupo_sanguineo <- cbind(gs_ni, gs_fi) 
tabla_grupo_sanguineo

¿Cuál es el grupo sanguíneo con mayor número de personal? ¿Y el que tiene menos?

¿Cuántas personas tiene el grupo sanguíneo O-?

Variable cualitativa ordinal

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
Figura 2: Tabla variable cualitativa ordinal

Como paso previo a la elaboración de la tabla, se crea un vector con los datos (hipotéticos) de la encuesta.

datos2 <- sample(c("1_Totalmente de acuerdo", "2_De acuerdo con matices","3_No estoy seguro","4_En desacuerdo con matices","5_Totalmente en desacuerdo"), 
                 size = 100, 
                 replace = TRUE, 
                 prob=c(0.25,0.30,0.20,0.15,0.10))

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.

  • Las frecuencias absolutas (\(n_i\)):
datos2_ni <- table(datos2)
datos2_ni
## datos2
##     1_Totalmente de acuerdo    2_De acuerdo con matices 
##                          25                          25 
##           3_No estoy seguro 4_En desacuerdo con matices 
##                          23                          11 
##  5_Totalmente en desacuerdo 
##                          16
  • Las frecuencias absolutas acumuladas (\(N_i\)) se calculan anidando la función cumsum() a la tabla anterior. Estas frecuencias acumuladas informan de cuántas veces hemos observado un dato menor o igual que él.
datos2_Ni <- cumsum(table(datos2))                              
datos2_Ni
##     1_Totalmente de acuerdo    2_De acuerdo con matices 
##                          25                          50 
##           3_No estoy seguro 4_En desacuerdo con matices 
##                          73                          84 
##  5_Totalmente en desacuerdo 
##                         100
  • Las frecuencias relativas (\(f_i\)):
datos2_fi <- prop.table(table(datos2))                            
datos2_fi
## datos2
##     1_Totalmente de acuerdo    2_De acuerdo con matices 
##                        0.25                        0.25 
##           3_No estoy seguro 4_En desacuerdo con matices 
##                        0.23                        0.11 
##  5_Totalmente en desacuerdo 
##                        0.16
  • Finalmente, las frecuencias relativas acumuladas (\(F_i\)) se obtienen anidando la función cumsum a prop.tabley a table. Equivale a la fracción del total de estudiantes que representa su frecuencia absoluta acumulada.
datos2_Fi <- cumsum(prop.table(table(datos2)))                    
datos2_Fi
##     1_Totalmente de acuerdo    2_De acuerdo con matices 
##                        0.25                        0.50 
##           3_No estoy seguro 4_En desacuerdo con matices 
##                        0.73                        0.84 
##  5_Totalmente en desacuerdo 
##                        1.00

Finalmente, podemos crear una única tabla juntando todos los vectores anteriores

tabla2 <- cbind(datos2_ni,datos2_fi,datos2_Ni,datos2_Fi)          
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)

Variable cuantitativa

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
Figura 3: Tabla variable cuantitativa discreta

Los datos originales se crean como un vector:

datos3 <- 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)

A continuación se procede al cálculo de las diferentes frecuencias:

datos3_ni <- table(datos3)                                        # Frecuencias absolutas

datos3_Ni <- cumsum(table(datos3))                                # Frecuencias absolutas acumuladas

datos3_fi <- prop.table(table(datos3))                            # Frecuencias relativas 

datos3_Fi <- cumsum(prop.table(table(datos3)))                    # Frecuencias relativas acumuladas

Para crear una columna en la tabla con las etiquetas correspondientes a los valores originales procedemos de esta manera:

datos3_min <- min(datos3)

datos3_max <- max(datos3)

Valores_tem <- min(datos3):max(datos3)

A continuación se crea la tabla

tabla3 <- cbind(Valores_tem, datos3_ni,datos3_fi,datos3_Ni,datos3_Fi)          # Tabla con todas las frecuencias (4 columnas)

colnames(tabla3) <- c("tem", "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")

TABLAS DE FRECUENCIAS CON DATOS AGRUPADOS.

Cuando el número de observaciones numéricas de una variable es muy elevado (normalmente una variable cuantitativa continua) es habitual agrupar el campo de variación en intervalos de clase, clases o categorías. Cada uno no incluye un único valor sino un conjunto de valores (\(a_i\)).

El proceso para su elaboración es el siguiente:

Supongamos que el vector datos4 contiene una variable continua que hemos redondeado en unidades enteras.

datos4 <- 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)
Figura 4: Tabla variable cuantitativa continua
Figura 4: Tabla variable cuantitativa continua

Paso 1: elección del número de clases

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. Entre los más populares se encuentran los 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.\]

Los dos primeros métodos sólo dependen del número de casos \(n\), mientras que los dos últimos 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().

  • OPCIÓN 1: implementación manual
N <- length(datos4)                      

norcliffe <- ceiling(sqrt(N))                # Criterio de Norcliffe (raíz cuadrada)
sturgess <- ceiling(1+log(N,2))              # Criterio de Sturgess

# Criterio de Scott
As <- 3.5*sd(datos4)*N^(-1/3)                # Amplitud teórica
scott <- ceiling(diff(range(datos4))/As)
scott
## [1] 4
# Criterio de Freedman-Diaconis
Afd <- 2*(quantile(datos4,0.75, names = FALSE)-quantile(datos4,0.25,names = FALSE))*N^(-1/3) 
diaconis <- ceiling(diff(range(datos4))/Afd)
diaconis
## [1] 6
  • OPCIÓN 2: podemos comprobar la bondad de nuestros cálculos requiriendo a R las funciones correspondientes (puede haber ligeras diferencias en los resultados con respecto a los obtenidos manualmente).
nclass.Sturges(datos4)
## [1] 7
nclass.scott(datos4)
## [1] 4
nclass.FD(datos4)
## [1] 6

El número de clases elegido será 6.

k <- 6

Paso 2: Cálculo de la amplitud de los intervalos.

Uno vez calculado el número de intervalos (\(k\)), se debe calcular 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
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)
## [1]  3 48
a <- ceiling(diff(range(datos4)) / k)
a
## [1] 8

Paso 3: cálculo de los extremos de cada clase.

Para ello necesitamos saber, inicialmente, el valor mínimo de los datos que manejamos.

L1 <- min(datos4)-1/2                 
L1
## [1] 2.5

En el ejemplo que se está trabajando, deben crearse 7 límites (que corresponden a 6 clases). Se pueden obtener mediante dos procedimientos:

  • OPCIÓN 1: es el más recomendable. De forma iterativa multiplica la amplitud con cada una de las 7 límites (0:6) y posteriormente suma el límite inferior.
L <- L1 + a*(0:6)                     

L
## [1]  2.5 10.5 18.5 26.5 34.5 42.5 50.5
  • OPCIÓN 2: un ejemplo similar, desarrollado paso a paso.
L2 <- L1 + a
L3 <- L2 + a
L4 <- L3 + a
L5 <- L4 + a
L6 <- L5 + a
L7 <- L6 + a
Lbis <- c(L1,L2,L3,L4,L5,L6,L7)

Lbis                                             # Son los límites de clase
## [1]  2.5 10.5 18.5 26.5 34.5 42.5 50.5

Paso 4: Cálculo de las marcas de clase

A partir de los límites de clase, podemos calcular la marca de cada clase (el teórico punto medio).

Figura 6: Cálculo de la amplitud de los intervalos clases
Figura 6: Cálculo de la amplitud de los intervalos clases

Como en el caso anterior, podemos calcularlos a través de dos procedimientos.

  • OPCIÓN 1: de nuevo el más recomendable. El procedimiento se inicia calculando la primera marca, como valor medio de los límites inferior y superior de la primera clase, y posteriormente, de forma iterativa se multiplica la amplitud con cada una de las 6 clases (0:5) y posteriormente suma la primer marca.
X1 <- (L[1]+L[2])/2
X <- X1 + a*(0:5)                           
X
## [1]  6.5 14.5 22.5 30.5 38.5 46.5
  • OPCIÓN 2. Ejemplo desarrollado.
X1 <- (L[1]+L[2])/2
X1
## [1] 6.5
X2 <- X1 + a
X3 <- X2 + a
X4 <- X3 + a
X5 <- X4 + a
X6 <- X5 + a
X <- c(X1,X2,X3,X4,X5,X6)
X
## [1]  6.5 14.5 22.5 30.5 38.5 46.5

Paso 5: Recuento del número de valores dentro de cada clase o categoría.

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
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()
Figura 8: Función cut()

Ejemplos:

  • Partición en intervalos calculados a partir de los definidos en líneas anteriores.
particion <- cut(datos4, 
                   breaks = L, 
                   right = FALSE)
  • Partición en 6 categorías o intervalos (creados por el propio ordenador), cerrados por la izquierda y abiertos por la derecha
particion_2 <- cut(datos4, 
                   breaks = 6, 
                   right = FALSE)
  • Partición en intervalos incorporando directamente los resultados del criterio de Norcliffe (raíz cuadrada del número de casos).
particion_3 <- cut(datos4, 
                   breaks = ceiling(sqrt(length(datos4))), 
                   right = FALSE)
  • Partición en intervalos con etiquetas específicas.
particion_4  <- cut(datos4, 
                    breaks = L, 
                    right = FALSE, 
                    labels = c("Peq", "Norm", "Gran", "XGran", "Gigan","Monst")) # Podemos incluir etiquetas
  • Partición en intervalos creados por el propio investigador.
particion_5 <- cut(datos4, 
                   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.

etiquetas <- levels(particion)                                # Etiquetas con los límites de clase
etiquetas
## [1] "[2.5,10.5)"  "[10.5,18.5)" "[18.5,26.5)" "[26.5,34.5)" "[34.5,42.5)"
## [6] "[42.5,50.5)"
marcas <- X                                                     # Etiquetas con las marcas de clase
marcas
## [1]  6.5 14.5 22.5 30.5 38.5 46.5

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.

datos4 <- cbind(datos4,particion)                     
datos4
##       datos4 particion
##  [1,]      3         1
##  [2,]     15         2
##  [3,]     24         3
##  [4,]     28         4
##  [5,]     33         4
##  [6,]     35         5
##  [7,]     38         5
##  [8,]     42         5
##  [9,]     43         6
## [10,]     38         5
## [11,]     36         5
## [12,]     34         4
## [13,]     29         4
## [14,]     25         3
## [15,]     17         2
## [16,]      7         1
## [17,]     34         4
## [18,]     36         5
## [19,]     39         5
## [20,]     44         6
## [21,]     31         4
## [22,]     26         3
## [23,]     20         3
## [24,]     11         2
## [25,]     13         2
## [26,]     22         3
## [27,]     27         4
## [28,]     47         6
## [29,]     39         5
## [30,]     37         5
## [31,]     34         4
## [32,]     32         4
## [33,]     35         5
## [34,]     28         4
## [35,]     38         5
## [36,]     41         5
## [37,]     48         6
## [38,]     15         2
## [39,]     32         4
## [40,]     13         2

Paso 6: Creación de la tabla.

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.

datos4_ni <- as.vector(table(particion))                      # Frecuencias absolutas
datos4_fi <- as.vector(prop.table(table(particion)))          # Frecuencias relativas

datos4_Ni <- as.vector(cumsum(datos4_ni))                     # Frecuencias absolutas acumuladas
datos4_Fi <- as.vector(cumsum(datos4_fi))                     # Frecuencias relativas acumuladas

tabla4 <- data.frame(etiquetas, 
                     marcas, 
                     datos4_ni,
                     datos4_fi, 
                     datos4_Ni, 
                     datos4_Fi)  
tabla4
##     etiquetas marcas datos4_ni datos4_fi datos4_Ni datos4_Fi
## 1  [2.5,10.5)    6.5         2     0.050         2     0.050
## 2 [10.5,18.5)   14.5         6     0.150         8     0.200
## 3 [18.5,26.5)   22.5         5     0.125        13     0.325
## 4 [26.5,34.5)   30.5        11     0.275        24     0.600
## 5 [34.5,42.5)   38.5        12     0.300        36     0.900
## 6 [42.5,50.5)   46.5         4     0.100        40     1.000

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
##     etiquetas marcas ni    fi Ni    Fi
## 1  [2.5,10.5)    6.5  2 0.050  2 0.050
## 2 [10.5,18.5)   14.5  6 0.150  8 0.200
## 3 [18.5,26.5)   22.5  5 0.125 13 0.325
## 4 [26.5,34.5)   30.5 11 0.275 24 0.600
## 5 [34.5,42.5)   38.5 12 0.300 36 0.900
## 6 [42.5,50.5)   46.5  4 0.100 40 1.000

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")

📝 ACTIVIDAD DE EVALUACIÓN CONTINUA:

  1. Crea una tabla con la variable superficie del dataframe zonas_verdes, comparando al menos lo resultados de dos de los procedimientos para la obtención del número de clases comentados en clase.
sup_N <- length(zonas_verdes$superficie)                      

sup_norcliffe <- ceiling(sqrt(sup_N))                # Criterio de Norcliffe (raíz cuadrada)
sup_sturgess <- ceiling(1+log(sup_N,2))              # Criterio de Sturgess

# Criterio de Scott
sup_As <- 3.5*sd(zonas_verdes$superficie)*sup_N^(-1/3)                # Amplitud teórica
sup_scott <- ceiling(diff(range(zonas_verdes$superficie))/sup_As)
sup_scott

# Criterio de Freedman-Diaconis
sup_Afd <- 2*(quantile(zonas_verdes$superficie,0.75, names = FALSE)-quantile(zonas_verdes$superficie,0.25,names = FALSE))*sup_N^(-1/3) 
sup_diaconis <- ceiling(diff(range(zonas_verdes$superficie))/sup_Afd)
sup_diaconis

nclass.Sturges(zonas_verdes$superficie)
nclass.scott(zonas_verdes$superficie)
nclass.FD(zonas_verdes$superficie)
  1. Elabora un tabla de frecuencias de la variable superficie con la partición que consideres más adecuada.
sup_k <- 5

range(zonas_verdes$superficie)

sup_a <- round(diff(range(zonas_verdes$superficie)) / sup_k)
sup_a

sup_L1 <- min(zonas_verdes$superficie)-1/2                 
sup_L1

sup_L <- sup_L1 + sup_a*(0:5)                     
sup_L

sup_X1 <- (sup_L[1]+sup_L[2])/2
sup_X <- sup_X1 + sup_a*(0:4)                           
sup_X

sup_particion <- cut(zonas_verdes$superficie, 
                   breaks = sup_L, 
                   right = FALSE)

sup_etiquetas <- levels(sup_particion)                                # Etiquetas con los límites de clase
sup_etiquetas

sup_marcas <- sup_X                                                     # Etiquetas con las marcas de clase
sup_marcas

superficie <- cbind(zonas_verdes$superficie, sup_particion)                     
superficie

superficie_ni <- as.vector(table(sup_particion))                      # Frecuencias absolutas
superficie_fi <- as.vector(prop.table(table(sup_particion)))          # Frecuencias relativas

superficie_Ni <- as.vector(cumsum(superficie_ni))                       # Frecuencias absolutas acumuladas
superficie_Fi <- as.vector(cumsum(superficie_fi))                       # Frecuencias relativas acumuladas

tabla_sup <- data.frame(sup_etiquetas, 
                        sup_marcas, 
                        superficie_ni,
                        superficie_fi, 
                        superficie_Ni, 
                        superficie_Fi)  
tabla_sup

colnames(tabla_sup)[1:6] <- c("Rangos de superficie", "marcas", "ni", "fi", "Ni", "Fi")
tabla_sup
  1. Elabora sendas tablas de frecuencias para la variable peso correspondientes a los dos géneros, masculino y femenino, por separado. Compara los resultados y coméntalos brevemente.
masculino <- subset(alumnos_uc, genero == "Masculino", select = "peso")
femenino <- subset(alumnos_uc, genero == "Femenino", select = "peso")


nclass.Sturges(masculino$peso)
nclass.scott(masculino$peso)
nclass.FD(masculino$peso)

nclass.Sturges(femenino$peso)
nclass.scott(femenino$peso)
nclass.FD(femenino$peso)
  1. Ejercicio de elaboración de tablas estadísticas a partir de la información proporcionada por el fichero valle_cantabrico.

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")