#base de datos original
df_11th <- read_excel("df_11th.xlsx")

#se convierte en factor
df_11th$Cambridge <- as.factor(df_11th$Cambridge) #pob cambridge
df_11th$Nova <- as.factor(df_11th$Nova) #pob NOVA

#se agrega el porcentaje de asistencia a los datos
df_11th <- df_11th |> 
  mutate(porc_asist = (Asistencia/9)*100) #porcentaje de asistencia

#se estandaraizan los datos numericos
df11_est <- df_11th |> 
  mutate(across(where(is.numeric), ~ as.numeric(scale(.x))))

1 Perfil poblacional

Resumen descriptivo de los estudiantes.

1.1 Énfasis académico

Resumen de estudiantes por Énfasis
Énfasis Total Porcentaje
Arte 22 29.3 %
Ciencias 15 20 %
Humanidades 18 24 %
Matemáticas 20 26.7 %

1.2 Población Cambridge

Esta variable categoriza a los estudiantes en cuatro grupos según los exámenes Cambridge que hayan presentado. Las categorias son:

  • Categoría 0: No presentó ningún examen Cambridge
  • Categoría 1: Presentó solo IGCSE
  • Categoría 2: Presentó solo AS
  • Categoría 3: Presentó IGCSE y AS

Los estudiantes se encuentran distribuidos de la siguiente manera:

1.3 Población NOVA

Dentro de grado 11 hay 5 estudiantes hacen parte del programa NOVA en diferentes asignaturas. A continuación se muestran los nombres de estos estudiantes, así como tu categorización dentro de la población Cambridge.

Lista de Estudiantes Nova
Nombre del Estudiante Categoría Cambridge
Cormane Nicole 3
Noguera Amanda 3
Pertuz Samuel 3
Tovar Santiago 3
Visbal David 3

1.4 Población con diagnóstico

Resumen de estudiantes por Énfasis
Diagnóstico Total Porcentaje
No 66 88 %
Si 9 12 %

1.5 Porcentaje de asistencias a Pre Icfes

1.6 Resumen de desempeño

Resumen Estadistico: Simulacros de la Prueba
Simulacro N Media Desv. Est. Mediana Minimo Maximo
Simulacro 1 (Global) 75 293.7 58.4 299.0 147 424
Simulacro 2 (Global) 74 314.7 58.7 316.5 162 434
Simulacro 3 (Global) 74 311.7 57.6 313.5 135 459

Resumen Estadístico: Percentiles de la Prueba
N Media Desv. Est. Mediana Mínimo Máximo
Percentil Global Prueba 72 64.2 22.9 66.5 5 100
Percentil Lectura Crítica 72 59.9 26.1 64.5 1 100
Percentil Matemáticas 72 69.1 24.1 73.5 2 100
Percentil Sociales y Ciu. 72 56.1 26.3 58.0 1 98
Percentil Ciencias Naturales 72 59.2 24.4 61.5 3 100
Percentil Inglés 72 84.2 14.1 88.5 40 100

1.6.1 Análisis del Rendimiento Global

A partir del diagrama de radar presentado, se pueden identificar las principales fortalezas y áreas de mejora en el desempeño de la población evaluada.

Se observa un rendimiento sobresaliente en el área de Inglés, lo cual posiciona a este componente como el eje más fuerte del grupo. En contraste, el área de Sociales registra el promedio más bajo, evidenciando la necesidad de implementar estrategias de refuerzo pedagógico focalizadas.

Las áreas de Matemáticas, Naturales y Lectura muestran un comportamiento intermedio y homogéneo, manteniéndose en un rango estable cercano al promedio general de la prueba.

library(dplyr)
library(fmsb)

# 1. CALCULAR LOS PROMEDIOS DESDE TU DATA FRAME ORIGINAL
# Usamos summarise para calcular la media de cada área eliminando los NA
promedios_calculados <- df_11th %>%
  summarise(
    Matemáticas = mean(Mat_PS, na.rm = TRUE),
    Inglés      = mean(Ing_PS, na.rm = TRUE),
    Naturales   = mean(Nat_PS, na.rm = TRUE),
    Sociales    = mean(Soc_PS, na.rm = TRUE),
    Lectura     = mean(Lect_PS, na.rm = TRUE)
  )

