Este documento trabaja sobre un conjunto de 50 edades. El primer paso es agruparlas en intervalos aplicando la Regla de Sturges; de ahí en adelante, cada resultado numérico se traduce en un gráfico distinto —histograma, polígono, curva acumulada y las tres ojivas—, siguiendo el recorrido habitual del análisis exploratorio de una variable cuantitativa. Debajo de cada figura hay dos comentarios cortos: uno explica para qué sirve ese tipo de gráfico en general, y el otro señala qué es lo particular que muestra con estos 50 datos.

1 Datos y estadística descriptiva

1.1 Datos

tabla_9A <- c(38, 15, 10, 12, 62, 46, 25, 56, 27, 24, 23, 21,
              20, 25, 38, 27, 48, 35, 50, 65, 59, 58, 47, 42, 37, 35,
              32, 40, 28, 14, 12, 24, 66, 73, 72, 70, 68, 65, 54, 48,
              34, 33, 21, 19, 61, 59, 47, 46, 30, 30)
tabla_9A
##  [1] 38 15 10 12 62 46 25 56 27 24 23 21 20 25 38 27 48 35 50 65 59 58 47 42 37
## [26] 35 32 40 28 14 12 24 66 73 72 70 68 65 54 48 34 33 21 19 61 59 47 46 30 30

1.2 Medidas de resumen

summary(tabla_9A)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   10.00   25.00   37.50   39.82   55.50   73.00

summary() entrega de un solo golpe cinco números clave: el valor más bajo, los dos cuartiles extremos, la mediana, el promedio y el valor más alto. Con eso basta para hacerse una idea inicial de dónde está el centro de los datos y qué tan repartidos están, antes de dibujar nada.

Aquí el promedio (39.82) y la mediana (37.5) quedan casi pegados el uno al otro. Eso normalmente es buena señal de que no hay valores extremos jalando el promedio hacia un lado, y apunta a una distribución más o menos simétrica. Además, la mitad de las personas del grupo tiene una edad entre 25 y 55.5 años.

1.3 Tabla de frecuencias individuales

tabla_9 <- freq(tabla_9A)
tabla_9
## Frequencies  
## tabla_9A  
## Type: Numeric  
## 
##               Freq   % Valid   % Valid Cum.   % Total   % Total Cum.
## ----------- ------ --------- -------------- --------- --------------
##          10      1      2.00           2.00      2.00           2.00
##          12      2      4.00           6.00      4.00           6.00
##          14      1      2.00           8.00      2.00           8.00
##          15      1      2.00          10.00      2.00          10.00
##          19      1      2.00          12.00      2.00          12.00
##          20      1      2.00          14.00      2.00          14.00
##          21      2      4.00          18.00      4.00          18.00
##          23      1      2.00          20.00      2.00          20.00
##          24      2      4.00          24.00      4.00          24.00
##          25      2      4.00          28.00      4.00          28.00
##          27      2      4.00          32.00      4.00          32.00
##          28      1      2.00          34.00      2.00          34.00
##          30      2      4.00          38.00      4.00          38.00
##          32      1      2.00          40.00      2.00          40.00
##          33      1      2.00          42.00      2.00          42.00
##          34      1      2.00          44.00      2.00          44.00
##          35      2      4.00          48.00      4.00          48.00
##          37      1      2.00          50.00      2.00          50.00
##          38      2      4.00          54.00      4.00          54.00
##          40      1      2.00          56.00      2.00          56.00
##          42      1      2.00          58.00      2.00          58.00
##          46      2      4.00          62.00      4.00          62.00
##          47      2      4.00          66.00      4.00          66.00
##          48      2      4.00          70.00      4.00          70.00
##          50      1      2.00          72.00      2.00          72.00
##          54      1      2.00          74.00      2.00          74.00
##          56      1      2.00          76.00      2.00          76.00
##          58      1      2.00          78.00      2.00          78.00
##          59      2      4.00          82.00      4.00          82.00
##          61      1      2.00          84.00      2.00          84.00
##          62      1      2.00          86.00      2.00          86.00
##          65      2      4.00          90.00      4.00          90.00
##          66      1      2.00          92.00      2.00          92.00
##          68      1      2.00          94.00      2.00          94.00
##          70      1      2.00          96.00      2.00          96.00
##          72      1      2.00          98.00      2.00          98.00
##          73      1      2.00         100.00      2.00         100.00
##        <NA>      0                               0.00         100.00
##       Total     50    100.00         100.00    100.00         100.00

