Estimación de perfiles de carga
1. Vista en CityRed
El sitio CityRed ofrece vistas que permiten realizar análisis y extraer datos de perfiles de carga agregados. En sección se describe el proceso para llevar a cabo las diferentes agregaciones.
1.1 Vista "Gráfica"
Esta vista representa una caracterización de la carga promedio de pasajeros en cada una de las paradas de un servicio seleccionado, en un determinado sentido y periodo, para un conjunto de días.

En el siguiente link se presenta un tutorial de uso de esta gráfica en CityRed:
Tutorial Pefiles de Carga en CityRed
Para obtener estos datos agregados se realiza la siguiente consulta a la Tabla Perfiles de carga
SELECT correlativo, paradero_usuario, nombre_parada,
AVG(subidas_corregidas) as subidas_con_evasion,
AVG(bajadas_corregidas) as bajadas_con_evasion,
MIN(carga_corregida) as carga_min_con_evasion,
AVG(carga_corregida) as carga_avg_con_evasion,
MAX(carga_corregida) as carga_max_con_evasion,
AVG(subidas_expandidas) as subidas_sin_evasion,
AVG(bajadas_expandidas) as bajadas_sin_evasion,
MIN(carga) as carga_min_sin_evasion,
AVG(carga) as carga_avg_sin_evasion,
MAX(carga) as carga_max_sin_evasion,
COUNT(id_expedicion) as expediciones,
AVG(capacidad) as capacidad_avg,
MAX(capacidad) as capacidad_max,
AVG(carga_corregida) * 100.0 / AVG(capacidad) as ocupacion_avg_con_evasion,
AVG(carga) * 100.0 / AVG(capacidad) as ocupacion_avg_sin_evasion,
max(zona_paga) as zona_paga,
sum(pax_km_corregido_tramo) as pax_km_corregido_tramos,
sum(plazas_km_tramo) as plazas_km_tramos,
SUM(subidas_con_bajada) as subidas_con_bajada,
SUM(subidas) as subidas_totales,
SUM(CASE WHEN subidas > 0 THEN subidas_con_bajada ELSE NULL END) / SUM(CASE WHEN subidas > 0 THEN subidas ELSE NULL END) as porcentaje_estimacion_bajada
FROM `perfiles_de_carga`
WHERE TIMESTAMP_TRUNC(tiempo_ini_exp, DAY) >= TIMESTAMP("2023-11-01") AND TIMESTAMP_TRUNC(tiempo_ini_exp, DAY) <= TIMESTAMP("2023-11-25")
and servicio_sentido_sonda = "T506 00I"
and periodo_ts_ini_exp = 62
and tipo_dia = 0
and expedicion_con_problemas = 0
group by correlativo, paradero_usuario, nombre_parada
order by correlativo
📌 Nota: Actualmente esta forma de agregación está en proceso de modificación. Se está implementando un procedimiento que no calcule promedios sobre datos de la pasada, sino que recalcule la carga en base a la acumulación de las subidas y bajadas promedios.
1.2 Vista "Por parada/servicio"
Esta vista busca entregar una agregación de subidas, bajadas y carga en un paradero en particular o para un grupo de paraderos, en una o varias medias horas, para un conjunto de días.

Para obtener estos datos agregados se realiza la siguiente consulta a la Tabla Perfiles de carga
SELECT
paradero_usuario,
servicio_sentido_sonda,
servicio_sentido_usuario,
nombre_parada,
AVG(subidas_corregidas) as subidas,
AVG(bajadas_corregidas) as bajadas,
SUM(capacidad) as suma_capacidad,
SUM(carga_corregida) as suma_carga,
SUM(carga_corregida) - SUM(subidas_corregidas) + SUM(bajadas_corregidas) as suma_carga_anterior,
SUM(carga_corregida) * 100.0/ SUM(capacidad) as tasa_promedio_ocupacion_salida,
(SUM(carga_corregida) - SUM(subidas_corregidas) + SUM(bajadas_corregidas)) * 100.0/ SUM(capacidad) as tasa_promedio_ocupacion_llegada,
((SUM(carga_corregida) - SUM(subidas_corregidas) + SUM(bajadas_corregidas)) * 100.0/ SUM(capacidad)) - (SUM(carga_corregida) * 100.0/ SUM(capacidad)) as variacion_ocupacion
FROM perfiles_de_carga as perfil
WHERE TIMESTAMP_TRUNC(tiempo_ini_exp, DAY) >= TIMESTAMP("2023-11-12") and TIMESTAMP_TRUNC(tiempo_ini_exp, DAY) <= TIMESTAMP("2023-11-24")
AND ( paradero_usuario = 'PA105' )
AND ( media_hora_tiempo = 32 )
and tipo_dia = 0
group by paradero_usuario, servicio_sentido_sonda, servicio_sentido_usuario, nombre_parada
1.3 Vista "Trayectorias"
Esta vista busca entregar una visualización de todas las expediciones para un dia, servicio-sentido y periodo.

