Gérer les tailles d'échantillons faibles ou nulles
AntoineGauchot opened this issue · 10 comments
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!
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.
Ecart-type des distances pondérées selon la variable par laquelle on groupe les déplacements :
- CSP : 154 613
- Type de jour : 144 946
- Catégorie urbaine de résidence : 53 356
- Motorisation : 131 585
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 :
- CSP : 1,39 M
- Type de jour : 290 K
- Catégorie urbaine de résidence : 213 K
- Motorisation : 394 K
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 :
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
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
, weekday
et city_category
) dans l'ordre où ils sont renseignés.
- 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). - 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. - On continue pour les critères
weekday=True
etcity_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_size
reste à définir
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 ?
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 days_trip :
Zoom sur la partie gauche du graphe :
Taille de l'échantillon pour les 96 combinaisons (CSP, motorisation, catégorie urbaine) dans la base travels :
Zoom sur la partie gauche du graphe :
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 days_trip
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
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...
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.
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 ?
@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 ?
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.