Antes de agrupar nada, conviene revisar cuántas veces se repite cada edad exacta. Es un chequeo rápido que permite detectar a tiempo algún dato mal digitado o algún valor que se sale demasiado del resto.

En este caso el rango va de 10 a 73 años, y casi ningún valor se repite más de una o dos veces. El resultado es una tabla larga que, mirada así, dice poco. Justamente por eso el siguiente paso lógico es construirla por intervalos en lugar de valor por valor.

1.4 Regla de Sturges

n <- length(tabla_9A)
k <- 1 + 3.322 * log10(n)           # número de clases
R <- max(tabla_9A) - min(tabla_9A)  # rango
W <- R / round(k)                   # ancho de clase

data.frame(
  n = n,
  k_calculado = round(k, 2),
  k_usado = round(k),
  Rango = R,
  Ancho_clase = round(W, 2)
)

Esta fórmula responde a una pregunta muy práctica: ¿en cuántos grupos conviene partir los datos? Pocos intervalos aplanan la distribución y esconden su forma real; demasiados la fragmentan y el gráfico pierde sentido.

Aplicándola a las 50 edades, sale 6.64, que se redondea a 7 clases. Sabiendo que el rango total es de 63 años, cada clase queda con un ancho aproximado de 9 años.

2 Distribución agrupada

2.1 Histograma

h <- graph.freq(tabla_9A, col = "#C4B5FD", border = "white",
                xlab = "Edad (años)", ylab = "Frecuencia",
                main = "Distribución de edades (Regla de Sturges)")

El histograma es el gráfico que deja ver de un vistazo cómo se comporta toda la distribución: dónde se amontonan más datos, si hay un solo pico o varios, y si la figura es simétrica o se inclina hacia un lado. Las barras van pegadas porque, aunque los datos se agruparon, la variable de fondo (edad) sigue siendo continua.

Aquí sobresale la clase [19 – 28), con 11 personas, un 22 % del total. El resto de las barras se mantiene entre 5 y 8 casos cada una, sin diferencias muy marcadas entre sí. En pocas palabras: las edades no se concentran en un único punto, sino que están repartidas de forma bastante pareja en todo el rango.

2.2 Tabla de frecuencias agrupadas

summary(h)

Esta tabla es, en el fondo, el resumen numérico detrás del histograma: por cada clase entrega su marca de clase, cuántos casos caen ahí, qué porcentaje representan y cuántos llevan acumulados hasta ese punto. Todo lo que viene después parte de estos números.

Con siete clases que cubren de 10 a 73 años, la columna acumulada resuelve preguntas rápidas casi de inmediato: por ejemplo, para saber cuántas personas tienen menos de 46 años, la respuesta ya está ahí —29 de las 50—.

2.3 Diagrama de caja y bigotes

boxplot(tabla_9A, horizontal = TRUE, col = "#C4B5FD", border = morado,
        xlab = "Edad (años)",
        main = "Diagrama de caja y bigotes")

El diagrama de caja resume en una sola imagen tres cosas a la vez: dónde está el centro de los datos, qué tan dispersos están y si hay simetría. Es además la forma más rápida de detectar valores atípicos, que aparecerían como puntos sueltos fuera de los bigotes.

La mediana cae casi exactamente en el centro de la caja, y los dos bigotes tienen un largo muy similar entre sí. Eso coincide con lo que ya había mostrado el resumen numérico: una distribución simétrica. Tampoco se ve ningún punto fuera de los bigotes, así que no hay valores atípicos que resaltar.

3 Polígonos de frecuencia

3.1 Construcción manual

x <- c(14.5, 23.5, 32.5, 41.5, 50.5, 59.5, 68.5)   # marcas de clase
y <- c(5, 11, 8, 5, 8, 6, 7)                        # frecuencias absolutas

plot(x, y, type = "p", pch = 19, col = morado, cex = 1.3,
     xlab = "Marca de clase (edad)", ylab = expression(f[i]),
     main = "Polígono de frecuencias (construcción manual)",
     xaxt = "n", yaxt = "n")
axis(side = 1, x)
axis(side = 2, y, las = 2)
lines(x, y, col = turquesa, lwd = 2)
grid(col = "#F3E8FF")

Al conectar cada marca de clase con una línea se obtiene una versión “suavizada” del histograma, que hace más fácil seguir la tendencia de la distribución. Es particularmente útil cuando se quieren comparar dos o más distribuciones en el mismo gráfico, algo que con barras normalmente se ve saturado.

