Curso Básico de Formación – Guardia Urbana de Pilar
Análisis del rendimiento académico del tramo común
Informe elaborado por Eduardo Árnica
Analista de Datos – Coordinación de Evaluación y Enseñanza
Versión demostrativa · Datos simulados
El presente informe tiene como finalidad analizar, con fines demostrativos, el rendimiento académico de 20 cursantes pertenecientes al Curso Básico de Formación de la Guardia Urbana de Pilar.
El tramo común está compuesto por las siguientes ocho materias:
Los datos utilizados son completamente simulados y no corresponden a cursantes reales.
El análisis busca responder principalmente las siguientes preguntas:
Se generan 20 cursantes ficticios, cada uno con una calificación en las ocho materias.
library(dplyr)
library(tidyr)
library(ggplot2)
library(knitr)
n_cursantes <- 20
cursantes <- paste0("Cursante ", sprintf("%02d", 1:n_cursantes))
materias <- c(
"Ética Profesional",
"Normas Legales",
"Seguridad en el Trabajo",
"Organización Municipal",
"Comunicaciones",
"Primeros Auxilios",
"Nociones Básicas de Tránsito",
"Geografía Municipal"
)
medias_materias <- c(8.1, 7.2, 8.0, 7.6, 7.8, 8.3, 7.0, 7.5)
habilidad <- rnorm(n_cursantes, mean = 0, sd = 0.7)
datos <- expand.grid(
Cursante = cursantes,
Materia = materias,
stringsAsFactors = FALSE
)
datos <- datos |>
mutate(
id_cursante = match(Cursante, cursantes),
id_materia = match(Materia, materias),
Nota = medias_materias[id_materia] +
habilidad[id_cursante] +
rnorm(n(), mean = 0, sd = 0.65),
Nota = pmin(10, pmax(1, round(Nota, 1)))
)
datos$Materia <- factor(datos$Materia, levels = materias)
head(datos)## Cursante Materia id_cursante id_materia Nota
## 1 Cursante 01 Ética Profesional 1 1 8.3
## 2 Cursante 02 Ética Profesional 2 1 7.2
## 3 Cursante 03 Ética Profesional 3 1 7.3
## 4 Cursante 04 Ética Profesional 4 1 9.0
## 5 Cursante 05 Ética Profesional 5 1 7.7
## 6 Cursante 06 Ética Profesional 6 1 7.6
media_general <- mean(datos$Nota)
desvio_general <- sd(datos$Nota)
mediana_general <- median(datos$Nota)
cat("Promedio general:", round(media_general, 2), "\n")## Promedio general: 7.43
## Mediana: 7.4
## Desvío estándar: 1.01
El promedio general de las evaluaciones fue de 7.43 puntos, sobre una escala de 1 a 10.
resumen_materias <- datos |>
group_by(Materia) |>
summarise(
Cursantes = n(),
Promedio = mean(Nota),
Mediana = median(Nota),
DE = sd(Nota),
Minimo = min(Nota),
Maximo = max(Nota),
.groups = "drop"
) |>
mutate(across(where(is.numeric), ~ round(.x, 2)))
kable(
resumen_materias,
caption = "Tabla 1. Rendimiento académico por materia"
)| Materia | Cursantes | Promedio | Mediana | DE | Minimo | Maximo |
|---|---|---|---|---|---|---|
| Ética Profesional | 20 | 8.03 | 7.85 | 0.78 | 6.4 | 9.8 |
| Normas Legales | 20 | 6.75 | 6.75 | 0.65 | 5.0 | 8.0 |
| Seguridad en el Trabajo | 20 | 7.72 | 7.80 | 0.95 | 6.1 | 9.8 |
| Organización Municipal | 20 | 7.21 | 7.15 | 1.01 | 4.6 | 8.8 |
| Comunicaciones | 20 | 7.43 | 7.50 | 0.94 | 5.6 | 9.0 |
| Primeros Auxilios | 20 | 8.30 | 8.50 | 0.90 | 6.7 | 9.9 |
| Nociones Básicas de Tránsito | 20 | 6.81 | 6.80 | 0.89 | 4.6 | 8.7 |
| Geografía Municipal | 20 | 7.17 | 7.00 | 0.86 | 5.6 | 8.8 |
Nota. Los valores corresponden a datos simulados de 20 cursantes evaluados en ocho materias.
Figura 1
Promedio de calificaciones por materia
ggplot(
resumen_materias,
aes(x = reorder(Materia, Promedio), y = Promedio)
) +
geom_col(width = 0.65) +
geom_hline(yintercept = 6, linetype = "dashed") +
geom_text(aes(label = round(Promedio, 1)), hjust = -0.3, size = 4) +
coord_flip() +
scale_y_continuous(limits = c(0, 10), breaks = 0:10) +
labs(x = NULL, y = "Nota promedio") +
theme_minimal(base_size = 13)Nota. La línea punteada representa la calificación mínima de aprobación (6 puntos).
Figura 2
Distribución de las calificaciones por materia
ggplot(
datos,
aes(x = Materia, y = Nota)
) +
geom_boxplot() +
geom_jitter(width = 0.12, alpha = 0.45) +
coord_flip() +
labs(x = NULL, y = "Nota") +
theme_minimal(base_size = 13)Nota. Cada punto representa una calificación individual simulada.
resumen_cursantes <- datos |>
group_by(Cursante) |>
summarise(
Promedio = mean(Nota),
Nota_minima = min(Nota),
Nota_maxima = max(Nota),
.groups = "drop"
) |>
mutate(Promedio = round(Promedio, 2)) |>
arrange(desc(Promedio)) |>
mutate(Posicion = row_number())
kable(
resumen_cursantes,
caption = "Tabla 2. Promedio general de los cursantes"
)| Cursante | Promedio | Nota_minima | Nota_maxima | Posicion |
|---|---|---|---|---|
| Cursante 16 | 8.69 | 8.0 | 9.8 | 1 |
| Cursante 01 | 8.24 | 6.8 | 9.9 | 2 |
| Cursante 20 | 8.07 | 7.0 | 9.0 | 3 |
| Cursante 17 | 7.82 | 6.7 | 9.8 | 4 |
| Cursante 18 | 7.82 | 6.7 | 8.8 | 5 |
| Cursante 09 | 7.79 | 7.1 | 8.7 | 6 |
| Cursante 13 | 7.66 | 6.4 | 8.7 | 7 |
| Cursante 14 | 7.64 | 7.0 | 8.2 | 8 |
| Cursante 10 | 7.59 | 5.7 | 8.9 | 9 |
| Cursante 04 | 7.55 | 6.1 | 9.0 | 10 |
| Cursante 03 | 7.44 | 6.5 | 8.5 | 11 |
| Cursante 19 | 7.44 | 6.3 | 8.7 | 12 |
| Cursante 12 | 7.38 | 6.5 | 9.5 | 13 |
| Cursante 02 | 7.18 | 6.2 | 8.9 | 14 |
| Cursante 07 | 7.12 | 6.3 | 8.7 | 15 |
| Cursante 08 | 7.09 | 6.2 | 8.0 | 16 |
| Cursante 05 | 7.03 | 6.2 | 8.0 | 17 |
| Cursante 11 | 7.01 | 6.0 | 8.1 | 18 |
| Cursante 06 | 6.24 | 4.6 | 7.6 | 19 |
| Cursante 15 | 5.79 | 4.6 | 6.8 | 20 |
Nota. El orden se establece de mayor a menor promedio general.
Figura 3
Promedio general por cursante
ggplot(
resumen_cursantes,
aes(x = reorder(Cursante, Promedio), y = Promedio)
) +
geom_col() +
geom_text(aes(label = Promedio), hjust = -0.2, size = 3.5) +
geom_hline(yintercept = 6, linetype = "dashed") +
coord_flip() +
scale_y_continuous(limits = c(0, 10)) +
labs(x = NULL, y = "Promedio") +
theme_minimal(base_size = 13)Nota. La línea punteada representa la calificación mínima de aprobación (6 puntos).
Para esta demostración se considera aprobada una materia con una calificación igual o superior a 6 puntos.
datos <- datos |>
mutate(
Estado = ifelse(Nota >= 6, "Aprobado", "Desaprobado")
)
aprobacion <- datos |>
count(Estado) |>
mutate(
Porcentaje = round(n / sum(n) * 100, 1)
)
kable(
aprobacion,
caption = "Tabla 3. Resultado general de las evaluaciones por materia"
)| Estado | n | Porcentaje |
|---|---|---|
| Aprobado | 152 | 95 |
| Desaprobado | 8 | 5 |
Nota. Se analizaron 160 calificaciones correspondientes a 20 cursantes evaluados en 8 materias.
aprobacion_materia <- datos |>
group_by(Materia) |>
summarise(
Aprobados = sum(Nota >= 6),
Total = n(),
Porcentaje_aprobacion = Aprobados / Total * 100,
.groups = "drop"
)
kable(
aprobacion_materia,
digits = 1,
caption = "Tabla 4. Porcentaje de aprobación por materia"
)| Materia | Aprobados | Total | Porcentaje_aprobacion |
|---|---|---|---|
| Ética Profesional | 20 | 20 | 100 |
| Normas Legales | 19 | 20 | 95 |
| Seguridad en el Trabajo | 20 | 20 | 100 |
| Organización Municipal | 19 | 20 | 95 |
| Comunicaciones | 19 | 20 | 95 |
| Primeros Auxilios | 20 | 20 | 100 |
| Nociones Básicas de Tránsito | 17 | 20 | 85 |
| Geografía Municipal | 18 | 20 | 90 |
Figura 4
Porcentaje de aprobación por materia
ggplot(
aprobacion_materia,
aes(
x = reorder(Materia, Porcentaje_aprobacion),
y = Porcentaje_aprobacion
)
) +
geom_col() +
geom_text(
aes(label = paste0(round(Porcentaje_aprobacion, 1), "%")),
hjust = -0.15
) +
coord_flip() +
scale_y_continuous(limits = c(0, 105)) +
labs(x = NULL, y = "Porcentaje de aprobación") +
theme_minimal(base_size = 13)Nota. El porcentaje se calcula sobre los 20 cursantes de cada materia.
Debido a que los mismos cursantes realizan todas las materias, las observaciones no son independientes.
Por ese motivo se utiliza un ANOVA de medidas repetidas.
H₀: las calificaciones medias son iguales entre las ocho materias.
H₁: al menos una materia presenta una media diferente.
modelo_anova <- aov(
Nota ~ Materia + Error(Cursante / Materia),
data = datos
)
summary(modelo_anova)##
## Error: Cursante
## Df Sum Sq Mean Sq F value Pr(>F)
## Residuals 19 63.7 3.353
##
## Error: Cursante:Materia
## Df Sum Sq Mean Sq F value Pr(>F)
## Materia 7 43.33 6.191 15.24 1.58e-14 ***
## Residuals 133 54.04 0.406
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Nota. El ANOVA de medidas repetidas mostró diferencias estadísticamente significativas en las calificaciones según la materia, F(7, 133) = 15,24; p < 0,001.
Para identificar entre qué materias se presentan las diferencias detectadas por el ANOVA, se realizaron comparaciones pareadas con corrección de Holm. A continuación, se presentan únicamente aquellas con diferencias estadísticamente significativas (p < 0,05).
| Materia 1 | Materia 2 | p-valor ajustado |
|---|---|---|
| Normas Legales | Ética Profesional | < 0,001 |
| Primeros Auxilios | Normas Legales | < 0,001 |
| Nociones Básicas de Tránsito | Primeros Auxilios | < 0,001 |
| Geografía Municipal | Primeros Auxilios | < 0,001 |
| Nociones Básicas de Tránsito | Ética Profesional | < 0,001 |
| Primeros Auxilios | Organización Municipal | < 0,001 |
| Geografía Municipal | Ética Profesional | 0,002 |
| Nociones Básicas de Tránsito | Seguridad en el Trabajo | 0,005 |
| Organización Municipal | Ética Profesional | 0,006 |
| Seguridad en el Trabajo | Normas Legales | 0,007 |
| Primeros Auxilios | Comunicaciones | 0,022 |
| Nociones Básicas de Tránsito | Comunicaciones | 0,043 |
Nota. Se presentan únicamente las comparaciones con p-valor ajustado menor a 0,05.
Interpretación. El ANOVA indicó que existen diferencias de rendimiento entre las materias. Las comparaciones posteriores permiten precisar entre qué materias se encuentran esas diferencias. La tabla presenta únicamente los pares con diferencias estadísticamente significativas. Para determinar cuál materia presenta un rendimiento superior, estos resultados deben interpretarse junto con los promedios obtenidos.
mejor_materia <- resumen_materias |>
arrange(desc(Promedio)) |>
slice(1)
peor_materia <- resumen_materias |>
arrange(Promedio) |>
slice(1)La materia con mayor promedio fue Primeros Auxilios, con una media de 8.3 puntos.
La materia con menor promedio fue Normas Legales, con una media de 6.75 puntos.
top5 <- resumen_cursantes |>
slice_head(n = 5) |>
select(
Posicion,
Cursante,
Promedio
)
kable(
top5,
caption = "Tabla 6. Cinco mejores promedios generales"
)| Posicion | Cursante | Promedio |
|---|---|---|
| 1 | Cursante 16 | 8.69 |
| 2 | Cursante 01 | 8.24 |
| 3 | Cursante 20 | 8.07 |
| 4 | Cursante 17 | 7.82 |
| 5 | Cursante 18 | 7.82 |
Nota. El ranking corresponde exclusivamente a los datos simulados de esta versión demostrativa.
El análisis permitió obtener una visión general del rendimiento de los 20 cursantes en las ocho materias que conforman el tramo común del Curso Básico de Formación.
El promedio general de las evaluaciones fue de 7.43 puntos.
La materia que presentó el mejor rendimiento promedio fue Primeros Auxilios, mientras que Normas Legales presentó el promedio más bajo.
El ANOVA de medidas repetidas permite determinar si las diferencias observadas entre materias son estadísticamente significativas, considerando que cada cursante fue evaluado en las ocho asignaturas.
Asimismo, el análisis de los porcentajes de aprobación permite identificar materias en las que podría resultar conveniente profundizar acciones de acompañamiento, seguimiento o refuerzo académico.
Los resultados contenidos en este informe corresponden exclusivamente a datos simulados.
Por lo tanto:
R Core Team. (2026). R: A language and environment for statistical computing. R Foundation for Statistical Computing.
Wickham, H. (2016). ggplot2: Elegant graphics for data analysis. Springer.
Municipio de Pilar
Secretaría de Seguridad
Eduardo Árnica
Analista de Datos – Coordinación de Evaluación y Enseñanza
Informe de rendimiento académico · Cohorte 2026
Versión demostrativa · Datos simulados