Python · Pandas · Seaborn · Matplotlib

Movilidad Urbana y Productividad Económica en LATAM

Análisis de la relación entre congestión vehicular y PIB per cápita en 15 ciudades latinoamericanas durante 2024, usando datos reales de TomTom Traffic Index y OECD Cities. Proyecto aprobado con calificación excelente.

Python Pandas Seaborn Matplotlib Jupyter TomTom Traffic API

Resumen del proyecto

Este proyecto analizó el comportamiento de movilidad urbana y su relación con indicadores económicos en ciudades latinoamericanas durante 2024, combinando más de 886,000 registros de tráfico con datos socioeconómicos.

Qué hice
  • Cargué y limpié dos datasets: TomTom Traffic Index y OECD Cities Economy.
  • Estandaricé columnas a snake_case y corregí formatos numéricos con separadores de miles y comas decimales.
  • Filtré registros de 2024 y agregué promedios de tráfico por ciudad con groupby + agg.
  • Realicé un INNER JOIN entre tráfico y economía usando ciudad y año como clave.
  • Construí 4 visualizaciones (boxplot, histograma, 2× barras dobles) para detectar patrones y outliers.
  • Exporté el dataset limpio como CSV y redacté el resumen ejecutivo.
Aporte como Data Analyst

Mi valor en este caso fue traducir más de un millón de registros operativos en conclusiones accionables de política pública. No solo calculé promedios: identifiqué qué ciudades tienen desconexión entre riqueza y movilidad, y qué mercados deberían priorizarse para inversión en transporte.

Este proyecto demuestra dominio del ciclo completo en Python: ingesta, limpieza, transformación, unión, visualización y comunicación de hallazgos a stakeholders.

Proceso analítico

El análisis siguió un pipeline de 7 pasos estructurado como un proyecto de datos end-to-end.

Pasos 1–2: Carga y limpieza

Importé los datasets con Pandas, exploré tipos de datos, renombré columnas a snake_case y corregí formatos numéricos y de fecha.

Pasos 3–4: Filtro y agregación

Extraje el año desde datetime, filtré solo 2024 y calculé el promedio anual de métricas de tráfico por ciudad.

Paso 5: INNER JOIN

Combiné tráfico y economía manteniendo solo las 15 ciudades con datos completos en ambos datasets.

Paso 6: Visualizaciones

Generé un boxplot de JamsDelay, un histograma de PIB per cápita y dos gráficos de barras dobles para comparar ambas variables por ciudad.

Paso 7: Exportación

Exporté el dataset final como CSV y documenté los hallazgos en un resumen ejecutivo dentro del notebook.

Revisión aprobada

Proyecto revisado por el Code Reviewer de TripleTen con comentarios positivos en limpieza, estructura del código y calidad de visualizaciones.

Hallazgos principales

El análisis reveló que la relación entre congestión y PIB per cápita no es lineal en LATAM, con anomalías significativas que abren preguntas de política pública.

Ciudades más congestionadas (2024)
CiudadPaísNivel de congestión
México D.F.México🔴 Outlier extremo
São PauloBrasil🟠 Muy alta
BogotáColombia🟠 Alta
LimaPerú🟡 Media-Alta
SantiagoChile🟡 Media
Interpretaciones clave
Mayor outlierMéxico D.F. — brecha enorme vs. el resto
Mayor PIB per cápitaMontevideo (Uruguay)
Anomalía destacadaUruguay: alto PIB, casi sin demoras
Correlación generalNo lineal ni concluyente
Ciudad prioritariaSantiago: bajo PIB + alta congestión
Conclusión analítica: No existe una relación clara entre renta per cápita y demoras de tráfico en LATAM. Factores como infraestructura vial, densidad poblacional y política de transporte público podrían ser más determinantes que el ingreso por sí solo.

Proceso técnico detallado

El análisis siguió siete pasos reproducibles, desde la carga hasta la exportación del dataset final.

01

Cargar y explorar

Dos fuentes · tráfico y economía urbana

Importé los datasets tomtom_traffic.csv y oecd_city_economy.csv con pandas. Revisé las primeras filas, dimensiones, nombres y tipos de datos para conocer la estructura antes de limpiar.

traffic = pd.read_csv('/datasets/tomtom_traffic.csv')
eco = pd.read_csv('/datasets/oecd_city_economy.csv')
traffic.info()
eco.info()
02

Limpiar y estandarizar