# 2. DEFINIR LOS LÍMITES MÁXIMOS Y MÍNIMOS DE LA ESCALA (0 a 100)
# Las columnas deben llamarse EXACTAMENTE igual que arriba
limites_escala <- data.frame(
  Matemáticas = c(100, 1),
  Inglés      = c(100, 1),
  Naturales   = c(100, 1),
  Sociales    = c(100, 1),
  Lectura     = c(100, 1)
)

df_radar_final <- rbind(limites_escala, promedios_calculados)

# 4. GENERAR EL DIAGRAMA DE ARAÑA ESTILIZADO
par(mar = c(2, 2, 4, 2)) # Ajuste de márgenes para que no se corten los textos

radarchart(
  df_radar_final,
  axistype = 1, # Muestra la escala numérica en el eje superior
  
  # --- Configuración de la Red ---
  cglcol = "grey80",       # Color de las líneas de la cuadrícula
  cglty  = 1,              # Líneas continuas para la red
  cglwd  = 1,              # Grosor de la red
  axislabcol = "grey50",   # Color de los números de la escala
  caxislabels = seq(0, 100, by = 25), # Marcas de escala: 0, 25, 50, 75, 100
  seg = 4,                 # Divide la red en 4 secciones (cada 25 puntos)
  
  # --- Configuración del Polígono de Datos ---
  pcol   = "#2C3E50",      # Color Azul Ejecutivo para la línea exterior
  plwd   = 3,              # Grosor de la línea del perfil
  plty   = 1,              # Línea continua
  # Relleno del polígono con el mismo azul y un toque de transparencia (alpha=60)
  pfcol  = rgb(44, 62, 80, alpha = 60, maxColorValue = 255), 
  
  # --- Ajustes de Texto ---
  vlabels = colnames(df_radar_final), # Usa los nombres de las asignaturas
  vlcex   = 1.5,    #Tamaño de letra de las asignaturas
  title = "Perfil de Rendimiento Promedio Global" # Título del gráfico
)

2 Identificación de patrones

2.1 Énfasis académico

df_11th <- df_11th %>% mutate(sim_prom = (GlobalS1+GlobalS2+GlobalS3)/3)
  
  resumen_enfasis <- df_11th %>%
    group_by(Enfasis) %>%
    summarise(
      N = n(),
      Prom_Simulacro = mean(sim_prom, na.rm = TRUE),
      DE_Simulacro   = sd(sim_prom, na.rm = TRUE),
      Prom_Percentil = mean(PercentilPreS, na.rm = TRUE),
      DE_Percentil   = sd(PercentilPreS, na.rm = TRUE)
    )
  
  kable(resumen_enfasis, digits = 3, align = "c",
        caption = "Resumen estadístico de resultados por énfasis")%>%
    kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                  latex_options = c("striped", "hold_position"),
                  full_width = T, position = "center")%>%
    row_spec(0, bold = TRUE, color = "white", background = "#2C3E50")
Resumen estadístico de resultados por énfasis
Enfasis N Prom_Simulacro DE_Simulacro Prom_Percentil DE_Percentil
Arte 22 275.317 44.596 54.900 18.462
Ciencias 15 316.738 35.160 69.357 22.404
Humanidades 18 285.944 46.036 50.389 21.475
Matemáticas 20 359.483 39.976 82.450 14.598

2.1.1 Modelo de regresión para diferencia entre énfasis

## 
## Call:
## lm(formula = PercentilPreS ~ Enfasis, data = df_11th)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -64.357  -8.037   4.550  11.611  37.100 
## 
## Coefficients:
##                    Estimate Std. Error t value Pr(>|t|)    
## (Intercept)          54.900      4.278  12.833  < 2e-16 ***
## EnfasisCiencias      14.457      6.667   2.169   0.0336 *  
## EnfasisHumanidades   -4.511      6.216  -0.726   0.4705    
## EnfasisMatemáticas   27.550      6.050   4.554 2.25e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 19.13 on 68 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.3289, Adjusted R-squared:  0.2993 
## F-statistic: 11.11 on 3 and 68 DF,  p-value: 5.071e-06

El modelo evalúa el impacto del énfasis académico sobre el percentil alacanzado por los estudiantes en la prueba Pre Saber 11. Los resultados muestran que el énfasis académico es un predictor significativo para el rendimiento general de la prueba (p-valor < 0.05).

