mobility-team / mobility

Mobility, an open-source library for mobility modelisation
MIT License
16 stars 11 forks source link

Gérer les tailles d'échantillons faibles ou nulles #10

Open AntoineGauchot opened 2 years ago

AntoineGauchot commented 2 years ago

Lors de l'échantillonnage, il peut arriver que les bases de l'enquête ne contiennent pas de déplacements pour la CSP, la catégorie urbaine et le type de jour choisi. Auquel cas, le code renvoie une erreur. Il faut décider comment on souhaite gérer ces erreurs. De même, si la taille de l'échantillon considéré est très faible les résultats obtenus auront plus de chance d'être biaisés

Remarque : Il est à noter que les tailles d'échantillon sont en général plus faibles pour l'EMP 2019 que pour l'ENTD 2008

Une solution serait de relaxer une des contraintes (CSP, catégorie urbaine ou type de jour) -> a priori, on relaxerait en priorité la catégorie urbaine et le type de jour puisque la CSP est en général la variable la plus discriminante en terme de mobilité

N'hésitez pas à partager vos idées sur le sujet!

FlxPo commented 2 years ago

La relaxation des contraintes était déjà utilisée dans la version précédente de trip_sampler, pour éviter les erreurs.

Pour le moment l'ordre des subsets est : catégorie urbaine > type de jour > CSP > nb de voitures. Peut être à remplacer par l'ordre d'importance suivant : CSP > type de jour > catégorie urbaine > nb de voitures ?

On pourrait objectiver un peu cet ordre en calculant l'écart type des distances parcourues selon chacune des variables.

Il faudrait également ajouter un seuil minimal de nombre de journées, en deçà duquel on déclenche la relaxation, pour éviter les biais dont tu parles ? Je ne saurais pas trop comment le fixer de manière quantitative, par contre.

AntoineGauchot commented 2 years ago

Ecart-type des distances pondérées selon la variable par laquelle on groupe les déplacements :

Attention : ces calculs servent seulement à se faire une intuition et ne sont pas rigoureux, on omet dans cette analyse le fait que chaque variable peut prendre un nombre de valeurs différents (CSP : 9 valeurs possibles, Type de jour : 2 valeurs, Catégorie urbaine : 4, Motorisation : 3). Pour estimer, à la louche, quelle variable est la plus discriminante on peut multiplier cet écart-type par le nombre de valeurs possibles pour chaque variable, ce qui donne :

Une façon plus rigoureuse (et plus chronophage) de savoir quelle variable est la plus discriminante serait de calculer la variance expliquée de chaque variable : image

En conséquence, je propose l'ordre d'importance suivant : CSP > Motorisation > Type de jour > Catégorie urbaine Je vais essayer d'implémenter cela dans une nouvelle branche

Calculs effectués avec l'EMP 2019

AntoineGauchot commented 2 years ago

La branche gestion_taille_echantillonnage implémente cette nouvelle façon d'échantillonner dans la fonction safe_sample (que j'ai mise pour l'instant dans le fichier trip_sampler_2)

Explication du fonctionnement de safe_sample

Prenons un exemple safe_sample(days_trip_db, n_sample, weights="pondki", minimum_sample_size=10, csp='3', n_cars='1', weekday=True, city_category='C')

La fonction va d'abord essayer de filtrer la base days_trip_db par les critères renseignés après l'argument minimum_sample_size (donc csp, n_cars, weekdayet city_category) dans l'ordre où ils sont renseignés.

  1. La fonction vérifie que si on filtre par csp='3', la base qui en résulte a une taille supérieure ou égale à minimum_sample_size (ici 10). Si c'est le cas, on filtre effectivement. Sinon, on ne filtre pas par la csp (on considère toutes les csp).
  2. La fonction vérifie ensuite que si on filtre aussi par n_cars='1', la base qui en résulte a une taille supérieure ou égale à 10. Si c'est le cas, on filtre effectivement. Sinon, on ne filtre pas par n_cars.
  3. On continue pour les critères weekday=True et city_category='C'.

En fonction, aucun, un ou plusieurs critères peuvent être ignorés pour garder une taille d'échantillon suffisante. Enfin, on tire n_sample échantillon dans la base résultante suivant la pondération contenue dans la colonne 'pondki'

_Attention : la base days_trip_db doit être indexé (multi-indexé dans ce cas) par les critères renseignés et dans le même ordre. Dans notre exemple, son index doit être MultiIndex( ..., names=['csp', 'n_cars', 'weekday', 'city_category'])_

Une valeur pertinente pour minimum_sample_sizereste à définir

FlxPo commented 2 years ago

Pour minimum_sample_size, on pourrait étudier la distribution de la distance totale obtenue par échantillonnage, pour chaque combinaison des 4 variables, en fonction de plusieurs seuils de restrictions du nombre d'échantillons utilisés (10, 100, 500... lorsque c'est possible).