La línea sube hasta un pico claro en la marca 23.5, correspondiente a la clase [19 – 28), baja hasta la marca 41.5 y de ahí en adelante sube y baja sin seguir un patrón fijo. Esto refuerza algo que ya se venía notando: las edades no se agrupan en un solo lugar, sino que están repartidas en varios grupos de tamaño parecido.

3.2 Sobre el histograma — frecuencias absolutas

plot(h, col = "#EDE9FE", border = "white", frequency = 1,
     xlab = "Edad (años)", ylab = "Frecuencia",
     main = "Histograma y polígono de frecuencias absolutas")
polygon.freq(h, col = naranja, frequency = 1, lwd = 2.5)

Combinar las barras con la línea del polígono en un mismo gráfico permite leer dos cosas simultáneamente: el conteo exacto por clase y hacia dónde se mueve la tendencia general, sin tener que elegir entre uno u otro gráfico.

La línea confirma que el pico está en la segunda clase, pero también deja ver algo que el histograma solo no mostraba tan claro: la caída que sigue no es constante, porque entre los 46 y los 55 años la frecuencia repunta de nuevo.

3.3 Sobre el histograma — frecuencias relativas

plot(h, col = "#EDE9FE", border = "white", frequency = 2,
     xlab = "Edad (años)", ylab = "Frecuencia relativa (%)",
     main = "Histograma y polígono de frecuencias relativas")
polygon.freq(h, col = naranja, frequency = 2, lwd = 2.5)

Este gráfico repite exactamente la lógica anterior, solo que cambiando el eje vertical a porcentajes. La ventaja es que así se puede comparar este grupo de 50 personas con cualquier otro grupo, sin importar cuántos datos tenga.

La silueta del gráfico es idéntica a la anterior; lo único que cambia es la escala. En términos porcentuales, la clase más numerosa concentra el 22 % de las personas, y ninguna clase queda por debajo del 10 %.

4 Frecuencias acumuladas y ojivas

4.1 Estructura del objeto h

names(h)
## [1] "breaks"   "counts"   "mids"     "relative" "density"

Antes de seguir construyendo tablas, conviene revisar qué guarda por dentro el objeto h que devolvió graph.freq(). Así, en los pasos siguientes se pueden sacar las frecuencias directamente de ahí en lugar de volver a calcularlas a mano.

4.2 Histograma de frecuencias acumuladas

tabla_freq <- table.freq(h)
tabla_freq
barplot(tabla_freq$CF, names.arg = round(tabla_freq$Upper, 1),
        col = "#5EEAD4", border = "white",
        xlab = "Edad (años)", ylab = "Frecuencia acumulada",
        main = "Histograma de frecuencias acumuladas")
grid(nx = NA, ny = NULL, col = "#F3E8FF")

Cada barra ya no representa el conteo de una clase por separado, sino el total acumulado hasta ese límite. Este tipo de gráfico responde directamente preguntas como “¿cuántos casos hay por debajo de tal edad?”.

El crecimiento pasa de 5 a 50 de manera gradual y sin saltos bruscos entre una barra y la siguiente, lo que confirma que no hay una sola clase que concentre el grueso de la distribución. Hacia los 46 años ya se ha acumulado el 58 % del grupo.

4.3 Cálculos de las ojivas

fr_por_clase    <- tabla_freq$Frequency
total_n         <- sum(fr_por_clase)
fr_relativos    <- fr_por_clase / total_n
fr_porcentuales <- 100 * fr_relativos

data.frame(
  Clase           = round(tabla_freq$Upper, 1),
  Frecuencia      = fr_por_clase,
  Frec_relativa   = round(fr_relativos, 2),
  Frec_porcentual = round(fr_porcentuales, 1),
  Acumulada       = cumsum(fr_por_clase),
  Acum_relativa   = round(cumsum(fr_relativos), 2),
  Acum_porcentual = round(cumsum(fr_porcentuales), 1)
)

Este bloque de código arma, en una sola tabla, las tres formas en que se puede expresar la frecuencia acumulada —en número de casos, en proporción y en porcentaje—. Es la tabla que da origen a cada una de las tres ojivas que vienen a continuación.

Basta con mirar el final de las tres columnas acumuladas: cierran en 50, en 1.00 y en 100 % respectivamente. Ese cierre exacto es la prueba de que ninguna observación se quedó por fuera de las clases definidas.

4.4 Ojiva manual (frecuencia porcentual)

