Skip to content

Repository files navigation

Digital Labor Gap — BI Strategy

A Business Intelligence pipeline connecting academic data with real labor market demand to measure and reduce the digital skills gap in Bolivian technical higher education.

Live DemoLicense: MIT

PythonSQL ServerStreamlitGroq APIAdzuna APICEPALSTAT


📄 Read this in: English | Español


Preview

Digital Labor Gap — MockUp



Digital Labor Gap — Live Dashboard

Academic Project
Universidad Privada Domingo Savio — Computer Systems Engineering
Course: Business Intelligence — 2026


Table of Contents


Purpose & Results

Goal: Build a BI system that makes the digital skills gap in Bolivian IT education visible and measurable — giving academic directors an evidence-based tool to align curricula with real labor market demand, directly contributing to ODS 4 (Quality Education) and ODS 8 (Decent Work).

Was it achieved?

ObjectiveResult
End-to-end data pipeline (Bronze → Silver → Gold)Fully implemented and operational
4+ KPIs calculated from real data9 KPIs across 4 dashboard pages
Skill gap identified between academia and marketGap measured across all 5 IT careers with fuzzy matching
Regional benchmark against Latin America17 countries via CEPALSTAT ODS 4.4.1
AI assistant for natural language queriesLive via Groq API (LLaMA 3.1 8B)
Public deployment accessible to evaluatorsDeployed at brecha-digital-bolivia-bi.streamlit.app

Concrete finding: The skill gap analysis — using real job postings extracted by LLM — shows that the most demanded technical skills (Docker, cloud platforms, modern CI/CD frameworks) have significantly low academic coverage across all 5 IT programs, confirming the hypothesis that the digital gap is real and measurable. This is exactly the kind of evidence that can drive curriculum reform.


Live Demo

brecha-digital-bolivia-bi.streamlit.app

The application is deployed on Streamlit Cloud and connects live to the Groq API for the AI assistant and uses pre-processed CSV files for academic and labor market data.


What It Does

Bolivian technical education institutions generate large amounts of academic data but lack the tools to connect it with real labor market demand. This project bridges that gap.

Before: Decision-making based on intuition, fragmented data silos, no visibility into graduate employability.

After: A unified BI pipeline that integrates internal academic records with external labor market data, exposing actionable KPIs through an interactive dashboard — accessible to any academic director without technical knowledge.

Core capabilities:

  • End-to-end ELT pipeline: SQL Server (Bronze) → Python transformation (Silver) → Snowflake schema warehouse (Gold)
  • IT-focused analysis: Exclusively covers 5 programs — Software Engineering, Systems Engineering, Data Science, Telecommunications, and Cybersecurity
  • Labor market intelligence: Real job vacancy data from Adzuna API (US, Spain, Mexico, Brazil) with AI-powered skill extraction via Groq LLM
  • KPI monitoring: Graduate employability rate, dropout risk, skill gap analysis, salary benchmarking
  • Regional benchmark: CEPALSTAT ODS 4.4.1 indicator — digital skills competency across 17 Latin American countries
  • AI assistant: Natural language queries over the full dataset, powered by LLaMA 3.1 (Groq API)

Dashboard Pages

PageURLDescription
Overview/Hero KPIs, navigation, data sources
KPIs/kpisEmployment rate, dropout risk gauge, CEPALSTAT regional benchmark
Labor Insertion/insercionInsertion rate by career, salary distribution, temporal trends, city heatmap
Skill Gap/skill_gapMarket skills vs academic curriculum, coverage analysis, LLM-extracted skills
AI Assistant/chatbotNatural language BI queries — LLaMA 3.1 8B via Groq API

Architecture

SQL Server BrechaDigitalDB CEPALSTAT API Adzuna API
[Bronze — Source] [Macro Data] [Employment Data]
│ │ │
└────────────────────────┴────────────────────┘
│
src/ingestion/ (Python)
sqlserver.py · cepalstat.py · empleos.py
│
data/raw/
[Bronze — CSV]
│
src/transform/ (Python)
clean.py · normalize.py
│
data/processed/
[Silver — CSV]
│
┌────────────┴────────────┐
│ │
src/ingestion/skill_extraction.py src/schema/ (Python)
Groq LLM → skills_extracted.csv facts.py · dimensions.py
│ │
└────────────┬────────────┘
│
SQL Server DW_BrechaDigital
[Gold — Snowflake Schema T-SQL]
Fact_InsercionLaboral · DIM_* tables
│
src/dashboard/ (Streamlit)
KPIs · Labor Insertion · Skill Gap · AI Chatbot

Tech Stack

CategoryTechnologyVersion
LanguagePython3.11+
Data ManipulationPandas2.0+
Bronze DatabaseSQL Server (T-SQL) — BrechaDigitalDB2019+
Gold WarehouseSQL Server (T-SQL) — DW_BrechaDigital2019+
DashboardStreamlit1.32+
ChartsPlotly5.20+
AI Skill ExtractionGroq API (LLaMA 3.1 8B)0.9+
AI AssistantGroq API (LLaMA 3.1 8B Instant)0.9+
Macro DataCEPALSTAT REST API
Employment DataAdzuna REST API
DB ConnectivityPyODBC + SQLAlchemy5.0+ / 2.0+
Environmentpython-dotenv1.0+