snake_case · fechas · formatos numéricos

Renombré las columnas para trabajar con nombres consistentes. Convertí las marcas temporales a datetime y limpié separadores de miles, comas decimales y símbolos de porcentaje de los indicadores económicos.

traffic = traffic.rename(columns={
    'Country': 'country',
    'City': 'city',
    'UpdateTimeUTC': 'update_time_utc'
})
traffic['update_time_utc'] = pd.to_datetime(
    traffic['update_time_utc']
)
03

Filtrar 2024

Periodo común para las dos fuentes

Extraje el año de la fecha de actualización del tráfico y filtré ambas fuentes para trabajar exclusivamente con 2024, el periodo definido para la comparación.

traffic['year'] = traffic['update_time_utc'].dt.year
traffic_2024 = traffic[traffic['year'] == 2024].copy()
eco_2024 = eco[eco['year'] == 2024].copy()
04

Agregar movilidad por ciudad

Múltiples registros → una fila ciudad-año

Como TomTom registra actualizaciones frecuentes, calculé promedios anuales por ciudad, país y año para obtener una vista comparable y reducir el nivel de detalle operativo.

traffic_city_year_2024 = (
    traffic_2024
    .groupby(['city', 'country', 'year'], dropna=False)
    .agg({
        'jams_delay': 'mean',
        'traffic_index_live': 'mean',
        'jams_length_kms': 'mean',
        'jams_count': 'mean',
        'mins_delay': 'mean',
        'travel_time_live_per_10kms_mins': 'mean',
        'travel_time_hist_per_10kms_mins': 'mean'
    })
    .reset_index()
)
05

Unir movilidad y economía

INNER JOIN por ciudad y año

Seleccioné las columnas económicas relevantes y uní ambas tablas mediante ciudad y año. Utilicé un INNER JOIN para conservar únicamente las coincidencias disponibles en las dos fuentes.

merged_inner = pd.merge(
    traffic_city_year_2024,
    eco_2024,
    on=['city', 'year'],
    how='inner'
)
06

Visualizar relaciones

Distribuciones · outliers · comparaciones

Construí un boxplot para JamsDelay, un histograma para PIB per cápita y gráficos de barras para comparar congestión y economía entre ciudades. Estas visualizaciones permitieron identificar diferencias y valores atípicos.

sns.boxplot(
    data=merged_inner,
    x='jams_delay',
    showmeans=True
)
merged_inner['city_gdp_capita'].hist(bins=15)
07

Exportar y documentar

CSV final · reflexión ejecutiva

Exporté la tabla unificada como CSV para futuros análisis y documenté las conclusiones sobre la relación entre movilidad urbana y desempeño económico.

merged_inner.to_csv(
    'ladb_mobility_economy_2024_clean.csv',
    index=False
)

Visualizaciones del análisis

Estos son los gráficos generados directamente en el notebook durante el análisis exploratorio de datos.

Boxplot — Distribución de JamsDelay (2024)
Boxplot — Distribución de JamsDelay (2024)

Permite identificar a México D.F. como outlier extremo. La mediana y la caja muestran que la mayoría de ciudades LATAM tienen retrasos moderados, con unos pocos casos atípicos muy por encima.

Histograma — Distribución del PIB per cápita
Histograma — Distribución del PIB per cápita

La distribución es aproximadamente normal sin sesgos extremos, lo que indica que los datos del OECD son representativos. La mayoría de ciudades se concentra entre USD 8,000 y USD 18,000.

Barras dobles — Congestión vs PIB (orden por JamsDelay)
Barras dobles — Congestión vs PIB (orden por JamsDelay)

Ordenando por retraso de tráfico, se observa que ciudades con mayor congestión no necesariamente tienen menor PIB, lo que sugiere que la relación no es lineal.

Barras dobles — Congestión vs PIB (orden por PIB per cápita)
Barras dobles — Congestión vs PIB (orden por PIB per cápita)

Ordenando por PIB per cápita, queda claro que ciudades más ricas (como Montevideo) no son siempre las menos congestionadas, lo que abre preguntas sobre política de transporte.

Notebook del proyecto

El análisis completo está documentado en un Jupyter Notebook con código comentado, tablas de datos y las visualizaciones anteriores.

Ver notebook directamente en GitHub GitHub renderiza automáticamente los archivos .ipynb — puedes ver el código, las tablas y los gráficos sin instalar nada.
Abrir en GitHub