Para obtener estos datos agregados se realiza la siguiente consulta a la Tabla Perfiles de carga
SELECT id_expedicion, patente, correlativo, tiempo, dist_en_ruta, paradero_usuario, nombre_parada,
subidas_corregidas as subidas,
bajadas_corregidas as bajadas,
carga_corregida as carga,
carga_corregida * 100.0 / capacidad as ocupacion,
zona_paga as es_zona_paga
FROM `perfiles_de_carga`
WHERE TIMESTAMP_TRUNC(tiempo_ini_exp, DAY) = TIMESTAMP("2023-11-06")
and servicio_sentido_sonda = "T506 00I"
and periodo_ts_ini_exp = 62
and tipo_dia = 0
order by id_expedicion,correlativo
1.4 Vista "Matriz 2D"
Esta vista busca entregar una visualización agregando todos los perfiles de carga de un conjunto de dias, por servicio-sentido y tipo día. La visualización muestra una matriz formada por las medias horas en el eje X y los paraderos en el eje Y (ordenados en sentido avance de la ruta de abajo hacia arriba). El valor de cada celda corresponde al promedio de la variable seleccionada (ocupación/bajadas/subidas).

Para obtener estos datos agregados se realiza la siguiente consulta a la Tabla Perfiles de carga
SELECT correlativo, dist_en_ruta, paradero_usuario, nombre_parada,media_hora_tiempo,
AVG(subidas_corregidas) as subidas,
AVG(bajadas_corregidas) as bajadas,
MIN(carga_corregida) as carga_min,
AVG(carga_corregida) as carga,
MAX(carga_corregida) as carga_max,
COUNT(id_expedicion) as expediciones,
AVG(capacidad) as capacidad,
MAX(capacidad) as capacidad_max,
AVG(carga_corregida) * 100.0 / AVG(capacidad) as ocupacion,
max(zona_paga) as zona_paga,
sum(pax_km_corregido_tramo) / sum(plazas_km_tramo) as CU,
SUM(subidas_con_bajada) as subidas_con_bajada,
SUM(subidas) as subidas_totales,
SUM(CASE WHEN subidas > 0 THEN subidas_con_bajada ELSE NULL END) / SUM(CASE WHEN subidas > 0 THEN subidas ELSE NULL END) as porcentaje_estimacion_bajada
FROM `aptto-dtpm-dev.perfiles_de_carga.datos_crudos`
WHERE TIMESTAMP_TRUNC(tiempo_ini_exp, DAY) >= TIMESTAMP("2023-11-01") AND TIMESTAMP_TRUNC(tiempo_ini_exp, DAY) <= TIMESTAMP("2023-11-10")
and servicio_sentido_sonda = "T506 00I"
and tipo_dia = 0
and expedicion_con_problemas = 0
group by correlativo, dist_en_ruta, paradero_usuario, nombre_parada, media_hora_tiempo
order by correlativo, dist_en_ruta, media_hora_tiempo
2. Metodología
A continuación se presenta la metodología de construcción de perfiles de carga paso a paso, incluyendo un detalle de las etapas previas necesarias para su elaboración.

