Primeros pasos#
Un recorrido de diez minutos por dane-data con los microdatos reales de la GEIH y la EAM. Todas las
salidas de esta página salieron de ejecutar el código.
Si todavía no tiene los datos, instale la librería (Instalación) y descargue lo que vaya a usar: la primera descarga de un año de la GEIH tarda unos minutos.
import dane_data as dd
# dd.geih.download(2025) # un año de la GEIH (unos 500 MB)
# dd.eam.download(range(2012, 2025)) # la EAM desde 2012
dd.__version__
'0.2.2'
1. Qué hay descargado#
dd.geih.available() revisa las carpetas y dice qué meses están completos.
dd.geih.available().groupby("anio")["completo"].sum().tail()
anio
2022 12
2023 12
2024 12
2025 12
2026 8
Name: completo, dtype: int64
2. Cargar un año#
dd.geih.load() une los módulos de cada mes y devuelve una fila por persona. Las variables en minúscula
son las armonizadas por dane-data, iguales en todos los años; las de MAYÚSCULA, las originales del
DANE.
df = dd.geih.load(2025)
df.shape
(817550, 51)
df[["anio", "mes", "fex", "sexo", "edad", "departamento", "condicion", "formal", "ingreso_laboral"]].head()
| anio | mes | fex | sexo | edad | departamento | condicion | formal | ingreso_laboral | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 2025 | 1 | 2184.752283 | Mujer | 54.0 | Bolívar | Ocupado | 0 | 1040000.0 |
| 1 | 2025 | 1 | 1208.490211 | Mujer | 79.0 | Bolívar | Inactivo | <NA> | NaN |
| 2 | 2025 | 1 | 1208.490211 | Hombre | 60.0 | Bolívar | Ocupado | 0 | 700000.0 |
| 3 | 2025 | 1 | 1208.490211 | Hombre | 59.0 | Bolívar | Ocupado | 0 | 1450000.0 |
| 4 | 2025 | 1 | 2104.113905 | Mujer | 80.0 | Bolívar | Inactivo | <NA> | NaN |
Cada persona representa a fex personas de la población: es el factor de expansión. Como es mensual, con doce meses la población es la suma de fex dividida por 12.
dane-data hace esa cuenta sola en todas sus funciones.
3. Indicadores del mercado laboral#
dd.geih.indicadores() calcula los indicadores que publica el DANE: niveles en personas (promedio
mensual del año) y tasas en porcentaje.
dd.geih.indicadores(df)[["anio", "pet", "fuerza_trabajo", "ocupados", "desocupados", "tgp", "to", "td",
"tasa_informalidad"]].round(1)
| anio | pet | fuerza_trabajo | ocupados | desocupados | tgp | to | td | tasa_informalidad | |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 2025 | 40674210.4 | 26153379.4 | 23827433.9 | 2325945.5 | 64.3 | 58.6 | 8.9 | 56.8 |
Con por se desagrega por cualquier variable:
dd.geih.indicadores(df, por="sexo")[["sexo", "tgp", "to", "td", "tasa_informalidad", "ingreso_medio"]].round(1)
| sexo | tgp | to | td | tasa_informalidad | ingreso_medio | |
|---|---|---|---|---|---|---|
| 0 | Hombre | 76.8 | 71.4 | 7.0 | 58.6 | 1965065.1 |
| 1 | Mujer | 52.8 | 46.7 | 11.4 | 54.1 | 1821904.8 |
4. Tablas ponderadas#
dd.tabla() expande cualquier variable: totales, porcentajes, medias o medianas por grupo.
ocupados = df[df.ocupado == 1]
dd.tabla(ocupados, por="nivel_educativo", variable="ingreso_laboral", estadistico="media").round(0)
| nivel_educativo | media | n_muestra | |
|---|---|---|---|
| 0 | Ninguno | 727452.0 | 8898 |
| 1 | Primaria | 1020185.0 | 59694 |
| 2 | Secundaria | 1116744.0 | 36876 |
| 3 | Media | 1400095.0 | 120786 |
| 4 | Superior | 3216506.0 | 123576 |
dd.tabla(ocupados, por="posicion_ocupacional", estadistico="porcentaje").round(1)
| posicion_ocupacional | total | n_muestra | porcentaje | |
|---|---|---|---|---|
| 0 | Empleado particular | 10567954.3 | 150485 | 44.4 |
| 1 | Empleado del gobierno | 873386.4 | 18499 | 3.7 |
| 2 | Empleado doméstico | 716097.6 | 12040 | 3.0 |
| 3 | Cuenta propia | 9840608.9 | 154458 | 41.3 |
| 4 | Patrón o empleador | 581815.2 | 8134 | 2.4 |
| 5 | Familiar sin remuneración | 432386.7 | 5830 | 1.8 |
| 6 | Jornalero o peón | 806040.6 | 8429 | 3.4 |
| 7 | Otro | 9144.3 | 154 | 0.0 |
5. Una serie larga#
Juntar veinte años de microdatos no cabe en la memoria de un portátil. dd.geih.serie_indicadores() da el
mismo resultado que indicadores pero calcula un año a la vez y guarda cada año en disco: la primera vez
tarda alrededor de un minuto; después es instantáneo.
serie = dd.geih.serie_indicadores(range(2007, 2027), anual=False)
serie["fecha"] = pd.to_datetime(serie[["anio", "mes"]].rename(columns={"anio": "year", "mes": "month"}).assign(day=1))
fig, ax = plt.subplots()
ax.plot(serie["fecha"], serie["td"], lw=1.6)
ax.yaxis.set_major_formatter(mtick.PercentFormatter(decimals=0))
ax.set_title("Tasa de desocupación mensual, total nacional")
ax.set_ylabel("% de la fuerza de trabajo");
Los años 2007–2019 y 2021 tienen el marco del censo 2005, y 2020 y 2022 en adelante el del CNPV 2018: los niveles de un marco y otro no son del todo comparables (vea Las encuestas). El ejemplo La desocupación desde 2007 lo trata en detalle.
6. La industria: EAM#
dd.eam.load() carga la Encuesta Anual Manufacturera, un establecimiento por fila, y dd.eam.resumen()
calcula los agregados. Los montos están en miles de pesos corrientes.
eam = dd.eam.load(range(2012, 2025))
res = dd.eam.resumen(eam, por="anio")
res[["anio", "establecimientos", "personal_total", "valor_agregado", "productividad_laboral",
"participacion_laboral"]].tail().round(1)
| anio | establecimientos | personal_total | valor_agregado | productividad_laboral | participacion_laboral | |
|---|---|---|---|---|---|---|
| 8 | 2020 | 7343 | 660404.0 | 9.233033e+10 | 139808.9 | 22.7 |
| 9 | 2021 | 7138 | 681246.0 | 1.169685e+11 | 171697.9 | 19.6 |
| 10 | 2022 | 6775 | 710060.0 | 1.491993e+11 | 210122.1 | 16.7 |
| 11 | 2023 | 6714 | 718730.0 | 1.488453e+11 | 207094.9 | 19.2 |
| 12 | 2024 | 6583 | 730236.0 | 1.482664e+11 | 203039.1 | 21.7 |
Siguientes pasos#
La Guía de usuario explica las variables, la ponderación y cada indicador en detalle.
Los Ejemplos muestran análisis completos: brechas de género, informalidad, salario mínimo, desempleo juvenil, industria.
La Referencia de la API documenta cada función.
Si prefiere no escribir código,
dane-data appabre la aplicación.