C'est assez subjectif, mais on verrait comme ça à partir de quel seuil les distributions ont des formes "raisonnables" : on voudrait éviter d'obtenir tout le temps la même valeur par exemple (dans le cas où il n'y a qu'un seul jour disponible dans la base).

Il y a peut être une méthode de stats pour étudier cette question ?

AntoineGauchot commented 2 years ago

Petit élément supplémentaire, pour quelles combinaisons de CSP, motorisation et catégorie urbaine a-t-on des tailles d'échantillon faibles ?

Taille de l'échantillon pour les 192 combinaisons (CSP, motorisation, catégorie urbaine, semaine/week-end) dans la base _daystrip : image

Zoom sur la partie gauche du graphe : image

Taille de l'échantillon pour les 96 combinaisons (CSP, motorisation, catégorie urbaine) dans la base travels : image

Zoom sur la partie gauche du graphe : image

Il y a 62 combinaisons (CSP, motorisation, catégorie urbaine, semaine/week-end) sur 192 qui aboutissent à un échantillon de taille inférieure ou égale à 10 dans _daystrip Il y a 25 combinaisons (CSP, motorisation, catégorie urbaine) sur 96 qui aboutissent à un échantillon de taille inférieure ou égale à 10 dans travels

On s'aperçoit que ce sont soit des agriculteurs exploitants (CSP=1) soit des personnes non motorisés en territoires rurales ou peu denses Les 25 profils avec les tailles d'échantillon les plus faibles :

csp  n_cars      urban_category
1      0              C
1      0              B
1      0              I
1      0              R
1      1              C
1      1              B
1      1              I
1      1              R
1     2+              C
1     2+              B
1     2+              I
2      0              B
2      0              I
2      0              R
3      0              I
4      0              I
4      0              R
5      0              I
5      0              R
6      0              I
6      0              R
7      0              I
8      0              I
8      0              R
8      1              I

Ce sont des profils que l'on retrouve peu dans la population française. La façon dont on gère ces cas-là n'aura donc finalement que peu d'impact sur les résultats finaux à l'échelle de la population d'un territoire

Les tailles d'échantillon doivent aussi être analysés au regard du nombre de prélèvements : Nombre de prélèvements dans la base travels selon la CSP :

        n_travel_by_csp
csp                    
1                     5
2                    10
3                    26
4                    15
5                     8
6                     7
7                     6
8                     8

On prélève peu de voyages pour les agriculteurs, ce qui relativise aussi le fait que les tailles d'échantillon soient petites

FlxPo commented 2 years ago

Je comprends peut être mal les graphiques, mais ça voudrait dire qu'on a pas mal de combinaisons avec zéro jours à échantillonner ? Et la plupart avec moins de 5 jours ?

Il faudrait peut être différencier l'analyse entre semaine et week-end, puisqu'on peut peut être se permettre d'échantillonner 100 jours de week end par an sur une base moins large que les 260 jours de semaine.

Une possibilité pour gagner un peu de taille d'échantillon : fusionner les catégories 1 et 2+ pour le nombre de voitures du ménage, si l'on montre que les comportements de mobilité restent assez proches. Mais ça ne réglera pas le problème des sans voitures, visiblement rares aujourd'hui !

A voir également si les agriculteurs pourraient être rapprochés d'une autre CSP, mais ils doivent avoir des déplacements vraiment différents des autres...

AntoineGauchot commented 2 years ago

Effectivement, on a beaucoup de combinaisons avec moins de 5 jours mais j'ai testé toutes les combinaisons possibles en théorie. Il faut mettre ça en perspective avec les combinaisons qui existent effectivement dans la population française.

FlxPo commented 2 years ago

Pour vérifier ce point, on pourrait peut être ajouter une colonne aux résultats indiquant la qualité de l'échantillonnage ? En fonction du nombre de variables qu'on a fait sauter, dans le cas d'une combinaison avec trop peu de jours, et en fonction du nombre de jours disponibles au final pour l'échantillonnage ?

Mind-the-Cap commented 1 year ago

@FlxPo suite à ces discussions, penses-tu qu'il soit correct de garder une taille minimale d'échantillon à 10 ? Ou alors faut-il renouveler les tests qui ont été faits ?

FlxPo commented 1 year ago

Nous n'avons pas conclu ce point effectivement. Je pense qu'on peut laisser ce seuil qualitatif de 10 pour le moment, et continuer d'investiguer pour une future version 0.2.

Une information utile pour l'utilisateur serait d'ajouter une colonne "taille de l'échantillon utilisé" à la dataframe des déplacements, pour donner une première information sur la qualité de l'échantillonnage.