2.1 Procesamiento de expediciones
En primer lugar se debe realizar un cruce de los datos de expediciones 1.96 con los datos de GPS, de forma de asignar un servicio-sentido a todos los pulsos GPS entre los tiempos de cada viaje. Además, se agregan procesos para reasignar los servicios-sentido en los extremos de los trazados, donde existe pérdida de asignación debido a la metodología/implementación de SONDA.
2.2 Estimación de subida
Las validaciones Bip! no poseen el dato de posición ni el paradero donde fueron realizadas, por lo que se debe hacer un proceso de estimación de paradero de subida previo, como se describe a continuación:
- Utilizando la hora de validación y la patente registrada en la transacción Bip!, se realiza una interpolación entre los GPS donde se encuentra, lo que permite asignarle la posición y el servicio-sentido de estos GPS a la validación.
- Una vez asignada la posición y el servicio-sentido a la validación, se le debe asignar el paradero de subida en la secuencia de paradas, de la siguiente manera:
Si la distancia de la posición a la ruta es < 200m:
Se le asocia el paradero más cercano (no necesariamente de la secuencia) que posea el mismo sentido de avance de los GPS
Si no :
Si la distancia es < 500 m:
Se busca el paradero más cercano en base a la distancia en ruta
Si no:
Queda sin asignación de paradero de secuencia y se busca el paradero más cercano de la zona.
- Si ocurre que el GPS no tiene servicio-sentido asignado, la subida también quedará sin servicio-sentido. En este caso, se busca el paradero más cercano (máximo < 500 m) , que coincida con la orientación de avance de los GPS.
- Si no se cumple ninguna condición, la validación queda sin paradero asignado.
2.3 Estimación de bajada
Debido a que las validaciones Bip! no contienen información sobre el lugar de bajada del usuario, también se debe construir un proceso para estimarla. El detalle de esta metodología se puede leer en la sección Estimación de Bajada (link), y a modo general consiste en encontrar el pulso GPS óptimo del bus que minimiza el tiempo generalizado respecto a la siguiente validación de la tarjeta. Este pulso debe cumplir con tener una distancia < 1000 m.
2.4 Proyección de GPS al trazado de la ruta
Para calcular el avance a lo largo de una ruta, se proyectan las posiciones de los pulsos GPS hacia el trazado de la misma. Esta proyección, conocida como proyección ortogonal o proyección al segmento más cercano, se complementa con una verificación de consistencia en el avance de los pulsos GPS contiguos. Si se detecta una inconsistencia significativa en la velocidad calculada entre pulsos (por ejemplo, velocidades fuera del rango de -200 km/h a 200 km/h), el algoritmo busca un nuevo segmento de ruta cercano que mantenga la coherencia en la trayectoria. Si tras varias iteraciones no se logra encontrar un segmento que mantenga la consistencia, se conserva la proyección original, aunque resulte inconsistente.
2.5 Proyección del paradero al trazado de la ruta
Al igual que con las posiciones GPS, para calcular la distancia en ruta de los paraderos al trazado, se proyecta cada paradero sobre el segmento más cercano de la ruta. En este proceso, se emplea un criterio de consistencia que respeta el orden original de los paraderos, según el consolidado de paradas. Este se considera como el orden correcto, por lo que si la proyección inicial no se ajusta a él, el algoritmo busca segmentos alternativos hasta lograr la coherencia con el orden especificado. Si después de un número máximo de iteraciones no se encuentra un segmento adecuado, la proyección del paradero conservará la asignación inicial, aunque resulte inconsistente.
2.6 Inicialización de perfiles de carga
Para construir una estructura de datos que soporte los perfiles de carga, se realiza un cruce entre la secuencia de paraderos y el trazado de la ruta para cada expedición. De esta manera se genera una estructura en la que cada expedición contiene una secuencia ordenada de pasadas por todos los paraderos, junto a otras variables asociadas como número de subidas, número de bajadas y tiempo de pasada, entre otras. Esta estructura facilita el análisis y seguimiento detallado del comportamiento de la carga en cada expedición.
2.7 Cálculo de tiempos de pasada
Ya teniendo la estructura de los datos de perfiles de carga, se da paso a la obtención de los tiempos de pasada de cada expedición por cada paradero. Este tiempo es una selección priorizada entre los siguientes tiempos:
- Tiempo de primera validación: este tiempo corresponde al de la primera validación del conjunto de todas las validaciones de subida realizadas en esa pasada.
- Tiempo de interpolación del GPS: es el tiempo interpolado entre el par de GPS que cruzan el paradero, es decir, el par de GPS contiguos donde el primero tiene una distancia en ruta menor a la distancia en ruta del paradero y el siguiente tiene una distancia mayor a la distancia en ruta del paradero. En caso de no existir un par de GPS que crucen el paradero, este tiempo queda nulo.
- Tiempo del GPS más cercano (máximo < 500 m): es el teiempo del GPS más cercano al paradero de esa expedición. En caso que no exista un GPS a menos de 500m del paradero, este tiempo queda nulo.
2.8 Expansión de Zonas Pagas
Se realiza una expansión de las validaciones sin estimación de bajada para el caso especifico de zonas pagas, donde las validaciones sin estimación de bajada en un paradero-media hora son expandidas sobre las validaciones con estimación de bajada. La razón detrás de esta expansión especial radica en que las etapas realizadas en zonas pagas que carecen de una estimación de bajada, tampoco cuentan con un servicio-sentido asignado. Esto implica que no pueden asociarse a una expedición, lo que las hace invisibles en los perfiles de carga.
2.9 Expansión de validaciones sin bajada
Se realiza una expansión de validaciones por servicio-sentido respecto al paradero-periodo Transantiago, expandiendo las validaciones que no poseen bajada estimada sobre las que si tienen bajada en esa agregación. Para identificar el periodo de la matriz se utiliza el tiempo de la validación Bip!
2.10 Construcción de matrices origen-destino por cada servicio-sentido-media hora
Para cada servicio-sentido y periodo (media hora) se construye una matriz de etapas de paradero de origen a paradero de destino, considerando los paraderos de la secuencia de dicho servicio. Utilizando esta matriz se almacenan las etapas con y sin bajada, lo que permite tener información de la distribución de bajadas desde cada paradero hacia adelante. Para identificar el periodo de la matriz se utiliza el tiempo de salida de la expedición donde fue realizada la validación.
2.11 Actualización de subidas
Se realiza una iteración sobre todas las etapas y en cada pasada las variables se van actualizando de la siguiente manera:
nSubidas ← se incrementa en 1 por cada subida en el paradero
nSubidasExpandidas ← se incrementa con el valor expandido de la etapa
//subida está fuera de ruta
si subida > 200m :
nSubidasLejanas ← se incrementa en 1
nSubidasExpandidas ← se incrementa con el valor expandido de la etapa, es decir, esta variable toma las subidas lejanas o no lejanas
2.12 Calcula evasión
Se realiza un proceso de cálculo de evasión en los perfiles, de la siguiente manera:
- Por cada expedición se busca la matriz OD del paso 10
- Se obtiene la evasion del paradero-media hora, si no encuentra busca en zona-periodo, sino existe queda sin evasion.
- Por cada pasada se actualizan las variables
subidas_evadidas ← nSubidasExpandidas * (evasion/(1.0 - evasion))
subidas_corregidas ← nsubidasExpandidas + subidas_evadidas
Se calcula la cantidad de bajadas aguas abajo total_bajadas usando la MatrizOD parada_mediahora
Las subidas evadidas del paradero son repartidas sobre las bajadas evadidas de los paraderos aguas abajo
Si total_bajadas = 0:
// Se utiliza una distribución uniforme, se incrementa en cada paradero aguas abajo el número de bajadas evadidas:
bajadas_evadidas ← subidas_evadidas / paraderos aguas abajo
Si total_bajadas > 0:
// Se utiliza una distribución en base a la distribución obtenida de la MatrizOD parada_mediahora. En cada parada aguas abajo se calculan las bajadas evadidas:
bajadas_evadidas ← factor * subidas_evadidas
// donde factor es la proporción de bajadas en esa parada
2.13 Actualización de bajadas
Se realiza una iteración sobre todas las etapas y se van actualizando las variables por cada pasada de acuerdo a lo siguiente:
Si el paradero de bajada esta en la secuencia del servicio de subida:
nBajadas ← se incrementa en 1 por cada bajada del paradero
nBajadasExpandidas ← se incrementa con el valor expandido de la etapa
// Esto pasa cuando la persona continua en el viaje despues del paradero final de la expedición inicial
Si la expedición de subida es distinta a la expedición de bajada:
//En el paradero inicial de la expedición de bajada se suma la carga
carga ← se incrementa en el valor expandido de la etapa
carga_corregida ← se incrementa en el valor expandido de la etapa
//Se pasa la bajada al paradero de la expedición de bajada
nBajadas ← se incrementa en 1 por cada bajada del paradero
nBajadasExpandidas ← se incrementa con el valor expandido de la etapa
//En caso que el paradero no se encuentre en la secuencia, se busca el paradero más cercano de la secuencia, es decir, fue una bajada en algun desvio del bus fuera de ruta
nBajadasLejanas ← se incrementa en 1
nBajadasExpandidas ← se incrementa con el valor expandido de la etapa (es decir, las bajadas fuera de ruta son llevadas a alguna paradero de la secuencia, sin umbral de corte de distancia)
Se realiza una nueva iteración por todas los servicios-expediciones-pasadas y se actualizan las variables
bajadas_corregidas ← nBajadasExpandidas + bajadas_evadidas
2.14 Construcción de perfiles de carga
Una vez que se tienen las subidas y las bajadas de cada pasada, se realiza un recorrido por todos los servicios, expediciones y pasadas actualizando las variables de acuerdo a lo siguiente:
Caso primer paradero del perfil
carga ← nSubidasExpandidas - nBajadasExpandidas
carga_corregida ← subidas_corregidas - bajadas_corregidas
Caso paradero distinto al primer paradero del perfil
carga ← carga^paraderoanterior^+ nSubidasExpandidas - nBajadasExpandidas
carga_corregida ← carga_corregida^paraderoanterior^ + subidas_corregidas - bajadas_corregidas
Si carga o carga_corregida n entre (-1,0)
carga ← 0.0
carga_corregida ← 0.0
2.15 Analiza perfiles
Con el objetivo de filtrar expediciones que no cumplen con algunas condiciones de consistencia o coherencia mínima, se realiza el siguiente análisis sobre todas las expediciones:
1. Se marca si cumple o no cumple, en base al cumplimiento que se hereda del 1.96
2. Se identifican expediciones con cero subidas o bajadas
3. Se identifican las expediciones que tienen al menos una carga_corregida con valores negativos menores a -5
4. Se identifican las expediciones que tienen al menos una carga_corregida con valores mayores a al 150% de la capacidad del bus
5. Se identifica el número de subidas lejanas por cada expedición
6. Se identifican las pasadas que tienen más de 200 subidas
7. Se identifican las expediciones que inician la expedición con una carga > 0
8. Se identifican las expediciones con alguna pasada con tiempo nulo
9. Se identifican las expediciones con alguna pasada con tiempo invertido respecto al sentido de avance de la ruta
10. Se identifican las expediciones con alguna pasada con diferencia de tiempo cero entre paraderos contiguos
11. Se identifican las expediciones que tienen GPS que van en el sentido de avance contrario a la ruta
12. Se identifican las expediciones que tienen GPS fuera de ruta
2.16 Filtrado de perfiles
En base a las dísticas obtenidas en la etapa de análisis de perfiles se activan ciertas condiciones para que la expedición quede marcada como válida o inválida, esto permite que en el sistema web no sean consideradas en las agregaciones.
3. Consideraciones especiales
- Tanto la fecha de inicio como la fecha de término de la ventana temporal a seleccionar deben estar dentro de un mismo programa de operación.
- No se debe considerar los perfiles de carga de los servicios circunvalares.
- La escala del eje vertical derecho % Pasajeros promedio se puede modificar en el filtro superior Límite porcentaje. Esto es útil para visualizar de manera completa el perfil de carga en aquellos casos donde la carga de pasajeros es mayor que la capacidad nominal de un paradero, es decir, cuando la ocupación es mayor al 100%.
- La curva % Estimación de bajada por defecto aparece oculta en la gráfica, ya que solo se utiliza para revisión de datos interna y no debiese ser considerada en el análisis.
- Pueden existir problemas de asignación de paradero en la Intermodal, ya que los gps de los buses suelen perder precisión por falta de señal.