El modelo tomó como referencia el énfasis de arte, el cual cuenta con un percentil promedio significativo de 54.9. Se encuentran diferencias significativas entre los énfasis de arte, ciencias y matemáticas. Se espera que los estudiantes del énfasis de matemáticas se ubiquen 27.5 puntos más arriba en comparación a los de arte, mientras que lo de ciencias pueden ubicarse 14.4 puntos arriba. Adicionalmente, no existe diferencia significativa entre los resultados de los estudiantes de artes con los de humanidades.

El modelo sugiere que el énfasis académico explica alrededor del 32.9% de la variación de los resultados.

2.2 Población Cambridge

estadistica_cambridge <- df_11th %>%
  group_by(Cambridge) %>%
  summarise(
    N = n(),
    Prom_Simulacro = mean(sim_prom, na.rm = TRUE),
    DE_Simulacro   = sd(sim_prom, na.rm = TRUE),
    Prom_Percentil = mean(PercentilPreS, na.rm = TRUE),
    DE_Percentil   = sd(PercentilPreS, na.rm = TRUE)
  )

kable(estadistica_cambridge, digits = 3, align = "c",
        caption = "Resumen estadístico de resultados por énfasis")%>%
    kable_styling(bootstrap_options = c("striped", "hover", "condensed"),
                  latex_options = c("striped", "hold_position"),
                  full_width = T, position = "center")%>%
    row_spec(0, bold = TRUE, color = "white", background = "#2C3E50")
Resumen estadístico de resultados por énfasis
Cambridge N Prom_Simulacro DE_Simulacro Prom_Percentil DE_Percentil
0 34 294.909 53.307 59.906 23.373
1 24 317.754 46.469 66.000 21.821
2 3 306.667 32.447 60.333 13.051
3 14 328.024 64.152 72.538 24.568

En el gráfico de caja y bigotes se muestra la distribución de resultados por cada categoría dentro de la población Cambridge.

## 
## Call:
## lm(formula = PercentilPreS ~ Cambridge, data = df_11th)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -62.538 -12.477   2.094  16.023  39.094 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept)  59.9063     4.0374  14.838   <2e-16 ***
## Cambridge1    6.0938     6.1673   0.988   0.3266    
## Cambridge2    0.4271    13.7904   0.031   0.9754    
## Cambridge3   12.6322     7.5117   1.682   0.0972 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 22.84 on 68 degrees of freedom
##   (3 observations deleted due to missingness)
## Multiple R-squared:  0.04358,    Adjusted R-squared:  0.001388 
## F-statistic: 1.033 on 3 and 68 DF,  p-value: 0.3836

El modelo evalúa el impacto de la categorización de Población Camdridge sobre el percentil alcanzado por los estudiantes. Los resultados muestran que la presentación de exámenes Cambridge no es un predictor significativo para el redimiento general de la prueba (p-valor = 0.3836).

El modelo tomó como referencia la Categoría 0, para la cual se tiene un percentil promedio significativo de 59.90. Aunque se notan algunas diferencias entre los grupos (por ejemplo, 12.63 puntos de diferencia con la Categoría 3), estas no son estadpisticamente sifgnificativas. Esto sugiere que gran parte de la variación de se deben a otros factores propios de la muestra, pero la realización de exámenes Cambridge por si solos, no representan un factor de éxito en el percentil global (explicando el 4.35% de la varianza).

2.3 Estudiantes NOVA

Comparativa de los resultados en las pruebas de población perteneciente al programa NOVA y la pobalción regular.

El siguiente diagrama de caja y bigote muestra la diferencia entre los grupos.

df_11th |> drop_na(Nova) |>
  mutate(Nova = factor(Nova, 
                            levels = c("0", "1"),
                            labels = c("No", "Si"))) |>
  ggplot(aes(x = PercentilPreS, y = Nova, fill = Nova)) + 
  stat_boxplot(geom = "errorbar", width = 0.2, linewidth = 0.8) +
  geom_boxplot(width = 0.4,  alpha = 0.9) +
  geom_jitter(aes(color = Nova), width = 0.4, alpha = 0.5) +
  theme_minimal() +
  theme(axis.text.y = element_blank()) +
  labs(x = "Percentil global", y = "Población NOVA")

