Pregunta de análisis
¿Cómo se distribuyen la actividad económica por habitante y la cobertura educativa entre los municipios del Valle del Cauca, y qué cambios territoriales se observan en el tiempo?
Se instalan los paquetes necesarios para la ejecución del proyecto:
tidyverse, readxl, scales, rmarkdown, knitr
Se guardan los cuatro códigos de los incadores en objetos.
| codigo_indicador | nombre_corto |
|---|---|
| 010010009 | Población total |
| 120210001 | Valor agregado |
| 040010012 | Cobertura neta |
| 040020001 | Deserción intraanual |
El Excel original está en la carpeta /datos del
proyecto.
| filas | columnas |
|---|---|
| 153473 | 14 |
## Rows: 153,473
## Columns: 14
## $ `Código Departamento` <chr> "76", "76", "76", "76", "76", "76", "76", "76", …
## $ Departamento <chr> "Valle del Cauca", "Valle del Cauca", "Valle del…
## $ `Código Entidad` <chr> "76000", "76001", "76020", "76036", "76041", "76…
## $ Entidad <chr> "Valle del Cauca", "Cali", "Alcalá", "Andalucía"…
## $ Dimensión <chr> "Descripción general", "Descripción general", "D…
## $ Subcategoría <chr> "Descripción general", "Descripción general", "D…
## $ Indicador <chr> "Código DANE", "Código DANE", "Código DANE", "Có…
## $ `Código Indicador` <chr> "010010001", "010010001", "010010001", "01001000…
## $ `Dato Numérico` <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, …
## $ `Dato Cualitativo` <chr> "76", "76001", "76020", "76036", "76041", "76054…
## $ Año <dbl> 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, …
## $ Mes <dbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, …
## $ Fuente <chr> "DANE", "DANE", "DANE", "DANE", "DANE", "DANE", …
## $ `Unidad de Medida` <chr> "Texto", "Texto", "Texto", "Texto", "Texto", "Te…
| Código Departamento | Departamento | Código Entidad | Entidad | Dimensión | Subcategoría | Indicador | Código Indicador | Dato Numérico | Dato Cualitativo | Año | Mes | Fuente | Unidad de Medida |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 76 | Valle del Cauca | 76000 | Valle del Cauca | Descripción general | Descripción general | Código DANE | 010010001 | NA | 76 | 2000 | 0 | DANE | Texto |
| 76 | Valle del Cauca | 76001 | Cali | Descripción general | Descripción general | Código DANE | 010010001 | NA | 76001 | 2000 | 0 | DANE | Texto |
| 76 | Valle del Cauca | 76020 | Alcalá | Descripción general | Descripción general | Código DANE | 010010001 | NA | 76020 | 2000 | 0 | DANE | Texto |
| 76 | Valle del Cauca | 76036 | Andalucía | Descripción general | Descripción general | Código DANE | 010010001 | NA | 76036 | 2000 | 0 | DANE | Texto |
| 76 | Valle del Cauca | 76041 | Ansermanuevo | Descripción general | Descripción general | Código DANE | 010010001 | NA | 76041 | 2000 | 0 | DANE | Texto |
La base de datos tiene 153.473 filas y 14 columnas, Año
y Mes se importan como tipo de dato númerico
(<dbl>), pero todas las demás columnas llegan como
tipo de dato de texto (<chr>), incluidos los códigos
y la variable Dato Numérico. Que los códigos sean texto es
bueno, ya que así se pueden ver los ceros a la izquierda, ej.
(010010001). En cambio, la variable
Dato Numérico viene escrito con punto para miles y coma
para decimales, por ejemplo 4.059.339,00), así que debemos
convertirlo a número válido para R antes de calcular.
Cada fila es un indicador, para una entidad territorial, en un periodo (año y mes). Por eso la misma entidad aparece muchas veces, una vez por cada indicador y cada año. La base está en formato largo.
| Columna | Descripción |
|---|---|
Código Entidad |
Código del DANE de la entidad. 76000 es el agregado
departamental del Valle; los demás (76001 Cali,
76109 Buenaventura, …) son los 42 municipios. Es la clave
territorial. |
Código Indicador |
Identificador del indicador. Es más seguro filtrar por código que por el nombre, que es un texto largo. |
Año |
Año del dato. |
Mes |
Mes de referencia. (dato anual con corte a diciembre). |
Dato Numérico |
El valor del indicador cuando es una cantidad. Si está vacío, el dato no está disponible. |
Dato Cualitativo |
El valor cuando el indicador es un texto o una categoría (por ejemplo, el propio código DANE). |
Fuente |
Entidad que produce el dato (DANE, Ministerio de Educación, SINEB, …). |
Unidad de Medida |
Unidad en que se expresa el dato: personas, porcentaje, miles de millones de pesos, etc. |
Siguiendo lo visto en clase, renombramos las columnas a nombres sin
tildes ni espacios y convertimos los tipos. Para
Dato Numérico usamos parse_number() indicando
que la coma es el separador decimal y el punto el de miles.
Comprobamos que la conversión no creó faltantes nuevos: un texto vacío debe seguir vacío, y un texto con número debe quedar como número.
| vacios_en_texto | faltantes_tras_convertir |
|---|---|
| 27849 | 27849 |
| entidad | dato_texto | dato_numerico |
|---|---|---|
| Zarzal | 43.578,00 | 43578 |
| Yumbo | 113.917,00 | 113917 |
| Yotoco | 16.679,00 | 16679 |
| Vijes | 13.729,00 | 13729 |
| codigo_indicador | nombre_corto | registros | entidades | anio_inicial | anio_final | anios | faltantes | unidad | fuente |
|---|---|---|---|---|---|---|---|---|---|
| 010010009 | Población total | 1118 | 43 | 2000 | 2025 | 26 | 0 | Personas | DANE |
| 040010012 | Cobertura neta | 860 | 43 | 2005 | 2024 | 20 | 0 | Porcentaje (el valor está multiplicado por 100) | Ministerio de Educación Nacional |
| 040020001 | Deserción intraanual | 946 | 43 | 2003 | 2024 | 22 | 336 | Porcentaje (el valor está multiplicado por 100) | SINEB - Sistema de Información Nacional de Educación Básica y Media |
| 120210001 | Valor agregado | 546 | 42 | 2011 | 2023 | 13 | 0 | Miles de millones de pesos corrientes | DANE |
Población, cobertura y deserción tienen 43 entidades (42 municipios más el departamento); el valor agregado solo trae los 42 municipios. El único indicador con datos numéricos faltantes es la deserción. Los porcentajes ya vienen en escala 0–100 (“el valor está multiplicado por 100”).
Comparamos cada texto con su versión “apretada” por
str_squish(). Si son distintos, el texto tenía espacios al
inicio, al final o dobles en el medio.
| columna | texto_visible | filas |
|---|---|---|
| fuente | DNP··a·partir·de·información·del·DANE | 1890 |
| fuente | DNP·a·partir·de·información·del·DANE··y·del·Ministerio·del·Interior | 1032 |
| indicador | Población·de·adolescentes·y·jóvenes·de 12 a 28 años | 344 |
En la tabla los espacios se muestran como · para poder
verlos.
## [1] 0
Encontramos 3 etiquetas con espacios sobrantes, en 3.266 filas: el
nombre del indicador “Población de adolescentes y jóvenes de 12 a 28
años” usaba espacios no separables (un carácter invisible, que
se ve igual a un espacio pero R lo trata como otro símbolo), y dos
textos de Fuente tenían espacios dobles (“DNP␣␣a partir…”,
“DANE␣␣y del…”). str_squish() quita los espacios de los
extremos y deja uno solo entre palabras. Con eso, la misma fuente ya no
aparece como dos categorías distintas al usar count() o
group_by(). El Excel original no se tocó; la corrección
vive solo en el objeto nuevo creado.
Para estos indicadores esperamos una fila por entidad, indicador, año y mes. Contamos cuántas veces aparece cada combinación.
## # A tibble: 0 × 6
## # ℹ 6 variables: tipo_entidad <chr>, codigo_entidad <chr>,
## # codigo_indicador <chr>, anio <int>, mes <int>, apariciones <int>
| codigo_indicador | nombre_corto | tipo_entidad | combinaciones | combinaciones_repetidas |
|---|---|---|---|---|
| 010010009 | Población total | Departamento | 26 | 0 |
| 010010009 | Población total | Municipio | 1092 | 0 |
| 040010012 | Cobertura neta | Departamento | 20 | 0 |
| 040010012 | Cobertura neta | Municipio | 840 | 0 |
| 040020001 | Deserción intraanual | Departamento | 22 | 0 |
| 040020001 | Deserción intraanual | Municipio | 924 | 0 |
| 120210001 | Valor agregado | Municipio | 546 | 0 |
| filas_base_taller | filas_tras_distinct |
|---|---|
| 3470 | 3470 |
Encontramos que no hay combinaciones repetidas en ninguno de los
cuatro indicadores, ni para municipios ni para el departamento, y
distinct() no retira ninguna fila. Por lo tanto no
borramos nada. Si hubieran duplicados, primero los mostraríamos
y revisaríamos si son copias exactas o registros con valores diferentes,
porque distinct() solo resuelve el primer caso.
tipo_entidad en todo el taller.
| Año | Departamento (%) | Municipios (%) |
|---|---|---|
| 2003 | 0 | 100 |
| 2004 | 0 | 100 |
| 2005 | 0 | 100 |
| 2006 | 0 | 100 |
| 2007 | 0 | 100 |
| 2008 | 0 | 100 |
| 2009 | 0 | 100 |
| 2010 | 0 | 100 |
| 2011 | 0 | 0 |
| 2012 | 0 | 0 |
| 2013 | 0 | 0 |
| 2014 | 0 | 0 |
| 2015 | 0 | 0 |
| 2016 | 0 | 0 |
| 2017 | 0 | 0 |
| 2018 | 0 | 0 |
| 2019 | 0 | 0 |
| 2020 | 0 | 0 |
| 2021 | 0 | 0 |
| 2022 | 0 | 0 |
| 2023 | 0 | 0 |
| 2024 | 0 | 0 |
## [1] 2011 2012 2013 2014 2015 2016 2017 2018 2019 2020 2021 2022 2023 2024
El dato departamental está completo en todos los años (2003–2024). Para los municipios, todos los registros de 2003 a 2010 están vacíos (100 % faltante) y desde 2011 hasta 2024 están completos (0 %). Por eso solo es posible comparar la deserción entre municipios entre 2.011 y 2.024. Antes de 2011 únicamente tenemos el promedio del departamento, que no permite ver diferencias territoriales.
Filtramos 2023, mes 12, solo municipios y los tres indicadores. Luego
pasamos de formato largo a ancho con pivot_wider() para
tener una fila por municipio.
Calculamos el valor agregado por habitante en millones de pesos.
\[ VA_{pc,2023} = \frac{VA_{2023}\ (\text{miles de millones de pesos}) \times 1000}{\text{población}_{2023}\ (\text{personas})} \]
| filas | municipios_distintos | incluye_departamento | faltantes_poblacion | faltantes_valor_agregado | faltantes_cobertura |
|---|---|---|---|---|---|
| 42 | 42 | FALSE | 0 | 0 | 0 |
| codigo_entidad | entidad | poblacion | cobertura_neta | valor_agregado | va_pc |
|---|---|---|---|---|---|
| 76001 | Cali | 2.280.485 | 80,63 | 61.090,57 | 26,79 |
| 76520 | Palmira | 375.394 | 80,22 | 10.448,04 | 27,83 |
| 76109 | Buenaventura | 325.233 | 67,89 | 6.043,18 | 18,58 |
| 76834 | Tuluá | 223.026 | 68,90 | 5.227,79 | 23,44 |
| 76364 | Jamundí | 185.865 | 78,33 | 4.095,42 | 22,03 |
| 76147 | Cartago | 141.786 | 72,46 | 3.983,69 | 28,10 |
Calculamos cuánto valor agregado le corresponde, en promedio, a cada habitante, expresado en millones de pesos. Como el valor agregado está reportado en miles de millones de pesos y queremos el resultado en millones de pesos por persona, lo multiplicamos por 1.000 para convertirlo a millones de pesos. Después, dividimos ese valor entre la población para obtener el resultado por persona.
Si no hiciéramos esta conversión, el indicador quedaría expresado en miles de millones de pesos por habitante, generando números muy pequeños y menos intuitivos de interpretar.
Elegimos tres municipios con perfiles distintos: Cali (la capital), Buenaventura (el puerto del Pacífico) y Yumbo (municipio industrial).
| entidad | poblacion_2011 | poblacion_2023 | variacion_poblacion_pct | cobertura_2011 | cobertura_2023 | cambio_cobertura_pp |
|---|---|---|---|---|---|---|
| Yumbo | 99.964 | 113.917 | 14,0 | 95,9 | 104,6 | 8,7 |
| Buenaventura | 297.593 | 325.233 | 9,3 | 66,5 | 67,9 | 1,4 |
| Cali | 2.156.926 | 2.280.485 | 5,7 | 87,8 | 80,6 | -7,2 |
La variación de la población muestra qué tanto aumentó o disminuyó el número de habitantes entre 2011 y 2023, por lo que se expresa como un porcentaje (%). Por su parte, el cambio en la cobertura neta se calcula como la diferencia entre dos porcentajes, razón por la cual se mide en puntos porcentuales (p. p.).
Entre 2011 y 2023 la población de Cali cambió 5,7 %, la de Buenaventura 9,3 % y la de Yumbo 14 %. La cobertura neta cambió -7,2 p. p. en Cali, 1,4 p. p. en Buenaventura y 8,7 p. p. en Yumbo.
| tamano | n |
|---|---|
| Bajo | 21 |
| Alto | 21 |
La mediana de la población en 2023 es 24.168 personas. Los municipios por encima de ella se clasifican como de tamaño alto y el resto como bajo. Como hay 42 municipios, la mediana cae entre dos municipios y los grupos quedan de 21 y 21.
| filas_guardadas | filas_leidas | coinciden |
|---|---|---|
| 42 | 42 | TRUE |
Al leer la base de datos, tamano vuelve como texto y
codigo_entidad como número. Si volvemos a usar ese archivo,
hay que convertir de nuevo la clasificación con
factor().
| minimo | q1 | mediana | media | q3 | maximo |
|---|---|---|---|---|---|
| 18.5 | 26.2 | 31.3 | 33.7 | 37.4 | 109.8 |
¿La mayor parte está en un mismo rango? ¿Hay una cola amplia? Sí, la mayoría de los municipios se concentra entre unos 20 y 40 millones de pesos por habitante (el 50 % central va de 26,2 a 37,4 millones, con mediana de 31,3). La distribución tiene una cola larga a la derecha: unos pocos municipios, sobre todo Yumbo (109,8 millones) y Bugalagrande, quedan muy lejos del grupo. Por esa cola, la media (33,7) es mayor que la mediana.
| tamano | municipios | mediana | q1 | q3 | ric | atipicos |
|---|---|---|---|---|---|---|
| Bajo | 21 | 32.2 | 30.9 | 37.3 | 6.4 | 2 |
| Alto | 21 | 27.8 | 23.1 | 37.4 | 14.3 | 2 |
¿Cómo se comparan las medianas, los RIC y los atípicos? La mediana del grupo de tamaño bajo (32,2 millones) es algo mayor que la del grupo alto (27,8 millones), así que ser un municipio más poblado no implica producir más por habitante. El grupo alto es mucho más disperso, su RIC (14,3 millones) es más del doble que el del grupo bajo (6,4). En el grupo alto aparecen como atípicos Yumbo y Bugalagrande por arriba; en el bajo, Restrepo por arriba y Toro por debajo.
| correlacion | municipios_en_el_calculo |
|---|---|
| 0.44 | 42 |
¿Hay asociación? La correlación de Pearson con casos completos es 0,44 y entran en el cálculo los 42 municipios. A primera vista es una asociación positiva moderada, pero el gráfico muestra que la nube de puntos no tiene una tendencia clara y que Yumbo, con el VA por habitante y la cobertura más altos, arrastra la recta. Al quitarlo, solo como prueba de sensibilidad, la correlación cae casi a cero.
| municipios | correlacion_sin_yumbo |
|---|---|
| 41 | 0.08 |
Por lo tanto, no podemos decir que los municipios con más actividad económica por habitante tengan, en general, más cobertura, Aunque la correlación fuera alta, sería una asociación descriptiva, no una relación causal.
Construimos una tabla anual de cobertura para todos los municipios.
¿Qué cambia a lo largo del periodo? Yumbo mantiene la cobertura más alta del grupo y sube hasta superar el 100 % en 2023 (104,6 %), lo que puede pasar cuando el municipio recibe estudiantes de otros municipios o cuando la proyección de población en edad escolar queda corta. Cali baja de 87,8 % a 80,6 %, una caída de 7,2 puntos porcentuales. Buenaventura es la serie más inestable: salta de 66,5 % en 2011 a 95,6 % en 2015 y luego desciende hasta 67,9 % en 2023, casi el mismo nivel de partida; ese pico tan brusco merece revisarse en la fuente antes de interpretarlo como un cambio real.
¿Qué muestra el ordenamiento y qué no permite concluir? El ordenamiento muestra que Yumbo está muy por encima del resto y que el top 10 incluye municipios pequeños como Restrepo, Yotoco, Obando y Bolívar, mientras que Cali, la ciudad más grande, no aparece. No permite concluir que sus habitantes tengan mayores ingresos ni mejor calidad de vida. El valor agregado se registra donde está la producción (plantas industriales, ingenios, zonas francas) y no donde viven o reciben ingresos los dueños y trabajadores. Tampoco muestra cuánto pesa cada municipio en la economía del departamento, Cali tiene un VA por habitante medio, pero concentra la mayor parte del VA total.
| medida | va_pc |
|---|---|
| Promedio simple de los 42 municipios | 33.7 |
| Promedio ponderado por población (VA total / población total) | 29.4 |
El promedio simple trata igual a Argelia (unos 5.500 habitantes) que a Cali (2,3 millones), y por eso queda arrastrado por municipios pequeños o con valores extremos como Yumbo. El promedio ponderado por población es el VA total dividido por la población total de los 42 municipios y es el que se acercaría a un dato del departamento; resulta más bajo porque Cali, Buenaventura y Tuluá, muy poblados, tienen un VA por habitante medio o bajo. La base no trae el valor agregado del agregado 76000, así que el promedio ponderado es nuestra mejor aproximación.
| entidad | va_pc | va_pc_z | va_pc_minmax | cobertura_neta | cobertura_z | cobertura_minmax |
|---|---|---|---|---|---|---|
| Yumbo | 109.81 | 5.15 | 1.00 | 104.58 | 3.15 | 1.00 |
| Tuluá | 23.44 | -0.69 | 0.05 | 68.90 | -0.49 | 0.32 |
| Palmira | 27.83 | -0.40 | 0.10 | 80.22 | 0.66 | 0.54 |
| El Cairo | 30.26 | -0.23 | 0.13 | 65.16 | -0.87 | 0.25 |
| Buenaventura | 18.58 | -1.02 | 0.00 | 67.89 | -0.59 | 0.30 |
| Cali | 26.79 | -0.47 | 0.09 | 80.63 | 0.71 | 0.54 |
Comprobamos la transformación, las puntuaciones z deben tener media 0 y desviación 1, y las mínimo–máximo deben ir de 0 a 1.
| media_va_pc_z | sd_va_pc_z | min_va_pc_minmax | max_va_pc_minmax |
|---|---|---|---|
| 0 | 1 | 0 | 1 |
Un valor z positivo indica que el municipio está por encima del promedio de los 42 municipios, medido en desviaciones estándar: el z de 5,1 de Yumbo en VA por habitante significa que está más de cinco desviaciones estándar por encima de la media. Un z negativo, como el de Buenaventura, indica que está por debajo. Un valor mínimo–máximo cercano a 1 indica que el municipio está cerca del máximo observado dentro del rango (Yumbo es el máximo, por eso vale 1). No es un percentil: Palmira tiene 0,1 en VA por habitante, lo que no significa que esté en el 10 % más bajo; como Yumbo estira el rango, casi todos los municipios quedan comprimidos cerca de 0.
| q1 | mediana | q3 | ric | limite_inferior | limite_superior |
|---|---|---|---|---|---|
| 26.2 | 31.34 | 37.4 | 11.2 | 9.4 | 54.2 |
| entidad | poblacion | valor_agregado | va_pc |
|---|---|---|---|
| Yumbo | 113.917 | 12.508,9 | 109,8 |
| Bugalagrande | 25.273 | 1.602,1 | 63,4 |
Calculamos media y mediana con y sin los atípicos, sin
borrar las filas de municipios_2023 para ver la
sensibilidad.
| escenario | municipios | media | mediana |
|---|---|---|---|
| Todos los municipios | 42 | 33.69 | 31.34 |
| Sin alertas RIC | 40 | 31.04 | 31.19 |
## [1] 42
La regla marca 2 municipios por encima del límite superior de 54,2 millones: Yumbo y Bugalagrande; ninguno queda por debajo del límite inferior. Al dejarlos por fuera, la media baja bastante más que la mediana, lo que confirma que la media es más sensible a los extremos. La base de trabajo sigue teniendo las 42 filas.
Yumbo concentra una gran zona industrial y Bugalagrande alberga actividad agroindustrial importante con poca población; en ambos casos es esperable que el valor agregado por habitante sea muy alto. Son observaciones legítimas y, para una pregunta sobre desigualdad territorial, son parte central del fenómeno. Borrarlas cambiaría la respuesta, no la “corregiría”.
La función graficar_cobertura() recibe:
datos: la tabla anual de cobertura
(cobertura_anual), con columnas
codigo_entidad, entidad, anio y
cobertura_neta;municipio: el nombre (por ejemplo "Cali")
o el código DANE (por ejemplo "76001") del municipio;anio_inicial y anio_final: el periodo a
graficar (por defecto 2011–2023).Y devuelve un objeto ggplot: un gráfico de líneas con el
nombre del municipio en el título. Antes de graficar valida que las
columnas existan y que el municipio esté en la tabla.
Probamos que acepte un código:
Ahora usamos un ciclo for para los tres municipios
elegidos. Dentro de un ciclo, R no muestra los gráficos automáticamente,
por eso usamos print():