Una universidad desea conocer algunas características de los estudiantes matriculados en un curso de Estadística 1. Se seleccionó una muestra aleatoria de 30 estudiantes y se registraron las variables Estudiante, Edad, Sexo, Horas de estudio/semana y Nota del primer parcial.
Primero se construye el data frame con los 30 registros de la muestra:
Estudiante <- 1:30
Edad <- c(18,20,19,22,18,21,19,23,20,18,24,21,19,22,20,18,25,21,19,23,
20,18,22,21,19,24,20,18,23,21)
Sexo <- c("F","M","F","M","F","M","F","M","F","M","F","M","F","M","F","M",
"F","M","F","M","F","M","F","M","F","M","F","M","F","M")
Horas <- c(6,8,5,10,4,7,9,12,6,3,11,8,5,9,7,4,14,6,8,10,
5,7,12,9,6,13,4,5,11,8)
Nota <- c(3.2,3.8,3.0,4.2,2.8,3.5,4.0,4.5,3.4,2.5,4.3,3.7,3.1,4.0,3.6,2.9,
4.7,3.3,3.9,4.1,3.0,3.4,4.4,3.8,3.2,4.6,2.7,3.1,4.2,3.6)
estudiantes <- data.frame(
Estudiante,
Edad,
Sexo,
Horas,
Nota
)
str(estudiantes)
## 'data.frame': 30 obs. of 5 variables:
## $ Estudiante: int 1 2 3 4 5 6 7 8 9 10 ...
## $ Edad : num 18 20 19 22 18 21 19 23 20 18 ...
## $ Sexo : chr "F" "M" "F" "M" ...
## $ Horas : num 6 8 5 10 4 7 9 12 6 3 ...
## $ Nota : num 3.2 3.8 3 4.2 2.8 3.5 4 4.5 3.4 2.5 ...
El resultado confirma que el data frame contiene 30 observaciones y 5 variables.
El enunciado solicita construir una tabla de frecuencias para la variable Sexo.
frec_abs <- table(estudiantes$Sexo)
frec_rel <- prop.table(frec_abs)
frec_pct <- round(frec_rel * 100, 1)
tabla_sexo <- data.frame(
Sexo = names(frec_abs),
Frecuencia_absoluta = as.vector(frec_abs),
Frecuencia_relativa = round(as.vector(frec_rel), 3),
Porcentaje = as.vector(frec_pct)
)
knitr::kable(
tabla_sexo,
caption = "Tabla de frecuencias — variable Sexo"
)
| Sexo | Frecuencia_absoluta | Frecuencia_relativa | Porcentaje |
|---|---|---|---|
| F | 15 | 0.5 | 50 |
| M | 15 | 0.5 | 50 |
Interpretación: la muestra está distribuida de manera equilibrada entre las dos categorías. Se registraron 15 estudiantes de sexo femenino y 15 estudiantes de sexo masculino, correspondientes al 50 % de la muestra para cada categoría.
Como la variable Sexo es cualitativa nominal, se utilizan un gráfico de barras y un gráfico de pastel para representar su distribución.
# Figura 1. Distribución de estudiantes según sexo
par(mfrow = c(1, 2))
# Gráfico de barras
posiciones <- barplot(
frec_abs,
col = c("#E8837D", "#5B9BD5"),
main = "Figura 1. Distribución por sexo",
ylab = "Número de estudiantes",
xlab = "Sexo",
ylim = c(0, max(frec_abs) + 5),
border = "black"
)
# Mostrar frecuencia encima de cada barra
text(
x = posiciones,
y = frec_abs,
labels = frec_abs,
pos = 3
)
# Gráfico de pastel
pie(
frec_abs,
labels = paste0(
names(frec_abs),
"\n",
frec_abs,
" estudiantes\n",
frec_pct,
"%"
),
col = c("#E8837D", "#5B9BD5"),
main = "Figura 2. Distribución por sexo"
)
par(mfrow = c(1, 1))
Interpretación: los dos gráficos muestran que las categorías presentan la misma frecuencia. Cada una representa el 50 % de los estudiantes de la muestra.
Para las variables Edad, Horas de estudio y Nota del primer parcial se calculan:
R no dispone de una función específica para calcular la moda estadística, por lo que se define una función propia:
moda <- function(x) {
frecuencias <- table(x)
max_frec <- max(frecuencias)
as.numeric(
names(frecuencias)[frecuencias == max_frec]
)
}
resumen_variable <- function(x, nombre) {
data.frame(
Variable = nombre,
Media = round(mean(x), 3),
Mediana = round(median(x), 3),
Moda = paste(moda(x), collapse = " y "),
Minimo = min(x),
Maximo = max(x),
Rango = max(x) - min(x),
Varianza = round(var(x), 3),
Desv_Estandar = round(sd(x), 3),
Coef_Variacion_pct = round(sd(x) / mean(x) * 100, 2)
)
}
tabla_resumen_ej1 <- rbind(
resumen_variable(estudiantes$Edad, "Edad"),
resumen_variable(estudiantes$Horas, "Horas de estudio"),
resumen_variable(estudiantes$Nota, "Nota del primer parcial")
)
knitr::kable(
tabla_resumen_ej1,
caption = "Medidas descriptivas — Edad, Horas de estudio y Nota"
)
| Variable | Media | Mediana | Moda | Minimo | Maximo | Rango | Varianza | Desv_Estandar | Coef_Variacion_pct |
|---|---|---|---|---|---|---|---|---|---|
| Edad | 20.533 | 20.0 | 18 | 18.0 | 25.0 | 7.0 | 4.189 | 2.047 | 9.97 |
| Horas de estudio | 7.733 | 7.5 | 5 y 6 y 8 | 3.0 | 14.0 | 11.0 | 8.547 | 2.924 | 37.80 |
| Nota del primer parcial | 3.617 | 3.6 | 3 y 3.1 y 3.2 y 3.4 y 3.6 y 3.8 y 4 y 4.2 | 2.5 | 4.7 | 2.2 | 0.361 | 0.601 | 16.62 |
Interpretación: la Edad presenta una moda de 18 años. Las Horas de estudio presentan tres modas: 5, 6 y 8 horas. La Nota del primer parcial presenta varias modas debido a que diferentes valores tienen la misma frecuencia máxima.
Las medias y medianas presentan valores cercanos en las tres variables, lo que indica que sus medidas de tendencia central no presentan diferencias marcadas.
El enunciado solicita comparar la variabilidad relativa, explicar el coeficiente de variación, determinar dónde la media representa adecuadamente los datos y explicar qué información adicional proporciona la mediana.
knitr::kable(
tabla_resumen_ej1[
,
c("Variable", "Media", "Mediana", "Coef_Variacion_pct")
],
caption = "Comparación del coeficiente de variación"
)
| Variable | Media | Mediana | Coef_Variacion_pct |
|---|---|---|---|
| Edad | 20.533 | 20.0 | 9.97 |
| Horas de estudio | 7.733 | 7.5 | 37.80 |
| Nota del primer parcial | 3.617 | 3.6 | 16.62 |
Interpretación:
Mayor variabilidad relativa: las Horas de estudio presentan el mayor coeficiente de variación, con aproximadamente 37.80 %. Le siguen la Nota, con aproximadamente 16.62 %, y la Edad, con aproximadamente 9.97 %.
Significado del coeficiente de variación: el coeficiente de variación expresa la desviación estándar como porcentaje de la media. Permite comparar la dispersión relativa entre variables, incluso cuando están expresadas en diferentes unidades.
Representatividad de la media: la media de la Edad presenta una dispersión relativa baja, por lo que representa de manera adecuada el conjunto de datos. La Nota también presenta una dispersión relativamente menor. En las Horas de estudio existe mayor dispersión, por lo que la media debe interpretarse con mayor precaución.
Información adicional de la mediana: la mediana indica el valor que divide los datos ordenados en dos partes iguales. Además, permite conocer el centro de los datos sin depender tanto de valores extremos como ocurre con la media.
Una empresa desea analizar el tiempo, en minutos, que tardan sus empleados en desplazarse desde su vivienda hasta el lugar de trabajo. Se registraron los tiempos de 50 empleados.
tiempos <- c(
18,22,25,27,30,31,32,34,35,36,
37,38,39,40,41,42,43,44,45,46,
47,48,49,50,51,52,53,54,55,56,
57,58,59,60,61,62,63,64,66,68,
70,72,74,76,78,80,85,90,95,120
)
n <- length(tiempos)
n
## [1] 50
Resultado: el vector contiene 50 observaciones, tal como indica el enunciado.
Para construir la distribución agrupada se utiliza la regla de Sturges para determinar el número aproximado de clases.
minimo <- min(tiempos)
maximo <- max(tiempos)
rango <- maximo - minimo
k_sturges <- 1 + 3.322 * log10(n)
k <- round(k_sturges)
amplitud <- 15
# Se utilizan 7 clases de amplitud 15.
# El último intervalo incluye el valor máximo 120.
limites <- c(
15, 30, 45, 60,
75, 90, 105, 120
)
clases <- cut(
tiempos,
breaks = limites,
right = TRUE,
include.lowest = TRUE
)
frec_abs2 <- table(clases)
marca_clase <- (
limites[-length(limites)] +
limites[-1]
) / 2
frec_rel2 <- as.vector(frec_abs2) / n
frec_acum <- cumsum(
as.vector(frec_abs2)
)
tabla_frec_ej2 <- data.frame(
Clase = levels(clases),
Limite_inferior = limites[-length(limites)],
Limite_superior = limites[-1],
Marca_clase = marca_clase,
Frecuencia_abs = as.vector(frec_abs2),
Frecuencia_rel = round(frec_rel2, 3),
Porcentaje = round(frec_rel2 * 100, 1),
Frec_acumulada = frec_acum,
Frec_acum_pct = round(frec_acum / n * 100, 1)
)
knitr::kable(
tabla_frec_ej2,
caption = "Distribución de frecuencias agrupada — tiempos de desplazamiento"
)
| Clase | Limite_inferior | Limite_superior | Marca_clase | Frecuencia_abs | Frecuencia_rel | Porcentaje | Frec_acumulada | Frec_acum_pct |
|---|---|---|---|---|---|---|---|---|
| [15,30] | 15 | 30 | 22.5 | 5 | 0.10 | 10 | 5 | 10 |
| (30,45] | 30 | 45 | 37.5 | 14 | 0.28 | 28 | 19 | 38 |
| (45,60] | 45 | 60 | 52.5 | 15 | 0.30 | 30 | 34 | 68 |
| (60,75] | 60 | 75 | 67.5 | 9 | 0.18 | 18 | 43 | 86 |
| (75,90] | 75 | 90 | 82.5 | 5 | 0.10 | 10 | 48 | 96 |
| (90,105] | 90 | 105 | 97.5 | 1 | 0.02 | 2 | 49 | 98 |
| (105,120] | 105 | 120 | 112.5 | 1 | 0.02 | 2 | 50 | 100 |
Interpretación: se utilizan 7 clases de amplitud 15. La clase con mayor frecuencia es (45,60], con 15 empleados, equivalente al 30 % de la muestra.
La frecuencia acumulada indica que 34 de los 50 empleados, es decir, el 68 %, presentan tiempos de desplazamiento de hasta 60 minutos.
# Figura 3. Histograma del tiempo de desplazamiento
histograma <- hist(
tiempos,
breaks = limites,
right = TRUE,
col = "#5B9BD5",
border = "black",
main = "Figura 3. Histograma del tiempo de desplazamiento",
xlab = "Tiempo de desplazamiento (minutos)",
ylab = "Frecuencia absoluta",
ylim = c(0, max(frec_abs2) + 4),
xaxt = "n"
)
# Marcas del eje X
axis(
1,
at = limites,
labels = limites
)
# Mostrar la frecuencia encima de cada barra
text(
x = histograma$mids,
y = histograma$counts,
labels = histograma$counts,
pos = 3
)
# Figura 4. Polígono de frecuencias del tiempo de desplazamiento
x_pol <- c(
marca_clase[1] - amplitud,
marca_clase,
marca_clase[length(marca_clase)] + amplitud
)
y_pol <- c(
0,
as.vector(frec_abs2),
0
)
plot(
x_pol,
y_pol,
type = "o",
lwd = 2,
pch = 19,
cex = 1.3,
main = "Figura 4. Polígono de frecuencias",
xlab = "Marca de clase (minutos)",
ylab = "Frecuencia absoluta",
ylim = c(0, max(frec_abs2) + 4),
xlim = c(
min(x_pol) - 3,
max(x_pol) + 3
)
)
# Mostrar los valores de frecuencia junto a cada punto
text(
marca_clase,
as.vector(frec_abs2),
labels = as.vector(frec_abs2),
pos = 3
)
# Mostrar coordenadas de cada punto
text(
marca_clase,
as.vector(frec_abs2),
labels = paste0(
"(",
marca_clase,
", ",
as.vector(frec_abs2),
")"
),
pos = 1,
cex = 0.8
)
Interpretación: el histograma y el polígono permiten observar una mayor concentración de empleados en los tiempos intermedios. También se observa una extensión de los datos hacia tiempos altos, especialmente debido a los valores de 85, 90, 95 y 120 minutos.
El enunciado solicita calcular la media, mediana y moda, compararlas e interpretar la distribución.
media <- mean(tiempos)
mediana <- median(tiempos)
# Comprobar si existen valores repetidos
frecuencias_datos <- table(tiempos)
repetidos <- frecuencias_datos[
frecuencias_datos > 1
]
# Moda agrupada estimada
i_mo <- which.max(frec_abs2)
Li_mo <- limites[i_mo]
f_mo <- as.vector(frec_abs2)[i_mo]
f_ant <- ifelse(
i_mo == 1,
0,
as.vector(frec_abs2)[i_mo - 1]
)
f_sig <- ifelse(
i_mo == length(frec_abs2),
0,
as.vector(frec_abs2)[i_mo + 1]
)
moda_agrupada <- Li_mo +
(
(f_mo - f_ant) /
((f_mo - f_ant) + (f_mo - f_sig))
) * amplitud
knitr::kable(
data.frame(
Medida = c(
"Media (X̄)",
"Mediana (Me)",
"Moda agrupada estimada (Mo)"
),
Valor_min = round(
c(
media,
mediana,
moda_agrupada
),
2
)
),
caption = "Medidas de tendencia central"
)
| Medida | Valor_min |
|---|---|
| Media (X̄) | 53.56 |
| Mediana (Me) | 51.50 |
| Moda agrupada estimada (Mo) | 47.14 |
Interpretación: la media es aproximadamente 53.56 minutos, mientras que la mediana es 51.50 minutos. La moda agrupada estimada es aproximadamente 47.50 minutos.
Se observa la relación:
Media > Mediana > Moda agrupada
Esta relación es consistente con una distribución que presenta asimetría positiva, debido a la presencia de algunos tiempos de desplazamiento elevados.
Es importante aclarar que los datos originales no presentan una moda tradicional, ya que los valores no se repiten. Por esta razón, el valor mostrado corresponde a una moda estimada a partir de la distribución agrupada.
El enunciado solicita determinar Q1, Q2, Q3, D8, P25, P75 y P90.
posiciones <- quantile(
tiempos,
c(0.25, 0.50, 0.75, 0.80, 0.90),
type = 7
)
tabla_posicion <- data.frame(
Medida = c(
"Q1 = P25",
"Q2 = Mediana = P50",
"Q3 = P75",
"D8 = P80",
"P90"
),
Valor_min = round(
as.numeric(posiciones),
2
)
)
knitr::kable(
tabla_posicion,
caption = "Medidas de posición"
)
| Medida | Valor_min |
|---|---|
| Q1 = P25 | 39.25 |
| Q2 = Mediana = P50 | 51.50 |
| Q3 = P75 | 63.75 |
| D8 = P80 | 68.40 |
| P90 | 78.20 |
Interpretación:
Q1 = P25 = 39.25 minutos: aproximadamente el 25 % de los empleados presenta tiempos de desplazamiento de hasta 39.25 minutos.
Q2 = 51.50 minutos: el 50 % de los empleados presenta tiempos de desplazamiento de hasta 51.50 minutos.
Q3 = P75 = 63.75 minutos: aproximadamente el 75 % de los empleados presenta tiempos de hasta 63.75 minutos.
D8 = P80 = 68.40 minutos: aproximadamente el 80 % de los empleados presenta tiempos de desplazamiento de hasta 68.40 minutos.
P90 = 78.20 minutos: aproximadamente el 90 % de los empleados presenta tiempos de desplazamiento de hasta 78.20 minutos. El 10 % restante presenta tiempos superiores a este valor.
rango_ej <- max(tiempos) - min(tiempos)
Q1 <- quantile(
tiempos,
0.25,
type = 7
)
Q3 <- quantile(
tiempos,
0.75,
type = 7
)
RIQ <- Q3 - Q1
varianza <- var(tiempos)
desv_est <- sd(tiempos)
cv <- desv_est / media * 100
tabla_dispersion <- data.frame(
Medida = c(
"Rango",
"Rango intercuartílico",
"Varianza",
"Desviación estándar",
"Coeficiente de variación (%)"
),
Valor = round(
c(
rango_ej,
RIQ,
varianza,
desv_est,
cv
),
2
)
)
knitr::kable(
tabla_dispersion,
caption = "Medidas de dispersión"
)
| Medida | Valor |
|---|---|
| Rango | 102.00 |
| Rango intercuartílico | 24.50 |
| Varianza | 409.68 |
| Desviación estándar | 20.24 |
| Coeficiente de variación (%) | 37.79 |
Interpretación: el rango es de 102 minutos, mientras que el rango intercuartílico es de 24.50 minutos. La desviación estándar es aproximadamente 20.24 minutos.
El coeficiente de variación es aproximadamente 37.79 %, lo que indica que los tiempos presentan una dispersión relativa considerable respecto a su media. Por lo tanto, los tiempos de desplazamiento no son completamente homogéneos entre los empleados.
El coeficiente de asimetría de Pearson se calcula mediante:
As_pearson <- 3 * (media - mediana) / desv_est
As_pearson
## [1] 0.3053276
Interpretación: el coeficiente obtenido es aproximadamente 0.305.
Como el resultado es mayor que cero, la distribución presenta asimetría positiva o hacia la derecha.
Esto significa que, aunque la mayoría de los tiempos se concentra en valores bajos y medios, existen algunos tiempos elevados que extienden la distribución hacia la derecha.
Para evitar confundir la curtosis de Pearson con el exceso de curtosis, se calculan ambas medidas.
m2 <- mean(
(tiempos - media)^2
)
m4 <- mean(
(tiempos - media)^4
)
curtosis_pearson <- m4 / (m2^2)
exceso_curtosis <- curtosis_pearson - 3
knitr::kable(
data.frame(
Medida = c(
"Curtosis de Pearson",
"Exceso de curtosis"
),
Valor = round(
c(
curtosis_pearson,
exceso_curtosis
),
3
)
),
caption = "Curtosis de la distribución"
)
| Medida | Valor |
|---|---|
| Curtosis de Pearson | 3.961 |
| Exceso de curtosis | 0.961 |
Interpretación: la curtosis de Pearson es aproximadamente 3.961, mientras que el exceso de curtosis es aproximadamente 0.961.
Como el exceso de curtosis es positivo, la distribución presenta características leptocúrticas respecto a una distribución normal. El resultado también es consistente con la presencia de valores relativamente alejados, como 90, 95 y 120 minutos.
La muestra está equilibrada entre hombres y mujeres, con 15 estudiantes en cada categoría. En las variables numéricas, las Horas de estudio presentan la mayor variabilidad relativa, mientras que la Edad presenta la menor.
La comparación entre media y mediana permite observar que los valores centrales de las tres variables son relativamente cercanos, aunque la dispersión debe considerarse para determinar qué tan representativa es la media.
El tiempo promedio de desplazamiento es de 53.56 minutos, mientras que la mediana es de 51.50 minutos.
El 50 % central de los empleados presenta tiempos entre 39.25 y 63.75 minutos. Además, aproximadamente el 90 % de los empleados presenta tiempos de hasta 78.20 minutos.
El coeficiente de variación es aproximadamente 37.79 %, indicando una dispersión relativa considerable.
Finalmente, el coeficiente de asimetría de Pearson es aproximadamente 0.305, lo que indica asimetría positiva. El exceso de curtosis es aproximadamente 0.961, por lo que la distribución presenta características leptocúrticas respecto a la distribución normal.
```