2.3.1 Análisis del Rendimiento NOVA

Resumen Estadístico: Población NOVA
Cantidad Media Desv. Est. Mediana Mínimo Máximo
Percentil Global Prueba 5 84.4 15.8 87 67 100
Percentil Lectura Crítica 5 80.4 22.2 90 45 100
Percentil Matemáticas 5 88.4 14.4 91 64 100
Percentil Sociales y Ciu. 5 71.6 28.9 80 27 97
Percentil Ciencias Naturales 5 86.8 13.8 91 68 100
Percentil Inglés 5 95.6 2.9 95 92 100

El análisis estadístico del rendimiento de los estudiantes NOVA (5 estudiantes) refleja un perfil académico destacado pero con una alta variabilidad entre disciplinas, consolidando un promedio global en el percentil 84.4 (con una desviación estándar de 15.8).

La mayor fortaleza y homogeneidad del colectivo se localiza en el componente de Inglés, el cual registra la media más elevada (95.6) y una dispersión mínima (2.9), seguido por un desempeño sobresaliente y compacto en las áreas de Matemáticas (media de 88.4) y Ciencias Naturales (media de 86.8). En contraste, el gráfico de radar expone una marcada contracción en el eje de Sociales y Ciudadanas, consolidándose como la principal área de mejora al registrar el promedio más bajo (71.6) y la mayor volatilidad interna del reporte (desviación de 28.9 y un puntaje mínimo de 27).

Esta tendencia de dispersión también se replica en Lectura Crítica (media de 80.4 y desviación de 22.2), lo que evidencia la necesidad de implementar estrategias de nivelación focalizadas para corregir las brechas puntuales de aprendizaje dentro del grupo.

library(dplyr)
library(fmsb)

# 1. CALCULAR LOS PROMEDIOS DESDE TU DATA FRAME ORIGINAL
# Usamos summarise para calcular la media de cada área eliminando los NA
promedios_calculados_nova <- df_11th %>%
  drop_na(PercentilPreS) %>%
  filter(Nova == "1") %>%
  summarise(
    Matemáticas = mean(Mat_PS, na.rm = TRUE),
    Inglés      = mean(Ing_PS, na.rm = TRUE),
    Naturales   = mean(Nat_PS, na.rm = TRUE),
    Sociales    = mean(Soc_PS, na.rm = TRUE),
    Lectura     = mean(Lect_PS, na.rm = TRUE)
  )

limites_escala <- data.frame(
  Matemáticas = c(100, 1),
  Inglés      = c(100, 1),
  Naturales   = c(100, 1),
  Sociales    = c(100, 1),
  Lectura     = c(100, 1)
)

df_radar_nova <- rbind(limites_escala, promedios_calculados_nova)

# 4. GENERAR EL DIAGRAMA DE ARAÑA ESTILIZADO
par(mar = c(2, 2, 4, 2)) # Ajuste de márgenes para que no se corten los textos

radarchart(
  df_radar_nova,
  axistype = 1, # Muestra la escala numérica en el eje superior
  
  # --- Configuración de la Red ---
  cglcol = "grey80",       # Color de las líneas de la cuadrícula
  cglty  = 1,              # Líneas continuas para la red
  cglwd  = 1,              # Grosor de la red
  axislabcol = "grey50",   # Color de los números de la escala
  caxislabels = seq(0, 100, by = 25), # Marcas de escala: 0, 25, 50, 75, 100
  seg = 4,                 # Divide la red en 4 secciones (cada 25 puntos)
  
  # --- Configuración del Polígono de Datos ---
  pcol   = "#2C3E50",      # Color Azul Ejecutivo para la línea exterior
  plwd   = 3,              # Grosor de la línea del perfil
  plty   = 1,              # Línea continua
  # Relleno del polígono con el mismo azul y un toque de transparencia (alpha=60)
  pfcol  = rgb(44, 62, 80, alpha = 60, maxColorValue = 255), 
  vlabels = colnames(df_radar_nova), 
  vlcex   = 1.5,    
  title = "Perfil de Rendimiento Promedio - Población NOVA"
)

2.3.2 Análisis del Rendimiento No-NOVA

