Cuando no existían los ordenadores, o éstos eran mucho menos potentes que los actuales, un método para aligerar el cálculo de diferentes estadísticos sobre muestras de gran tamaño era agrupar los datos en categorías.
En realidad, es preferible siempre calcular los estadísticos a partir de los datos sin agrupar, puesto que al agruparlos perdemos información. No obstante, hay ocasiones en las que los datos se obtienen ya agrupados. En este tipo de situaciones, se pueden calcular los estadísticos y usarlos como aproximaciones a los que corresponderían a los datos “reales”.
La media \(\overline{x}\), la varianza \(s^2\), la varianza muestral \(\tilde{s}^2\), la desviación típica \(s\) y la desviación típica muestral \(\tilde{s}\) de un conjunto de datos agrupados se calculan con las mismas fórmulas que para los datos sin agrupar, excepto que sustituimos cada clase por su marca y la contamos con su frecuencia.
✅ EJEMPLO:
Supongamos los siguientes valores
ni <- c(1, 8, 10, 9, 8, 4, 2)
ni
## [1] 1 8 10 9 8 4 2
xi <- c(15+10*(0:5), 75)
xi
## [1] 15 25 35 45 55 65 75
Que son transformados en una tabla
xini <- as.table(xi * ni) # producto de xi por ni
xi2ni <- as.table(xi^2 * ni) # producto de xi al cuadrado por ni
A partir de ella pueden calcularse los siguientes estadísticos
total <- sum(ni)
total
## [1] 42
media <- sum(xini)/total
media
## [1] 43.33333
varianza <- sum(xi2ni)/total-media^2
varianza
## [1] 218.6508
desv.tipo <- sqrt(varianza)
desv.tipo
## [1] 14.78685
Despejaremos los valores anteriores
rm(desv.tipo, media, varianza, total, xini,xi2ni)
Si las aproximaciones a la mayoría de los estadísticos de tendencia central son relativamente fáciles de calcular, la moda, la mediana y los estadísticos de posición son algo más complicados. Se han planteado diferentes métodos.
Uno de los más sencillos es el siguiente, que requiere inicialmente añadir al dataframe original los límites de clase (al menos, cada límite inferior) y calcular y añadir las frecuencias relativas y frelativas acumuladas, y las frecuencias absolutas acumuladas.
En primer lugar, se reproducen los mismos límites de clase de la tabla utilizada como ejemplo.
a <- 10
L1 <- 10
Linf <- L1 + a*(0:6)
Lsup <- Linf + a
En segundo lugar, calcularemos las frecuencias relativas y relativas acumuladas, y las frecuencias absolutas acumuladas
Ni <- cumsum(ni)
fi <- ni/sum(ni)
Fi <- cumsum(fi)
Combinamos todos los elementos en una misma tabla en forma de data.frame
datos <- data.frame(Linf, Lsup, xi, ni, fi, Ni, Fi)
datos
## Linf Lsup xi ni fi Ni Fi
## 1 10 20 15 1 0.02380952 1 0.02380952
## 2 20 30 25 8 0.19047619 9 0.21428571
## 3 30 40 35 10 0.23809524 19 0.45238095
## 4 40 50 45 9 0.21428571 28 0.66666667
## 5 50 60 55 8 0.19047619 36 0.85714286
## 6 60 70 65 4 0.09523810 40 0.95238095
## 7 70 80 75 2 0.04761905 42 1.00000000
Por la misma razón que antes, eliminamos los vectores y nos quedaremos sólo con el dataframe.
rm(a, Linf, Lsup, L1, xi, ni, fi, Ni, Fi)
En lo que se refiere a la moda, se trabajará con el clase o intervalo modal, que es la clase con mayor frecuencia. La fórmula para el cálculo de la moda sobre datos agrupados es la siguiente:
\[ Mo=L_{i-1}+a_i\cdot \frac{n_{i+1}}{(n_{i-1} + n_{i+1})} \] donde:
\(L_{i-1}\): límite inferior de la clase modal.
\(n_i\): número de casos de la clase modal.
\(ni_{-1}\): número de casos de la clase inmediatamente inferior a la modal
\(ni_{+1}\): número de casos de la inmediatamente posterior a la modal
\(a_i\): amplitud de la clases.
Por lo tanto, es básico determinar cuál es dicha clase modal. Para ello aplicaremos la siguiente sintaxis:
clase_modal <- datos[which(datos$ni==max(datos$ni)), ]
clase_modal
## Linf Lsup xi ni fi Ni Fi
## 3 30 40 35 10 0.2380952 19 0.452381
A continuación, extraeremos de esa clase modal el límite inferior de la clase y el númeor de casos de esa clase modal.
Li <- clase_modal$Linf # límite inferior de la clase modal.
ni <- clase_modal$ni # ni número de casos de la clase modal.
Por último, extraeremos el número de casos de las clases inmediatamente anterior y posterior a la modal, así como la amplitud. Para ello, primero debemos saber qué filas de nuestros datos corresponden a esas clases.
ni_menos1 <- datos[2,4] # número de casos de la clase inmediatamente inferior a la modal
ni_mas1 <- datos[4,4] # número de casos de la clase inmediatamente posterior a la modal
ai <- datos$Lsup[1] - datos$Linf[1]
El resultado final es:
moda_agrupados <- Li + (ni/(ni_mas1+ni_menos1)) * ai
moda_agrupados
## [1] 35.88235
Para la obtención de la mediana sobre datos agrupados es necesario conocer previamente cuál es la clase mediana, es decir, la clase mediana es la clase o intervalo que contiene el valor del medio de todos los datos ordenados de menor a mayor.
La clase mediana se encuentra en el intervalo cuya frecuencia absoluta acumulada es inmediatamente superior al número obtenido con la siguiente fórmula:
\[ \frac{n+1}{2} \]
Donde \(N\) es el número total de datos.
Otra manera de definir la clase mediana es el primer intervalo donde la frecuencia relativa acumulada \(F_i\) sea mayor o igual a \(0.5\).
La fórmula para obtener una aproximación \(Me\) para la mediana a partir de los datos agrupados es la siguiente:
\[ Me=L_i+A_i\cdot \frac{\frac{N}{2} - N_{i-1}}{n_i} \] En la que:
\(L_i\) es el límite inferior del intervalo crítico para la mediana.
\(A_i\) es la amplitud.
\(\frac{N}{2}\) o clase mediana.
\(N_{i-1}\) es la frecuencia absoluta acumulada del intervalo anterior al crítico (si el intervalo crítico es el primero, tomamos \(N_{i-1}=0\)).
\(n_i\) es la frecuencia absoluta del intervalo crítico.
Iniciamos el cálculo con la obtención de la clase mediana
clase_mediana <- datos[which(datos$Fi>=0.5), ]
clase_mediana
## Linf Lsup xi ni fi Ni Fi
## 4 40 50 45 9 0.21428571 28 0.6666667
## 5 50 60 55 8 0.19047619 36 0.8571429
## 6 60 70 65 4 0.09523810 40 0.9523810
## 7 70 80 75 2 0.04761905 42 1.0000000
Dado que el intervalo crítico corresponde a la fila 4, a continuación, extraeremos el límite inferior de esa clase y el número de casos de esa clase mediana.
Li_clase_mediana <- clase_mediana[1,1] # límite inferior de la clase modal.
ni_clase_mediana <- clase_mediana[1,4] # ni número de casos de la clase modal.
Igualmente, extraeremos el número de casos de las clases inmediatamente anterior y posterior a la modal, así como la amplitud. Para ello, primero debemos saber qué filas de nuestros datos corresponden a esas clases.
Ni_clase_mediana_anterior <- datos[3,6] # número de casos de la clase inmediatamente inferior a la modal
n <- sum(datos$ni)
ai <- datos$Lsup[1] - datos$Linf[1]
N <- sum(ni)
El resultado final es:
mediana_agrupados <- Li_clase_mediana + ai * ((N/2 - Ni_clase_mediana_anterior)/n)
Un ejemplo clásico de información recibida en forma de categorías son
los datos de población con los que se elaboran las pirámides de edades.
Vamos a usar unos datos agrupados para calcular algunos estadísticos de
la distribución de la población española por edades. El fichero original
contiene dos columnas: una con los grupos de edad y otra con el volumen
de la población. Se importará como un data frame con la función
read.csv
(también se podría con la función
read.table
con header=TRUE
y
sep=","
).
datos <- read.csv("https://raw.githubusercontent.com/AprendeR-UIB/AprendeR1/master/datos/cens81.csv",
stringsAsFactors=FALSE, # Son simplemente etiquetas, por lo que las importamos como caracteres, no como factor.
encoding="UTF-8") # Garantiza que las "ñ" de las etiquetas ("años") se importan de manera correcta .
str(datos)
## 'data.frame': 18 obs. of 2 variables:
## $ Edades : chr "De 0 a 4 años" "De 5 a 9 años" "De 10 a 14 años" "De 15 a 19 años" ...
## $ Población: int 3075352 3308049 3302328 3263312 2942178 2537428 2455314 2245806 2056009 2361225 ...
datos
## Edades Población
## 1 De 0 a 4 años 3075352
## 2 De 5 a 9 años 3308049
## 3 De 10 a 14 años 3302328
## 4 De 15 a 19 años 3263312
## 5 De 20 a 24 años 2942178
## 6 De 25 a 29 años 2537428
## 7 De 30 a 34 años 2455314
## 8 De 35 a 39 años 2245806
## 9 De 40 a 44 años 2056009
## 10 De 45 a 49 años 2361225
## 11 De 50 a 54 años 2265091
## 12 De 55 a 59 años 2038002
## 13 De 60 a 64 años 1596543
## 14 De 65 a 69 años 1445606
## 15 De 70 a 74 años 1213807
## 16 De 75 a 79 años 852180
## 17 De 80 a 84 años 461960
## 18 De 85 y más años 263171
Siguiendo el esquema visto anteriormente, cada grupo de edades debe tener asignado un valor numérico como marca de clase.Por ejemplo, la clase “De 0 a 4 años” representa el intervalo de edades [0,5), la clase “De 5 a 9 años” representa el intervalo de edades [5,10), y así sucesivamente; esta amplitud de 5 años se rompe a partir de la clase 85 y más. Por eso, para los grupos de edad inferiores a 84 años, tomaremos como marca de clase el punto medio de sus límites, mientras que para el último, de amplitud indeterminada, tomaremos 90 como marca. Estas marcas de clase se añadirán al data frame como una nueva variable.
datos$marcas <- c(2.5+5*(0:16),90)
head(datos)
## Edades Población marcas
## 1 De 0 a 4 años 3075352 2.5
## 2 De 5 a 9 años 3308049 7.5
## 3 De 10 a 14 años 3302328 12.5
## 4 De 15 a 19 años 3263312 17.5
## 5 De 20 a 24 años 2942178 22.5
## 6 De 25 a 29 años 2537428 27.5
Una vez realizado esto, podemos calcular diferents estadísticos:
Total <- sum(datos$Población) # Población total
Total
## [1] 37683361
Edad.media <- sum(datos$Población*datos$marcas)/Total # Edad media
Edad.media
## [1] 33.95994
Edad.varianza <- sum(datos$Población*datos$marcas^2)/Total-Edad.media^2 # Varianza
Edad.varianza
## [1] 505.2943
Edad.desv.tip <- sqrt(Edad.varianza) # Desviación típica
Edad.desv.tip
## [1] 22.47875
📝 ACTIVIDAD DE EVALUACIÓN CONTINUA: CÁLCULO DE UNA PIRÁMIDE DE EDADES:
El fichero piramide_edades.csv
recoge el número de
habitantes de una serie de países del mundo con diferentes estructuras
de edades. Importa dicho fichero, elige un país y contesta a las
siguientes preguntas
¿cuál es la edad media de la población de ese país?
Qué grupo de población era el más numeroso?
Recodifica los grupos de edad en 3 categorías (jóvenes, hasta los 14 años, adultos desde 15 a 64, y ancianos desde 64) y calcula los porcentajes que representan cada uno respecto del total.
url <- "https://personales.unican.es/rasillad/docencia/G2040/TEMA_5/piramide_edades.csv"
piramide <- read.csv2(url)
str(piramide)
## 'data.frame': 18 obs. of 18 variables:
## $ Edades : chr "de 0 a 4" "de 5 a 9 " "de 10 a 14" "de 15 a 19" ...
## $ Angola : int 4998148 4160174 3038173 2510436 2174501 1945050 1503520 1382959 1050085 864904 ...
## $ Turquia : int 6584822 6756617 6878656 7209475 6690146 5895255 5009655 4854387 4068756 3368769 ...
## $ Argentina: int 3698813 3756437 3622606 3506737 3523049 3562951 3383352 3165656 3110884 2751947 ...
## $ Iran : int 7093004 6411277 5688384 5458997 6392879 8201133 8600913 7037598 5518307 4833123 ...
## $ Italia : int 2216510 2578340 2841695 2857013 2957340 3045579 3226146 3483252 4008570 4692501 ...
## $ Japon : int 4421000 5063000 5365000 5635000 6294000 6381000 6595000 7398000 8244000 9778000 ...
## $ Mejico : int 10047365 10764379 10943540 10806690 10422095 9993001 9420827 9020276 8503586 7942413 ...
## $ Niger : int 3696791 2995004 2163813 1727779 1320316 1070992 897561 729784 582219 499732 ...
## $ Pakistan : int 29162990 30026318 24527188 21366618 18495895 16401132 14151748 12048811 9627067 7931616 ...
## $ España : int 1926253 2294531 2538530 2438311 2392743 2531860 2745595 3196425 3884754 3932053 ...
## $ Bhutan : int 57474 62991 68952 68286 75415 79280 65180 55549 41495 35533 ...
## $ Oman : int 443159 420331 322518 252455 304937 532384 611673 515018 367669 241658 ...
## $ Australia: int 1464779 1502646 1397183 1421595 1566793 1664602 1703847 1561679 1583257 1581455 ...
## $ Colombia : int 3037781 3335240 3610584 3852255 3940288 3692174 3350529 3216644 2744664 2646101 ...
## $ Vietnam : int 7819326 8332719 7219837 6506217 6675703 8447977 8393810 7692386 6684119 6257471 ...
## $ Indonesia: int 22072497 22094355 22195880 22312590 22682370 22355975 21904549 20910927 19943111 18022497 ...
## $ Egipto : int 12901574 10514520 9030546 9006058 8231944 8167607 7344289 6486415 5152723 4392511 ...
población
.egipto <- subset(piramide,
select = "EGIPTO") # Variables seleccionadas: desde estudios a grupo
names(egipto)[3] <- "poblacion"
piramide$marcas <- c(2.5+5*(0:16),90)
poblacion_total_egipto <- sum(egipto$poblacion) # Población total
edad_media_egipto <- sum(egipto$poblacion * egipto$marcas)/poblacion_total_egipto # Edad media
int_modal_egipto <- egipto$GRUPOS[which(egipto$poblacion==max(egipto$poblacion))] # Intervalo modal
población
en 3 grupos de
edad:egipto$categoria[egipto$marcas >= 67.5] <- "ancianos"
egipto$categoria[egipto$marcas >= 17.5 & egipto$marcas <= 62.5] <- "adultos"
egipto$categoria[egipto$marcas <= 12.5] <- "jovenes"
totales_grupos_edad_egipto <- aggregate(poblacion ~ categoria,
data = egipto,
FUN = sum)
totales_grupos_edad_egipto$ratio <- totales_grupos_edad_egipto$poblacion / poblacion_total_egipto * 100
Si las aproximaciones a la mayoría de los estadísticos de tendencia central son relativamente fáciles de calcular, la mediana y los de posición son algo más complicados. Se han planteado diferentes métodos. Uno de los más sencillos es el siguiente, que requiere inicialmente calcular las frecuencias absolutas acumuladas, relativas y relativas acumuladas, añadiéndolas al dataframe original.
Int_modal <- datos$Edades[which(datos$Población==max(datos$Población))] # Intervalo modal
Int_modal
datos$FA_acum <- cumsum(datos$Población)
datos$FR <- round(datos$Población/Total, 3)
datos$FR_acum <- round(datos$FA_acum/Total, 3)
datos
La fórmula para obtener una aproximación \(M\) para la mediana de los datos “reales” a partir de los datos agrupados es la siguiente: \[ M=L_{i}+A_i\cdot \frac{\frac{N}{2}- N_{i-1}}{n_i}. \] En la que
\(L_i\) es el intervalo crítico para la mediana, el primer intervalo donde la frecuencia relativa acumulada es igual o mayor que 0.5. En este caso, el intervalo crítico es la clase “De 30 a 34 años”, es decir, \([30,35)\).
\(N_{i-1}\), la frecuencia absoluta acumulada del intervalo anterior al crítico (si el intervalo crítico es el primero, tomamos \(N_{i-1}=0\)).
\(n_i\), la frecuencia absoluta del intervalo crítico.
\(A_i\), su amplitud.
\(N\), el número total de datos.
En nuestro ejemplo, \(N=37683361\), \(L_i=30\), \(A_i=5\), \(N_{i-1}=18428647\) y \(n_i=2455314\), por lo que \[ M=30+5\cdot\frac{0.5\cdot 37683361-18428647}{2455314}= 30.8411. \]
Este método también permite aproximar el cuantil \(Q_p\) de los datos “reales” a partir de los datos agrupados con la fórmula siguiente: \[ C_k=L_i+A_i\cdot \frac{\frac{k\cdot N}{4}- N_{i-1}}{n_i}. \]
donde ahora el intervalo crítico es ahora el primer intervalo con frecuencia relativa acumulada mayor o igual que \(p\) y el resto de valores se definen relativos a este intervalo crítico.
De este modo, en nuestro ejemplo, el intervalo crítico para \(Q_{0.25}\) es “De 10 a 14 años”, y en este caso \(L_i}=10\), \(A_i=5\), \(N_{i-1}=6383401\) y \(n_i=3302328\), por lo que \[ Q_{0.25}=10+5\cdot\frac{0.25\cdot 37683361-6383401}{3302328}= 14.6. \] En cuanto al tercer cuantil, \(Q_{0.75}\), el intervalo crítico es “De 50 a 54 años”, por lo que \(L_i=50\), \(A_i=5\), \(N_{i-1}=27547001\) y \(n_i=2265091\), y, por consiguiente, \[ Q_{0.75}=50+5\cdot\frac{0.75\cdot 37683361-27547001}{2265091}=51.58. \]