De los datos telemáticos en crudo al rendimiento optimizado de la flota: el enfoque PySpark

A medida que la movilidad urbana evoluciona, los scooters eléctricos y las bicicletas están transformando la forma en que las personas se desplazan por las ciudades. Sin embargo, esta transformación conlleva desafíos operativos urgentes para los operadores de flotas, especialmente en lo que respecta a comprender y reducir el tiempo de inactividad de los vehículos. Mientras que los análisis tradicionales a menudo no logran identificar estas ineficiencias, la fusión de datos telemáticos con herramientas avanzadas de big data como Apache Spark y la biblioteca Pandas de Python ofrece un avance significativo.
En este artículo, seguiremos un estudio de caso del mundo real que aprovecha la API de Datos en crudo de Navixy, continuando con la demostración de una estrategia completamente basada en datos: desde la limpieza y validación de los datos hasta su segmentación espacial y la visualización de ineficiencias en Looker Studio.
Al aplicar este método, los integradores de sistemas y operadores con conocimientos tecnológicos pueden obtener información detallada sobre los patrones de inactividad de los vehículos, redistribuir la flota de manera más inteligente y aumentar significativamente la eficiencia general de la flota. Este enfoque centrado en los datos es un modelo para transformar señales en crudo en acciones estratégicas. Es universal y puede aplicarse a cualquier otro escenario.
Estudio de caso: Un gran negocio a partir de un pequeño viaje
Según Cognitive Market Research, el tamaño del mercado global de compartición de scooters eléctricos alcanzará los $2,142.5 millones de dólares en 2025. Se expandirá a una tasa de crecimiento anual compuesta (CAGR) del 17.00% de 2025 a 2033.
Los servicios de kicksharing están revolucionando el transporte urbano al ofrecer una opción más sostenible en comparación con los métodos tradicionales. Por ejemplo, en los dos primeros días tras el lanzamiento del servicio de scooters eléctricos compartidos en la Ciudad de México, se realizaron dos mil viajes. Otro ejemplo es Berlín, donde las bicicletas eléctricas han visto un aumento en popularidad, con más de 2 millones de viajes registrados en 2021. Sin embargo, esta rápida expansión conlleva su propio conjunto de desafíos para los operadores, como gestionar eficientemente la distribución de la flota, garantizar la disponibilidad de scooters donde hay alta demanda y minimizar los costos operativos.
Uno de los principales obstáculos implica gestionar los periodos en los que las bicicletas eléctricas no están en uso. Los tiempos prolongados de inactividad pueden generar ineficiencias operativas, reducción de ingresos y mayores necesidades de mantenimiento. Para abordar estos problemas, la industria recurre cada vez más al análisis de big data. Al analizar eficazmente los datos en crudo, las empresas pueden obtener valiosas perspectivas que mejoran la toma de decisiones estratégicas. Este ejemplo destaca la importancia de los datos en crudo para aprovechar el big data en una variedad de aplicaciones, las cuales dependen en gran medida de la profundidad del análisis realizado.
Si bien el big data ofrece un gran potencial para transformar industrias y fomentar la innovación, también presenta varios desafíos notables. Uno de los principales problemas es el enorme volumen y la complejidad de los datos, lo que requiere una infraestructura robusta y tecnologías avanzadas para su almacenamiento y procesamiento eficientes. El artículo ‘Pequeños pasos hacia el Big Data: cómo obtener datos telemáticos en Navixy para su análisis avanzado’ aborda el tema de la recuperación de datos.
Otra preocupación importante es la calidad de los datos; estos deben ser precisos, completos y consistentes para obtener conclusiones confiables. Además, integrar datos de diversas fuentes puede ser bastante complejo y presenta su propio conjunto de dificultades.
Demostraremos cómo garantizar la calidad de los datos mediante limpieza, validación y el uso de herramientas de big data como la biblioteca Pandas en Python o la herramienta Spark para la agregación y transformación de datos.
Cómo limpiar y validar datos para un análisis preciso
Una vez que hayas recuperado los datos en crudo de tus unidades de movilidad, es crucial validar y limpiar los datos para garantizar su precisión y fiabilidad. Los datos en crudo a menudo pueden contener discrepancias, como picos en ubicaciones o atributos. Por ejemplo, la velocidad transmitida por un rastreador podría ser anormalmente alta, o la latitud y longitud podrían presentar discrepancias debido a una señal GPS débil. Estos problemas pueden afectar significativamente la precisión de tu análisis. Los pasos que se enumeran a continuación pueden aplicarse según tus necesidades específicas para abordar estas discrepancias y garantizar una alta calidad de los datos.
Paso 1: Identificar y eliminar valores atípicos
Los valores atípicos en los datos pueden sesgar tu análisis y llevar a conclusiones incorrectas. Para identificar y eliminar valores atípicos, puedes utilizar métodos estadísticos o establecer umbrales basados en el conocimiento del dominio. Por ejemplo, si la velocidad de una unidad de movilidad supera un límite razonable (por ejemplo, 30 km/h para un scooter eléctrico), probablemente se trate de un valor atípico que debe eliminarse o corregirse.
Usa el código
import pandas as pd
# Load the raw data into a DataFrame
df = pd.read_csv('all_raw_data.csv')
# Define threshold
speed_threshold = 30 # km/h
# Remove outliers based on speed
df = df[df['speed'] <= speed_threshold]
Paso 2: Manejar datos faltantes o incorrectos
Los puntos de datos faltantes o incorrectos también pueden afectar la precisión de tu análisis. Estos casos deben manejarse adecuadamente. Puedes optar por eliminar las filas con datos faltantes, rellenarlas con valores predeterminados o utilizar métodos de interpolación para estimar los valores faltantes, dependiendo de tus necesidades.
Usa el código
# Remove rows with missing data
df = df.dropna()
# Optionaly, fill missing values with a default value (e.g., 0 for speed)
df['speed'].fillna(0, inplace=True)
Paso 3: Validar datos GPS
Los datos GPS pueden ser particularmente propensos a discrepancias debido a señales débiles o interferencias. Para validarlos, puedes verificar si existen saltos no realistas en latitud y longitud. Si el cambio de posición entre puntos de datos consecutivos es demasiado grande, puede indicar una discrepancia. También se pueden aplicar otros métodos en este paso, por ejemplo, la regla de tres sigmas.
Usa el código
# Calculate the distance between consecutive GPS points
df['distance'] = df.apply(lambda row: calculate_distance(row['latitude'], row['longitude'], row['prev_latitude'], row['prev_longitude']), axis=1)
# Define a threshold for abnormal GPS data
distance_threshold = 20 # meters
# Remove rows with abnormal GPS data
df = df[df['distance'] <= distance_threshold]
Paso 4: Garantizar la consistencia de los datos
Asegúrate de que los datos sean consistentes en todos los registros. Por ejemplo, las marcas de tiempo deben almacenarse como objetos de tipo datetime, y todas las unidades deben usar el mismo sistema de medición (por ejemplo, métrico o imperial).
Usa el código
# Convert timestamps to a standard format
df['timestamp'] = pd.to_datetime(df['timestamp'])
# Ensure all units use the same measurement system (e.g., km/h for speed)
df['speed'] = df['speed'].apply(lambda x: x * 1.60934 if x > 100 else x) # Convert mph to km/h if necessary
Al seguir estos pasos, puedes validar y depurar los datos en crudo, asegurándote de que sean precisos y confiables para su posterior análisis.
Uso de Spark para la agregación y transformación de datos
Pasemos a la siguiente etapa de nuestro proceso de transformación de datos utilizando Apache Spark.
- Primero, inicializa una sesión de Spark, lo cual nos permite aprovechar el poder del cómputo distribuido para manejar de forma eficiente grandes conjuntos de datos.
- Lee el archivo CSV concatenado de datos en crudo en un DataFrame de Spark, asegurándote de que la columna
msg_time
se convierta al formato de marca de tiempo (timestamp) para cálculos precisos basados en el tiempo. Ten en cuenta que se puede usar CSV con Spark, pero podría provocar una disminución en el rendimiento del cálculo. - Define una especificación de ventana para particionar los datos por
source_id
y ordenarlos pormsg_time
. Este paso es esencial para calcular la diferencia de tiempo entre filas consecutivas, lo que nos ayuda a identificar períodos de inactividad. - Filtra las filas donde la velocidad sea 0 y la diferencia de tiempo sea de 5 minutos o más, lo que indica que la unidad de movilidad no está en uso. La diferencia de tiempo se convierte luego a minutos para calcular el tiempo de inactividad.
- Agrupa los datos por
msg_time
, fecha, latitud y longitud, y suma el tiempo de inactividad de cada grupo. - Para obtener perspectivas más detalladas, define los límites y el tamaño de cada subsector dividiendo los datos en sectores de 100 x 100 dentro del área de análisis predefinida. Este paso permite analizar los datos a un nivel granular.
- Calcula el subsector para cada fila en función de estos límites y luego agrupa los datos por
lat_sector
ylng_sector
, sumando el tiempo de inactividad de cada subsector. - Para facilitar la visualización, calcula las coordenadas del centro de cada sector.
Finalmente, escribe los resultados en un nuevo archivo CSV para su posterior análisis.
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, lag, lead, expr, sum as spark_sum
from pyspark.sql.window import Window
# Initialize Spark session
spark = SparkSession.builder.appName("TelematicsAnalysis").getOrCreate()
# Read prepared CSV file into a Spark DataFrame
df = spark.read.csv("concatenated_raw_data.csv", header=True, inferSchema=True)
# Convert msg_time to timestamp
df = df.withColumn("msg_time", col("msg_time").cast("timestamp"))
# Calculate non usage time for each object per day
window_spec = Window.partitionBy("source_id").orderBy("msg_time")
# Calculate the time difference between consecutive rows
df = df.withColumn("next_msg_time", lead("msg_time").over(window_spec))
df = df.withColumn("time_diff", col("next_msg_time").cast("long") - col("msg_time").cast("long"))
# Filter rows where speed is 0 and time difference is 5 minutes or more
idle_df = df.filter((col("speed") == 0) & (col("time_diff") >= 300))
# Calculate non usage in minutes
idle_df = idle_df.withColumn("idle_time", col("time_diff") / 60)
# Sum non usage per source_id per day, including lat and lng
idle_time_per_day = idle_df.groupBy("source_id", expr("date_format(msg_time, 'yyyy-MM-dd')").alias("date"), "lat", "lng").agg(spark_sum("idle_time").alias("total_idle_time"))
# Define the sector boundaries
lat_min, lat_max = 19.28416103, 19.5256355
lng_min, lng_max = -99.239600, -99.0087829
# Define the size of each sub-sector
lat_step = (lat_max - lat_min) / 100
lng_step = (lng_max - lng_min) / 100
# Calculate the sub-sector for each row
idle_time_per_day = idle_time_per_day.withColumn("lat_sector", ((col("lat") - lat_min) / lat_step).cast("int"))
idle_time_per_day = idle_time_per_day.withColumn("lng_sector", ((col("lng") - lng_min) / lng_step).cast("int"))
# Calculate the total non usage time for each sub-sector
sector_idle_time = idle_time_per_day.groupBy("lat_sector", "lng_sector").agg(spark_sum("total_idle_time").alias("total_idle_time"))
# Calculate the coordinates of the middle of each sector
sector_idle_time = sector_idle_time.withColumn("lat_middle", lat_min + (col("lat_sector") + 0.5) * lat_step)
sector_idle_time = sector_idle_time.withColumn("lng_middle", lng_min + (col("lng_sector") + 0.5) * lng_step)
# Write the results to a new CSV file
sector_idle_time.toPandas().to_csv("sector_non_usage_time.csv", index=False)
Visualización de datos con Looker Studio para decisiones futuras
Una vez que los datos han sido agregados y transformados en un archivo CSV, el siguiente paso es visualizarlos para obtener perspectivas valiosas. Vamos a utilizar Google Looker Studio (anteriormente conocido como Google Data Studio), una herramienta poderosa que permite crear informes y tableros interactivos y visualmente atractivos.
- Para comenzar, sube el archivo CSV que contiene los datos agregados a Google Drive. Esta es la forma más sencilla de almacenar el CSV para su análisis posterior. Dependiendo de los requisitos de rendimiento y seguridad, también puedes elegir otros almacenamientos como GCS o AWS S3 para las fuentes de datos que tengas.
- Abre Looker Studio y crea un nuevo informe.
- En el informe, añade una nueva fuente de datos y selecciona el archivo CSV que subiste desde Google Drive. Looker Studio detectará automáticamente las columnas y los tipos de datos, facilitando el inicio de la construcción de tus visualizaciones.
Puedes utilizar un Mapa (Mapa de Burbujas o Mapa de Calor) para mostrar los datos sobre un mapa y mejorar la comprensión visual. Por ejemplo, puedes crear una visualización en mapa para mostrar el tiempo de inactividad en cada subsector usando las coordenadas de latitud y longitud calculadas previamente. También puedes crear gráficos de barras o de líneas para mostrar el tiempo total de inactividad por source_id
a lo largo de distintos días.
Looker Studio ofrece una amplia gama de opciones de personalización, lo que te permite adaptar las visualizaciones a tus necesidades específicas.
Un mapa térmico revela cómo varía el tiempo de no utilización en las zonas urbanas
Los círculos más grandes resaltan las zonas de mayor tiempo de inactividad, mientras que las burbujas más pequeñas indican un menor tiempo de inactividad
En este punto, retomamos nuestro estudio de caso sobre un servicio de kicksharing con scooters autónomos. El siguiente mapa de calor revela cómo varía el tiempo de inactividad en las zonas urbanas. Los círculos más grandes destacan zonas con altos tiempos de no uso, lo que señala áreas donde la redistribución puede mejorar significativamente la eficiencia, mientras que las burbujas más pequeñas indican tiempos de inactividad más cortos.
Esta visualización ayuda a identificar áreas donde las unidades de movilidad están subutilizadas, lo que sugiere que estas unidades podrían redistribuirse a zonas con mayor demanda. Al analizar estos datos, los operadores pueden tomar decisiones informadas para optimizar la distribución de su flota, asegurando que las unidades de movilidad estén disponibles donde más se necesitan.
Abriendo camino a soluciones basadas en datos en la industria telemática
En este estudio de caso, hemos explorado cómo transformar datos históricos masivos de telemetría en conocimientos accionables utilizando las APIs de Navixy, Python y Apache Spark. Al recuperar, limpiar, validar y agregar datos en crudo, mostramos un enfoque estructurado para optimizar las operaciones de flota y reducir el tiempo de inactividad de las unidades de movilidad. Este flujo de trabajo demuestra el poder del análisis retrospectivo de datos para mejorar la disponibilidad del servicio, la eficiencia y la toma de decisiones estratégicas.
Si bien este artículo se centra en el aprovechamiento de datos históricos, las empresas pueden alcanzar objetivos similares utilizando datos telemáticos en tiempo real con el producto IoT Logic de Navixy. Ofrece un marco poderoso para el procesamiento de eventos en tiempo real, flujos de trabajo automatizados y mecanismos de respuesta instantánea — ideal para operaciones dinámicas de flota.
Descubre cómo puedes desbloquear todo el potencial de la telemática con Navixy. Programa una consulta con nuestros expertos.