Resumen Estadístico: Población No NOVA
Cantidad Media Desv. Est. Mediana Mínimo Máximo
Percentil Global Prueba 67 62.7 22.7 62 5 99
Percentil Lectura Crítica 67 58.3 25.9 63 1 98
Percentil Matemáticas 67 67.7 24.1 72 2 100
Percentil Sociales y Ciu. 67 55.0 26.0 58 1 98
Percentil Ciencias Naturales 67 57.2 23.8 56 3 97
Percentil Inglés 67 83.4 14.2 87 40 100

A partir del diagrama de radar y la tabla correspondientes a la Población No NOVA, se identifica que Inglés se mantiene de forma contundente como el eje más fuerte y con mayor consistencia interna del grupo, alcanzando el promedio más alto y la menor dispersión de la evaluación. Por el contrario, las asignaturas fundamentales de Sociales y Ciu. junto con Ciencias Naturales y Lectura Crítica muestran una marcada contracción generalizada hacia el centro del gráfico de radar, registrando los promedios más bajos y revelando una profunda brecha de aprendizaje debido a sus altas desviaciones estándar y puntajes mínimos críticos cercanos a cero.

El componente de Matemáticas se posiciona en un terreno intermedio con una leve ventaja sobre las demás materias básicas, configurando un panorama general que evidencia un rendimiento global moderado y sumamente heterogéneo, lo cual exige el diseño urgente de estrategias de nivelación integral en la gran mayoría de las áreas evaluadas.

library(dplyr)
library(fmsb)

# 1. CALCULAR LOS PROMEDIOS DESDE TU DATA FRAME ORIGINAL
# Usamos summarise para calcular la media de cada área eliminando los NA
promedios_calculados_no_nova <- df_11th %>%
  drop_na(PercentilPreS) %>%
  filter(Nova == "0") %>%
  summarise(
    Matemáticas = mean(Mat_PS, na.rm = TRUE),
    Inglés      = mean(Ing_PS, na.rm = TRUE),
    Naturales   = mean(Nat_PS, na.rm = TRUE),
    Sociales    = mean(Soc_PS, na.rm = TRUE),
    Lectura     = mean(Lect_PS, na.rm = TRUE)
  )

limites_escala <- data.frame(
  Matemáticas = c(100, 1),
  Inglés      = c(100, 1),
  Naturales   = c(100, 1),
  Sociales    = c(100, 1),
  Lectura     = c(100, 1)
)

df_radar_no_nova <- rbind(limites_escala, promedios_calculados_no_nova)

# 4. GENERAR EL DIAGRAMA DE ARAÑA ESTILIZADO
par(mar = c(2, 2, 4, 2)) # Ajuste de márgenes para que no se corten los textos

radarchart(
  df_radar_no_nova,
  axistype = 1, # Muestra la escala numérica en el eje superior
  
  # --- Configuración de la Red ---
  cglcol = "grey80",       # Color de las líneas de la cuadrícula
  cglty  = 1,              # Líneas continuas para la red
  cglwd  = 1,              # Grosor de la red
  axislabcol = "grey50",   # Color de los números de la escala
  caxislabels = seq(0, 100, by = 25), # Marcas de escala: 0, 25, 50, 75, 100
  seg = 4,                 # Divide la red en 4 secciones (cada 25 puntos)
  
  # --- Configuración del Polígono de Datos ---
  pcol   = "#2C3E80",      # Color Azul Ejecutivo para la línea exterior
  plwd   = 3,              # Grosor de la línea del perfil
  plty   = 1,              # Línea continua
  # Relleno del polígono con el mismo azul y un toque de transparencia (alpha=60)
  pfcol  = rgb(44, 62, 80, alpha = 60, maxColorValue = 255), 
  vlabels = colnames(df_radar_nova), 
  vlcex   = 1.5,    
  title = "Perfil de Rendimiento Promedio - Población No NOVA"
)

2.4 Estudiantes con diagnóstico

Comparativa de los resultados en las pruebas de población perteneciente al programa NOVA y la población regular.

El siguiente diagrama de caja y bigote muestra la diferencia entre los grupos.

