import Image from ‘next/image’
Context
A reflection on the invisible narratives of migration—the stories that get lost in the noise. While headlines flood us with migration crises daily, each story quickly replaced by the next, over 115,000 Colombians have been detained across Europe between 2018-2024. The constant barrage of news creates paralysis rather than action—we know migration involves suffering, but individual stories dissolve into statistics, making it impossible to grasp the human scale or patterns of vulnerability.
Problem
Migration data remains buried in bureaucratic reports, dehumanized and fragmented. The intersection of gender, crime, and geography in the Colombian diaspora reveals vulnerability patterns—particularly women being exploited as drug couriers—but these patterns get lost between sensationalist headlines and bureaucratic indifference. We’re overwhelmed by news yet understand nothing; we’re informed yet remain passive.
Approach
Using official consular data, I created an interactive cartographic visualization with D3.js that maps arrests across 18 European NUTS zones. The innovation lies in concentric rings: outer rings display top crimes committed by males, inner rings show female crime patterns, revealing gender-specific vulnerabilities at a glance.
Solution
A data visualization published on Observable HQ—part of the open-source ecosystem—that allows community verification, reinterpretation, and contribution. The work documents a migration reality that exists and must be confronted, while creating a tool for researchers, policymakers, and the Colombian community itself.
Project Scope
“Can we perceive socioeconomic vulnerability through data? With digital media spaces, we have the unique ability to trace behaviors quantitatively—migration patterns, arrest records, gender disparities—and analyze them to understand human circumstances across different territories.”
This project extends my previous work on segregation and social stratification (Cibusstratum, 2019) into the realm of migration justice. While Cibusstratum examined voluntary social patterns through foodie culture, this visualization documents involuntary outcomes—Colombians caught in European criminal justice systems.
Access
Interactive Visualizations:
Version 1 - Crime Distribution:
View on Observable HQ
Version 2 - Gender Analysis:
View on Observable HQ
The visualization uses concentric rings to encode multiple data layers:
- Circle size: Total arrests per zone (Madrid: 57,328 | Oslo: 2)
- Outer ring: Top 4 crimes by males (85% of arrests)
- Inner ring: Top 4 crimes by females (15% of arrests)
- Color: Crime type using vibrant, distinct palette
Key Findings
Gender Disparities Revealed:
Madrid (57,328 arrests):
- Males: 26% drug trafficking, 9% theft, 4% homicide
- Females: 42% drug trafficking, 4% theft, 4% immigration
🚨 Critical Pattern: Women show 16% higher proportion in drug trafficking—revealing the “drug mule” vulnerability pattern where women are disproportionately recruited as couriers due to economic desperation and lower sentences.
Geographic Variations:
- Austria: Men arrested primarily for theft (55%), women for drugs (41%)—complete reversal
- UK: Extreme drug focus for women (68% of female arrests)
- Switzerland: Only male arrests recorded (data outlier)
- Spain: Most balanced patterns across genders
Distribution Concentration:
- Madrid alone: 50% of all Spanish arrests
- Spain total: 81% of all European arrests (93,308 cases)
- Only 18 of 79 European zones have data (consular presence matters)
Technical Description
Data Processing Pipeline
The project processes 23,230 consular records from the Colombian Ministry of Foreign Affairs (2018-2024). Critical cleaning steps included:
Encoding fixes: Merged duplicate crime categories caused by UTF-8 corruption (NARCOTRÁFICO
+ NARCOTR�FICO
→ single category, adding 10,232 missed arrests).
Geographic mapping: CSV coordinates pointed to country capitals, not actual arrest locations. Solution: mapped each consulate to its corresponding NUTS zone using official jurisdictions:
consulate_to_nuts = {
'C. MADRID': 'ES3', # Comunidad de Madrid
'C. BARCELONA': 'ES5', # Este (Cataluña)
'C. ROMA': 'ITI', # Centro IT
'C. FRANKFURT': 'DE7', # Hessen
# ... 18 zones total
}