x2 <- c(14.5, 23.5, 32.5, 41.5, 50.5, 59.5, 68.5)
y2 <- c(10, 32, 48, 58, 74, 86, 100)

plot(x2, y2, type = "b", pch = 19, col = morado, lwd = 2, cex = 1.2,
     xlab = "Marca de clase (edad)", ylab = "Frecuencia acumulada (%)",
     main = "Ojiva porcentual con lectura de percentil")
segments(50.5, -14.5, 50.5, 74, lty = 2, col = naranja, lwd = 2)
segments(0, 74, 50.5, 74, lty = 2, col = naranja, lwd = 2)
grid(col = "#F3E8FF")

La ojiva no es más que la tabla acumulada dibujada como curva. Su gracia está en que permite leer percentiles gráficamente: se ubica un valor en un eje, se sube hasta la curva y se lee el resultado en el otro eje.

Siguiendo las líneas punteadas del gráfico: entrando por los 50.5 años, la curva lleva hasta un acumulado del 74 %. Dicho de otra forma, cerca de tres de cada cuatro personas del grupo tienen 50 años o menos.

4.5 Ojiva de frecuencias absolutas

p1 <- cumsum(fr_por_clase)
plot(p1, type = "b", pch = 19, col = morado, lwd = 2, cex = 1.2,
     xlab = "Número de clase", ylab = "Frecuencia acumulada",
     main = "Ojiva - frecuencias absolutas")
text(seq_along(p1), p1, labels = p1, pos = 3, cex = 0.85, col = morado)
grid(col = "#F3E8FF")

Aquí se grafica directamente el número de casos acumulados, clase tras clase. Es la opción más natural cuando lo que importa es la cantidad de personas y no qué proporción representan.

El avance de 5 a 50 es prácticamente lineal. Donde sí se nota un cambio de ritmo es entre la primera y la segunda clase, saltando de 5 a 16 casos —ahí es donde entra en juego la clase con más personas—.

4.6 Ojiva de frecuencias relativas

p2 <- cumsum(fr_relativos)
plot(p2, type = "b", pch = 19, col = turquesa, lwd = 2, cex = 1.2,
     xlab = "Número de clase", ylab = "Frecuencia relativa acumulada",
     main = "Ojiva - frecuencias relativas")
text(seq_along(p2), p2, labels = round(p2, 2), pos = 3, cex = 0.85, col = turquesa)
grid(col = "#F3E8FF")

Se trata de la misma curva anterior, pero reescalada a proporciones entre 0 y 1. Al quitar de en medio el tamaño de la muestra, esta versión sí sirve para comparar contra distribuciones de otro tamaño.

La curva cierra exactamente en 1.00, como debía ser. Vale la pena fijarse en la cuarta clase, donde el acumulado ya marca 0.58: para ese punto, algo más de la mitad del grupo tenía 46 años o menos.

4.7 Ojiva de frecuencias porcentuales

p3 <- cumsum(fr_porcentuales)
plot(p3, type = "b", pch = 19, col = naranja, lwd = 2, cex = 1.2,
     xlab = "Número de clase", ylab = "Frecuencia acumulada (%)",
     main = "Ojiva - frecuencias porcentuales")
text(seq_along(p3), p3, labels = round(p3), pos = 3, cex = 0.85, col = "#C2410C")
grid(col = "#F3E8FF")

De las tres versiones de la ojiva, esta en porcentaje suele ser la más práctica para ubicar percentiles y cuartiles directamente leyendo el eje vertical.

Siguiendo la curva: el 25 % del acumulado cae dentro de la segunda clase, y el 75 % dentro de la quinta. Eso ubica al primer y tercer cuartil en los intervalos [19 – 28) y [46 – 55) respectivamente, algo que coincide con los cuartiles ya obtenidos al inicio con summary().

4.8 Función de distribución empírica (ECDF)

plot(ecdf(tabla_9A), col = turquesa, lwd = 2,
     xlab = "Edad (años)", ylab = "F(x)",
     main = "Función de distribución empírica")
grid(col = "#F3E8FF")

Si la ojiva agrupa por clases, la ECDF va un paso más allá: acumula observación por observación, sin perder nada de detalle en el proceso de agrupar. Por eso su trazo es una escalera, con un escalón exacto por cada dato distinto.

La escalera sube de forma pareja entre los 10 y los 73 años, sin quedarse “plana” durante ningún tramo largo. Eso quiere decir que no existen huecos grandes en el rango de edades: prácticamente todas las franjas etarias están representadas en el grupo.