df_11th |> drop_na(Diagnostico) |>
  ggplot(aes(x = PercentilPreS, y = Diagnostico, fill = Diagnostico)) + 
  stat_boxplot(geom = "errorbar", width = 0.2, linewidth = 0.8) +
  geom_boxplot(width = 0.4,  alpha = 0.9) +
  geom_jitter(aes(color = Diagnostico), width = 0.4, alpha = 0.5) +
  theme_minimal() +
  theme(axis.text.y = element_blank()) +
  labs(x = "Percentil global", y = "Población")

2.4.1 Análisis del Rendimiento - Población con diagnóstico

Resumen Estadístico: Población con diagnóstico
Cantidad Media Desv. Est. Mediana Mínimo Máximo
Percentil Global Prueba 8 24.4 13.7 22.5 7 50
Percentil Lectura Crítica 8 25.5 24.6 17.0 1 60
Percentil Matemáticas 8 30.9 20.3 37.0 2 55
Percentil Sociales y Ciu. 8 15.5 12.1 12.5 2 39
Percentil Ciencias Naturales 8 19.4 13.9 15.5 3 41
Percentil Inglés 8 68.0 20.7 71.0 40 100

A partir del diagrama de radar y la tabla correspondientes a la Población con diagnóstico en la imagen image_eb1a44.png, se identifica que Inglés sobresale como el único componente con un rendimiento favorable, logrando la media más alta del reporte y estirando el gráfico de radar hacia su extremo izquierdo de manera aislada. Por el contrario, la figura geométrica muestra un colapso generalizado hacia el centro en todas las áreas básicas, siendo el eje de Sociales y Ciu. el punto más crítico al registrar el promedio más bajo de la evaluación, seguido muy de cerca por un rezago severo en Ciencias Naturales y Lectura Crítica.

El área de Matemáticas se sitúa en un nivel intermedio bajo con un desempeño sutilmente superior al resto de asignaturas troncales, consolidando un panorama global sumamente deficiente y asimétrico que evidencia la necesidad urgente de una intervención pedagógica profunda y prioritaria en la totalidad de los componentes evaluados.

library(dplyr)
library(fmsb)

# 1. CALCULAR LOS PROMEDIOS DESDE TU DATA FRAME ORIGINAL
# Usamos summarise para calcular la media de cada área eliminando los NA
promedios_calculados_diag <- df_11th %>%
  drop_na(PercentilPreS) %>%
  filter(Diagnostico == "Si") %>%
  summarise(
    Matemáticas = mean(Mat_PS, na.rm = TRUE),
    Inglés      = mean(Ing_PS, na.rm = TRUE),
    Naturales   = mean(Nat_PS, na.rm = TRUE),
    Sociales    = mean(Soc_PS, na.rm = TRUE),
    Lectura     = mean(Lect_PS, na.rm = TRUE)
  )

limites_escala <- data.frame(
  Matemáticas = c(100, 1),
  Inglés      = c(100, 1),
  Naturales   = c(100, 1),
  Sociales    = c(100, 1),
  Lectura     = c(100, 1)
)

df_radar_diag <- rbind(limites_escala, promedios_calculados_diag)

# 4. GENERAR EL DIAGRAMA DE ARAÑA ESTILIZADO
par(mar = c(2, 2, 4, 2)) # Ajuste de márgenes para que no se corten los textos

radarchart(
  df_radar_diag,
  axistype = 1, # Muestra la escala numérica en el eje superior
  
  # --- Configuración de la Red ---
  cglcol = "grey80",       # Color de las líneas de la cuadrícula
  cglty  = 1,              # Líneas continuas para la red
  cglwd  = 1,              # Grosor de la red
  axislabcol = "grey50",   # Color de los números de la escala
  caxislabels = seq(0, 100, by = 25), # Marcas de escala: 0, 25, 50, 75, 100
  seg = 4,                 # Divide la red en 4 secciones (cada 25 puntos)
  
  # --- Configuración del Polígono de Datos ---
  pcol   = "#2C3E50",      # Color Azul Ejecutivo para la línea exterior
  plwd   = 3,              # Grosor de la línea del perfil
  plty   = 1,              # Línea continua
  # Relleno del polígono con el mismo azul y un toque de transparencia (alpha=60)
  pfcol  = rgb(44, 62, 80, alpha = 60, maxColorValue = 255), 
  vlabels = colnames(df_radar_diag), 
  vlcex   = 1.5,    
  title = "Perfil de Rendimiento Promedio - Población con diagnóstico"
)

