Procesamiento y análisis de grandes volúmenes de datos del servicio de taxis amarillos de Nueva York durante el primer trimestre de 2023.
Este proyecto implementa procesos de Big Data para analizar el comportamiento del servicio de taxis amarillos en Nueva York durante el primer trimestre de 2023, con el fin de obtener insights valiosos para la optimización de servicios.
La industria del transporte genera diariamente enormes volúmenes de datos que, al ser procesados y analizados adecuadamente, pueden proporcionar información crucial para la toma de decisiones estratégicas. En este proyecto, nos enfocamos en:
Implementamos una arquitectura completa de Big Data siguiendo estos procesos principales:
Proceso de extracción y carga de datos desde las fuentes originales al data lake, implementando controles de error y evitando duplicidad.
Aplicación de técnicas de limpieza y normalización para garantizar la calidad de los datos procesados.
Estructuración y carga de datos procesados en un modelo optimizado para análisis en BigQuery.
Implementamos un data lake en tres capas para gestionar el ciclo de vida completo de los datos:
El control de errores se implementó mediante funciones de validación y logs de seguimiento para cada proceso batch.
# Ejemplo de código para control de duplicidad
def check_file_exists(bucket, filename):
"""Verifica si un archivo ya existe en Cloud Storage"""
storage_client = storage.Client()
bucket = storage_client.bucket(bucket)
blob = bucket.blob(filename)
return blob.exists()
def process_batch(date, bucket_name):
"""Procesa un lote de datos con control de errores"""
try:
filename = f"yellow_tripdata_{date.strftime('%Y-%m')}.parquet"
# Control de duplicidad
if check_file_exists(bucket_name, f"raw/{filename}"):
logging.warning(f"El archivo {filename} ya existe en raw zone")
return
# Proceso de descarga
download_url = f"https://d37ci6vzurychx.cloudfront.net/trip-data/{filename}"
response = requests.get(download_url)
# Validación de integridad
if response.status_code != 200:
raise Exception(f"Error al descargar {filename}: {response.status_code}")
# Almacenamiento en raw zone
save_to_cloud_storage(bucket_name, f"raw/{filename}", response.content)
logging.info(f"Archivo {filename} procesado exitosamente")
except Exception as e:
logging.error(f"Error en proceso batch: {str(e)}")
notify_admin("Error en proceso de ingesta", str(e))
Utilizamos PySpark para el procesamiento distribuido de datos, implementando:
Cada transformación se registra para mantener la trazabilidad desde el origen.
# Ejemplo de transformación con PySpark
from pyspark.sql import SparkSession
from pyspark.sql.functions import *
# Inicializar Spark
spark = SparkSession.builder \
.appName("NYC Taxi Data Processing") \
.config("spark.executor.memory", "4g") \
.getOrCreate()
# Cargar datos de la zona raw
df_raw = spark.read.parquet("gs://nyc-taxi-data/raw/yellow_tripdata_*.parquet")
# Aplicar transformaciones
df_cleaned = df_raw \
.filter(col("trip_distance") > 0) \
.filter(col("fare_amount") > 0) \
.withColumn("trip_duration_minutes",
(unix_timestamp(col("tpep_dropoff_datetime")) -
unix_timestamp(col("tpep_pickup_datetime"))) / 60) \
.filter(col("trip_duration_minutes").between(1, 1440)) \
.dropDuplicates(["tpep_pickup_datetime", "tpep_dropoff_datetime",
"PULocationID", "DOLocationID"]) \
.withColumn("processed_date", current_date())
# Guardar en zona trusted
df_cleaned.write.partitionBy("processed_date") \
.mode("overwrite") \
.parquet("gs://nyc-taxi-data/trusted/yellow_taxi/")
# Registrar métricas de calidad
record_count = df_cleaned.count()
print(f"Registros procesados: {record_count}")
Análisis visual de los patrones identificados en los datos de taxis de NYC
La distribución de viajes muestra dos picos claramente definidos: uno en la mañana (7-9 AM) y otro más pronunciado en la tarde-noche (5-8 PM), correspondientes a las horas de mayor actividad laboral. Los viernes y sábados presentan un patrón distinto, con alta actividad hasta las 2-3 AM, indicando comportamiento nocturno de ocio.
Implicación para el negocio: Esta información es vital para optimizar la disponibilidad de unidades durante horas pico, implementar tarifas dinámicas más efectivas y programar mantenimientos durante horas de baja demanda (2-5 AM de lunes a jueves).
Las tarifas promedio muestran variaciones significativas a lo largo del día, con los valores más altos durante las horas de la madrugada (1-5 AM) a pesar de ser horas de baja demanda. La tarifa promedio más alta ocurre a las 5:00 AM ($36.65), mientras que la más baja es a las 2:00 PM ($24.81).
Implicación para el negocio: Este patrón sugiere viajes más largos durante la madrugada (probablemente hacia zonas residenciales periféricas), representando una oportunidad para conductores que prefieran trabajar en horarios nocturnos, con menos tráfico y viajes más rentables por unidad de tiempo.
La zona 132 (JFK Airport) es la más popular con 152,122 viajes. Las tres zonas principales (132, 237, 236) representan aproximadamente el 37.9% del total de viajes analizados.
Implicación para el negocio: Estas zonas concentran gran parte de la demanda, lo que justifica estrategias de asignación prioritaria de unidades y análisis dinámico de saturación.
El análisis geoespacial revela una concentración extremadamente alta de recogidas en determinadas zonas. Las zonas 132 (JFK Airport), 237 y 236 (áreas de Midtown Manhattan) representan el 37.9% del total de viajes. La zona 132 (JFK Airport) registra 152,122 viajes, siendo la ubicación con mayor número de recogidas en el dataset.
Implicación para el negocio: La alta concentración en estas zonas sugiere implementar sistemas de gestión de colas virtuales para reducir la congestión de taxis esperando pasajeros. También indica oportunidades para servicios complementarios en estas zonas de alta demanda (e.g., promociones con hoteles y restaurantes locales).
Las 10 rutas más frecuentes representan solo el 5.2% del total de viajes, mostrando una gran diversidad de patrones de movilidad. La ruta más popular es entre las zonas 237 → 236 con 21,361 viajes. Las 10 rutas principales tienen valores entre aproximadamente 7,800 y 21,000 viajes.
Implicación para el negocio: La diversidad de rutas sugiere la necesidad de un sistema de distribución de taxis adaptativo que pueda responder a patrones geográficos complejos. El análisis de estas rutas principales muestra que muchas de ellas conectan áreas comerciales con residenciales o turísticas, sugiriendo oportunidades para servicios especializados según el tipo de ruta.