El dataset de nombre “MEN_MATRICULA_ESTADISTICA_ES” contiene la información de la matrícula estadística de educación superior en un rango que abarca desde el año 2015 hasta el año 2021, extraído desde la página oficial del gobierno gov, que aloja tanto el archivo de datos como la descripción de sus variables y los datos de la entidad responsable de la recolección.
Nota: la mayor parte de los gráficos y tablas son interactivos, siéntase libre de manipularlos a su gusto para facilitar la visualización.
| Variable | Tipo de Dato | Tipo de Variable | Ejemplo del dataset | Descripción |
|---|---|---|---|---|
| Código de la Institución | numeric | Cualitativa nominal (código) | 2833 | Identificador numérico único asignado a la institución de educación superior (IES). |
| IES PADRE | numeric | Cualitativa nominal (código) | 2833 | Código de la institución matriz cuando el registro corresponde a una seccional. |
| institucion | character | Cualitativa nominal | CORPORACION UNIVERSITARIA REMINGTON | Nombre de la institución de educación superior que reporta la matrícula. |
| Principal oSeccional | character | Cualitativa nominal (dicotómica) | PRINCIPAL | Indica si el registro corresponde a la sede principal o a una seccional de la IES. |
| Id_Sector | numeric | Cualitativa nominal (código) | 2 | Código del sector al que pertenece la IES (oficial o privado). |
| Id_Caracter | numeric | Cualitativa nominal (código) | 3 | Código del carácter académico de la IES (universidad, institución tecnológica, técnica profesional, etc.). |
| Código del departamento(IES) | numeric | Cualitativa nominal (código) | 5 | Código DANE del departamento donde tiene domicilio la IES. |
| Departamento de domicilio de la IES | character | Cualitativa nominal | ANTIOQUIA | Nombre del departamento donde tiene su domicilio la IES. |
| Código del Municipio(IES) | numeric | Cualitativa nominal (código) | 5001 | Código DANE del municipio de domicilio de la IES. |
| Municipio dedomicilio de la IES | character | Cualitativa nominal | MEDELLIN | Nombre del municipio de domicilio de la IES. |
| snies | character | Cualitativa nominal (código) | 13061 | Código único del programa académico en el Sistema Nacional de Información de la Educación Superior (SNIES). |
| programa | character | Cualitativa nominal | CONTADURIA PUBLICA | Nombre del programa académico ofrecido por la IES. |
| Id_Nivel | numeric | Cualitativa nominal (código) | 1 | Código del nivel de formación (pregrado o posgrado). |
| Id_Nivel_Formacion | numeric | Cualitativa ordinal (código) | 6 | Código del nivel de formación específico (técnico, tecnológico, universitario, especialización, maestría, doctorado). |
| Id_Metodologia | numeric | Cualitativa nominal (código) | 2 | Código de la metodología del programa (presencial, a distancia, virtual). |
| Id_Area | character | Cualitativa nominal (código) | 6 | Código del área de conocimiento del programa según la clasificación SNIES. |
| Id_Nucleo | character | Cualitativa nominal (código) | 612 | Código del núcleo básico del conocimiento (NBC) del programa. |
| nbc | character | Cualitativa nominal | CONTADURIA PUBLICA | Nombre del núcleo básico del conocimiento (NBC) al que pertenece el programa académico. |
| Código del Departamento(Programa) | character | Cualitativa nominal (código) | 23 | Código DANE del departamento donde se ofrece el programa académico. |
| Departamento de oferta del programa | character | Cualitativa nominal | CORDOBA | Nombre del departamento donde se ofrece el programa académico. |
| Código del Municipio(Programa) | character | Cualitativa nominal (código) | 23670 | Código DANE del municipio donde se ofrece el programa académico. |
| Municipio de oferta del programa | character | Cualitativa nominal | SAN ANDRES DE SOTAVENTO | Nombre del municipio donde se ofrece el programa académico. |
| genero | character | Cualitativa nominal (dicotómica) | 2 | Código del género de los estudiantes matriculados. Verifica los valores únicos en tu archivo (table(datos_matricula$genero)) para confirmar la codificación exacta (usualmente 1 = Hombre, 2 = Mujer). |
| anio | numeric | Cuantitativa discreta / temporal | 2015 | Año calendario al que corresponde el registro de matrícula (2015 a 2021). |
| Semestre | numeric | Cualitativa ordinal | 1 | Semestre académico al que corresponde el registro (1 o 2). |
| matriculados | numeric | Cuantitativa discreta | 2 | Número de estudiantes matriculados para esa combinación de programa, IES, año y semestre. |
En el siguiente gráfico se muestra el conteo total de matrículas para cada año en el periodo 2015-2021. Lo primero y más evidente que salta a la vista es la caída ocurrida a partir del año 2020, lo cual en primera instancia parece asociado a la pandemia de Covid-19, que llegó a Colombia a mediados de marzo de ese año y provocó una disminución notable en la cantidad de matrículas en instituciones de educación superior.
A continuación, un gráfico con las instituciones de educación superior que suman la mayor cantidad de matrículas para el periodo de tiempo analizado.
Como se puede observar, el Servicio Nacional de Aprendizaje (SENA) supera por amplio margen a las demás instituciones que le siguen. La razón de esto puede estar atada a múltiples factores, entre ellos:
A continuación se muestran dos gráficos complementarios: el primero es un boxplot (con vista ajustada) que da un vistazo a los percentiles de las matrículas por área del conocimiento; el segundo es un gráfico de densidad que compara la forma de la distribución entre esas mismas áreas. En ambos gráficos se observa que la mayor parte de los programas, en cualquier área, no superan las 200 matrículas (límite superior del bigote de Tukey, Q3 + 1.5×RIC), mientras que un número mucho menor de cursos alcanza cifras muy altas (los puntos por encima de las cajas). Una explicación plausible es la existencia de cursos masivos y de acceso gratuito, como muchos de los ofrecidos virtualmente por el SENA: aportan matrículas muy altas pero no son lo suficientemente frecuentes como para desplazar de forma importante los percentiles de su área.
La mayoría de las columnas numéricas de este dataset
(Id_Sector, Id_Nivel, Id_Area,
los códigos de departamento/municipio, etc.) son en realidad
códigos categóricos almacenados como número:
correlacionarlos con Pearson no tendría interpretación válida. Las
únicas variables genuinamente cuantitativas son los conteos de
matrícula, así que la matriz de correlación se construye sobre variables
agregadas por institución: total de matriculados,
matriculados por periodo (normal, estallido social, pandemia), número de
programas distintos ofrecidos y número de años con matrícula activa.
Como la matrícula está muy concentrada en unas pocas instituciones (el SENA, visto en el análisis univariado), se calculan Pearson y Spearman en paralelo: Spearman (basado en rangos) es más robusto frente a esa asimetría y sirve como verificación de si la conclusión cambia según el método.
Para la relación entre dos variables categóricas se usa
chi-cuadrado entre género y
área del conocimiento, construyendo la tabla de
contingencia a partir de la suma de matriculados (no
del conteo de filas, que representarían combinaciones
institución-programa-año-semestre y no estudiantes). Dado el tamaño de
la muestra (cientos de miles de matriculados), se complementa con la
V de Cramér como medida de tamaño de efecto, para no
confundir significancia estadística con relevancia práctica.
Nota sobre género: el código fuente usa
1/2 para Hombre/Mujer según la convención habitual del MEN; si al
revisar table(datos_matricula$genero) aparecen valores
distintos, ajusta el case_when de la sección de
preparación.
La correlación de Pearson entre los matriculados del periodo normal y los de pandemia es de 0.98 (muy fuerte, positiva), lo que indica que las instituciones con más matrícula antes de la pandemia tienden a mantener un tamaño relativo similar durante ella. Con Spearman el coeficiente es 0.79; si ambos números son similares, el sesgo por instituciones extremas (como el SENA) no está distorsionando de forma importante la conclusión — si difieren bastante, conviene confiar más en Spearman.
Por otro lado, la correlación entre el total de matriculados y el número de programas ofrecidos es de 0.66 (fuerte), es decir, que ofrecer más programas distintos está asociado con mayor matrícula total. La matriz completa (arriba) permite revisar cualquier otro par de variables agregadas.
| genero_etiqueta | Ciencias | Economia | Humanidades | Ingenieria | Medicina | Otros |
|---|---|---|---|---|---|---|
| Hombre | 423812.0 | 3053147 | 2454532 | 4894965 | 472587.2 | 861289.2 |
| Mujer | 501148.2 | 4348826 | 3558760 | 2448229 | 828886.2 | 1067851.6 |
Con una muestra de 24.914.034 matriculados, la prueba chi-cuadrado de independencia entre género y área del conocimiento da un estadístico de 1.357.584 con 5 grados de libertad y un valor p < 0.001. Todas las frecuencias esperadas fueron mayores o iguales a 5, cumpliendo el supuesto del test.
Dado el tamaño de la muestra, es prácticamente seguro que el valor p sea muy pequeño incluso si la asociación real es débil — por eso conviene mirar el tamaño de efecto: la V de Cramér es 0.233 (débil), lo que indica que, en términos prácticos, la asociación entre género y área del conocimiento es débil, más allá de que el resultado sea estadísticamente significativo. Es decir: puede haber diferencias reales en la distribución por género entre áreas, pero eso no implica necesariamente que el género “explique” de forma importante la elección de área de estudio.
A continuación, gráficos de barras que muestran las 100 carreras con más matrículas durante todo el periodo de estudio, tanto a nivel global como separadas por área del conocimiento. Algunos hallazgos:
Top 100 carreras con más matrículas para el área de Ciencias (512 programas distintos registrados en total). El programa líder es INGENIERIA QUIMICA, con 105,553 matriculados a lo largo del periodo — el 11.4% de toda la matrícula del área.
Top 100 carreras con más matrículas para el área de Humanidades (2,650 programas distintos registrados en total). El programa líder es DERECHO, con 1,188,443 matriculados a lo largo del periodo — el 19.8% de toda la matrícula del área.
Top 100 carreras con más matrículas para el área de Ingeniería (2,442 programas distintos registrados en total). El programa líder es INGENIERIA INDUSTRIAL, con 655,629 matriculados a lo largo del periodo — el 8.9% de toda la matrícula del área.
Top 100 carreras con más matrículas para el área de Economía (2,372 programas distintos registrados en total). El programa líder es ADMINISTRACION DE EMPRESAS, con 1,095,311 matriculados a lo largo del periodo — el 14.8% de toda la matrícula del área.
Top 100 carreras con más matrículas para el área de Medicina (630 programas distintos registrados en total). El programa líder es MEDICINA, con 529,418 matriculados a lo largo del periodo — el 40.7% de toda la matrícula del área.
Top 100 carreras con más matrículas para el grupo catalogado como
Otros (1,721 programas distintos registrados en total).
El programa líder es FISIOTERAPIA, con 150,975
matriculados a lo largo del periodo — el 7.8% de toda la matrícula del
área. Este grupo agrupa programas que no encajaron en ninguno de los
patrones de texto usados para clasificar las demás áreas (ver el chunk
limpieza), así que conviene revisarlo ocasionalmente para
detectar si algún núcleo de conocimiento importante quedó mal
clasificado.
Durante el periodo normal (2016-2017) se registraron 8,359,254 matrículas en total. La institución con más matriculados fue SERVICIO NACIONAL DE APRENDIZAJE-SENA-, con 1,426,169 matriculados — el 17.1% del total del periodo, un nivel de concentración institucional similar al observado en el análisis global.
Durante la pandemia (2020-2021) se registraron 4,170,392 matrículas en total — una variación de -50.1% respecto al periodo normal, consistente con la caída de matrículas observada desde 2020 en el análisis univariado. La institución líder se mantuvo como SERVICIO NACIONAL DE APRENDIZAJE-SENA- (14.9% del periodo), lo cual es coherente con la fuerte correlación entre periodos (Pearson 0.98, Spearman 0.79) ya reportada en el análisis bivariado: las instituciones grandes se mantuvieron grandes también durante la pandemia.
A lo largo de este tablero se analizó la matrícula en educación superior en Colombia entre 2015 y 2021, a partir de datos abiertos del Ministerio de Educación Nacional (MEN). Los análisis univariados muestran una distribución de la matrícula altamente concentrada: el Servicio Nacional de Aprendizaje (SENA) domina por amplio margen sobre el resto de instituciones, y solo un puñado de programas académicos (Derecho a la cabeza) concentra buena parte de las matrículas, mientras que la mayoría de los programas no superan las 200 matrículas en todo el periodo.
También se observa una caída marcada en el total de matriculados a partir de 2020, coincidente en el tiempo con el inicio de la pandemia de Covid-19. Vale la pena ser precisos aquí: la coincidencia temporal no es evidencia suficiente de una relación causal exclusiva — el dataset no incluye variables que permitan descartar otros factores simultáneos (cambios en la oferta educativa, en el financiamiento, etc.), así que esta asociación debe leerse como una hipótesis razonable y no como una conclusión cerrada.
---
title: "Laboratorio 2 - Matrícula en Educación Superior (MEN)"
output:
flexdashboard::flex_dashboard:
vertical_layout: scroll
orientation: rows
social: menu
source_code: embed
date: "`r Sys.Date()`"
---
```{r setup, include = FALSE}
knitr::opts_chunk$set(echo = FALSE, warning = FALSE, message = FALSE)
```
<style>
.texto-grande {
font-size: 24px;
}
</style>
```{r librerias-y-datos}
library(readr)
library(dplyr)
library(tidyr)
library(ggplot2)
library(plotly)
library(DT)
library(knitr)
library(scales)
library(stringi)
# Importar archivo de datos
datos_matricula <- read_csv("/Users/helev/Downloads/MEN_MATRICULA_ESTADISTICA_ES_20260703.csv") %>%
as.data.frame()
descripcion <- read_csv("/Users/helev/Downloads/variables.csv") %>%
as.data.frame()
n_columnas_originales <- 26
```
```{r limpieza}
# 1 Código de la Institución 10 Municipio de domicilio (IES) 19 Depto (Programa)
# 2 IES Padre 11 Código SNIES del programa 20 Depto oferta programa
# 3 Institución (IES) 12 Programa Académico 21 Municipio (Programa)
# 4 Principal o Seccional 13 Id_Nivel 22 Municipio oferta programa
# 5 Id_Sector 14 Id_Nivel_Formacion 23 Id Género
# 6 Id_Caracter 15 Id_Metodologia 24 Año
# 7 Código depto (IES) 16 Id_Area 25 Semestre
# 8 Departamento domicilio IES 17 Id_Nucleo 26 Total Matriculados
# 9 Código municipio (IES) 18 Núcleo Básico del Conocimiento (NBC)
stopifnot(ncol(datos_matricula) >= 26)
datos_matricula <- datos_matricula %>%
rename(
institucion = 3,
snies = 11,
programa = 12,
nbc = 18,
genero = 23,
anio = 24,
matriculados = 26
)
datos_matricula <- datos_matricula %>%
mutate(
nbc = stri_trans_general(nbc, id = "Latin-ASCII"),
nbc = gsub("[¿!]", "", nbc),
genero = as.character(genero),
snies = as.character(snies),
# case_when
area_conocimiento = case_when(
grepl("medicina|enfermeria|fisioterapia|odontologia", nbc, ignore.case = TRUE) ~ "Medicina",
grepl("ingenieria quimica", nbc, ignore.case = TRUE) ~ "Ciencias",
grepl("ingenieria|arquitectura|agronomia", nbc, ignore.case = TRUE) ~ "Ingenieria",
grepl("contaduria|economia|administracion", nbc, ignore.case = TRUE) ~ "Economia",
grepl(paste0("politica|humanidades|educacion|sociales|filosofia|sociologia|",
"psicologia|lenguas|comunicacion|derecho|antropologia|arte"),
nbc, ignore.case = TRUE) ~ "Humanidades",
grepl(paste0("ciencias|matematicas|biologia|microbiologia|fisica|nutricion|",
"quimica|bacteriologia"),
nbc, ignore.case = TRUE) ~ "Ciencias",
TRUE ~ "Otros"
),
# Periodos
periodo = case_when(
anio %in% c(2016, 2017) ~ "Periodo normal",
anio %in% c(2018, 2019) ~ "Estallido social",
anio %in% c(2020, 2021) ~ "Pandemia",
TRUE ~ NA_character_
)
)
```
```{r funciones-graficas}
# Tema graficas.
tema_dashboard <- theme_minimal(base_size = 11) +
theme(
axis.text.x = element_text(angle = 45, vjust = 0.5, hjust = 1),
axis.text.y = element_text(size = 8)
)
# Barras interactivas
graf_top_instituciones <- function(datos, titulo) {
resumen <- datos %>%
group_by(institucion) %>%
summarise(matriculas = sum(matriculados, na.rm = TRUE), .groups = "drop") %>%
arrange(desc(matriculas))
g <- ggplot(resumen, aes(x = reorder(institucion, -matriculas), y = matriculas)) +
geom_col() +
scale_y_continuous(labels = comma) +
labs(x = "Institución de educación superior", y = "Cantidad de matriculados") +
tema_dashboard +
theme(axis.text.x = element_text(size = 7))
ggplotly(g) %>%
layout(
xaxis = list(rangeslider = list(visible = TRUE), range = c(0, 20)),
margin = list(t = 30, b = 220, l = 80, r = 30)
)
}
# Barras interactivas
graf_top_programas <- function(datos, titulo, top_n = 100) {
resumen <- datos %>%
group_by(programa) %>%
summarise(matriculas = sum(matriculados, na.rm = TRUE), .groups = "drop") %>%
arrange(desc(matriculas)) %>%
slice_head(n = top_n)
g <- ggplot(resumen, aes(x = reorder(programa, -matriculas), y = matriculas)) +
geom_col() +
scale_y_continuous(labels = comma) +
labs(x = "Programa académico", y = "Cantidad de matrículas") +
tema_dashboard +
theme(axis.text.x = element_text(size = 7))
ggplotly(g) %>%
layout(
xaxis = list(rangeslider = list(visible = TRUE), range = c(0, 20)),
margin = list(t = 30, b = 220, l = 80, r = 30)
)
}
# Boxplot
graf_boxplot_area <- function(datos) {
outliers <- datos %>%
filter(matriculados > quantile(matriculados, 0.99, na.rm = TRUE))
bigote_superior <- datos %>%
group_by(area_conocimiento) %>%
summarise(
q1 = quantile(matriculados, 0.25, na.rm = TRUE),
q3 = quantile(matriculados, 0.75, na.rm = TRUE),
bigote = q3 + 1.5 * (q3 - q1),
.groups = "drop"
) %>%
pull(bigote) %>%
max(na.rm = TRUE)
g <- ggplot(datos, aes(x = area_conocimiento, y = matriculados)) +
geom_boxplot(outlier.shape = NA) +
geom_jitter(data = outliers, width = 0.2, alpha = 0.15, size = 1) +
coord_cartesian(ylim = c(0, bigote_superior * 1.1)) +
labs(x = "Área del conocimiento", y = "Matriculados por programa") +
tema_dashboard
ggplotly(g, tooltip = c("x", "y"))
}
# Graficos de Densidad
graf_densidad_area <- function(datos) {
p_list <- datos %>%
split(.$area_conocimiento) %>%
lapply(function(df_area) {
plot_ly(
data = df_area, x = ~matriculados, type = "histogram",
histnorm = "probability density",
name = unique(df_area$area_conocimiento), showlegend = TRUE
) %>%
layout(
xaxis = list(title = "Matriculados por programa", range = c(0, 500)),
yaxis = list(title = "Densidad de probabilidad")
)
})
subplot(p_list, nrows = 2, shareX = FALSE, titleX = TRUE, titleY = TRUE) %>%
toWebGL()
}
resumen_area <- function(datos, area) {
ranking <- datos %>%
filter(area_conocimiento == area) %>%
group_by(programa) %>%
summarise(matriculas = sum(matriculados, na.rm = TRUE), .groups = "drop") %>%
arrange(desc(matriculas))
list(
n_programas = nrow(ranking),
programa_top = ranking$programa[1],
matriculas_top = ranking$matriculas[1],
participacion_top = ranking$matriculas[1] / sum(ranking$matriculas)
)
}
resumen_periodo <- function(datos_periodo) {
ranking <- datos_periodo %>%
group_by(institucion) %>%
summarise(matriculas = sum(matriculados, na.rm = TRUE), .groups = "drop") %>%
arrange(desc(matriculas))
list(
total_periodo = sum(ranking$matriculas),
institucion_top = ranking$institucion[1],
matriculas_top = ranking$matriculas[1],
participacion_top = ranking$matriculas[1] / sum(ranking$matriculas)
)
}
```
Resumen
======================================================================================================================
## fila 1
<div class="texto-grande">
### Contexto
El dataset de nombre *"MEN_MATRICULA_ESTADISTICA_ES"* contiene la información de la matrícula estadística de educación superior en un rango que abarca desde el año 2015 hasta el año 2021, extraído desde la página oficial del gobierno [gov](https://www.datos.gov.co/Educaci-n/MEN_MATRICULA_ESTADISTICA_ES/5wck-szir/about_data), que aloja tanto el archivo de datos como la descripción de sus variables y los datos de la entidad responsable de la recolección.
**Nota:** la mayor parte de los gráficos y tablas son interactivos, siéntase libre de manipularlos a su gusto para facilitar la visualización.
</div>
## fila 2
### Tabla resumen
```{r resumen}
variable <- data.frame(
Variable = colnames(datos_matricula)[1:n_columnas_originales],
`Tipo de Dato` = sapply(datos_matricula[1, 1:n_columnas_originales], class),
`Tipo de Variable` = descripcion[1:n_columnas_originales, 2],
`Ejemplo del dataset` = unlist(datos_matricula[1, 1:n_columnas_originales], use.names = FALSE),
Descripción = descripcion[1:n_columnas_originales, 3],
check.names = FALSE
)
kable(variable, caption = "Resumen de las variables y sus características", row.names = FALSE)
```
## fila 3 {data-height=700}
### Muestra del dataset
```{r}
datatable(
datos_matricula[1:1000, 1:n_columnas_originales],
rownames = FALSE,
options = list(scrollX = TRUE, autoWidth = TRUE)
)
```
Análisis global
======================================================================================================================
## Fila 1
### Matrículas 2015 - 2021
En el siguiente gráfico se muestra el conteo total de matrículas para cada año en el periodo 2015-2021. Lo primero y más evidente que salta a la vista es la caída ocurrida a partir del año 2020, lo cual en primera instancia parece asociado a la pandemia de Covid-19, que llegó a Colombia a mediados de marzo de ese año y provocó una disminución notable en la cantidad de matrículas en instituciones de educación superior.
## Gráfico 2
### Gráfico
```{r fig.height=3.5}
historial <- datos_matricula %>%
group_by(anio) %>%
summarise(matriculados_totales = sum(matriculados, na.rm = TRUE), .groups = "drop")
ggplot(historial, aes(x = anio, y = matriculados_totales)) +
geom_col() +
geom_smooth(method = "lm", aes(group = 1), color = "red", se = FALSE) +
geom_text(aes(label = comma(matriculados_totales)), vjust = -0.8) +
scale_y_continuous(labels = comma) +
labs(title = "Cantidad de matriculados por año", x = "Año", y = "Cantidad de matrículas")
```
## Fila 2
### Instituciones con más matrículas
A continuación, un gráfico con las instituciones de educación superior que suman la mayor cantidad de matrículas para el periodo de tiempo analizado.
Como se puede observar, el **Servicio Nacional de Aprendizaje (SENA)** supera por amplio margen a las demás instituciones que le siguen. La razón de esto puede estar atada a múltiples factores, entre ellos:
- El periodo académico que maneja la institución, dividido en trimestres a diferencia de universidades como Univalle, que trabaja por semestres.
- La cantidad masiva de cursos, tanto presenciales como virtuales, que ofrece la institución.
- La duración de los cursos disponibles.
- El hecho de ser completamente pública y abarcar una amplia gama de niveles de formación.
## gráfico 2 {data-height=1000}
```{r out.width="100%", fig.height=8, fig.width=12}
graf_top_instituciones(datos_matricula, "Instituciones con más matriculados 2015 - 2021")
```
## fila 3
### Percentiles y densidad
```{r include=FALSE}
# Mismo criterio (Tukey: Q3 + 1.5*RIC) que usa graf_boxplot_area() para fijar
# el eje Y del boxplot de abajo - se recalcula aquí solo para poder citar el
# número real en el texto, en vez de dejar un valor fijo escrito a mano.
bigote_global <- datos_matricula %>%
group_by(area_conocimiento) %>%
summarise(
q1 = quantile(matriculados, 0.25, na.rm = TRUE),
q3 = quantile(matriculados, 0.75, na.rm = TRUE),
bigote = q3 + 1.5 * (q3 - q1),
.groups = "drop"
) %>%
pull(bigote) %>%
max(na.rm = TRUE)
```
A continuación se muestran dos gráficos complementarios: el primero es un boxplot (con vista ajustada) que da un vistazo a los percentiles de las matrículas por área del conocimiento; el segundo es un gráfico de densidad que compara la forma de la distribución entre esas mismas áreas. En ambos gráficos se observa que la mayor parte de los programas, en cualquier área, no superan las `r round(bigote_global)` matrículas (límite superior del bigote de Tukey, Q3 + 1.5×RIC), mientras que un número mucho menor de cursos alcanza cifras muy altas (los puntos por encima de las cajas). Una explicación plausible es la existencia de cursos masivos y de acceso gratuito, como muchos de los ofrecidos virtualmente por el **SENA**: aportan matrículas muy altas pero no son lo suficientemente frecuentes como para desplazar de forma importante los percentiles de su área.
## fila 4
### Gráfico cajas
```{r fig.height=10, fig.width=10}
graf_boxplot_area(datos_matricula)
```
## fila 5
### Gráfico densidad
```{r fig.height=10, fig.width=20}
graf_densidad_area(datos_matricula)
```
Análisis bivariado
======================================================================================================================
## Fila 1
<div class="texto-grande">
### Variables y pruebas utilizadas
La mayoría de las columnas numéricas de este dataset (`Id_Sector`, `Id_Nivel`, `Id_Area`, los códigos de departamento/municipio, etc.) son en realidad **códigos categóricos** almacenados como número: correlacionarlos con Pearson no tendría interpretación válida. Las únicas variables genuinamente cuantitativas son los conteos de matrícula, así que la matriz de correlación se construye sobre variables **agregadas por institución**: total de matriculados, matriculados por periodo (normal, estallido social, pandemia), número de programas distintos ofrecidos y número de años con matrícula activa.
Como la matrícula está muy concentrada en unas pocas instituciones (el SENA, visto en el análisis univariado), se calculan **Pearson y Spearman en paralelo**: Spearman (basado en rangos) es más robusto frente a esa asimetría y sirve como verificación de si la conclusión cambia según el método.
Para la relación entre dos variables categóricas se usa **chi-cuadrado** entre `género` y `área del conocimiento`, construyendo la tabla de contingencia a partir de la **suma de matriculados** (no del conteo de filas, que representarían combinaciones institución-programa-año-semestre y no estudiantes). Dado el tamaño de la muestra (cientos de miles de matriculados), se complementa con la **V de Cramér** como medida de tamaño de efecto, para no confundir significancia estadística con relevancia práctica.
**Nota sobre `género`:** el código fuente usa 1/2 para Hombre/Mujer según la convención habitual del MEN; si al revisar `table(datos_matricula$genero)` aparecen valores distintos, ajusta el `case_when` de la sección de preparación.
</div>
## Fila 2
### Matriz de correlación - Pearson
```{r fig.height=6, fig.width=7}
datos_matricula <- datos_matricula %>%
mutate(genero_etiqueta = case_when(
genero == "1" ~ "Hombre",
genero == "2" ~ "Mujer",
TRUE ~ "No reportado"
))
# Variables cuantitativas.
resumen_institucion <- datos_matricula %>%
group_by(institucion) %>%
summarise(
total_matriculados = sum(matriculados, na.rm = TRUE),
matriculados_normal = sum(matriculados[periodo == "Periodo normal"], na.rm = TRUE),
matriculados_estallido = sum(matriculados[periodo == "Estallido social"], na.rm = TRUE),
matriculados_pandemia = sum(matriculados[periodo == "Pandemia"], na.rm = TRUE),
n_programas = n_distinct(programa),
n_anios_activos = n_distinct(anio),
.groups = "drop"
)
variables_cuantitativas <- resumen_institucion %>% select(-institucion)
matriz_pearson <- cor(variables_cuantitativas, method = "pearson")
matriz_spearman <- cor(variables_cuantitativas, method = "spearman")
tabla_genero_area <- datos_matricula %>%
filter(!is.na(genero_etiqueta)) %>%
group_by(genero_etiqueta, area_conocimiento) %>%
summarise(total = sum(matriculados, na.rm = TRUE), .groups = "drop") %>%
pivot_wider(names_from = area_conocimiento, values_from = total, values_fill = 0)
matriz_contingencia <- as.matrix(tabla_genero_area[, -1])
rownames(matriz_contingencia) <- tabla_genero_area$genero_etiqueta
chi_test <- chisq.test(matriz_contingencia)
# Convenciones de referencia (Evans, 1996) para etiquetar magnitudes.
interpretar_fuerza <- function(valor) {
v <- abs(valor)
case_when(
v < 0.10 ~ "muy débil",
v < 0.30 ~ "débil",
v < 0.50 ~ "moderada",
v < 0.70 ~ "fuerte",
TRUE ~ "muy fuerte"
)
}
cramers_v <- function(chi_stat, tabla) {
k <- min(dim(tabla)) - 1
sqrt(as.numeric(chi_stat) / (sum(tabla) * k))
}
graf_matriz_correlacion <- function(matriz, titulo) {
matriz_larga <- as.data.frame(as.table(matriz))
names(matriz_larga) <- c("Var1", "Var2", "Correlacion")
ggplot(matriz_larga, aes(x = Var1, y = Var2, fill = Correlacion)) +
geom_tile(color = "white") +
geom_text(aes(label = round(Correlacion, 2)), size = 3) +
scale_fill_gradient2(low = "#B2182B", mid = "white", high = "#2166AC",
midpoint = 0, limits = c(-1, 1)) +
labs(title = titulo, x = NULL, y = NULL, fill = "r") +
theme_minimal(base_size = 10) +
theme(axis.text.x = element_text(angle = 45, hjust = 1))
}
graf_matriz_correlacion(matriz_pearson, "Pearson - variables agregadas por institución")
```
## Fila 3
### Matriz de correlación - Spearman
```{r fig.height=6, fig.width=7}
graf_matriz_correlacion(matriz_spearman, "Spearman - variables agregadas por institución")
```
## Fila 4
### Interpretación de la correlación
```{r include=FALSE}
r_normal_pandemia <- matriz_pearson["matriculados_normal", "matriculados_pandemia"]
rho_normal_pandemia <- matriz_spearman["matriculados_normal", "matriculados_pandemia"]
r_total_programas <- matriz_pearson["total_matriculados", "n_programas"]
interpretacion_normal_pandemia <- ifelse(
r_normal_pandemia > 0.5,
"lo que indica que las instituciones con más matrícula antes de la pandemia tienden a mantener un tamaño relativo similar durante ella",
ifelse(
r_normal_pandemia > 0,
"lo que sugiere una relación positiva pero no muy marcada entre el tamaño institucional antes y durante la pandemia",
"lo que sugiere que el tamaño institucional antes de la pandemia no predice bien su tamaño durante ella"
)
)
```
La correlación de Pearson entre los matriculados del periodo normal y los de pandemia es de `r round(r_normal_pandemia, 2)` (`r interpretar_fuerza(r_normal_pandemia)`, `r ifelse(r_normal_pandemia > 0, "positiva", "negativa")`), `r interpretacion_normal_pandemia`. Con Spearman el coeficiente es `r round(rho_normal_pandemia, 2)`; si ambos números son similares, el sesgo por instituciones extremas (como el SENA) no está distorsionando de forma importante la conclusión — si difieren bastante, conviene confiar más en Spearman.
Por otro lado, la correlación entre el total de matriculados y el número de programas ofrecidos es de `r round(r_total_programas, 2)` (`r interpretar_fuerza(r_total_programas)`), es decir, que ofrecer más programas distintos `r ifelse(r_total_programas > 0.3, "está asociado con mayor matrícula total", "no está claramente asociado con el total de matriculados")`. La matriz completa (arriba) permite revisar cualquier otro par de variables agregadas.
## Fila 5
### Chi-cuadrado: género vs. área del conocimiento
```{r}
kable(tabla_genero_area, caption = "Matriculados por género y área del conocimiento", row.names = FALSE)
```
## Fila 6
### Proporción de género dentro de cada área
```{r fig.height=6, fig.width=10}
datos_matricula %>%
filter(!is.na(genero_etiqueta)) %>%
group_by(area_conocimiento, genero_etiqueta) %>%
summarise(total = sum(matriculados, na.rm = TRUE), .groups = "drop") %>%
ggplot(aes(x = area_conocimiento, y = total, fill = genero_etiqueta)) +
geom_col(position = "fill") +
scale_y_continuous(labels = percent) +
labs(title = "Proporción de matriculados por género dentro de cada área del conocimiento",
x = "Área del conocimiento", y = "Proporción de matriculados", fill = "Género") +
tema_dashboard
```
## Fila 7
### Interpretación de la prueba chi-cuadrado
```{r include=FALSE}
chi_p_valor <- chi_test$p.value
chi_estadistico <- unname(chi_test$statistic)
chi_gl <- unname(chi_test$parameter)
supuesto_ok <- all(chi_test$expected >= 5)
v_cramer <- cramers_v(chi_test$statistic, matriz_contingencia)
```
Con una muestra de `r format(sum(matriz_contingencia), big.mark = ".")` matriculados, la prueba chi-cuadrado de independencia entre género y área del conocimiento da un estadístico de `r format(round(chi_estadistico, 1), big.mark = ".", scientific = FALSE)` con `r chi_gl` grados de libertad y un valor p `r ifelse(chi_p_valor < 0.001, "< 0.001", round(chi_p_valor, 4))`. Todas las frecuencias esperadas fueron `r ifelse(supuesto_ok, "mayores o iguales a 5, cumpliendo el supuesto del test", "menores a 5 en alguna celda, por lo que el resultado debe interpretarse con cautela y podría preferirse un test exacto de Fisher")`.
Dado el tamaño de la muestra, es prácticamente seguro que el valor p sea muy pequeño incluso si la asociación real es débil — por eso conviene mirar el **tamaño de efecto**: la V de Cramér es `r round(v_cramer, 3)` (`r interpretar_fuerza(v_cramer)`), lo que indica que, en términos prácticos, la asociación entre género y área del conocimiento es **`r interpretar_fuerza(v_cramer)`**, más allá de que el resultado sea estadísticamente significativo. Es decir: puede haber diferencias reales en la distribución por género entre áreas, pero eso no implica necesariamente que el género "explique" de forma importante la elección de área de estudio.
Distribución global de carreras
======================================================================================================================
## Fila 1
### Descripción
A continuación, gráficos de barras que muestran las 100 carreras con más matrículas durante todo el periodo de estudio, tanto a nivel global como separadas por área del conocimiento. Algunos hallazgos:
- La carrera de Derecho fue, por lejos, la más popular en el periodo analizado.
- Dentro del top 100 global, Ingeniería Biomédica fue la carrera menos popular.
- En el top 10 global, 3 carreras pertenecen al bloque de Ingeniería, 3 al de Humanidades y 2 a cada uno de los bloques de Economía y Medicina.
##
### Popularidad de carrera - Global
```{r out.width="100%", fig.height=8, fig.width=12}
graf_top_programas(datos_matricula, "Popularidad de carrera - Global")
```
## Fila 2
### Descripción
```{r include=FALSE}
info_ciencias <- resumen_area(datos_matricula, "Ciencias")
```
Top 100 carreras con más matrículas para el área de **Ciencias** (`r comma(info_ciencias$n_programas)` programas distintos registrados en total). El programa líder es **`r info_ciencias$programa_top`**, con `r comma(info_ciencias$matriculas_top)` matriculados a lo largo del periodo — el `r percent(info_ciencias$participacion_top, accuracy = 0.1)` de toda la matrícula del área.
##
### Popularidad de carrera - Ciencias
```{r out.width="100%", fig.height=8, fig.width=12}
graf_top_programas(
filter(datos_matricula, area_conocimiento == "Ciencias"),
"Popularidad de carrera - Ciencias"
)
```
## Fila 3
### Descripción
```{r include=FALSE}
info_humanidades <- resumen_area(datos_matricula, "Humanidades")
```
Top 100 carreras con más matrículas para el área de **Humanidades** (`r comma(info_humanidades$n_programas)` programas distintos registrados en total). El programa líder es **`r info_humanidades$programa_top`**, con `r comma(info_humanidades$matriculas_top)` matriculados a lo largo del periodo — el `r percent(info_humanidades$participacion_top, accuracy = 0.1)` de toda la matrícula del área.
##
### Popularidad de carrera - Humanidades
```{r out.width="100%", fig.height=8, fig.width=12}
graf_top_programas(
filter(datos_matricula, area_conocimiento == "Humanidades"),
"Popularidad de carrera - Humanidades"
)
```
## Fila 4
### Descripción
```{r include=FALSE}
info_ingenieria <- resumen_area(datos_matricula, "Ingenieria")
```
Top 100 carreras con más matrículas para el área de **Ingeniería** (`r comma(info_ingenieria$n_programas)` programas distintos registrados en total). El programa líder es **`r info_ingenieria$programa_top`**, con `r comma(info_ingenieria$matriculas_top)` matriculados a lo largo del periodo — el `r percent(info_ingenieria$participacion_top, accuracy = 0.1)` de toda la matrícula del área.
##
### Popularidad de carrera - Ingeniería
```{r out.width="100%", fig.height=8, fig.width=12}
graf_top_programas(
filter(datos_matricula, area_conocimiento == "Ingenieria"),
"Popularidad de carrera - Ingeniería"
)
```
## Fila 5
### Descripción
```{r include=FALSE}
info_economia <- resumen_area(datos_matricula, "Economia")
```
Top 100 carreras con más matrículas para el área de **Economía** (`r comma(info_economia$n_programas)` programas distintos registrados en total). El programa líder es **`r info_economia$programa_top`**, con `r comma(info_economia$matriculas_top)` matriculados a lo largo del periodo — el `r percent(info_economia$participacion_top, accuracy = 0.1)` de toda la matrícula del área.
##
### Popularidad de carrera - Economía
```{r out.width="100%", fig.height=8, fig.width=12}
graf_top_programas(
filter(datos_matricula, area_conocimiento == "Economia"),
"Popularidad de carrera - Economía"
)
```
## Fila 6
### Descripción
```{r include=FALSE}
info_medicina <- resumen_area(datos_matricula, "Medicina")
```
Top 100 carreras con más matrículas para el área de **Medicina** (`r comma(info_medicina$n_programas)` programas distintos registrados en total). El programa líder es **`r info_medicina$programa_top`**, con `r comma(info_medicina$matriculas_top)` matriculados a lo largo del periodo — el `r percent(info_medicina$participacion_top, accuracy = 0.1)` de toda la matrícula del área.
##
### Popularidad de carrera - Medicina
```{r out.width="100%", fig.height=8, fig.width=12}
graf_top_programas(
filter(datos_matricula, area_conocimiento == "Medicina"),
"Popularidad de carrera - Medicina"
)
```
## Fila 7
### Descripción
```{r include=FALSE}
info_otros <- resumen_area(datos_matricula, "Otros")
```
Top 100 carreras con más matrículas para el grupo catalogado como **Otros** (`r comma(info_otros$n_programas)` programas distintos registrados en total). El programa líder es **`r info_otros$programa_top`**, con `r comma(info_otros$matriculas_top)` matriculados a lo largo del periodo — el `r percent(info_otros$participacion_top, accuracy = 0.1)` de toda la matrícula del área. Este grupo agrupa programas que no encajaron en ninguno de los patrones de texto usados para clasificar las demás áreas (ver el chunk `limpieza`), así que conviene revisarlo ocasionalmente para detectar si algún núcleo de conocimiento importante quedó mal clasificado.
##
### Popularidad de carrera - Otros
```{r out.width="100%", fig.height=8, fig.width=12}
graf_top_programas(
filter(datos_matricula, area_conocimiento == "Otros"),
"Popularidad de carrera - Otros"
)
```
Periodo Normal
======================================================================================================================
## Fila 1
### Contexto
```{r include=FALSE}
datos_normal <- filter(datos_matricula, periodo == "Periodo normal")
info_normal <- resumen_periodo(datos_normal)
```
Durante el periodo normal (2016-2017) se registraron `r comma(info_normal$total_periodo)` matrículas en total. La institución con más matriculados fue **`r info_normal$institucion_top`**, con `r comma(info_normal$matriculas_top)` matriculados — el `r percent(info_normal$participacion_top, accuracy = 0.1)` del total del periodo, un nivel de concentración institucional similar al observado en el análisis global.
##
### Top instituciones más populares
```{r out.width="100%", fig.height=8, fig.width=12}
graf_top_instituciones(datos_normal, "Instituciones con más matriculados - Periodo normal")
```
##
### Gráfico de cajas
```{r out.width="100%", fig.height=15, fig.width=15}
graf_boxplot_area(datos_normal)
```
##
### Gráfico de densidad
```{r fig.height=10, fig.width=20}
graf_densidad_area(datos_normal)
```
Periodo Estallido Social
======================================================================================================================
## Fila 1
### Contexto
```{r include=FALSE}
datos_estallido <- filter(datos_matricula, periodo == "Estallido social")
info_estallido <- resumen_periodo(datos_estallido)
```
Durante el periodo del estallido social (2018-2019) se registraron `r comma(info_estallido$total_periodo)` matrículas en total (`r percent((info_estallido$total_periodo - info_normal$total_periodo) / info_normal$total_periodo, accuracy = 0.1)` respecto al periodo normal). La institución líder siguió siendo **`r info_estallido$institucion_top`**, con `r comma(info_estallido$matriculas_top)` matriculados — el `r percent(info_estallido$participacion_top, accuracy = 0.1)` del periodo.
##
### Top instituciones más populares
```{r out.width="100%", fig.height=8, fig.width=12}
graf_top_instituciones(datos_estallido, "Instituciones con más matriculados - Estallido social")
```
##
### Gráfico de cajas
```{r out.width="100%", fig.height=15, fig.width=15}
graf_boxplot_area(datos_estallido)
```
##
### Gráfico de densidad
```{r fig.height=10, fig.width=20}
graf_densidad_area(datos_estallido)
```
Periodo Pandemia
======================================================================================================================
## Fila 1
### Contexto
```{r include=FALSE}
datos_pandemia <- filter(datos_matricula, periodo == "Pandemia")
info_pandemia <- resumen_periodo(datos_pandemia)
```
Durante la pandemia (2020-2021) se registraron `r comma(info_pandemia$total_periodo)` matrículas en total — una variación de `r percent((info_pandemia$total_periodo - info_normal$total_periodo) / info_normal$total_periodo, accuracy = 0.1)` respecto al periodo normal, consistente con la caída de matrículas observada desde 2020 en el análisis univariado. La institución líder se mantuvo como **`r info_pandemia$institucion_top`** (`r percent(info_pandemia$participacion_top, accuracy = 0.1)` del periodo), lo cual es coherente con la fuerte correlación entre periodos (Pearson `r round(r_normal_pandemia, 2)`, Spearman `r round(rho_normal_pandemia, 2)`) ya reportada en el análisis bivariado: las instituciones grandes se mantuvieron grandes también durante la pandemia.
##
### Top instituciones más populares
```{r out.width="100%", fig.height=8, fig.width=12}
graf_top_instituciones(datos_pandemia, "Instituciones con más matriculados - Pandemia")
```
##
### Gráfico de cajas
```{r out.width="100%", fig.height=15, fig.width=15}
graf_boxplot_area(datos_pandemia)
```
##
### Gráfico de densidad
```{r fig.height=10, fig.width=20}
graf_densidad_area(datos_pandemia)
```
Conclusiones y recomendaciones
======================================================================================================================
## Fila 1 {data-height=300}
### Síntesis
A lo largo de este tablero se analizó la matrícula en educación superior en Colombia entre 2015 y 2021, a partir de datos abiertos del Ministerio de Educación Nacional (MEN). Los análisis univariados muestran una distribución de la matrícula **altamente concentrada**: el Servicio Nacional de Aprendizaje (SENA) domina por amplio margen sobre el resto de instituciones, y solo un puñado de programas académicos (Derecho a la cabeza) concentra buena parte de las matrículas, mientras que la mayoría de los programas no superan las 200 matrículas en todo el periodo.
También se observa una caída marcada en el total de matriculados a partir de 2020, coincidente en el tiempo con el inicio de la pandemia de Covid-19. Vale la pena ser precisos aquí: la coincidencia temporal **no es evidencia suficiente de una relación causal exclusiva** — el dataset no incluye variables que permitan descartar otros factores simultáneos (cambios en la oferta educativa, en el financiamiento, etc.), así que esta asociación debe leerse como una hipótesis razonable y no como una conclusión cerrada.
## Fila 2 {data-height=350}
### hallazgos análisis bivariado
- **Estabilidad institucional entre periodos:** la correlación de Pearson entre los matriculados del periodo normal y los de pandemia (agregados por institución) fue de `r round(r_normal_pandemia, 2)`, y con Spearman `r round(rho_normal_pandemia, 2)` — ambas fuertes y positivas. Esto indica que las instituciones que ya concentraban más matrícula antes de la pandemia siguieron siendo, en términos relativos, las más grandes durante ella; la diferencia entre ambos coeficientes también confirma que el Pearson está algo inflado por instituciones extremas (como el SENA), por lo que el valor de Spearman es la estimación más confiable del patrón típico.
- **Oferta de programas y matrícula total:** la correlación entre el número de programas distintos ofrecidos y el total de matriculados por institución fue de `r round(r_total_programas, 2)` (fuerte), consistente con que las instituciones con oferta académica más diversificada también concentran más matrícula — sin que esto implique, por sí solo, una relación causal en una única dirección.
- **Género y área del conocimiento:** existe una asociación estadísticamente significativa entre género y área del conocimiento (chi-cuadrado, p `r ifelse(chi_p_valor < 0.001, "< 0.001", round(chi_p_valor, 4))`), pero de **magnitud práctica débil** (V de Cramér = `r round(v_cramer, 3)`). En términos concretos, Ingeniería concentra una mayor proporción de matriculados hombres, mientras que Medicina concentra una mayor proporción de mujeres — un patrón de segregación por área ya documentado en la literatura de educación superior. Es importante no sobre-interpretar la significancia estadística aquí: con una muestra de más de 24 millones de matriculados, incluso diferencias pequeñas resultan "significativas"; el tamaño de efecto (débil) es el que refleja mejor la relevancia real del patrón.
## Fila 3 {data-height=300}
### Recomendaciones
- **Separar al SENA en comparaciones institucionales.** Dado su peso desproporcionado, cualquier análisis que busque comparar instituciones "típicas" (por ejemplo, para política pública de cobertura regional) debería reportar los resultados con y sin el SENA, para evitar que una sola institución distorsione las conclusiones generales.
- **Investigar la relación oferta-matrícula con más detalle.** La correlación entre número de programas y matrícula total es fuerte pero no aclara la dirección de la causalidad (¿más programas atraen más estudiantes, o las instituciones grandes simplemente pueden permitirse ofrecer más programas?); un estudio de series de tiempo por institución podría aclararlo.
- **Profundizar en la brecha de género por área, más allá de describirla.** Ya que la asociación entre género y área es real (aunque débil), se recomienda un análisis complementario con variables adicionales (tasa de graduación, deserción, nivel socioeconómico) para entender qué explica esos patrones, en vez de quedarse solo en la descripción.
- **Actualizar el periodo de análisis.** El dataset llega hasta 2021; dado que la caída de matrícula coincide con el inicio de la pandemia, sería valioso extender el análisis con datos más recientes para verificar si la matrícula se recuperó, se estabilizó en un nuevo nivel, o seguió cayendo.
## Fila 4 {data-height=250}
### Limitaciones
- El dataset cubre únicamente 2015-2021; no permite evaluar tendencias posteriores a la pandemia.
- La variable de género se trabajó de forma binaria (Hombre/Mujer) según la codificación disponible en los datos, lo cual no captura toda la diversidad de identidades de género.
- No se cuenta con variables socioeconómicas (estrato, ingresos, tipo de colegio de origen, etc.) que permitirían un análisis de equidad más completo más allá del género y el área de conocimiento.
- Los resultados de significancia estadística en pruebas con muestras muy grandes (como el chi-cuadrado de este tablero) deben interpretarse siempre junto con el tamaño de efecto, no de forma aislada — una limitación metodológica general a tener presente en cualquier réplica de este análisis con datos igual de masivos.