Informalidad por departamento#
dane-data define la informalidad por seguridad social: un ocupado es formal si está afiliado a salud y
cotiza a pensión (vea Variables armonizadas). La tasa oficial del DANE usa además el tamaño de la
empresa, así que los niveles no son iguales a los publicados.
import dane_data as dd
dpto = dd.geih.serie_indicadores(2025, por="departamento")
dpto[["departamento", "ocupados", "tasa_informalidad", "n_muestra"]].sort_values("tasa_informalidad").round(1)
| departamento | ocupados | tasa_informalidad | n_muestra | |
|---|---|---|---|---|
| 26 | San Andrés | 20982.9 | 28.1 | 8340 |
| 4 | Bogotá D.C. | 4322854.5 | 36.0 | 26316 |
| 13 | Cundinamarca | 1740859.3 | 43.9 | 16190 |
| 1 | Antioquia | 3383382.5 | 46.8 | 47177 |
| 31 | Vaupés | 5321.8 | 48.7 | 5235 |
| 25 | Risaralda | 463756.1 | 49.8 | 36638 |
| 7 | Caldas | 481833.3 | 51.2 | 38633 |
| 23 | Putumayo | 17166.2 | 51.7 | 4347 |
| 30 | Valle del Cauca | 2122393.6 | 52.1 | 41246 |
| 9 | Casanare | 81569.7 | 53.1 | 5223 |
| 24 | Quindío | 262495.1 | 54.4 | 31530 |
| 32 | Vichada | 7715.2 | 56.5 | 3083 |
| 27 | Santander | 1081206.7 | 57.6 | 39825 |
| 0 | Amazonas | 16640.3 | 59.4 | 4088 |
| 3 | Atlántico | 1285084.0 | 60.6 | 35621 |
| 2 | Arauca | 37095.7 | 61.0 | 4713 |
| 20 | Meta | 537621.0 | 61.3 | 32313 |
| 6 | Boyacá | 542775.0 | 62.5 | 28218 |
| 16 | Guaviare | 23801.0 | 64.0 | 4390 |
| 29 | Tolima | 612081.7 | 69.6 | 26483 |
| 15 | Guainía | 9060.0 | 69.8 | 4199 |
| 5 | Bolívar | 906824.9 | 70.4 | 35371 |
| 22 | Norte de Santander | 697173.9 | 71.8 | 31626 |
| 11 | Cesar | 534063.1 | 73.0 | 29531 |
| 19 | Magdalena | 619945.6 | 74.6 | 35214 |
| 17 | Huila | 472065.7 | 75.5 | 29431 |
| 8 | Caquetá | 160977.5 | 76.7 | 27647 |
| 12 | Chocó | 138249.3 | 80.2 | 31372 |
| 18 | La Guajira | 364235.5 | 81.6 | 30049 |
| 10 | Cauca | 705333.7 | 82.1 | 28353 |
| 14 | Córdoba | 837814.5 | 83.2 | 27022 |
| 28 | Sucre | 425549.0 | 84.0 | 32205 |
| 21 | Nariño | 909505.7 | 84.6 | 35921 |
Cada departamento tiene una muestra distinta; las cifras de los departamentos con pocas observaciones
(n_muestra) tienen más error de muestreo.
d = dpto.dropna(subset=["departamento"]).sort_values("tasa_informalidad")
nacional = dd.geih.serie_indicadores(2025)["tasa_informalidad"].iloc[0]
fig, ax = plt.subplots(figsize=(8, 7.5))
colores = ["#eb6834" if t > nacional else "#2a78d6" for t in d["tasa_informalidad"]]
ax.barh(d["departamento"].astype(str), d["tasa_informalidad"], color=colores)
ax.axvline(nacional, color="0.25", lw=1, ls="--")
ax.text(nacional + 0.8, 0.2, f"Nacional: {nacional:.1f} %", fontsize=10, color="0.25")
ax.xaxis.set_major_formatter(mtick.PercentFormatter(decimals=0))
ax.set_xlim(0, 100)
ax.set_title("Ocupados sin salud y pensión, 2025")
ax.grid(axis="y", visible=False)
fig.tight_layout();
Por zona y nivel educativo#
zona = dd.geih.serie_indicadores(2025, por="zona")[["zona", "tasa_informalidad"]]
educ = dd.geih.serie_indicadores(2025, por="nivel_educativo")[["nivel_educativo", "tasa_informalidad"]]
zona.round(1), educ.dropna().round(1)
( zona tasa_informalidad
0 Urbano (cabecera) 49.8
1 Rural (centros poblados y disperso) 83.9,
nivel_educativo tasa_informalidad
0 Ninguno 96.2
1 Primaria 86.3
2 Secundaria 82.0
3 Media 59.3
4 Superior 26.4)
La informalidad es mucho mayor en la zona rural y baja con la educación: entre quienes tienen educación superior es una fracción de la de quienes solo tienen primaria.
En el tiempo#
serie = dd.geih.serie_indicadores(range(2022, 2026), por="zona")
serie.pivot(index="anio", columns="zona", values="tasa_informalidad").round(1)
| zona | Urbano (cabecera) | Rural (centros poblados y disperso) |
|---|---|---|
| anio | ||
| 2022 | 51.9 | 85.3 |
| 2023 | 50.5 | 84.6 |
| 2024 | 49.9 | 84.5 |
| 2025 | 49.8 | 83.9 |