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