2.4.2 Análisis del Rendimiento sin diagnóstico

Resumen Estadístico: Población sin diagnóstico
Cantidad Media Desv. Est. Mediana Mínimo Máximo
Percentil Global Prueba 64 69.2 18.5 69.0 5 100
Percentil Lectura Crítica 64 64.2 23.1 68.0 2 100
Percentil Matemáticas 64 73.9 20.0 76.5 12 100
Percentil Sociales y Ciu. 64 61.2 23.0 59.0 1 98
Percentil Ciencias Naturales 64 64.2 20.5 65.0 7 100
Percentil Inglés 64 86.2 11.8 89.5 55 100

A partir del diagrama de radar y la tabla correspondientes a la Población sin diagnóstico, se identifica que Inglés se consolida firmemente como el eje con mejor desempeño y mayor homogeneidad de la evaluación, alcanzando el promedio más alto y la dispersión más baja del reporte.

En las asignaturas básicas, el componente de Matemáticas destaca con una ventaja clara sobre las demás disciplinas troncales, logrando jalar de forma notable la parte superior de la figura geométrica. Por el contrario, el eje de Sociales y Ciu. refleja la mayor contracción hacia el centro del gráfico de radar al registrar la media más baja del grupo, seguido muy de cerca por Lectura Crítica y Ciencias Naturales, áreas que además exponen una profunda brecha interna debido a sus altas desviaciones estándar y puntajes mínimos críticos cercanos a cero.

Este panorama general configura un rendimiento global moderado y marcadamente heterogéneo, sugiriendo la pertinencia de diseñar planes de refuerzo enfocados en equilibrar las competencias analíticas y lectoras frente al sólido dominio del bilingüismo.
library(dplyr)
library(fmsb)

# 1. CALCULAR LOS PROMEDIOS DESDE TU DATA FRAME ORIGINAL
# Usamos summarise para calcular la media de cada área eliminando los NA
promedios_calculados_no_diag <- df_11th %>%
  drop_na(PercentilPreS) %>%
  filter(Diagnostico == "No") %>%
  summarise(
    Matemáticas = mean(Mat_PS, na.rm = TRUE),
    Inglés      = mean(Ing_PS, na.rm = TRUE),
    Naturales   = mean(Nat_PS, na.rm = TRUE),
    Sociales    = mean(Soc_PS, na.rm = TRUE),
    Lectura     = mean(Lect_PS, na.rm = TRUE)
  )

limites_escala <- data.frame(
  Matemáticas = c(100, 1),
  Inglés      = c(100, 1),
  Naturales   = c(100, 1),
  Sociales    = c(100, 1),
  Lectura     = c(100, 1)
)

df_radar_no_diag <- rbind(limites_escala, promedios_calculados_no_diag)

# 4. GENERAR EL DIAGRAMA DE ARAÑA ESTILIZADO
par(mar = c(2, 2, 4, 2)) # Ajuste de márgenes para que no se corten los textos

radarchart(
  df_radar_no_diag,
  axistype = 1, # Muestra la escala numérica en el eje superior
  
  # --- Configuración de la Red ---
  cglcol = "grey80",       # Color de las líneas de la cuadrícula
  cglty  = 1,              # Líneas continuas para la red
  cglwd  = 1,              # Grosor de la red
  axislabcol = "grey50",   # Color de los números de la escala
  caxislabels = seq(0, 100, by = 25), # Marcas de escala: 0, 25, 50, 75, 100
  seg = 4,                 # Divide la red en 4 secciones (cada 25 puntos)
  
  # --- Configuración del Polígono de Datos ---
  pcol   = "#2C3E80",      # Color Azul Ejecutivo para la línea exterior
  plwd   = 3,              # Grosor de la línea del perfil
  plty   = 1,              # Línea continua
  # Relleno del polígono con el mismo azul y un toque de transparencia (alpha=60)
  pfcol  = rgb(44, 62, 80, alpha = 60, maxColorValue = 255), 
  vlabels = colnames(df_radar_diag), 
  vlcex   = 1.5,    
  title = "Perfil de Rendimiento Promedio - Población cin diagnóstico"
)