Data Pipeline

StepModuleInputOutput
1. Extract Academicsrc/ingestion/sqlserver.pyBrechaDigitalDB (SQL Server)data/raw/*.csv
2. Extract Macrosrc/ingestion/cepalstat.pyCEPALSTAT REST APIdata/raw/cepalstat/*.csv
3. Extract Jobssrc/ingestion/empleos.pyAdzuna REST APIdata/raw/empleos/*.csv
4. Extract Skillssrc/ingestion/skill_extraction.pyAdzuna job descriptionsdata/processed/empleos/skills_extracted.csv
5. Cleansrc/transform/clean.pydata/raw/*.csvdata/processed/*.csv
6. Normalizesrc/transform/normalize.pydata/processed/*.csvdata/processed/*.csv
7. Load Dimensionssrc/schema/dimensions.pydata/processed/*.csvDW_BrechaDigital — DIM_* tables
8. Load Factssrc/schema/facts.pydata/processed/*.csvDW_BrechaDigital — Fact_InsercionLaboral

Skill Extraction Pipeline

Job descriptions from Adzuna are processed by skill_extraction.py using a two-stage approach:

  1. Groq LLM (primary): Sends raw job descriptions to llama-3.1-8b-instant and extracts structured skill lists in JSON format
  2. Regex fallback: If LLM fails or rate-limits, a regex pattern bank covers the most common tech keywords

The output skills_extracted.csv is committed to the repository for reproducibility and to avoid runtime LLM costs on every dashboard load.


Database ER Diagrams

Bronze — BrechaDigitalDB (Source Database)

Operational database that stores raw academic records. Normalized relational model.

┌─────────────────┐ ┌──────────────────────┐
│ Carreras │ │ CompetenciasDigitales│
├─────────────────┤ ├──────────────────────┤
│ PK CarreraID │◄────────│ FK CarreraID │
│ NombreCarrera│ │ PK CompetenciaID │
│ Facultad │ │ NombreHabilidad │
└────────┬────────┘ │ NivelRequerido │
│ └──────────────────────┘
│
│ ┌──────────────────┐
│ │ Estudiantes │
│ ├──────────────────┤
└──►│ PK EstudianteID │
│ Nombre │◄──────────────┐
│ FechaIngreso │ │
│ Genero │ │
│ Ciudad │ │
└──────────────────┘ │
│
┌──────────────────────────┐ ┌───────────────┴──────────┐
│ Inscripciones │ │ SeguimientoEgresados │
├──────────────────────────┤ ├──────────────────────────┤
│ PK InscripcionID │ │ PK EgresadoID │
│ FK EstudianteID ─────────┼───►│ FK EstudianteID │
│ FK CarreraID ─────────┼───►│ TieneEmpleoFormal │
│ NotaFinal │ │ SalarioMensualUSD │
│ SemestreActual │ │ TrabajaEnAreaDeEstudio│
└──────────────────────────┘ └──────────────────────────┘

5 tables — 4 foreign key relationships
SeguimientoEgresados is the key table: it records whether each student got formal employment after graduation and whether they work in their field of study.


Gold — DW_BrechaDigital (Snowflake Schema Warehouse)

Analytical warehouse optimized for BI queries. Each row in the fact table is one graduate's employment event.

 ┌───────────────────┐
│ DIM_CARRERA │
├───────────────────┤
│ PK SK_Carrera │
│ CarreraID (BK) │
│ nombrecarrera │
│ area │
└────────┬──────────┘
│
┌──────────────────┐ │ ┌──────────────────────┐
│ DIM_ESTUDIANTE │ │ │ DIM_HABILIDAD │
├──────────────────┤ │ ├──────────────────────┤
│ PK SK_Estudiante │ │ │ PK SK_Habilidad │
│ EstudianteID │ │ │ NombreHabilidad │
│ nombre │ │ │ FK SK_Categoria ──►┐ │
│ Genero │ │ └──────────┬──────────┘ │
│ ciudad_ │ │ │ │
│ residencia │ │ ┌──────────▼──────────┐ │
└────────┬─────────┘ │ │ DIM_CATEGORIA_SKILL │ │
│ │ ├─────────────────────┤ │
│ ┌─────────▼──────────────────────────┐ │ │
└────────►│ FACT_INSERCION_LABORAL │ │ │
├────────────────────────────────────┤ │ │
│ FK SK_Estudiante │ │ │
│ FK SK_Carrera │ │ │
│ FK SK_Tiempo │ │ │
│ FK SK_Region │ │ │
│ FK SK_MercadoLaboral │ │ │
│ EstaEmpleado (INT) │ │ │
│ SalarioMensualUSD (DECIMAL) │ │ │
│ TrabajaEnAreaEstudio (BIT) │ │ │
└──────┬──────────────┬───────────────┘ │ │
│ │ SK_Categoria│ │
▼ ▼ PK──────────┘ │
┌───────────────┐ ┌──────────────────────┐ │
│ DIM_TIEMPO │ │ DIM_MERCADO_LABORAL │ │
├───────────────┤ ├──────────────────────┤ │
│ PK SK_Tiempo │ │ PK SK_MercadoLaboral │ │
│ anio │ │ Ubicacion │ │
│ trimestre │ │ FK SK_Region ──►┐ │ │
│ mes │ └──────────────────┼─────┘ │
│ Semestre │ │ │
└───────────────┘ ┌──────────▼────────┐ │
│ DIM_REGION │ │
├───────────────────┤ │
│ PK SK_Region │ │
│ Ciudad │ │
│ Region │ │
└───────────────────┘ │
│
NombreCategoria ◄─────────────────────┘
Básico / Intermedio / Avanzado

8 tables — 1 fact + 7 dimensions (2 sub-dimensions)
The snowflake structure normalizes DIM_HABILIDAD → DIM_CATEGORIA_SKILL and DIM_MERCADO_LABORAL → DIM_REGION to eliminate data redundancy.


Snowflake Schema

Normalized dimension model chosen over star schema for technical correctness. Sub-dimensions reduce redundancy and improve referential integrity at the cost of additional JOINs.

 DIM_CARRERA
▲
DIM_CATEGORIA_SKILL DIM_ESTUDIANTE
▲ ▲
DIM_HABILIDAD │
▲ │
└── FACT_INSERCION_LABORAL ──► DIM_TIEMPO
│
└────────► DIM_MERCADO_LABORAL
▲
DIM_REGION

Full schema documentation: docs/esquema_copo_nieve.md


Team

MemberRoleGitHub
Abraham Flores BarrionuevoBronze Lead — Data Ingestion@AFB-9898
Juan Nicolás Flores DelgadoSilver Lead — Transformation@Juan7139nf
Micaela Pérez VásquezGold Lead — Schema Design@Sam24p
Mayra Villca MéndezAnalysis Lead — Notebooks & KPIs@MayVillca
Diego Vargas UrzagasteDashboard Lead — Integration & Deployment@temps-code

Progress tracked on the GitHub Kanban Board.


Installation

# 1. Clone
git clone https://github.com/temps-code/brecha-digital-bi.git
cd brecha-digital-bi
# 2. Virtual environment
python -m venv .venv
source .venv/bin/activate # Linux / macOS
.venv\Scripts\activate # Windows# 3. Dependencies
pip install -r requirements.txt
# 4. Configure environment variables (see below)# 5. Seed the Bronze database# Execute database/seed.sql in SQL Server Management Studio# 6. Run the full pipeline (single command)
python -m src.run_pipeline
# Optional: skip ingestion if raw CSVs already exist
python -m src.run_pipeline --skip-ingestion

The pipeline orchestrator (src/run_pipeline.py) runs all 4 stages in order:

StageWhat it does
1 — IngestionExtracts from SQL Server + Adzuna API + CEPALSTAT API + LLM skill extraction
2 — CleanCleans and validates all raw CSVs
3 — NormalizeStandardizes cities, careers, dates; creates unified view
4 — SchemaLoads dimensions and fact table into DW_BrechaDigital

Environment Variables

Copy .env.example and fill in your values:

cp .env.example .env
# SQL Server — Bronze SourceDB_SERVER=localhost,1433DB_NAME=BrechaDigitalDBDB_USER=saDB_PASSWORD=your_password# SQL Server — Gold WarehouseDW_SERVER=localhost,1433DW_NAME=DW_BrechaDigitalDW_USER=saDW_PASSWORD=your_password# Groq API — AI assistant + skill extractionGROQ_API_KEY=your_groq_api_key# CEPALSTAT (public API — no key required)CEPALSTAT_BASE_URL=https://api-cepalstat.cepal.org/cepalstat/api/v1# Adzuna Employment APIADZUNA_APP_ID=your_app_idADZUNA_APP_KEY=your_app_key

The .env file is already in .gitignore. Never commit it.
The pipeline auto-detects auth mode: SQL Auth when credentials are set, Windows Auth otherwise.


Streamlit Cloud Deployment

The app is deployed at brecha-digital-bolivia-bi.streamlit.app.

For your own Streamlit Cloud deployment:

  1. Fork or push to GitHub
  2. Connect the repository in share.streamlit.io
  3. Set Main file path to src/dashboard/app.py
  4. Add secrets in Settings → Secrets (TOML format):
GROQ_API_KEY = "gsk_your_key_here"ADZUNA_APP_ID = "your_id"ADZUNA_APP_KEY = "your_key"DB_SERVER = "your_server"DB_NAME = "BrechaDigitalDB"DB_USER = "your_user"DB_PASSWORD = "your_password"DW_SERVER = "your_server"DW_NAME = "DW_BrechaDigital"DW_USER = "your_user"DW_PASSWORD = "your_password"

Note: Without SQL Server access, the dashboard automatically falls back to the pre-processed CSV files in data/processed/ — no data loss for the deployed version.


License: MITOpen Live Demo

About

A Business Intelligence pipeline that connects academic data with real labor market demand to reduce the digital skills gap in technical higher education. — UPDS 2026

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages