Aller au contenu

Qualité et nettoyage spatial

Cette page décrit les contrôles qualité et les enrichissements spatiaux disponibles après la préparation des tables de mobilité.

Les notebooks historiques de qualité du suivi et de nettoyage spatial ont servi de base, mais les fonctions du package utilisent des noms génériques.

L'objectif n'est pas d'ajouter une grande fonction opaque. Ces étapes restent séparées, car elles servent surtout à contrôler, documenter et décider si certaines données doivent être filtrées ou enrichies avant les indicateurs.

Qualité du suivi

Le contrôle qualité porte sur trois niveaux :

Niveau Fonctions Sortie
suivi journalier build_tracking_gap_report(), build_weekly_participation_grid() jours actifs, jours manquants, semaines de participation
qualité utilisateur build_tracking_quality_report(), build_user_selection_table() règles de sélection explicites
contrôles de cohérence summarize_leg_lengths_by_mode(), get_extreme_legs_by_mode(), build_user_confirmation_rates(), build_mode_detection_precision() tableaux de diagnostic

Exemple minimal :

tracking_gap_report = xyt.build_tracking_gap_report(
    mobility.storyline,
    config,
    user_ids=mobility.user_stats["user_id"],
)

length_summary = xyt.summarize_leg_lengths_by_mode(mobility.legs)
extreme_legs = xyt.get_extreme_legs_by_mode(mobility.legs, top_n=5)
confirmation_rates = xyt.build_user_confirmation_rates(mobility.storyline)
mode_precision = xyt.build_mode_detection_precision(mobility.storyline)

selection_table = xyt.build_user_selection_table(
    mobility.user_stats,
    require_tracking_quality=False,
    exclude_bad_signal_users=True,
    max_low_quality_legs_share=0.25,
)

Ces fonctions ne suppriment pas de lignes. Elles produisent des rapports inspectables. Le filtrage effectif doit rester une décision explicite :

La qualité de suivi et la qualité GPS doivent rester distinguées. Le filtre strict require_tracking_quality=True utilise uniquement les phases déclarées dans ProjectConfig. Si la config contient seulement Phase1 et Phase2, la sélection ne demandera pas de Phase3. En revanche, si une phase est déclarée mais que le dump ne la couvre pas, tracking_quality_ok peut être faux pour de bonnes raisons calendaires. Dans ce cas, filtrer d'abord le signal GPS et garder l'assiduité comme diagnostic.

analysis_users = xyt.select_analysis_users(selection_table)
analysis_dataset = xyt.filter_mobility_dataset_by_users(mobility, analysis_users)

Nettoyage spatial optionnel

Le nettoyage spatial est optionnel, car il dépend des données déjà livrées par le fournisseur et des ressources territoriales disponibles.

Besoin Fonctions Paramètres importants
normaliser les géométries de legs clean_leg_geometries() drop_discontinuous
calculer la perte de signal GPS add_signal_quality_flags() SpatialQualityThresholds
identifier les utilisateurs à mauvais signal add_signal_quality_to_user_stats() bad_signal_user_quantile
labelliser des points d'activité add_spatial_zone_labels() zones, zone_label_col, output_col
labelliser origine et destination des legs add_leg_origin_destination_zones() origin_col, destination_col
classer un leg par rapport à une zone classify_leg_relation_to_area() area, area_path, center, radius_m
propager les zones aux trips add_trip_origin_destination_from_legs() table map_track_trip_journey
propager les zones aux journeys add_journey_origin_destination_from_trips() table map_track_trip_journey

Exemple minimal :

legs = xyt.clean_leg_geometries(mobility.legs)
legs = xyt.add_signal_quality_flags(legs, config)

staypoints = xyt.add_spatial_zone_labels(
    mobility.staypoints,
    canton_zones,
    zone_label_col="N_KT",
    output_col="activity_canton",
)

legs = xyt.add_leg_origin_destination_zones(
    legs,
    canton_zones,
    zone_label_col="N_KT",
    origin_col="origin_canton",
    destination_col="destination_canton",
)

trips = xyt.add_trip_origin_destination_from_legs(
    mobility.trips,
    legs,
    mobility.map_track_trip_journey,
    leg_origin_col="origin_canton",
    leg_destination_col="destination_canton",
    output_origin_col="trip_origin_canton",
    output_destination_col="trip_destination_canton",
)

Décision méthodologique

Ces étapes doivent rester paramétrables :

  • les seuils de perte de signal peuvent varier selon le mode ;
  • les zones territoriales dépendent du projet ;
  • une donnée déjà map-matchée ou nettoyée peut désactiver certains contrôles ;
  • les rapports doivent être exportés avant tout filtrage définitif.

Le notebook Notebooks/Package-ready/02_quality_check.ipynb sert à inspecter la qualité. Le notebook Notebooks/Package-ready/03_spatial_cleaning.ipynb sert à appliquer les enrichissements spatiaux optionnels.

Dans la configuration Déclic, 03_spatial_cleaning.ipynb utilise les zones communales GIREC du Grand Genève. La clé ID_Zone est ajoutée aux départs et arrivées des legs, puis propagée aux trips et journeys. Les centroïdes Nodes_commune.geojson sont exportables avec la base propre pour préparer des matrices origine-destination et leur visualisation cartographique.